@di-code/coding-agent 0.1.9 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/compositions/base.yml +3 -0
- package/dist/compositions.d.ts.map +1 -1
- package/dist/compositions.js +2 -0
- package/dist/compositions.js.map +1 -1
- package/dist/core/image-input.d.ts +1 -1
- package/dist/core/image-input.d.ts.map +1 -1
- package/dist/core/image-input.js +15 -4
- package/dist/core/image-input.js.map +1 -1
- package/dist/core/session/session-storage.d.ts.map +1 -1
- package/dist/core/session/session-storage.js +12 -1
- package/dist/core/session/session-storage.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +5 -1
- package/dist/main.js.map +1 -1
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +19 -0
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp-command-entry.d.ts +8 -0
- package/dist/mcp-command-entry.d.ts.map +1 -0
- package/dist/mcp-command-entry.js +56 -0
- package/dist/mcp-command-entry.js.map +1 -0
- package/dist/modes/interactive-state.d.ts.map +1 -1
- package/dist/modes/interactive-state.js +1 -4
- package/dist/modes/interactive-state.js.map +1 -1
- package/dist/modes/tree-selector.d.ts.map +1 -1
- package/dist/modes/tree-selector.js +1 -4
- package/dist/modes/tree-selector.js.map +1 -1
- package/dist/rpc/protocol.d.ts.map +1 -1
- package/dist/rpc/protocol.js +22 -0
- package/dist/rpc/protocol.js.map +1 -1
- package/dist/runtime/session-factory.d.ts.map +1 -1
- package/dist/runtime/session-factory.js +2 -1
- package/dist/runtime/session-factory.js.map +1 -1
- package/dist/web/assets/index-C-NyCPxd.css +1 -0
- package/dist/web/assets/{index-DPUaJqFJ.js → index-DgyxuNNG.js} +3 -3
- package/dist/web/assets/index-DgyxuNNG.js.map +1 -0
- package/dist/web/index.html +2 -2
- package/package.json +9 -9
- package/dist/web/assets/index-BwfuGMvv.css +0 -1
- package/dist/web/assets/index-DPUaJqFJ.js.map +0 -1
package/dist/mcp/config.js
CHANGED
|
@@ -10,6 +10,13 @@ function requiredString(value, path) {
|
|
|
10
10
|
throw new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be a non-empty string`);
|
|
11
11
|
return value.trim();
|
|
12
12
|
}
|
|
13
|
+
function optionalTimeout(value, path) {
|
|
14
|
+
if (value === undefined)
|
|
15
|
+
return undefined;
|
|
16
|
+
if (!Number.isSafeInteger(value) || value <= 0 || value > 300_000)
|
|
17
|
+
throw new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be a positive integer no greater than 300000`);
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
13
20
|
function resolveEnvironmentValue(value, path, environment) {
|
|
14
21
|
return value.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (_whole, name) => {
|
|
15
22
|
const resolved = environment[name];
|
|
@@ -67,6 +74,12 @@ function parseServer(id, value, cwd, environment) {
|
|
|
67
74
|
cwd,
|
|
68
75
|
env: { ...inheritedEnvironment(), ...env },
|
|
69
76
|
},
|
|
77
|
+
...(optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) === undefined
|
|
78
|
+
? {}
|
|
79
|
+
: { connectTimeoutMs: optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) }),
|
|
80
|
+
...(optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) === undefined
|
|
81
|
+
? {}
|
|
82
|
+
: { callTimeoutMs: optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) }),
|
|
70
83
|
};
|
|
71
84
|
}
|
|
72
85
|
if (entry.type !== "http")
|
|
@@ -93,6 +106,12 @@ function parseServer(id, value, cwd, environment) {
|
|
|
93
106
|
url: parsedUrl.toString(),
|
|
94
107
|
...(headers ? { headers } : {}),
|
|
95
108
|
},
|
|
109
|
+
...(optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) === undefined
|
|
110
|
+
? {}
|
|
111
|
+
: { connectTimeoutMs: optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) }),
|
|
112
|
+
...(optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) === undefined
|
|
113
|
+
? {}
|
|
114
|
+
: { callTimeoutMs: optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) }),
|
|
96
115
|
};
|
|
97
116
|
}
|
|
98
117
|
export function mcpConfigPath(cwd, scope = "project", homeDirectory = homedir()) {
|
package/dist/mcp/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { McpServerConfig } from \"@di-code/mcp\";\n\nconst PROJECT_CONFIG_FILE_NAME = \".mcp.json\";\nconst LOCAL_CONFIG_FILE_NAME = join(\".di-code\", \"mcp.local.json\");\nconst USER_CONFIG_FILE_NAME = join(\".di-code\", \"mcp.json\");\nconst SERVER_ID_PATTERN = /^[a-z0-9][a-z0-9_-]{0,62}$/;\nexport type McpConfigScope = \"local\" | \"project\" | \"user\";\ntype Environment = Readonly<Record<string, string | undefined>>;\nexport interface McpConfigDocument {\n\treadonly mcpServers: Readonly<Record<string, unknown>>;\n}\n\nfunction requiredString(value: unknown, path: string): string {\n\tif (typeof value !== \"string\" || !value.trim())\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be a non-empty string`);\n\treturn value.trim();\n}\n\nfunction resolveEnvironmentValue(value: string, path: string, environment: Environment): string {\n\treturn value.replace(/\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g, (_whole, name: string) => {\n\t\tconst resolved = environment[name];\n\t\tif (!resolved) throw new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} environment variable \"${name}\" is not set`);\n\t\treturn resolved;\n\t});\n}\n\nfunction parseEnvironment(value: unknown, path: string, environment: Environment): Record<string, string> | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be an object`);\n\tconst result: Record<string, string> = {};\n\tfor (const [name, raw] of Object.entries(value as Record<string, unknown>)) {\n\t\tif (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))\n\t\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path}.${name} is not a valid environment variable name`);\n\t\tresult[name] = resolveEnvironmentValue(requiredString(raw, `${path}.${name}`), `${path}.${name}`, environment);\n\t}\n\treturn result;\n}\n\nfunction parseHeaders(value: unknown, path: string, environment: Environment): Record<string, string> | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be an object`);\n\tconst result: Record<string, string> = {};\n\tfor (const [name, raw] of Object.entries(value as Record<string, unknown>)) {\n\t\tif (!name.trim()) throw new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} contains an empty header name`);\n\t\tresult[name] = resolveEnvironmentValue(requiredString(raw, `${path}.${name}`), `${path}.${name}`, environment);\n\t}\n\treturn result;\n}\n\nfunction inheritedEnvironment(): Record<string, string> {\n\treturn Object.fromEntries(\n\t\tObject.entries(process.env).filter((entry): entry is [string, string] => entry[1] !== undefined),\n\t);\n}\n\nfunction parseServer(id: string, value: unknown, cwd: string, environment: Environment): McpServerConfig {\n\tif (!SERVER_ID_PATTERN.test(id))\n\t\tthrow new Error(\n\t\t\t`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id} must use lowercase letters, numbers, hyphens, or underscores`,\n\t\t);\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id} must be an object`);\n\tconst entry = value as Record<string, unknown>;\n\tif (entry.type === undefined || entry.type === \"stdio\") {\n\t\tif (\n\t\t\tentry.args !== undefined &&\n\t\t\t(!Array.isArray(entry.args) || entry.args.some((argument) => typeof argument !== \"string\"))\n\t\t)\n\t\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.args must be an array of strings`);\n\t\tconst env = parseEnvironment(entry.env, `mcpServers.${id}.env`, environment);\n\t\treturn {\n\t\t\tid,\n\t\t\ttransport: {\n\t\t\t\ttype: \"stdio\",\n\t\t\t\tcommand: requiredString(entry.command, `mcpServers.${id}.command`),\n\t\t\t\t...(entry.args === undefined ? {} : { args: [...(entry.args as string[])] }),\n\t\t\t\tcwd,\n\t\t\t\tenv: { ...inheritedEnvironment(), ...env },\n\t\t\t},\n\t\t};\n\t}\n\tif (entry.type !== \"http\")\n\t\tthrow new Error(\n\t\t\t`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.type \"${String(entry.type)}\" is not supported; expected stdio or http`,\n\t\t);\n\tconst url = requiredString(entry.url, `mcpServers.${id}.url`);\n\tlet parsedUrl: URL;\n\ttry {\n\t\tparsedUrl = new URL(url);\n\t} catch (cause) {\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.url must be an absolute http or https URL`, {\n\t\t\tcause,\n\t\t});\n\t}\n\tif (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\")\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.url must use http or https`);\n\tif (parsedUrl.username || parsedUrl.password)\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.url must not contain credentials`);\n\tconst headers = parseHeaders(entry.headers, `mcpServers.${id}.headers`, environment);\n\treturn {\n\t\tid,\n\t\ttransport: {\n\t\t\ttype: \"streamable-http\" as const,\n\t\t\turl: parsedUrl.toString(),\n\t\t\t...(headers ? { headers } : {}),\n\t\t},\n\t};\n}\n\nexport function mcpConfigPath(cwd: string, scope: McpConfigScope = \"project\", homeDirectory = homedir()): string {\n\treturn scope === \"project\"\n\t\t? join(resolve(cwd), PROJECT_CONFIG_FILE_NAME)\n\t\t: scope === \"local\"\n\t\t\t? join(resolve(cwd), LOCAL_CONFIG_FILE_NAME)\n\t\t\t: join(resolve(homeDirectory), USER_CONFIG_FILE_NAME);\n}\n\nasync function readDocument(path: string): Promise<McpConfigDocument> {\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(path, \"utf8\");\n\t} catch (cause) {\n\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") return { mcpServers: {} };\n\t\tthrow cause;\n\t}\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (cause) {\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: invalid JSON`, { cause });\n\t}\n\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: root value must be an object`);\n\tconst servers = (parsed as Record<string, unknown>).mcpServers;\n\tif (typeof servers !== \"object\" || servers === null || Array.isArray(servers))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers must be an object`);\n\treturn { mcpServers: { ...(servers as Record<string, unknown>) } };\n}\n\nexport async function readMcpConfigScope(\n\tcwd: string,\n\tscope: McpConfigScope,\n\thomeDirectory = homedir(),\n): Promise<McpConfigDocument> {\n\treturn readDocument(mcpConfigPath(cwd, scope, homeDirectory));\n}\n\nexport async function loadMcpConfig(\n\tcwd: string,\n\tenvironment: Environment = process.env,\n): Promise<readonly McpServerConfig[]> {\n\tconst document = await readMcpConfigScope(cwd, \"project\");\n\treturn Object.entries(document.mcpServers)\n\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t.map(([id, server]) => parseServer(id, server, cwd, environment));\n}\n\nexport async function loadEffectiveMcpConfig(options: {\n\tcwd: string;\n\thomeDirectory?: string;\n\tenvironment?: Environment;\n\tprojectTrusted: boolean;\n}): Promise<readonly McpServerConfig[]> {\n\tconst environment = options.environment ?? process.env;\n\tconst scopes: readonly McpConfigScope[] = options.projectTrusted ? [\"user\", \"project\", \"local\"] : [\"user\"];\n\tconst merged = new Map<string, unknown>();\n\tfor (const scope of scopes) {\n\t\tconst document = await readMcpConfigScope(options.cwd, scope, options.homeDirectory);\n\t\tfor (const [id, server] of Object.entries(document.mcpServers)) merged.set(id, server);\n\t}\n\treturn [...merged.entries()]\n\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t.map(([id, server]) => parseServer(id, server, options.cwd, environment));\n}\n\nfunction redactedEntry(value: unknown): unknown {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return value;\n\tconst entry = { ...(value as Record<string, unknown>) };\n\tfor (const field of [\"env\", \"headers\"]) {\n\t\tconst values = entry[field];\n\t\tif (typeof values !== \"object\" || values === null || Array.isArray(values)) continue;\n\t\tentry[field] = Object.fromEntries(\n\t\t\tObject.entries(values).map(([name, raw]) => [\n\t\t\t\tname,\n\t\t\t\ttypeof raw === \"string\" && /^\\$\\{[A-Za-z_][A-Za-z0-9_]*\\}$/.test(raw) ? raw : \"[redacted]\",\n\t\t\t]),\n\t\t);\n\t}\n\treturn entry;\n}\n\nexport async function listMcpConfig(\n\tcwd: string,\n\tscope: McpConfigScope,\n\thomeDirectory = homedir(),\n): Promise<readonly { id: string; scope: McpConfigScope; config: unknown }[]> {\n\tconst document = await readMcpConfigScope(cwd, scope, homeDirectory);\n\treturn Object.entries(document.mcpServers)\n\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t.map(([id, config]) => ({ id, scope, config: redactedEntry(config) }));\n}\n\nexport async function getMcpConfig(\n\tcwd: string,\n\tid: string,\n\tscope?: McpConfigScope,\n\thomeDirectory = homedir(),\n): Promise<{ id: string; scope: McpConfigScope; config: unknown } | undefined> {\n\tconst scopes = scope ? [scope] : ([\"local\", \"project\", \"user\"] as const);\n\tfor (const current of scopes) {\n\t\tconst document = await readMcpConfigScope(cwd, current, homeDirectory);\n\t\tif (id in document.mcpServers) return { id, scope: current, config: redactedEntry(document.mcpServers[id]) };\n\t}\n\treturn undefined;\n}\n\nasync function writeDocument(\n\tcwd: string,\n\tscope: McpConfigScope,\n\tdocument: McpConfigDocument,\n\thomeDirectory = homedir(),\n): Promise<void> {\n\tconst path = mcpConfigPath(cwd, scope, homeDirectory);\n\tawait mkdir(dirname(path), { recursive: true });\n\tconst temporaryPath = `${path}.${process.pid}.${Date.now()}.tmp`;\n\tawait writeFile(temporaryPath, `${JSON.stringify({ mcpServers: document.mcpServers }, null, 2)}\\n`, \"utf8\");\n\ttry {\n\t\tawait rename(temporaryPath, path);\n\t} catch (cause) {\n\t\tawait unlink(temporaryPath).catch(() => undefined);\n\t\tthrow cause;\n\t}\n}\n\nexport async function addMcpConfig(\n\tcwd: string,\n\tscope: McpConfigScope,\n\tid: string,\n\tconfig: unknown,\n\toptions: { homeDirectory?: string; environment?: Environment } = {},\n): Promise<void> {\n\tif (!SERVER_ID_PATTERN.test(id)) throw new Error(`Invalid MCP server id \"${id}\".`);\n\tconst document = await readMcpConfigScope(cwd, scope, options.homeDirectory);\n\tif (id in document.mcpServers) throw new Error(`MCP server \"${id}\" already exists in ${scope} scope.`);\n\tparseServer(id, config, cwd, options.environment ?? process.env);\n\tawait writeDocument(cwd, scope, { mcpServers: { ...document.mcpServers, [id]: config } }, options.homeDirectory);\n}\n\nexport async function removeMcpConfig(\n\tcwd: string,\n\tscope: McpConfigScope,\n\tid: string,\n\thomeDirectory = homedir(),\n): Promise<void> {\n\tconst document = await readMcpConfigScope(cwd, scope, homeDirectory);\n\tif (!(id in document.mcpServers)) throw new Error(`MCP server \"${id}\" was not found in ${scope} scope.`);\n\tconst { [id]: _removed, ...remaining } = document.mcpServers;\n\tawait writeDocument(cwd, scope, { mcpServers: remaining }, homeDirectory);\n}\n\nexport { SERVER_ID_PATTERN };\n"]}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { McpServerConfig } from \"@di-code/mcp\";\n\nconst PROJECT_CONFIG_FILE_NAME = \".mcp.json\";\nconst LOCAL_CONFIG_FILE_NAME = join(\".di-code\", \"mcp.local.json\");\nconst USER_CONFIG_FILE_NAME = join(\".di-code\", \"mcp.json\");\nconst SERVER_ID_PATTERN = /^[a-z0-9][a-z0-9_-]{0,62}$/;\nexport type McpConfigScope = \"local\" | \"project\" | \"user\";\ntype Environment = Readonly<Record<string, string | undefined>>;\nexport interface McpConfigDocument {\n\treadonly mcpServers: Readonly<Record<string, unknown>>;\n}\n\nfunction requiredString(value: unknown, path: string): string {\n\tif (typeof value !== \"string\" || !value.trim())\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be a non-empty string`);\n\treturn value.trim();\n}\n\nfunction optionalTimeout(value: unknown, path: string): number | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Number.isSafeInteger(value) || (value as number) <= 0 || (value as number) > 300_000)\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be a positive integer no greater than 300000`);\n\treturn value as number;\n}\n\nfunction resolveEnvironmentValue(value: string, path: string, environment: Environment): string {\n\treturn value.replace(/\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g, (_whole, name: string) => {\n\t\tconst resolved = environment[name];\n\t\tif (!resolved) throw new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} environment variable \"${name}\" is not set`);\n\t\treturn resolved;\n\t});\n}\n\nfunction parseEnvironment(value: unknown, path: string, environment: Environment): Record<string, string> | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be an object`);\n\tconst result: Record<string, string> = {};\n\tfor (const [name, raw] of Object.entries(value as Record<string, unknown>)) {\n\t\tif (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))\n\t\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path}.${name} is not a valid environment variable name`);\n\t\tresult[name] = resolveEnvironmentValue(requiredString(raw, `${path}.${name}`), `${path}.${name}`, environment);\n\t}\n\treturn result;\n}\n\nfunction parseHeaders(value: unknown, path: string, environment: Environment): Record<string, string> | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} must be an object`);\n\tconst result: Record<string, string> = {};\n\tfor (const [name, raw] of Object.entries(value as Record<string, unknown>)) {\n\t\tif (!name.trim()) throw new Error(`${PROJECT_CONFIG_FILE_NAME}: ${path} contains an empty header name`);\n\t\tresult[name] = resolveEnvironmentValue(requiredString(raw, `${path}.${name}`), `${path}.${name}`, environment);\n\t}\n\treturn result;\n}\n\nfunction inheritedEnvironment(): Record<string, string> {\n\treturn Object.fromEntries(\n\t\tObject.entries(process.env).filter((entry): entry is [string, string] => entry[1] !== undefined),\n\t);\n}\n\nfunction parseServer(id: string, value: unknown, cwd: string, environment: Environment): McpServerConfig {\n\tif (!SERVER_ID_PATTERN.test(id))\n\t\tthrow new Error(\n\t\t\t`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id} must use lowercase letters, numbers, hyphens, or underscores`,\n\t\t);\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id} must be an object`);\n\tconst entry = value as Record<string, unknown>;\n\tif (entry.type === undefined || entry.type === \"stdio\") {\n\t\tif (\n\t\t\tentry.args !== undefined &&\n\t\t\t(!Array.isArray(entry.args) || entry.args.some((argument) => typeof argument !== \"string\"))\n\t\t)\n\t\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.args must be an array of strings`);\n\t\tconst env = parseEnvironment(entry.env, `mcpServers.${id}.env`, environment);\n\t\treturn {\n\t\t\tid,\n\t\t\ttransport: {\n\t\t\t\ttype: \"stdio\",\n\t\t\t\tcommand: requiredString(entry.command, `mcpServers.${id}.command`),\n\t\t\t\t...(entry.args === undefined ? {} : { args: [...(entry.args as string[])] }),\n\t\t\t\tcwd,\n\t\t\t\tenv: { ...inheritedEnvironment(), ...env },\n\t\t\t},\n\t\t\t...(optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) === undefined\n\t\t\t\t? {}\n\t\t\t\t: { connectTimeoutMs: optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) }),\n\t\t\t...(optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) === undefined\n\t\t\t\t? {}\n\t\t\t\t: { callTimeoutMs: optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) }),\n\t\t};\n\t}\n\tif (entry.type !== \"http\")\n\t\tthrow new Error(\n\t\t\t`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.type \"${String(entry.type)}\" is not supported; expected stdio or http`,\n\t\t);\n\tconst url = requiredString(entry.url, `mcpServers.${id}.url`);\n\tlet parsedUrl: URL;\n\ttry {\n\t\tparsedUrl = new URL(url);\n\t} catch (cause) {\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.url must be an absolute http or https URL`, {\n\t\t\tcause,\n\t\t});\n\t}\n\tif (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\")\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.url must use http or https`);\n\tif (parsedUrl.username || parsedUrl.password)\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers.${id}.url must not contain credentials`);\n\tconst headers = parseHeaders(entry.headers, `mcpServers.${id}.headers`, environment);\n\treturn {\n\t\tid,\n\t\ttransport: {\n\t\t\ttype: \"streamable-http\" as const,\n\t\t\turl: parsedUrl.toString(),\n\t\t\t...(headers ? { headers } : {}),\n\t\t},\n\t\t...(optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) === undefined\n\t\t\t? {}\n\t\t\t: { connectTimeoutMs: optionalTimeout(entry.connectTimeoutMs, `mcpServers.${id}.connectTimeoutMs`) }),\n\t\t...(optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) === undefined\n\t\t\t? {}\n\t\t\t: { callTimeoutMs: optionalTimeout(entry.callTimeoutMs, `mcpServers.${id}.callTimeoutMs`) }),\n\t};\n}\n\nexport function mcpConfigPath(cwd: string, scope: McpConfigScope = \"project\", homeDirectory = homedir()): string {\n\treturn scope === \"project\"\n\t\t? join(resolve(cwd), PROJECT_CONFIG_FILE_NAME)\n\t\t: scope === \"local\"\n\t\t\t? join(resolve(cwd), LOCAL_CONFIG_FILE_NAME)\n\t\t\t: join(resolve(homeDirectory), USER_CONFIG_FILE_NAME);\n}\n\nasync function readDocument(path: string): Promise<McpConfigDocument> {\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(path, \"utf8\");\n\t} catch (cause) {\n\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") return { mcpServers: {} };\n\t\tthrow cause;\n\t}\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (cause) {\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: invalid JSON`, { cause });\n\t}\n\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: root value must be an object`);\n\tconst servers = (parsed as Record<string, unknown>).mcpServers;\n\tif (typeof servers !== \"object\" || servers === null || Array.isArray(servers))\n\t\tthrow new Error(`${PROJECT_CONFIG_FILE_NAME}: mcpServers must be an object`);\n\treturn { mcpServers: { ...(servers as Record<string, unknown>) } };\n}\n\nexport async function readMcpConfigScope(\n\tcwd: string,\n\tscope: McpConfigScope,\n\thomeDirectory = homedir(),\n): Promise<McpConfigDocument> {\n\treturn readDocument(mcpConfigPath(cwd, scope, homeDirectory));\n}\n\nexport async function loadMcpConfig(\n\tcwd: string,\n\tenvironment: Environment = process.env,\n): Promise<readonly McpServerConfig[]> {\n\tconst document = await readMcpConfigScope(cwd, \"project\");\n\treturn Object.entries(document.mcpServers)\n\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t.map(([id, server]) => parseServer(id, server, cwd, environment));\n}\n\nexport async function loadEffectiveMcpConfig(options: {\n\tcwd: string;\n\thomeDirectory?: string;\n\tenvironment?: Environment;\n\tprojectTrusted: boolean;\n}): Promise<readonly McpServerConfig[]> {\n\tconst environment = options.environment ?? process.env;\n\tconst scopes: readonly McpConfigScope[] = options.projectTrusted ? [\"user\", \"project\", \"local\"] : [\"user\"];\n\tconst merged = new Map<string, unknown>();\n\tfor (const scope of scopes) {\n\t\tconst document = await readMcpConfigScope(options.cwd, scope, options.homeDirectory);\n\t\tfor (const [id, server] of Object.entries(document.mcpServers)) merged.set(id, server);\n\t}\n\treturn [...merged.entries()]\n\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t.map(([id, server]) => parseServer(id, server, options.cwd, environment));\n}\n\nfunction redactedEntry(value: unknown): unknown {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return value;\n\tconst entry = { ...(value as Record<string, unknown>) };\n\tfor (const field of [\"env\", \"headers\"]) {\n\t\tconst values = entry[field];\n\t\tif (typeof values !== \"object\" || values === null || Array.isArray(values)) continue;\n\t\tentry[field] = Object.fromEntries(\n\t\t\tObject.entries(values).map(([name, raw]) => [\n\t\t\t\tname,\n\t\t\t\ttypeof raw === \"string\" && /^\\$\\{[A-Za-z_][A-Za-z0-9_]*\\}$/.test(raw) ? raw : \"[redacted]\",\n\t\t\t]),\n\t\t);\n\t}\n\treturn entry;\n}\n\nexport async function listMcpConfig(\n\tcwd: string,\n\tscope: McpConfigScope,\n\thomeDirectory = homedir(),\n): Promise<readonly { id: string; scope: McpConfigScope; config: unknown }[]> {\n\tconst document = await readMcpConfigScope(cwd, scope, homeDirectory);\n\treturn Object.entries(document.mcpServers)\n\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t.map(([id, config]) => ({ id, scope, config: redactedEntry(config) }));\n}\n\nexport async function getMcpConfig(\n\tcwd: string,\n\tid: string,\n\tscope?: McpConfigScope,\n\thomeDirectory = homedir(),\n): Promise<{ id: string; scope: McpConfigScope; config: unknown } | undefined> {\n\tconst scopes = scope ? [scope] : ([\"local\", \"project\", \"user\"] as const);\n\tfor (const current of scopes) {\n\t\tconst document = await readMcpConfigScope(cwd, current, homeDirectory);\n\t\tif (id in document.mcpServers) return { id, scope: current, config: redactedEntry(document.mcpServers[id]) };\n\t}\n\treturn undefined;\n}\n\nasync function writeDocument(\n\tcwd: string,\n\tscope: McpConfigScope,\n\tdocument: McpConfigDocument,\n\thomeDirectory = homedir(),\n): Promise<void> {\n\tconst path = mcpConfigPath(cwd, scope, homeDirectory);\n\tawait mkdir(dirname(path), { recursive: true });\n\tconst temporaryPath = `${path}.${process.pid}.${Date.now()}.tmp`;\n\tawait writeFile(temporaryPath, `${JSON.stringify({ mcpServers: document.mcpServers }, null, 2)}\\n`, \"utf8\");\n\ttry {\n\t\tawait rename(temporaryPath, path);\n\t} catch (cause) {\n\t\tawait unlink(temporaryPath).catch(() => undefined);\n\t\tthrow cause;\n\t}\n}\n\nexport async function addMcpConfig(\n\tcwd: string,\n\tscope: McpConfigScope,\n\tid: string,\n\tconfig: unknown,\n\toptions: { homeDirectory?: string; environment?: Environment } = {},\n): Promise<void> {\n\tif (!SERVER_ID_PATTERN.test(id)) throw new Error(`Invalid MCP server id \"${id}\".`);\n\tconst document = await readMcpConfigScope(cwd, scope, options.homeDirectory);\n\tif (id in document.mcpServers) throw new Error(`MCP server \"${id}\" already exists in ${scope} scope.`);\n\tparseServer(id, config, cwd, options.environment ?? process.env);\n\tawait writeDocument(cwd, scope, { mcpServers: { ...document.mcpServers, [id]: config } }, options.homeDirectory);\n}\n\nexport async function removeMcpConfig(\n\tcwd: string,\n\tscope: McpConfigScope,\n\tid: string,\n\thomeDirectory = homedir(),\n): Promise<void> {\n\tconst document = await readMcpConfigScope(cwd, scope, homeDirectory);\n\tif (!(id in document.mcpServers)) throw new Error(`MCP server \"${id}\" was not found in ${scope} scope.`);\n\tconst { [id]: _removed, ...remaining } = document.mcpServers;\n\tawait writeDocument(cwd, scope, { mcpServers: remaining }, homeDirectory);\n}\n\nexport { SERVER_ID_PATTERN };\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PluginDefinition } from "@di-code/plugin-runtime";
|
|
2
|
+
/** Registers the CLI MCP configuration command in the base composition. */
|
|
3
|
+
export declare const mcpCommand: PluginDefinition;
|
|
4
|
+
export declare const apiVersion: number | undefined;
|
|
5
|
+
export declare const name: string;
|
|
6
|
+
export declare const version: string | undefined;
|
|
7
|
+
export declare const apply: import("@di-code/plugin-runtime").PluginApply<unknown>;
|
|
8
|
+
//# sourceMappingURL=mcp-command-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-command-entry.d.ts","sourceRoot":"","sources":["../src/mcp-command-entry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,2EAA2E;AAC3E,eAAO,MAAM,UAAU,EAAE,gBAoDxB,CAAC;AAEF,eAAO,MAAM,UAAU,oBAAwB,CAAC;AAChD,eAAO,MAAM,IAAI,QAAkB,CAAC;AACpC,eAAO,MAAM,OAAO,oBAAqB,CAAC;AAC1C,eAAO,MAAM,KAAK,wDAAmB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { hostCommandRegistryKey } from "@di-code/builtins";
|
|
2
|
+
import { addMcpConfig, getMcpConfig, listMcpConfig, removeMcpConfig } from "./mcp/config.js";
|
|
3
|
+
/** Registers the CLI MCP configuration command in the base composition. */
|
|
4
|
+
export const mcpCommand = {
|
|
5
|
+
apiVersion: 1,
|
|
6
|
+
name: "mcp-command",
|
|
7
|
+
version: "0.1.9",
|
|
8
|
+
apply(context, _config, fiber) {
|
|
9
|
+
const registry = context.require(hostCommandRegistryKey);
|
|
10
|
+
fiber.addDisposer(registry.register("mcp", async (input) => {
|
|
11
|
+
const command = input;
|
|
12
|
+
const cwd = input.cwd ?? process.cwd();
|
|
13
|
+
const scope = command.scope ?? "local";
|
|
14
|
+
const stdout = input.stdout ?? (() => undefined);
|
|
15
|
+
const serverId = () => {
|
|
16
|
+
if (!command.serverId)
|
|
17
|
+
throw new Error("MCP server id is required.");
|
|
18
|
+
return command.serverId;
|
|
19
|
+
};
|
|
20
|
+
switch (command.action) {
|
|
21
|
+
case "list":
|
|
22
|
+
stdout(`${JSON.stringify(await listMcpConfig(cwd, scope), null, 2)}\n`);
|
|
23
|
+
return 0;
|
|
24
|
+
case "get": {
|
|
25
|
+
const id = serverId();
|
|
26
|
+
const result = await getMcpConfig(cwd, id, command.scope);
|
|
27
|
+
if (!result)
|
|
28
|
+
throw new Error(`MCP server "${id}" was not found.`);
|
|
29
|
+
stdout(`${JSON.stringify(result, null, 2)}\n`);
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
case "remove": {
|
|
33
|
+
const id = serverId();
|
|
34
|
+
await removeMcpConfig(cwd, scope, id);
|
|
35
|
+
stdout(`Removed MCP server "${id}" from ${scope} scope.\n`);
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
case "add": {
|
|
39
|
+
const id = serverId();
|
|
40
|
+
if ((command.transport === "stdio" && !command.command) || (command.transport === "http" && !command.url))
|
|
41
|
+
throw new Error("MCP command is incomplete.");
|
|
42
|
+
await addMcpConfig(cwd, scope, id, command.transport === "stdio"
|
|
43
|
+
? { type: "stdio", command: command.command, ...(command.args ? { args: command.args } : {}) }
|
|
44
|
+
: { type: "http", url: command.url });
|
|
45
|
+
stdout(`Added MCP server "${id}" to ${scope} scope.\n`);
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}));
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
export const apiVersion = mcpCommand.apiVersion;
|
|
53
|
+
export const name = mcpCommand.name;
|
|
54
|
+
export const version = mcpCommand.version;
|
|
55
|
+
export const apply = mcpCommand.apply;
|
|
56
|
+
//# sourceMappingURL=mcp-command-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-command-entry.js","sourceRoot":"","sources":["../src/mcp-command-entry.ts"],"names":[],"mappings":"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","sourcesContent":["import { hostCommandRegistryKey } from \"@di-code/builtins\";\nimport type { PluginDefinition } from \"@di-code/plugin-runtime\";\nimport type { CliCommand } from \"./cli.ts\";\nimport { addMcpConfig, getMcpConfig, listMcpConfig, type McpConfigScope, removeMcpConfig } from \"./mcp/config.ts\";\n\n/** Registers the CLI MCP configuration command in the base composition. */\nexport const mcpCommand: PluginDefinition = {\n\tapiVersion: 1,\n\tname: \"mcp-command\",\n\tversion: \"0.1.9\",\n\tapply(context, _config, fiber) {\n\t\tconst registry = context.require(hostCommandRegistryKey);\n\t\tfiber.addDisposer(\n\t\t\tregistry.register(\"mcp\", async (input) => {\n\t\t\t\tconst command = input as Extract<CliCommand, { kind: \"mcp\" }>;\n\t\t\t\tconst cwd = (input as { readonly cwd?: string }).cwd ?? process.cwd();\n\t\t\t\tconst scope: McpConfigScope = command.scope ?? \"local\";\n\t\t\t\tconst stdout = (input as { readonly stdout?: (text: string) => void }).stdout ?? (() => undefined);\n\t\t\t\tconst serverId = (): string => {\n\t\t\t\t\tif (!command.serverId) throw new Error(\"MCP server id is required.\");\n\t\t\t\t\treturn command.serverId;\n\t\t\t\t};\n\t\t\t\tswitch (command.action) {\n\t\t\t\t\tcase \"list\":\n\t\t\t\t\t\tstdout(`${JSON.stringify(await listMcpConfig(cwd, scope), null, 2)}\\n`);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\tcase \"get\": {\n\t\t\t\t\t\tconst id = serverId();\n\t\t\t\t\t\tconst result = await getMcpConfig(cwd, id, command.scope);\n\t\t\t\t\t\tif (!result) throw new Error(`MCP server \"${id}\" was not found.`);\n\t\t\t\t\t\tstdout(`${JSON.stringify(result, null, 2)}\\n`);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"remove\": {\n\t\t\t\t\t\tconst id = serverId();\n\t\t\t\t\t\tawait removeMcpConfig(cwd, scope, id);\n\t\t\t\t\t\tstdout(`Removed MCP server \"${id}\" from ${scope} scope.\\n`);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"add\": {\n\t\t\t\t\t\tconst id = serverId();\n\t\t\t\t\t\tif ((command.transport === \"stdio\" && !command.command) || (command.transport === \"http\" && !command.url))\n\t\t\t\t\t\t\tthrow new Error(\"MCP command is incomplete.\");\n\t\t\t\t\t\tawait addMcpConfig(\n\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\tscope,\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tcommand.transport === \"stdio\"\n\t\t\t\t\t\t\t\t? { type: \"stdio\", command: command.command, ...(command.args ? { args: command.args } : {}) }\n\t\t\t\t\t\t\t\t: { type: \"http\", url: command.url },\n\t\t\t\t\t\t);\n\t\t\t\t\t\tstdout(`Added MCP server \"${id}\" to ${scope} scope.\\n`);\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t},\n};\n\nexport const apiVersion = mcpCommand.apiVersion;\nexport const name = mcpCommand.name;\nexport const version = mcpCommand.version;\nexport const apply = mcpCommand.apply;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-state.d.ts","sourceRoot":"","sources":["../../src/modes/interactive-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG1E,MAAM,MAAM,kBAAkB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9D;IACA,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAClC,CAAC;AAIL,MAAM,MAAM,sBAAsB,GAC/B;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAA;CAAE,GACtD;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;CAC7C,CAAC;AAEL,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACrD,QAAQ,CAAC,YAAY,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACzD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC7B;
|
|
1
|
+
{"version":3,"file":"interactive-state.d.ts","sourceRoot":"","sources":["../../src/modes/interactive-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { computeEditsDiff } from "../core/tools/edit-diff.js";
|
|
2
2
|
function textOf(message) {
|
|
3
|
-
return message.content
|
|
4
|
-
.filter((content) => content.type === "text")
|
|
5
|
-
.map((content) => content.text)
|
|
6
|
-
.join("");
|
|
3
|
+
return message.content.map((content) => (content.type === "text" ? content.text : "")).join("");
|
|
7
4
|
}
|
|
8
5
|
export class InteractiveProjection {
|
|
9
6
|
messages = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-state.js","sourceRoot":"","sources":["../../src/modes/interactive-state.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Message } from \"@di-code/ai\";\nimport type { AgentSessionEvent, SessionUsage } from \"../core/session.ts\";\nimport { computeEditsDiff, type Edit } from \"../core/tools/edit-diff.ts\";\n\nexport type InteractiveMessage =\n\t| { readonly role: \"user\" | \"assistant\"; readonly text: string }\n\t| {\n\t\t\treadonly role: \"file_change\";\n\t\t\treadonly id: string;\n\t\t\treadonly path: string;\n\t\t\treadonly kind: \"edit\" | \"write\";\n\t\t\treadonly removed: readonly string[];\n\t\t\treadonly added: readonly string[];\n\t\t\treadonly diff?: string;\n\t\t\treadonly firstChangedLine?: number;\n\t };\n\ntype FileChangeCandidate = Extract<InteractiveMessage, { role: \"file_change\" }>;\n\nexport type InteractiveProcessItem =\n\t| { readonly type: \"thinking\"; readonly id: \"thinking\" }\n\t| {\n\t\t\treadonly type: \"tool\";\n\t\t\treadonly id: string;\n\t\t\treadonly command: string;\n\t\t\treadonly status: \"running\" | \"done\" | \"error\";\n\t };\n\nexport interface InteractiveState {\n\treadonly messages: readonly string[];\n\treadonly messageItems: readonly InteractiveMessage[];\n\treadonly processItems: readonly InteractiveProcessItem[];\n\treadonly spinnerFrame: number;\n\treadonly streamingText: string;\n\treadonly toolStatus: readonly string[];\n\treadonly busy: boolean;\n\treadonly error?: string;\n\treadonly queue: readonly string[];\n\treadonly status?: string;\n\treadonly compacting: boolean;\n\treadonly retrying: boolean;\n\treadonly usage: SessionUsage;\n}\n\nfunction textOf(message: Message): string {\n\ttype TextBlock = Extract<Message[\"content\"][number], { type: \"text\" }>;\n\treturn message.content\n\t\t.filter((content): content is TextBlock => content.type === \"text\")\n\t\t.map((content) => content.text)\n\t\t.join(\"\");\n}\n\nexport class InteractiveProjection {\n\tprivate readonly messages: string[] = [];\n\tprivate readonly messageItems: InteractiveMessage[] = [];\n\tprivate readonly pendingFileChanges = new Map<string, FileChangeCandidate>();\n\tprivate readonly processItems: InteractiveProcessItem[] = [];\n\tprivate readonly toolStatus = new Map<string, string>();\n\tprivate spinnerFrame = 0;\n\tprivate streamingText = \"\";\n\tprivate busy = false;\n\tprivate error: string | undefined;\n\tprivate queue: string[] = [];\n\tprivate status: string | undefined;\n\tprivate compacting = false;\n\tprivate retrying = false;\n\tprivate previewRoot: string | undefined;\n\tprivate previewChange: (() => void) | undefined;\n\tprivate usage: SessionUsage = {\n\t\trequestCount: 0,\n\t\tinputTokens: 0,\n\t\toutputTokens: 0,\n\t\tcacheReadTokens: 0,\n\t\tcacheWriteTokens: 0,\n\t\ttotalTokens: 0,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\testimatedContextTokens: 0,\n\t\tcontextWindow: 0,\n\t\treserveTokens: 0,\n\t\ttriggerTokens: 0,\n\t};\n\n\tget state(): InteractiveState {\n\t\tconst visibleMessageItems = [...this.messageItems, ...this.pendingFileChanges.values()];\n\t\treturn {\n\t\t\tmessages: [...this.messages],\n\t\t\tmessageItems: visibleMessageItems.map((message) =>\n\t\t\t\tmessage.role === \"file_change\"\n\t\t\t\t\t? { ...message, removed: [...message.removed], added: [...message.added] }\n\t\t\t\t\t: { ...message },\n\t\t\t),\n\t\t\tprocessItems: this.processItems.map((item) => ({ ...item })),\n\t\t\tspinnerFrame: this.spinnerFrame,\n\t\t\tstreamingText: this.streamingText,\n\t\t\ttoolStatus: [...this.toolStatus.values()],\n\t\t\tbusy: this.busy,\n\t\t\terror: this.error,\n\t\t\tqueue: [...this.queue],\n\t\t\tstatus: this.status,\n\t\t\tcompacting: this.compacting,\n\t\t\tretrying: this.retrying,\n\t\t\tusage: { ...this.usage, cost: { ...this.usage.cost } },\n\t\t};\n\t}\n\n\tsetError(message: string | undefined): void {\n\t\tthis.error = message;\n\t}\n\n\tclearVisibleMessages(): void {\n\t\tthis.messages.length = 0;\n\t\tthis.messageItems.length = 0;\n\t\tthis.pendingFileChanges.clear();\n\t\tthis.streamingText = \"\";\n\t\tthis.processItems.length = 0;\n\t\tthis.toolStatus.clear();\n\t\tthis.error = undefined;\n\t}\n\n\tsetQueue(queue: readonly string[]): void {\n\t\tthis.queue = [...queue];\n\t}\n\n\tsetStatus(status: string | undefined): void {\n\t\tthis.status = status;\n\t}\n\n\tsetCompacting(value: boolean): void {\n\t\tthis.compacting = value;\n\t}\n\n\tsetRetrying(value: boolean): void {\n\t\tthis.retrying = value;\n\t}\n\n\tsetUsage(usage: SessionUsage): void {\n\t\tthis.usage = structuredClone(usage);\n\t}\n\n\tconfigureFilePreview(root: string, onChange: () => void): void {\n\t\tthis.previewRoot = root;\n\t\tthis.previewChange = onChange;\n\t}\n\n\tadvanceSpinner(): boolean {\n\t\tif (!this.busy) return false;\n\t\tthis.spinnerFrame = (this.spinnerFrame + 1) % 4;\n\t\treturn true;\n\t}\n\n\tclearTransientProcess(): void {\n\t\tthis.processItems.length = 0;\n\t\tthis.toolStatus.clear();\n\t\tthis.spinnerFrame = 0;\n\t}\n\n\treplaceTranscript(messages: readonly Message[]): void {\n\t\tthis.messages.length = 0;\n\t\tthis.messageItems.length = 0;\n\t\tthis.pendingFileChanges.clear();\n\t\tthis.processItems.length = 0;\n\t\tthis.toolStatus.clear();\n\t\tthis.spinnerFrame = 0;\n\t\tthis.streamingText = \"\";\n\t\tthis.busy = false;\n\t\tthis.error = undefined;\n\t\tfor (const message of messages) this.appendCompletedMessage(message);\n\t}\n\n\tapply(event: AgentSessionEvent): void {\n\t\tswitch (event.type) {\n\t\t\tcase \"agent_start\":\n\t\t\t\tthis.busy = true;\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.retrying = false;\n\t\t\t\tthis.processItems.length = 0;\n\t\t\t\tthis.processItems.push({ type: \"thinking\", id: \"thinking\" });\n\t\t\t\tthis.toolStatus.clear();\n\t\t\t\tthis.spinnerFrame = 0;\n\t\t\t\treturn;\n\t\t\tcase \"compaction_start\":\n\t\t\t\tthis.compacting = true;\n\t\t\t\treturn;\n\t\t\tcase \"compaction_end\":\n\t\t\t\tthis.compacting = false;\n\t\t\t\tif (!event.success) this.error = event.errorMessage;\n\t\t\t\treturn;\n\t\t\tcase \"usage_update\":\n\t\t\t\tthis.setUsage(event.usage);\n\t\t\t\treturn;\n\t\t\tcase \"queue_update\":\n\t\t\tcase \"tree_navigated\":\n\t\t\t\treturn;\n\t\t\tcase \"message_start\":\n\t\t\t\tif (event.message.role === \"assistant\") this.streamingText = \"\";\n\t\t\t\treturn;\n\t\t\tcase \"message_update\":\n\t\t\t\tif (event.event.type === \"text_delta\") {\n\t\t\t\t\tif (event.event.delta.length > 0) this.removeThinking();\n\t\t\t\t\tthis.streamingText += event.event.delta;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"tool_execution_start\":\n\t\t\t\tthis.removeThinking();\n\t\t\t\tthis.processItems.push({\n\t\t\t\t\ttype: \"tool\",\n\t\t\t\t\tid: event.toolCallId,\n\t\t\t\t\tcommand: formatToolCommand(event.toolName, event.arguments),\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t});\n\t\t\t\tthis.toolStatus.set(event.toolCallId, `${event.toolName}: running`);\n\t\t\t\tthis.storeFileChange(event.toolCallId, event.toolName, event.arguments);\n\t\t\t\treturn;\n\t\t\tcase \"tool_execution_end\":\n\t\t\t\tthis.updateToolStatus(event.toolCallId, event.result.isError ? \"error\" : \"done\");\n\t\t\t\tthis.toolStatus.set(event.toolCallId, `${event.toolName}: ${event.result.isError ? \"error\" : \"done\"}`);\n\t\t\t\tthis.commitFileChange(event.toolCallId, event.result.isError, event.result.details);\n\t\t\t\treturn;\n\t\t\tcase \"message_end\":\n\t\t\t\tthis.appendCompletedMessage(event.message);\n\t\t\t\treturn;\n\t\t\tcase \"agent_end\":\n\t\t\t\tthis.busy = false;\n\t\t\t\tthis.retrying = false;\n\t\t\t\tthis.pendingFileChanges.clear();\n\t\t\t\tthis.processItems.length = 0;\n\t\t\t\tthis.toolStatus.clear();\n\t\t\t\tthis.spinnerFrame = 0;\n\t\t\t\treturn;\n\t\t\tcase \"turn_start\":\n\t\t\t\tif (this.busy && !this.processItems.some((item) => item.type === \"thinking\")) {\n\t\t\t\t\tthis.processItems.push({ type: \"thinking\", id: \"thinking\" });\n\t\t\t\t\tthis.spinnerFrame = 0;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"turn_end\":\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate removeThinking(): void {\n\t\tconst index = this.processItems.findIndex((item) => item.type === \"thinking\");\n\t\tif (index >= 0) this.processItems.splice(index, 1);\n\t}\n\n\tprivate updateToolStatus(id: string, status: \"done\" | \"error\"): void {\n\t\tconst index = this.processItems.findIndex((item) => item.type === \"tool\" && item.id === id);\n\t\tconst item = this.processItems[index];\n\t\tif (index < 0 || item?.type !== \"tool\") return;\n\t\tthis.processItems[index] = { ...item, status };\n\t}\n\n\tprivate appendCompletedMessage(message: Message): void {\n\t\tif (message.role === \"tool_result\") {\n\t\t\tthis.commitFileChange(message.toolCallId, message.isError, message.details);\n\t\t\treturn;\n\t\t}\n\t\tconst text = textOf(message);\n\t\tif (message.role === \"user\") {\n\t\t\tif (text.length > 0) {\n\t\t\t\tthis.messages.push(text);\n\t\t\t\tthis.messageItems.push({ role: \"user\", text });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (text.length > 0 && message.stopReason !== \"tool_use\") {\n\t\t\tthis.messages.push(text);\n\t\t\tthis.messageItems.push({ role: \"assistant\", text });\n\t\t}\n\t\tfor (const content of message.content) {\n\t\t\tif (content.type === \"tool_call\") this.storeFileChange(content.id, content.name, content.arguments);\n\t\t}\n\t\tif (message.stopReason === \"error\") this.error = message.errorMessage;\n\t\tthis.streamingText = \"\";\n\t}\n\n\tprivate storeFileChange(id: string, toolName: string, argumentsValue: Record<string, unknown>): void {\n\t\tconst path = argumentsValue.path;\n\t\tif (typeof path !== \"string\") return;\n\t\tif (toolName === \"edit\") {\n\t\t\tconst edits = parseEditArguments(argumentsValue);\n\t\t\tif (!edits) return;\n\t\t\tconst fallback = edits.flatMap((edit) => ({\n\t\t\t\tremoved: edit.oldText.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\"),\n\t\t\t\tadded: edit.newText.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\"),\n\t\t\t}));\n\t\t\tthis.pendingFileChanges.set(id, {\n\t\t\t\trole: \"file_change\",\n\t\t\t\tid,\n\t\t\t\tpath,\n\t\t\t\tkind: \"edit\",\n\t\t\t\tremoved: fallback.flatMap((edit) => edit.removed),\n\t\t\t\tadded: fallback.flatMap((edit) => edit.added),\n\t\t\t});\n\t\t\tif (this.previewRoot) {\n\t\t\t\tvoid computeEditsDiff(path, edits, this.previewRoot).then((preview) => {\n\t\t\t\t\tconst current = this.pendingFileChanges.get(id);\n\t\t\t\t\tif (!current || \"error\" in preview) return;\n\t\t\t\t\tthis.pendingFileChanges.set(id, {\n\t\t\t\t\t\t...current,\n\t\t\t\t\t\tdiff: preview.diff,\n\t\t\t\t\t\tfirstChangedLine: preview.firstChangedLine,\n\t\t\t\t\t});\n\t\t\t\t\tthis.previewChange?.();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (toolName === \"write\" && typeof argumentsValue.content === \"string\") {\n\t\t\tthis.pendingFileChanges.set(id, {\n\t\t\t\trole: \"file_change\",\n\t\t\t\tid,\n\t\t\t\tpath,\n\t\t\t\tkind: \"write\",\n\t\t\t\tremoved: [],\n\t\t\t\tadded: argumentsValue.content.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\"),\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate commitFileChange(id: string, isError: boolean, details: unknown = undefined): void {\n\t\tconst change = this.pendingFileChanges.get(id);\n\t\tthis.pendingFileChanges.delete(id);\n\t\tif (!change || isError) return;\n\t\tconst metadata = isEditDetails(details) ? details : undefined;\n\t\tthis.messageItems.push(\n\t\t\tmetadata ? { ...change, diff: metadata.diff, firstChangedLine: metadata.firstChangedLine } : change,\n\t\t);\n\t}\n}\n\nfunction parseEditArguments(argumentsValue: Record<string, unknown>): Edit[] | undefined {\n\tif (Array.isArray(argumentsValue.edits)) {\n\t\tconst edits: Edit[] = [];\n\t\tfor (const value of argumentsValue.edits) {\n\t\t\tif (!isRecord(value) || typeof value.oldText !== \"string\" || typeof value.newText !== \"string\") return undefined;\n\t\t\tedits.push({ oldText: value.oldText, newText: value.newText });\n\t\t}\n\t\treturn edits.length > 0 ? edits : undefined;\n\t}\n\treturn typeof argumentsValue.oldText === \"string\" && typeof argumentsValue.newText === \"string\"\n\t\t? [{ oldText: argumentsValue.oldText, newText: argumentsValue.newText }]\n\t\t: undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isEditDetails(value: unknown): value is { diff: string; firstChangedLine?: number } {\n\treturn (\n\t\tisRecord(value) &&\n\t\ttypeof value.diff === \"string\" &&\n\t\t(value.firstChangedLine === undefined || typeof value.firstChangedLine === \"number\")\n\t);\n}\n\nfunction formatToolCommand(toolName: string, argumentsValue: Record<string, unknown>): string {\n\tconst serialized = JSON.stringify(argumentsValue);\n\treturn serialized === \"{}\" ? toolName : `${toolName} ${serialized}`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-state.js","sourceRoot":"","sources":["../../src/modes/interactive-state.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Message } from \"@di-code/ai\";\nimport type { AgentSessionEvent, SessionUsage } from \"../core/session.ts\";\nimport { computeEditsDiff, type Edit } from \"../core/tools/edit-diff.ts\";\n\nexport type InteractiveMessage =\n\t| { readonly role: \"user\" | \"assistant\"; readonly text: string }\n\t| {\n\t\t\treadonly role: \"file_change\";\n\t\t\treadonly id: string;\n\t\t\treadonly path: string;\n\t\t\treadonly kind: \"edit\" | \"write\";\n\t\t\treadonly removed: readonly string[];\n\t\t\treadonly added: readonly string[];\n\t\t\treadonly diff?: string;\n\t\t\treadonly firstChangedLine?: number;\n\t };\n\ntype FileChangeCandidate = Extract<InteractiveMessage, { role: \"file_change\" }>;\n\nexport type InteractiveProcessItem =\n\t| { readonly type: \"thinking\"; readonly id: \"thinking\" }\n\t| {\n\t\t\treadonly type: \"tool\";\n\t\t\treadonly id: string;\n\t\t\treadonly command: string;\n\t\t\treadonly status: \"running\" | \"done\" | \"error\";\n\t };\n\nexport interface InteractiveState {\n\treadonly messages: readonly string[];\n\treadonly messageItems: readonly InteractiveMessage[];\n\treadonly processItems: readonly InteractiveProcessItem[];\n\treadonly spinnerFrame: number;\n\treadonly streamingText: string;\n\treadonly toolStatus: readonly string[];\n\treadonly busy: boolean;\n\treadonly error?: string;\n\treadonly queue: readonly string[];\n\treadonly status?: string;\n\treadonly compacting: boolean;\n\treadonly retrying: boolean;\n\treadonly usage: SessionUsage;\n}\n\nfunction textOf(message: Message): string {\n\treturn message.content.map((content) => (content.type === \"text\" ? content.text : \"\")).join(\"\");\n}\n\nexport class InteractiveProjection {\n\tprivate readonly messages: string[] = [];\n\tprivate readonly messageItems: InteractiveMessage[] = [];\n\tprivate readonly pendingFileChanges = new Map<string, FileChangeCandidate>();\n\tprivate readonly processItems: InteractiveProcessItem[] = [];\n\tprivate readonly toolStatus = new Map<string, string>();\n\tprivate spinnerFrame = 0;\n\tprivate streamingText = \"\";\n\tprivate busy = false;\n\tprivate error: string | undefined;\n\tprivate queue: string[] = [];\n\tprivate status: string | undefined;\n\tprivate compacting = false;\n\tprivate retrying = false;\n\tprivate previewRoot: string | undefined;\n\tprivate previewChange: (() => void) | undefined;\n\tprivate usage: SessionUsage = {\n\t\trequestCount: 0,\n\t\tinputTokens: 0,\n\t\toutputTokens: 0,\n\t\tcacheReadTokens: 0,\n\t\tcacheWriteTokens: 0,\n\t\ttotalTokens: 0,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\testimatedContextTokens: 0,\n\t\tcontextWindow: 0,\n\t\treserveTokens: 0,\n\t\ttriggerTokens: 0,\n\t};\n\n\tget state(): InteractiveState {\n\t\tconst visibleMessageItems = [...this.messageItems, ...this.pendingFileChanges.values()];\n\t\treturn {\n\t\t\tmessages: [...this.messages],\n\t\t\tmessageItems: visibleMessageItems.map((message) =>\n\t\t\t\tmessage.role === \"file_change\"\n\t\t\t\t\t? { ...message, removed: [...message.removed], added: [...message.added] }\n\t\t\t\t\t: { ...message },\n\t\t\t),\n\t\t\tprocessItems: this.processItems.map((item) => ({ ...item })),\n\t\t\tspinnerFrame: this.spinnerFrame,\n\t\t\tstreamingText: this.streamingText,\n\t\t\ttoolStatus: [...this.toolStatus.values()],\n\t\t\tbusy: this.busy,\n\t\t\terror: this.error,\n\t\t\tqueue: [...this.queue],\n\t\t\tstatus: this.status,\n\t\t\tcompacting: this.compacting,\n\t\t\tretrying: this.retrying,\n\t\t\tusage: { ...this.usage, cost: { ...this.usage.cost } },\n\t\t};\n\t}\n\n\tsetError(message: string | undefined): void {\n\t\tthis.error = message;\n\t}\n\n\tclearVisibleMessages(): void {\n\t\tthis.messages.length = 0;\n\t\tthis.messageItems.length = 0;\n\t\tthis.pendingFileChanges.clear();\n\t\tthis.streamingText = \"\";\n\t\tthis.processItems.length = 0;\n\t\tthis.toolStatus.clear();\n\t\tthis.error = undefined;\n\t}\n\n\tsetQueue(queue: readonly string[]): void {\n\t\tthis.queue = [...queue];\n\t}\n\n\tsetStatus(status: string | undefined): void {\n\t\tthis.status = status;\n\t}\n\n\tsetCompacting(value: boolean): void {\n\t\tthis.compacting = value;\n\t}\n\n\tsetRetrying(value: boolean): void {\n\t\tthis.retrying = value;\n\t}\n\n\tsetUsage(usage: SessionUsage): void {\n\t\tthis.usage = structuredClone(usage);\n\t}\n\n\tconfigureFilePreview(root: string, onChange: () => void): void {\n\t\tthis.previewRoot = root;\n\t\tthis.previewChange = onChange;\n\t}\n\n\tadvanceSpinner(): boolean {\n\t\tif (!this.busy) return false;\n\t\tthis.spinnerFrame = (this.spinnerFrame + 1) % 4;\n\t\treturn true;\n\t}\n\n\tclearTransientProcess(): void {\n\t\tthis.processItems.length = 0;\n\t\tthis.toolStatus.clear();\n\t\tthis.spinnerFrame = 0;\n\t}\n\n\treplaceTranscript(messages: readonly Message[]): void {\n\t\tthis.messages.length = 0;\n\t\tthis.messageItems.length = 0;\n\t\tthis.pendingFileChanges.clear();\n\t\tthis.processItems.length = 0;\n\t\tthis.toolStatus.clear();\n\t\tthis.spinnerFrame = 0;\n\t\tthis.streamingText = \"\";\n\t\tthis.busy = false;\n\t\tthis.error = undefined;\n\t\tfor (const message of messages) this.appendCompletedMessage(message);\n\t}\n\n\tapply(event: AgentSessionEvent): void {\n\t\tswitch (event.type) {\n\t\t\tcase \"agent_start\":\n\t\t\t\tthis.busy = true;\n\t\t\t\tthis.error = undefined;\n\t\t\t\tthis.retrying = false;\n\t\t\t\tthis.processItems.length = 0;\n\t\t\t\tthis.processItems.push({ type: \"thinking\", id: \"thinking\" });\n\t\t\t\tthis.toolStatus.clear();\n\t\t\t\tthis.spinnerFrame = 0;\n\t\t\t\treturn;\n\t\t\tcase \"compaction_start\":\n\t\t\t\tthis.compacting = true;\n\t\t\t\treturn;\n\t\t\tcase \"compaction_end\":\n\t\t\t\tthis.compacting = false;\n\t\t\t\tif (!event.success) this.error = event.errorMessage;\n\t\t\t\treturn;\n\t\t\tcase \"usage_update\":\n\t\t\t\tthis.setUsage(event.usage);\n\t\t\t\treturn;\n\t\t\tcase \"queue_update\":\n\t\t\tcase \"tree_navigated\":\n\t\t\t\treturn;\n\t\t\tcase \"message_start\":\n\t\t\t\tif (event.message.role === \"assistant\") this.streamingText = \"\";\n\t\t\t\treturn;\n\t\t\tcase \"message_update\":\n\t\t\t\tif (event.event.type === \"text_delta\") {\n\t\t\t\t\tif (event.event.delta.length > 0) this.removeThinking();\n\t\t\t\t\tthis.streamingText += event.event.delta;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"tool_execution_start\":\n\t\t\t\tthis.removeThinking();\n\t\t\t\tthis.processItems.push({\n\t\t\t\t\ttype: \"tool\",\n\t\t\t\t\tid: event.toolCallId,\n\t\t\t\t\tcommand: formatToolCommand(event.toolName, event.arguments),\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t});\n\t\t\t\tthis.toolStatus.set(event.toolCallId, `${event.toolName}: running`);\n\t\t\t\tthis.storeFileChange(event.toolCallId, event.toolName, event.arguments);\n\t\t\t\treturn;\n\t\t\tcase \"tool_execution_end\":\n\t\t\t\tthis.updateToolStatus(event.toolCallId, event.result.isError ? \"error\" : \"done\");\n\t\t\t\tthis.toolStatus.set(event.toolCallId, `${event.toolName}: ${event.result.isError ? \"error\" : \"done\"}`);\n\t\t\t\tthis.commitFileChange(event.toolCallId, event.result.isError, event.result.details);\n\t\t\t\treturn;\n\t\t\tcase \"message_end\":\n\t\t\t\tthis.appendCompletedMessage(event.message);\n\t\t\t\treturn;\n\t\t\tcase \"agent_end\":\n\t\t\t\tthis.busy = false;\n\t\t\t\tthis.retrying = false;\n\t\t\t\tthis.pendingFileChanges.clear();\n\t\t\t\tthis.processItems.length = 0;\n\t\t\t\tthis.toolStatus.clear();\n\t\t\t\tthis.spinnerFrame = 0;\n\t\t\t\treturn;\n\t\t\tcase \"turn_start\":\n\t\t\t\tif (this.busy && !this.processItems.some((item) => item.type === \"thinking\")) {\n\t\t\t\t\tthis.processItems.push({ type: \"thinking\", id: \"thinking\" });\n\t\t\t\t\tthis.spinnerFrame = 0;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tcase \"turn_end\":\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate removeThinking(): void {\n\t\tconst index = this.processItems.findIndex((item) => item.type === \"thinking\");\n\t\tif (index >= 0) this.processItems.splice(index, 1);\n\t}\n\n\tprivate updateToolStatus(id: string, status: \"done\" | \"error\"): void {\n\t\tconst index = this.processItems.findIndex((item) => item.type === \"tool\" && item.id === id);\n\t\tconst item = this.processItems[index];\n\t\tif (index < 0 || item?.type !== \"tool\") return;\n\t\tthis.processItems[index] = { ...item, status };\n\t}\n\n\tprivate appendCompletedMessage(message: Message): void {\n\t\tif (message.role === \"tool_result\") {\n\t\t\tthis.commitFileChange(message.toolCallId, message.isError, message.details);\n\t\t\treturn;\n\t\t}\n\t\tconst text = textOf(message);\n\t\tif (message.role === \"user\") {\n\t\t\tif (text.length > 0) {\n\t\t\t\tthis.messages.push(text);\n\t\t\t\tthis.messageItems.push({ role: \"user\", text });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (text.length > 0 && message.stopReason !== \"tool_use\") {\n\t\t\tthis.messages.push(text);\n\t\t\tthis.messageItems.push({ role: \"assistant\", text });\n\t\t}\n\t\tfor (const content of message.content) {\n\t\t\tif (content.type === \"tool_call\") this.storeFileChange(content.id, content.name, content.arguments);\n\t\t}\n\t\tif (message.stopReason === \"error\") this.error = message.errorMessage;\n\t\tthis.streamingText = \"\";\n\t}\n\n\tprivate storeFileChange(id: string, toolName: string, argumentsValue: Record<string, unknown>): void {\n\t\tconst path = argumentsValue.path;\n\t\tif (typeof path !== \"string\") return;\n\t\tif (toolName === \"edit\") {\n\t\t\tconst edits = parseEditArguments(argumentsValue);\n\t\t\tif (!edits) return;\n\t\t\tconst fallback = edits.flatMap((edit) => ({\n\t\t\t\tremoved: edit.oldText.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\"),\n\t\t\t\tadded: edit.newText.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\"),\n\t\t\t}));\n\t\t\tthis.pendingFileChanges.set(id, {\n\t\t\t\trole: \"file_change\",\n\t\t\t\tid,\n\t\t\t\tpath,\n\t\t\t\tkind: \"edit\",\n\t\t\t\tremoved: fallback.flatMap((edit) => edit.removed),\n\t\t\t\tadded: fallback.flatMap((edit) => edit.added),\n\t\t\t});\n\t\t\tif (this.previewRoot) {\n\t\t\t\tvoid computeEditsDiff(path, edits, this.previewRoot).then((preview) => {\n\t\t\t\t\tconst current = this.pendingFileChanges.get(id);\n\t\t\t\t\tif (!current || \"error\" in preview) return;\n\t\t\t\t\tthis.pendingFileChanges.set(id, {\n\t\t\t\t\t\t...current,\n\t\t\t\t\t\tdiff: preview.diff,\n\t\t\t\t\t\tfirstChangedLine: preview.firstChangedLine,\n\t\t\t\t\t});\n\t\t\t\t\tthis.previewChange?.();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (toolName === \"write\" && typeof argumentsValue.content === \"string\") {\n\t\t\tthis.pendingFileChanges.set(id, {\n\t\t\t\trole: \"file_change\",\n\t\t\t\tid,\n\t\t\t\tpath,\n\t\t\t\tkind: \"write\",\n\t\t\t\tremoved: [],\n\t\t\t\tadded: argumentsValue.content.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\"),\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate commitFileChange(id: string, isError: boolean, details: unknown = undefined): void {\n\t\tconst change = this.pendingFileChanges.get(id);\n\t\tthis.pendingFileChanges.delete(id);\n\t\tif (!change || isError) return;\n\t\tconst metadata = isEditDetails(details) ? details : undefined;\n\t\tthis.messageItems.push(\n\t\t\tmetadata ? { ...change, diff: metadata.diff, firstChangedLine: metadata.firstChangedLine } : change,\n\t\t);\n\t}\n}\n\nfunction parseEditArguments(argumentsValue: Record<string, unknown>): Edit[] | undefined {\n\tif (Array.isArray(argumentsValue.edits)) {\n\t\tconst edits: Edit[] = [];\n\t\tfor (const value of argumentsValue.edits) {\n\t\t\tif (!isRecord(value) || typeof value.oldText !== \"string\" || typeof value.newText !== \"string\") return undefined;\n\t\t\tedits.push({ oldText: value.oldText, newText: value.newText });\n\t\t}\n\t\treturn edits.length > 0 ? edits : undefined;\n\t}\n\treturn typeof argumentsValue.oldText === \"string\" && typeof argumentsValue.newText === \"string\"\n\t\t? [{ oldText: argumentsValue.oldText, newText: argumentsValue.newText }]\n\t\t: undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isEditDetails(value: unknown): value is { diff: string; firstChangedLine?: number } {\n\treturn (\n\t\tisRecord(value) &&\n\t\ttypeof value.diff === \"string\" &&\n\t\t(value.firstChangedLine === undefined || typeof value.firstChangedLine === \"number\")\n\t);\n}\n\nfunction formatToolCommand(toolName: string, argumentsValue: Record<string, unknown>): string {\n\tconst serialized = JSON.stringify(argumentsValue);\n\treturn serialized === \"{}\" ? toolName : `${toolName} ${serialized}`;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-selector.d.ts","sourceRoot":"","sources":["../../src/modes/tree-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAmC,MAAM,cAAc,CAAC;AAC/F,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,YAAY,CAAC;AAyBpD,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACvC,MAAM,CAAC,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,WAAW,CAAC,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,IAAI,IAAI,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"tree-selector.d.ts","sourceRoot":"","sources":["../../src/modes/tree-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAmC,MAAM,cAAc,CAAC;AAC/F,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,YAAY,CAAC;AAyBpD,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACvC,MAAM,CAAC,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,WAAW,CAAC,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,IAAI,IAAI,CAAC;CAClB;AAwFD,oHAAoH;AACpH,qBAAa,YAAa,YAAW,SAAS,EAAE,SAAS;IACxD,OAAO,UAAS;IAChB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;IAChD,OAAO,CAAC,aAAa,CAAK;gBAEd,OAAO,EAAE,mBAAmB;IAOxC,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAwB/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAwB/B,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,MAAM;CAOd"}
|
|
@@ -22,10 +22,7 @@ function textContent(entry) {
|
|
|
22
22
|
return singleLine(entry.summary);
|
|
23
23
|
if (entry.type === "plugin")
|
|
24
24
|
return singleLine(`plugin:${entry.pluginId}`);
|
|
25
|
-
return singleLine(entry.message.content
|
|
26
|
-
.filter((content) => content.type === "text")
|
|
27
|
-
.map((content) => content.text)
|
|
28
|
-
.join(" "));
|
|
25
|
+
return singleLine(entry.message.content.map((content) => (content.type === "text" ? content.text : "")).join(" "));
|
|
29
26
|
}
|
|
30
27
|
function flattenTree(nodes, leafId) {
|
|
31
28
|
const parents = new Map();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-selector.js","sourceRoot":"","sources":["../../src/modes/tree-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Component, type Focusable, Key, matchesKey, SelectionPanel } from \"@di-code/tui\";\nimport type { SessionEntry, SessionTreeNode } from \"../core/session/types.ts\";\nimport { type Locale, translate } from \"../i18n.ts\";\n\nconst RESET_FOREGROUND = \"\\x1b[39m\";\nconst CYAN = \"\\x1b[38;5;45m\";\nconst GREEN = \"\\x1b[38;5;114m\";\nconst YELLOW = \"\\x1b[38;5;222m\";\nconst RED = \"\\x1b[38;5;210m\";\nconst DIM = \"\\x1b[38;5;245m\";\nconst MAX_VISIBLE_NODES = 12;\n\ninterface FlatTreeNode {\n\treadonly entry: SessionEntry;\n\t/** Visual indentation only grows where the session graph actually branches. */\n\treadonly indent: number;\n\treadonly showConnector: boolean;\n\treadonly isLast: boolean;\n\treadonly gutters: readonly TreeGutter[];\n\treadonly isCurrentPath: boolean;\n}\n\ninterface TreeGutter {\n\treadonly level: number;\n\treadonly continues: boolean;\n}\n\nexport interface TreeSelectorOptions {\n\treadonly nodes: readonly SessionTreeNode[];\n\treadonly leafId?: string;\n\treadonly locale: Locale;\n\tonContinue?(entry: SessionEntry): void;\n\tonEdit?(entry: SessionEntry): void;\n\tonSummarize?(entry: SessionEntry): void;\n\tonCancel?(): void;\n}\n\nfunction paint(color: string, text: string): string {\n\t// Reset only the foreground so a selected row keeps its background across coloured fragments.\n\treturn `${color}${text}${RESET_FOREGROUND}`;\n}\n\nfunction singleLine(value: string): string {\n\treturn value\n\t\t.replace(/[\\r\\n\\t]+/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nfunction textContent(entry: SessionEntry): string {\n\tif (entry.type === \"summary\") return singleLine(entry.summary);\n\tif (entry.type === \"plugin\") return singleLine(`plugin:${entry.pluginId}`);\n\treturn singleLine(\n\t\tentry.message.content\n\t\t\t.filter((content) => content.type === \"text\")\n\t\t\t.map((content) => content.text)\n\t\t\t.join(\" \"),\n\t);\n}\n\nfunction flattenTree(nodes: readonly SessionTreeNode[], leafId: string | undefined): FlatTreeNode[] {\n\tconst parents = new Map<string, string>();\n\tconst raw: Array<Omit<FlatTreeNode, \"isCurrentPath\">> = [];\n\ttype PendingNode = {\n\t\treadonly node: SessionTreeNode;\n\t\treadonly indent: number;\n\t\treadonly justBranched: boolean;\n\t\treadonly showConnector: boolean;\n\t\treadonly isLast: boolean;\n\t\treadonly gutters: readonly TreeGutter[];\n\t};\n\tconst stack: PendingNode[] = [];\n\tconst multipleRoots = nodes.length > 1;\n\n\tfor (let index = nodes.length - 1; index >= 0; index -= 1) {\n\t\tconst node = nodes[index];\n\t\tif (!node) continue;\n\t\tstack.push({\n\t\t\tnode,\n\t\t\tindent: multipleRoots ? 1 : 0,\n\t\t\tjustBranched: multipleRoots,\n\t\t\tshowConnector: multipleRoots,\n\t\t\tisLast: index === nodes.length - 1,\n\t\t\tgutters: [],\n\t\t});\n\t}\n\n\twhile (stack.length > 0) {\n\t\tconst current = stack.pop();\n\t\tif (!current) continue;\n\t\traw.push({\n\t\t\tentry: current.node.entry,\n\t\t\tindent: current.indent,\n\t\t\tshowConnector: current.showConnector,\n\t\t\tisLast: current.isLast,\n\t\t\tgutters: current.gutters,\n\t\t});\n\t\tconst children = current.node.children;\n\t\tconst multipleChildren = children.length > 1;\n\t\tconst childIndent = multipleChildren\n\t\t\t? current.indent + 1\n\t\t\t: current.justBranched && current.indent > 0\n\t\t\t\t? current.indent + 1\n\t\t\t\t: current.indent;\n\t\tconst childGutters =\n\t\t\tcurrent.showConnector && current.indent > 0\n\t\t\t\t? [...current.gutters, { level: current.indent - 1, continues: !current.isLast }]\n\t\t\t\t: current.gutters;\n\t\tfor (let index = children.length - 1; index >= 0; index -= 1) {\n\t\t\tconst child = children[index];\n\t\t\tif (!child) continue;\n\t\t\tparents.set(child.entry.id, current.node.entry.id);\n\t\t\tstack.push({\n\t\t\t\tnode: child,\n\t\t\t\tindent: childIndent,\n\t\t\t\tjustBranched: multipleChildren,\n\t\t\t\tshowConnector: multipleChildren,\n\t\t\t\tisLast: index === children.length - 1,\n\t\t\t\tgutters: childGutters,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst currentPath = new Set<string>();\n\tfor (let current = leafId; current; current = parents.get(current)) currentPath.add(current);\n\treturn raw.map((node) => ({ ...node, isCurrentPath: currentPath.has(node.entry.id) }));\n}\n\n/** Compact, keyboard-driven session tree browser. It only renders and delegates all state changes to its caller. */\nexport class TreeSelector implements Component, Focusable {\n\tfocused = false;\n\tprivate readonly options: TreeSelectorOptions;\n\tprivate readonly nodes: readonly FlatTreeNode[];\n\tprivate selectedIndex = 0;\n\n\tconstructor(options: TreeSelectorOptions) {\n\t\tthis.options = options;\n\t\tthis.nodes = flattenTree(options.nodes, options.leafId);\n\t\tconst selected = this.nodes.findIndex((node) => node.entry.id === options.leafId);\n\t\tif (selected >= 0) this.selectedIndex = selected;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tif (width <= 0) return [];\n\t\tif (this.nodes.length === 0)\n\t\t\treturn new SelectionPanel({ emptyText: translate(this.options.locale, \"treeEmpty\"), total: 0 }).render(width);\n\n\t\tconst start = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.selectedIndex - Math.floor(MAX_VISIBLE_NODES / 2), this.nodes.length - MAX_VISIBLE_NODES),\n\t\t);\n\t\tconst end = Math.min(this.nodes.length, start + MAX_VISIBLE_NODES);\n\t\tconst rows: string[] = [];\n\t\tfor (let index = start; index < end; index += 1) {\n\t\t\tconst node = this.nodes[index];\n\t\t\tif (node) rows.push(this.renderNode(node));\n\t\t}\n\t\treturn new SelectionPanel({\n\t\t\trows,\n\t\t\tselectedIndex: this.selectedIndex - start,\n\t\t\tposition: this.selectedIndex + 1,\n\t\t\ttotal: this.nodes.length,\n\t\t\thint: this.actionHint(),\n\t\t}).render(width);\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (matchesKey(data, Key.up)) {\n\t\t\tthis.move(-1);\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, Key.down)) {\n\t\t\tthis.move(1);\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, Key.enter)) {\n\t\t\tthis.select(\"continue\");\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, Key.escape) || matchesKey(data, Key.ctrl(\"c\"))) {\n\t\t\tthis.options.onCancel?.();\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, \"e\")) {\n\t\t\tthis.select(\"edit\");\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, \"s\")) this.select(\"summarize\");\n\t}\n\n\tprivate renderNode(node: FlatTreeNode): string {\n\t\tconst prefix = this.renderPrefix(node);\n\t\tconst currentPath = node.isCurrentPath ? paint(CYAN, \"• \") : \" \";\n\t\tconst content = this.entryDisplay(node.entry);\n\t\treturn `${prefix}${currentPath}${content}`;\n\t}\n\n\tprivate renderPrefix(node: FlatTreeNode): string {\n\t\tconst levels: string[] = [];\n\t\tfor (let level = 0; level < node.indent; level += 1) {\n\t\t\tconst gutter = node.gutters.find((candidate) => candidate.level === level);\n\t\t\tif (gutter) {\n\t\t\t\tlevels.push(paint(DIM, gutter.continues ? \"│ \" : \" \"));\n\t\t\t} else if (node.showConnector && level === node.indent - 1) {\n\t\t\t\tlevels.push(paint(DIM, node.isLast ? \"└─ \" : \"├─ \"));\n\t\t\t} else {\n\t\t\t\tlevels.push(\" \");\n\t\t\t}\n\t\t}\n\t\treturn levels.join(\"\");\n\t}\n\n\tprivate entryDisplay(entry: SessionEntry): string {\n\t\tconst text = textContent(entry);\n\t\tif (entry.type === \"summary\") return `${paint(YELLOW, \"summary: \")}${text || paint(DIM, \"(empty)\")}`;\n\t\tif (entry.type === \"plugin\") return `${paint(DIM, \"plugin: \")}${text || paint(DIM, \"(empty)\")}`;\n\t\tif (entry.message.role === \"user\") return `${paint(CYAN, \"user: \")}${text || paint(DIM, \"(empty)\")}`;\n\t\tif (entry.message.role === \"assistant\") {\n\t\t\tif (text) return `${paint(GREEN, \"assistant: \")}${text}`;\n\t\t\tif (entry.message.stopReason === \"aborted\") return `${paint(GREEN, \"assistant: \")}${paint(DIM, \"(aborted)\")}`;\n\t\t\tif (entry.message.stopReason === \"error\") return `${paint(GREEN, \"assistant: \")}${paint(RED, \"(error)\")}`;\n\t\t\treturn `${paint(GREEN, \"assistant: \")}${paint(DIM, \"(no text)\")}`;\n\t\t}\n\t\treturn `${paint(DIM, `${entry.message.toolName}: `)}${text || paint(DIM, \"(no text)\")}`;\n\t}\n\n\tprivate actionHint(): string {\n\t\treturn `Enter ${translate(this.options.locale, \"treeContinue\")} · e ${translate(this.options.locale, \"treeEdit\")} · s ${translate(this.options.locale, \"treeSummarize\")} · Esc ${translate(this.options.locale, \"treeCancel\")}`;\n\t}\n\n\tprivate move(direction: -1 | 1): void {\n\t\tif (this.nodes.length === 0) return;\n\t\tthis.selectedIndex = (this.selectedIndex + direction + this.nodes.length) % this.nodes.length;\n\t}\n\n\tprivate select(action: \"continue\" | \"edit\" | \"summarize\"): void {\n\t\tconst entry = this.nodes[this.selectedIndex]?.entry;\n\t\tif (!entry) return;\n\t\tif (action === \"continue\") this.options.onContinue?.(entry);\n\t\telse if (action === \"edit\") this.options.onEdit?.(entry);\n\t\telse this.options.onSummarize?.(entry);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tree-selector.js","sourceRoot":"","sources":["../../src/modes/tree-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Component, type Focusable, Key, matchesKey, SelectionPanel } from \"@di-code/tui\";\nimport type { SessionEntry, SessionTreeNode } from \"../core/session/types.ts\";\nimport { type Locale, translate } from \"../i18n.ts\";\n\nconst RESET_FOREGROUND = \"\\x1b[39m\";\nconst CYAN = \"\\x1b[38;5;45m\";\nconst GREEN = \"\\x1b[38;5;114m\";\nconst YELLOW = \"\\x1b[38;5;222m\";\nconst RED = \"\\x1b[38;5;210m\";\nconst DIM = \"\\x1b[38;5;245m\";\nconst MAX_VISIBLE_NODES = 12;\n\ninterface FlatTreeNode {\n\treadonly entry: SessionEntry;\n\t/** Visual indentation only grows where the session graph actually branches. */\n\treadonly indent: number;\n\treadonly showConnector: boolean;\n\treadonly isLast: boolean;\n\treadonly gutters: readonly TreeGutter[];\n\treadonly isCurrentPath: boolean;\n}\n\ninterface TreeGutter {\n\treadonly level: number;\n\treadonly continues: boolean;\n}\n\nexport interface TreeSelectorOptions {\n\treadonly nodes: readonly SessionTreeNode[];\n\treadonly leafId?: string;\n\treadonly locale: Locale;\n\tonContinue?(entry: SessionEntry): void;\n\tonEdit?(entry: SessionEntry): void;\n\tonSummarize?(entry: SessionEntry): void;\n\tonCancel?(): void;\n}\n\nfunction paint(color: string, text: string): string {\n\t// Reset only the foreground so a selected row keeps its background across coloured fragments.\n\treturn `${color}${text}${RESET_FOREGROUND}`;\n}\n\nfunction singleLine(value: string): string {\n\treturn value\n\t\t.replace(/[\\r\\n\\t]+/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nfunction textContent(entry: SessionEntry): string {\n\tif (entry.type === \"summary\") return singleLine(entry.summary);\n\tif (entry.type === \"plugin\") return singleLine(`plugin:${entry.pluginId}`);\n\treturn singleLine(entry.message.content.map((content) => (content.type === \"text\" ? content.text : \"\")).join(\" \"));\n}\n\nfunction flattenTree(nodes: readonly SessionTreeNode[], leafId: string | undefined): FlatTreeNode[] {\n\tconst parents = new Map<string, string>();\n\tconst raw: Array<Omit<FlatTreeNode, \"isCurrentPath\">> = [];\n\ttype PendingNode = {\n\t\treadonly node: SessionTreeNode;\n\t\treadonly indent: number;\n\t\treadonly justBranched: boolean;\n\t\treadonly showConnector: boolean;\n\t\treadonly isLast: boolean;\n\t\treadonly gutters: readonly TreeGutter[];\n\t};\n\tconst stack: PendingNode[] = [];\n\tconst multipleRoots = nodes.length > 1;\n\n\tfor (let index = nodes.length - 1; index >= 0; index -= 1) {\n\t\tconst node = nodes[index];\n\t\tif (!node) continue;\n\t\tstack.push({\n\t\t\tnode,\n\t\t\tindent: multipleRoots ? 1 : 0,\n\t\t\tjustBranched: multipleRoots,\n\t\t\tshowConnector: multipleRoots,\n\t\t\tisLast: index === nodes.length - 1,\n\t\t\tgutters: [],\n\t\t});\n\t}\n\n\twhile (stack.length > 0) {\n\t\tconst current = stack.pop();\n\t\tif (!current) continue;\n\t\traw.push({\n\t\t\tentry: current.node.entry,\n\t\t\tindent: current.indent,\n\t\t\tshowConnector: current.showConnector,\n\t\t\tisLast: current.isLast,\n\t\t\tgutters: current.gutters,\n\t\t});\n\t\tconst children = current.node.children;\n\t\tconst multipleChildren = children.length > 1;\n\t\tconst childIndent = multipleChildren\n\t\t\t? current.indent + 1\n\t\t\t: current.justBranched && current.indent > 0\n\t\t\t\t? current.indent + 1\n\t\t\t\t: current.indent;\n\t\tconst childGutters =\n\t\t\tcurrent.showConnector && current.indent > 0\n\t\t\t\t? [...current.gutters, { level: current.indent - 1, continues: !current.isLast }]\n\t\t\t\t: current.gutters;\n\t\tfor (let index = children.length - 1; index >= 0; index -= 1) {\n\t\t\tconst child = children[index];\n\t\t\tif (!child) continue;\n\t\t\tparents.set(child.entry.id, current.node.entry.id);\n\t\t\tstack.push({\n\t\t\t\tnode: child,\n\t\t\t\tindent: childIndent,\n\t\t\t\tjustBranched: multipleChildren,\n\t\t\t\tshowConnector: multipleChildren,\n\t\t\t\tisLast: index === children.length - 1,\n\t\t\t\tgutters: childGutters,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst currentPath = new Set<string>();\n\tfor (let current = leafId; current; current = parents.get(current)) currentPath.add(current);\n\treturn raw.map((node) => ({ ...node, isCurrentPath: currentPath.has(node.entry.id) }));\n}\n\n/** Compact, keyboard-driven session tree browser. It only renders and delegates all state changes to its caller. */\nexport class TreeSelector implements Component, Focusable {\n\tfocused = false;\n\tprivate readonly options: TreeSelectorOptions;\n\tprivate readonly nodes: readonly FlatTreeNode[];\n\tprivate selectedIndex = 0;\n\n\tconstructor(options: TreeSelectorOptions) {\n\t\tthis.options = options;\n\t\tthis.nodes = flattenTree(options.nodes, options.leafId);\n\t\tconst selected = this.nodes.findIndex((node) => node.entry.id === options.leafId);\n\t\tif (selected >= 0) this.selectedIndex = selected;\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tif (width <= 0) return [];\n\t\tif (this.nodes.length === 0)\n\t\t\treturn new SelectionPanel({ emptyText: translate(this.options.locale, \"treeEmpty\"), total: 0 }).render(width);\n\n\t\tconst start = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.selectedIndex - Math.floor(MAX_VISIBLE_NODES / 2), this.nodes.length - MAX_VISIBLE_NODES),\n\t\t);\n\t\tconst end = Math.min(this.nodes.length, start + MAX_VISIBLE_NODES);\n\t\tconst rows: string[] = [];\n\t\tfor (let index = start; index < end; index += 1) {\n\t\t\tconst node = this.nodes[index];\n\t\t\tif (node) rows.push(this.renderNode(node));\n\t\t}\n\t\treturn new SelectionPanel({\n\t\t\trows,\n\t\t\tselectedIndex: this.selectedIndex - start,\n\t\t\tposition: this.selectedIndex + 1,\n\t\t\ttotal: this.nodes.length,\n\t\t\thint: this.actionHint(),\n\t\t}).render(width);\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (matchesKey(data, Key.up)) {\n\t\t\tthis.move(-1);\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, Key.down)) {\n\t\t\tthis.move(1);\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, Key.enter)) {\n\t\t\tthis.select(\"continue\");\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, Key.escape) || matchesKey(data, Key.ctrl(\"c\"))) {\n\t\t\tthis.options.onCancel?.();\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, \"e\")) {\n\t\t\tthis.select(\"edit\");\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, \"s\")) this.select(\"summarize\");\n\t}\n\n\tprivate renderNode(node: FlatTreeNode): string {\n\t\tconst prefix = this.renderPrefix(node);\n\t\tconst currentPath = node.isCurrentPath ? paint(CYAN, \"• \") : \" \";\n\t\tconst content = this.entryDisplay(node.entry);\n\t\treturn `${prefix}${currentPath}${content}`;\n\t}\n\n\tprivate renderPrefix(node: FlatTreeNode): string {\n\t\tconst levels: string[] = [];\n\t\tfor (let level = 0; level < node.indent; level += 1) {\n\t\t\tconst gutter = node.gutters.find((candidate) => candidate.level === level);\n\t\t\tif (gutter) {\n\t\t\t\tlevels.push(paint(DIM, gutter.continues ? \"│ \" : \" \"));\n\t\t\t} else if (node.showConnector && level === node.indent - 1) {\n\t\t\t\tlevels.push(paint(DIM, node.isLast ? \"└─ \" : \"├─ \"));\n\t\t\t} else {\n\t\t\t\tlevels.push(\" \");\n\t\t\t}\n\t\t}\n\t\treturn levels.join(\"\");\n\t}\n\n\tprivate entryDisplay(entry: SessionEntry): string {\n\t\tconst text = textContent(entry);\n\t\tif (entry.type === \"summary\") return `${paint(YELLOW, \"summary: \")}${text || paint(DIM, \"(empty)\")}`;\n\t\tif (entry.type === \"plugin\") return `${paint(DIM, \"plugin: \")}${text || paint(DIM, \"(empty)\")}`;\n\t\tif (entry.message.role === \"user\") return `${paint(CYAN, \"user: \")}${text || paint(DIM, \"(empty)\")}`;\n\t\tif (entry.message.role === \"assistant\") {\n\t\t\tif (text) return `${paint(GREEN, \"assistant: \")}${text}`;\n\t\t\tif (entry.message.stopReason === \"aborted\") return `${paint(GREEN, \"assistant: \")}${paint(DIM, \"(aborted)\")}`;\n\t\t\tif (entry.message.stopReason === \"error\") return `${paint(GREEN, \"assistant: \")}${paint(RED, \"(error)\")}`;\n\t\t\treturn `${paint(GREEN, \"assistant: \")}${paint(DIM, \"(no text)\")}`;\n\t\t}\n\t\treturn `${paint(DIM, `${entry.message.toolName}: `)}${text || paint(DIM, \"(no text)\")}`;\n\t}\n\n\tprivate actionHint(): string {\n\t\treturn `Enter ${translate(this.options.locale, \"treeContinue\")} · e ${translate(this.options.locale, \"treeEdit\")} · s ${translate(this.options.locale, \"treeSummarize\")} · Esc ${translate(this.options.locale, \"treeCancel\")}`;\n\t}\n\n\tprivate move(direction: -1 | 1): void {\n\t\tif (this.nodes.length === 0) return;\n\t\tthis.selectedIndex = (this.selectedIndex + direction + this.nodes.length) % this.nodes.length;\n\t}\n\n\tprivate select(action: \"continue\" | \"edit\" | \"summarize\"): void {\n\t\tconst entry = this.nodes[this.selectedIndex]?.entry;\n\t\tif (!entry) return;\n\t\tif (action === \"continue\") this.options.onContinue?.(entry);\n\t\telse if (action === \"edit\") this.options.onEdit?.(entry);\n\t\telse this.options.onSummarize?.(entry);\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/rpc/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,eAAO,MAAM,oBAAoB,EAAG,CAAU,CAAC;AAC/C,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,qBAAqB,UAAY,CAAC;AAC/C,eAAO,MAAM,+BAA+B,IAAI,CAAC;AACjD,eAAO,MAAM,wBAAwB,QAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/rpc/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/rpc/protocol.js
CHANGED
|
@@ -4,6 +4,7 @@ export const RPC_MAX_ID_LENGTH = 128;
|
|
|
4
4
|
export const RPC_MAX_PROMPT_LENGTH = 1_000_000;
|
|
5
5
|
export const RPC_MAX_ATTACHMENTS_PER_REQUEST = 4;
|
|
6
6
|
export const RPC_MAX_ATTACHMENT_BYTES = 5 * 1024 * 1024;
|
|
7
|
+
const RPC_MAX_ASSISTANT_IMAGE_BYTES = 5 * 1024 * 1024;
|
|
7
8
|
/** Allows one JSONL user entry containing a maximum-sized base64 image to be read in a single transcript page. */
|
|
8
9
|
export const RPC_MAX_TRANSCRIPT_BYTES = 8 * 1024 * 1024;
|
|
9
10
|
const RPC_MAX_ATTACHMENT_BASE64_LENGTH = Math.ceil(RPC_MAX_ATTACHMENT_BYTES / 3) * 4;
|
|
@@ -664,6 +665,27 @@ function assertAssistantMessage(value) {
|
|
|
664
665
|
if (!message ||
|
|
665
666
|
message.role !== "assistant" ||
|
|
666
667
|
!Array.isArray(message.content) ||
|
|
668
|
+
!message.content.every((content) => {
|
|
669
|
+
const block = objectRecord(content);
|
|
670
|
+
if (!block || typeof block.type !== "string")
|
|
671
|
+
return false;
|
|
672
|
+
if (block.type === "text")
|
|
673
|
+
return typeof block.text === "string";
|
|
674
|
+
if (block.type === "thinking")
|
|
675
|
+
return typeof block.thinking === "string";
|
|
676
|
+
if (block.type === "tool_call")
|
|
677
|
+
return typeof block.id === "string" && typeof block.name === "string" && objectRecord(block.arguments);
|
|
678
|
+
if (block.type !== "image" || typeof block.data !== "string" || typeof block.mimeType !== "string")
|
|
679
|
+
return false;
|
|
680
|
+
const padding = block.data.endsWith("==") ? 2 : block.data.endsWith("=") ? 1 : 0;
|
|
681
|
+
const decodedBytes = Math.floor((block.data.length * 3) / 4) - padding;
|
|
682
|
+
return (/^image\/[A-Za-z0-9.+-]+$/.test(block.mimeType) &&
|
|
683
|
+
block.data.length > 0 &&
|
|
684
|
+
block.data.length % 4 === 0 &&
|
|
685
|
+
/^[A-Za-z0-9+/]*={0,2}$/.test(block.data) &&
|
|
686
|
+
decodedBytes > 0 &&
|
|
687
|
+
decodedBytes <= RPC_MAX_ASSISTANT_IMAGE_BYTES);
|
|
688
|
+
}) ||
|
|
667
689
|
typeof message.provider !== "string" ||
|
|
668
690
|
typeof message.model !== "string" ||
|
|
669
691
|
!Number.isFinite(message.timestamp) ||
|