@opencode-ai/cli-linux-arm64
Advanced tools
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/unset.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.unset,\n Effect.fn(\"cli.service.unset\")(function* (input) {\n yield* ServiceConfig.unset(input.key)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";k0BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,WAAO,OAAc,WAAM,OAAM,QAAG,OACrC,CACH", | ||
| "debugId": "8C3F2FBBFCF6226164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/server-connection.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { OPENCODE_VERSION } from \"../version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: EnsureOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Endpoint\n readonly service?: ReturnType<typeof managedService>\n}\n\nexport const resolve = Effect.fn(\"cli.server-connection.resolve\")(function* (args: Args) {\n if (args.server !== undefined && args.standalone)\n return yield* Effect.fail(new Error(\"--server and --standalone cannot be combined\"))\n if (args.server !== undefined) {\n const password = yield* Env.password\n const endpoint = {\n url: args.server,\n auth: password ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) } : undefined,\n } satisfies Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== OPENCODE_VERSION)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${OPENCODE_VERSION}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const options = yield* ServiceConfig.options()\n return {\n endpoint: yield* resolveManaged({ ...options, onStart: args.onStart }, args.mismatch ?? \"replace\"),\n service: managedService(options),\n } satisfies Resolved\n})\n\nfunction managedService(options: EnsureOptions) {\n const reconnectOptions = { ...options, version: undefined }\n return {\n reconnect: () => Service.ensure(reconnectOptions),\n restart: () =>\n Effect.gen(function* () {\n yield* Service.stop(options)\n yield* Service.ensure(reconnectOptions)\n }),\n }\n}\n\nconst resolveManaged = Effect.fnUntraced(function* (\n options: EnsureOptions,\n mismatch: NonNullable<Args[\"mismatch\"]>,\n) {\n if (mismatch === \"replace\") return yield* Service.ensure(options)\n if (mismatch === \"ignore\") return yield* Service.ensure({ ...options, version: undefined })\n\n const compatible = yield* Service.discover(options)\n if (compatible !== undefined) return compatible\n const existing = yield* Service.discover({ ...options, version: undefined })\n if (existing !== undefined)\n return yield* Effect.fail(new Error(\"Background server version does not match this client\"))\n return yield* Service.ensure(options)\n})\n\nfunction connectError(endpoint: Endpoint, cause: unknown) {\n if (isUnauthorizedError(cause)) {\n return new Error(\n endpoint.auth === undefined\n ? `Server at ${endpoint.url} requires a password; set OPENCODE_PASSWORD`\n : `Server at ${endpoint.url} rejected the password`,\n { cause },\n )\n }\n if (cause instanceof ClientError && cause.reason === \"Transport\")\n return new Error(`Could not reach server at ${endpoint.url}`, { cause })\n return new Error(`Server at ${endpoint.url} did not provide a compatible V2 health response`, { cause })\n}\n\nexport * as ServerConnection from \"./server-connection\"\n" | ||
| ], | ||
| "mappings": ";0cAoBO,SAAM,OAAU,OAAO,QAAG,oCAA+B,OAAE,cAAU,CAAC,EAAY,CACvF,GAAI,EAAK,SAAW,QAAa,EAAK,WACpC,OAAO,MAAO,EAAO,KAAS,MAAM,8CAA8C,CAAC,EACrF,GAAI,EAAK,SAAW,OAAW,CAC7B,IAAM,EAAW,MAAO,EAAI,SACtB,EAAW,CACf,IAAK,EAAK,OACV,KAAM,EAAW,CAAE,KAAM,QAAkB,SAAU,WAAY,SAAU,EAAS,MAAM,CAAQ,CAAE,EAAI,MAC1G,EACM,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAS,MAAO,EAAO,WAAW,CACtC,IAAK,IAAM,EAAO,OAAO,IAAI,CAAE,OAAQ,YAAY,QAAQ,IAAK,CAAE,CAAC,EACnE,MAAO,CAAC,IAAU,EAAa,EAAU,CAAK,CAChD,CAAC,EACD,GAAI,EAAO,UAAY,EACrB,QAAQ,OAAO,MACb,sBAAsB,EAAS,mBAAmB,EAAO,2BAA2B;AAAA,CACtF,EACF,MAAO,CAAE,UAAS,EAEpB,GAAI,EAAK,WACP,MAAO,CAAE,SAAU,MAAO,EAAW,MAAM,CAAE,EAG/C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAC7C,MAAO,CACL,SAAU,MAAO,EAAe,IAAK,EAAS,QAAS,EAAK,OAAQ,EAAG,EAAK,UAAY,SAAS,EACjG,QAAS,EAAe,CAAO,CACjC,EACD,EAED,SAAS,CAAc,CAAC,EAAwB,CAC9C,IAAM,EAAmB,IAAK,EAAS,QAAS,MAAU,EAC1D,MAAO,CACL,UAAW,IAAM,EAAQ,OAAO,CAAgB,EAChD,QAAS,IACP,EAAO,IAAI,SAAU,EAAG,CACtB,MAAO,EAAQ,KAAK,CAAO,EAC3B,MAAO,EAAQ,OAAO,CAAgB,EACvC,CACL,EAGF,IAAM,EAAiB,EAAO,WAAW,SAAU,CACjD,EACA,EACA,CACA,GAAI,IAAa,UAAW,OAAO,MAAO,EAAQ,OAAO,CAAO,EAChE,GAAI,IAAa,SAAU,OAAO,MAAO,EAAQ,OAAO,IAAK,EAAS,QAAS,MAAU,CAAC,EAE1F,IAAM,EAAa,MAAO,EAAQ,SAAS,CAAO,EAClD,GAAI,IAAe,OAAW,OAAO,EAErC,IADiB,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,KAC1D,OACf,OAAO,MAAO,EAAO,KAAS,MAAM,sDAAsD,CAAC,EAC7F,OAAO,MAAO,EAAQ,OAAO,CAAO,EACrC,EAED,SAAS,CAAY,CAAC,EAAoB,EAAgB,CACxD,GAAI,EAAoB,CAAK,EAC3B,OAAW,MACT,EAAS,OAAS,OACd,aAAa,EAAS,iDACtB,aAAa,EAAS,4BAC1B,CAAE,OAAM,CACV,EAEF,GAAI,aAAiB,GAAe,EAAM,SAAW,YACnD,OAAW,MAAM,6BAA6B,EAAS,MAAO,CAAE,OAAM,CAAC,EACzE,OAAW,MAAM,aAAa,EAAS,sDAAuD,CAAE,OAAM,CAAC", | ||
| "debugId": "559E6EF5AFB302A164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/get.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.get,\n Effect.fn(\"cli.service.get\")(function* (input) {\n process.stdout.write((yield* ServiceConfig.get(Option.getOrUndefined(input.key))) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";00BAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,aAAQ,YAAO,YAAO,WAAO,EAAc,IAAI,EAAO,eAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH", | ||
| "debugId": "3D18391EA78871E664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/set.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.set,\n Effect.fn(\"cli.service.set\")(function* (input) {\n yield* ServiceConfig.set(input.key, input.value)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";k0BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,WAAO,OAAc,SAAI,OAAM,SAAK,OAAM,KAAK,EAChD,CACH", | ||
| "debugId": "DB92895116DCBFB864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../../node_modules/.bun/fuzzysort@3.1.0/node_modules/fuzzysort/fuzzysort.js"], | ||
| "sourcesContent": [ | ||
| "// https://github.com/farzher/fuzzysort v3.0.2\r\n\r\n// UMD (Universal Module Definition) for fuzzysort\r\n;((root, UMD) => {\r\n if(typeof define === 'function' && define.amd) define([], UMD)\r\n else if(typeof module === 'object' && module.exports) module.exports = UMD()\r\n else root['fuzzysort'] = UMD()\r\n})(this, _ => {\r\n 'use strict'\r\n\r\n var single = (search, target) => {\r\n if(!search || !target) return NULL\r\n\r\n var preparedSearch = getPreparedSearch(search)\r\n if(!isPrepared(target)) target = getPrepared(target)\r\n\r\n var searchBitflags = preparedSearch.bitflags\r\n if((searchBitflags & target._bitflags) !== searchBitflags) return NULL\r\n\r\n return algorithm(preparedSearch, target)\r\n }\r\n\r\n var go = (search, targets, options) => {\r\n if(!search) return options?.all ? all(targets, options) : noResults\r\n\r\n var preparedSearch = getPreparedSearch(search)\r\n var searchBitflags = preparedSearch.bitflags\r\n var containsSpace = preparedSearch.containsSpace\r\n\r\n var threshold = denormalizeScore( options?.threshold || 0 )\r\n var limit = options?.limit || INFINITY\r\n\r\n var resultsLen = 0; var limitedCount = 0\r\n var targetsLen = targets.length\r\n\r\n function push_result(result) {\r\n if(resultsLen < limit) { q.add(result); ++resultsLen }\r\n else {\r\n ++limitedCount\r\n if(result._score > q.peek()._score) q.replaceTop(result)\r\n }\r\n }\r\n\r\n // This code is copy/pasted 3 times for performance reasons [options.key, options.keys, no keys]\r\n\r\n // options.key\r\n if(options?.key) {\r\n var key = options.key\r\n for(var i = 0; i < targetsLen; ++i) { var obj = targets[i]\r\n var target = getValue(obj, key)\r\n if(!target) continue\r\n if(!isPrepared(target)) target = getPrepared(target)\r\n\r\n if((searchBitflags & target._bitflags) !== searchBitflags) continue\r\n var result = algorithm(preparedSearch, target)\r\n if(result === NULL) continue\r\n if(result._score < threshold) continue\r\n\r\n result.obj = obj\r\n push_result(result)\r\n }\r\n\r\n // options.keys\r\n } else if(options?.keys) {\r\n var keys = options.keys\r\n var keysLen = keys.length\r\n\r\n outer: for(var i = 0; i < targetsLen; ++i) { var obj = targets[i]\r\n\r\n { // early out based on bitflags\r\n var keysBitflags = 0\r\n for (var keyI = 0; keyI < keysLen; ++keyI) {\r\n var key = keys[keyI]\r\n var target = getValue(obj, key)\r\n if(!target) { tmpTargets[keyI] = noTarget; continue }\r\n if(!isPrepared(target)) target = getPrepared(target)\r\n tmpTargets[keyI] = target\r\n\r\n keysBitflags |= target._bitflags\r\n }\r\n\r\n if((searchBitflags & keysBitflags) !== searchBitflags) continue\r\n }\r\n\r\n if(containsSpace) for(let i=0; i<preparedSearch.spaceSearches.length; i++) keysSpacesBestScores[i] = NEGATIVE_INFINITY\r\n\r\n for (var keyI = 0; keyI < keysLen; ++keyI) {\r\n target = tmpTargets[keyI]\r\n if(target === noTarget) { tmpResults[keyI] = noTarget; continue }\r\n\r\n tmpResults[keyI] = algorithm(preparedSearch, target, /*allowSpaces=*/false, /*allowPartialMatch=*/containsSpace)\r\n if(tmpResults[keyI] === NULL) { tmpResults[keyI] = noTarget; continue }\r\n\r\n // todo: this seems weird and wrong. like what if our first match wasn't good. this should just replace it instead of averaging with it\r\n // if our second match isn't good we ignore it instead of averaging with it\r\n if(containsSpace) for(let i=0; i<preparedSearch.spaceSearches.length; i++) {\r\n if(allowPartialMatchScores[i] > -1000) {\r\n if(keysSpacesBestScores[i] > NEGATIVE_INFINITY) {\r\n var tmp = (keysSpacesBestScores[i] + allowPartialMatchScores[i]) / 4/*bonus score for having multiple matches*/\r\n if(tmp > keysSpacesBestScores[i]) keysSpacesBestScores[i] = tmp\r\n }\r\n }\r\n if(allowPartialMatchScores[i] > keysSpacesBestScores[i]) keysSpacesBestScores[i] = allowPartialMatchScores[i]\r\n }\r\n }\r\n\r\n if(containsSpace) {\r\n for(let i=0; i<preparedSearch.spaceSearches.length; i++) { if(keysSpacesBestScores[i] === NEGATIVE_INFINITY) continue outer }\r\n } else {\r\n var hasAtLeast1Match = false\r\n for(let i=0; i < keysLen; i++) { if(tmpResults[i]._score !== NEGATIVE_INFINITY) { hasAtLeast1Match = true; break } }\r\n if(!hasAtLeast1Match) continue\r\n }\r\n\r\n var objResults = new KeysResult(keysLen)\r\n for(let i=0; i < keysLen; i++) { objResults[i] = tmpResults[i] }\r\n\r\n if(containsSpace) {\r\n var score = 0\r\n for(let i=0; i<preparedSearch.spaceSearches.length; i++) score += keysSpacesBestScores[i]\r\n } else {\r\n // todo could rewrite this scoring to be more similar to when there's spaces\r\n // if we match multiple keys give us bonus points\r\n var score = NEGATIVE_INFINITY\r\n for(let i=0; i<keysLen; i++) {\r\n var result = objResults[i]\r\n if(result._score > -1000) {\r\n if(score > NEGATIVE_INFINITY) {\r\n var tmp = (score + result._score) / 4/*bonus score for having multiple matches*/\r\n if(tmp > score) score = tmp\r\n }\r\n }\r\n if(result._score > score) score = result._score\r\n }\r\n }\r\n\r\n objResults.obj = obj\r\n objResults._score = score\r\n if(options?.scoreFn) {\r\n score = options.scoreFn(objResults)\r\n if(!score) continue\r\n score = denormalizeScore(score)\r\n objResults._score = score\r\n }\r\n\r\n if(score < threshold) continue\r\n push_result(objResults)\r\n }\r\n\r\n // no keys\r\n } else {\r\n for(var i = 0; i < targetsLen; ++i) { var target = targets[i]\r\n if(!target) continue\r\n if(!isPrepared(target)) target = getPrepared(target)\r\n\r\n if((searchBitflags & target._bitflags) !== searchBitflags) continue\r\n var result = algorithm(preparedSearch, target)\r\n if(result === NULL) continue\r\n if(result._score < threshold) continue\r\n\r\n push_result(result)\r\n }\r\n }\r\n\r\n if(resultsLen === 0) return noResults\r\n var results = new Array(resultsLen)\r\n for(var i = resultsLen - 1; i >= 0; --i) results[i] = q.poll()\r\n results.total = resultsLen + limitedCount\r\n return results\r\n }\r\n\r\n\r\n // this is written as 1 function instead of 2 for minification. perf seems fine ...\r\n // except when minified. the perf is very slow\r\n var highlight = (result, open='<b>', close='</b>') => {\r\n var callback = typeof open === 'function' ? open : undefined\r\n\r\n var target = result.target\r\n var targetLen = target.length\r\n var indexes = result.indexes\r\n var highlighted = ''\r\n var matchI = 0\r\n var indexesI = 0\r\n var opened = false\r\n var parts = []\r\n\r\n for(var i = 0; i < targetLen; ++i) { var char = target[i]\r\n if(indexes[indexesI] === i) {\r\n ++indexesI\r\n if(!opened) { opened = true\r\n if(callback) {\r\n parts.push(highlighted); highlighted = ''\r\n } else {\r\n highlighted += open\r\n }\r\n }\r\n\r\n if(indexesI === indexes.length) {\r\n if(callback) {\r\n highlighted += char\r\n parts.push(callback(highlighted, matchI++)); highlighted = ''\r\n parts.push(target.substr(i+1))\r\n } else {\r\n highlighted += char + close + target.substr(i+1)\r\n }\r\n break\r\n }\r\n } else {\r\n if(opened) { opened = false\r\n if(callback) {\r\n parts.push(callback(highlighted, matchI++)); highlighted = ''\r\n } else {\r\n highlighted += close\r\n }\r\n }\r\n }\r\n highlighted += char\r\n }\r\n\r\n return callback ? parts : highlighted\r\n }\r\n\r\n\r\n var prepare = (target) => {\r\n if(typeof target === 'number') target = ''+target\r\n else if(typeof target !== 'string') target = ''\r\n var info = prepareLowerInfo(target)\r\n return new_result(target, {_targetLower:info._lower, _targetLowerCodes:info.lowerCodes, _bitflags:info.bitflags})\r\n }\r\n\r\n var cleanup = () => { preparedCache.clear(); preparedSearchCache.clear() }\r\n\r\n\r\n // Below this point is only internal code\r\n // Below this point is only internal code\r\n // Below this point is only internal code\r\n // Below this point is only internal code\r\n\r\n\r\n class Result {\r\n get ['indexes']() { return this._indexes.slice(0, this._indexes.len).sort((a,b)=>a-b) }\r\n set ['indexes'](indexes) { return this._indexes = indexes }\r\n ['highlight'](open, close) { return highlight(this, open, close) }\r\n get ['score']() { return normalizeScore(this._score) }\r\n set ['score'](score) { this._score = denormalizeScore(score) }\r\n }\r\n\r\n class KeysResult extends Array {\r\n get ['score']() { return normalizeScore(this._score) }\r\n set ['score'](score) { this._score = denormalizeScore(score) }\r\n }\r\n\r\n var new_result = (target, options) => {\r\n const result = new Result()\r\n result['target'] = target\r\n result['obj'] = options.obj ?? NULL\r\n result._score = options._score ?? NEGATIVE_INFINITY\r\n result._indexes = options._indexes ?? []\r\n result._targetLower = options._targetLower ?? ''\r\n result._targetLowerCodes = options._targetLowerCodes ?? NULL\r\n result._nextBeginningIndexes = options._nextBeginningIndexes ?? NULL\r\n result._bitflags = options._bitflags ?? 0\r\n return result\r\n }\r\n\r\n\r\n var normalizeScore = score => {\r\n if(score === NEGATIVE_INFINITY) return 0\r\n if(score > 1) return score\r\n return Math.E ** ( ((-score + 1)**.04307 - 1) * -2)\r\n }\r\n var denormalizeScore = normalizedScore => {\r\n if(normalizedScore === 0) return NEGATIVE_INFINITY\r\n if(normalizedScore > 1) return normalizedScore\r\n return 1 - Math.pow((Math.log(normalizedScore) / -2 + 1), 1 / 0.04307)\r\n }\r\n\r\n\r\n var prepareSearch = (search) => {\r\n if(typeof search === 'number') search = ''+search\r\n else if(typeof search !== 'string') search = ''\r\n search = search.trim()\r\n var info = prepareLowerInfo(search)\r\n\r\n var spaceSearches = []\r\n if(info.containsSpace) {\r\n var searches = search.split(/\\s+/)\r\n searches = [...new Set(searches)] // distinct\r\n for(var i=0; i<searches.length; i++) {\r\n if(searches[i] === '') continue\r\n var _info = prepareLowerInfo(searches[i])\r\n spaceSearches.push({lowerCodes:_info.lowerCodes, _lower:searches[i].toLowerCase(), containsSpace:false})\r\n }\r\n }\r\n\r\n return {lowerCodes: info.lowerCodes, _lower: info._lower, containsSpace: info.containsSpace, bitflags: info.bitflags, spaceSearches: spaceSearches}\r\n }\r\n\r\n\r\n\r\n var getPrepared = (target) => {\r\n if(target.length > 999) return prepare(target) // don't cache huge targets\r\n var targetPrepared = preparedCache.get(target)\r\n if(targetPrepared !== undefined) return targetPrepared\r\n targetPrepared = prepare(target)\r\n preparedCache.set(target, targetPrepared)\r\n return targetPrepared\r\n }\r\n var getPreparedSearch = (search) => {\r\n if(search.length > 999) return prepareSearch(search) // don't cache huge searches\r\n var searchPrepared = preparedSearchCache.get(search)\r\n if(searchPrepared !== undefined) return searchPrepared\r\n searchPrepared = prepareSearch(search)\r\n preparedSearchCache.set(search, searchPrepared)\r\n return searchPrepared\r\n }\r\n\r\n\r\n var all = (targets, options) => {\r\n var results = []; results.total = targets.length // this total can be wrong if some targets are skipped\r\n\r\n var limit = options?.limit || INFINITY\r\n\r\n if(options?.key) {\r\n for(var i=0;i<targets.length;i++) { var obj = targets[i]\r\n var target = getValue(obj, options.key)\r\n if(target == NULL) continue\r\n if(!isPrepared(target)) target = getPrepared(target)\r\n var result = new_result(target.target, {_score: target._score, obj: obj})\r\n results.push(result); if(results.length >= limit) return results\r\n }\r\n } else if(options?.keys) {\r\n for(var i=0;i<targets.length;i++) { var obj = targets[i]\r\n var objResults = new KeysResult(options.keys.length)\r\n for (var keyI = options.keys.length - 1; keyI >= 0; --keyI) {\r\n var target = getValue(obj, options.keys[keyI])\r\n if(!target) { objResults[keyI] = noTarget; continue }\r\n if(!isPrepared(target)) target = getPrepared(target)\r\n target._score = NEGATIVE_INFINITY\r\n target._indexes.len = 0\r\n objResults[keyI] = target\r\n }\r\n objResults.obj = obj\r\n objResults._score = NEGATIVE_INFINITY\r\n results.push(objResults); if(results.length >= limit) return results\r\n }\r\n } else {\r\n for(var i=0;i<targets.length;i++) { var target = targets[i]\r\n if(target == NULL) continue\r\n if(!isPrepared(target)) target = getPrepared(target)\r\n target._score = NEGATIVE_INFINITY\r\n target._indexes.len = 0\r\n results.push(target); if(results.length >= limit) return results\r\n }\r\n }\r\n\r\n return results\r\n }\r\n\r\n\r\n var algorithm = (preparedSearch, prepared, allowSpaces=false, allowPartialMatch=false) => {\r\n if(allowSpaces===false && preparedSearch.containsSpace) return algorithmSpaces(preparedSearch, prepared, allowPartialMatch)\r\n\r\n var searchLower = preparedSearch._lower\r\n var searchLowerCodes = preparedSearch.lowerCodes\r\n var searchLowerCode = searchLowerCodes[0]\r\n var targetLowerCodes = prepared._targetLowerCodes\r\n var searchLen = searchLowerCodes.length\r\n var targetLen = targetLowerCodes.length\r\n var searchI = 0 // where we at\r\n var targetI = 0 // where you at\r\n var matchesSimpleLen = 0\r\n\r\n // very basic fuzzy match; to remove non-matching targets ASAP!\r\n // walk through target. find sequential matches.\r\n // if all chars aren't found then exit\r\n for(;;) {\r\n var isMatch = searchLowerCode === targetLowerCodes[targetI]\r\n if(isMatch) {\r\n matchesSimple[matchesSimpleLen++] = targetI\r\n ++searchI; if(searchI === searchLen) break\r\n searchLowerCode = searchLowerCodes[searchI]\r\n }\r\n ++targetI; if(targetI >= targetLen) return NULL // Failed to find searchI\r\n }\r\n\r\n var searchI = 0\r\n var successStrict = false\r\n var matchesStrictLen = 0\r\n\r\n var nextBeginningIndexes = prepared._nextBeginningIndexes\r\n if(nextBeginningIndexes === NULL) nextBeginningIndexes = prepared._nextBeginningIndexes = prepareNextBeginningIndexes(prepared.target)\r\n targetI = matchesSimple[0]===0 ? 0 : nextBeginningIndexes[matchesSimple[0]-1]\r\n\r\n // Our target string successfully matched all characters in sequence!\r\n // Let's try a more advanced and strict test to improve the score\r\n // only count it as a match if it's consecutive or a beginning character!\r\n var backtrackCount = 0\r\n if(targetI !== targetLen) for(;;) {\r\n if(targetI >= targetLen) {\r\n // We failed to find a good spot for this search char, go back to the previous search char and force it forward\r\n if(searchI <= 0) break // We failed to push chars forward for a better match\r\n\r\n ++backtrackCount; if(backtrackCount > 200) break // exponential backtracking is taking too long, just give up and return a bad match\r\n\r\n --searchI\r\n var lastMatch = matchesStrict[--matchesStrictLen]\r\n targetI = nextBeginningIndexes[lastMatch]\r\n\r\n } else {\r\n var isMatch = searchLowerCodes[searchI] === targetLowerCodes[targetI]\r\n if(isMatch) {\r\n matchesStrict[matchesStrictLen++] = targetI\r\n ++searchI; if(searchI === searchLen) { successStrict = true; break }\r\n ++targetI\r\n } else {\r\n targetI = nextBeginningIndexes[targetI]\r\n }\r\n }\r\n }\r\n\r\n // check if it's a substring match\r\n var substringIndex = searchLen <= 1 ? -1 : prepared._targetLower.indexOf(searchLower, matchesSimple[0]) // perf: this is slow\r\n var isSubstring = !!~substringIndex\r\n var isSubstringBeginning = !isSubstring ? false : substringIndex===0 || prepared._nextBeginningIndexes[substringIndex-1] === substringIndex\r\n\r\n // if it's a substring match but not at a beginning index, let's try to find a substring starting at a beginning index for a better score\r\n if(isSubstring && !isSubstringBeginning) {\r\n for(var i=0; i<nextBeginningIndexes.length; i=nextBeginningIndexes[i]) {\r\n if(i <= substringIndex) continue\r\n\r\n for(var s=0; s<searchLen; s++) if(searchLowerCodes[s] !== prepared._targetLowerCodes[i+s]) break\r\n if(s === searchLen) { substringIndex = i; isSubstringBeginning = true; break }\r\n }\r\n }\r\n\r\n // tally up the score & keep track of matches for highlighting later\r\n // if it's a simple match, we'll switch to a substring match if a substring exists\r\n // if it's a strict match, we'll switch to a substring match only if that's a better score\r\n\r\n var calculateScore = matches => {\r\n var score = 0\r\n\r\n var extraMatchGroupCount = 0\r\n for(var i = 1; i < searchLen; ++i) {\r\n if(matches[i] - matches[i-1] !== 1) {score -= matches[i]; ++extraMatchGroupCount}\r\n }\r\n var unmatchedDistance = matches[searchLen-1] - matches[0] - (searchLen-1)\r\n\r\n score -= (12+unmatchedDistance) * extraMatchGroupCount // penality for more groups\r\n\r\n if(matches[0] !== 0) score -= matches[0]*matches[0]*.2 // penality for not starting near the beginning\r\n\r\n if(!successStrict) {\r\n score *= 1000\r\n } else {\r\n // successStrict on a target with too many beginning indexes loses points for being a bad target\r\n var uniqueBeginningIndexes = 1\r\n for(var i = nextBeginningIndexes[0]; i < targetLen; i=nextBeginningIndexes[i]) ++uniqueBeginningIndexes\r\n\r\n if(uniqueBeginningIndexes > 24) score *= (uniqueBeginningIndexes-24)*10 // quite arbitrary numbers here ...\r\n }\r\n\r\n score -= (targetLen - searchLen)/2 // penality for longer targets\r\n\r\n if(isSubstring) score /= 1+searchLen*searchLen*1 // bonus for being a full substring\r\n if(isSubstringBeginning) score /= 1+searchLen*searchLen*1 // bonus for substring starting on a beginningIndex\r\n\r\n score -= (targetLen - searchLen)/2 // penality for longer targets\r\n\r\n return score\r\n }\r\n\r\n if(!successStrict) {\r\n if(isSubstring) for(var i=0; i<searchLen; ++i) matchesSimple[i] = substringIndex+i // at this point it's safe to overwrite matchehsSimple with substr matches\r\n var matchesBest = matchesSimple\r\n var score = calculateScore(matchesBest)\r\n } else {\r\n if(isSubstringBeginning) {\r\n for(var i=0; i<searchLen; ++i) matchesSimple[i] = substringIndex+i // at this point it's safe to overwrite matchehsSimple with substr matches\r\n var matchesBest = matchesSimple\r\n var score = calculateScore(matchesSimple)\r\n } else {\r\n var matchesBest = matchesStrict\r\n var score = calculateScore(matchesStrict)\r\n }\r\n }\r\n\r\n prepared._score = score\r\n\r\n for(var i = 0; i < searchLen; ++i) prepared._indexes[i] = matchesBest[i]\r\n prepared._indexes.len = searchLen\r\n\r\n const result = new Result()\r\n result.target = prepared.target\r\n result._score = prepared._score\r\n result._indexes = prepared._indexes\r\n return result\r\n }\r\n var algorithmSpaces = (preparedSearch, target, allowPartialMatch) => {\r\n var seen_indexes = new Set()\r\n var score = 0\r\n var result = NULL\r\n\r\n var first_seen_index_last_search = 0\r\n var searches = preparedSearch.spaceSearches\r\n var searchesLen = searches.length\r\n var changeslen = 0\r\n\r\n // Return _nextBeginningIndexes back to its normal state\r\n var resetNextBeginningIndexes = () => {\r\n for(let i=changeslen-1; i>=0; i--) target._nextBeginningIndexes[nextBeginningIndexesChanges[i*2 + 0]] = nextBeginningIndexesChanges[i*2 + 1]\r\n }\r\n\r\n var hasAtLeast1Match = false\r\n for(var i=0; i<searchesLen; ++i) {\r\n allowPartialMatchScores[i] = NEGATIVE_INFINITY\r\n var search = searches[i]\r\n\r\n result = algorithm(search, target)\r\n if(allowPartialMatch) {\r\n if(result === NULL) continue\r\n hasAtLeast1Match = true\r\n } else {\r\n if(result === NULL) {resetNextBeginningIndexes(); return NULL}\r\n }\r\n\r\n // if not the last search, we need to mutate _nextBeginningIndexes for the next search\r\n var isTheLastSearch = i === searchesLen - 1\r\n if(!isTheLastSearch) {\r\n var indexes = result._indexes\r\n\r\n var indexesIsConsecutiveSubstring = true\r\n for(let i=0; i<indexes.len-1; i++) {\r\n if(indexes[i+1] - indexes[i] !== 1) {\r\n indexesIsConsecutiveSubstring = false; break;\r\n }\r\n }\r\n\r\n if(indexesIsConsecutiveSubstring) {\r\n var newBeginningIndex = indexes[indexes.len-1] + 1\r\n var toReplace = target._nextBeginningIndexes[newBeginningIndex-1]\r\n for(let i=newBeginningIndex-1; i>=0; i--) {\r\n if(toReplace !== target._nextBeginningIndexes[i]) break\r\n target._nextBeginningIndexes[i] = newBeginningIndex\r\n nextBeginningIndexesChanges[changeslen*2 + 0] = i\r\n nextBeginningIndexesChanges[changeslen*2 + 1] = toReplace\r\n changeslen++\r\n }\r\n }\r\n }\r\n\r\n score += result._score / searchesLen\r\n allowPartialMatchScores[i] = result._score / searchesLen\r\n\r\n // dock points based on order otherwise \"c man\" returns Manifest.cpp instead of CheatManager.h\r\n if(result._indexes[0] < first_seen_index_last_search) {\r\n score -= (first_seen_index_last_search - result._indexes[0]) * 2\r\n }\r\n first_seen_index_last_search = result._indexes[0]\r\n\r\n for(var j=0; j<result._indexes.len; ++j) seen_indexes.add(result._indexes[j])\r\n }\r\n\r\n if(allowPartialMatch && !hasAtLeast1Match) return NULL\r\n\r\n resetNextBeginningIndexes()\r\n\r\n // allows a search with spaces that's an exact substring to score well\r\n var allowSpacesResult = algorithm(preparedSearch, target, /*allowSpaces=*/true)\r\n if(allowSpacesResult !== NULL && allowSpacesResult._score > score) {\r\n if(allowPartialMatch) {\r\n for(var i=0; i<searchesLen; ++i) {\r\n allowPartialMatchScores[i] = allowSpacesResult._score / searchesLen\r\n }\r\n }\r\n return allowSpacesResult\r\n }\r\n\r\n if(allowPartialMatch) result = target\r\n result._score = score\r\n\r\n var i = 0\r\n for (let index of seen_indexes) result._indexes[i++] = index\r\n result._indexes.len = i\r\n\r\n return result\r\n }\r\n\r\n // we use this instead of just .normalize('NFD').replace(/[\\u0300-\\u036f]/g, '') because that screws with japanese characters\r\n var remove_accents = (str) => str.replace(/\\p{Script=Latin}+/gu, match => match.normalize('NFD')).replace(/[\\u0300-\\u036f]/g, '')\r\n\r\n var prepareLowerInfo = (str) => {\r\n str = remove_accents(str)\r\n var strLen = str.length\r\n var lower = str.toLowerCase()\r\n var lowerCodes = [] // new Array(strLen) sparse array is too slow\r\n var bitflags = 0\r\n var containsSpace = false // space isn't stored in bitflags because of how searching with a space works\r\n\r\n for(var i = 0; i < strLen; ++i) {\r\n var lowerCode = lowerCodes[i] = lower.charCodeAt(i)\r\n\r\n if(lowerCode === 32) {\r\n containsSpace = true\r\n continue // it's important that we don't set any bitflags for space\r\n }\r\n\r\n var bit = lowerCode>=97&&lowerCode<=122 ? lowerCode-97 // alphabet\r\n : lowerCode>=48&&lowerCode<=57 ? 26 // numbers\r\n // 3 bits available\r\n : lowerCode<=127 ? 30 // other ascii\r\n : 31 // other utf8\r\n bitflags |= 1<<bit\r\n }\r\n\r\n return {lowerCodes:lowerCodes, bitflags:bitflags, containsSpace:containsSpace, _lower:lower}\r\n }\r\n var prepareBeginningIndexes = (target) => {\r\n var targetLen = target.length\r\n var beginningIndexes = []; var beginningIndexesLen = 0\r\n var wasUpper = false\r\n var wasAlphanum = false\r\n for(var i = 0; i < targetLen; ++i) {\r\n var targetCode = target.charCodeAt(i)\r\n var isUpper = targetCode>=65&&targetCode<=90\r\n var isAlphanum = isUpper || targetCode>=97&&targetCode<=122 || targetCode>=48&&targetCode<=57\r\n var isBeginning = isUpper && !wasUpper || !wasAlphanum || !isAlphanum\r\n wasUpper = isUpper\r\n wasAlphanum = isAlphanum\r\n if(isBeginning) beginningIndexes[beginningIndexesLen++] = i\r\n }\r\n return beginningIndexes\r\n }\r\n var prepareNextBeginningIndexes = (target) => {\r\n target = remove_accents(target)\r\n var targetLen = target.length\r\n var beginningIndexes = prepareBeginningIndexes(target)\r\n var nextBeginningIndexes = [] // new Array(targetLen) sparse array is too slow\r\n var lastIsBeginning = beginningIndexes[0]\r\n var lastIsBeginningI = 0\r\n for(var i = 0; i < targetLen; ++i) {\r\n if(lastIsBeginning > i) {\r\n nextBeginningIndexes[i] = lastIsBeginning\r\n } else {\r\n lastIsBeginning = beginningIndexes[++lastIsBeginningI]\r\n nextBeginningIndexes[i] = lastIsBeginning===undefined ? targetLen : lastIsBeginning\r\n }\r\n }\r\n return nextBeginningIndexes\r\n }\r\n\r\n var preparedCache = new Map()\r\n var preparedSearchCache = new Map()\r\n\r\n // the theory behind these being globals is to reduce garbage collection by not making new arrays\r\n var matchesSimple = []; var matchesStrict = []\r\n var nextBeginningIndexesChanges = [] // allows straw berry to match strawberry well, by modifying the end of a substring to be considered a beginning index for the rest of the search\r\n var keysSpacesBestScores = []; var allowPartialMatchScores = []\r\n var tmpTargets = []; var tmpResults = []\r\n\r\n // prop = 'key' 2.5ms optimized for this case, seems to be about as fast as direct obj[prop]\r\n // prop = 'key1.key2' 10ms\r\n // prop = ['key1', 'key2'] 27ms\r\n // prop = obj => obj.tags.join() ??ms\r\n var getValue = (obj, prop) => {\r\n var tmp = obj[prop]; if(tmp !== undefined) return tmp\r\n if(typeof prop === 'function') return prop(obj) // this should run first. but that makes string props slower\r\n var segs = prop\r\n if(!Array.isArray(prop)) segs = prop.split('.')\r\n var len = segs.length\r\n var i = -1\r\n while (obj && (++i < len)) obj = obj[segs[i]]\r\n return obj\r\n }\r\n\r\n var isPrepared = (x) => { return typeof x === 'object' && typeof x._bitflags === 'number' }\r\n var INFINITY = Infinity; var NEGATIVE_INFINITY = -INFINITY\r\n var noResults = []; noResults.total = 0\r\n var NULL = null\r\n\r\n var noTarget = prepare('')\r\n\r\n // Hacked version of https://github.com/lemire/FastPriorityQueue.js\r\n var fastpriorityqueue=r=>{var e=[],o=0,a={},v=r=>{for(var a=0,v=e[a],c=1;c<o;){var s=c+1;a=c,s<o&&e[s]._score<e[c]._score&&(a=s),e[a-1>>1]=e[a],c=1+(a<<1)}for(var f=a-1>>1;a>0&&v._score<e[f]._score;f=(a=f)-1>>1)e[a]=e[f];e[a]=v};return a.add=(r=>{var a=o;e[o++]=r;for(var v=a-1>>1;a>0&&r._score<e[v]._score;v=(a=v)-1>>1)e[a]=e[v];e[a]=r}),a.poll=(r=>{if(0!==o){var a=e[0];return e[0]=e[--o],v(),a}}),a.peek=(r=>{if(0!==o)return e[0]}),a.replaceTop=(r=>{e[0]=r,v()}),a}\r\n var q = fastpriorityqueue() // reuse this\r\n\r\n // fuzzysort is written this way for minification. all names are mangeled unless quoted\r\n return {'single':single, 'go':go, 'prepare':prepare, 'cleanup':cleanup}\r\n}) // UMD\r\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "213F080B3C65483064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/prompt/parse.ts"], | ||
| "sourcesContent": [ | ||
| "export function parseFileLineRange(input: string) {\n const hash = input.lastIndexOf(\"#\")\n if (hash === -1) return { base: input }\n\n const base = input.slice(0, hash)\n const match = input.slice(hash + 1).match(/^(\\d+)(?:-(\\d*))?$/)\n if (!match) return { base }\n\n const startLine = Number(match[1])\n const endLine = match[2] && startLine < Number(match[2]) ? Number(match[2]) : undefined\n return { base, lineRange: { startLine, endLine } }\n}\n\nexport function stripFileLineRange(input: string) {\n return parseFileLineRange(input).base\n}\n\nexport function parseSlashHead(text: string, separator = /[ \\t\\n]/) {\n if (!text.startsWith(\"/\")) return\n\n const end = text.slice(1).search(separator)\n if (end === -1) return { name: text.slice(1), arguments: \"\", end: text.length }\n\n const split = end + 1\n return { name: text.slice(1, split), arguments: text.slice(split + 1), end: split }\n}\n" | ||
| ], | ||
| "mappings": ";AAAO,SAAS,CAAkB,CAAC,EAAe,CAChD,IAAM,EAAO,EAAM,YAAY,GAAG,EAClC,GAAI,IAAS,GAAI,MAAO,CAAE,KAAM,CAAM,EAEtC,IAAM,EAAO,EAAM,MAAM,EAAG,CAAI,EAC1B,EAAQ,EAAM,MAAM,EAAO,CAAC,EAAE,MAAM,oBAAoB,EAC9D,GAAI,CAAC,EAAO,MAAO,CAAE,MAAK,EAE1B,IAAM,EAAY,OAAO,EAAM,EAAE,EAC3B,EAAU,EAAM,IAAM,EAAY,OAAO,EAAM,EAAE,EAAI,OAAO,EAAM,EAAE,EAAI,OAC9E,MAAO,CAAE,OAAM,UAAW,CAAE,YAAW,SAAQ,CAAE,EAG5C,SAAS,CAAkB,CAAC,EAAe,CAChD,OAAO,EAAmB,CAAK,EAAE,KAG5B,SAAS,CAAc,CAAC,EAAc,EAAY,UAAW,CAClE,GAAI,CAAC,EAAK,WAAW,GAAG,EAAG,OAE3B,IAAM,EAAM,EAAK,MAAM,CAAC,EAAE,OAAO,CAAS,EAC1C,GAAI,IAAQ,GAAI,MAAO,CAAE,KAAM,EAAK,MAAM,CAAC,EAAG,UAAW,GAAI,IAAK,EAAK,MAAO,EAE9E,IAAM,EAAQ,EAAM,EACpB,MAAO,CAAE,KAAM,EAAK,MAAM,EAAG,CAAK,EAAG,UAAW,EAAK,MAAM,EAAQ,CAAC,EAAG,IAAK,CAAM", | ||
| "debugId": "DE8684947946457B64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type McpServer } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.list,\n Effect.fn(\"cli.mcp.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.mcp.list({ location: { directory: process.cwd() } }))\n const servers = response.data.toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n case \"needs_client_registration\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"needs_client_registration\":\n return `needs client registration: ${status.error}`\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n" | ||
| ], | ||
| "mappings": ";83BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAC/E,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC7E,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,aACA,4BACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,4BACH,MAAO,8BAA8B,EAAO,YACzC,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO", | ||
| "debugId": "2A70DC944264601764756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/auth.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n OpenCode,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpenCodeClient,\n} from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.auth,\n Effect.fn(\"cli.mcp.auth\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n const method = integration.methods.find(\n (candidate): candidate is IntegrationOAuthMethod => candidate.type === \"oauth\",\n )\n if (!method)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n\n const started = yield* Effect.promise(() =>\n client.integration.oauth.connect({ integrationID: integration.id, methodID: method.id, inputs: {}, location }),\n )\n const attempt = started.data\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, integration.id, attempt.attemptID)\n if (result.status === \"complete\") {\n process.stdout.write(`Authenticated with ${input.name}` + EOL)\n return\n }\n const reason = result.status === \"failed\" ? `: ${result.message}` : \"\"\n return yield* Effect.fail(new Error(`Authentication ${result.status}${reason}`))\n }),\n)\n\nconst poll = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n): Effect.Effect<Exclude<IntegrationAttemptStatus, { status: \"pending\" }>> =>\n Effect.gen(function* () {\n const status = yield* Effect.promise(() =>\n client.integration.oauth.status({ integrationID, attemptID, location }),\n ).pipe(Effect.map((result) => result.data))\n if (status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, integrationID, attemptID)\n }\n return status\n })\n" | ||
| ], | ||
| "mappings": ";66BAAA,mBAAS,gBAcT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,MAAC,OAAO,CAC1C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAKzG,IAAM,GAHU,MAAO,EAAO,QAAQ,IACpC,EAAO,YAAY,MAAM,QAAQ,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,OAAQ,CAAC,EAAG,UAAS,CAAC,CAC/G,GACwB,KACxB,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAY,GAAI,EAAQ,SAAS,EACpE,GAAI,EAAO,SAAW,WAAY,CAChC,QAAQ,OAAO,MAAM,sBAAsB,EAAM,OAAS,CAAG,EAC7D,OAEF,IAAM,EAAS,EAAO,SAAW,SAAW,KAAK,EAAO,UAAY,GACpE,OAAO,MAAO,EAAO,KAAS,MAAM,kBAAkB,EAAO,SAAS,GAAQ,CAAC,EAChF,CACH,EAEM,EAAO,CACX,EACA,EACA,IAEA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAS,MAAO,EAAO,QAAQ,IACnC,EAAO,YAAY,MAAM,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CACxE,EAAE,KAAK,EAAO,IAAI,CAAC,IAAW,EAAO,IAAI,CAAC,EAC1C,GAAI,EAAO,SAAW,UAEpB,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,EAAe,CAAS,EAErD,OAAO,EACR", | ||
| "debugId": "030D156C0F0939B264756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/services/service-config.ts"], | ||
| "sourcesContent": [ | ||
| "import { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"../version\"\nimport { Hash } from \"@opencode-ai/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, FileSystem, Option, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\nimport { selfCommand } from \"../util/process\"\n\n// The CLI's service configuration file, plus the Service.EnsureOptions binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"next\") return \"service.json\"\n return `service-${channel.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.json`\n}\n\nexport function defaultPort(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"next\") return 0xc0de\n if (channel === \"local\") return 0xc0df\n return 10_000 + (Number.parseInt(Hash.fast(channel).slice(0, 8), 16) % 50_000)\n}\n\nexport function legacyFilename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"local\") return\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nexport const migrateConfig = Effect.fnUntraced(function* (legacy: string, file: string) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n if (Option.isNone(yield* decodeInfo(text.value).pipe(Effect.option))) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const legacy = legacyFilename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyConfigFile: legacy ? path.join(global.config, legacy) : undefined,\n legacyRegistrationFiles: [\n ...(legacy ? [path.join(global.state, legacy)] : []),\n ...(name !== \"service.json\" && OPENCODE_CHANNEL !== \"local\" ? [path.join(global.state, \"service.json\")] : []),\n ],\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file, legacyRegistrationFiles } = yield* paths\n yield* Effect.forEach(legacyRegistrationFiles, (legacy) => migrateRegistration(legacy, file))\n return {\n file,\n version: OPENCODE_VERSION,\n command: [...selfCommand(), \"serve\", \"--service\"],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile, legacyConfigFile } = yield* paths\n if (legacyConfigFile) yield* migrateConfig(legacyConfigFile, configFile)\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.catch(() => Effect.succeed({} as Info)),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* paths\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n switch (configKey(key)) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "0A3213BE8D51E5D264756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/stop.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.stop,\n Effect.fn(\"cli.service.stop\")(function* () {\n yield* Service.stop(yield* ServiceConfig.options())\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+0BAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,OAAQ,UAAK,WAAO,OAAc,aAAQ,MAAC,EACnD,CACH", | ||
| "debugId": "708CBF61CC3A534864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"], | ||
| "sourcesContent": [ | ||
| "import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}", | ||
| "import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\n\nconst integrationID = \"opencode\"\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.console.commands.login,\n Effect.fn(\"cli.console.login\")(function* (input) {\n const timeline = yield* Effect.acquireRelease(\n Effect.promise(() => createTimelineHost()),\n (value) => request(() => value.close()).pipe(Effect.ignore),\n )\n const exit = yield* login(timeline, Option.getOrUndefined(input.url)).pipe(\n Effect.raceFirst(AppProcess.waitForAbort(timeline.signal)),\n Effect.exit,\n )\n if (Exit.isSuccess(exit)) return\n\n const cancelled = timeline.signal.aborted\n yield* request(() => timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(exit.cause))).pipe(\n Effect.ignore,\n )\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const found = yield* request((signal) => client.integration.get({ integrationID, location }, { signal }))\n const integration = yield* required(found.data, \"OpenCode Console integration is unavailable\")\n const method = yield* required(\n integration.methods.find((candidate) => candidate.type === \"oauth\"),\n \"OpenCode Console login is unavailable\",\n )\n\n yield* request(() => timeline.pending(\"Starting authorization...\"))\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n {\n integrationID,\n methodID: method.id,\n inputs: server ? { server } : {},\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n if (attempt.mode !== \"auto\") yield* Effect.fail(new Error(\"OpenCode Console requires a device login\"))\n\n yield* request(() => timeline.item(`Go to: ${attempt.url}`))\n yield* request(() => timeline.item(attempt.instructions))\n yield* request(async () => {\n const { default: open } = await import(\"open\")\n await open(attempt.url)\n }).pipe(Effect.ignore)\n yield* request(() => timeline.pending(\"Waiting for authorization...\"))\n\n const status = yield* waitForConsoleLogin(client, integrationID, attempt.attemptID)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") yield* Effect.fail(new Error(\"Device code expired\"))\n\n yield* request(() => timeline.success(\"Connected to OpenCode Console\"))\n yield* request(() => timeline.outro(\"Done\"))\n})\n\nconst waitForConsoleLogin = Effect.fn(\"cli.console.login.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nfunction request<A>(task: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: task,\n catch: (cause) => cause,\n })\n}\n\nfunction required<A>(value: A | null | undefined, message: string) {\n return value === null || value === undefined ? Effect.fail(new Error(message)) : Effect.succeed(value)\n}\n\nfunction errorMessage(cause: Cause.Cause<unknown>) {\n const error = Cause.squash(cause)\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\") {\n return error.message\n }\n return String(error)\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "CA9156F00EA13B0864756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/status.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.status,\n Effect.fn(\"cli.service.status\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover({ ...options, version: undefined })\n process.stdout.write((found?.url ?? \"stopped\") + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+0BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,MAC3C,SAAM,OAAU,WAAO,OAAc,aAAQ,EACvC,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH", | ||
| "debugId": "A9D1C2CA39DA6D3C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/mini.ts", "src/mini-host.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { setTimeout } from \"node:timers/promises\"\nimport { readStdin } from \"./util/io\"\nimport { createMiniHost, INTERACTIVE_INPUT_ERROR, usingInteractiveStdin } from \"./mini-host\"\nimport { parseSessionTargetModel, resolveSessionTarget, type SessionTargetPreparation } from \"./session-target\"\n\nexport type MiniCommandInput = {\n server: {\n endpoint: Endpoint\n reconnect?: (signal: AbortSignal) => Promise<Endpoint>\n }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: MiniFrontendInput[\"tuiConfig\"]\n config?: MiniFrontendInput[\"config\"]\n}\n\ntype Model = MiniFrontendInput[\"model\"]\n\nclass MiniInputError extends Error {}\n\nexport async function runMini(input: MiniCommandInput) {\n try {\n validate(input)\n const result = await usingInteractiveStdin(async (terminal) => {\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await readStdin(), input.prompt)\n const frontendTask = import(\"@opencode-ai/tui/mini\")\n const directory = localDirectory()\n const connection = createMiniConnection(input.server)\n const sdk = connection.sdk\n const requested = parseModel(input.model)\n const model = requested ? { providerID: requested.providerID, modelID: requested.id } : undefined\n const prepare = prepareTarget(input.agent)\n const resolveTarget = async (initial: OpenCodeClient, signal: AbortSignal) => {\n const resolved = await resolveMiniTarget({\n sdk: initial,\n reconnect: connection.reconnect,\n signal,\n resolve: (client) =>\n resolveSessionTarget({\n client,\n location: { directory },\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: requested,\n agent: input.agent,\n prepare,\n signal,\n }).catch((error) => {\n if (error instanceof Error && error.message === \"Session not found\")\n throw new MiniInputError(error.message)\n throw error\n }),\n })\n const target = resolved.value\n return {\n sdk: resolved.sdk,\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: target.resume,\n }\n }\n const create = (\n client: OpenCodeClient,\n next: {\n location: { directory: string; workspaceID?: string }\n agent: string | undefined\n model: Model\n variant: string | undefined\n },\n signal?: AbortSignal,\n ) =>\n resolveSessionTarget({\n client,\n location: { directory: next.location.directory, workspace: next.location.workspaceID },\n agent: next.agent,\n model: next.model\n ? { providerID: next.model.providerID, id: next.model.modelID, variant: next.variant }\n : undefined,\n prepare,\n signal,\n }).then((target) => ({\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: false,\n }))\n const frontend = await frontendTask\n return frontend.runMiniFrontend({\n host: createMiniHost({ terminal, directory }),\n sdk,\n directory,\n target: resolveTarget,\n reconnect: connection.reconnect,\n createSession: create,\n agent: input.agent,\n model,\n variant: requested?.variant,\n files: [],\n initialInput,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n config: input.config,\n })\n })\n if (result.exitCode !== 0) process.exit(result.exitCode)\n } catch (error) {\n if (error instanceof MiniInputError || (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR))\n fail(error.message)\n throw error\n }\n}\n\n/** @internal Exported for CLI boundary tests. */\nexport function createMiniConnection(input: MiniCommandInput[\"server\"]) {\n const make = (endpoint: Endpoint) =>\n OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n })\n const reconnect = input.reconnect\n return {\n sdk: make(input.endpoint),\n reconnect: reconnect\n ? async (signal: AbortSignal) => {\n const endpoint = await reconnect(signal)\n return make(endpoint)\n }\n : undefined,\n }\n}\n\n/** @internal Exported for reconnect lifecycle tests. */\nexport async function resolveMiniTarget<A>(input: {\n sdk: OpenCodeClient\n reconnect?: (signal: AbortSignal) => Promise<OpenCodeClient>\n signal: AbortSignal\n resolve: (sdk: OpenCodeClient) => Promise<A>\n}) {\n let sdk = input.sdk\n while (true) {\n try {\n return { sdk, value: await input.resolve(sdk) }\n } catch (error) {\n if (!input.reconnect || !(error instanceof ClientError) || error.reason !== \"Transport\") throw error\n while (true) {\n try {\n sdk = await input.reconnect(input.signal)\n break\n } catch (resolveError) {\n if (input.signal.aborted) throw resolveError\n await setTimeout(250, undefined, { signal: input.signal })\n }\n }\n }\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n throw new MiniInputError(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string) {\n try {\n return parseSessionTargetModel(value)\n } catch {\n throw new MiniInputError(\"--model must use the format provider/model[#variant]\")\n }\n}\n\nfunction prepareTarget(requestedAgent?: string): SessionTargetPreparation {\n return async (input) => ({ model: input.model, agent: requestedAgent ?? input.agent })\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n", | ||
| "import type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { createModelPreferenceRepository } from \"@opencode-ai/tui/model-preference\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport fs from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { ReadStream } from \"node:tty\"\n\nexport const INTERACTIVE_INPUT_ERROR = \"opencode mini requires a controlling terminal for input\"\n\nexport type InteractiveStdin = {\n stdin: NodeJS.ReadStream\n cleanup(): void\n}\n\ntype MiniHost = MiniFrontendInput[\"host\"]\n\nfunction preferences(statePath: string): MiniHost[\"preferences\"] {\n const repository = createModelPreferenceRepository(path.join(statePath, \"model.json\"))\n return {\n async resolveVariant(model) {\n if (!model) return\n return repository.resolveVariant(model)\n },\n async saveVariant(model, variant) {\n if (!model) return\n await repository.saveVariant(model, variant).catch(() => undefined)\n },\n }\n}\n\nfunction signal(name: \"SIGINT\" | \"SIGUSR2\"): MiniHost[\"signals\"][\"sigint\"] {\n return {\n subscribe(listener) {\n let subscribed = true\n process.on(name, listener)\n return () => {\n if (!subscribed) return\n subscribed = false\n process.off(name, listener)\n }\n },\n }\n}\n\nfunction createTrace(\n logPath: string,\n diagnostics: { pid: number; cwd: string; argv: string[] },\n): MiniHost[\"diagnostics\"][\"trace\"] {\n if (!process.env.OPENCODE_DIRECT_TRACE) return\n const stamp = new Date()\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\.\\d+Z$/, \"Z\")\n const target = path.join(logPath, \"direct\", `${stamp}-${diagnostics.pid}.jsonl`)\n const text = (data: unknown) =>\n JSON.stringify(data, (_key, value) => (typeof value === \"bigint\" ? String(value) : value), 0)\n fs.mkdirSync(path.dirname(target), { recursive: true })\n fs.writeFileSync(\n path.join(logPath, \"direct\", \"latest.json\"),\n text({\n time: new Date().toISOString(),\n ...diagnostics,\n path: target,\n }) + \"\\n\",\n )\n const trace = {\n write(type: string, data?: unknown) {\n fs.appendFileSync(\n target,\n text({\n time: new Date().toISOString(),\n pid: diagnostics.pid,\n type,\n data,\n }) + \"\\n\",\n )\n },\n }\n trace.write(\"trace.start\", {\n argv: diagnostics.argv,\n cwd: diagnostics.cwd,\n path: target,\n })\n return trace\n}\n\nfunction openTerminalStdin(target: string): NodeJS.ReadStream {\n return new ReadStream(fs.openSync(target, \"r\"))\n}\n\nexport function resolveInteractiveStdin(\n stdin: NodeJS.ReadStream = process.stdin,\n open: (target: string) => NodeJS.ReadStream = openTerminalStdin,\n platform: NodeJS.Platform = process.platform,\n): InteractiveStdin {\n if (stdin.isTTY) return { stdin, cleanup() {} }\n const target = platform === \"win32\" ? \"CONIN$\" : \"/dev/tty\"\n try {\n const source = open(target)\n let cleaned = false\n return {\n stdin: source,\n cleanup() {\n if (cleaned) return\n cleaned = true\n source.destroy()\n },\n }\n } catch (error) {\n throw new Error(INTERACTIVE_INPUT_ERROR, { cause: error })\n }\n}\n\n/** @internal Exported for owner-local resource cleanup tests. */\nexport async function usingInteractiveStdin<T>(\n run: (terminal: InteractiveStdin) => Promise<T>,\n resolve: () => InteractiveStdin = resolveInteractiveStdin,\n) {\n const terminal = resolve()\n try {\n return await run(terminal)\n } finally {\n terminal.cleanup()\n }\n}\n\n/** @internal Exported for owner-local host capability tests. */\nexport function createMiniHost(input: {\n terminal: InteractiveStdin\n directory: string\n paths?: { home: string; state: string; log: string }\n}): MiniHost {\n const paths = input.paths ?? {\n home: Global.Path.home,\n state: Global.Path.state,\n log: Global.Path.log,\n }\n const diagnostics = {\n pid: process.pid,\n cwd: input.directory,\n argv: process.argv.slice(2),\n }\n return {\n terminal: { stdin: input.terminal.stdin },\n platform: process.platform,\n stdout: {\n write(value) {\n process.stdout.write(value)\n },\n },\n files: {\n readText: (url) => readFile(new URL(url), \"utf8\"),\n },\n editor: {\n async open(options) {\n const { openEditor } = await import(\"@opencode-ai/tui/editor\")\n return openEditor(options)\n },\n },\n paths: { home: paths.home },\n signals: {\n sigint: signal(\"SIGINT\"),\n sigusr2: signal(\"SIGUSR2\"),\n },\n startup: {\n showTiming: [\"1\", \"true\"].includes(process.env.OPENCODE_SHOW_TTFD?.toLowerCase() ?? \"\"),\n now: () => performance.now(),\n },\n diagnostics: {\n trace: createTrace(paths.log, diagnostics),\n },\n preferences: preferences(paths.state),\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "2994E88AA725884064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/logout.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.logout,\n Effect.fn(\"cli.mcp.logout\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n yield* Effect.forEach(\n credentials,\n (connection) => Effect.promise(() => client.credential.remove({ credentialID: connection.id, location })),\n { discard: true },\n )\n process.stdout.write(`Removed OAuth credentials for ${input.name}` + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";66BAAA,mBAAS,gBAST,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,YAC/B,OAAO,QAAG,qBAAgB,OAAE,cAAU,MAAC,OAAO,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EACxG,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH", | ||
| "debugId": "65F18F4DC4BFEB0464756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mini.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Effect, FileSystem, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { Config } from \"../../config\"\nimport { resolve } from \"@opencode-ai/tui/config\"\n\nexport default Runtime.handler(Commands.commands.mini, (input) =>\n Effect.gen(function* () {\n const { runMini, validateMiniTerminal } = yield* Effect.promise(() => import(\"../../mini\"))\n yield* Effect.promise(async () => validateMiniTerminal())\n const serverURL = Option.getOrUndefined(input.server)\n const server = yield* ServerConnection.resolve({ server: serverURL, standalone: input.standalone })\n const config = yield* Config.Service\n const resolved = resolve(yield* config.get(), { terminalSuspend: process.platform !== \"win32\" })\n const fileSystem = yield* FileSystem.FileSystem\n const runServicePromise = Effect.runPromiseWith(Context.make(FileSystem.FileSystem, fileSystem))\n const service = server.service\n yield* Effect.promise(() =>\n runMini({\n server: {\n endpoint: server.endpoint,\n reconnect: service ? (signal) => runServicePromise(service.reconnect(), { signal }) : undefined,\n },\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: input.replay,\n replayLimit: Option.getOrUndefined(input.replayLimit),\n demo: input.demo,\n tuiConfig: resolved,\n config: {\n update: (update) => runServicePromise(config.update(update)),\n },\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";ogCAOA,SAAe,SAAQ,aAAQ,OAAS,cAAS,UAAM,MAAC,SACtD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,eAAS,6BAAyB,WAAO,OAAO,aAAQ,SAAa,wCAAa,OAC1F,WAAO,OAAO,aAAQ,cAAY,OAAqB,CAAC,EACxD,IAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAiB,QAAQ,CAAE,OAAQ,EAAW,WAAY,EAAM,UAAW,CAAC,EAC5F,EAAS,MAAO,EAAO,QACvB,EAAW,EAAQ,MAAO,EAAO,IAAI,EAAG,CAAE,gBAAiB,EAA6B,CAAC,EACzF,EAAa,MAAO,EAAW,WAC/B,EAAoB,EAAO,eAAe,EAAQ,KAAK,EAAW,WAAY,CAAU,CAAC,EACzF,EAAU,EAAO,QACvB,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,OAAQ,CACN,SAAU,EAAO,SACjB,UAAW,EAAU,CAAC,IAAW,EAAkB,EAAQ,UAAU,EAAG,CAAE,QAAO,CAAC,EAAI,MACxF,EACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAM,OACd,YAAa,EAAO,eAAe,EAAM,WAAW,EACpD,KAAM,EAAM,KACZ,UAAW,EACX,OAAQ,CACN,OAAQ,CAAC,IAAW,EAAkB,EAAO,OAAO,CAAM,CAAC,CAC7D,CACF,CAAC,CACH,EACD,CACH", | ||
| "debugId": "2052B4722717971764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/restart.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.restart,\n Effect.fn(\"cli.service.restart\")(function* () {\n const options = yield* ServiceConfig.options()\n yield* Service.stop(options)\n const transport = yield* Service.ensure(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+0BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,MAC5C,SAAM,OAAU,WAAO,OAAc,aAAQ,EAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "B0232AD7946D45B064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/run.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(Commands.commands.run, (input) =>\n Effect.gen(function* () {\n const { runNonInteractive } = yield* Effect.promise(() => import(\"../../run/run\"))\n const separator = process.argv.indexOf(\"--\", 2)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n yield* Effect.promise(() =>\n runNonInteractive({\n server,\n message: [...input.message, ...(separator === -1 ? [] : process.argv.slice(separator + 1))],\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n format: input.format,\n file: [...input.file],\n title: Option.getOrUndefined(input.title),\n thinking: input.thinking,\n auto: input.auto || input.yolo,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+9BAKA,SAAe,SAAQ,aAAQ,OAAS,cAAS,SAAK,MAAC,SACrD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,0BAAsB,WAAO,OAAO,aAAQ,SAAa,wCAAgB,OAC3E,OAAY,aAAQ,UAAK,aAAQ,UAAM,MAAC,EACxC,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACD,MAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,IAC5B,CAAC,CACH,EACD,CACH", | ||
| "debugId": "741EAB9563D6410A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/tool.ts"], | ||
| "sourcesContent": [ | ||
| "// Per-tool display rules shared across `opencode run` output paths.\n//\n// Each known tool (shell, edit, write, subagent, etc.) has a ToolRule that controls\n// four display hooks:\n//\n// view → visibility policy for progress/final scrollback entries and\n// whether completed finals can render as structured snapshots\n// run → inline summary for the non-interactive `run` command output\n// scroll → text formatting for start/progress/final scrollback entries\n// snap → structured snapshot (code block, diff, task card) for rich\n// scrollback entries\n//\n// Tools not in TOOL_RULES get fallback formatting.\nimport os from \"os\"\nimport path from \"path\"\nimport stripAnsi from \"strip-ansi\"\nimport type { SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { LANGUAGE_EXTENSIONS } from \"../util/filetype\"\nimport { Locale } from \"../util/locale\"\nimport {\n canonicalToolName,\n finiteNumber,\n primitiveInputSummary,\n toolDisplayMetadata,\n webSearchProviderLabel,\n} from \"../util/tool-display\"\nimport { formatPath } from \"../util/path-format\"\nimport type { RunEntryBody, StreamCommit, ToolSnapshot } from \"./types\"\n\nexport { canonicalToolName } from \"../util/tool-display\"\n\ntype ToolView = {\n output: boolean\n final: boolean\n snap?: \"code\" | \"diff\" | \"structured\"\n}\n\ntype ToolPhase = \"start\" | \"progress\" | \"final\"\n\ntype ToolDict = Record<string, unknown>\n\ntype PatchFile = {\n status?: string\n file?: string\n from?: string\n patch?: string\n deletions?: number\n}\n\ntype ToolInput = ToolDict & {\n id?: string\n path?: string\n pattern?: string\n url?: string\n query?: string\n agent?: string\n description?: string\n name?: string\n operation?: string\n line?: number\n character?: number\n content?: string\n command?: string\n workdir?: string\n questions?: Array<{ question?: string }>\n diff?: string\n}\n\ntype ToolMetadata = ToolDict & {\n name?: string\n count?: number\n matches?: number\n diff?: string\n provider?: unknown\n files?: PatchFile[]\n answers?: string[][]\n exit?: number\n}\n\ntype ToolFrame = {\n directory?: string\n raw: string\n name: string\n input: ToolDict\n meta: ToolDict\n state: ToolDict\n status: string\n error: string\n output: string\n time: {\n start?: number\n end?: number\n }\n}\n\ntype ToolInline = {\n icon: string\n title: string\n description?: string\n mode?: \"inline\" | \"block\"\n body?: string\n}\n\ntype ToolProps = {\n input: ToolInput\n metadata: ToolMetadata\n frame: ToolFrame\n}\n\ntype ToolName =\n | \"invalid\"\n | \"shell\"\n | \"write\"\n | \"edit\"\n | \"patch\"\n | \"batch\"\n | \"subagent\"\n | \"question\"\n | \"read\"\n | \"glob\"\n | \"grep\"\n | \"list\"\n | \"lsp\"\n | \"webfetch\"\n | \"websearch\"\n | \"skill\"\n | \"plan_exit\"\n\ntype ToolRule = {\n view: ToolView\n run: (props: ToolProps) => ToolInline\n scroll?: Partial<Record<ToolPhase, (props: ToolProps) => string>>\n snap?: (props: ToolProps) => ToolSnapshot | undefined\n}\n\ntype ToolRegistry = Record<ToolName, ToolRule>\n\ntype AnyToolRule = ToolRule\n\nfunction dict(v: unknown): ToolDict {\n if (!v || typeof v !== \"object\" || Array.isArray(v)) {\n return {}\n }\n\n return { ...v }\n}\n\nfunction props(frame: ToolFrame): ToolProps {\n return {\n input: frame.input,\n metadata: frame.meta,\n frame,\n }\n}\n\nfunction text(v: unknown): string {\n return typeof v === \"string\" ? v : \"\"\n}\n\nexport function toolOutputText(name: string, content: ReadonlyArray<{ type: string; text?: string }>) {\n // V2 shell content appends model-only status after the user-visible command output.\n if (canonicalToolName(name) === \"shell\") return content.find((item) => item.type === \"text\")?.text ?? \"\"\n return content.flatMap((item) => (item.type === \"text\" && item.text ? [item.text] : [])).join(\"\\n\")\n}\n\nfunction normalizeInput(name: string, value: unknown) {\n const input = dict(value)\n const path = typeof input.path === \"string\" ? input.path : text(input.filePath)\n const agent = typeof input.agent === \"string\" ? input.agent : text(input.subagent_type)\n return {\n ...input,\n ...([\"read\", \"write\", \"edit\", \"lsp\"].includes(name) && path ? { path } : {}),\n ...(name === \"subagent\" && agent ? { agent } : {}),\n }\n}\n\nfunction normalizeFile(value: unknown): PatchFile | undefined {\n const file = dict(value)\n const name = text(file.file) || text(file.relativePath) || text(file.filePath)\n if (!name) return\n const legacy = text(file.type)\n const status =\n text(file.status) ||\n (legacy === \"add\"\n ? \"added\"\n : legacy === \"delete\"\n ? \"deleted\"\n : legacy === \"update\"\n ? \"modified\"\n : legacy === \"move\"\n ? \"moved\"\n : legacy)\n const patch = typeof file.patch === \"string\" ? file.patch : undefined\n const deletions = finiteNumber(file.deletions)\n return {\n ...file,\n file: name,\n ...(status === \"moved\" && text(file.filePath) ? { from: text(file.filePath) } : {}),\n ...(status ? { status } : {}),\n ...(patch === undefined ? {} : { patch }),\n ...(deletions === undefined ? {} : { deletions }),\n }\n}\n\nfunction normalizeStructured(name: string, value: unknown) {\n const structured = dict(value)\n const files = list(structured.files).flatMap((item) => {\n const file = normalizeFile(item)\n return file ? [file] : []\n })\n const sessionID = text(structured.sessionID) || text(structured.sessionId)\n return {\n ...structured,\n ...([\"edit\", \"patch\"].includes(name) && Array.isArray(structured.files) ? { files } : {}),\n ...(name === \"subagent\" && sessionID ? { sessionID } : {}),\n }\n}\n\nexport function normalizeTool(tool: SessionMessageAssistantTool): SessionMessageAssistantTool {\n const name = canonicalToolName(tool.name)\n if (tool.state.status === \"streaming\") return { ...tool, name }\n return {\n ...tool,\n name,\n state: {\n ...tool.state,\n input: normalizeInput(name, tool.state.input),\n structured: normalizeStructured(name, toolDisplayMetadata(tool.state)),\n },\n } as SessionMessageAssistantTool\n}\n\nfunction list<T>(v: unknown): T[] {\n if (!Array.isArray(v)) {\n return []\n }\n\n return v\n}\n\nfunction span(frame: ToolFrame): string {\n const start = frame.time.start\n const end = frame.time.end\n if (start === undefined || end === undefined || end <= start) {\n return \"\"\n }\n\n return Locale.duration(end - start)\n}\n\nfunction fail(ctx: ToolFrame): string {\n const error = toolError(ctx)\n if (error) {\n return `✖ ${ctx.name} failed: ${error}`\n }\n\n return `✖ ${ctx.name} failed`\n}\n\nfunction toolError(ctx: ToolFrame): string {\n if (ctx.error) {\n return ctx.error\n }\n\n const state = text(ctx.state.error).trim()\n if (state) {\n return state\n }\n\n return ctx.raw.trim()\n}\n\nfunction fallbackStart(ctx: ToolFrame): string {\n const extra = primitiveInputSummary(ctx.input)\n if (!extra) {\n return `⚙ ${ctx.name}`\n }\n\n return `⚙ ${ctx.name} ${extra}`\n}\n\nfunction fallbackFinal(ctx: ToolFrame): string {\n if (ctx.status === \"error\") {\n return fail(ctx)\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return ctx.raw.trim()\n }\n\n const time = span(ctx)\n if (!time) {\n return `${ctx.name} completed`\n }\n\n return `${ctx.name} completed · ${time}`\n}\n\nexport function toolPath(input?: string, opts: { home?: boolean; directory?: string } = {}): string {\n return formatPath(input, {\n base: opts.directory ?? process.cwd(),\n home: opts.home ? os.homedir() : undefined,\n forwardSlashes: true,\n })\n}\n\nfunction displayPath(p: ToolProps, input?: string, opts: { home?: boolean } = {}) {\n return toolPath(input, { ...opts, directory: p.frame.directory })\n}\n\nfunction fallbackInline(ctx: ToolFrame): ToolInline {\n const title = Object.keys(ctx.input).length > 0 ? JSON.stringify(ctx.input) : \"Unknown\"\n\n return {\n icon: \"⚙\",\n title: `${ctx.name} ${title}`,\n }\n}\n\nfunction count(n: number, label: string): string {\n return `${n} ${label}${n === 1 ? \"\" : \"es\"}`\n}\n\nfunction runGlob(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Glob \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${displayPath(p, root)}` : \"\"\n const matches = p.metadata.count\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runGrep(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Grep \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${displayPath(p, root)}` : \"\"\n const matches = p.metadata.matches\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runList(p: ToolProps): ToolInline {\n const dir = text(dict(p.input).path)\n return {\n icon: \"→\",\n title: dir ? `List ${displayPath(p, dir)}` : \"List\",\n }\n}\n\nfunction runRead(p: ToolProps): ToolInline {\n const file = displayPath(p, p.input.path)\n const description = primitiveInputSummary(p.frame.input, [\"path\"]) || undefined\n return {\n icon: \"→\",\n title: `Read ${file}`,\n ...(description && { description }),\n }\n}\n\nfunction runWrite(p: ToolProps): ToolInline {\n return {\n icon: \"←\",\n title: `Write ${displayPath(p, p.input.path)}`,\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction runWebfetch(p: ToolProps): ToolInline {\n const url = p.input.url ?? \"\"\n return {\n icon: \"%\",\n title: url ? `WebFetch ${url}` : \"WebFetch\",\n }\n}\n\nfunction runEdit(p: ToolProps): ToolInline {\n const file = list<PatchFile>(p.metadata.files)[0]\n return {\n icon: \"←\",\n title: `Edit ${displayPath(p, p.input.path)}`,\n mode: \"block\",\n body: file?.patch ?? p.metadata.diff,\n }\n}\n\nfunction runWebSearch(p: ToolProps): ToolInline {\n const title = webSearchProviderLabel(p.metadata.provider)\n return {\n icon: \"◈\",\n title: p.input.query ? `${title} \"${p.input.query}\"` : title,\n }\n}\n\nfunction runTask(p: ToolProps): ToolInline {\n const kind = Locale.titlecase(p.input.agent || \"unknown\")\n const desc = p.input.description\n const icon = p.frame.status === \"error\" ? \"✗\" : p.frame.status === \"running\" ? \"•\" : \"✓\"\n return {\n icon,\n title: desc || `${kind} Subagent`,\n description: desc ? `${kind} Agent` : undefined,\n }\n}\n\nfunction runSkill(p: ToolProps): ToolInline {\n const name = p.metadata.name ?? p.input.id ?? \"\"\n return {\n icon: \"→\",\n title: `Skill \"${name}\"`,\n }\n}\n\nfunction runPatch(p: ToolProps): ToolInline {\n const files = p.metadata.files?.length ?? 0\n if (files === 0) {\n return {\n icon: \"%\",\n title: \"Patch\",\n }\n }\n\n return {\n icon: \"%\",\n title: `Patch ${files} file${files === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runQuestion(p: ToolProps): ToolInline {\n const total = list(p.frame.input.questions).length\n return {\n icon: \"→\",\n title: `Asked ${total} question${total === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runInvalid(p: ToolProps): ToolInline {\n return {\n icon: \"✗\",\n title: \"Invalid Tool\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction runBatch(p: ToolProps): ToolInline {\n const calls = list(dict(p.input).tool_calls).length\n return {\n icon: \"#\",\n title: calls > 0 ? `Batch ${calls} tool${calls === 1 ? \"\" : \"s\"}` : \"Batch\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction lspTitle(\n input: {\n operation?: string\n path?: string\n line?: number\n character?: number\n },\n opts: { home?: boolean; directory?: string } = {},\n): string {\n const op = input.operation || \"request\"\n const file = input.path ? toolPath(input.path, opts) : \"\"\n const line = typeof input.line === \"number\" ? input.line : undefined\n const char = typeof input.character === \"number\" ? input.character : undefined\n const pos = line !== undefined && char !== undefined ? `:${line}:${char}` : \"\"\n if (!file) {\n return `LSP ${op}`\n }\n\n return `LSP ${op} ${file}${pos}`\n}\n\nfunction runLsp(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: lspTitle(p.input, { directory: p.frame.directory }),\n }\n}\n\nfunction runPlanExit(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: \"Switching to build agent\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction patchTitle(file: PatchFile, directory?: string): string {\n if (file.status === \"added\") {\n return `# Created ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"deleted\") {\n return `# Deleted ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"moved\") {\n return `# Moved ${toolPath(file.from, { directory })} -> ${toolPath(file.file, { directory })}`\n }\n\n return `# Patched ${toolPath(file.file, { directory })}`\n}\n\nfunction snapWrite(p: ToolProps): ToolSnapshot | undefined {\n const file = p.input.path || \"\"\n const content = p.input.content || \"\"\n if (!file && !content) {\n return undefined\n }\n\n return {\n kind: \"code\",\n title: `# Wrote ${displayPath(p, file)}`,\n content,\n file,\n }\n}\n\nfunction snapEdit(p: ToolProps): ToolSnapshot | undefined {\n const item = list<PatchFile>(p.metadata.files)[0]\n const file = item?.file || p.input.path || \"\"\n const diff = item?.patch || p.metadata.diff || \"\"\n if (!file || !diff.trim()) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items: [\n {\n title: `# Edited ${displayPath(p, file)}`,\n diff,\n file,\n },\n ],\n }\n}\n\nfunction snapPatch(p: ToolProps): ToolSnapshot | undefined {\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n return undefined\n }\n\n const items = files.flatMap((file) => {\n if (!file || typeof file !== \"object\") {\n return []\n }\n\n const diff = typeof file.patch === \"string\" ? file.patch : \"\"\n if (!diff.trim()) {\n return []\n }\n\n const name = file.file\n return [\n {\n title: patchTitle(file, p.frame.directory),\n diff,\n file: name,\n deletions: typeof file.deletions === \"number\" ? file.deletions : 0,\n },\n ]\n })\n\n if (items.length !== files.length) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items,\n }\n}\n\nfunction snapTask(p: ToolProps): ToolSnapshot {\n const kind = Locale.titlecase(p.input.agent || \"general\")\n const desc = p.input.description\n const rows = [desc].filter((item): item is string => Boolean(item))\n\n return {\n kind: \"task\",\n title: `# ${kind} Subagent`,\n rows,\n tail: \"\",\n }\n}\n\nfunction snapQuestion(p: ToolProps): ToolSnapshot {\n const answers = list<unknown[]>(p.frame.meta.answers)\n const items = list<{ question?: string }>(p.frame.input.questions).map((item, i) => {\n const answer = list<string>(answers[i]).filter((entry) => typeof entry === \"string\")\n return {\n question: item.question || `Question ${i + 1}`,\n answer: answer.length > 0 ? answer.join(\", \") : \"(no answer)\",\n }\n })\n\n return {\n kind: \"question\",\n items,\n tail: \"\",\n }\n}\n\nfunction scrollBashStart(p: ToolProps): string {\n const cmd = p.input.command ?? \"\"\n const wd = p.input.workdir ?? \"\"\n const formatted = wd && wd !== \".\" ? displayPath(p, wd) : \"\"\n const dir = formatted === \".\" ? \"\" : formatted\n if (cmd && !dir) {\n return `$ ${cmd}`\n }\n\n if (!cmd) {\n return dir ? `# Running in ${dir}` : \"\"\n }\n\n return `# Running in ${dir}\\n$ ${cmd}`\n}\n\nfunction scrollBashProgress(p: ToolProps): string {\n const out = stripAnsi(p.frame.raw)\n const cmd = (p.input.command ?? \"\").trim()\n const fmt = (text: string) => {\n const body = text.replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n return body ? `\\n${body}` : \"\"\n }\n\n if (!cmd) {\n return out.replace(/\\n+$/, \"\")\n }\n\n const wdRaw = (p.input.workdir ?? \"\").trim()\n const wd = wdRaw ? displayPath(p, wdRaw) : \"\"\n const lines = out.split(\"\\n\")\n const first = (lines[0] || \"\").trim()\n const second = (lines[1] || \"\").trim()\n\n if (wd && (first === wd || first === wdRaw) && second === cmd) {\n return fmt(lines.slice(2).join(\"\\n\"))\n }\n\n if (first === cmd || first === `$ ${cmd}`) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n if (wd && (first === `${wd} ${cmd}` || first === `${wdRaw} ${cmd}`)) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n return fmt(out)\n}\n\nfunction scrollShellFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const code = p.metadata.exit\n const time = span(p.frame)\n if (code === undefined) {\n if (!time) {\n return \"shell completed\"\n }\n\n return `shell completed · ${time}`\n }\n\n return `shell completed (exit ${code})${time ? ` · ${time}` : \"\"}`\n}\n\nfunction scrollReadStart(p: ToolProps): string {\n const file = displayPath(p, p.input.path)\n const extra = primitiveInputSummary(p.frame.input, [\"path\"])\n const tail = extra ? ` ${extra}` : \"\"\n return `→ Read ${file}${tail}`.trim()\n}\n\nfunction scrollWriteStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollEditStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollPatchStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction patchLine(file: PatchFile, directory?: string): string {\n if (file.status === \"added\") {\n return `+ Created ${toolPath(file.file, { directory })}`\n }\n\n if (file.status === \"deleted\") {\n return `- Deleted ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"moved\") {\n return `→ Moved ${toolPath(file.from, { directory })} → ${toolPath(file.file, { directory })}`\n }\n\n return `~ Patched ${toolPath(file.file, { directory })}`\n}\n\nfunction scrollPatchFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n const time = span(p.frame)\n if (!time) {\n return \"patch\"\n }\n\n return `patch · ${time}`\n }\n\n const showModified = !files.some((file) => file?.status && file.status !== \"modified\")\n const shown = files.filter((file) => showModified || file.status !== \"modified\")\n const rows = shown.slice(0, 6).map((file) => patchLine(file, p.frame.directory))\n if (shown.length > 6) {\n rows.push(`... and ${shown.length - 6} more`)\n }\n\n if (rows.length > 0) {\n return rows.join(\"\\n\")\n }\n\n return patchLine(files[0]!, p.frame.directory)\n}\n\nfunction scrollTaskStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction taskResult(output: string): string | undefined {\n if (!output.trim()) {\n return undefined\n }\n\n const match = output.match(/<task_result>\\s*([\\s\\S]*?)\\s*<\\/task_result>/)\n if (match) {\n return match[1].trim() || undefined\n }\n\n const next = output\n .split(\"\\n\")\n .filter((line) => !line.startsWith(\"task_id:\"))\n .join(\"\\n\")\n .trim()\n return next || undefined\n}\n\nfunction scrollTaskFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const kind = Locale.titlecase(p.input.agent || \"general\")\n const row = p.input.description\n if (!row) {\n return `# ${kind} Subagent`\n }\n\n return `# ${kind} Subagent\\n${row}`\n}\n\nfunction scrollQuestionStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollQuestionFinal(p: ToolProps): string {\n const q = p.input.questions ?? []\n const a = p.metadata.answers ?? []\n const time = span(p.frame)\n if (q.length === 0) {\n if (!time) {\n return \"0 questions\"\n }\n\n return `0 questions · ${time}`\n }\n\n const rows: string[] = []\n for (const [i, item] of q.slice(0, 4).entries()) {\n const prompt = item.question\n const reply = a[i] ?? []\n rows.push(`? ${prompt || `Question ${i + 1}`}`)\n rows.push(` ${reply.length > 0 ? reply.join(\", \") : \"(no answer)\"}`)\n }\n\n if (q.length > 4) {\n rows.push(`... and ${q.length - 4} more`)\n }\n\n return rows.join(\"\\n\")\n}\n\nfunction scrollLspStart(p: ToolProps): string {\n return `→ ${lspTitle(p.input, { directory: p.frame.directory })}`\n}\n\nfunction scrollSkillStart(p: ToolProps): string {\n return `→ Skill \"${p.metadata.name ?? p.input.id ?? \"\"}\"`\n}\n\nfunction scrollGlobStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Glob \"${pattern}\"` : \"✱ Glob\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${displayPath(p, dir)}`\n}\n\nfunction scrollGlobFinal(p: ToolProps): string {\n return toolError(p.frame) || fail(p.frame)\n}\n\nfunction scrollGrepStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Grep \"${pattern}\"` : \"✱ Grep\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${displayPath(p, dir)}`\n}\n\nfunction scrollListStart(p: ToolProps): string {\n const dir = text(dict(p.input).path)\n if (!dir) {\n return \"→ List\"\n }\n\n return `→ List ${displayPath(p, dir)}`\n}\n\nfunction scrollWebfetchStart(p: ToolProps): string {\n const url = p.input.url ?? \"\"\n if (!url) {\n return \"% WebFetch\"\n }\n\n return `% WebFetch ${url}`\n}\n\nfunction scrollWebSearchStart(p: ToolProps): string {\n const title = webSearchProviderLabel(p.metadata.provider)\n const query = p.input.query ?? \"\"\n if (!query) {\n return `◈ ${title}`\n }\n\n return `◈ ${title} \"${query}\"`\n}\n\nconst TOOL_RULES = {\n invalid: {\n view: {\n output: true,\n final: false,\n },\n run: runInvalid,\n scroll: {\n start: () => \"\",\n },\n },\n shell: {\n view: {\n output: true,\n final: false,\n },\n run: runShell,\n scroll: {\n start: scrollBashStart,\n progress: scrollBashProgress,\n final: scrollShellFinal,\n },\n },\n write: {\n view: {\n output: false,\n final: true,\n snap: \"code\",\n },\n run: runWrite,\n snap: snapWrite,\n scroll: {\n start: scrollWriteStart,\n },\n },\n edit: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runEdit,\n snap: snapEdit,\n scroll: {\n start: scrollEditStart,\n },\n },\n patch: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runPatch,\n snap: snapPatch,\n scroll: {\n start: scrollPatchStart,\n final: scrollPatchFinal,\n },\n },\n batch: {\n view: {\n output: true,\n final: false,\n },\n run: runBatch,\n scroll: {\n start: () => \"\",\n },\n },\n subagent: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runTask,\n snap: snapTask,\n scroll: {\n start: scrollTaskStart,\n final: scrollTaskFinal,\n },\n },\n question: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runQuestion,\n snap: snapQuestion,\n scroll: {\n start: scrollQuestionStart,\n final: scrollQuestionFinal,\n },\n },\n read: {\n view: {\n output: false,\n final: false,\n },\n run: runRead,\n scroll: {\n start: scrollReadStart,\n },\n },\n glob: {\n view: {\n output: false,\n final: false,\n },\n run: runGlob,\n scroll: {\n start: scrollGlobStart,\n final: scrollGlobFinal,\n },\n },\n grep: {\n view: {\n output: false,\n final: false,\n },\n run: runGrep,\n scroll: {\n start: scrollGrepStart,\n },\n },\n list: {\n view: {\n output: false,\n final: false,\n },\n run: runList,\n scroll: {\n start: scrollListStart,\n },\n },\n lsp: {\n view: {\n output: false,\n final: false,\n },\n run: runLsp,\n scroll: {\n start: scrollLspStart,\n },\n },\n webfetch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebfetch,\n scroll: {\n start: scrollWebfetchStart,\n },\n },\n websearch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebSearch,\n scroll: {\n start: scrollWebSearchStart,\n },\n },\n skill: {\n view: {\n output: false,\n final: false,\n },\n run: runSkill,\n scroll: {\n start: scrollSkillStart,\n },\n },\n plan_exit: {\n view: {\n output: true,\n final: false,\n },\n run: runPlanExit,\n scroll: {\n start: () => \"\",\n },\n },\n} as const satisfies ToolRegistry\n\nfunction key(name: string): name is ToolName {\n return Object.prototype.hasOwnProperty.call(TOOL_RULES, name)\n}\n\nfunction rule(name?: string): AnyToolRule | undefined {\n if (!name || !key(name)) {\n return undefined\n }\n\n return TOOL_RULES[name]\n}\n\nfunction frame(part: SessionMessageAssistantTool, directory?: string): ToolFrame {\n const tool = normalizeTool(part)\n if (tool.state.status === \"streaming\")\n return {\n directory,\n raw: tool.state.input,\n name: tool.name,\n input: {},\n meta: {},\n state: dict(tool.state),\n status: tool.state.status,\n error: \"\",\n output: \"\",\n time: { start: tool.time.created },\n }\n const output = toolOutputText(tool.name, tool.state.content)\n return {\n directory,\n raw: output,\n name: tool.name,\n input: normalizeInput(tool.name, tool.state.input),\n meta: normalizeStructured(tool.name, tool.state.structured),\n state: dict(tool.state),\n status: tool.state.status,\n error: tool.state.status === \"error\" ? tool.state.error.message : \"\",\n output,\n time: {\n start: tool.time.ran ?? tool.time.created,\n end: tool.time.completed,\n },\n }\n}\n\nfunction toolFrame(commit: StreamCommit, raw: string): ToolFrame {\n const current = commit.part ? frame(commit.part, commit.directory) : undefined\n return {\n directory: commit.directory,\n raw,\n name: canonicalToolName(commit.tool || current?.name || \"tool\"),\n input: current?.input ?? {},\n meta: current?.meta ?? {},\n state: current?.state ?? {},\n status: commit.toolState ?? current?.status ?? \"\",\n error: (commit.toolError ?? current?.error ?? \"\").trim(),\n output: current?.output ?? raw,\n time: current?.time ?? {},\n }\n}\n\nfunction runShell(p: ToolProps): ToolInline {\n return {\n icon: \"$\",\n title: p.input.command || \"\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output.trim() : undefined,\n }\n}\n\nexport function toolView(name?: string): ToolView {\n return (\n rule(name ? canonicalToolName(name) : undefined)?.view ?? {\n output: true,\n final: true,\n }\n )\n}\n\nexport function toolStructuredFinal(commit: StreamCommit): boolean {\n const state = commit.toolState ?? commit.part?.state.status\n return (\n commit.kind === \"tool\" &&\n commit.phase === \"final\" &&\n state === \"completed\" &&\n Boolean(toolView(commit.tool ?? commit.part?.name).snap)\n )\n}\n\nexport function toolInlineInfo(part: SessionMessageAssistantTool, directory?: string): ToolInline {\n const ctx = frame(part, directory)\n const draw = rule(ctx.name)?.run\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n return fallbackInline(ctx)\n }\n\n return fallbackInline(ctx)\n}\n\nexport function toolScroll(phase: ToolPhase, ctx: ToolFrame): string {\n const draw = rule(ctx.name)?.scroll?.[phase]\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n if (phase === \"progress\") {\n return ctx.raw\n }\n return fallbackFinal(ctx)\n }\n\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n\n if (phase === \"progress\") {\n return ctx.raw\n }\n\n return fallbackFinal(ctx)\n}\n\nfunction toolSnapshot(commit: StreamCommit, raw: string): ToolSnapshot | undefined {\n const ctx = toolFrame(commit, raw)\n const draw = rule(ctx.name)?.snap\n if (!draw) {\n return undefined\n }\n\n try {\n return draw(props(ctx))\n } catch {\n return undefined\n }\n}\n\nfunction textBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"text\",\n content,\n }\n}\n\nfunction markdownBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"markdown\",\n content,\n }\n}\n\nfunction structuredBody(commit: StreamCommit, raw: string): RunEntryBody | undefined {\n const snap = toolSnapshot(commit, raw)\n if (!snap) {\n return undefined\n }\n\n return {\n type: \"structured\",\n snapshot: snap,\n }\n}\n\nconst STRUCTURED_FALLBACK_LENGTH = 4_096\n\nfunction structuredFallback(value: ToolDict): RunEntryBody | undefined {\n if (Object.keys(value).length === 0) return\n const content = JSON.stringify(value, null, 2)\n if (!content) return\n const suffix = \"\\n... [truncated]\"\n return {\n type: \"code\",\n content:\n content.length <= STRUCTURED_FALLBACK_LENGTH\n ? content\n : content.slice(0, STRUCTURED_FALLBACK_LENGTH - suffix.length) + suffix,\n filetype: \"json\",\n }\n}\n\nfunction shellOutput(command: string, raw: string): string | undefined {\n const body = stripAnsi(raw).replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n if (!body) {\n return undefined\n }\n\n if (!command) {\n return body\n }\n\n return `\\n${body}`\n}\n\nexport function toolEntryBody(\n commit: StreamCommit,\n raw: string,\n options?: { shellOutput?: boolean },\n): RunEntryBody | undefined {\n if (commit.shell) {\n if (commit.phase === \"start\") {\n return textBody(`$ ${commit.shell.command}`)\n }\n\n if (commit.phase === \"progress\") {\n return textBody(shellOutput(commit.shell.command, raw) ?? \"\")\n }\n\n if (commit.toolState === \"error\") {\n const ctx = toolFrame(commit, raw)\n return textBody(toolScroll(\"final\", ctx))\n }\n\n return undefined\n }\n\n const ctx = toolFrame(commit, raw)\n const view = toolView(ctx.name)\n\n if (ctx.name === \"shell\" && commit.phase === \"progress\" && options?.shellOutput === false) return undefined\n\n if (ctx.name === \"subagent\") {\n if (commit.phase === \"start\") {\n return undefined\n }\n\n if (commit.phase === \"final\" && ctx.status === \"completed\") {\n const result = taskResult(ctx.output)\n if (result) {\n return markdownBody(result)\n }\n }\n }\n\n if (commit.phase === \"progress\" && !view.output) {\n return undefined\n }\n\n if (commit.phase === \"final\") {\n if (ctx.status === \"error\") {\n return textBody(toolScroll(\"final\", ctx))\n }\n\n if (!view.final) {\n return undefined\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return textBody(ctx.raw.trim())\n }\n\n if (toolStructuredFinal(commit)) {\n return structuredBody(commit, raw) ?? textBody(toolScroll(\"final\", ctx))\n }\n\n if (!rule(ctx.name) && !ctx.output.trim()) {\n return structuredFallback(ctx.meta) ?? textBody(toolScroll(\"final\", ctx))\n }\n }\n\n return textBody(toolScroll(commit.phase, ctx))\n}\n\nexport function toolFiletype(input?: string): string | undefined {\n if (!input) {\n return undefined\n }\n\n const ext = path.extname(input)\n const lang = LANGUAGE_EXTENSIONS[ext]\n if ([\"typescriptreact\", \"javascriptreact\", \"javascript\"].includes(lang)) {\n return \"typescript\"\n }\n\n return lang\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "9335FB082160FD1D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/migrate.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\n\nexport default Runtime.handler(Commands.commands.migrate, (_input) => Effect.log(\"No migrations to run.\"))\n" | ||
| ], | ||
| "mappings": ";2oBAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,4BAAuB,MAAC", | ||
| "debugId": "3DACFEDC893EC11A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/image/photon-wasm.bun.ts", "../core/src/image/photon.ts"], | ||
| "sourcesContent": [ | ||
| "// @ts-ignore Bun embeds static file imports when compiling the CLI.\nimport photonWasm from \"@silvia-odwyer/photon-node/photon_rs_bg.wasm\" with { type: \"file\" }\n\nexport default photonWasm\n", | ||
| "import photonWasm from \"#photon-wasm\"\nimport { Effect } from \"effect\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { FileSystem } from \"../filesystem\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image\"\n\nconst JPEG_QUALITIES = [80, 85, 70, 55, 40]\n\nexport const make = Effect.gen(function* () {\n ;(globalThis as typeof globalThis & { __OPENCODE_PHOTON_WASM_PATH?: string }).__OPENCODE_PHOTON_WASM_PATH =\n path.isAbsolute(photonWasm) ? photonWasm : fileURLToPath(new URL(photonWasm, import.meta.url))\n const loadPhoton = yield* Effect.cached(\n Effect.tryPromise({\n try: () => import(\"@silvia-odwyer/photon-node\"),\n catch: () => new ResizerUnavailableError(),\n }),\n )\n return Effect.fn(\"Image.Photon.normalize\")(function* (\n resource: string,\n content: FileSystem.Content & { readonly encoding: \"base64\" },\n limits: {\n readonly autoResize: boolean\n readonly maxWidth: number\n readonly maxHeight: number\n readonly maxBase64Bytes: number\n },\n ) {\n const photon = yield* loadPhoton\n const decoded = yield* Effect.try({\n try: () => photon.PhotonImage.new_from_byteslice(Buffer.from(content.content, \"base64\")),\n catch: () => new DecodeError({ resource }),\n })\n try {\n const width = decoded.get_width()\n const height = decoded.get_height()\n const bytes = Buffer.byteLength(content.content, \"utf-8\")\n if (width <= limits.maxWidth && height <= limits.maxHeight && bytes <= limits.maxBase64Bytes) return content\n if (!limits.autoResize)\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n const scale = Math.min(1, limits.maxWidth / width, limits.maxHeight / height)\n const sizes = Array.from({ length: 32 }).reduce<Array<{ width: number; height: number }>>((acc) => {\n const previous = acc.at(-1) ?? {\n width: Math.max(1, Math.round(width * scale)),\n height: Math.max(1, Math.round(height * scale)),\n }\n const next =\n acc.length === 0\n ? previous\n : {\n width: previous.width === 1 ? 1 : Math.max(1, Math.floor(previous.width * 0.75)),\n height: previous.height === 1 ? 1 : Math.max(1, Math.floor(previous.height * 0.75)),\n }\n return acc.some((item) => item.width === next.width && item.height === next.height) ? acc : [...acc, next]\n }, [])\n for (const size of sizes) {\n const resized = photon.resize(decoded, size.width, size.height, photon.SamplingFilter.Lanczos3)\n try {\n const encoders: Array<readonly [mime: string, encode: () => Uint8Array]> = [\n [\"image/png\", () => resized.get_bytes()],\n ...JPEG_QUALITIES.map((quality) => [\"image/jpeg\", () => resized.get_bytes_jpeg(quality)] as const),\n ]\n for (const [mime, encode] of encoders) {\n const candidate = Buffer.from(encode()).toString(\"base64\")\n if (Buffer.byteLength(candidate, \"utf-8\") <= limits.maxBase64Bytes)\n return { ...content, content: candidate, encoding: \"base64\" as const, mime }\n }\n } finally {\n resized.free()\n }\n }\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n } finally {\n decoded.free()\n }\n })\n})\n" | ||
| ], | ||
| "mappings": ";6zBAGA,SAAe,SCDf,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,0CAC5E,EAAK,WAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF", | ||
| "debugId": "32F498F8C857F10E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/server-process.ts", "src/commands/handlers/serve.ts"], | ||
| "sourcesContent": [ | ||
| "export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service, type DiscoverOptions, type Info } from \"@opencode-ai/client/effect/service\"\nimport { LayerNode } from \"@opencode-ai/util/effect/layer-node\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"./version\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Logger, Option, Redacted, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { Updater } from \"./services/updater\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\n// The process effect lives until server shutdown; tracing it would parent every request to one process-lifetime trace.\nexport const run = Effect.fnUntraced(function* (options: Options) {\n return yield* processEffect(options).pipe(\n Effect.provide(Updater.layer),\n Effect.provide(\n LayerNode.compile(LayerNode.group([Global.node, AppProcess.node]), [\n [\n Global.node,\n Global.layerWith(process.env.OPENCODE_CONFIG_DIR ? { config: process.env.OPENCODE_CONFIG_DIR } : {}),\n ],\n ]),\n ),\n Effect.provide(NodeServices.layer),\n )\n})\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(Global.Path.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const hostname = options.hostname ?? config.hostname ?? \"127.0.0.1\"\n const port = options.port ?? config.port ?? (options.mode === \"service\" ? ServiceConfig.defaultPort() : undefined)\n if (\n serviceOptions !== undefined &&\n port !== undefined &&\n (yield* Service.incumbent({ ...serviceOptions, url: serviceURL(hostname, port) })) !== undefined\n )\n return\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const password =\n options.mode === \"service\"\n ? config.password || randomBytes(32).toString(\"base64url\")\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const server = yield* start(\n {\n app: {\n name: process.env.OPENCODE_CLIENT ?? \"cli\",\n version: OPENCODE_VERSION,\n channel: OPENCODE_CHANNEL,\n },\n hostname,\n port,\n password,\n simulation: truthy(process.env.OPENCODE_SIMULATE),\n database: {\n path:\n process.env.OPENCODE_DB ??\n ([\"latest\", \"beta\", \"prod\"].includes(OPENCODE_CHANNEL) ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"1\" ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"true\"\n ? \"opencode.db\"\n : `opencode-${OPENCODE_CHANNEL.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.db`),\n },\n models: {\n url: process.env.OPENCODE_MODELS_URL,\n file: process.env.OPENCODE_MODELS_PATH,\n fetch: !truthy(process.env.OPENCODE_DISABLE_MODELS_FETCH),\n },\n observability: {\n endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,\n headers: process.env.OTEL_EXPORTER_OTLP_HEADERS,\n },\n config: {\n directory: process.env.OPENCODE_CONFIG_DIR,\n project: !truthy(\n process.env.OPENCODE_CONFIG_PROJECT_DISABLE ?? process.env.OPENCODE_DISABLE_PROJECT_CONFIG,\n ),\n file: process.env.OPENCODE_CONFIG,\n content: process.env.OPENCODE_CONFIG_CONTENT,\n },\n windows: {\n gitbash: process.env.OPENCODE_GIT_BASH_PATH,\n },\n fs: {\n filewatcher: !truthy(\n process.env.OPENCODE_FILEWATCHER_DISABLE ?? process.env.OPENCODE_DISABLE_FILEWATCHER,\n ),\n fff:\n process.env.OPENCODE_DISABLE_FFF === undefined\n ? process.platform !== \"win32\"\n : !truthy(process.env.OPENCODE_DISABLE_FFF),\n },\n },\n serviceOptions === undefined\n ? undefined\n : {\n instanceID,\n onListen: (address, shutdown) =>\n Effect.gen(function* () {\n if (!config.password) yield* ServiceConfig.password(password)\n return yield* register(address, password, instanceID, serviceOptions.file, shutdown)\n }),\n },\n ).pipe(\n Effect.provide(Logger.layer([], { mergeWithExisting: false })),\n Effect.catch((error) => {\n if (serviceOptions === undefined || port === undefined || !addressInUse(error)) return Effect.fail(error)\n return recognizeIncumbent(serviceOptions, hostname, port).pipe(\n Effect.flatMap((found) =>\n found\n ? Effect.void\n : Effect.fail(\n new Error(\n `Managed service port ${port} on ${hostname} is already in use by another process. ` +\n \"Configure another port with `opencode service set port <port>` and start the service again.\",\n { cause: error },\n ),\n ),\n ),\n )\n }),\n )\n if (server === undefined) return\n const url = HttpServer.formatAddress(server.address)\n console.log(options.mode === \"stdio\" ? JSON.stringify({ url }) : `server listening on ${url}`)\n if (options.mode === \"default\" && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nconst register = Effect.fnUntraced(function* (\n address: HttpServer.Address,\n password: string,\n id: string,\n file: string,\n shutdown: Effect.Effect<void>,\n) {\n const fs = yield* FileSystem.FileSystem\n const temp = file + \".\" + id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(file), { recursive: true })\n const info = {\n id,\n version: OPENCODE_VERSION,\n url: HttpServer.formatAddress(address),\n pid: process.pid,\n password,\n }\n const encoded = yield* encodeInfo(info)\n const current = fs.readFileString(file).pipe(\n Effect.flatMap(decodeInfo),\n Effect.orElseSucceed(() => undefined),\n )\n const owns = (found: Info | undefined) =>\n found?.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n yield* fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, file)))\n yield* current.pipe(\n Effect.filterOrFail(owns),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.ignore,\n Effect.andThen(shutdown),\n Effect.forkScoped,\n )\n return current.pipe(\n Effect.flatMap((found) => (owns(found) ? fs.remove(file) : Effect.void)),\n Effect.ignore,\n )\n})\n\nconst recognizeIncumbent = Effect.fnUntraced(function* (options: DiscoverOptions, hostname: string, port: number) {\n const found = yield* Service.incumbent({ ...options, url: serviceURL(hostname, port) }).pipe(\n Effect.filterOrFail((value) => value !== undefined),\n Effect.retry(Schedule.spaced(\"100 millis\")),\n Effect.timeoutOption(\"15 seconds\"),\n )\n return Option.isSome(found)\n})\n\nfunction serviceURL(hostname: string, port: number) {\n return `http://${hostname.includes(\":\") ? `[${hostname}]` : hostname}:${port}`\n}\n\nfunction truthy(value?: string) {\n return value === \"1\" || value?.toLowerCase() === \"true\"\n}\n\nfunction addressInUse(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false\n if (\"code\" in error && error.code === \"EADDRINUSE\") return true\n return \"cause\" in error && addressInUse(error.cause)\n}\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n", | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerProcess } from \"../../server-process\"\n\nexport default Runtime.handler(\n Commands.commands.serve,\n Effect.fnUntraced(function* (input) {\n if (input.service && input.stdio) return yield* Effect.fail(new Error(\"--service and --stdio cannot be combined\"))\n return yield* ServerProcess.run({\n mode: input.service ? \"service\" : input.stdio ? \"stdio\" : \"default\",\n hostname: Option.getOrUndefined(input.hostname),\n port: Option.getOrUndefined(input.port),\n })\n }),\n)\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "69F71F63E2E7BD8264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/api.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nconst methods = new Set([\"delete\", \"get\", \"head\", \"options\", \"patch\", \"post\", \"put\"])\n\ntype Operation = {\n operationId?: string\n}\n\ntype OpenApi = {\n paths?: Record<string, Record<string, Operation>>\n}\n\nexport default Runtime.handler(\n Commands.commands.api,\n Effect.fn(\"cli.api\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n mismatch: \"ignore\",\n })\n const endpoint = server.endpoint\n const params = Option.getOrElse(input.param, () => ({}))\n const request = yield* resolveRequest(endpoint, input.request, params)\n const headers = new Headers(Service.headers(endpoint))\n for (const header of input.header) {\n const index = header.indexOf(\":\")\n if (index < 1) return yield* Effect.fail(new Error(`Invalid header, expected name:value: ${header}`))\n headers.set(header.slice(0, index).trim(), header.slice(index + 1).trim())\n }\n const body = Option.getOrUndefined(input.data)\n if (body !== undefined && !headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\")\n\n const response = yield* Effect.tryPromise(() =>\n fetch(new URL(request.path, endpoint.url), {\n method: request.method,\n headers,\n body,\n }),\n )\n const output = yield* Effect.promise(() => response.text())\n if (output) process.stdout.write(output + (output.endsWith(EOL) ? \"\" : EOL))\n }),\n)\n\nexport function resolveOperation(spec: OpenApi, operationID: string, params: Record<string, string>) {\n for (const [path, operations] of Object.entries(spec.paths ?? {})) {\n for (const [method, operation] of Object.entries(operations)) {\n if (!methods.has(method) || operation.operationId !== operationID) continue\n return { method: method.toUpperCase(), path: interpolate(path, params) }\n }\n }\n throw new Error(`Operation not found: ${operationID}`)\n}\n\nexport function rawRequest(input: readonly string[]) {\n if (input.length !== 2 || !methods.has(input[0].toLowerCase()) || !input[1].startsWith(\"/\")) return\n return { method: input[0].toUpperCase(), path: input[1] }\n}\n\nfunction resolveRequest(endpoint: Endpoint, input: readonly string[], params: Record<string, string>) {\n const raw = rawRequest(input)\n if (raw) return Effect.succeed(raw)\n if (input.length !== 1) return Effect.fail(new Error(\"Expected an operation name or an HTTP method and path\"))\n return Effect.tryPromise(async () => {\n const response = await fetch(new URL(\"/openapi.json\", endpoint.url), { headers: Service.headers(endpoint) })\n if (!response.ok) throw new Error(`Failed to load OpenAPI document: HTTP ${response.status}`)\n return resolveOperation((await response.json()) as OpenApi, input[0], params)\n })\n}\n\nfunction interpolate(path: string, params: Record<string, string>) {\n const used = new Set<string>()\n const pathname = path.replaceAll(/\\{([^}]+)\\}/g, (_, name: string) => {\n const value = params[name]\n if (value === undefined) throw new Error(`Missing path parameter: ${name}`)\n used.add(name)\n return encodeURIComponent(value)\n })\n const query = new URLSearchParams(Object.entries(params).filter(([name]) => !used.has(name))).toString()\n return query ? `${pathname}?${query}` : pathname\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "10280EA5ACB8F12E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/add.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, stat, writeFile } from \"node:fs/promises\"\nimport { Effect, Option } from \"effect\"\nimport { applyEdits, modify } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? global.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\nexport async function resolveConfigPath(directory: string) {\n const candidates = [\n path.join(directory, \"opencode.json\"),\n path.join(directory, \"opencode.jsonc\"),\n path.join(directory, \".opencode\", \"opencode.json\"),\n path.join(directory, \".opencode\", \"opencode.jsonc\"),\n ]\n for (const candidate of candidates) {\n if (\n await stat(candidate).then(\n (info) => info.isFile(),\n () => false,\n )\n )\n return candidate\n }\n return candidates[0]\n}\n\nasync function write(configPath: string, name: string, server: unknown) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const edits = modify(text, [\"mcp\", \"servers\", name], server, {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n })\n await writeFile(configPath, applyEdits(text, edits))\n}\n" | ||
| ], | ||
| "mappings": ";qrBAAA,mBAAS,gBACT,yBACA,wBAAS,eAAU,oBAAM,yBAOzB,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,SAC/B,OAAO,QAAG,aAAa,EAAE,SAAU,CAAC,EAAO,CACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,OAAS,QAAQ,IAAI,CAAC,CAAC,EAC9G,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAsB,CAAiB,CAAC,EAAmB,CACzD,IAAM,EAAa,CACjB,EAAK,KAAK,EAAW,eAAe,EACpC,EAAK,KAAK,EAAW,gBAAgB,EACrC,EAAK,KAAK,EAAW,YAAa,eAAe,EACjD,EAAK,KAAK,EAAW,YAAa,gBAAgB,CACpD,EACA,QAAW,KAAa,EACtB,GACE,MAAM,EAAK,CAAS,EAAE,KACpB,CAAC,IAAS,EAAK,OAAO,EACtB,IAAM,EACR,EAEA,OAAO,EAEX,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,EAAU,EAAY,EAAW,EAAM,CAAK,CAAC", | ||
| "debugId": "A266671956B7B9B464756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/run/run.ts", "src/run/noninteractive.ts", "src/run/ui.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient, type SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { parseSessionTargetModel, resolveSessionTarget } from \"../session-target\"\nimport { toolInlineInfo } from \"@opencode-ai/tui/mini/tool\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { UI } from \"./ui\"\n\nexport type RunCommandInput = {\n server: ServerConnection.Resolved\n message: string[]\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n format: \"default\" | \"json\"\n file: string[]\n title?: string\n thinking?: boolean\n auto?: boolean\n}\n\ntype FilePart = {\n url: string\n filename: string\n mime: string\n}\n\ntype Prepared = {\n directory?: string\n message: string\n files: FilePart[]\n}\n\ntype ExecutionOptions = {\n root?: string\n directory?: string\n useServerDirectory?: boolean\n variant?: string\n attached?: boolean\n compatibility?: \"v1\"\n}\n\nclass RunTargetError extends Error {\n constructor(\n message: string,\n readonly sessionID?: string,\n ) {\n super(message)\n }\n}\n\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return runNonInteractiveWithOptions(input, {})\n}\n\n/** @internal Used only by the V1 command boundary. */\nexport function runNonInteractiveWithOptions(input: RunCommandInput, options: ExecutionOptions) {\n return run(input, options).catch((error) => reportRunError(input, errorMessage(error)))\n}\n\nasync function run(input: RunCommandInput, options: ExecutionOptions) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = options.root ?? process.env.PWD ?? process.cwd()\n const local = localDirectory(root)\n const directory = options.useServerDirectory ? undefined : (options.directory ?? local)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await readStdin())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root, options)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint, options)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Endpoint, options: ExecutionOptions) {\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const explicit = parseRunModel(input.model)\n const target = await resolveSessionTarget({\n client,\n location: prepared.directory ? { directory: prepared.directory } : undefined,\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: explicit\n ? { providerID: explicit.model.providerID, id: explicit.model.modelID, variant: explicit.variant }\n : undefined,\n agent: input.agent,\n prepare: async (next) => {\n const selected =\n next.model ??\n (options.variant\n ? await client.model\n .default({ location: { directory: next.location.directory, workspace: next.location.workspaceID } })\n .then((result) => result.data)\n : undefined)\n const model = selected\n ? {\n providerID: selected.providerID,\n id: selected.id,\n variant: options.variant ?? (\"variant\" in selected ? selected.variant : undefined),\n }\n : undefined\n if ((options.variant ?? explicit?.variant) && !model)\n throw new RunTargetError(\"Cannot select a variant before selecting a model\", next.session?.id)\n return { model, agent: next.agent }\n },\n }).catch((error) => {\n if (!(error instanceof RunTargetError)) throw error\n reportRunError(input, error.message, error.sessionID)\n return undefined\n })\n if (!target) return\n const model = target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined\n const variant = target.model?.variant\n if (!target.resume && input.title !== undefined) {\n await client.session.rename({\n sessionID: target.session.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: target.session.id,\n location: target.location,\n message: prepared.message,\n files: prepared.files,\n agent: target.agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: options.attached ?? true,\n compatibility: options.compatibility,\n renderTool: (part) => renderTool(part, target.location.directory),\n renderToolError: (part) => renderToolError(part, target.location.directory),\n }).catch((error) => reportRunError(input, errorMessage(error), target.session.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n const ref = parseSessionTargetModel(value)\n if (!ref) return\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function prepareFile(input: string, directory: string, options: ExecutionOptions): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (options.compatibility === \"v1\" && options.attached && stat.isDirectory())\n fail(`Cannot attach local directory without a shared filesystem: ${input}`)\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\nfunction warning(message: string) {\n UI.println(UI.Style.TEXT_WARNING_BOLD + \"!\", UI.Style.TEXT_NORMAL, message)\n}\n\nfunction errorMessage(error: unknown) {\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\")\n return error.message\n return String(error)\n}\n\n/** @internal Used by the V1 command boundary before a Session exists. */\nexport function reportRunError(input: Pick<RunCommandInput, \"format\">, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n", | ||
| "import type {\n EventSubscribeOutput,\n JsonValue,\n LLMToolContent,\n LocationRef,\n OpenCodeClient,\n SessionMessageAssistantTool,\n SessionMessageInfo,\n} from \"@opencode-ai/client/promise\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { readFile } from \"node:fs/promises\"\nimport { toolOutputText, type MiniToolPart } from \"@opencode-ai/tui/mini/tool\"\nimport { UI } from \"./ui\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n location: LocationRef\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n compatibility?: \"v1\"\n renderTool: (part: SessionMessageAssistantTool) => Promise<void>\n renderToolError: (part: SessionMessageAssistantTool) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, JsonValue>\n raw?: string\n provider?: unknown\n providerState?: SessionMessageAssistantTool[\"providerState\"]\n structured: Record<string, JsonValue>\n content: LLMToolContent[]\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n const renderedText = new Map<string, string>()\n const renderedReasoning = new Map<string, string>()\n const renderedTools = new Set<string>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let v1InvalidOutput = false\n let prePromotionError: { message: string; [key: string]: unknown } | undefined\n let finalizing = false\n let admission: AbortController | undefined\n let pendingStep: { timestamp: number; part: Record<string, unknown>; label: string } | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const writeReasoning = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"reasoning\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) return void process.stdout.write(line + EOL)\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n }\n\n const flushStep = () => {\n if (!pendingStep) return\n const value = pendingStep\n pendingStep = undefined\n if (!emit(\"step_start\", value.timestamp, { part: value.part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(value.label)\n UI.empty()\n }\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n try {\n await input.client.form.cancel(\n { sessionID: request.sessionID, formID: request.id },\n ...formRequestOptions(request.sessionID === GLOBAL_FORM_SESSION_ID ? input.location : undefined),\n )\n } catch (error) {\n if (!formAlreadySettled(error)) throw error\n }\n formCancelled = true\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached &&\n event.data.form.sessionID === GLOBAL_FORM_SESSION_ID &&\n sameLocation(event.location, input.location)))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.input.promoted\") {\n if (event.data.inputID === messageID) {\n promoted = true\n prePromotionError = undefined\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted && event.type === \"session.execution.failed\") {\n prePromotionError = event.data.error\n if (finalizing) return\n continue\n }\n if (\n !promoted &&\n finalizing &&\n (event.type === \"session.execution.succeeded\" || event.type === \"session.execution.interrupted\")\n )\n return\n if (!promoted) continue\n if (finalizing && !event.type.startsWith(\"session.execution.\")) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (input.compatibility === \"v1\") {\n pendingStep = {\n timestamp: time,\n part,\n label: `> ${event.data.agent} · ${event.data.model.id}`,\n }\n continue\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n flushStep()\n starts.set(`text\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`text\\u0000${key}`)\n starts.delete(`text\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedText.set(key, event.data.text)\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(`reasoning\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`reasoning\\u0000${key}`)\n starts.delete(`reasoning\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedReasoning.set(key, event.data.text)\n writeReasoning(part, time)\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n flushStep()\n tools.set(toolKey(event.data.assistantMessageID, event.data.callID), {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n structured: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.input.delta\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) current.raw = (current.raw ?? \"\") + event.data.delta\n continue\n }\n if (event.type === \"session.tool.called\") {\n flushStep()\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key)\n tools.set(key, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n providerState: event.data.state,\n structured: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.progress\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) {\n current.structured = event.data.structured\n current.content = event.data.content\n }\n continue\n }\n if (event.type === \"session.tool.success\") {\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key) ?? fallbackTool(event)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.callID,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"completed\",\n input: current.input,\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: toolOutputText(current.tool, event.data.content),\n title: current.tool,\n metadata: {\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(tool)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key) ?? fallbackTool(event)\n const error = event.data.error.message\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.callID,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"error\",\n input: current.input,\n structured: current.structured,\n content: current.content,\n error: event.data.error,\n result: event.data.result,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) continue\n if (!emit(\"tool_use\", time, { part })) {\n if (toolOutputText(current.tool, current.content).trim())\n await input.renderTool({\n ...tool,\n state: {\n status: \"completed\",\n input: current.input,\n structured: current.structured,\n content: current.content,\n result: event.data.result,\n },\n })\n await input.renderToolError(tool)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n flushStep()\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (\n input.compatibility === \"v1\" &&\n event.data.error.message === \"Provider stream ended without a terminal finish event\"\n ) {\n pendingStep = undefined\n v1InvalidOutput = true\n continue\n }\n if (interrupted || permissionRejected || formCancelled) continue\n flushStep()\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (input.compatibility === \"v1\" && (v1InvalidOutput || permissionRejected || formCancelled)) return\n flushStep()\n if (!emittedError && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) return\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const projectedMessages = async () => {\n const messages: SessionMessageInfo[] = []\n let cursor: string | undefined\n while (true) {\n const page = await input.client.message.list(\n cursor\n ? { sessionID: input.sessionID, limit: 200, cursor }\n : { sessionID: input.sessionID, limit: 200, order: \"desc\" },\n )\n for (const message of page.data) {\n if (message.id === messageID) return { found: true, messages: messages.toReversed() }\n messages.push(message)\n }\n cursor = page.cursor.next ?? undefined\n if (!cursor) return { found: false, messages: [] }\n }\n }\n\n const reconcile = async () => {\n const projected = await projectedMessages()\n for (const message of projected.messages) {\n if (message.type !== \"assistant\") continue\n const timestamp = message.time.completed ?? message.time.created\n let textOrdinal = 0\n let reasoningOrdinal = 0\n for (const item of message.content) {\n if (item.type === \"text\") {\n const ordinal = textOrdinal++\n const key = contentKey(message.id, ordinal)\n const rendered = renderedText.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n writeText(\n {\n id: projectedPartID(message.id, `text-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"text\",\n text,\n time: { start: message.time.created, end: timestamp },\n },\n timestamp,\n )\n renderedText.set(key, item.text)\n continue\n }\n if (item.type === \"reasoning\") {\n const ordinal = reasoningOrdinal++\n if (!input.thinking) continue\n const key = contentKey(message.id, ordinal)\n const rendered = renderedReasoning.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n const part = {\n id: projectedPartID(message.id, `reasoning-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"reasoning\",\n text,\n metadata: item.state,\n time: { start: message.time.created, end: timestamp },\n }\n renderedReasoning.set(key, item.text)\n writeReasoning(part, timestamp)\n continue\n }\n\n const key = toolKey(message.id, item.id)\n if (renderedTools.has(key) || item.state.status === \"streaming\" || item.state.status === \"running\") continue\n const part: MiniToolPart = {\n id: projectedPartID(message.id, `tool-${item.id}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"tool\",\n callID: item.id,\n tool: item.name,\n state:\n item.state.status === \"completed\"\n ? {\n status: \"completed\",\n input: item.state.input,\n output: toolOutputText(item.name, item.state.content),\n title: item.name,\n metadata: { structured: item.state.structured, content: item.state.content, result: item.state.result },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n }\n : {\n status: \"error\",\n input: item.state.input,\n error: item.state.error.message,\n metadata: { structured: item.state.structured, content: item.state.content, result: item.state.result },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n },\n }\n renderedTools.add(key)\n if (emit(\"tool_use\", timestamp, { part })) continue\n if (item.state.status === \"completed\") {\n await input.renderTool(item)\n continue\n }\n if (toolOutputText(item.name, item.state.content).trim()) {\n await input.renderTool({ ...item, state: { ...item.state, status: \"completed\" } })\n }\n await input.renderToolError(item)\n UI.error(item.state.error.message)\n }\n\n if (message.error && !emittedError) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", timestamp, { error: message.error })) UI.error(message.error.message)\n }\n }\n return {\n found: projected.found,\n responded: projected.messages.some((message) => message.type === \"assistant\"),\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, forms, globals] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.form.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.attached\n ? Promise.resolve(undefined)\n : input.client.form.request\n .list({\n location: { directory: input.location.directory, workspace: input.location.workspaceID },\n })\n .catch(() => undefined),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(forms ?? []).map(cancelForm),\n ...(globals && sameLocation(globals.location, input.location)\n ? globals.data.filter((form) => form.sessionID === GLOBAL_FORM_SESSION_ID).map(cancelForm)\n : []),\n ])\n if (input.compatibility === \"v1\") {\n await completed\n return\n }\n\n const waiting = input.client.session.wait({ sessionID: input.sessionID })\n await Promise.race([waiting, completed.then(() => waiting)])\n finalizing = true\n const projected = await reconcile()\n if (\n !projected.responded &&\n !interrupted &&\n !permissionRejected &&\n !formCancelled &&\n !emittedError &&\n !prePromotionError\n ) {\n await completed\n }\n if (!projected.found && !interrupted && !permissionRejected && !formCancelled && !emittedError) {\n const error = prePromotionError ?? { type: \"unknown\", message: \"Prompt was not promoted\" }\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", Date.now(), { error })) UI.error(error.message)\n }\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n if (input.compatibility === \"v1\") await stream.return?.(undefined).catch(() => {})\n else void stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction sameLocation(left: LocationRef | undefined, right: LocationRef) {\n return !!left && left.directory === right.directory && left.workspaceID === right.workspaceID\n}\n\nfunction formRequestOptions(location: LocationRef | undefined): [] | [{ headers: Record<string, string> }] {\n if (!location) return []\n return [\n {\n headers: {\n \"x-opencode-directory\": encodeURIComponent(location.directory),\n ...(location.workspaceID ? { \"x-opencode-workspace\": location.workspaceID } : {}),\n },\n },\n ]\n}\n\nfunction formAlreadySettled(error: unknown) {\n return !!error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"FormAlreadySettledError\"\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction toolKey(messageID: string, callID: string) {\n return `${messageID}\\u0000${callID}`\n}\n\nfunction contentKey(messageID: string, ordinal: number) {\n return `${messageID}\\u0000${ordinal}`\n}\n\nfunction projectedPartID(messageID: string, part: string) {\n return `prt_${messageID.replace(/^msg_/, \"\")}_${part}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; callID: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n structured: {},\n content: [],\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${(await readFile(new URL(file.url))).toString(\"base64\")}`\n return { attachment: { uri, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await readFile(new URL(file.url), \"utf8\")\n return { text: `<file name=\"${file.filename}\">\\n${content}\\n</file>` }\n}\n", | ||
| "import { EOL } from \"node:os\"\n\nexport const Style = {\n TEXT_DIM: \"\\x1b[90m\",\n TEXT_NORMAL: \"\\x1b[0m\",\n TEXT_WARNING_BOLD: \"\\x1b[93m\\x1b[1m\",\n TEXT_DANGER_BOLD: \"\\x1b[91m\\x1b[1m\",\n}\n\nexport function println(...message: string[]) {\n process.stderr.write(message.join(\" \") + EOL)\n}\n\nlet blank = false\n\nexport function empty() {\n if (blank) return\n println(Style.TEXT_NORMAL)\n blank = true\n}\n\nexport function error(message: string) {\n if (message.startsWith(\"Error: \")) message = message.slice(\"Error: \".length)\n println(Style.TEXT_DANGER_BOLD + \"Error: \" + Style.TEXT_NORMAL + message)\n}\n\nexport * as UI from \"./ui\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "1B6E094B9C9E13A564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/debug/agents.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.agents,\n Effect.fn(\"cli.debug.agents\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";83BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC1G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzD,KACA,CACF,EAAI,CACN,EACD,CACH", | ||
| "debugId": "A7C647FE3BB2567964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/connect.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type IntegrationCommandStatusOutput, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.connect,\n Effect.fn(\"cli.auth.connect\")(function* (input) {\n process.stdout.write(\"Connecting...\" + EOL + EOL)\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n yield* request(() => client.integration.wellknown.add({ url: input.url, location }))\n const integrationID = input.url.replace(/\\/+$/, \"\")\n const started = yield* request(() =>\n client.integration.command.connect({ integrationID, methodID: \"login\", location }),\n )\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.command.cancel({ integrationID, attemptID: started.data.attemptID, location }),\n ).pipe(Effect.ignore),\n )\n\n const status = yield* wait(client, integrationID, started.data.attemptID)\n if (status.status === \"failed\") return yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") return yield* Effect.fail(new Error(\"Authentication expired\"))\n process.stdout.write(\"Connected\" + EOL)\n }),\n)\n\nconst wait = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n shown = false,\n): Effect.Effect<Exclude<IntegrationCommandStatusOutput[\"data\"], { status: \"pending\" }>, unknown> =>\n Effect.gen(function* () {\n const response = yield* request(() => client.integration.command.status({ integrationID, attemptID, location }))\n if (response.data.status !== \"pending\") return response.data\n const output = response.data.message?.trim()\n if (!shown && output) process.stdout.write(output + EOL + EOL)\n yield* Effect.sleep(500)\n return yield* wait(client, integrationID, attemptID, shown || !!output)\n })\n\nfunction request<A>(task: () => Promise<A>) {\n return Effect.tryPromise({ try: task, catch: (cause) => cause })\n}\n" | ||
| ], | ||
| "mappings": ";83BAAA,mBAAS,gBAQT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,UAAK,cAAS,aAChC,OAAO,QAAG,uBAAkB,OAAE,cAAU,MAAC,EAAO,CAC9C,QAAQ,OAAO,MAAM,gBAAkB,EAAM,CAAG,EAChD,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAC1F,MAAO,EAAQ,IAAM,EAAO,YAAY,UAAU,IAAI,CAAE,IAAK,EAAM,IAAK,UAAS,CAAC,CAAC,EACnF,IAAM,EAAgB,EAAM,IAAI,QAAQ,OAAQ,EAAE,EAC5C,EAAU,MAAO,EAAQ,IAC7B,EAAO,YAAY,QAAQ,QAAQ,CAAE,gBAAe,SAAU,QAAS,UAAS,CAAC,CACnF,EACA,MAAO,EAAO,aAAa,IACzB,EAAQ,IACN,EAAO,YAAY,QAAQ,OAAO,CAAE,gBAAe,UAAW,EAAQ,KAAK,UAAW,UAAS,CAAC,CAClG,EAAE,KAAK,EAAO,MAAM,CACtB,EAEA,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAe,EAAQ,KAAK,SAAS,EACxE,GAAI,EAAO,SAAW,SAAU,OAAO,MAAO,EAAO,KAAS,MAAM,EAAO,OAAO,CAAC,EACnF,GAAI,EAAO,SAAW,UAAW,OAAO,MAAO,EAAO,KAAS,MAAM,wBAAwB,CAAC,EAC9F,QAAQ,OAAO,MAAM,YAAc,CAAG,EACvC,CACH,EAEM,EAAO,CACX,EACA,EACA,EACA,EAAQ,KAER,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAW,MAAO,EAAQ,IAAM,EAAO,YAAY,QAAQ,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CAAC,EAC/G,GAAI,EAAS,KAAK,SAAW,UAAW,OAAO,EAAS,KACxD,IAAM,EAAS,EAAS,KAAK,SAAS,KAAK,EAC3C,GAAI,CAAC,GAAS,EAAQ,QAAQ,OAAO,MAAM,EAAS,EAAM,CAAG,EAE7D,OADA,MAAO,EAAO,MAAM,GAAG,EAChB,MAAO,EAAK,EAAQ,EAAe,EAAW,GAAS,CAAC,CAAC,CAAM,EACvE,EAEH,SAAS,CAAU,CAAC,EAAwB,CAC1C,OAAO,EAAO,WAAW,CAAE,IAAK,EAAM,MAAO,CAAC,IAAU,CAAM,CAAC", | ||
| "debugId": "38039D5DBB286AAA64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/start.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.start,\n Effect.fn(\"cli.service.start\")(function* () {\n const transport = yield* Service.ensure(yield* ServiceConfig.options())\n process.stdout.write(transport.url + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+0BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,MAC1C,SAAM,OAAY,WAAO,OAAQ,YAAO,MAAO,EAAc,QAAQ,CAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "9ACC856DE1AF0E2064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/demo.ts"], | ||
| "sourcesContent": [ | ||
| "// Demo mode for testing direct interactive mode without a real SDK.\n//\n// Enabled with `--demo`. Intercepts prompt submissions and drives the same\n// presentation commits and footer actions as the live transport. This\n// lets you test scrollback formatting, permission UI, canonical Form UI, and tool\n// snapshots without making actual model calls. Pass a demo slash command as\n// the initial interactive message to trigger a preview immediately.\n//\n// Slash commands:\n// /permission [kind] → triggers a permission request variant\n// /form [kind] → triggers a canonical Form request variant\n// /fmt <kind> → emits a specific tool/text type (text, reasoning, shell,\n// write, edit, patch, subagent, question, error, mix)\n//\n// Demo mode handles permission and Form replies locally, completing or failing\n// the synthetic tool parts through the same callbacks used by the live footer.\nimport path from \"path\"\nimport type { JsonValue, SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { parseSlashHead } from \"../prompt/parse\"\nimport { writeSessionOutput } from \"./stream\"\nimport { toolCommit, toolFinalPhase } from \"./stream-v2.subagent\"\nimport type {\n FooterApi,\n FooterView,\n FormCancel,\n FormReply,\n MiniFormRequest,\n MiniPermissionRequest,\n PermissionReply,\n RunPrompt,\n StreamCommit,\n} from \"./types\"\n\nconst KINDS = [\n \"markdown\",\n \"table\",\n \"text\",\n \"reasoning\",\n \"shell\",\n \"write\",\n \"edit\",\n \"patch\",\n \"subagent\",\n \"question\",\n \"error\",\n \"mix\",\n]\nconst PERMISSIONS = [\"edit\", \"shell\", \"read\", \"subagent\", \"external\", \"doom\"] as const\nconst FORMS = [\"question\", \"external\"] as const\n\ntype PermissionKind = (typeof PERMISSIONS)[number]\ntype FormKind = (typeof FORMS)[number]\n\nfunction permissionKind(value: string | undefined): PermissionKind | undefined {\n const next = (value || \"edit\").toLowerCase()\n return PERMISSIONS.find((item) => item === next)\n}\n\nfunction formKind(value: string | undefined): FormKind | undefined {\n const next = (value || \"question\").toLowerCase()\n return FORMS.find((item) => item === next)\n}\n\nconst SAMPLE_MARKDOWN = [\n \"# Direct Mode Demo\",\n \"\",\n \"This is a realistic assistant response for direct-mode formatting checks.\",\n \"It mixes **bold**, _italic_, `inline code`, links, code fences, and tables in one streamed reply.\",\n \"\",\n \"## Summary\",\n \"\",\n \"- Restored the final markdown flush so the last block is committed on idle.\",\n \"- Switched markdown scrollback commits back to top-level block boundaries.\",\n \"- Added footer-level regression coverage for split-footer rendering.\",\n \"\",\n \"## Status\",\n \"\",\n \"| Area | Before | After | Notes |\",\n \"| --- | --- | --- | --- |\",\n \"| Direct mode | Missing final rows | Stable | Final markdown block now flushes on idle |\",\n \"| Tables | Dropped in streaming mode | Visible | Block-based commits match the working OpenTUI demo |\",\n \"| Tests | Partial coverage | Broader coverage | Includes a footer-level split render capture |\",\n \"\",\n \"> This sample intentionally includes a wide table so you can spot wrapping and commit bugs quickly.\",\n \"\",\n \"```ts\",\n \"const result = { markdown: true, tables: 2, stable: true }\",\n \"```\",\n \"\",\n \"## Files\",\n \"\",\n \"| File | Change |\",\n \"| --- | --- |\",\n \"| `scrollback.surface.ts` | Align markdown commit logic with the split-footer demo |\",\n \"| `footer.ts` | Keep active surfaces across footer-height-only resizes |\",\n \"| `footer.test.ts` | Capture real split-footer markdown payloads during idle completion |\",\n \"\",\n \"Next step: run `/fmt table` if you want a tighter table-only sample.\",\n].join(\"\\n\")\n\nconst SAMPLE_TABLE = [\n \"# Table Sample\",\n \"\",\n \"| Kind | Example | Notes |\",\n \"| --- | --- | --- |\",\n \"| Pipe | `A\\\\|B` | Escaped pipes should stay in one cell |\",\n \"| Unicode | `漢字` | Wide characters should remain aligned |\",\n \"| Wrap | `LongTokenWithoutNaturalBreaks_1234567890` | Useful for width stress |\",\n \"| Status | done | Final row should still appear after idle |\",\n].join(\"\\n\")\n\ntype Ref = {\n msg: string\n call: string\n tool: string\n input: Record<string, JsonValue>\n start: number\n}\n\ntype FormRequest = {\n ref: Ref\n kind: FormKind\n request: MiniFormRequest\n}\n\ntype Perm = {\n ref: Ref\n done: {\n output: string\n metadata?: Record<string, JsonValue>\n }\n}\n\ntype Permit = {\n ref: Ref\n permission: string\n patterns: string[]\n metadata?: MiniPermissionRequest[\"metadata\"]\n always: string[]\n done: Perm[\"done\"]\n}\n\ntype State = {\n id: string\n thinking: boolean\n footer: FooterApi\n msg: number\n part: number\n call: number\n perm: number\n form: number\n perms: Map<string, Perm>\n forms: Map<string, FormRequest>\n started: Set<string>\n}\n\ntype Input = {\n sessionID: string\n thinking: boolean\n footer: FooterApi\n}\n\nfunction note(footer: FooterApi, text: string): void {\n footer.append({\n kind: \"system\",\n text,\n phase: \"start\",\n source: \"system\",\n })\n}\n\nfunction clearSubagent(footer: FooterApi): void {\n footer.event({\n type: \"stream.subagent\",\n state: {\n tabs: [],\n details: {},\n permissions: [],\n forms: [],\n },\n })\n}\n\nfunction showSubagent(\n state: State,\n input: {\n sessionID: string\n label: string\n description: string\n status: \"running\" | \"completed\" | \"cancelled\" | \"error\"\n title?: string\n commits: StreamCommit[]\n },\n) {\n state.footer.event({\n type: \"stream.subagent\",\n state: {\n tabs: [\n {\n sessionID: input.sessionID,\n label: input.label,\n description: input.description,\n status: input.status,\n title: input.title,\n },\n ],\n details: {\n [input.sessionID]: {\n commits: input.commits,\n },\n },\n permissions: [],\n forms: [],\n },\n })\n}\n\nfunction wait(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (!signal) {\n setTimeout(resolve, ms)\n return\n }\n\n if (signal.aborted) {\n resolve()\n return\n }\n\n const done = () => {\n clearTimeout(timer)\n signal.removeEventListener(\"abort\", done)\n resolve()\n }\n\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", done)\n resolve()\n }, ms)\n\n signal.addEventListener(\"abort\", done, { once: true })\n })\n}\n\nfunction split(text: string): string[] {\n if (text.length <= 48) {\n return [text]\n }\n\n const size = Math.ceil(text.length / 3)\n return [text.slice(0, size), text.slice(size, size * 2), text.slice(size * 2)]\n}\n\nfunction take(state: State, key: \"msg\" | \"part\" | \"call\" | \"perm\", prefix: string): string {\n state[key] += 1\n return `demo_${prefix}_${state[key]}`\n}\n\nfunction present(state: State, commits: StreamCommit[], view?: FooterView): void {\n writeSessionOutput(\n { footer: state.footer },\n {\n commits,\n updates: view\n ? [\n {\n type: \"stream.patch\" as const,\n patch: { status: view.type === \"permission\" ? \"awaiting permission\" : \"awaiting form\" },\n },\n { type: \"stream.view\" as const, view },\n ]\n : undefined,\n },\n )\n}\n\nfunction clearBlocker(state: State): void {\n writeSessionOutput(\n { footer: state.footer },\n {\n commits: [],\n updates: [\n { type: \"stream.patch\", patch: { status: \"\" } },\n { type: \"stream.view\", view: { type: \"prompt\" } },\n ],\n },\n )\n}\n\nfunction open(state: State): string {\n return take(state, \"msg\", \"msg\")\n}\n\nasync function emitText(state: State, body: string, signal?: AbortSignal): Promise<void> {\n const msg = open(state)\n const part = take(state, \"part\", \"part\")\n for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n present(state, [\n { kind: \"assistant\", source: \"assistant\", text: item, phase: \"progress\", messageID: msg, partID: part },\n ])\n await wait(45, signal)\n }\n}\n\nasync function emitReasoning(state: State, body: string, signal?: AbortSignal): Promise<void> {\n const msg = open(state)\n const part = take(state, \"part\", \"part\")\n let first = true\n for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n if (state.thinking) {\n present(state, [\n {\n kind: \"reasoning\",\n source: \"reasoning\",\n text: first ? `Thinking: ${item.replace(/\\[REDACTED\\]/g, \"\")}` : item.replace(/\\[REDACTED\\]/g, \"\"),\n phase: \"progress\",\n messageID: msg,\n partID: part,\n },\n ])\n first = false\n }\n await wait(45, signal)\n }\n}\n\nfunction make(state: State, tool: string, input: Record<string, JsonValue>): Ref {\n return {\n msg: open(state),\n call: take(state, \"call\", \"call\"),\n tool,\n input,\n start: Date.now(),\n }\n}\n\nfunction startTool(state: State, ref: Ref, structured: Record<string, JsonValue> = {}): SessionMessageAssistantTool {\n state.started.add(ref.call)\n const part = {\n type: \"tool\" as const,\n id: ref.call,\n name: ref.tool,\n state: { status: \"running\" as const, input: ref.input, structured, content: [] },\n time: { created: ref.start, ran: ref.start },\n }\n present(state, [toolCommit(part, ref.msg, \"start\")])\n return part\n}\n\nfunction askPermission(state: State, item: Permit): void {\n const tool = startTool(state, item.ref)\n\n const id = take(state, \"perm\", \"perm\")\n state.perms.set(id, {\n ref: item.ref,\n done: item.done,\n })\n\n present(state, [], {\n type: \"permission\",\n request: {\n id,\n sessionID: state.id,\n action: item.permission,\n resources: item.patterns,\n metadata: item.metadata ?? {},\n save: item.always,\n source: { type: \"tool\", messageID: item.ref.msg, callID: item.ref.call },\n tool,\n },\n })\n}\n\nfunction doneTool(\n state: State,\n ref: Ref,\n output: {\n output: string\n metadata?: Record<string, JsonValue>\n },\n): void {\n if (!state.started.has(ref.call)) startTool(state, ref)\n const part: SessionMessageAssistantTool = {\n type: \"tool\",\n id: ref.call,\n name: ref.tool,\n state: {\n status: \"completed\",\n input: ref.input,\n content: output.output ? [{ type: \"text\", text: output.output }] : [],\n structured: output.metadata ?? {},\n },\n time: { created: ref.start, ran: ref.start, completed: Date.now() },\n }\n present(state, [toolCommit(part, ref.msg, toolFinalPhase(part))])\n}\n\nfunction failTool(state: State, ref: Ref, error: string): void {\n if (!state.started.has(ref.call)) startTool(state, ref)\n present(state, [\n toolCommit(\n {\n type: \"tool\",\n id: ref.call,\n name: ref.tool,\n state: {\n status: \"error\",\n input: ref.input,\n error: { type: \"unknown\", message: error },\n structured: {},\n content: [],\n },\n time: { created: ref.start, ran: ref.start, completed: Date.now() },\n },\n ref.msg,\n \"final\",\n ),\n ])\n}\n\nfunction emitError(state: State, text: string): void {\n present(state, [{ kind: \"error\", source: \"system\", text, phase: \"start\" }])\n}\n\nasync function emitBash(state: State, signal?: AbortSignal): Promise<void> {\n const ref = make(state, \"shell\", {\n command: \"git status\",\n workdir: process.cwd(),\n description: \"Show git status\",\n })\n startTool(state, ref)\n await wait(70, signal)\n doneTool(state, ref, {\n output: `${process.cwd()}\\ngit status\\nOn branch demo\\nnothing to commit, working tree clean\\n`,\n metadata: {\n exit: 0,\n },\n })\n}\n\nfunction emitWrite(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"write\", {\n path: file,\n content: \"export const demo = 42\\n\",\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {},\n })\n}\n\nfunction emitEdit(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"edit\", {\n path: file,\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n files: [\n {\n file,\n status: \"modified\",\n patch: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n },\n ],\n },\n })\n}\n\nfunction emitPatch(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"patch\", {\n patchText: \"*** Begin Patch\\n*** End Patch\",\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n files: [\n {\n status: \"modified\",\n file,\n patch: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n deletions: 1,\n },\n {\n status: \"added\",\n file: path.join(process.cwd(), \"README-demo.md\"),\n patch: \"@@ -0,0 +1,4 @@\\n+# Demo\\n+This is a generated preview file.\\n\",\n deletions: 0,\n },\n ],\n },\n })\n}\n\nfunction emitTask(state: State): void {\n const ref = make(state, \"subagent\", {\n description: \"Scan run/* for reducer touchpoints\",\n agent: \"explore\",\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n sessionID: \"ses_demo_child\",\n status: \"completed\",\n output: \"\",\n },\n })\n const part = {\n type: \"tool\",\n id: \"sub_demo_call_1\",\n name: \"read\",\n state: {\n status: \"running\",\n input: {\n path: \"packages/tui/src/mini/stream.ts\",\n offset: 1,\n limit: 200,\n },\n structured: {},\n content: [],\n },\n time: { created: Date.now(), ran: Date.now() },\n } satisfies SessionMessageAssistantTool\n showSubagent(state, {\n sessionID: \"ses_demo_child\",\n label: \"Explore\",\n description: \"Scan run/* for reducer touchpoints\",\n status: \"completed\",\n title: \"Reducer touchpoints found\",\n commits: [\n {\n kind: \"user\",\n text: \"Scan run/* for reducer touchpoints\",\n phase: \"start\",\n source: \"system\",\n },\n {\n kind: \"reasoning\",\n text: \"Thinking: tracing reducer and footer boundaries\",\n phase: \"progress\",\n source: \"reasoning\",\n messageID: \"sub_demo_msg_reasoning\",\n partID: \"sub_demo_reasoning_1\",\n },\n toolCommit(part, \"sub_demo_msg_tool\", \"start\"),\n {\n kind: \"assistant\",\n text: \"Footer updates flow through stream.ts into RunFooter\",\n phase: \"progress\",\n source: \"assistant\",\n messageID: \"sub_demo_msg_text\",\n partID: \"sub_demo_text_1\",\n },\n ],\n })\n}\n\nfunction emitQuestionTool(state: State): void {\n const ref = make(state, \"question\", {\n questions: [\n {\n header: \"Style\",\n question: \"Which output style do you want to inspect?\",\n options: [\n { label: \"Diff\", description: \"Show diff block\" },\n { label: \"Code\", description: \"Show code block\" },\n ],\n multiple: false,\n custom: false,\n },\n {\n header: \"Extras\",\n question: \"Pick extra rows\",\n options: [\n { label: \"Usage\", description: \"Add usage row\" },\n { label: \"Duration\", description: \"Add duration row\" },\n ],\n multiple: true,\n custom: true,\n },\n ],\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n answers: [[\"Diff\"], [\"Usage\", \"custom-note\"]],\n },\n })\n}\n\nfunction emitPermission(state: State, kind: PermissionKind = \"edit\"): void {\n const root = process.cwd()\n const file = path.join(root, \"src\", \"demo-format.ts\")\n\n if (kind === \"shell\") {\n const command = \"git status --short\"\n const ref = make(state, \"shell\", {\n command,\n workdir: root,\n description: \"Inspect worktree changes\",\n })\n askPermission(state, {\n ref,\n permission: \"shell\",\n patterns: [command],\n always: [\"*\"],\n done: {\n output: `${root}\\ngit status --short\\n M src/demo-format.ts\\n?? src/demo-permission.ts\\n`,\n metadata: {\n exit: 0,\n },\n },\n })\n return\n }\n\n if (kind === \"read\") {\n const target = path.join(root, \"package.json\")\n const ref = make(state, \"read\", {\n path: target,\n offset: 1,\n limit: 80,\n })\n askPermission(state, {\n ref,\n permission: \"read\",\n patterns: [target],\n always: [target],\n done: {\n output: [\"1: {\", '2: \"name\": \"opencode\",', '3: \"private\": true', \"4: }\"].join(\"\\n\"),\n metadata: {},\n },\n })\n return\n }\n\n if (kind === \"subagent\") {\n const ref = make(state, \"subagent\", {\n description: \"Inspect footer spacing across direct-mode prompts\",\n agent: \"explore\",\n })\n askPermission(state, {\n ref,\n permission: \"subagent\",\n patterns: [\"explore\"],\n always: [\"*\"],\n done: {\n output: \"\",\n metadata: {\n sessionID: \"sub_demo_perm_1\",\n status: \"completed\",\n output: \"\",\n },\n },\n })\n return\n }\n\n if (kind === \"external\") {\n const dir = path.join(path.dirname(root), \"demo-shared\")\n const target = path.join(dir, \"README.md\")\n const ref = make(state, \"read\", {\n path: target,\n offset: 1,\n limit: 40,\n })\n askPermission(state, {\n ref,\n permission: \"external_directory\",\n patterns: [`${dir}/**`],\n metadata: {\n parentDir: dir,\n filepath: target,\n },\n always: [`${dir}/**`],\n done: {\n output: `1: # External demo\\n2: Shared preview file\\nPath: ${target}`,\n metadata: {},\n },\n })\n return\n }\n\n if (kind === \"doom\") {\n const ref = make(state, \"subagent\", {\n description: \"Retry the formatter after repeated failures\",\n agent: \"general\",\n })\n askPermission(state, {\n ref,\n permission: \"doom_loop\",\n patterns: [\"*\"],\n always: [\"*\"],\n done: {\n output: \"Continuing after repeated failures.\\n\",\n metadata: {},\n },\n })\n return\n }\n\n const diff = \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\"\n const ref = make(state, \"edit\", {\n path: file,\n })\n askPermission(state, {\n ref,\n permission: \"edit\",\n patterns: [file],\n always: [file],\n done: {\n output: \"\",\n metadata: {\n files: [{ file, status: \"modified\", patch: diff }],\n },\n },\n })\n}\n\nfunction demoForm(kind: FormKind): { title: string; fields: MiniFormRequest[\"fields\"]; questions?: JsonValue[] } {\n if (kind === \"question\") {\n const questions: JsonValue[] = [\n {\n header: \"Layout\",\n question: \"Which footer view should be the reference for spacing checks?\",\n options: [\n { label: \"Form\", description: \"Inspect the canonical Form footer\" },\n { label: \"Prompt\", description: \"Return to the normal composer\" },\n ],\n multiple: false,\n custom: true,\n },\n {\n header: \"Checks\",\n question: \"Pick formatting previews\",\n options: [\n { label: \"Diff\", description: \"Emit an edit diff\" },\n { label: \"Subagent\", description: \"Emit a subagent card\" },\n ],\n multiple: true,\n custom: true,\n },\n ]\n return {\n title: \"Questions\",\n questions,\n fields: [\n {\n key: \"q0\",\n title: \"Layout\",\n description: \"Which footer view should be the reference for spacing checks?\",\n type: \"string\",\n options: [\n { value: \"Form\", label: \"Form\", description: \"Inspect the canonical Form footer\" },\n { value: \"Prompt\", label: \"Prompt\", description: \"Return to the normal composer\" },\n ],\n custom: true,\n },\n {\n key: \"q1\",\n title: \"Checks\",\n description: \"Pick formatting previews\",\n type: \"multiselect\",\n options: [\n { value: \"Diff\", label: \"Diff\", description: \"Emit an edit diff\" },\n { value: \"Subagent\", label: \"Subagent\", description: \"Emit a subagent card\" },\n ],\n custom: true,\n },\n ],\n }\n }\n return {\n title: \"MCP authorization\",\n fields: [\n {\n key: \"authorization\",\n type: \"external\",\n url: \"https://example.com/opencode-demo\",\n title: \"Authorize demo MCP server\",\n description: \"Complete authorization in your browser\",\n },\n ],\n }\n}\n\nfunction emitForm(state: State, kind: FormKind = \"question\"): void {\n const form = demoForm(kind)\n const ref = make(state, kind === \"question\" ? \"question\" : \"mcp_demo\", {\n ...(form.questions ? { questions: form.questions } : { form: kind }),\n })\n startTool(state, ref)\n state.form++\n const request: MiniFormRequest = {\n id: `frm_demo_${state.form}`,\n sessionID: state.id,\n title: form.title,\n metadata:\n kind === \"question\"\n ? { kind: \"question\", tool: { messageID: ref.msg, callID: ref.call } }\n : { kind: \"mcp\", message: `Synthetic ${kind} MCP elicitation` },\n fields: form.fields,\n }\n state.forms.set(request.id, { ref, kind, request })\n present(state, [], { type: \"form\", request })\n}\n\nasync function emitFmt(state: State, kind: string, body: string, signal?: AbortSignal): Promise<boolean> {\n if (kind === \"text\") {\n await emitText(state, body || SAMPLE_MARKDOWN, signal)\n return true\n }\n\n if (kind === \"markdown\" || kind === \"md\") {\n await emitText(state, body || SAMPLE_MARKDOWN, signal)\n return true\n }\n\n if (kind === \"table\") {\n await emitText(state, body || SAMPLE_TABLE, signal)\n return true\n }\n\n if (kind === \"reasoning\") {\n await emitReasoning(state, body || \"Planning next steps [REDACTED] while preserving reducer ordering.\", signal)\n return true\n }\n\n if (kind === \"shell\") {\n await emitBash(state, signal)\n return true\n }\n\n if (kind === \"write\") {\n emitWrite(state)\n return true\n }\n\n if (kind === \"edit\") {\n emitEdit(state)\n return true\n }\n\n if (kind === \"patch\") {\n emitPatch(state)\n return true\n }\n\n if (kind === \"subagent\") {\n emitTask(state)\n return true\n }\n\n if (kind === \"question\") {\n emitQuestionTool(state)\n return true\n }\n\n if (kind === \"error\") {\n emitError(state, body || \"demo error event\")\n return true\n }\n\n if (kind === \"mix\") {\n await emitText(state, SAMPLE_MARKDOWN, signal)\n await wait(50, signal)\n await emitReasoning(state, \"Thinking through formatter edge cases [REDACTED].\", signal)\n await wait(50, signal)\n await emitBash(state, signal)\n emitWrite(state)\n emitEdit(state)\n emitPatch(state)\n emitTask(state)\n emitQuestionTool(state)\n emitError(state, \"demo mixed scenario error\")\n return true\n }\n\n return false\n}\n\nfunction intro(state: State): void {\n note(\n state.footer,\n [\n \"Demo slash commands enabled for interactive mode.\",\n `- /permission [kind] (${PERMISSIONS.join(\", \")})`,\n `- /form [kind] (${FORMS.join(\", \")})`,\n `- /fmt <kind> (${KINDS.join(\", \")})`,\n \"Examples:\",\n \"- /permission shell\",\n \"- /form question\",\n \"- /form external\",\n \"- /fmt markdown\",\n \"- /fmt table\",\n \"- /fmt text your custom text\",\n ].join(\"\\n\"),\n )\n}\n\nexport function createRunDemo(input: Input) {\n const state: State = {\n id: input.sessionID,\n thinking: input.thinking,\n footer: input.footer,\n msg: 0,\n part: 0,\n call: 0,\n perm: 0,\n form: 0,\n perms: new Map(),\n forms: new Map(),\n started: new Set(),\n }\n\n const start = async (): Promise<void> => {\n intro(state)\n }\n\n const prompt = async (line: RunPrompt, signal?: AbortSignal): Promise<boolean> => {\n const text = line.text.trim()\n const head = parseSlashHead(text)\n const list = head?.arguments.split(/\\s+/).filter(Boolean) ?? []\n const cmd = head ? `/${head.name}` : \"\"\n\n clearSubagent(state.footer)\n\n if (cmd === \"/help\") {\n intro(state)\n return true\n }\n\n if (cmd === \"/permission\") {\n const kind = permissionKind(list[0])\n if (!kind) {\n note(state.footer, `Pick a permission kind: ${PERMISSIONS.join(\", \")}`)\n return true\n }\n\n emitPermission(state, kind)\n return true\n }\n\n if (cmd === \"/form\") {\n const kind = formKind(list[0])\n if (!kind) {\n note(state.footer, `Pick a form kind: ${FORMS.join(\", \")}`)\n return true\n }\n\n emitForm(state, kind)\n return true\n }\n\n if (cmd === \"/fmt\") {\n const kind = (list[0] || \"\").toLowerCase()\n const body = list.slice(1).join(\" \")\n if (!kind) {\n note(state.footer, `Pick a kind: ${KINDS.join(\", \")}`)\n return true\n }\n\n const ok = await emitFmt(state, kind, body, signal)\n if (ok) {\n return true\n }\n\n note(state.footer, `Unknown kind \"${kind}\". Use: ${KINDS.join(\", \")}`)\n return true\n }\n\n return false\n }\n\n const permission = (input: PermissionReply): boolean => {\n const item = state.perms.get(input.requestID)\n if (!item || !input.reply) {\n return false\n }\n\n state.perms.delete(input.requestID)\n clearBlocker(state)\n\n if (input.reply === \"reject\") {\n failTool(state, item.ref, input.message || \"permission rejected\")\n return true\n }\n\n doneTool(state, item.ref, item.done)\n return true\n }\n\n const formReply = (input: FormReply): boolean => {\n const form = state.forms.get(input.formID)\n if (!form || input.sessionID !== form.request.sessionID) return false\n state.forms.delete(input.formID)\n clearBlocker(state)\n if (form.kind === \"question\") {\n doneTool(state, form.ref, {\n output: \"\",\n metadata: {\n answers: form.request.fields.map((field) => {\n const value = input.answer[field.key]\n if (value === undefined) return []\n return Array.isArray(value) ? [...value] : [String(value)]\n }),\n },\n })\n return true\n }\n doneTool(state, form.ref, {\n output: `Form submitted: ${Object.entries(input.answer)\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.join(\", \") : String(value)}`)\n .join(\"; \")}\\n`,\n metadata: { answer: input.answer },\n })\n return true\n }\n\n const formCancel = (input: FormCancel): boolean => {\n const form = state.forms.get(input.formID)\n if (!form || input.sessionID !== form.request.sessionID) return false\n state.forms.delete(input.formID)\n clearBlocker(state)\n failTool(state, form.ref, \"form cancelled\")\n return true\n }\n\n return {\n start,\n prompt,\n permission,\n formReply,\n formCancel,\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "29EBE6468276686664756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.list,\n Effect.fn(\"cli.plugin.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.plugin.list({ location: { directory: process.cwd() } }))\n const plugins = response.data.toSorted((a, b) => a.id.localeCompare(b.id))\n if (plugins.length === 0) {\n process.stdout.write(\"No plugins loaded\" + EOL)\n return\n }\n process.stdout.write(plugins.map((plugin) => plugin.id).join(EOL) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";83BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,YAAO,cAAS,UAClC,OAAO,QAAG,sBAAiB,OAAE,cAAU,OAAG,MACxC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAClF,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzE,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,oBAAsB,CAAG,EAC9C,OAEF,QAAQ,OAAO,MAAM,EAAQ,IAAI,CAAC,IAAW,EAAO,EAAE,EAAE,KAAK,CAAG,EAAI,CAAG,EACxE,CACH", | ||
| "debugId": "C438659FAA988AEB64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/version.ts"], | ||
| "sourcesContent": [ | ||
| "declare const OPENCODE_VERSION: string\ndeclare const OPENCODE_CHANNEL: string\n\nconst version = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nconst channel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\n\nexport { version as OPENCODE_VERSION, channel as OPENCODE_CHANNEL }\nexport const OPENCODE_LOCAL = channel === \"local\"\n" | ||
| ], | ||
| "mappings": ";AAGA,IAAM,EAAiD,mBACjD,EAAiD,OAGhD,IAAM,EAAiB", | ||
| "debugId": "2A42194EB6494BA564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/pair.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode } from \"@opencode-ai/client/promise\"\nimport { renderUnicodeCompact } from \"uqr\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServiceConfig } from \"../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.pair,\n Effect.fn(\"cli.pair\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(\n ` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";66BAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,OAAQ,YAAO,WAAO,OAAc,aAAQ,MAAC,EAC/D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MACb,kFAAkF,IAAM,GAC1F,EACD,CACH", | ||
| "debugId": "8036730A7197E0FA64756E2164756E21", | ||
| "names": [] | ||
| } |
+1
-1
| { | ||
| "name": "@opencode-ai/cli-linux-arm64", | ||
| "version": "0.0.0-next-16012", | ||
| "version": "0.0.0-next-16016", | ||
| "license": "MIT", | ||
@@ -5,0 +5,0 @@ "repository": { |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type McpServer } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.list,\n Effect.fn(\"cli.mcp.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.mcp.list({ location: { directory: process.cwd() } }))\n const servers = response.data.toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n case \"needs_client_registration\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"needs_client_registration\":\n return `needs client registration: ${status.error}`\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n" | ||
| ], | ||
| "mappings": ";83BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAC/E,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC7E,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,aACA,4BACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,4BACH,MAAO,8BAA8B,EAAO,YACzC,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO", | ||
| "debugId": "2A70DC944264601764756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/status.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.status,\n Effect.fn(\"cli.service.status\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover({ ...options, version: undefined })\n process.stdout.write((found?.url ?? \"stopped\") + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+0BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,MAC3C,SAAM,OAAU,WAAO,OAAc,aAAQ,EACvC,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH", | ||
| "debugId": "A9D1C2CA39DA6D3C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/server-process.ts", "src/commands/handlers/serve.ts"], | ||
| "sourcesContent": [ | ||
| "export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service, type DiscoverOptions, type Info } from \"@opencode-ai/client/effect/service\"\nimport { LayerNode } from \"@opencode-ai/util/effect/layer-node\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"./version\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Logger, Option, Redacted, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { Updater } from \"./services/updater\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\n// The process effect lives until server shutdown; tracing it would parent every request to one process-lifetime trace.\nexport const run = Effect.fnUntraced(function* (options: Options) {\n return yield* processEffect(options).pipe(\n Effect.provide(Updater.layer),\n Effect.provide(\n LayerNode.compile(LayerNode.group([Global.node, AppProcess.node]), [\n [\n Global.node,\n Global.layerWith(process.env.OPENCODE_CONFIG_DIR ? { config: process.env.OPENCODE_CONFIG_DIR } : {}),\n ],\n ]),\n ),\n Effect.provide(NodeServices.layer),\n )\n})\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(Global.Path.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const hostname = options.hostname ?? config.hostname ?? \"127.0.0.1\"\n const port = options.port ?? config.port ?? (options.mode === \"service\" ? ServiceConfig.defaultPort() : undefined)\n if (\n serviceOptions !== undefined &&\n port !== undefined &&\n (yield* Service.incumbent({ ...serviceOptions, url: serviceURL(hostname, port) })) !== undefined\n )\n return\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const password =\n options.mode === \"service\"\n ? config.password || randomBytes(32).toString(\"base64url\")\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const server = yield* start(\n {\n app: {\n name: process.env.OPENCODE_CLIENT ?? \"cli\",\n version: OPENCODE_VERSION,\n channel: OPENCODE_CHANNEL,\n },\n hostname,\n port,\n password,\n simulation: truthy(process.env.OPENCODE_SIMULATE),\n database: {\n path:\n process.env.OPENCODE_DB ??\n ([\"latest\", \"beta\", \"prod\"].includes(OPENCODE_CHANNEL) ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"1\" ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"true\"\n ? \"opencode.db\"\n : `opencode-${OPENCODE_CHANNEL.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.db`),\n },\n models: {\n url: process.env.OPENCODE_MODELS_URL,\n file: process.env.OPENCODE_MODELS_PATH,\n fetch: !truthy(process.env.OPENCODE_DISABLE_MODELS_FETCH),\n },\n observability: {\n endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,\n headers: process.env.OTEL_EXPORTER_OTLP_HEADERS,\n },\n config: {\n directory: process.env.OPENCODE_CONFIG_DIR,\n project: !truthy(\n process.env.OPENCODE_CONFIG_PROJECT_DISABLE ?? process.env.OPENCODE_DISABLE_PROJECT_CONFIG,\n ),\n file: process.env.OPENCODE_CONFIG,\n content: process.env.OPENCODE_CONFIG_CONTENT,\n },\n windows: {\n gitbash: process.env.OPENCODE_GIT_BASH_PATH,\n },\n fs: {\n filewatcher: !truthy(\n process.env.OPENCODE_FILEWATCHER_DISABLE ?? process.env.OPENCODE_DISABLE_FILEWATCHER,\n ),\n fff:\n process.env.OPENCODE_DISABLE_FFF === undefined\n ? process.platform !== \"win32\"\n : !truthy(process.env.OPENCODE_DISABLE_FFF),\n },\n },\n serviceOptions === undefined\n ? undefined\n : {\n instanceID,\n onListen: (address, shutdown) =>\n Effect.gen(function* () {\n if (!config.password) yield* ServiceConfig.password(password)\n return yield* register(address, password, instanceID, serviceOptions.file, shutdown)\n }),\n },\n ).pipe(\n Effect.provide(Logger.layer([], { mergeWithExisting: false })),\n Effect.catch((error) => {\n if (serviceOptions === undefined || port === undefined || !addressInUse(error)) return Effect.fail(error)\n return recognizeIncumbent(serviceOptions, hostname, port).pipe(\n Effect.flatMap((found) =>\n found\n ? Effect.void\n : Effect.fail(\n new Error(\n `Managed service port ${port} on ${hostname} is already in use by another process. ` +\n \"Configure another port with `opencode service set port <port>` and start the service again.\",\n { cause: error },\n ),\n ),\n ),\n )\n }),\n )\n if (server === undefined) return\n const url = HttpServer.formatAddress(server.address)\n console.log(options.mode === \"stdio\" ? JSON.stringify({ url }) : `server listening on ${url}`)\n if (options.mode === \"default\" && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nconst register = Effect.fnUntraced(function* (\n address: HttpServer.Address,\n password: string,\n id: string,\n file: string,\n shutdown: Effect.Effect<void>,\n) {\n const fs = yield* FileSystem.FileSystem\n const temp = file + \".\" + id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(file), { recursive: true })\n const info = {\n id,\n version: OPENCODE_VERSION,\n url: HttpServer.formatAddress(address),\n pid: process.pid,\n password,\n }\n const encoded = yield* encodeInfo(info)\n const current = fs.readFileString(file).pipe(\n Effect.flatMap(decodeInfo),\n Effect.orElseSucceed(() => undefined),\n )\n const owns = (found: Info | undefined) =>\n found?.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n yield* fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, file)))\n yield* current.pipe(\n Effect.filterOrFail(owns),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.ignore,\n Effect.andThen(shutdown),\n Effect.forkScoped,\n )\n return current.pipe(\n Effect.flatMap((found) => (owns(found) ? fs.remove(file) : Effect.void)),\n Effect.ignore,\n )\n})\n\nconst recognizeIncumbent = Effect.fnUntraced(function* (options: DiscoverOptions, hostname: string, port: number) {\n const found = yield* Service.incumbent({ ...options, url: serviceURL(hostname, port) }).pipe(\n Effect.filterOrFail((value) => value !== undefined),\n Effect.retry(Schedule.spaced(\"100 millis\")),\n Effect.timeoutOption(\"15 seconds\"),\n )\n return Option.isSome(found)\n})\n\nfunction serviceURL(hostname: string, port: number) {\n return `http://${hostname.includes(\":\") ? `[${hostname}]` : hostname}:${port}`\n}\n\nfunction truthy(value?: string) {\n return value === \"1\" || value?.toLowerCase() === \"true\"\n}\n\nfunction addressInUse(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false\n if (\"code\" in error && error.code === \"EADDRINUSE\") return true\n return \"cause\" in error && addressInUse(error.cause)\n}\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n", | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerProcess } from \"../../server-process\"\n\nexport default Runtime.handler(\n Commands.commands.serve,\n Effect.fnUntraced(function* (input) {\n if (input.service && input.stdio) return yield* Effect.fail(new Error(\"--service and --stdio cannot be combined\"))\n return yield* ServerProcess.run({\n mode: input.service ? \"service\" : input.stdio ? \"stdio\" : \"default\",\n hostname: Option.getOrUndefined(input.hostname),\n port: Option.getOrUndefined(input.port),\n })\n }),\n)\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "69F71F63E2E7BD8264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.list,\n Effect.fn(\"cli.plugin.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.plugin.list({ location: { directory: process.cwd() } }))\n const plugins = response.data.toSorted((a, b) => a.id.localeCompare(b.id))\n if (plugins.length === 0) {\n process.stdout.write(\"No plugins loaded\" + EOL)\n return\n }\n process.stdout.write(plugins.map((plugin) => plugin.id).join(EOL) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";83BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,YAAO,cAAS,UAClC,OAAO,QAAG,sBAAiB,OAAE,cAAU,OAAG,MACxC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAClF,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzE,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,oBAAsB,CAAG,EAC9C,OAEF,QAAQ,OAAO,MAAM,EAAQ,IAAI,CAAC,IAAW,EAAO,EAAE,EAAE,KAAK,CAAG,EAAI,CAAG,EACxE,CACH", | ||
| "debugId": "C438659FAA988AEB64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/pair.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode } from \"@opencode-ai/client/promise\"\nimport { renderUnicodeCompact } from \"uqr\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServiceConfig } from \"../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.pair,\n Effect.fn(\"cli.pair\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(\n ` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";66BAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,OAAQ,YAAO,WAAO,OAAc,aAAQ,MAAC,EAC/D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MACb,kFAAkF,IAAM,GAC1F,EACD,CACH", | ||
| "debugId": "8036730A7197E0FA64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/unset.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.unset,\n Effect.fn(\"cli.service.unset\")(function* (input) {\n yield* ServiceConfig.unset(input.key)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";k0BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,WAAO,OAAc,WAAM,OAAM,QAAG,OACrC,CACH", | ||
| "debugId": "8C3F2FBBFCF6226164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"], | ||
| "sourcesContent": [ | ||
| "import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}", | ||
| "import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\n\nconst integrationID = \"opencode\"\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.console.commands.login,\n Effect.fn(\"cli.console.login\")(function* (input) {\n const timeline = yield* Effect.acquireRelease(\n Effect.promise(() => createTimelineHost()),\n (value) => request(() => value.close()).pipe(Effect.ignore),\n )\n const exit = yield* login(timeline, Option.getOrUndefined(input.url)).pipe(\n Effect.raceFirst(AppProcess.waitForAbort(timeline.signal)),\n Effect.exit,\n )\n if (Exit.isSuccess(exit)) return\n\n const cancelled = timeline.signal.aborted\n yield* request(() => timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(exit.cause))).pipe(\n Effect.ignore,\n )\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const found = yield* request((signal) => client.integration.get({ integrationID, location }, { signal }))\n const integration = yield* required(found.data, \"OpenCode Console integration is unavailable\")\n const method = yield* required(\n integration.methods.find((candidate) => candidate.type === \"oauth\"),\n \"OpenCode Console login is unavailable\",\n )\n\n yield* request(() => timeline.pending(\"Starting authorization...\"))\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n {\n integrationID,\n methodID: method.id,\n inputs: server ? { server } : {},\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n if (attempt.mode !== \"auto\") yield* Effect.fail(new Error(\"OpenCode Console requires a device login\"))\n\n yield* request(() => timeline.item(`Go to: ${attempt.url}`))\n yield* request(() => timeline.item(attempt.instructions))\n yield* request(async () => {\n const { default: open } = await import(\"open\")\n await open(attempt.url)\n }).pipe(Effect.ignore)\n yield* request(() => timeline.pending(\"Waiting for authorization...\"))\n\n const status = yield* waitForConsoleLogin(client, integrationID, attempt.attemptID)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") yield* Effect.fail(new Error(\"Device code expired\"))\n\n yield* request(() => timeline.success(\"Connected to OpenCode Console\"))\n yield* request(() => timeline.outro(\"Done\"))\n})\n\nconst waitForConsoleLogin = Effect.fn(\"cli.console.login.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nfunction request<A>(task: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: task,\n catch: (cause) => cause,\n })\n}\n\nfunction required<A>(value: A | null | undefined, message: string) {\n return value === null || value === undefined ? Effect.fail(new Error(message)) : Effect.succeed(value)\n}\n\nfunction errorMessage(cause: Cause.Cause<unknown>) {\n const error = Cause.squash(cause)\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\") {\n return error.message\n }\n return String(error)\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "CA9156F00EA13B0864756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../../node_modules/.bun/fuzzysort@3.1.0/node_modules/fuzzysort/fuzzysort.js"], | ||
| "sourcesContent": [ | ||
| "// https://github.com/farzher/fuzzysort v3.0.2\r\n\r\n// UMD (Universal Module Definition) for fuzzysort\r\n;((root, UMD) => {\r\n if(typeof define === 'function' && define.amd) define([], UMD)\r\n else if(typeof module === 'object' && module.exports) module.exports = UMD()\r\n else root['fuzzysort'] = UMD()\r\n})(this, _ => {\r\n 'use strict'\r\n\r\n var single = (search, target) => {\r\n if(!search || !target) return NULL\r\n\r\n var preparedSearch = getPreparedSearch(search)\r\n if(!isPrepared(target)) target = getPrepared(target)\r\n\r\n var searchBitflags = preparedSearch.bitflags\r\n if((searchBitflags & target._bitflags) !== searchBitflags) return NULL\r\n\r\n return algorithm(preparedSearch, target)\r\n }\r\n\r\n var go = (search, targets, options) => {\r\n if(!search) return options?.all ? all(targets, options) : noResults\r\n\r\n var preparedSearch = getPreparedSearch(search)\r\n var searchBitflags = preparedSearch.bitflags\r\n var containsSpace = preparedSearch.containsSpace\r\n\r\n var threshold = denormalizeScore( options?.threshold || 0 )\r\n var limit = options?.limit || INFINITY\r\n\r\n var resultsLen = 0; var limitedCount = 0\r\n var targetsLen = targets.length\r\n\r\n function push_result(result) {\r\n if(resultsLen < limit) { q.add(result); ++resultsLen }\r\n else {\r\n ++limitedCount\r\n if(result._score > q.peek()._score) q.replaceTop(result)\r\n }\r\n }\r\n\r\n // This code is copy/pasted 3 times for performance reasons [options.key, options.keys, no keys]\r\n\r\n // options.key\r\n if(options?.key) {\r\n var key = options.key\r\n for(var i = 0; i < targetsLen; ++i) { var obj = targets[i]\r\n var target = getValue(obj, key)\r\n if(!target) continue\r\n if(!isPrepared(target)) target = getPrepared(target)\r\n\r\n if((searchBitflags & target._bitflags) !== searchBitflags) continue\r\n var result = algorithm(preparedSearch, target)\r\n if(result === NULL) continue\r\n if(result._score < threshold) continue\r\n\r\n result.obj = obj\r\n push_result(result)\r\n }\r\n\r\n // options.keys\r\n } else if(options?.keys) {\r\n var keys = options.keys\r\n var keysLen = keys.length\r\n\r\n outer: for(var i = 0; i < targetsLen; ++i) { var obj = targets[i]\r\n\r\n { // early out based on bitflags\r\n var keysBitflags = 0\r\n for (var keyI = 0; keyI < keysLen; ++keyI) {\r\n var key = keys[keyI]\r\n var target = getValue(obj, key)\r\n if(!target) { tmpTargets[keyI] = noTarget; continue }\r\n if(!isPrepared(target)) target = getPrepared(target)\r\n tmpTargets[keyI] = target\r\n\r\n keysBitflags |= target._bitflags\r\n }\r\n\r\n if((searchBitflags & keysBitflags) !== searchBitflags) continue\r\n }\r\n\r\n if(containsSpace) for(let i=0; i<preparedSearch.spaceSearches.length; i++) keysSpacesBestScores[i] = NEGATIVE_INFINITY\r\n\r\n for (var keyI = 0; keyI < keysLen; ++keyI) {\r\n target = tmpTargets[keyI]\r\n if(target === noTarget) { tmpResults[keyI] = noTarget; continue }\r\n\r\n tmpResults[keyI] = algorithm(preparedSearch, target, /*allowSpaces=*/false, /*allowPartialMatch=*/containsSpace)\r\n if(tmpResults[keyI] === NULL) { tmpResults[keyI] = noTarget; continue }\r\n\r\n // todo: this seems weird and wrong. like what if our first match wasn't good. this should just replace it instead of averaging with it\r\n // if our second match isn't good we ignore it instead of averaging with it\r\n if(containsSpace) for(let i=0; i<preparedSearch.spaceSearches.length; i++) {\r\n if(allowPartialMatchScores[i] > -1000) {\r\n if(keysSpacesBestScores[i] > NEGATIVE_INFINITY) {\r\n var tmp = (keysSpacesBestScores[i] + allowPartialMatchScores[i]) / 4/*bonus score for having multiple matches*/\r\n if(tmp > keysSpacesBestScores[i]) keysSpacesBestScores[i] = tmp\r\n }\r\n }\r\n if(allowPartialMatchScores[i] > keysSpacesBestScores[i]) keysSpacesBestScores[i] = allowPartialMatchScores[i]\r\n }\r\n }\r\n\r\n if(containsSpace) {\r\n for(let i=0; i<preparedSearch.spaceSearches.length; i++) { if(keysSpacesBestScores[i] === NEGATIVE_INFINITY) continue outer }\r\n } else {\r\n var hasAtLeast1Match = false\r\n for(let i=0; i < keysLen; i++) { if(tmpResults[i]._score !== NEGATIVE_INFINITY) { hasAtLeast1Match = true; break } }\r\n if(!hasAtLeast1Match) continue\r\n }\r\n\r\n var objResults = new KeysResult(keysLen)\r\n for(let i=0; i < keysLen; i++) { objResults[i] = tmpResults[i] }\r\n\r\n if(containsSpace) {\r\n var score = 0\r\n for(let i=0; i<preparedSearch.spaceSearches.length; i++) score += keysSpacesBestScores[i]\r\n } else {\r\n // todo could rewrite this scoring to be more similar to when there's spaces\r\n // if we match multiple keys give us bonus points\r\n var score = NEGATIVE_INFINITY\r\n for(let i=0; i<keysLen; i++) {\r\n var result = objResults[i]\r\n if(result._score > -1000) {\r\n if(score > NEGATIVE_INFINITY) {\r\n var tmp = (score + result._score) / 4/*bonus score for having multiple matches*/\r\n if(tmp > score) score = tmp\r\n }\r\n }\r\n if(result._score > score) score = result._score\r\n }\r\n }\r\n\r\n objResults.obj = obj\r\n objResults._score = score\r\n if(options?.scoreFn) {\r\n score = options.scoreFn(objResults)\r\n if(!score) continue\r\n score = denormalizeScore(score)\r\n objResults._score = score\r\n }\r\n\r\n if(score < threshold) continue\r\n push_result(objResults)\r\n }\r\n\r\n // no keys\r\n } else {\r\n for(var i = 0; i < targetsLen; ++i) { var target = targets[i]\r\n if(!target) continue\r\n if(!isPrepared(target)) target = getPrepared(target)\r\n\r\n if((searchBitflags & target._bitflags) !== searchBitflags) continue\r\n var result = algorithm(preparedSearch, target)\r\n if(result === NULL) continue\r\n if(result._score < threshold) continue\r\n\r\n push_result(result)\r\n }\r\n }\r\n\r\n if(resultsLen === 0) return noResults\r\n var results = new Array(resultsLen)\r\n for(var i = resultsLen - 1; i >= 0; --i) results[i] = q.poll()\r\n results.total = resultsLen + limitedCount\r\n return results\r\n }\r\n\r\n\r\n // this is written as 1 function instead of 2 for minification. perf seems fine ...\r\n // except when minified. the perf is very slow\r\n var highlight = (result, open='<b>', close='</b>') => {\r\n var callback = typeof open === 'function' ? open : undefined\r\n\r\n var target = result.target\r\n var targetLen = target.length\r\n var indexes = result.indexes\r\n var highlighted = ''\r\n var matchI = 0\r\n var indexesI = 0\r\n var opened = false\r\n var parts = []\r\n\r\n for(var i = 0; i < targetLen; ++i) { var char = target[i]\r\n if(indexes[indexesI] === i) {\r\n ++indexesI\r\n if(!opened) { opened = true\r\n if(callback) {\r\n parts.push(highlighted); highlighted = ''\r\n } else {\r\n highlighted += open\r\n }\r\n }\r\n\r\n if(indexesI === indexes.length) {\r\n if(callback) {\r\n highlighted += char\r\n parts.push(callback(highlighted, matchI++)); highlighted = ''\r\n parts.push(target.substr(i+1))\r\n } else {\r\n highlighted += char + close + target.substr(i+1)\r\n }\r\n break\r\n }\r\n } else {\r\n if(opened) { opened = false\r\n if(callback) {\r\n parts.push(callback(highlighted, matchI++)); highlighted = ''\r\n } else {\r\n highlighted += close\r\n }\r\n }\r\n }\r\n highlighted += char\r\n }\r\n\r\n return callback ? parts : highlighted\r\n }\r\n\r\n\r\n var prepare = (target) => {\r\n if(typeof target === 'number') target = ''+target\r\n else if(typeof target !== 'string') target = ''\r\n var info = prepareLowerInfo(target)\r\n return new_result(target, {_targetLower:info._lower, _targetLowerCodes:info.lowerCodes, _bitflags:info.bitflags})\r\n }\r\n\r\n var cleanup = () => { preparedCache.clear(); preparedSearchCache.clear() }\r\n\r\n\r\n // Below this point is only internal code\r\n // Below this point is only internal code\r\n // Below this point is only internal code\r\n // Below this point is only internal code\r\n\r\n\r\n class Result {\r\n get ['indexes']() { return this._indexes.slice(0, this._indexes.len).sort((a,b)=>a-b) }\r\n set ['indexes'](indexes) { return this._indexes = indexes }\r\n ['highlight'](open, close) { return highlight(this, open, close) }\r\n get ['score']() { return normalizeScore(this._score) }\r\n set ['score'](score) { this._score = denormalizeScore(score) }\r\n }\r\n\r\n class KeysResult extends Array {\r\n get ['score']() { return normalizeScore(this._score) }\r\n set ['score'](score) { this._score = denormalizeScore(score) }\r\n }\r\n\r\n var new_result = (target, options) => {\r\n const result = new Result()\r\n result['target'] = target\r\n result['obj'] = options.obj ?? NULL\r\n result._score = options._score ?? NEGATIVE_INFINITY\r\n result._indexes = options._indexes ?? []\r\n result._targetLower = options._targetLower ?? ''\r\n result._targetLowerCodes = options._targetLowerCodes ?? NULL\r\n result._nextBeginningIndexes = options._nextBeginningIndexes ?? NULL\r\n result._bitflags = options._bitflags ?? 0\r\n return result\r\n }\r\n\r\n\r\n var normalizeScore = score => {\r\n if(score === NEGATIVE_INFINITY) return 0\r\n if(score > 1) return score\r\n return Math.E ** ( ((-score + 1)**.04307 - 1) * -2)\r\n }\r\n var denormalizeScore = normalizedScore => {\r\n if(normalizedScore === 0) return NEGATIVE_INFINITY\r\n if(normalizedScore > 1) return normalizedScore\r\n return 1 - Math.pow((Math.log(normalizedScore) / -2 + 1), 1 / 0.04307)\r\n }\r\n\r\n\r\n var prepareSearch = (search) => {\r\n if(typeof search === 'number') search = ''+search\r\n else if(typeof search !== 'string') search = ''\r\n search = search.trim()\r\n var info = prepareLowerInfo(search)\r\n\r\n var spaceSearches = []\r\n if(info.containsSpace) {\r\n var searches = search.split(/\\s+/)\r\n searches = [...new Set(searches)] // distinct\r\n for(var i=0; i<searches.length; i++) {\r\n if(searches[i] === '') continue\r\n var _info = prepareLowerInfo(searches[i])\r\n spaceSearches.push({lowerCodes:_info.lowerCodes, _lower:searches[i].toLowerCase(), containsSpace:false})\r\n }\r\n }\r\n\r\n return {lowerCodes: info.lowerCodes, _lower: info._lower, containsSpace: info.containsSpace, bitflags: info.bitflags, spaceSearches: spaceSearches}\r\n }\r\n\r\n\r\n\r\n var getPrepared = (target) => {\r\n if(target.length > 999) return prepare(target) // don't cache huge targets\r\n var targetPrepared = preparedCache.get(target)\r\n if(targetPrepared !== undefined) return targetPrepared\r\n targetPrepared = prepare(target)\r\n preparedCache.set(target, targetPrepared)\r\n return targetPrepared\r\n }\r\n var getPreparedSearch = (search) => {\r\n if(search.length > 999) return prepareSearch(search) // don't cache huge searches\r\n var searchPrepared = preparedSearchCache.get(search)\r\n if(searchPrepared !== undefined) return searchPrepared\r\n searchPrepared = prepareSearch(search)\r\n preparedSearchCache.set(search, searchPrepared)\r\n return searchPrepared\r\n }\r\n\r\n\r\n var all = (targets, options) => {\r\n var results = []; results.total = targets.length // this total can be wrong if some targets are skipped\r\n\r\n var limit = options?.limit || INFINITY\r\n\r\n if(options?.key) {\r\n for(var i=0;i<targets.length;i++) { var obj = targets[i]\r\n var target = getValue(obj, options.key)\r\n if(target == NULL) continue\r\n if(!isPrepared(target)) target = getPrepared(target)\r\n var result = new_result(target.target, {_score: target._score, obj: obj})\r\n results.push(result); if(results.length >= limit) return results\r\n }\r\n } else if(options?.keys) {\r\n for(var i=0;i<targets.length;i++) { var obj = targets[i]\r\n var objResults = new KeysResult(options.keys.length)\r\n for (var keyI = options.keys.length - 1; keyI >= 0; --keyI) {\r\n var target = getValue(obj, options.keys[keyI])\r\n if(!target) { objResults[keyI] = noTarget; continue }\r\n if(!isPrepared(target)) target = getPrepared(target)\r\n target._score = NEGATIVE_INFINITY\r\n target._indexes.len = 0\r\n objResults[keyI] = target\r\n }\r\n objResults.obj = obj\r\n objResults._score = NEGATIVE_INFINITY\r\n results.push(objResults); if(results.length >= limit) return results\r\n }\r\n } else {\r\n for(var i=0;i<targets.length;i++) { var target = targets[i]\r\n if(target == NULL) continue\r\n if(!isPrepared(target)) target = getPrepared(target)\r\n target._score = NEGATIVE_INFINITY\r\n target._indexes.len = 0\r\n results.push(target); if(results.length >= limit) return results\r\n }\r\n }\r\n\r\n return results\r\n }\r\n\r\n\r\n var algorithm = (preparedSearch, prepared, allowSpaces=false, allowPartialMatch=false) => {\r\n if(allowSpaces===false && preparedSearch.containsSpace) return algorithmSpaces(preparedSearch, prepared, allowPartialMatch)\r\n\r\n var searchLower = preparedSearch._lower\r\n var searchLowerCodes = preparedSearch.lowerCodes\r\n var searchLowerCode = searchLowerCodes[0]\r\n var targetLowerCodes = prepared._targetLowerCodes\r\n var searchLen = searchLowerCodes.length\r\n var targetLen = targetLowerCodes.length\r\n var searchI = 0 // where we at\r\n var targetI = 0 // where you at\r\n var matchesSimpleLen = 0\r\n\r\n // very basic fuzzy match; to remove non-matching targets ASAP!\r\n // walk through target. find sequential matches.\r\n // if all chars aren't found then exit\r\n for(;;) {\r\n var isMatch = searchLowerCode === targetLowerCodes[targetI]\r\n if(isMatch) {\r\n matchesSimple[matchesSimpleLen++] = targetI\r\n ++searchI; if(searchI === searchLen) break\r\n searchLowerCode = searchLowerCodes[searchI]\r\n }\r\n ++targetI; if(targetI >= targetLen) return NULL // Failed to find searchI\r\n }\r\n\r\n var searchI = 0\r\n var successStrict = false\r\n var matchesStrictLen = 0\r\n\r\n var nextBeginningIndexes = prepared._nextBeginningIndexes\r\n if(nextBeginningIndexes === NULL) nextBeginningIndexes = prepared._nextBeginningIndexes = prepareNextBeginningIndexes(prepared.target)\r\n targetI = matchesSimple[0]===0 ? 0 : nextBeginningIndexes[matchesSimple[0]-1]\r\n\r\n // Our target string successfully matched all characters in sequence!\r\n // Let's try a more advanced and strict test to improve the score\r\n // only count it as a match if it's consecutive or a beginning character!\r\n var backtrackCount = 0\r\n if(targetI !== targetLen) for(;;) {\r\n if(targetI >= targetLen) {\r\n // We failed to find a good spot for this search char, go back to the previous search char and force it forward\r\n if(searchI <= 0) break // We failed to push chars forward for a better match\r\n\r\n ++backtrackCount; if(backtrackCount > 200) break // exponential backtracking is taking too long, just give up and return a bad match\r\n\r\n --searchI\r\n var lastMatch = matchesStrict[--matchesStrictLen]\r\n targetI = nextBeginningIndexes[lastMatch]\r\n\r\n } else {\r\n var isMatch = searchLowerCodes[searchI] === targetLowerCodes[targetI]\r\n if(isMatch) {\r\n matchesStrict[matchesStrictLen++] = targetI\r\n ++searchI; if(searchI === searchLen) { successStrict = true; break }\r\n ++targetI\r\n } else {\r\n targetI = nextBeginningIndexes[targetI]\r\n }\r\n }\r\n }\r\n\r\n // check if it's a substring match\r\n var substringIndex = searchLen <= 1 ? -1 : prepared._targetLower.indexOf(searchLower, matchesSimple[0]) // perf: this is slow\r\n var isSubstring = !!~substringIndex\r\n var isSubstringBeginning = !isSubstring ? false : substringIndex===0 || prepared._nextBeginningIndexes[substringIndex-1] === substringIndex\r\n\r\n // if it's a substring match but not at a beginning index, let's try to find a substring starting at a beginning index for a better score\r\n if(isSubstring && !isSubstringBeginning) {\r\n for(var i=0; i<nextBeginningIndexes.length; i=nextBeginningIndexes[i]) {\r\n if(i <= substringIndex) continue\r\n\r\n for(var s=0; s<searchLen; s++) if(searchLowerCodes[s] !== prepared._targetLowerCodes[i+s]) break\r\n if(s === searchLen) { substringIndex = i; isSubstringBeginning = true; break }\r\n }\r\n }\r\n\r\n // tally up the score & keep track of matches for highlighting later\r\n // if it's a simple match, we'll switch to a substring match if a substring exists\r\n // if it's a strict match, we'll switch to a substring match only if that's a better score\r\n\r\n var calculateScore = matches => {\r\n var score = 0\r\n\r\n var extraMatchGroupCount = 0\r\n for(var i = 1; i < searchLen; ++i) {\r\n if(matches[i] - matches[i-1] !== 1) {score -= matches[i]; ++extraMatchGroupCount}\r\n }\r\n var unmatchedDistance = matches[searchLen-1] - matches[0] - (searchLen-1)\r\n\r\n score -= (12+unmatchedDistance) * extraMatchGroupCount // penality for more groups\r\n\r\n if(matches[0] !== 0) score -= matches[0]*matches[0]*.2 // penality for not starting near the beginning\r\n\r\n if(!successStrict) {\r\n score *= 1000\r\n } else {\r\n // successStrict on a target with too many beginning indexes loses points for being a bad target\r\n var uniqueBeginningIndexes = 1\r\n for(var i = nextBeginningIndexes[0]; i < targetLen; i=nextBeginningIndexes[i]) ++uniqueBeginningIndexes\r\n\r\n if(uniqueBeginningIndexes > 24) score *= (uniqueBeginningIndexes-24)*10 // quite arbitrary numbers here ...\r\n }\r\n\r\n score -= (targetLen - searchLen)/2 // penality for longer targets\r\n\r\n if(isSubstring) score /= 1+searchLen*searchLen*1 // bonus for being a full substring\r\n if(isSubstringBeginning) score /= 1+searchLen*searchLen*1 // bonus for substring starting on a beginningIndex\r\n\r\n score -= (targetLen - searchLen)/2 // penality for longer targets\r\n\r\n return score\r\n }\r\n\r\n if(!successStrict) {\r\n if(isSubstring) for(var i=0; i<searchLen; ++i) matchesSimple[i] = substringIndex+i // at this point it's safe to overwrite matchehsSimple with substr matches\r\n var matchesBest = matchesSimple\r\n var score = calculateScore(matchesBest)\r\n } else {\r\n if(isSubstringBeginning) {\r\n for(var i=0; i<searchLen; ++i) matchesSimple[i] = substringIndex+i // at this point it's safe to overwrite matchehsSimple with substr matches\r\n var matchesBest = matchesSimple\r\n var score = calculateScore(matchesSimple)\r\n } else {\r\n var matchesBest = matchesStrict\r\n var score = calculateScore(matchesStrict)\r\n }\r\n }\r\n\r\n prepared._score = score\r\n\r\n for(var i = 0; i < searchLen; ++i) prepared._indexes[i] = matchesBest[i]\r\n prepared._indexes.len = searchLen\r\n\r\n const result = new Result()\r\n result.target = prepared.target\r\n result._score = prepared._score\r\n result._indexes = prepared._indexes\r\n return result\r\n }\r\n var algorithmSpaces = (preparedSearch, target, allowPartialMatch) => {\r\n var seen_indexes = new Set()\r\n var score = 0\r\n var result = NULL\r\n\r\n var first_seen_index_last_search = 0\r\n var searches = preparedSearch.spaceSearches\r\n var searchesLen = searches.length\r\n var changeslen = 0\r\n\r\n // Return _nextBeginningIndexes back to its normal state\r\n var resetNextBeginningIndexes = () => {\r\n for(let i=changeslen-1; i>=0; i--) target._nextBeginningIndexes[nextBeginningIndexesChanges[i*2 + 0]] = nextBeginningIndexesChanges[i*2 + 1]\r\n }\r\n\r\n var hasAtLeast1Match = false\r\n for(var i=0; i<searchesLen; ++i) {\r\n allowPartialMatchScores[i] = NEGATIVE_INFINITY\r\n var search = searches[i]\r\n\r\n result = algorithm(search, target)\r\n if(allowPartialMatch) {\r\n if(result === NULL) continue\r\n hasAtLeast1Match = true\r\n } else {\r\n if(result === NULL) {resetNextBeginningIndexes(); return NULL}\r\n }\r\n\r\n // if not the last search, we need to mutate _nextBeginningIndexes for the next search\r\n var isTheLastSearch = i === searchesLen - 1\r\n if(!isTheLastSearch) {\r\n var indexes = result._indexes\r\n\r\n var indexesIsConsecutiveSubstring = true\r\n for(let i=0; i<indexes.len-1; i++) {\r\n if(indexes[i+1] - indexes[i] !== 1) {\r\n indexesIsConsecutiveSubstring = false; break;\r\n }\r\n }\r\n\r\n if(indexesIsConsecutiveSubstring) {\r\n var newBeginningIndex = indexes[indexes.len-1] + 1\r\n var toReplace = target._nextBeginningIndexes[newBeginningIndex-1]\r\n for(let i=newBeginningIndex-1; i>=0; i--) {\r\n if(toReplace !== target._nextBeginningIndexes[i]) break\r\n target._nextBeginningIndexes[i] = newBeginningIndex\r\n nextBeginningIndexesChanges[changeslen*2 + 0] = i\r\n nextBeginningIndexesChanges[changeslen*2 + 1] = toReplace\r\n changeslen++\r\n }\r\n }\r\n }\r\n\r\n score += result._score / searchesLen\r\n allowPartialMatchScores[i] = result._score / searchesLen\r\n\r\n // dock points based on order otherwise \"c man\" returns Manifest.cpp instead of CheatManager.h\r\n if(result._indexes[0] < first_seen_index_last_search) {\r\n score -= (first_seen_index_last_search - result._indexes[0]) * 2\r\n }\r\n first_seen_index_last_search = result._indexes[0]\r\n\r\n for(var j=0; j<result._indexes.len; ++j) seen_indexes.add(result._indexes[j])\r\n }\r\n\r\n if(allowPartialMatch && !hasAtLeast1Match) return NULL\r\n\r\n resetNextBeginningIndexes()\r\n\r\n // allows a search with spaces that's an exact substring to score well\r\n var allowSpacesResult = algorithm(preparedSearch, target, /*allowSpaces=*/true)\r\n if(allowSpacesResult !== NULL && allowSpacesResult._score > score) {\r\n if(allowPartialMatch) {\r\n for(var i=0; i<searchesLen; ++i) {\r\n allowPartialMatchScores[i] = allowSpacesResult._score / searchesLen\r\n }\r\n }\r\n return allowSpacesResult\r\n }\r\n\r\n if(allowPartialMatch) result = target\r\n result._score = score\r\n\r\n var i = 0\r\n for (let index of seen_indexes) result._indexes[i++] = index\r\n result._indexes.len = i\r\n\r\n return result\r\n }\r\n\r\n // we use this instead of just .normalize('NFD').replace(/[\\u0300-\\u036f]/g, '') because that screws with japanese characters\r\n var remove_accents = (str) => str.replace(/\\p{Script=Latin}+/gu, match => match.normalize('NFD')).replace(/[\\u0300-\\u036f]/g, '')\r\n\r\n var prepareLowerInfo = (str) => {\r\n str = remove_accents(str)\r\n var strLen = str.length\r\n var lower = str.toLowerCase()\r\n var lowerCodes = [] // new Array(strLen) sparse array is too slow\r\n var bitflags = 0\r\n var containsSpace = false // space isn't stored in bitflags because of how searching with a space works\r\n\r\n for(var i = 0; i < strLen; ++i) {\r\n var lowerCode = lowerCodes[i] = lower.charCodeAt(i)\r\n\r\n if(lowerCode === 32) {\r\n containsSpace = true\r\n continue // it's important that we don't set any bitflags for space\r\n }\r\n\r\n var bit = lowerCode>=97&&lowerCode<=122 ? lowerCode-97 // alphabet\r\n : lowerCode>=48&&lowerCode<=57 ? 26 // numbers\r\n // 3 bits available\r\n : lowerCode<=127 ? 30 // other ascii\r\n : 31 // other utf8\r\n bitflags |= 1<<bit\r\n }\r\n\r\n return {lowerCodes:lowerCodes, bitflags:bitflags, containsSpace:containsSpace, _lower:lower}\r\n }\r\n var prepareBeginningIndexes = (target) => {\r\n var targetLen = target.length\r\n var beginningIndexes = []; var beginningIndexesLen = 0\r\n var wasUpper = false\r\n var wasAlphanum = false\r\n for(var i = 0; i < targetLen; ++i) {\r\n var targetCode = target.charCodeAt(i)\r\n var isUpper = targetCode>=65&&targetCode<=90\r\n var isAlphanum = isUpper || targetCode>=97&&targetCode<=122 || targetCode>=48&&targetCode<=57\r\n var isBeginning = isUpper && !wasUpper || !wasAlphanum || !isAlphanum\r\n wasUpper = isUpper\r\n wasAlphanum = isAlphanum\r\n if(isBeginning) beginningIndexes[beginningIndexesLen++] = i\r\n }\r\n return beginningIndexes\r\n }\r\n var prepareNextBeginningIndexes = (target) => {\r\n target = remove_accents(target)\r\n var targetLen = target.length\r\n var beginningIndexes = prepareBeginningIndexes(target)\r\n var nextBeginningIndexes = [] // new Array(targetLen) sparse array is too slow\r\n var lastIsBeginning = beginningIndexes[0]\r\n var lastIsBeginningI = 0\r\n for(var i = 0; i < targetLen; ++i) {\r\n if(lastIsBeginning > i) {\r\n nextBeginningIndexes[i] = lastIsBeginning\r\n } else {\r\n lastIsBeginning = beginningIndexes[++lastIsBeginningI]\r\n nextBeginningIndexes[i] = lastIsBeginning===undefined ? targetLen : lastIsBeginning\r\n }\r\n }\r\n return nextBeginningIndexes\r\n }\r\n\r\n var preparedCache = new Map()\r\n var preparedSearchCache = new Map()\r\n\r\n // the theory behind these being globals is to reduce garbage collection by not making new arrays\r\n var matchesSimple = []; var matchesStrict = []\r\n var nextBeginningIndexesChanges = [] // allows straw berry to match strawberry well, by modifying the end of a substring to be considered a beginning index for the rest of the search\r\n var keysSpacesBestScores = []; var allowPartialMatchScores = []\r\n var tmpTargets = []; var tmpResults = []\r\n\r\n // prop = 'key' 2.5ms optimized for this case, seems to be about as fast as direct obj[prop]\r\n // prop = 'key1.key2' 10ms\r\n // prop = ['key1', 'key2'] 27ms\r\n // prop = obj => obj.tags.join() ??ms\r\n var getValue = (obj, prop) => {\r\n var tmp = obj[prop]; if(tmp !== undefined) return tmp\r\n if(typeof prop === 'function') return prop(obj) // this should run first. but that makes string props slower\r\n var segs = prop\r\n if(!Array.isArray(prop)) segs = prop.split('.')\r\n var len = segs.length\r\n var i = -1\r\n while (obj && (++i < len)) obj = obj[segs[i]]\r\n return obj\r\n }\r\n\r\n var isPrepared = (x) => { return typeof x === 'object' && typeof x._bitflags === 'number' }\r\n var INFINITY = Infinity; var NEGATIVE_INFINITY = -INFINITY\r\n var noResults = []; noResults.total = 0\r\n var NULL = null\r\n\r\n var noTarget = prepare('')\r\n\r\n // Hacked version of https://github.com/lemire/FastPriorityQueue.js\r\n var fastpriorityqueue=r=>{var e=[],o=0,a={},v=r=>{for(var a=0,v=e[a],c=1;c<o;){var s=c+1;a=c,s<o&&e[s]._score<e[c]._score&&(a=s),e[a-1>>1]=e[a],c=1+(a<<1)}for(var f=a-1>>1;a>0&&v._score<e[f]._score;f=(a=f)-1>>1)e[a]=e[f];e[a]=v};return a.add=(r=>{var a=o;e[o++]=r;for(var v=a-1>>1;a>0&&r._score<e[v]._score;v=(a=v)-1>>1)e[a]=e[v];e[a]=r}),a.poll=(r=>{if(0!==o){var a=e[0];return e[0]=e[--o],v(),a}}),a.peek=(r=>{if(0!==o)return e[0]}),a.replaceTop=(r=>{e[0]=r,v()}),a}\r\n var q = fastpriorityqueue() // reuse this\r\n\r\n // fuzzysort is written this way for minification. all names are mangeled unless quoted\r\n return {'single':single, 'go':go, 'prepare':prepare, 'cleanup':cleanup}\r\n}) // UMD\r\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "D5B9E6CAD4F098D364756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/set.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.set,\n Effect.fn(\"cli.service.set\")(function* (input) {\n yield* ServiceConfig.set(input.key, input.value)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";k0BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,WAAO,OAAc,SAAI,OAAM,SAAK,OAAM,KAAK,EAChD,CACH", | ||
| "debugId": "DB92895116DCBFB864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/mini.ts", "src/mini-host.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { setTimeout } from \"node:timers/promises\"\nimport { readStdin } from \"./util/io\"\nimport { createMiniHost, INTERACTIVE_INPUT_ERROR, usingInteractiveStdin } from \"./mini-host\"\nimport { parseSessionTargetModel, resolveSessionTarget, type SessionTargetPreparation } from \"./session-target\"\n\nexport type MiniCommandInput = {\n server: {\n endpoint: Endpoint\n reconnect?: (signal: AbortSignal) => Promise<Endpoint>\n }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: MiniFrontendInput[\"tuiConfig\"]\n config?: MiniFrontendInput[\"config\"]\n}\n\ntype Model = MiniFrontendInput[\"model\"]\n\nclass MiniInputError extends Error {}\n\nexport async function runMini(input: MiniCommandInput) {\n try {\n validate(input)\n const result = await usingInteractiveStdin(async (terminal) => {\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await readStdin(), input.prompt)\n const frontendTask = import(\"@opencode-ai/tui/mini\")\n const directory = localDirectory()\n const connection = createMiniConnection(input.server)\n const sdk = connection.sdk\n const requested = parseModel(input.model)\n const model = requested ? { providerID: requested.providerID, modelID: requested.id } : undefined\n const prepare = prepareTarget(input.agent)\n const resolveTarget = async (initial: OpenCodeClient, signal: AbortSignal) => {\n const resolved = await resolveMiniTarget({\n sdk: initial,\n reconnect: connection.reconnect,\n signal,\n resolve: (client) =>\n resolveSessionTarget({\n client,\n location: { directory },\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: requested,\n agent: input.agent,\n prepare,\n signal,\n }).catch((error) => {\n if (error instanceof Error && error.message === \"Session not found\")\n throw new MiniInputError(error.message)\n throw error\n }),\n })\n const target = resolved.value\n return {\n sdk: resolved.sdk,\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: target.resume,\n }\n }\n const create = (\n client: OpenCodeClient,\n next: {\n location: { directory: string; workspaceID?: string }\n agent: string | undefined\n model: Model\n variant: string | undefined\n },\n signal?: AbortSignal,\n ) =>\n resolveSessionTarget({\n client,\n location: { directory: next.location.directory, workspace: next.location.workspaceID },\n agent: next.agent,\n model: next.model\n ? { providerID: next.model.providerID, id: next.model.modelID, variant: next.variant }\n : undefined,\n prepare,\n signal,\n }).then((target) => ({\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: false,\n }))\n const frontend = await frontendTask\n return frontend.runMiniFrontend({\n host: createMiniHost({ terminal, directory }),\n sdk,\n directory,\n target: resolveTarget,\n reconnect: connection.reconnect,\n createSession: create,\n agent: input.agent,\n model,\n variant: requested?.variant,\n files: [],\n initialInput,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n config: input.config,\n })\n })\n if (result.exitCode !== 0) process.exit(result.exitCode)\n } catch (error) {\n if (error instanceof MiniInputError || (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR))\n fail(error.message)\n throw error\n }\n}\n\n/** @internal Exported for CLI boundary tests. */\nexport function createMiniConnection(input: MiniCommandInput[\"server\"]) {\n const make = (endpoint: Endpoint) =>\n OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n })\n const reconnect = input.reconnect\n return {\n sdk: make(input.endpoint),\n reconnect: reconnect\n ? async (signal: AbortSignal) => {\n const endpoint = await reconnect(signal)\n return make(endpoint)\n }\n : undefined,\n }\n}\n\n/** @internal Exported for reconnect lifecycle tests. */\nexport async function resolveMiniTarget<A>(input: {\n sdk: OpenCodeClient\n reconnect?: (signal: AbortSignal) => Promise<OpenCodeClient>\n signal: AbortSignal\n resolve: (sdk: OpenCodeClient) => Promise<A>\n}) {\n let sdk = input.sdk\n while (true) {\n try {\n return { sdk, value: await input.resolve(sdk) }\n } catch (error) {\n if (!input.reconnect || !(error instanceof ClientError) || error.reason !== \"Transport\") throw error\n while (true) {\n try {\n sdk = await input.reconnect(input.signal)\n break\n } catch (resolveError) {\n if (input.signal.aborted) throw resolveError\n await setTimeout(250, undefined, { signal: input.signal })\n }\n }\n }\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n throw new MiniInputError(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string) {\n try {\n return parseSessionTargetModel(value)\n } catch {\n throw new MiniInputError(\"--model must use the format provider/model[#variant]\")\n }\n}\n\nfunction prepareTarget(requestedAgent?: string): SessionTargetPreparation {\n return async (input) => ({ model: input.model, agent: requestedAgent ?? input.agent })\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n", | ||
| "import type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { createModelPreferenceRepository } from \"@opencode-ai/tui/model-preference\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport fs from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { ReadStream } from \"node:tty\"\n\nexport const INTERACTIVE_INPUT_ERROR = \"opencode mini requires a controlling terminal for input\"\n\nexport type InteractiveStdin = {\n stdin: NodeJS.ReadStream\n cleanup(): void\n}\n\ntype MiniHost = MiniFrontendInput[\"host\"]\n\nfunction preferences(statePath: string): MiniHost[\"preferences\"] {\n const repository = createModelPreferenceRepository(path.join(statePath, \"model.json\"))\n return {\n async resolveVariant(model) {\n if (!model) return\n return repository.resolveVariant(model)\n },\n async saveVariant(model, variant) {\n if (!model) return\n await repository.saveVariant(model, variant).catch(() => undefined)\n },\n }\n}\n\nfunction signal(name: \"SIGINT\" | \"SIGUSR2\"): MiniHost[\"signals\"][\"sigint\"] {\n return {\n subscribe(listener) {\n let subscribed = true\n process.on(name, listener)\n return () => {\n if (!subscribed) return\n subscribed = false\n process.off(name, listener)\n }\n },\n }\n}\n\nfunction createTrace(\n logPath: string,\n diagnostics: { pid: number; cwd: string; argv: string[] },\n): MiniHost[\"diagnostics\"][\"trace\"] {\n if (!process.env.OPENCODE_DIRECT_TRACE) return\n const stamp = new Date()\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\.\\d+Z$/, \"Z\")\n const target = path.join(logPath, \"direct\", `${stamp}-${diagnostics.pid}.jsonl`)\n const text = (data: unknown) =>\n JSON.stringify(data, (_key, value) => (typeof value === \"bigint\" ? String(value) : value), 0)\n fs.mkdirSync(path.dirname(target), { recursive: true })\n fs.writeFileSync(\n path.join(logPath, \"direct\", \"latest.json\"),\n text({\n time: new Date().toISOString(),\n ...diagnostics,\n path: target,\n }) + \"\\n\",\n )\n const trace = {\n write(type: string, data?: unknown) {\n fs.appendFileSync(\n target,\n text({\n time: new Date().toISOString(),\n pid: diagnostics.pid,\n type,\n data,\n }) + \"\\n\",\n )\n },\n }\n trace.write(\"trace.start\", {\n argv: diagnostics.argv,\n cwd: diagnostics.cwd,\n path: target,\n })\n return trace\n}\n\nfunction openTerminalStdin(target: string): NodeJS.ReadStream {\n return new ReadStream(fs.openSync(target, \"r\"))\n}\n\nexport function resolveInteractiveStdin(\n stdin: NodeJS.ReadStream = process.stdin,\n open: (target: string) => NodeJS.ReadStream = openTerminalStdin,\n platform: NodeJS.Platform = process.platform,\n): InteractiveStdin {\n if (stdin.isTTY) return { stdin, cleanup() {} }\n const target = platform === \"win32\" ? \"CONIN$\" : \"/dev/tty\"\n try {\n const source = open(target)\n let cleaned = false\n return {\n stdin: source,\n cleanup() {\n if (cleaned) return\n cleaned = true\n source.destroy()\n },\n }\n } catch (error) {\n throw new Error(INTERACTIVE_INPUT_ERROR, { cause: error })\n }\n}\n\n/** @internal Exported for owner-local resource cleanup tests. */\nexport async function usingInteractiveStdin<T>(\n run: (terminal: InteractiveStdin) => Promise<T>,\n resolve: () => InteractiveStdin = resolveInteractiveStdin,\n) {\n const terminal = resolve()\n try {\n return await run(terminal)\n } finally {\n terminal.cleanup()\n }\n}\n\n/** @internal Exported for owner-local host capability tests. */\nexport function createMiniHost(input: {\n terminal: InteractiveStdin\n directory: string\n paths?: { home: string; state: string; log: string }\n}): MiniHost {\n const paths = input.paths ?? {\n home: Global.Path.home,\n state: Global.Path.state,\n log: Global.Path.log,\n }\n const diagnostics = {\n pid: process.pid,\n cwd: input.directory,\n argv: process.argv.slice(2),\n }\n return {\n terminal: { stdin: input.terminal.stdin },\n platform: process.platform,\n stdout: {\n write(value) {\n process.stdout.write(value)\n },\n },\n files: {\n readText: (url) => readFile(new URL(url), \"utf8\"),\n },\n editor: {\n async open(options) {\n const { openEditor } = await import(\"@opencode-ai/tui/editor\")\n return openEditor(options)\n },\n },\n paths: { home: paths.home },\n signals: {\n sigint: signal(\"SIGINT\"),\n sigusr2: signal(\"SIGUSR2\"),\n },\n startup: {\n showTiming: [\"1\", \"true\"].includes(process.env.OPENCODE_SHOW_TTFD?.toLowerCase() ?? \"\"),\n now: () => performance.now(),\n },\n diagnostics: {\n trace: createTrace(paths.log, diagnostics),\n },\n preferences: preferences(paths.state),\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "2994E88AA725884064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/server-connection.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { OPENCODE_VERSION } from \"../version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: EnsureOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Endpoint\n readonly service?: ReturnType<typeof managedService>\n}\n\nexport const resolve = Effect.fn(\"cli.server-connection.resolve\")(function* (args: Args) {\n if (args.server !== undefined && args.standalone)\n return yield* Effect.fail(new Error(\"--server and --standalone cannot be combined\"))\n if (args.server !== undefined) {\n const password = yield* Env.password\n const endpoint = {\n url: args.server,\n auth: password ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) } : undefined,\n } satisfies Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== OPENCODE_VERSION)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${OPENCODE_VERSION}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const options = yield* ServiceConfig.options()\n return {\n endpoint: yield* resolveManaged({ ...options, onStart: args.onStart }, args.mismatch ?? \"replace\"),\n service: managedService(options),\n } satisfies Resolved\n})\n\nfunction managedService(options: EnsureOptions) {\n const reconnectOptions = { ...options, version: undefined }\n return {\n reconnect: () => Service.ensure(reconnectOptions),\n restart: () =>\n Effect.gen(function* () {\n yield* Service.stop(options)\n yield* Service.ensure(reconnectOptions)\n }),\n }\n}\n\nconst resolveManaged = Effect.fnUntraced(function* (\n options: EnsureOptions,\n mismatch: NonNullable<Args[\"mismatch\"]>,\n) {\n if (mismatch === \"replace\") return yield* Service.ensure(options)\n if (mismatch === \"ignore\") return yield* Service.ensure({ ...options, version: undefined })\n\n const compatible = yield* Service.discover(options)\n if (compatible !== undefined) return compatible\n const existing = yield* Service.discover({ ...options, version: undefined })\n if (existing !== undefined)\n return yield* Effect.fail(new Error(\"Background server version does not match this client\"))\n return yield* Service.ensure(options)\n})\n\nfunction connectError(endpoint: Endpoint, cause: unknown) {\n if (isUnauthorizedError(cause)) {\n return new Error(\n endpoint.auth === undefined\n ? `Server at ${endpoint.url} requires a password; set OPENCODE_PASSWORD`\n : `Server at ${endpoint.url} rejected the password`,\n { cause },\n )\n }\n if (cause instanceof ClientError && cause.reason === \"Transport\")\n return new Error(`Could not reach server at ${endpoint.url}`, { cause })\n return new Error(`Server at ${endpoint.url} did not provide a compatible V2 health response`, { cause })\n}\n\nexport * as ServerConnection from \"./server-connection\"\n" | ||
| ], | ||
| "mappings": ";0cAoBO,SAAM,OAAU,OAAO,QAAG,oCAA+B,OAAE,cAAU,CAAC,EAAY,CACvF,GAAI,EAAK,SAAW,QAAa,EAAK,WACpC,OAAO,MAAO,EAAO,KAAS,MAAM,8CAA8C,CAAC,EACrF,GAAI,EAAK,SAAW,OAAW,CAC7B,IAAM,EAAW,MAAO,EAAI,SACtB,EAAW,CACf,IAAK,EAAK,OACV,KAAM,EAAW,CAAE,KAAM,QAAkB,SAAU,WAAY,SAAU,EAAS,MAAM,CAAQ,CAAE,EAAI,MAC1G,EACM,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAS,MAAO,EAAO,WAAW,CACtC,IAAK,IAAM,EAAO,OAAO,IAAI,CAAE,OAAQ,YAAY,QAAQ,IAAK,CAAE,CAAC,EACnE,MAAO,CAAC,IAAU,EAAa,EAAU,CAAK,CAChD,CAAC,EACD,GAAI,EAAO,UAAY,EACrB,QAAQ,OAAO,MACb,sBAAsB,EAAS,mBAAmB,EAAO,2BAA2B;AAAA,CACtF,EACF,MAAO,CAAE,UAAS,EAEpB,GAAI,EAAK,WACP,MAAO,CAAE,SAAU,MAAO,EAAW,MAAM,CAAE,EAG/C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAC7C,MAAO,CACL,SAAU,MAAO,EAAe,IAAK,EAAS,QAAS,EAAK,OAAQ,EAAG,EAAK,UAAY,SAAS,EACjG,QAAS,EAAe,CAAO,CACjC,EACD,EAED,SAAS,CAAc,CAAC,EAAwB,CAC9C,IAAM,EAAmB,IAAK,EAAS,QAAS,MAAU,EAC1D,MAAO,CACL,UAAW,IAAM,EAAQ,OAAO,CAAgB,EAChD,QAAS,IACP,EAAO,IAAI,SAAU,EAAG,CACtB,MAAO,EAAQ,KAAK,CAAO,EAC3B,MAAO,EAAQ,OAAO,CAAgB,EACvC,CACL,EAGF,IAAM,EAAiB,EAAO,WAAW,SAAU,CACjD,EACA,EACA,CACA,GAAI,IAAa,UAAW,OAAO,MAAO,EAAQ,OAAO,CAAO,EAChE,GAAI,IAAa,SAAU,OAAO,MAAO,EAAQ,OAAO,IAAK,EAAS,QAAS,MAAU,CAAC,EAE1F,IAAM,EAAa,MAAO,EAAQ,SAAS,CAAO,EAClD,GAAI,IAAe,OAAW,OAAO,EAErC,IADiB,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,KAC1D,OACf,OAAO,MAAO,EAAO,KAAS,MAAM,sDAAsD,CAAC,EAC7F,OAAO,MAAO,EAAQ,OAAO,CAAO,EACrC,EAED,SAAS,CAAY,CAAC,EAAoB,EAAgB,CACxD,GAAI,EAAoB,CAAK,EAC3B,OAAW,MACT,EAAS,OAAS,OACd,aAAa,EAAS,iDACtB,aAAa,EAAS,4BAC1B,CAAE,OAAM,CACV,EAEF,GAAI,aAAiB,GAAe,EAAM,SAAW,YACnD,OAAW,MAAM,6BAA6B,EAAS,MAAO,CAAE,OAAM,CAAC,EACzE,OAAW,MAAM,aAAa,EAAS,sDAAuD,CAAE,OAAM,CAAC", | ||
| "debugId": "559E6EF5AFB302A164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/stop.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.stop,\n Effect.fn(\"cli.service.stop\")(function* () {\n yield* Service.stop(yield* ServiceConfig.options())\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+0BAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,OAAQ,UAAK,WAAO,OAAc,aAAQ,MAAC,EACnD,CACH", | ||
| "debugId": "708CBF61CC3A534864756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/debug/agents.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.agents,\n Effect.fn(\"cli.debug.agents\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";83BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC1G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzD,KACA,CACF,EAAI,CACN,EACD,CACH", | ||
| "debugId": "A7C647FE3BB2567964756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/start.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.start,\n Effect.fn(\"cli.service.start\")(function* () {\n const transport = yield* Service.ensure(yield* ServiceConfig.options())\n process.stdout.write(transport.url + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+0BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,MAC1C,SAAM,OAAY,WAAO,OAAQ,YAAO,MAAO,EAAc,QAAQ,CAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "9ACC856DE1AF0E2064756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/run.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(Commands.commands.run, (input) =>\n Effect.gen(function* () {\n const { runNonInteractive } = yield* Effect.promise(() => import(\"../../run/run\"))\n const separator = process.argv.indexOf(\"--\", 2)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n yield* Effect.promise(() =>\n runNonInteractive({\n server,\n message: [...input.message, ...(separator === -1 ? [] : process.argv.slice(separator + 1))],\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n format: input.format,\n file: [...input.file],\n title: Option.getOrUndefined(input.title),\n thinking: input.thinking,\n auto: input.auto || input.yolo,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+9BAKA,SAAe,SAAQ,aAAQ,OAAS,cAAS,SAAK,MAAC,SACrD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,0BAAsB,WAAO,OAAO,aAAQ,SAAa,wCAAgB,OAC3E,OAAY,aAAQ,UAAK,aAAQ,UAAM,MAAC,EACxC,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACD,MAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,IAC5B,CAAC,CACH,EACD,CACH", | ||
| "debugId": "741EAB9563D6410A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/api.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nconst methods = new Set([\"delete\", \"get\", \"head\", \"options\", \"patch\", \"post\", \"put\"])\n\ntype Operation = {\n operationId?: string\n}\n\ntype OpenApi = {\n paths?: Record<string, Record<string, Operation>>\n}\n\nexport default Runtime.handler(\n Commands.commands.api,\n Effect.fn(\"cli.api\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n mismatch: \"ignore\",\n })\n const endpoint = server.endpoint\n const params = Option.getOrElse(input.param, () => ({}))\n const request = yield* resolveRequest(endpoint, input.request, params)\n const headers = new Headers(Service.headers(endpoint))\n for (const header of input.header) {\n const index = header.indexOf(\":\")\n if (index < 1) return yield* Effect.fail(new Error(`Invalid header, expected name:value: ${header}`))\n headers.set(header.slice(0, index).trim(), header.slice(index + 1).trim())\n }\n const body = Option.getOrUndefined(input.data)\n if (body !== undefined && !headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\")\n\n const response = yield* Effect.tryPromise(() =>\n fetch(new URL(request.path, endpoint.url), {\n method: request.method,\n headers,\n body,\n }),\n )\n const output = yield* Effect.promise(() => response.text())\n if (output) process.stdout.write(output + (output.endsWith(EOL) ? \"\" : EOL))\n }),\n)\n\nexport function resolveOperation(spec: OpenApi, operationID: string, params: Record<string, string>) {\n for (const [path, operations] of Object.entries(spec.paths ?? {})) {\n for (const [method, operation] of Object.entries(operations)) {\n if (!methods.has(method) || operation.operationId !== operationID) continue\n return { method: method.toUpperCase(), path: interpolate(path, params) }\n }\n }\n throw new Error(`Operation not found: ${operationID}`)\n}\n\nexport function rawRequest(input: readonly string[]) {\n if (input.length !== 2 || !methods.has(input[0].toLowerCase()) || !input[1].startsWith(\"/\")) return\n return { method: input[0].toUpperCase(), path: input[1] }\n}\n\nfunction resolveRequest(endpoint: Endpoint, input: readonly string[], params: Record<string, string>) {\n const raw = rawRequest(input)\n if (raw) return Effect.succeed(raw)\n if (input.length !== 1) return Effect.fail(new Error(\"Expected an operation name or an HTTP method and path\"))\n return Effect.tryPromise(async () => {\n const response = await fetch(new URL(\"/openapi.json\", endpoint.url), { headers: Service.headers(endpoint) })\n if (!response.ok) throw new Error(`Failed to load OpenAPI document: HTTP ${response.status}`)\n return resolveOperation((await response.json()) as OpenApi, input[0], params)\n })\n}\n\nfunction interpolate(path: string, params: Record<string, string>) {\n const used = new Set<string>()\n const pathname = path.replaceAll(/\\{([^}]+)\\}/g, (_, name: string) => {\n const value = params[name]\n if (value === undefined) throw new Error(`Missing path parameter: ${name}`)\n used.add(name)\n return encodeURIComponent(value)\n })\n const query = new URLSearchParams(Object.entries(params).filter(([name]) => !used.has(name))).toString()\n return query ? `${pathname}?${query}` : pathname\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "10280EA5ACB8F12E64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mini.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Effect, FileSystem, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { Config } from \"../../config\"\nimport { resolve } from \"@opencode-ai/tui/config\"\n\nexport default Runtime.handler(Commands.commands.mini, (input) =>\n Effect.gen(function* () {\n const { runMini, validateMiniTerminal } = yield* Effect.promise(() => import(\"../../mini\"))\n yield* Effect.promise(async () => validateMiniTerminal())\n const serverURL = Option.getOrUndefined(input.server)\n const server = yield* ServerConnection.resolve({ server: serverURL, standalone: input.standalone })\n const config = yield* Config.Service\n const resolved = resolve(yield* config.get(), { terminalSuspend: process.platform !== \"win32\" })\n const fileSystem = yield* FileSystem.FileSystem\n const runServicePromise = Effect.runPromiseWith(Context.make(FileSystem.FileSystem, fileSystem))\n const service = server.service\n yield* Effect.promise(() =>\n runMini({\n server: {\n endpoint: server.endpoint,\n reconnect: service ? (signal) => runServicePromise(service.reconnect(), { signal }) : undefined,\n },\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: input.replay,\n replayLimit: Option.getOrUndefined(input.replayLimit),\n demo: input.demo,\n tuiConfig: resolved,\n config: {\n update: (update) => runServicePromise(config.update(update)),\n },\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";ogCAOA,SAAe,SAAQ,aAAQ,OAAS,cAAS,UAAM,MAAC,SACtD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,eAAS,6BAAyB,WAAO,OAAO,aAAQ,SAAa,wCAAa,OAC1F,WAAO,OAAO,aAAQ,cAAY,OAAqB,CAAC,EACxD,IAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAiB,QAAQ,CAAE,OAAQ,EAAW,WAAY,EAAM,UAAW,CAAC,EAC5F,EAAS,MAAO,EAAO,QACvB,EAAW,EAAQ,MAAO,EAAO,IAAI,EAAG,CAAE,gBAAiB,EAA6B,CAAC,EACzF,EAAa,MAAO,EAAW,WAC/B,EAAoB,EAAO,eAAe,EAAQ,KAAK,EAAW,WAAY,CAAU,CAAC,EACzF,EAAU,EAAO,QACvB,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,OAAQ,CACN,SAAU,EAAO,SACjB,UAAW,EAAU,CAAC,IAAW,EAAkB,EAAQ,UAAU,EAAG,CAAE,QAAO,CAAC,EAAI,MACxF,EACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAM,OACd,YAAa,EAAO,eAAe,EAAM,WAAW,EACpD,KAAM,EAAM,KACZ,UAAW,EACX,OAAQ,CACN,OAAQ,CAAC,IAAW,EAAkB,EAAO,OAAO,CAAM,CAAC,CAC7D,CACF,CAAC,CACH,EACD,CACH", | ||
| "debugId": "2052B4722717971764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/get.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.get,\n Effect.fn(\"cli.service.get\")(function* (input) {\n process.stdout.write((yield* ServiceConfig.get(Option.getOrUndefined(input.key))) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";00BAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,aAAQ,YAAO,YAAO,WAAO,EAAc,IAAI,EAAO,eAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH", | ||
| "debugId": "3D18391EA78871E664756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/tool.ts"], | ||
| "sourcesContent": [ | ||
| "// Per-tool display rules shared across `opencode run` output paths.\n//\n// Each known tool (shell, edit, write, subagent, etc.) has a ToolRule that controls\n// four display hooks:\n//\n// view → visibility policy for progress/final scrollback entries and\n// whether completed finals can render as structured snapshots\n// run → inline summary for the non-interactive `run` command output\n// scroll → text formatting for start/progress/final scrollback entries\n// snap → structured snapshot (code block, diff, task card) for rich\n// scrollback entries\n//\n// Tools not in TOOL_RULES get fallback formatting.\nimport os from \"os\"\nimport path from \"path\"\nimport stripAnsi from \"strip-ansi\"\nimport type { SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { LANGUAGE_EXTENSIONS } from \"../util/filetype\"\nimport { Locale } from \"../util/locale\"\nimport {\n canonicalToolName,\n finiteNumber,\n primitiveInputSummary,\n toolDisplayMetadata,\n webSearchProviderLabel,\n} from \"../util/tool-display\"\nimport { formatPath } from \"../util/path-format\"\nimport type { RunEntryBody, StreamCommit, ToolSnapshot } from \"./types\"\n\nexport type { MiniToolPart } from \"./types\"\nexport { canonicalToolName } from \"../util/tool-display\"\n\nexport type ToolView = {\n output: boolean\n final: boolean\n snap?: \"code\" | \"diff\" | \"structured\"\n}\n\nexport type ToolPhase = \"start\" | \"progress\" | \"final\"\n\nexport type ToolDict = Record<string, unknown>\n\ntype PatchFile = {\n status?: string\n file?: string\n from?: string\n patch?: string\n deletions?: number\n}\n\ntype ToolInput = ToolDict & {\n id?: string\n path?: string\n pattern?: string\n url?: string\n query?: string\n agent?: string\n description?: string\n name?: string\n operation?: string\n line?: number\n character?: number\n content?: string\n command?: string\n workdir?: string\n questions?: Array<{ question?: string }>\n diff?: string\n}\n\ntype ToolMetadata = ToolDict & {\n name?: string\n count?: number\n matches?: number\n diff?: string\n provider?: unknown\n files?: PatchFile[]\n answers?: string[][]\n exit?: number\n}\n\nexport type ToolFrame = {\n directory?: string\n raw: string\n name: string\n input: ToolDict\n meta: ToolDict\n state: ToolDict\n status: string\n error: string\n output: string\n time: {\n start?: number\n end?: number\n }\n}\n\nexport type ToolInline = {\n icon: string\n title: string\n description?: string\n mode?: \"inline\" | \"block\"\n body?: string\n}\n\nexport type ToolProps = {\n input: ToolInput\n metadata: ToolMetadata\n frame: ToolFrame\n}\n\ntype ToolName =\n | \"invalid\"\n | \"shell\"\n | \"write\"\n | \"edit\"\n | \"patch\"\n | \"batch\"\n | \"subagent\"\n | \"question\"\n | \"read\"\n | \"glob\"\n | \"grep\"\n | \"list\"\n | \"lsp\"\n | \"webfetch\"\n | \"websearch\"\n | \"skill\"\n | \"plan_exit\"\n\ntype ToolRule = {\n view: ToolView\n run: (props: ToolProps) => ToolInline\n scroll?: Partial<Record<ToolPhase, (props: ToolProps) => string>>\n snap?: (props: ToolProps) => ToolSnapshot | undefined\n}\n\ntype ToolRegistry = Record<ToolName, ToolRule>\n\ntype AnyToolRule = ToolRule\n\nfunction dict(v: unknown): ToolDict {\n if (!v || typeof v !== \"object\" || Array.isArray(v)) {\n return {}\n }\n\n return { ...v }\n}\n\nfunction props(frame: ToolFrame): ToolProps {\n return {\n input: frame.input,\n metadata: frame.meta,\n frame,\n }\n}\n\nfunction text(v: unknown): string {\n return typeof v === \"string\" ? v : \"\"\n}\n\nexport function toolOutputText(name: string, content: ReadonlyArray<{ type: string; text?: string }>) {\n // V2 shell content appends model-only status after the user-visible command output.\n if (canonicalToolName(name) === \"shell\") return content.find((item) => item.type === \"text\")?.text ?? \"\"\n return content.flatMap((item) => (item.type === \"text\" && item.text ? [item.text] : [])).join(\"\\n\")\n}\n\nfunction normalizeInput(name: string, value: unknown) {\n const input = dict(value)\n const path = typeof input.path === \"string\" ? input.path : text(input.filePath) || text(input.filepath)\n const agent = typeof input.agent === \"string\" ? input.agent : text(input.subagent_type)\n return {\n ...input,\n ...([\"read\", \"write\", \"edit\", \"lsp\"].includes(name) && path ? { path } : {}),\n ...(name === \"subagent\" && agent ? { agent } : {}),\n }\n}\n\nfunction normalizeFile(value: unknown): PatchFile | undefined {\n const file = dict(value)\n const name = text(file.file) || text(file.relativePath) || text(file.filePath)\n if (!name) return\n const legacy = text(file.type)\n const status =\n text(file.status) ||\n (legacy === \"add\"\n ? \"added\"\n : legacy === \"delete\"\n ? \"deleted\"\n : legacy === \"update\"\n ? \"modified\"\n : legacy === \"move\"\n ? \"moved\"\n : legacy)\n const patch = typeof file.patch === \"string\" ? file.patch : text(file.diff) || undefined\n const deletions = finiteNumber(file.deletions)\n return {\n ...file,\n file: name,\n ...(status === \"moved\" && text(file.filePath) ? { from: text(file.filePath) } : {}),\n ...(status ? { status } : {}),\n ...(patch === undefined ? {} : { patch }),\n ...(deletions === undefined ? {} : { deletions }),\n }\n}\n\nfunction normalizeStructured(name: string, value: unknown) {\n const structured = dict(value)\n const files = list(structured.files).flatMap((item) => {\n const file = normalizeFile(item)\n return file ? [file] : []\n })\n const sessionID = text(structured.sessionID) || text(structured.sessionId)\n return {\n ...structured,\n ...([\"edit\", \"patch\"].includes(name) && Array.isArray(structured.files) ? { files } : {}),\n ...(name === \"subagent\" && sessionID ? { sessionID } : {}),\n ...(name === \"shell\" &&\n finiteNumber(structured.exit) === undefined &&\n finiteNumber(structured.exitCode) !== undefined\n ? { exit: finiteNumber(structured.exitCode) }\n : {}),\n }\n}\n\nexport function normalizeTool(tool: SessionMessageAssistantTool): SessionMessageAssistantTool {\n const name = canonicalToolName(tool.name)\n if (tool.state.status === \"streaming\") return { ...tool, name }\n return {\n ...tool,\n name,\n state: {\n ...tool.state,\n input: normalizeInput(name, tool.state.input),\n structured: normalizeStructured(name, toolDisplayMetadata(tool.state)),\n },\n } as SessionMessageAssistantTool\n}\n\nfunction list<T>(v: unknown): T[] {\n if (!Array.isArray(v)) {\n return []\n }\n\n return v\n}\n\nfunction span(frame: ToolFrame): string {\n const start = frame.time.start\n const end = frame.time.end\n if (start === undefined || end === undefined || end <= start) {\n return \"\"\n }\n\n return Locale.duration(end - start)\n}\n\nfunction fail(ctx: ToolFrame): string {\n const error = toolError(ctx)\n if (error) {\n return `✖ ${ctx.name} failed: ${error}`\n }\n\n return `✖ ${ctx.name} failed`\n}\n\nfunction toolError(ctx: ToolFrame): string {\n if (ctx.error) {\n return ctx.error\n }\n\n const state = text(ctx.state.error).trim()\n if (state) {\n return state\n }\n\n return ctx.raw.trim()\n}\n\nfunction fallbackStart(ctx: ToolFrame): string {\n const extra = primitiveInputSummary(ctx.input)\n if (!extra) {\n return `⚙ ${ctx.name}`\n }\n\n return `⚙ ${ctx.name} ${extra}`\n}\n\nfunction fallbackFinal(ctx: ToolFrame): string {\n if (ctx.status === \"error\") {\n return fail(ctx)\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return ctx.raw.trim()\n }\n\n const time = span(ctx)\n if (!time) {\n return `${ctx.name} completed`\n }\n\n return `${ctx.name} completed · ${time}`\n}\n\nexport function toolPath(input?: string, opts: { home?: boolean; directory?: string } = {}): string {\n return formatPath(input, {\n base: opts.directory ?? process.cwd(),\n home: opts.home ? os.homedir() : undefined,\n forwardSlashes: true,\n })\n}\n\nfunction displayPath(p: ToolProps, input?: string, opts: { home?: boolean } = {}) {\n return toolPath(input, { ...opts, directory: p.frame.directory })\n}\n\nfunction fallbackInline(ctx: ToolFrame): ToolInline {\n const title = Object.keys(ctx.input).length > 0 ? JSON.stringify(ctx.input) : \"Unknown\"\n\n return {\n icon: \"⚙\",\n title: `${ctx.name} ${title}`,\n }\n}\n\nfunction count(n: number, label: string): string {\n return `${n} ${label}${n === 1 ? \"\" : \"es\"}`\n}\n\nfunction runGlob(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Glob \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${displayPath(p, root)}` : \"\"\n const matches = p.metadata.count\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runGrep(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Grep \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${displayPath(p, root)}` : \"\"\n const matches = p.metadata.matches\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runList(p: ToolProps): ToolInline {\n const dir = text(dict(p.input).path)\n return {\n icon: \"→\",\n title: dir ? `List ${displayPath(p, dir)}` : \"List\",\n }\n}\n\nfunction runRead(p: ToolProps): ToolInline {\n const file = displayPath(p, p.input.path)\n const description = primitiveInputSummary(p.frame.input, [\"path\"]) || undefined\n return {\n icon: \"→\",\n title: `Read ${file}`,\n ...(description && { description }),\n }\n}\n\nfunction runWrite(p: ToolProps): ToolInline {\n return {\n icon: \"←\",\n title: `Write ${displayPath(p, p.input.path)}`,\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction runWebfetch(p: ToolProps): ToolInline {\n const url = p.input.url ?? \"\"\n return {\n icon: \"%\",\n title: url ? `WebFetch ${url}` : \"WebFetch\",\n }\n}\n\nfunction runEdit(p: ToolProps): ToolInline {\n const file = list<PatchFile>(p.metadata.files)[0]\n return {\n icon: \"←\",\n title: `Edit ${displayPath(p, p.input.path)}`,\n mode: \"block\",\n body: file?.patch ?? p.metadata.diff,\n }\n}\n\nfunction runWebSearch(p: ToolProps): ToolInline {\n const title = webSearchProviderLabel(p.metadata.provider)\n return {\n icon: \"◈\",\n title: p.input.query ? `${title} \"${p.input.query}\"` : title,\n }\n}\n\nfunction runTask(p: ToolProps): ToolInline {\n const kind = Locale.titlecase(p.input.agent || \"unknown\")\n const desc = p.input.description\n const icon = p.frame.status === \"error\" ? \"✗\" : p.frame.status === \"running\" ? \"•\" : \"✓\"\n return {\n icon,\n title: desc || `${kind} Subagent`,\n description: desc ? `${kind} Agent` : undefined,\n }\n}\n\nfunction runSkill(p: ToolProps): ToolInline {\n const name = p.metadata.name ?? p.input.id ?? \"\"\n return {\n icon: \"→\",\n title: `Skill \"${name}\"`,\n }\n}\n\nfunction runPatch(p: ToolProps): ToolInline {\n const files = p.metadata.files?.length ?? 0\n if (files === 0) {\n return {\n icon: \"%\",\n title: \"Patch\",\n }\n }\n\n return {\n icon: \"%\",\n title: `Patch ${files} file${files === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runQuestion(p: ToolProps): ToolInline {\n const total = list(p.frame.input.questions).length\n return {\n icon: \"→\",\n title: `Asked ${total} question${total === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runInvalid(p: ToolProps): ToolInline {\n return {\n icon: \"✗\",\n title: \"Invalid Tool\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction runBatch(p: ToolProps): ToolInline {\n const calls = list(dict(p.input).tool_calls).length\n return {\n icon: \"#\",\n title: calls > 0 ? `Batch ${calls} tool${calls === 1 ? \"\" : \"s\"}` : \"Batch\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction lspTitle(\n input: {\n operation?: string\n path?: string\n line?: number\n character?: number\n },\n opts: { home?: boolean; directory?: string } = {},\n): string {\n const op = input.operation || \"request\"\n const file = input.path ? toolPath(input.path, opts) : \"\"\n const line = typeof input.line === \"number\" ? input.line : undefined\n const char = typeof input.character === \"number\" ? input.character : undefined\n const pos = line !== undefined && char !== undefined ? `:${line}:${char}` : \"\"\n if (!file) {\n return `LSP ${op}`\n }\n\n return `LSP ${op} ${file}${pos}`\n}\n\nfunction runLsp(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: lspTitle(p.input, { directory: p.frame.directory }),\n }\n}\n\nfunction runPlanExit(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: \"Switching to build agent\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction patchTitle(file: PatchFile, directory?: string): string {\n if (file.status === \"added\") {\n return `# Created ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"deleted\") {\n return `# Deleted ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"moved\") {\n return `# Moved ${toolPath(file.from, { directory })} -> ${toolPath(file.file, { directory })}`\n }\n\n return `# Patched ${toolPath(file.file, { directory })}`\n}\n\nfunction snapWrite(p: ToolProps): ToolSnapshot | undefined {\n const file = p.input.path || \"\"\n const content = p.input.content || \"\"\n if (!file && !content) {\n return undefined\n }\n\n return {\n kind: \"code\",\n title: `# Wrote ${displayPath(p, file)}`,\n content,\n file,\n }\n}\n\nfunction snapEdit(p: ToolProps): ToolSnapshot | undefined {\n const item = list<PatchFile>(p.metadata.files)[0]\n const file = item?.file || p.input.path || \"\"\n const diff = item?.patch || p.metadata.diff || \"\"\n if (!file || !diff.trim()) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items: [\n {\n title: `# Edited ${displayPath(p, file)}`,\n diff,\n file,\n },\n ],\n }\n}\n\nfunction snapPatch(p: ToolProps): ToolSnapshot | undefined {\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n return undefined\n }\n\n const items = files.flatMap((file) => {\n if (!file || typeof file !== \"object\") {\n return []\n }\n\n const diff = typeof file.patch === \"string\" ? file.patch : \"\"\n if (!diff.trim()) {\n return []\n }\n\n const name = file.file\n return [\n {\n title: patchTitle(file, p.frame.directory),\n diff,\n file: name,\n deletions: typeof file.deletions === \"number\" ? file.deletions : 0,\n },\n ]\n })\n\n if (items.length !== files.length) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items,\n }\n}\n\nfunction snapTask(p: ToolProps): ToolSnapshot {\n const kind = Locale.titlecase(p.input.agent || \"general\")\n const desc = p.input.description\n const rows = [desc].filter((item): item is string => Boolean(item))\n\n return {\n kind: \"task\",\n title: `# ${kind} Subagent`,\n rows,\n tail: \"\",\n }\n}\n\nfunction snapQuestion(p: ToolProps): ToolSnapshot {\n const answers = list<unknown[]>(p.frame.meta.answers)\n const items = list<{ question?: string }>(p.frame.input.questions).map((item, i) => {\n const answer = list<string>(answers[i]).filter((entry) => typeof entry === \"string\")\n return {\n question: item.question || `Question ${i + 1}`,\n answer: answer.length > 0 ? answer.join(\", \") : \"(no answer)\",\n }\n })\n\n return {\n kind: \"question\",\n items,\n tail: \"\",\n }\n}\n\nfunction scrollBashStart(p: ToolProps): string {\n const cmd = p.input.command ?? \"\"\n const wd = p.input.workdir ?? \"\"\n const formatted = wd && wd !== \".\" ? displayPath(p, wd) : \"\"\n const dir = formatted === \".\" ? \"\" : formatted\n if (cmd && !dir) {\n return `$ ${cmd}`\n }\n\n if (!cmd) {\n return dir ? `# Running in ${dir}` : \"\"\n }\n\n return `# Running in ${dir}\\n$ ${cmd}`\n}\n\nfunction scrollBashProgress(p: ToolProps): string {\n const out = stripAnsi(p.frame.raw)\n const cmd = (p.input.command ?? \"\").trim()\n const fmt = (text: string) => {\n const body = text.replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n return body ? `\\n${body}` : \"\"\n }\n\n if (!cmd) {\n return out.replace(/\\n+$/, \"\")\n }\n\n const wdRaw = (p.input.workdir ?? \"\").trim()\n const wd = wdRaw ? displayPath(p, wdRaw) : \"\"\n const lines = out.split(\"\\n\")\n const first = (lines[0] || \"\").trim()\n const second = (lines[1] || \"\").trim()\n\n if (wd && (first === wd || first === wdRaw) && second === cmd) {\n return fmt(lines.slice(2).join(\"\\n\"))\n }\n\n if (first === cmd || first === `$ ${cmd}`) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n if (wd && (first === `${wd} ${cmd}` || first === `${wdRaw} ${cmd}`)) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n return fmt(out)\n}\n\nfunction scrollShellFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const code = p.metadata.exit ?? finiteNumber(p.frame.meta.exitCode) ?? finiteNumber(p.frame.meta.exit_code)\n const time = span(p.frame)\n if (code === undefined) {\n if (!time) {\n return \"shell completed\"\n }\n\n return `shell completed · ${time}`\n }\n\n return `shell completed (exit ${code})${time ? ` · ${time}` : \"\"}`\n}\n\nfunction scrollReadStart(p: ToolProps): string {\n const file = displayPath(p, p.input.path)\n const extra = primitiveInputSummary(p.frame.input, [\"path\"])\n const tail = extra ? ` ${extra}` : \"\"\n return `→ Read ${file}${tail}`.trim()\n}\n\nfunction scrollWriteStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollEditStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollPatchStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction patchLine(file: PatchFile, directory?: string): string {\n if (file.status === \"added\") {\n return `+ Created ${toolPath(file.file, { directory })}`\n }\n\n if (file.status === \"deleted\") {\n return `- Deleted ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"moved\") {\n return `→ Moved ${toolPath(file.from, { directory })} → ${toolPath(file.file, { directory })}`\n }\n\n return `~ Patched ${toolPath(file.file, { directory })}`\n}\n\nfunction scrollPatchFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n const time = span(p.frame)\n if (!time) {\n return \"patch\"\n }\n\n return `patch · ${time}`\n }\n\n const showModified = !files.some((file) => file?.status && file.status !== \"modified\")\n const shown = files.filter((file) => showModified || file.status !== \"modified\")\n const rows = shown.slice(0, 6).map((file) => patchLine(file, p.frame.directory))\n if (shown.length > 6) {\n rows.push(`... and ${shown.length - 6} more`)\n }\n\n if (rows.length > 0) {\n return rows.join(\"\\n\")\n }\n\n return patchLine(files[0]!, p.frame.directory)\n}\n\nfunction scrollTaskStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction taskResult(output: string): string | undefined {\n if (!output.trim()) {\n return undefined\n }\n\n const match = output.match(/<task_result>\\s*([\\s\\S]*?)\\s*<\\/task_result>/)\n if (match) {\n return match[1].trim() || undefined\n }\n\n const next = output\n .split(\"\\n\")\n .filter((line) => !line.startsWith(\"task_id:\"))\n .join(\"\\n\")\n .trim()\n return next || undefined\n}\n\nfunction scrollTaskFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const kind = Locale.titlecase(p.input.agent || \"general\")\n const row = p.input.description\n if (!row) {\n return `# ${kind} Subagent`\n }\n\n return `# ${kind} Subagent\\n${row}`\n}\n\nfunction scrollQuestionStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollQuestionFinal(p: ToolProps): string {\n const q = p.input.questions ?? []\n const a = p.metadata.answers ?? []\n const time = span(p.frame)\n if (q.length === 0) {\n if (!time) {\n return \"0 questions\"\n }\n\n return `0 questions · ${time}`\n }\n\n const rows: string[] = []\n for (const [i, item] of q.slice(0, 4).entries()) {\n const prompt = item.question\n const reply = a[i] ?? []\n rows.push(`? ${prompt || `Question ${i + 1}`}`)\n rows.push(` ${reply.length > 0 ? reply.join(\", \") : \"(no answer)\"}`)\n }\n\n if (q.length > 4) {\n rows.push(`... and ${q.length - 4} more`)\n }\n\n return rows.join(\"\\n\")\n}\n\nfunction scrollLspStart(p: ToolProps): string {\n return `→ ${lspTitle(p.input, { directory: p.frame.directory })}`\n}\n\nfunction scrollSkillStart(p: ToolProps): string {\n return `→ Skill \"${p.metadata.name ?? p.input.id ?? \"\"}\"`\n}\n\nfunction scrollGlobStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Glob \"${pattern}\"` : \"✱ Glob\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${displayPath(p, dir)}`\n}\n\nfunction scrollGlobFinal(p: ToolProps): string {\n return toolError(p.frame) || fail(p.frame)\n}\n\nfunction scrollGrepStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Grep \"${pattern}\"` : \"✱ Grep\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${displayPath(p, dir)}`\n}\n\nfunction scrollListStart(p: ToolProps): string {\n const dir = text(dict(p.input).path)\n if (!dir) {\n return \"→ List\"\n }\n\n return `→ List ${displayPath(p, dir)}`\n}\n\nfunction scrollWebfetchStart(p: ToolProps): string {\n const url = p.input.url ?? \"\"\n if (!url) {\n return \"% WebFetch\"\n }\n\n return `% WebFetch ${url}`\n}\n\nfunction scrollWebSearchStart(p: ToolProps): string {\n const title = webSearchProviderLabel(p.metadata.provider)\n const query = p.input.query ?? \"\"\n if (!query) {\n return `◈ ${title}`\n }\n\n return `◈ ${title} \"${query}\"`\n}\n\nconst TOOL_RULES = {\n invalid: {\n view: {\n output: true,\n final: false,\n },\n run: runInvalid,\n scroll: {\n start: () => \"\",\n },\n },\n shell: {\n view: {\n output: true,\n final: false,\n },\n run: runShell,\n scroll: {\n start: scrollBashStart,\n progress: scrollBashProgress,\n final: scrollShellFinal,\n },\n },\n write: {\n view: {\n output: false,\n final: true,\n snap: \"code\",\n },\n run: runWrite,\n snap: snapWrite,\n scroll: {\n start: scrollWriteStart,\n },\n },\n edit: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runEdit,\n snap: snapEdit,\n scroll: {\n start: scrollEditStart,\n },\n },\n patch: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runPatch,\n snap: snapPatch,\n scroll: {\n start: scrollPatchStart,\n final: scrollPatchFinal,\n },\n },\n batch: {\n view: {\n output: true,\n final: false,\n },\n run: runBatch,\n scroll: {\n start: () => \"\",\n },\n },\n subagent: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runTask,\n snap: snapTask,\n scroll: {\n start: scrollTaskStart,\n final: scrollTaskFinal,\n },\n },\n question: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runQuestion,\n snap: snapQuestion,\n scroll: {\n start: scrollQuestionStart,\n final: scrollQuestionFinal,\n },\n },\n read: {\n view: {\n output: false,\n final: false,\n },\n run: runRead,\n scroll: {\n start: scrollReadStart,\n },\n },\n glob: {\n view: {\n output: false,\n final: false,\n },\n run: runGlob,\n scroll: {\n start: scrollGlobStart,\n final: scrollGlobFinal,\n },\n },\n grep: {\n view: {\n output: false,\n final: false,\n },\n run: runGrep,\n scroll: {\n start: scrollGrepStart,\n },\n },\n list: {\n view: {\n output: false,\n final: false,\n },\n run: runList,\n scroll: {\n start: scrollListStart,\n },\n },\n lsp: {\n view: {\n output: false,\n final: false,\n },\n run: runLsp,\n scroll: {\n start: scrollLspStart,\n },\n },\n webfetch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebfetch,\n scroll: {\n start: scrollWebfetchStart,\n },\n },\n websearch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebSearch,\n scroll: {\n start: scrollWebSearchStart,\n },\n },\n skill: {\n view: {\n output: false,\n final: false,\n },\n run: runSkill,\n scroll: {\n start: scrollSkillStart,\n },\n },\n plan_exit: {\n view: {\n output: true,\n final: false,\n },\n run: runPlanExit,\n scroll: {\n start: () => \"\",\n },\n },\n} as const satisfies ToolRegistry\n\nfunction key(name: string): name is ToolName {\n return Object.prototype.hasOwnProperty.call(TOOL_RULES, name)\n}\n\nfunction rule(name?: string): AnyToolRule | undefined {\n if (!name || !key(name)) {\n return undefined\n }\n\n return TOOL_RULES[name]\n}\n\nfunction frame(part: SessionMessageAssistantTool, directory?: string): ToolFrame {\n const tool = normalizeTool(part)\n if (tool.state.status === \"streaming\")\n return {\n directory,\n raw: tool.state.input,\n name: tool.name,\n input: {},\n meta: {},\n state: dict(tool.state),\n status: tool.state.status,\n error: \"\",\n output: \"\",\n time: { start: tool.time.created },\n }\n const output = toolOutputText(tool.name, tool.state.content)\n return {\n directory,\n raw: output,\n name: tool.name,\n input: normalizeInput(tool.name, tool.state.input),\n meta: normalizeStructured(tool.name, tool.state.structured),\n state: dict(tool.state),\n status: tool.state.status,\n error: tool.state.status === \"error\" ? tool.state.error.message : \"\",\n output,\n time: {\n start: tool.time.ran ?? tool.time.created,\n end: tool.time.completed,\n },\n }\n}\n\nexport function toolFrame(commit: StreamCommit, raw: string): ToolFrame {\n const current = commit.part ? frame(commit.part, commit.directory) : undefined\n return {\n directory: commit.directory,\n raw,\n name: canonicalToolName(commit.tool || current?.name || \"tool\"),\n input: current?.input ?? {},\n meta: current?.meta ?? {},\n state: current?.state ?? {},\n status: commit.toolState ?? current?.status ?? \"\",\n error: (commit.toolError ?? current?.error ?? \"\").trim(),\n output: current?.output ?? raw,\n time: current?.time ?? {},\n }\n}\n\nfunction runShell(p: ToolProps): ToolInline {\n return {\n icon: \"$\",\n title: p.input.command || \"\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output.trim() : undefined,\n }\n}\n\nexport function toolView(name?: string): ToolView {\n return (\n rule(name ? canonicalToolName(name) : undefined)?.view ?? {\n output: true,\n final: true,\n }\n )\n}\n\nexport function toolStructuredFinal(commit: StreamCommit): boolean {\n const state = commit.toolState ?? commit.part?.state.status\n return (\n commit.kind === \"tool\" &&\n commit.phase === \"final\" &&\n state === \"completed\" &&\n Boolean(toolView(commit.tool ?? commit.part?.name).snap)\n )\n}\n\nexport function toolInlineInfo(part: SessionMessageAssistantTool, directory?: string): ToolInline {\n const ctx = frame(part, directory)\n const draw = rule(ctx.name)?.run\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n return fallbackInline(ctx)\n }\n\n return fallbackInline(ctx)\n}\n\nexport function toolScroll(phase: ToolPhase, ctx: ToolFrame): string {\n const draw = rule(ctx.name)?.scroll?.[phase]\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n if (phase === \"progress\") {\n return ctx.raw\n }\n return fallbackFinal(ctx)\n }\n\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n\n if (phase === \"progress\") {\n return ctx.raw\n }\n\n return fallbackFinal(ctx)\n}\n\nexport function toolSnapshot(commit: StreamCommit, raw: string): ToolSnapshot | undefined {\n const ctx = toolFrame(commit, raw)\n const draw = rule(ctx.name)?.snap\n if (!draw) {\n return undefined\n }\n\n try {\n return draw(props(ctx))\n } catch {\n return undefined\n }\n}\n\nfunction textBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"text\",\n content,\n }\n}\n\nfunction markdownBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"markdown\",\n content,\n }\n}\n\nfunction structuredBody(commit: StreamCommit, raw: string): RunEntryBody | undefined {\n const snap = toolSnapshot(commit, raw)\n if (!snap) {\n return undefined\n }\n\n return {\n type: \"structured\",\n snapshot: snap,\n }\n}\n\nconst STRUCTURED_FALLBACK_LENGTH = 4_096\n\nfunction structuredFallback(value: ToolDict): RunEntryBody | undefined {\n if (Object.keys(value).length === 0) return\n const content = JSON.stringify(value, null, 2)\n if (!content) return\n const suffix = \"\\n... [truncated]\"\n return {\n type: \"code\",\n content:\n content.length <= STRUCTURED_FALLBACK_LENGTH\n ? content\n : content.slice(0, STRUCTURED_FALLBACK_LENGTH - suffix.length) + suffix,\n filetype: \"json\",\n }\n}\n\nfunction shellOutput(command: string, raw: string): string | undefined {\n const body = stripAnsi(raw).replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n if (!body) {\n return undefined\n }\n\n if (!command) {\n return body\n }\n\n return `\\n${body}`\n}\n\nexport function toolEntryBody(\n commit: StreamCommit,\n raw: string,\n options?: { shellOutput?: boolean },\n): RunEntryBody | undefined {\n if (commit.shell) {\n if (commit.phase === \"start\") {\n return textBody(`$ ${commit.shell.command}`)\n }\n\n if (commit.phase === \"progress\") {\n return textBody(shellOutput(commit.shell.command, raw) ?? \"\")\n }\n\n if (commit.toolState === \"error\") {\n const ctx = toolFrame(commit, raw)\n return textBody(toolScroll(\"final\", ctx))\n }\n\n return undefined\n }\n\n const ctx = toolFrame(commit, raw)\n const view = toolView(ctx.name)\n\n if (ctx.name === \"shell\" && commit.phase === \"progress\" && options?.shellOutput === false) return undefined\n\n if (ctx.name === \"subagent\") {\n if (commit.phase === \"start\") {\n return undefined\n }\n\n if (commit.phase === \"final\" && ctx.status === \"completed\") {\n const result = taskResult(ctx.output)\n if (result) {\n return markdownBody(result)\n }\n }\n }\n\n if (commit.phase === \"progress\" && !view.output) {\n return undefined\n }\n\n if (commit.phase === \"final\") {\n if (ctx.status === \"error\") {\n return textBody(toolScroll(\"final\", ctx))\n }\n\n if (!view.final) {\n return undefined\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return textBody(ctx.raw.trim())\n }\n\n if (toolStructuredFinal(commit)) {\n return structuredBody(commit, raw) ?? textBody(toolScroll(\"final\", ctx))\n }\n\n if (!rule(ctx.name) && !ctx.output.trim()) {\n return structuredFallback(ctx.meta) ?? textBody(toolScroll(\"final\", ctx))\n }\n }\n\n return textBody(toolScroll(commit.phase, ctx))\n}\n\nexport function toolFiletype(input?: string): string | undefined {\n if (!input) {\n return undefined\n }\n\n const ext = path.extname(input)\n const lang = LANGUAGE_EXTENSIONS[ext]\n if ([\"typescriptreact\", \"javascriptreact\", \"javascript\"].includes(lang)) {\n return \"typescript\"\n }\n\n return lang\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "AFF62C8C47CD10D164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/connect.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type IntegrationCommandStatusOutput, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.connect,\n Effect.fn(\"cli.auth.connect\")(function* (input) {\n process.stdout.write(\"Connecting...\" + EOL + EOL)\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n yield* request(() => client.integration.wellknown.add({ url: input.url, location }))\n const integrationID = input.url.replace(/\\/+$/, \"\")\n const started = yield* request(() =>\n client.integration.command.connect({ integrationID, methodID: \"login\", location }),\n )\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.command.cancel({ integrationID, attemptID: started.data.attemptID, location }),\n ).pipe(Effect.ignore),\n )\n\n const status = yield* wait(client, integrationID, started.data.attemptID)\n if (status.status === \"failed\") return yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") return yield* Effect.fail(new Error(\"Authentication expired\"))\n process.stdout.write(\"Connected\" + EOL)\n }),\n)\n\nconst wait = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n shown = false,\n): Effect.Effect<Exclude<IntegrationCommandStatusOutput[\"data\"], { status: \"pending\" }>, unknown> =>\n Effect.gen(function* () {\n const response = yield* request(() => client.integration.command.status({ integrationID, attemptID, location }))\n if (response.data.status !== \"pending\") return response.data\n const output = response.data.message?.trim()\n if (!shown && output) process.stdout.write(output + EOL + EOL)\n yield* Effect.sleep(500)\n return yield* wait(client, integrationID, attemptID, shown || !!output)\n })\n\nfunction request<A>(task: () => Promise<A>) {\n return Effect.tryPromise({ try: task, catch: (cause) => cause })\n}\n" | ||
| ], | ||
| "mappings": ";83BAAA,mBAAS,gBAQT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,UAAK,cAAS,aAChC,OAAO,QAAG,uBAAkB,OAAE,cAAU,MAAC,EAAO,CAC9C,QAAQ,OAAO,MAAM,gBAAkB,EAAM,CAAG,EAChD,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAC1F,MAAO,EAAQ,IAAM,EAAO,YAAY,UAAU,IAAI,CAAE,IAAK,EAAM,IAAK,UAAS,CAAC,CAAC,EACnF,IAAM,EAAgB,EAAM,IAAI,QAAQ,OAAQ,EAAE,EAC5C,EAAU,MAAO,EAAQ,IAC7B,EAAO,YAAY,QAAQ,QAAQ,CAAE,gBAAe,SAAU,QAAS,UAAS,CAAC,CACnF,EACA,MAAO,EAAO,aAAa,IACzB,EAAQ,IACN,EAAO,YAAY,QAAQ,OAAO,CAAE,gBAAe,UAAW,EAAQ,KAAK,UAAW,UAAS,CAAC,CAClG,EAAE,KAAK,EAAO,MAAM,CACtB,EAEA,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAe,EAAQ,KAAK,SAAS,EACxE,GAAI,EAAO,SAAW,SAAU,OAAO,MAAO,EAAO,KAAS,MAAM,EAAO,OAAO,CAAC,EACnF,GAAI,EAAO,SAAW,UAAW,OAAO,MAAO,EAAO,KAAS,MAAM,wBAAwB,CAAC,EAC9F,QAAQ,OAAO,MAAM,YAAc,CAAG,EACvC,CACH,EAEM,EAAO,CACX,EACA,EACA,EACA,EAAQ,KAER,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAW,MAAO,EAAQ,IAAM,EAAO,YAAY,QAAQ,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CAAC,EAC/G,GAAI,EAAS,KAAK,SAAW,UAAW,OAAO,EAAS,KACxD,IAAM,EAAS,EAAS,KAAK,SAAS,KAAK,EAC3C,GAAI,CAAC,GAAS,EAAQ,QAAQ,OAAO,MAAM,EAAS,EAAM,CAAG,EAE7D,OADA,MAAO,EAAO,MAAM,GAAG,EAChB,MAAO,EAAK,EAAQ,EAAe,EAAW,GAAS,CAAC,CAAC,CAAM,EACvE,EAEH,SAAS,CAAU,CAAC,EAAwB,CAC1C,OAAO,EAAO,WAAW,CAAE,IAAK,EAAM,MAAO,CAAC,IAAU,CAAM,CAAC", | ||
| "debugId": "38039D5DBB286AAA64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/logout.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.logout,\n Effect.fn(\"cli.mcp.logout\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n yield* Effect.forEach(\n credentials,\n (connection) => Effect.promise(() => client.credential.remove({ credentialID: connection.id, location })),\n { discard: true },\n )\n process.stdout.write(`Removed OAuth credentials for ${input.name}` + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";66BAAA,mBAAS,gBAST,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,YAC/B,OAAO,QAAG,qBAAgB,OAAE,cAAU,MAAC,OAAO,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EACxG,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH", | ||
| "debugId": "65F18F4DC4BFEB0464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/migrate.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\n\nexport default Runtime.handler(Commands.commands.migrate, (_input) => Effect.log(\"No migrations to run.\"))\n" | ||
| ], | ||
| "mappings": ";2oBAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,4BAAuB,MAAC", | ||
| "debugId": "3DACFEDC893EC11A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/version.ts"], | ||
| "sourcesContent": [ | ||
| "declare const OPENCODE_VERSION: string\ndeclare const OPENCODE_CHANNEL: string\n\nconst version = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nconst channel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\n\nexport { version as OPENCODE_VERSION, channel as OPENCODE_CHANNEL }\nexport const OPENCODE_LOCAL = channel === \"local\"\n" | ||
| ], | ||
| "mappings": ";AAGA,IAAM,EAAiD,mBACjD,EAAiD,OAGhD,IAAM,EAAiB", | ||
| "debugId": "97E2F34EDA4AA19964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/run/run.ts", "src/run/noninteractive.ts", "src/run/ui.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient, type SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { parseSessionTargetModel, resolveSessionTarget } from \"../session-target\"\nimport { toolInlineInfo } from \"@opencode-ai/tui/mini/tool\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { UI } from \"./ui\"\n\nexport type RunCommandInput = {\n server: ServerConnection.Resolved\n message: string[]\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n format: \"default\" | \"json\"\n file: string[]\n title?: string\n thinking?: boolean\n auto?: boolean\n}\n\ntype FilePart = {\n url: string\n filename: string\n mime: string\n}\n\ntype Prepared = {\n directory?: string\n message: string\n files: FilePart[]\n}\n\ntype ExecutionOptions = {\n root?: string\n directory?: string\n useServerDirectory?: boolean\n variant?: string\n attached?: boolean\n compatibility?: \"v1\"\n}\n\nclass RunTargetError extends Error {\n constructor(\n message: string,\n readonly sessionID?: string,\n ) {\n super(message)\n }\n}\n\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return runNonInteractiveWithOptions(input, {})\n}\n\n/** @internal Used only by the V1 command boundary. */\nexport function runNonInteractiveWithOptions(input: RunCommandInput, options: ExecutionOptions) {\n return run(input, options).catch((error) => reportRunError(input, errorMessage(error)))\n}\n\nasync function run(input: RunCommandInput, options: ExecutionOptions) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = options.root ?? process.env.PWD ?? process.cwd()\n const local = localDirectory(root)\n const directory = options.useServerDirectory ? undefined : (options.directory ?? local)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await readStdin())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root, options)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint, options)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Endpoint, options: ExecutionOptions) {\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const explicit = parseRunModel(input.model)\n const target = await resolveSessionTarget({\n client,\n location: prepared.directory ? { directory: prepared.directory } : undefined,\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: explicit\n ? { providerID: explicit.model.providerID, id: explicit.model.modelID, variant: explicit.variant }\n : undefined,\n agent: input.agent,\n prepare: async (next) => {\n const selected =\n next.model ??\n (options.variant\n ? await client.model\n .default({ location: { directory: next.location.directory, workspace: next.location.workspaceID } })\n .then((result) => result.data)\n : undefined)\n const model = selected\n ? {\n providerID: selected.providerID,\n id: selected.id,\n variant: options.variant ?? (\"variant\" in selected ? selected.variant : undefined),\n }\n : undefined\n if ((options.variant ?? explicit?.variant) && !model)\n throw new RunTargetError(\"Cannot select a variant before selecting a model\", next.session?.id)\n return { model, agent: next.agent }\n },\n }).catch((error) => {\n if (!(error instanceof RunTargetError)) throw error\n reportRunError(input, error.message, error.sessionID)\n return undefined\n })\n if (!target) return\n const model = target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined\n const variant = target.model?.variant\n if (!target.resume && input.title !== undefined) {\n await client.session.rename({\n sessionID: target.session.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: target.session.id,\n location: target.location,\n message: prepared.message,\n files: prepared.files,\n agent: target.agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: options.attached ?? true,\n compatibility: options.compatibility,\n renderTool: (part) => renderTool(part, target.location.directory),\n renderToolError: (part) => renderToolError(part, target.location.directory),\n }).catch((error) => reportRunError(input, errorMessage(error), target.session.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n const ref = parseSessionTargetModel(value)\n if (!ref) return\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function prepareFile(input: string, directory: string, options: ExecutionOptions): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (options.compatibility === \"v1\" && options.attached && stat.isDirectory())\n fail(`Cannot attach local directory without a shared filesystem: ${input}`)\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\nfunction warning(message: string) {\n UI.println(UI.Style.TEXT_WARNING_BOLD + \"!\", UI.Style.TEXT_NORMAL, message)\n}\n\nfunction errorMessage(error: unknown) {\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\")\n return error.message\n return String(error)\n}\n\n/** @internal Used by the V1 command boundary before a Session exists. */\nexport function reportRunError(input: Pick<RunCommandInput, \"format\">, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n", | ||
| "import type {\n EventSubscribeOutput,\n JsonValue,\n LLMToolContent,\n LocationRef,\n OpenCodeClient,\n SessionMessageAssistantTool,\n SessionMessageInfo,\n} from \"@opencode-ai/client/promise\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { readFile } from \"node:fs/promises\"\nimport { toolOutputText, type MiniToolPart } from \"@opencode-ai/tui/mini/tool\"\nimport { UI } from \"./ui\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n location: LocationRef\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n compatibility?: \"v1\"\n renderTool: (part: SessionMessageAssistantTool) => Promise<void>\n renderToolError: (part: SessionMessageAssistantTool) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, JsonValue>\n raw?: string\n provider?: unknown\n providerState?: SessionMessageAssistantTool[\"providerState\"]\n structured: Record<string, JsonValue>\n content: LLMToolContent[]\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n const renderedText = new Map<string, string>()\n const renderedReasoning = new Map<string, string>()\n const renderedTools = new Set<string>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let v1InvalidOutput = false\n let prePromotionError: { message: string; [key: string]: unknown } | undefined\n let finalizing = false\n let admission: AbortController | undefined\n let pendingStep: { timestamp: number; part: Record<string, unknown>; label: string } | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const writeReasoning = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"reasoning\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) return void process.stdout.write(line + EOL)\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n }\n\n const flushStep = () => {\n if (!pendingStep) return\n const value = pendingStep\n pendingStep = undefined\n if (!emit(\"step_start\", value.timestamp, { part: value.part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(value.label)\n UI.empty()\n }\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n try {\n await input.client.form.cancel(\n { sessionID: request.sessionID, formID: request.id },\n ...formRequestOptions(request.sessionID === GLOBAL_FORM_SESSION_ID ? input.location : undefined),\n )\n } catch (error) {\n if (!formAlreadySettled(error)) throw error\n }\n formCancelled = true\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached &&\n event.data.form.sessionID === GLOBAL_FORM_SESSION_ID &&\n sameLocation(event.location, input.location)))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.input.promoted\") {\n if (event.data.inputID === messageID) {\n promoted = true\n prePromotionError = undefined\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted && event.type === \"session.execution.failed\") {\n prePromotionError = event.data.error\n if (finalizing) return\n continue\n }\n if (\n !promoted &&\n finalizing &&\n (event.type === \"session.execution.succeeded\" || event.type === \"session.execution.interrupted\")\n )\n return\n if (!promoted) continue\n if (finalizing && !event.type.startsWith(\"session.execution.\")) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (input.compatibility === \"v1\") {\n pendingStep = {\n timestamp: time,\n part,\n label: `> ${event.data.agent} · ${event.data.model.id}`,\n }\n continue\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n flushStep()\n starts.set(`text\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`text\\u0000${key}`)\n starts.delete(`text\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedText.set(key, event.data.text)\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(`reasoning\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`reasoning\\u0000${key}`)\n starts.delete(`reasoning\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedReasoning.set(key, event.data.text)\n writeReasoning(part, time)\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n flushStep()\n tools.set(toolKey(event.data.assistantMessageID, event.data.callID), {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n structured: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.input.delta\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) current.raw = (current.raw ?? \"\") + event.data.delta\n continue\n }\n if (event.type === \"session.tool.called\") {\n flushStep()\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key)\n tools.set(key, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n providerState: event.data.state,\n structured: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.progress\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) {\n current.structured = event.data.structured\n current.content = event.data.content\n }\n continue\n }\n if (event.type === \"session.tool.success\") {\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key) ?? fallbackTool(event)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.callID,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"completed\",\n input: current.input,\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: toolOutputText(current.tool, event.data.content),\n title: current.tool,\n metadata: {\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(tool)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key) ?? fallbackTool(event)\n const error = event.data.error.message\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.callID,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"error\",\n input: current.input,\n structured: current.structured,\n content: current.content,\n error: event.data.error,\n result: event.data.result,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) continue\n if (!emit(\"tool_use\", time, { part })) {\n if (toolOutputText(current.tool, current.content).trim())\n await input.renderTool({\n ...tool,\n state: {\n status: \"completed\",\n input: current.input,\n structured: current.structured,\n content: current.content,\n result: event.data.result,\n },\n })\n await input.renderToolError(tool)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n flushStep()\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (\n input.compatibility === \"v1\" &&\n event.data.error.message === \"Provider stream ended without a terminal finish event\"\n ) {\n pendingStep = undefined\n v1InvalidOutput = true\n continue\n }\n if (interrupted || permissionRejected || formCancelled) continue\n flushStep()\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (input.compatibility === \"v1\" && (v1InvalidOutput || permissionRejected || formCancelled)) return\n flushStep()\n if (!emittedError && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) return\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const projectedMessages = async () => {\n const messages: SessionMessageInfo[] = []\n let cursor: string | undefined\n while (true) {\n const page = await input.client.message.list(\n cursor\n ? { sessionID: input.sessionID, limit: 200, cursor }\n : { sessionID: input.sessionID, limit: 200, order: \"desc\" },\n )\n for (const message of page.data) {\n if (message.id === messageID) return { found: true, messages: messages.toReversed() }\n messages.push(message)\n }\n cursor = page.cursor.next ?? undefined\n if (!cursor) return { found: false, messages: [] }\n }\n }\n\n const reconcile = async () => {\n const projected = await projectedMessages()\n for (const message of projected.messages) {\n if (message.type !== \"assistant\") continue\n const timestamp = message.time.completed ?? message.time.created\n let textOrdinal = 0\n let reasoningOrdinal = 0\n for (const item of message.content) {\n if (item.type === \"text\") {\n const ordinal = textOrdinal++\n const key = contentKey(message.id, ordinal)\n const rendered = renderedText.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n writeText(\n {\n id: projectedPartID(message.id, `text-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"text\",\n text,\n time: { start: message.time.created, end: timestamp },\n },\n timestamp,\n )\n renderedText.set(key, item.text)\n continue\n }\n if (item.type === \"reasoning\") {\n const ordinal = reasoningOrdinal++\n if (!input.thinking) continue\n const key = contentKey(message.id, ordinal)\n const rendered = renderedReasoning.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n const part = {\n id: projectedPartID(message.id, `reasoning-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"reasoning\",\n text,\n metadata: item.state,\n time: { start: message.time.created, end: timestamp },\n }\n renderedReasoning.set(key, item.text)\n writeReasoning(part, timestamp)\n continue\n }\n\n const key = toolKey(message.id, item.id)\n if (renderedTools.has(key) || item.state.status === \"streaming\" || item.state.status === \"running\") continue\n const part: MiniToolPart = {\n id: projectedPartID(message.id, `tool-${item.id}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"tool\",\n callID: item.id,\n tool: item.name,\n state:\n item.state.status === \"completed\"\n ? {\n status: \"completed\",\n input: item.state.input,\n output: toolOutputText(item.name, item.state.content),\n title: item.name,\n metadata: { structured: item.state.structured, content: item.state.content, result: item.state.result },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n }\n : {\n status: \"error\",\n input: item.state.input,\n error: item.state.error.message,\n metadata: { structured: item.state.structured, content: item.state.content, result: item.state.result },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n },\n }\n renderedTools.add(key)\n if (emit(\"tool_use\", timestamp, { part })) continue\n if (item.state.status === \"completed\") {\n await input.renderTool(item)\n continue\n }\n if (toolOutputText(item.name, item.state.content).trim()) {\n await input.renderTool({ ...item, state: { ...item.state, status: \"completed\" } })\n }\n await input.renderToolError(item)\n UI.error(item.state.error.message)\n }\n\n if (message.error && !emittedError) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", timestamp, { error: message.error })) UI.error(message.error.message)\n }\n }\n return {\n found: projected.found,\n responded: projected.messages.some((message) => message.type === \"assistant\"),\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, forms, globals] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.form.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.attached\n ? Promise.resolve(undefined)\n : input.client.form.request\n .list({\n location: { directory: input.location.directory, workspace: input.location.workspaceID },\n })\n .catch(() => undefined),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(forms ?? []).map(cancelForm),\n ...(globals && sameLocation(globals.location, input.location)\n ? globals.data.filter((form) => form.sessionID === GLOBAL_FORM_SESSION_ID).map(cancelForm)\n : []),\n ])\n if (input.compatibility === \"v1\") {\n await completed\n return\n }\n\n const waiting = input.client.session.wait({ sessionID: input.sessionID })\n await Promise.race([waiting, completed.then(() => waiting)])\n finalizing = true\n const projected = await reconcile()\n if (\n !projected.responded &&\n !interrupted &&\n !permissionRejected &&\n !formCancelled &&\n !emittedError &&\n !prePromotionError\n ) {\n await completed\n }\n if (!projected.found && !interrupted && !permissionRejected && !formCancelled && !emittedError) {\n const error = prePromotionError ?? { type: \"unknown\", message: \"Prompt was not promoted\" }\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", Date.now(), { error })) UI.error(error.message)\n }\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n if (input.compatibility === \"v1\") await stream.return?.(undefined).catch(() => {})\n else void stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction sameLocation(left: LocationRef | undefined, right: LocationRef) {\n return !!left && left.directory === right.directory && left.workspaceID === right.workspaceID\n}\n\nfunction formRequestOptions(location: LocationRef | undefined): [] | [{ headers: Record<string, string> }] {\n if (!location) return []\n return [\n {\n headers: {\n \"x-opencode-directory\": encodeURIComponent(location.directory),\n ...(location.workspaceID ? { \"x-opencode-workspace\": location.workspaceID } : {}),\n },\n },\n ]\n}\n\nfunction formAlreadySettled(error: unknown) {\n return !!error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"FormAlreadySettledError\"\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction toolKey(messageID: string, callID: string) {\n return `${messageID}\\u0000${callID}`\n}\n\nfunction contentKey(messageID: string, ordinal: number) {\n return `${messageID}\\u0000${ordinal}`\n}\n\nfunction projectedPartID(messageID: string, part: string) {\n return `prt_${messageID.replace(/^msg_/, \"\")}_${part}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; callID: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n structured: {},\n content: [],\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${(await readFile(new URL(file.url))).toString(\"base64\")}`\n return { attachment: { uri, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await readFile(new URL(file.url), \"utf8\")\n return { text: `<file name=\"${file.filename}\">\\n${content}\\n</file>` }\n}\n", | ||
| "import { EOL } from \"node:os\"\n\nexport const Style = {\n TEXT_DIM: \"\\x1b[90m\",\n TEXT_NORMAL: \"\\x1b[0m\",\n TEXT_WARNING_BOLD: \"\\x1b[93m\\x1b[1m\",\n TEXT_DANGER_BOLD: \"\\x1b[91m\\x1b[1m\",\n}\n\nexport function println(...message: string[]) {\n process.stderr.write(message.join(\" \") + EOL)\n}\n\nlet blank = false\n\nexport function empty() {\n if (blank) return\n println(Style.TEXT_NORMAL)\n blank = true\n}\n\nexport function error(message: string) {\n if (message.startsWith(\"Error: \")) message = message.slice(\"Error: \".length)\n println(Style.TEXT_DANGER_BOLD + \"Error: \" + Style.TEXT_NORMAL + message)\n}\n\nexport * as UI from \"./ui\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "2619A95C682A783264756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/services/service-config.ts"], | ||
| "sourcesContent": [ | ||
| "import { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"../version\"\nimport { Hash } from \"@opencode-ai/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, FileSystem, Option, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\nimport { selfCommand } from \"../util/process\"\n\n// The CLI's service configuration file, plus the Service.EnsureOptions binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"next\") return \"service.json\"\n return `service-${channel.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.json`\n}\n\nexport function defaultPort(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"next\") return 0xc0de\n if (channel === \"local\") return 0xc0df\n return 10_000 + (Number.parseInt(Hash.fast(channel).slice(0, 8), 16) % 50_000)\n}\n\nexport function legacyFilename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"local\") return\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nexport const migrateConfig = Effect.fnUntraced(function* (legacy: string, file: string) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n if (Option.isNone(yield* decodeInfo(text.value).pipe(Effect.option))) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const legacy = legacyFilename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyConfigFile: legacy ? path.join(global.config, legacy) : undefined,\n legacyRegistrationFiles: [\n ...(legacy ? [path.join(global.state, legacy)] : []),\n ...(name !== \"service.json\" && OPENCODE_CHANNEL !== \"local\" ? [path.join(global.state, \"service.json\")] : []),\n ],\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file, legacyRegistrationFiles } = yield* paths\n yield* Effect.forEach(legacyRegistrationFiles, (legacy) => migrateRegistration(legacy, file))\n return {\n file,\n version: OPENCODE_VERSION,\n command: [...selfCommand(), \"serve\", \"--service\"],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile, legacyConfigFile } = yield* paths\n if (legacyConfigFile) yield* migrateConfig(legacyConfigFile, configFile)\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.catch(() => Effect.succeed({} as Info)),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* paths\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n switch (configKey(key)) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "0A3213BE8D51E5D264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/demo.ts"], | ||
| "sourcesContent": [ | ||
| "// Demo mode for testing direct interactive mode without a real SDK.\n//\n// Enabled with `--demo`. Intercepts prompt submissions and drives the same\n// presentation commits and footer actions as the live transport. This\n// lets you test scrollback formatting, permission UI, canonical Form UI, and tool\n// snapshots without making actual model calls. Pass a demo slash command as\n// the initial interactive message to trigger a preview immediately.\n//\n// Slash commands:\n// /permission [kind] → triggers a permission request variant\n// /form [kind] → triggers a canonical Form request variant\n// /fmt <kind> → emits a specific tool/text type (text, reasoning, shell,\n// write, edit, patch, subagent, question, error, mix)\n//\n// Demo mode handles permission and Form replies locally, completing or failing\n// the synthetic tool parts through the same callbacks used by the live footer.\nimport path from \"path\"\nimport type { JsonValue, SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { writeSessionOutput } from \"./stream\"\nimport { toolCommit } from \"./stream-v2.subagent\"\nimport type {\n FooterApi,\n FooterView,\n FormCancel,\n FormReply,\n MiniFormRequest,\n MiniPermissionRequest,\n PermissionReply,\n RunPrompt,\n StreamCommit,\n} from \"./types\"\n\nconst KINDS = [\n \"markdown\",\n \"table\",\n \"text\",\n \"reasoning\",\n \"shell\",\n \"write\",\n \"edit\",\n \"patch\",\n \"subagent\",\n \"question\",\n \"error\",\n \"mix\",\n]\nconst PERMISSIONS = [\"edit\", \"shell\", \"read\", \"subagent\", \"external\", \"doom\"] as const\nconst FORMS = [\"question\", \"external\"] as const\n\ntype PermissionKind = (typeof PERMISSIONS)[number]\ntype FormKind = (typeof FORMS)[number]\n\nfunction permissionKind(value: string | undefined): PermissionKind | undefined {\n const next = (value || \"edit\").toLowerCase()\n return PERMISSIONS.find((item) => item === next)\n}\n\nfunction formKind(value: string | undefined): FormKind | undefined {\n const next = (value || \"question\").toLowerCase()\n return FORMS.find((item) => item === next)\n}\n\nconst SAMPLE_MARKDOWN = [\n \"# Direct Mode Demo\",\n \"\",\n \"This is a realistic assistant response for direct-mode formatting checks.\",\n \"It mixes **bold**, _italic_, `inline code`, links, code fences, and tables in one streamed reply.\",\n \"\",\n \"## Summary\",\n \"\",\n \"- Restored the final markdown flush so the last block is committed on idle.\",\n \"- Switched markdown scrollback commits back to top-level block boundaries.\",\n \"- Added footer-level regression coverage for split-footer rendering.\",\n \"\",\n \"## Status\",\n \"\",\n \"| Area | Before | After | Notes |\",\n \"| --- | --- | --- | --- |\",\n \"| Direct mode | Missing final rows | Stable | Final markdown block now flushes on idle |\",\n \"| Tables | Dropped in streaming mode | Visible | Block-based commits match the working OpenTUI demo |\",\n \"| Tests | Partial coverage | Broader coverage | Includes a footer-level split render capture |\",\n \"\",\n \"> This sample intentionally includes a wide table so you can spot wrapping and commit bugs quickly.\",\n \"\",\n \"```ts\",\n \"const result = { markdown: true, tables: 2, stable: true }\",\n \"```\",\n \"\",\n \"## Files\",\n \"\",\n \"| File | Change |\",\n \"| --- | --- |\",\n \"| `scrollback.surface.ts` | Align markdown commit logic with the split-footer demo |\",\n \"| `footer.ts` | Keep active surfaces across footer-height-only resizes |\",\n \"| `footer.test.ts` | Capture real split-footer markdown payloads during idle completion |\",\n \"\",\n \"Next step: run `/fmt table` if you want a tighter table-only sample.\",\n].join(\"\\n\")\n\nconst SAMPLE_TABLE = [\n \"# Table Sample\",\n \"\",\n \"| Kind | Example | Notes |\",\n \"| --- | --- | --- |\",\n \"| Pipe | `A\\\\|B` | Escaped pipes should stay in one cell |\",\n \"| Unicode | `漢字` | Wide characters should remain aligned |\",\n \"| Wrap | `LongTokenWithoutNaturalBreaks_1234567890` | Useful for width stress |\",\n \"| Status | done | Final row should still appear after idle |\",\n].join(\"\\n\")\n\ntype Ref = {\n msg: string\n part: string\n call: string\n tool: string\n input: Record<string, JsonValue>\n start: number\n}\n\ntype FormRequest = {\n ref: Ref\n kind: FormKind\n request: MiniFormRequest\n}\n\ntype Perm = {\n ref: Ref\n done: {\n title: string\n output: string\n metadata?: Record<string, JsonValue>\n }\n}\n\ntype Permit = {\n ref: Ref\n permission: string\n patterns: string[]\n metadata?: MiniPermissionRequest[\"metadata\"]\n always: string[]\n done: Perm[\"done\"]\n}\n\ntype State = {\n id: string\n thinking: boolean\n footer: FooterApi\n msg: number\n part: number\n call: number\n perm: number\n form: number\n perms: Map<string, Perm>\n forms: Map<string, FormRequest>\n started: Set<string>\n}\n\ntype Input = {\n sessionID: string\n thinking: boolean\n footer: FooterApi\n}\n\nfunction note(footer: FooterApi, text: string): void {\n footer.append({\n kind: \"system\",\n text,\n phase: \"start\",\n source: \"system\",\n })\n}\n\nfunction clearSubagent(footer: FooterApi): void {\n footer.event({\n type: \"stream.subagent\",\n state: {\n tabs: [],\n details: {},\n permissions: [],\n forms: [],\n },\n })\n}\n\nfunction showSubagent(\n state: State,\n input: {\n sessionID: string\n label: string\n description: string\n status: \"running\" | \"completed\" | \"cancelled\" | \"error\"\n title?: string\n commits: StreamCommit[]\n },\n) {\n state.footer.event({\n type: \"stream.subagent\",\n state: {\n tabs: [\n {\n sessionID: input.sessionID,\n label: input.label,\n description: input.description,\n status: input.status,\n title: input.title,\n lastUpdatedAt: Date.now(),\n },\n ],\n details: {\n [input.sessionID]: {\n commits: input.commits,\n },\n },\n permissions: [],\n forms: [],\n },\n })\n}\n\nfunction wait(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (!signal) {\n setTimeout(resolve, ms)\n return\n }\n\n if (signal.aborted) {\n resolve()\n return\n }\n\n const done = () => {\n clearTimeout(timer)\n signal.removeEventListener(\"abort\", done)\n resolve()\n }\n\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", done)\n resolve()\n }, ms)\n\n signal.addEventListener(\"abort\", done, { once: true })\n })\n}\n\nfunction split(text: string): string[] {\n if (text.length <= 48) {\n return [text]\n }\n\n const size = Math.ceil(text.length / 3)\n return [text.slice(0, size), text.slice(size, size * 2), text.slice(size * 2)]\n}\n\nfunction take(state: State, key: \"msg\" | \"part\" | \"call\" | \"perm\", prefix: string): string {\n state[key] += 1\n return `demo_${prefix}_${state[key]}`\n}\n\nfunction present(state: State, commits: StreamCommit[], view?: FooterView): void {\n writeSessionOutput(\n { footer: state.footer },\n {\n commits,\n updates: view\n ? [\n {\n type: \"stream.patch\" as const,\n patch: { status: view.type === \"permission\" ? \"awaiting permission\" : \"awaiting form\" },\n },\n { type: \"stream.view\" as const, view },\n ]\n : undefined,\n },\n )\n}\n\nfunction clearBlocker(state: State): void {\n writeSessionOutput(\n { footer: state.footer },\n {\n commits: [],\n updates: [\n { type: \"stream.patch\", patch: { status: \"\" } },\n { type: \"stream.view\", view: { type: \"prompt\" } },\n ],\n },\n )\n}\n\nfunction open(state: State): string {\n return take(state, \"msg\", \"msg\")\n}\n\nasync function emitText(state: State, body: string, signal?: AbortSignal): Promise<void> {\n const msg = open(state)\n const part = take(state, \"part\", \"part\")\n for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n present(state, [\n { kind: \"assistant\", source: \"assistant\", text: item, phase: \"progress\", messageID: msg, partID: part },\n ])\n await wait(45, signal)\n }\n}\n\nasync function emitReasoning(state: State, body: string, signal?: AbortSignal): Promise<void> {\n const msg = open(state)\n const part = take(state, \"part\", \"part\")\n let first = true\n for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n if (state.thinking) {\n present(state, [\n {\n kind: \"reasoning\",\n source: \"reasoning\",\n text: first ? `Thinking: ${item.replace(/\\[REDACTED\\]/g, \"\")}` : item.replace(/\\[REDACTED\\]/g, \"\"),\n phase: \"progress\",\n messageID: msg,\n partID: part,\n },\n ])\n first = false\n }\n await wait(45, signal)\n }\n}\n\nfunction make(state: State, tool: string, input: Record<string, JsonValue>): Ref {\n return {\n msg: open(state),\n part: take(state, \"part\", \"part\"),\n call: take(state, \"call\", \"call\"),\n tool,\n input,\n start: Date.now(),\n }\n}\n\nfunction startTool(state: State, ref: Ref, structured: Record<string, JsonValue> = {}): SessionMessageAssistantTool {\n state.started.add(ref.part)\n const part = {\n type: \"tool\" as const,\n id: ref.call,\n name: ref.tool,\n state: { status: \"running\" as const, input: ref.input, structured, content: [] },\n time: { created: ref.start, ran: ref.start },\n }\n present(state, [toolCommit(part, ref.msg, \"start\")])\n return part\n}\n\nfunction askPermission(state: State, item: Permit): void {\n const tool = startTool(state, item.ref)\n\n const id = take(state, \"perm\", \"perm\")\n state.perms.set(id, {\n ref: item.ref,\n done: item.done,\n })\n\n present(state, [], {\n type: \"permission\",\n request: {\n id,\n sessionID: state.id,\n action: item.permission,\n resources: item.patterns,\n metadata: item.metadata ?? {},\n save: item.always,\n source: { type: \"tool\", messageID: item.ref.msg, callID: item.ref.call },\n tool,\n },\n })\n}\n\nfunction doneTool(\n state: State,\n ref: Ref,\n output: {\n title: string\n output: string\n metadata?: Record<string, JsonValue>\n },\n): void {\n if (!state.started.has(ref.part)) startTool(state, ref)\n const part: SessionMessageAssistantTool = {\n type: \"tool\",\n id: ref.call,\n name: ref.tool,\n state: {\n status: \"completed\",\n input: ref.input,\n content: output.output ? [{ type: \"text\", text: output.output }] : [],\n structured: output.metadata ?? {},\n },\n time: { created: ref.start, ran: ref.start, completed: Date.now() },\n }\n present(state, [toolCommit(part, ref.msg, output.output ? \"progress\" : \"final\")])\n}\n\nfunction failTool(state: State, ref: Ref, error: string): void {\n if (!state.started.has(ref.part)) startTool(state, ref)\n present(state, [\n toolCommit(\n {\n type: \"tool\",\n id: ref.call,\n name: ref.tool,\n state: {\n status: \"error\",\n input: ref.input,\n error: { type: \"unknown\", message: error },\n structured: {},\n content: [],\n },\n time: { created: ref.start, ran: ref.start, completed: Date.now() },\n },\n ref.msg,\n \"final\",\n ),\n ])\n}\n\nfunction emitError(state: State, text: string): void {\n present(state, [{ kind: \"error\", source: \"system\", text, phase: \"start\" }])\n}\n\nasync function emitBash(state: State, signal?: AbortSignal): Promise<void> {\n const ref = make(state, \"shell\", {\n command: \"git status\",\n workdir: process.cwd(),\n description: \"Show git status\",\n })\n startTool(state, ref)\n await wait(70, signal)\n doneTool(state, ref, {\n title: \"git status\",\n output: `${process.cwd()}\\ngit status\\nOn branch demo\\nnothing to commit, working tree clean\\n`,\n metadata: {\n exit: 0,\n },\n })\n}\n\nfunction emitWrite(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"write\", {\n path: file,\n content: \"export const demo = 42\\n\",\n })\n doneTool(state, ref, {\n title: \"write\",\n output: \"\",\n metadata: {},\n })\n}\n\nfunction emitEdit(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"edit\", {\n path: file,\n })\n doneTool(state, ref, {\n title: \"edit\",\n output: \"\",\n metadata: {\n files: [\n {\n file,\n status: \"modified\",\n patch: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n },\n ],\n },\n })\n}\n\nfunction emitPatch(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"patch\", {\n patchText: \"*** Begin Patch\\n*** End Patch\",\n })\n doneTool(state, ref, {\n title: \"patch\",\n output: \"\",\n metadata: {\n files: [\n {\n status: \"modified\",\n file,\n patch: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n deletions: 1,\n },\n {\n status: \"added\",\n file: path.join(process.cwd(), \"README-demo.md\"),\n patch: \"@@ -0,0 +1,4 @@\\n+# Demo\\n+This is a generated preview file.\\n\",\n deletions: 0,\n },\n ],\n },\n })\n}\n\nfunction emitTask(state: State): void {\n const ref = make(state, \"subagent\", {\n description: \"Scan run/* for reducer touchpoints\",\n agent: \"explore\",\n })\n doneTool(state, ref, {\n title: \"Reducer touchpoints found\",\n output: \"\",\n metadata: {\n sessionID: \"sub_demo_1\",\n status: \"completed\",\n output: \"\",\n },\n })\n const part = {\n type: \"tool\",\n id: \"sub_demo_call_1\",\n name: \"read\",\n state: {\n status: \"running\",\n input: {\n path: \"packages/tui/src/mini/stream.ts\",\n offset: 1,\n limit: 200,\n },\n structured: {},\n content: [],\n },\n time: { created: Date.now(), ran: Date.now() },\n } satisfies SessionMessageAssistantTool\n showSubagent(state, {\n sessionID: \"sub_demo_1\",\n label: \"Explore\",\n description: \"Scan run/* for reducer touchpoints\",\n status: \"completed\",\n title: \"Reducer touchpoints found\",\n commits: [\n {\n kind: \"user\",\n text: \"Scan run/* for reducer touchpoints\",\n phase: \"start\",\n source: \"system\",\n },\n {\n kind: \"reasoning\",\n text: \"Thinking: tracing reducer and footer boundaries\",\n phase: \"progress\",\n source: \"reasoning\",\n messageID: \"sub_demo_msg_reasoning\",\n partID: \"sub_demo_reasoning_1\",\n },\n {\n kind: \"tool\",\n text: \"running read\",\n phase: \"start\",\n source: \"tool\",\n messageID: \"sub_demo_msg_tool\",\n partID: \"sub_demo_tool_1\",\n tool: \"read\",\n part,\n },\n {\n kind: \"assistant\",\n text: \"Footer updates flow through stream.ts into RunFooter\",\n phase: \"progress\",\n source: \"assistant\",\n messageID: \"sub_demo_msg_text\",\n partID: \"sub_demo_text_1\",\n },\n ],\n })\n}\n\nfunction emitQuestionTool(state: State): void {\n const ref = make(state, \"question\", {\n questions: [\n {\n header: \"Style\",\n question: \"Which output style do you want to inspect?\",\n options: [\n { label: \"Diff\", description: \"Show diff block\" },\n { label: \"Code\", description: \"Show code block\" },\n ],\n multiple: false,\n custom: false,\n },\n {\n header: \"Extras\",\n question: \"Pick extra rows\",\n options: [\n { label: \"Usage\", description: \"Add usage row\" },\n { label: \"Duration\", description: \"Add duration row\" },\n ],\n multiple: true,\n custom: true,\n },\n ],\n })\n doneTool(state, ref, {\n title: \"question\",\n output: \"\",\n metadata: {\n answers: [[\"Diff\"], [\"Usage\", \"custom-note\"]],\n },\n })\n}\n\nfunction emitPermission(state: State, kind: PermissionKind = \"edit\"): void {\n const root = process.cwd()\n const file = path.join(root, \"src\", \"demo-format.ts\")\n\n if (kind === \"shell\") {\n const command = \"git status --short\"\n const ref = make(state, \"shell\", {\n command,\n workdir: root,\n description: \"Inspect worktree changes\",\n })\n askPermission(state, {\n ref,\n permission: \"shell\",\n patterns: [command],\n always: [\"*\"],\n done: {\n title: \"git status --short\",\n output: `${root}\\ngit status --short\\n M src/demo-format.ts\\n?? src/demo-permission.ts\\n`,\n metadata: {\n exit: 0,\n },\n },\n })\n return\n }\n\n if (kind === \"read\") {\n const target = path.join(root, \"package.json\")\n const ref = make(state, \"read\", {\n path: target,\n offset: 1,\n limit: 80,\n })\n askPermission(state, {\n ref,\n permission: \"read\",\n patterns: [target],\n always: [target],\n done: {\n title: \"read\",\n output: [\"1: {\", '2: \"name\": \"opencode\",', '3: \"private\": true', \"4: }\"].join(\"\\n\"),\n metadata: {},\n },\n })\n return\n }\n\n if (kind === \"subagent\") {\n const ref = make(state, \"subagent\", {\n description: \"Inspect footer spacing across direct-mode prompts\",\n agent: \"explore\",\n })\n askPermission(state, {\n ref,\n permission: \"subagent\",\n patterns: [\"explore\"],\n always: [\"*\"],\n done: {\n title: \"Footer spacing checked\",\n output: \"\",\n metadata: {\n sessionID: \"sub_demo_perm_1\",\n status: \"completed\",\n output: \"\",\n },\n },\n })\n return\n }\n\n if (kind === \"external\") {\n const dir = path.join(path.dirname(root), \"demo-shared\")\n const target = path.join(dir, \"README.md\")\n const ref = make(state, \"read\", {\n path: target,\n offset: 1,\n limit: 40,\n })\n askPermission(state, {\n ref,\n permission: \"external_directory\",\n patterns: [`${dir}/**`],\n metadata: {\n parentDir: dir,\n filepath: target,\n },\n always: [`${dir}/**`],\n done: {\n title: \"read\",\n output: `1: # External demo\\n2: Shared preview file\\nPath: ${target}`,\n metadata: {},\n },\n })\n return\n }\n\n if (kind === \"doom\") {\n const ref = make(state, \"subagent\", {\n description: \"Retry the formatter after repeated failures\",\n agent: \"general\",\n })\n askPermission(state, {\n ref,\n permission: \"doom_loop\",\n patterns: [\"*\"],\n always: [\"*\"],\n done: {\n title: \"Retry allowed\",\n output: \"Continuing after repeated failures.\\n\",\n metadata: {},\n },\n })\n return\n }\n\n const diff = \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\"\n const ref = make(state, \"edit\", {\n path: file,\n })\n askPermission(state, {\n ref,\n permission: \"edit\",\n patterns: [file],\n always: [file],\n done: {\n title: \"edit\",\n output: \"\",\n metadata: {\n files: [{ file, status: \"modified\", patch: diff }],\n },\n },\n })\n}\n\nfunction demoForm(kind: FormKind): { title: string; fields: MiniFormRequest[\"fields\"]; questions?: JsonValue[] } {\n if (kind === \"question\") {\n const questions: JsonValue[] = [\n {\n header: \"Layout\",\n question: \"Which footer view should be the reference for spacing checks?\",\n options: [\n { label: \"Form\", description: \"Inspect the canonical Form footer\" },\n { label: \"Prompt\", description: \"Return to the normal composer\" },\n ],\n multiple: false,\n custom: true,\n },\n {\n header: \"Checks\",\n question: \"Pick formatting previews\",\n options: [\n { label: \"Diff\", description: \"Emit an edit diff\" },\n { label: \"Subagent\", description: \"Emit a subagent card\" },\n ],\n multiple: true,\n custom: true,\n },\n ]\n return {\n title: \"Questions\",\n questions,\n fields: [\n {\n key: \"q0\",\n title: \"Layout\",\n description: \"Which footer view should be the reference for spacing checks?\",\n type: \"string\",\n options: [\n { value: \"Form\", label: \"Form\", description: \"Inspect the canonical Form footer\" },\n { value: \"Prompt\", label: \"Prompt\", description: \"Return to the normal composer\" },\n ],\n custom: true,\n },\n {\n key: \"q1\",\n title: \"Checks\",\n description: \"Pick formatting previews\",\n type: \"multiselect\",\n options: [\n { value: \"Diff\", label: \"Diff\", description: \"Emit an edit diff\" },\n { value: \"Subagent\", label: \"Subagent\", description: \"Emit a subagent card\" },\n ],\n custom: true,\n },\n ],\n }\n }\n return {\n title: \"MCP authorization\",\n fields: [\n {\n key: \"authorization\",\n type: \"external\",\n url: \"https://example.com/opencode-demo\",\n title: \"Authorize demo MCP server\",\n description: \"Complete authorization in your browser\",\n },\n ],\n }\n}\n\nfunction emitForm(state: State, kind: FormKind = \"question\"): void {\n const form = demoForm(kind)\n const ref = make(state, kind === \"question\" ? \"question\" : \"mcp_demo\", {\n ...(form.questions ? { questions: form.questions } : { form: kind }),\n })\n startTool(state, ref)\n state.form++\n const request: MiniFormRequest = {\n id: `frm_demo_${state.form}`,\n sessionID: state.id,\n title: form.title,\n metadata:\n kind === \"question\"\n ? { kind: \"question\", tool: { messageID: ref.msg, callID: ref.call } }\n : { kind: \"mcp\", message: `Synthetic ${kind} MCP elicitation` },\n fields: form.fields,\n }\n state.forms.set(request.id, { ref, kind, request })\n present(state, [], { type: \"form\", request })\n}\n\nasync function emitFmt(state: State, kind: string, body: string, signal?: AbortSignal): Promise<boolean> {\n if (kind === \"text\") {\n await emitText(state, body || SAMPLE_MARKDOWN, signal)\n return true\n }\n\n if (kind === \"markdown\" || kind === \"md\") {\n await emitText(state, body || SAMPLE_MARKDOWN, signal)\n return true\n }\n\n if (kind === \"table\") {\n await emitText(state, body || SAMPLE_TABLE, signal)\n return true\n }\n\n if (kind === \"reasoning\") {\n await emitReasoning(state, body || \"Planning next steps [REDACTED] while preserving reducer ordering.\", signal)\n return true\n }\n\n if (kind === \"shell\") {\n await emitBash(state, signal)\n return true\n }\n\n if (kind === \"write\") {\n emitWrite(state)\n return true\n }\n\n if (kind === \"edit\") {\n emitEdit(state)\n return true\n }\n\n if (kind === \"patch\") {\n emitPatch(state)\n return true\n }\n\n if (kind === \"subagent\") {\n emitTask(state)\n return true\n }\n\n if (kind === \"question\") {\n emitQuestionTool(state)\n return true\n }\n\n if (kind === \"error\") {\n emitError(state, body || \"demo error event\")\n return true\n }\n\n if (kind === \"mix\") {\n await emitText(state, SAMPLE_MARKDOWN, signal)\n await wait(50, signal)\n await emitReasoning(state, \"Thinking through formatter edge cases [REDACTED].\", signal)\n await wait(50, signal)\n await emitBash(state, signal)\n emitWrite(state)\n emitEdit(state)\n emitPatch(state)\n emitTask(state)\n emitQuestionTool(state)\n emitError(state, \"demo mixed scenario error\")\n return true\n }\n\n return false\n}\n\nfunction intro(state: State): void {\n note(\n state.footer,\n [\n \"Demo slash commands enabled for interactive mode.\",\n `- /permission [kind] (${PERMISSIONS.join(\", \")})`,\n `- /form [kind] (${FORMS.join(\", \")})`,\n `- /fmt <kind> (${KINDS.join(\", \")})`,\n \"Examples:\",\n \"- /permission shell\",\n \"- /form question\",\n \"- /form external\",\n \"- /fmt markdown\",\n \"- /fmt table\",\n \"- /fmt text your custom text\",\n ].join(\"\\n\"),\n )\n}\n\nexport function createRunDemo(input: Input) {\n const state: State = {\n id: input.sessionID,\n thinking: input.thinking,\n footer: input.footer,\n msg: 0,\n part: 0,\n call: 0,\n perm: 0,\n form: 0,\n perms: new Map(),\n forms: new Map(),\n started: new Set(),\n }\n\n const start = async (): Promise<void> => {\n intro(state)\n }\n\n const prompt = async (line: RunPrompt, signal?: AbortSignal): Promise<boolean> => {\n const text = line.text.trim()\n const list = text.split(/\\s+/)\n const cmd = list[0] || \"\"\n\n clearSubagent(state.footer)\n\n if (cmd === \"/help\") {\n intro(state)\n return true\n }\n\n if (cmd === \"/permission\") {\n const kind = permissionKind(list[1])\n if (!kind) {\n note(state.footer, `Pick a permission kind: ${PERMISSIONS.join(\", \")}`)\n return true\n }\n\n emitPermission(state, kind)\n return true\n }\n\n if (cmd === \"/form\") {\n const kind = formKind(list[1])\n if (!kind) {\n note(state.footer, `Pick a form kind: ${FORMS.join(\", \")}`)\n return true\n }\n\n emitForm(state, kind)\n return true\n }\n\n if (cmd === \"/fmt\") {\n const kind = (list[1] || \"\").toLowerCase()\n const body = list.slice(2).join(\" \")\n if (!kind) {\n note(state.footer, `Pick a kind: ${KINDS.join(\", \")}`)\n return true\n }\n\n const ok = await emitFmt(state, kind, body, signal)\n if (ok) {\n return true\n }\n\n note(state.footer, `Unknown kind \"${kind}\". Use: ${KINDS.join(\", \")}`)\n return true\n }\n\n return false\n }\n\n const permission = (input: PermissionReply): boolean => {\n const item = state.perms.get(input.requestID)\n if (!item || !input.reply) {\n return false\n }\n\n state.perms.delete(input.requestID)\n clearBlocker(state)\n\n if (input.reply === \"reject\") {\n failTool(state, item.ref, input.message || \"permission rejected\")\n return true\n }\n\n doneTool(state, item.ref, item.done)\n return true\n }\n\n const formReply = (input: FormReply): boolean => {\n const form = state.forms.get(input.formID)\n if (!form || input.sessionID !== form.request.sessionID) return false\n state.forms.delete(input.formID)\n clearBlocker(state)\n if (form.kind === \"question\") {\n doneTool(state, form.ref, {\n title: \"question\",\n output: \"\",\n metadata: {\n answers: form.request.fields.map((field) => {\n const value = input.answer[field.key]\n if (value === undefined) return []\n return Array.isArray(value) ? [...value] : [String(value)]\n }),\n },\n })\n return true\n }\n doneTool(state, form.ref, {\n title: form.request.title,\n output: `Form submitted: ${Object.entries(input.answer)\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.join(\", \") : String(value)}`)\n .join(\"; \")}\\n`,\n metadata: { answer: input.answer },\n })\n return true\n }\n\n const formCancel = (input: FormCancel): boolean => {\n const form = state.forms.get(input.formID)\n if (!form || input.sessionID !== form.request.sessionID) return false\n state.forms.delete(input.formID)\n clearBlocker(state)\n failTool(state, form.ref, \"form cancelled\")\n return true\n }\n\n return {\n start,\n prompt,\n permission,\n formReply,\n formCancel,\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "A4ACF4A2AC2A7A0064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/add.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, stat, writeFile } from \"node:fs/promises\"\nimport { Effect, Option } from \"effect\"\nimport { applyEdits, modify } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? global.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\nexport async function resolveConfigPath(directory: string) {\n const candidates = [\n path.join(directory, \"opencode.json\"),\n path.join(directory, \"opencode.jsonc\"),\n path.join(directory, \".opencode\", \"opencode.json\"),\n path.join(directory, \".opencode\", \"opencode.jsonc\"),\n ]\n for (const candidate of candidates) {\n if (\n await stat(candidate).then(\n (info) => info.isFile(),\n () => false,\n )\n )\n return candidate\n }\n return candidates[0]\n}\n\nasync function write(configPath: string, name: string, server: unknown) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const edits = modify(text, [\"mcp\", \"servers\", name], server, {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n })\n await writeFile(configPath, applyEdits(text, edits))\n}\n" | ||
| ], | ||
| "mappings": ";qrBAAA,mBAAS,gBACT,yBACA,wBAAS,eAAU,oBAAM,yBAOzB,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,SAC/B,OAAO,QAAG,aAAa,EAAE,SAAU,CAAC,EAAO,CACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,OAAS,QAAQ,IAAI,CAAC,CAAC,EAC9G,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAsB,CAAiB,CAAC,EAAmB,CACzD,IAAM,EAAa,CACjB,EAAK,KAAK,EAAW,eAAe,EACpC,EAAK,KAAK,EAAW,gBAAgB,EACrC,EAAK,KAAK,EAAW,YAAa,eAAe,EACjD,EAAK,KAAK,EAAW,YAAa,gBAAgB,CACpD,EACA,QAAW,KAAa,EACtB,GACE,MAAM,EAAK,CAAS,EAAE,KACpB,CAAC,IAAS,EAAK,OAAO,EACtB,IAAM,EACR,EAEA,OAAO,EAEX,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,EAAU,EAAY,EAAW,EAAM,CAAK,CAAC", | ||
| "debugId": "A266671956B7B9B464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/auth.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n OpenCode,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpenCodeClient,\n} from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.auth,\n Effect.fn(\"cli.mcp.auth\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n const method = integration.methods.find(\n (candidate): candidate is IntegrationOAuthMethod => candidate.type === \"oauth\",\n )\n if (!method)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n\n const started = yield* Effect.promise(() =>\n client.integration.oauth.connect({ integrationID: integration.id, methodID: method.id, inputs: {}, location }),\n )\n const attempt = started.data\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, integration.id, attempt.attemptID)\n if (result.status === \"complete\") {\n process.stdout.write(`Authenticated with ${input.name}` + EOL)\n return\n }\n const reason = result.status === \"failed\" ? `: ${result.message}` : \"\"\n return yield* Effect.fail(new Error(`Authentication ${result.status}${reason}`))\n }),\n)\n\nconst poll = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n): Effect.Effect<Exclude<IntegrationAttemptStatus, { status: \"pending\" }>> =>\n Effect.gen(function* () {\n const status = yield* Effect.promise(() =>\n client.integration.oauth.status({ integrationID, attemptID, location }),\n ).pipe(Effect.map((result) => result.data))\n if (status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, integrationID, attemptID)\n }\n return status\n })\n" | ||
| ], | ||
| "mappings": ";66BAAA,mBAAS,gBAcT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,MAAC,OAAO,CAC1C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAKzG,IAAM,GAHU,MAAO,EAAO,QAAQ,IACpC,EAAO,YAAY,MAAM,QAAQ,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,OAAQ,CAAC,EAAG,UAAS,CAAC,CAC/G,GACwB,KACxB,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAY,GAAI,EAAQ,SAAS,EACpE,GAAI,EAAO,SAAW,WAAY,CAChC,QAAQ,OAAO,MAAM,sBAAsB,EAAM,OAAS,CAAG,EAC7D,OAEF,IAAM,EAAS,EAAO,SAAW,SAAW,KAAK,EAAO,UAAY,GACpE,OAAO,MAAO,EAAO,KAAS,MAAM,kBAAkB,EAAO,SAAS,GAAQ,CAAC,EAChF,CACH,EAEM,EAAO,CACX,EACA,EACA,IAEA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAS,MAAO,EAAO,QAAQ,IACnC,EAAO,YAAY,MAAM,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CACxE,EAAE,KAAK,EAAO,IAAI,CAAC,IAAW,EAAO,IAAI,CAAC,EAC1C,GAAI,EAAO,SAAW,UAEpB,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,EAAe,CAAS,EAErD,OAAO,EACR", | ||
| "debugId": "030D156C0F0939B264756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/image/photon-wasm.bun.ts", "../core/src/image/photon.ts"], | ||
| "sourcesContent": [ | ||
| "// @ts-ignore Bun embeds static file imports when compiling the CLI.\nimport photonWasm from \"@silvia-odwyer/photon-node/photon_rs_bg.wasm\" with { type: \"file\" }\n\nexport default photonWasm\n", | ||
| "import photonWasm from \"#photon-wasm\"\nimport { Effect } from \"effect\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { FileSystem } from \"../filesystem\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image\"\n\nconst JPEG_QUALITIES = [80, 85, 70, 55, 40]\n\nexport const make = Effect.gen(function* () {\n ;(globalThis as typeof globalThis & { __OPENCODE_PHOTON_WASM_PATH?: string }).__OPENCODE_PHOTON_WASM_PATH =\n path.isAbsolute(photonWasm) ? photonWasm : fileURLToPath(new URL(photonWasm, import.meta.url))\n const loadPhoton = yield* Effect.cached(\n Effect.tryPromise({\n try: () => import(\"@silvia-odwyer/photon-node\"),\n catch: () => new ResizerUnavailableError(),\n }),\n )\n return Effect.fn(\"Image.Photon.normalize\")(function* (\n resource: string,\n content: FileSystem.Content & { readonly encoding: \"base64\" },\n limits: {\n readonly autoResize: boolean\n readonly maxWidth: number\n readonly maxHeight: number\n readonly maxBase64Bytes: number\n },\n ) {\n const photon = yield* loadPhoton\n const decoded = yield* Effect.try({\n try: () => photon.PhotonImage.new_from_byteslice(Buffer.from(content.content, \"base64\")),\n catch: () => new DecodeError({ resource }),\n })\n try {\n const width = decoded.get_width()\n const height = decoded.get_height()\n const bytes = Buffer.byteLength(content.content, \"utf-8\")\n if (width <= limits.maxWidth && height <= limits.maxHeight && bytes <= limits.maxBase64Bytes) return content\n if (!limits.autoResize)\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n const scale = Math.min(1, limits.maxWidth / width, limits.maxHeight / height)\n const sizes = Array.from({ length: 32 }).reduce<Array<{ width: number; height: number }>>((acc) => {\n const previous = acc.at(-1) ?? {\n width: Math.max(1, Math.round(width * scale)),\n height: Math.max(1, Math.round(height * scale)),\n }\n const next =\n acc.length === 0\n ? previous\n : {\n width: previous.width === 1 ? 1 : Math.max(1, Math.floor(previous.width * 0.75)),\n height: previous.height === 1 ? 1 : Math.max(1, Math.floor(previous.height * 0.75)),\n }\n return acc.some((item) => item.width === next.width && item.height === next.height) ? acc : [...acc, next]\n }, [])\n for (const size of sizes) {\n const resized = photon.resize(decoded, size.width, size.height, photon.SamplingFilter.Lanczos3)\n try {\n const encoders: Array<readonly [mime: string, encode: () => Uint8Array]> = [\n [\"image/png\", () => resized.get_bytes()],\n ...JPEG_QUALITIES.map((quality) => [\"image/jpeg\", () => resized.get_bytes_jpeg(quality)] as const),\n ]\n for (const [mime, encode] of encoders) {\n const candidate = Buffer.from(encode()).toString(\"base64\")\n if (Buffer.byteLength(candidate, \"utf-8\") <= limits.maxBase64Bytes)\n return { ...content, content: candidate, encoding: \"base64\" as const, mime }\n }\n } finally {\n resized.free()\n }\n }\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n } finally {\n decoded.free()\n }\n })\n})\n" | ||
| ], | ||
| "mappings": ";6zBAGA,SAAe,SCDf,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,0CAC5E,EAAK,WAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF", | ||
| "debugId": "32F498F8C857F10E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/restart.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.restart,\n Effect.fn(\"cli.service.restart\")(function* () {\n const options = yield* ServiceConfig.options()\n yield* Service.stop(options)\n const transport = yield* Service.ensure(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+0BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,MAC5C,SAAM,OAAU,WAAO,OAAc,aAAQ,EAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "B0232AD7946D45B064756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is not supported yet
297
0.34%258489116
0