@astralyn/pi 1.0.1 → 1.0.3
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/CHANGELOG.md +21 -0
- package/dist/bundle/chunks/{chunk-4TT2QGFL.js → chunk-N2LEX5CU.js} +1 -1
- package/dist/bundle/chunks/{chunk-H2N2THAO.js → chunk-Q7TDQ5LT.js} +20 -14
- package/dist/bundle/chunks/{virtual-modules-YFKU7JZF.js → virtual-modules-UUHBXSJB.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/tasks/runtime.d.ts +1 -0
- package/dist/core/tasks/runtime.d.ts.map +1 -1
- package/dist/core/tasks/runtime.js +4 -0
- package/dist/core/tasks/runtime.js.map +1 -1
- package/dist/core/tasks/types.d.ts +2 -0
- package/dist/core/tasks/types.d.ts.map +1 -1
- package/dist/core/tasks/types.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts.map +1 -1
- package/dist/core/tools/renderers/bash.js +4 -3
- package/dist/core/tools/renderers/bash.js.map +1 -1
- package/dist/core/tools/shell-tool.d.ts.map +1 -1
- package/dist/core/tools/shell-tool.js +9 -2
- package/dist/core/tools/shell-tool.js.map +1 -1
- package/dist/extensions/deepwiki/execute.d.ts +0 -3
- package/dist/extensions/deepwiki/execute.d.ts.map +1 -1
- package/dist/extensions/deepwiki/execute.js.map +1 -1
- package/dist/extensions/deepwiki/render.d.ts.map +1 -1
- package/dist/extensions/deepwiki/render.js +0 -5
- package/dist/extensions/deepwiki/render.js.map +1 -1
- package/dist/extensions/question/render.d.ts.map +1 -1
- package/dist/extensions/question/render.js +3 -7
- package/dist/extensions/question/render.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +19 -1
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/tasks/index.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/index.js +10 -10
- package/dist/modes/interactive/tasks/index.js.map +1 -1
- package/dist/modes/interactive/tasks/layout.js +4 -5
- package/dist/modes/interactive/tasks/layout.js.map +1 -1
- package/dist/modes/interactive/tasks/manager.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/manager.js +2 -0
- package/dist/modes/interactive/tasks/manager.js.map +1 -1
- package/dist/modes/interactive/tool-view/chat.d.ts +2 -3
- package/dist/modes/interactive/tool-view/chat.d.ts.map +1 -1
- package/dist/modes/interactive/tool-view/chat.js +18 -5
- package/dist/modes/interactive/tool-view/chat.js.map +1 -1
- package/dist/modes/interactive/tool-view/style.d.ts +2 -1
- package/dist/modes/interactive/tool-view/style.d.ts.map +1 -1
- package/dist/modes/interactive/tool-view/style.js +2 -2
- package/dist/modes/interactive/tool-view/style.js.map +1 -1
- package/docs/bundled/tasks.md +5 -3
- package/docs/bundled/tool-presentation.md +4 -3
- package/docs/extensions.md +1 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-tool.js","sourceRoot":"","sources":["../../../src/core/tools/shell-tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants } from \"node:fs\";\nimport { access as fsAccess } from \"node:fs/promises\";\nimport { constants as osConstants } from \"node:os\";\nimport { spawn } from \"child_process\";\nimport { type Static, Type } from \"typebox\";\nimport { waitForChildProcess } from \"../../utils/child-process.ts\";\nimport {\n\tgetShellEnv,\n\tkillProcessTree,\n\ttype ShellConfig,\n\ttrackDetachedChildPid,\n\tuntrackDetachedChildPid,\n} from \"../../utils/shell.ts\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\nimport { type TaskCompletion, TaskExecutionError } from \"../tasks/types.ts\";\nimport { createShellRenderers } from \"./renderers/bash.ts\";\nimport { type ManagedShellExecution, runShellCommand } from \"./shell-execution.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, type TruncationResult } from \"./truncate.ts\";\n\nconst MAX_TIMEOUT_MS = 2_147_483_647;\nconst MAX_TIMEOUT_SECONDS = MAX_TIMEOUT_MS / 1000;\n\nfunction resolveTimeoutMs(timeout: number | undefined): number | undefined {\n\tif (timeout === undefined) return undefined;\n\tif (!Number.isFinite(timeout) || timeout <= 0) {\n\t\tthrow new Error(\"Invalid timeout: must be a finite number of seconds\");\n\t}\n\n\tconst timeoutMs = timeout * 1000;\n\tif (timeoutMs > MAX_TIMEOUT_MS) {\n\t\tthrow new Error(`Invalid timeout: maximum is ${MAX_TIMEOUT_SECONDS} seconds`);\n\t}\n\treturn timeoutMs;\n}\n\nconst bashSchema = Type.Object({\n\tcommand: Type.String({ description: \"Shell command to execute\" }),\n\ttimeout: Type.Optional(Type.Number({ description: \"Timeout in seconds (optional, no default timeout)\" })),\n\tbackground: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription:\n\t\t\t\t\"true returns a managed task ID immediately and runs the command in the background; omit or false to block until exit\",\n\t\t}),\n\t),\n});\n\nexport const bashToolSystemPromptContribution = {\n\tsnippet: \"Execute bash commands, foreground or background\",\n\tguidelines: [\"You can inspect PI_* environment variables for current model and session details.\"],\n} as const;\n\nexport type BashToolInput = Static<typeof bashSchema>;\n\nconst bashOutputSchema = Type.Union([\n\tType.Object({\n\t\toutput: Type.String({\n\t\t\tdescription: \"Combined stdout and stderr, up to 1 MiB, keeping head and tail when truncated.\",\n\t\t}),\n\t\ttruncated: Type.Boolean(),\n\t\tfull_output_path: Type.Optional(Type.String()),\n\t\texit_code: Type.Number(),\n\t\twall_time_seconds: Type.Number(),\n\t}),\n\tType.Object({ task_id: Type.String(), status: Type.String() }),\n]);\n\nexport interface BashToolDetails {\n\ttruncation?: TruncationResult;\n\tfullOutputPath?: string;\n\t/** Settled handoff snapshot, not a command completion or exit code. */\n\tbackground?: { kind: \"background\"; taskId: string };\n}\n\n/**\n * Pluggable operations for the bash tool.\n * Override these to delegate command execution to remote systems (for example SSH).\n */\nexport interface BashOperations {\n\t/**\n\t * Execute a command and stream output.\n\t * @param command The command to execute\n\t * @param cwd Working directory\n\t * @param options Execution options\n\t * @returns Promise resolving to the exit code. Report signal terminations as 128 + signal number;\n\t * a null exit code is treated as a failed command.\n\t *\n\t * Error contract: reject with `new Error(\"aborted\")` when aborted via `signal`,\n\t * and `new Error(\"timeout:<seconds>\")` on timeout expiry. The shared shell\n\t * execution pipeline classifies outcomes from these exact markers.\n\t */\n\texec: (\n\t\tcommand: string,\n\t\tcwd: string,\n\t\toptions: {\n\t\t\tonData: (data: Buffer) => void;\n\t\t\tsignal?: AbortSignal;\n\t\t\ttimeout?: number;\n\t\t\tenv?: NodeJS.ProcessEnv;\n\t\t},\n\t) => Promise<{ exitCode: number | null }>;\n}\n\n/** Shared process execution used by the built-in shell tools. */\nexport function createLocalShellOperations(\n\tshellName: string,\n\tresolveShellConfig: () => ShellConfig,\n\tnormalizeCommand: (command: string) => string = (command) => command,\n): BashOperations {\n\treturn {\n\t\texec: async (command, cwd, { onData, signal, timeout, env }) => {\n\t\t\tconst timeoutMs = resolveTimeoutMs(timeout);\n\t\t\tif (signal?.aborted) {\n\t\t\t\tthrow new Error(\"aborted\");\n\t\t\t}\n\t\t\tconst shellConfig = resolveShellConfig();\n\t\t\ttry {\n\t\t\t\tawait fsAccess(cwd, constants.F_OK);\n\t\t\t} catch {\n\t\t\t\tthrow new Error(`Working directory does not exist: ${cwd}\\nCannot execute ${shellName} commands.`);\n\t\t\t}\n\n\t\t\tif (signal?.aborted) throw new Error(\"aborted\");\n\t\t\tconst commandFromStdin = shellConfig.commandTransport === \"stdin\";\n\t\t\tconst normalizedCommand = normalizeCommand(command);\n\t\t\tconst child = spawn(\n\t\t\t\tshellConfig.shell,\n\t\t\t\tcommandFromStdin ? shellConfig.args : [...shellConfig.args, normalizedCommand],\n\t\t\t\t{\n\t\t\t\t\tcwd,\n\t\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\t\tenv: env ?? getShellEnv(),\n\t\t\t\t\tstdio: [commandFromStdin ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\t\twindowsHide: true,\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (commandFromStdin) {\n\t\t\t\tchild.stdin?.on(\"error\", () => {});\n\t\t\t\tchild.stdin?.end(normalizedCommand);\n\t\t\t}\n\t\t\tif (child.pid) trackDetachedChildPid(child.pid);\n\t\t\tlet timedOut = false;\n\t\t\tlet timeoutHandle: NodeJS.Timeout | undefined;\n\t\t\tconst onAbort = () => {\n\t\t\t\tif (child.pid) killProcessTree(child.pid);\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\t// Set timeout if provided.\n\t\t\t\tif (timeoutMs !== undefined) {\n\t\t\t\t\ttimeoutHandle = setTimeout(() => {\n\t\t\t\t\t\ttimedOut = true;\n\t\t\t\t\t\tif (child.pid) killProcessTree(child.pid);\n\t\t\t\t\t}, timeoutMs);\n\t\t\t\t}\n\t\t\t\t// Stream stdout and stderr.\n\t\t\t\tchild.stdout?.on(\"data\", onData);\n\t\t\t\tchild.stderr?.on(\"data\", onData);\n\t\t\t\t// Handle abort signal by killing the entire process tree.\n\t\t\t\tif (signal) {\n\t\t\t\t\tif (signal.aborted) onAbort();\n\t\t\t\t\telse signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t}\n\t\t\t\t// Handle shell spawn errors and wait for the process to terminate without hanging\n\t\t\t\t// on inherited stdio handles held by detached descendants.\n\t\t\t\tconst exitCode = await waitForChildProcess(child);\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tthrow new Error(\"aborted\");\n\t\t\t\t}\n\t\t\t\tif (timedOut) {\n\t\t\t\t\tthrow new Error(`timeout:${timeout}`);\n\t\t\t\t}\n\t\t\t\t// A signal-killed shell has no exit code. Use the standard shell convention so\n\t\t\t\t// callers do not mistake the termination for a successful command.\n\t\t\t\tconst signalCode = child.signalCode;\n\t\t\t\treturn { exitCode: exitCode ?? (signalCode ? 128 + (osConstants.signals[signalCode] ?? 0) : 1) };\n\t\t\t} finally {\n\t\t\t\tif (child.pid) untrackDetachedChildPid(child.pid);\n\t\t\t\tif (timeoutHandle) clearTimeout(timeoutHandle);\n\t\t\t\tif (signal) signal.removeEventListener(\"abort\", onAbort);\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Create bash operations using pi's built-in local shell execution backend.\n *\n * This is useful for extensions that intercept user_bash and still want pi's\n * standard local shell behavior while wrapping or rewriting commands.\n */\n\nexport interface BashSpawnContext {\n\tcommand: string;\n\tcwd: string;\n\tenv: NodeJS.ProcessEnv;\n}\n\nexport type BashSpawnHook = (context: BashSpawnContext) => BashSpawnContext;\n\nexport function resolveSpawnContext(\n\tcommand: string,\n\tcwd: string,\n\tspawnHook: BashSpawnHook | undefined,\n\texposeSessionEnvironment: boolean,\n\tctx: ExtensionContext | undefined,\n): BashSpawnContext {\n\tconst env = { ...getShellEnv() };\n\tdelete env.PI_SESSION_ID;\n\tdelete env.PI_SESSION_FILE;\n\tdelete env.PI_PROVIDER;\n\tdelete env.PI_MODEL;\n\tdelete env.PI_REASONING_LEVEL;\n\tif (exposeSessionEnvironment && ctx) {\n\t\tconst model = ctx.model;\n\t\tenv.PI_SESSION_ID = ctx.sessionManager.getSessionId();\n\t\tconst sessionFile = ctx.sessionManager.getSessionFile();\n\t\tif (sessionFile) env.PI_SESSION_FILE = sessionFile;\n\t\tif (model) {\n\t\t\tenv.PI_PROVIDER = model.provider;\n\t\t\tenv.PI_MODEL = model.id;\n\t\t}\n\t\tif (ctx.thinkingLevel) env.PI_REASONING_LEVEL = ctx.thinkingLevel;\n\t}\n\tconst baseContext: BashSpawnContext = { command, cwd, env };\n\treturn spawnHook ? spawnHook(baseContext) : baseContext;\n}\n\nexport interface BashToolOptions {\n\t/** Custom operations for command execution. Default: local shell */\n\toperations?: BashOperations;\n\t/** Command prefix prepended to every command (for example shell setup commands) */\n\tcommandPrefix?: string;\n\t/** Optional explicit shell path from settings */\n\tshellPath?: string;\n\t/** Expose current Pi session metadata as PI_* environment variables. Default: true */\n\texposeSessionEnvironment?: boolean;\n\t/** Hook to adjust command, cwd, or env before execution */\n\tspawnHook?: BashSpawnHook;\n}\n\nexport type BashRenderState = {\n\tdispose?: () => void;\n};\n\nexport interface ShellToolConfig {\n\tname: string;\n\tlabel: string;\n\tshellName: string;\n\tprompt: string;\n\tpromptSnippet: string;\n\tpromptGuidelines?: readonly string[];\n\ttempFilePrefix: string;\n}\n\n/** Translate terminal shell failures to the native foreground tool contract once. */\nfunction shellToolResult(completion: TaskCompletion<BashToolDetails | undefined>, managed: boolean) {\n\tconst status = completion.status;\n\tif (completion.result.structuredContent) return completion.result;\n\tif (status === \"failed\" || status === \"timeout\" || status === \"cancelled\") {\n\t\tconst text = completion.result.content\n\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t.map((part) => part.text)\n\t\t\t.join(\"\\n\");\n\t\tconst message = completion.error ? text || completion.error : `${text ? `${text}\\n\\n` : \"\"}Command ${status}`;\n\t\tthrow managed ? new TaskExecutionError(message, status) : new Error(message);\n\t}\n\treturn completion.result;\n}\n\nexport function createShellToolDefinition(\n\tcwd: string,\n\tconfig: ShellToolConfig,\n\toptions: BashToolOptions & { operations: BashOperations },\n): ToolDefinition<typeof bashSchema, BashToolDetails | undefined, BashRenderState> {\n\tconst ops = options.operations;\n\tconst commandPrefix = options?.commandPrefix;\n\tconst exposeSessionEnvironment = options?.exposeSessionEnvironment ?? true;\n\tconst spawnHook = options?.spawnHook;\n\treturn {\n\t\tname: config.name,\n\t\tlabel: config.label,\n\t\tdescription: `Execute a ${config.shellName} command in the current working directory. Returns stdout and stderr, truncated to the last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first); the full output is saved to a temp file. Optionally provide a timeout in seconds (no default). Choose the mode per call: foreground (default) blocks until the command exits — use it when your next step needs the output; background: true returns immediately with a task ID — use it for long-running work (builds, servers, watchers, big test suites) or when you have independent work to continue. A handoff is not completion: the result arrives later as an automatic completion notification; meanwhile use tasks read to inspect output, tasks wait to block until it settles, tasks kill to stop it. Background output is limited to 20 MiB; an expired tasks wait window never stops the command.`,\n\t\tpromptSnippet: config.promptSnippet,\n\t\tpromptGuidelines: exposeSessionEnvironment && config.promptGuidelines ? [...config.promptGuidelines] : undefined,\n\t\tparameters: bashSchema,\n\t\toutputSchema: bashOutputSchema,\n\t\tconstrainedSampling: { type: \"json_schema\", strict: \"prefer\" },\n\t\tasync execute(\n\t\t\ttoolCallId,\n\t\t\t{ command, timeout, background }: BashToolInput,\n\t\t\tparentSignal?: AbortSignal,\n\t\t\toriginalUpdate?,\n\t\t\tctx?: ExtensionContext,\n\t\t) {\n\t\t\tconst host = ctx?.tasks;\n\t\t\tif (host?.closed) throw new Error(\"Task service is closed\");\n\t\t\tconst run = async (managed?: ManagedShellExecution): Promise<TaskCompletion<BashToolDetails | undefined>> => {\n\t\t\t\tconst signal = managed?.control.signal ?? parentSignal;\n\t\t\t\ttry {\n\t\t\t\t\tif (managed) {\n\t\t\t\t\t\tif (signal?.aborted) throw new Error(\"Command aborted\");\n\t\t\t\t\t\tresolveTimeoutMs(timeout);\n\t\t\t\t\t}\n\t\t\t\t\tconst resolvedCommand = commandPrefix ? `${commandPrefix}\\n${command}` : command;\n\t\t\t\t\tconst spawnContext = resolveSpawnContext(\n\t\t\t\t\t\tresolvedCommand,\n\t\t\t\t\t\tctx?.cwd || cwd,\n\t\t\t\t\t\tspawnHook,\n\t\t\t\t\t\texposeSessionEnvironment,\n\t\t\t\t\t\tctx,\n\t\t\t\t\t);\n\t\t\t\t\treturn await runShellCommand({\n\t\t\t\t\t\toperations: ops,\n\t\t\t\t\t\tcontext: spawnContext,\n\t\t\t\t\t\ttempFilePrefix: config.tempFilePrefix,\n\t\t\t\t\t\ttimeout,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\tonUpdate: originalUpdate,\n\t\t\t\t\t\tmanaged,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Setup and cleanup exceptions carry an explicit terminal status.\n\t\t\t\t\tif (!managed) throw error;\n\t\t\t\t\tthrow new TaskExecutionError(\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t\t\tmanaged.control.signal.aborted ? \"cancelled\" : \"failed\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (!host) {\n\t\t\t\tif (background)\n\t\t\t\t\tthrow new Error(\"Background execution is not available in this host. No command was started.\");\n\t\t\t\treturn shellToolResult(await run(), false);\n\t\t\t}\n\t\t\tconst outcome = await host.execute<BashToolDetails | undefined>({\n\t\t\t\tkind: config.name,\n\t\t\t\ttitle: command,\n\t\t\t\ttoolCallId,\n\t\t\t\tcommand,\n\t\t\t\tcwd: ctx?.cwd || cwd,\n\t\t\t\tbackground,\n\t\t\t\tsignal: parentSignal,\n\t\t\t\tonUpdate: originalUpdate,\n\t\t\t\trun: (control) => run({ control }),\n\t\t\t});\n\t\t\tif (outcome.kind === \"result\") return shellToolResult(outcome, true);\n\t\t\treturn {\n\t\t\t\tstructuredContent: { task_id: outcome.task.id, status: outcome.task.status },\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: `Command handed to background. Task ID: ${outcome.task.id}. Status: ${outcome.task.status}. Completion arrives automatically as a notification — do not poll or immediately wait on it; continue with other work or hand back to the user. Use tasks read to inspect output, tasks wait only when your next step is blocked on the result (prefer foreground next time in that case), or tasks kill to stop it.${outcome.task.outputPath ? `\\nFull output: ${outcome.task.outputPath}` : \"\"}`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: {\n\t\t\t\t\tbackground: { kind: \"background\", taskId: outcome.task.id },\n\t\t\t\t\tfullOutputPath: outcome.task.outputPath,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\t...createShellRenderers(config),\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"shell-tool.js","sourceRoot":"","sources":["../../../src/core/tools/shell-tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants } from \"node:fs\";\nimport { access as fsAccess } from \"node:fs/promises\";\nimport { constants as osConstants } from \"node:os\";\nimport { spawn } from \"child_process\";\nimport { type Static, Type } from \"typebox\";\nimport { waitForChildProcess } from \"../../utils/child-process.ts\";\nimport {\n\tgetShellEnv,\n\tkillProcessTree,\n\ttype ShellConfig,\n\ttrackDetachedChildPid,\n\tuntrackDetachedChildPid,\n} from \"../../utils/shell.ts\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\nimport { type TaskCompletion, TaskExecutionError } from \"../tasks/types.ts\";\nimport { createShellRenderers } from \"./renderers/bash.ts\";\nimport { type ManagedShellExecution, runShellCommand } from \"./shell-execution.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, type TruncationResult } from \"./truncate.ts\";\n\nconst MAX_TIMEOUT_MS = 2_147_483_647;\nconst MAX_TIMEOUT_SECONDS = MAX_TIMEOUT_MS / 1000;\n\nfunction resolveTimeoutMs(timeout: number | undefined): number | undefined {\n\tif (timeout === undefined) return undefined;\n\tif (!Number.isFinite(timeout) || timeout <= 0) {\n\t\tthrow new Error(\"Invalid timeout: must be a finite number of seconds\");\n\t}\n\n\tconst timeoutMs = timeout * 1000;\n\tif (timeoutMs > MAX_TIMEOUT_MS) {\n\t\tthrow new Error(`Invalid timeout: maximum is ${MAX_TIMEOUT_SECONDS} seconds`);\n\t}\n\treturn timeoutMs;\n}\n\nconst bashSchema = Type.Object({\n\tcommand: Type.String({ description: \"Shell command to execute\" }),\n\ttimeout: Type.Optional(Type.Number({ description: \"Timeout in seconds (optional, no default timeout)\" })),\n\tbackground: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription:\n\t\t\t\t\"true returns a managed task ID immediately and runs the command in the background, and you are notified when it completes — do not poll for its result; omit or false to block until exit\",\n\t\t}),\n\t),\n});\n\nexport const bashToolSystemPromptContribution = {\n\tsnippet: \"Execute bash commands, foreground or background\",\n\tguidelines: [\"You can inspect PI_* environment variables for current model and session details.\"],\n} as const;\n\nexport type BashToolInput = Static<typeof bashSchema>;\n\nconst bashOutputSchema = Type.Union([\n\tType.Object({\n\t\toutput: Type.String({\n\t\t\tdescription: \"Combined stdout and stderr, up to 1 MiB, keeping head and tail when truncated.\",\n\t\t}),\n\t\ttruncated: Type.Boolean(),\n\t\tfull_output_path: Type.Optional(Type.String()),\n\t\texit_code: Type.Number(),\n\t\twall_time_seconds: Type.Number(),\n\t}),\n\tType.Object({ task_id: Type.String(), status: Type.String() }),\n]);\n\nexport interface BashToolDetails {\n\ttruncation?: TruncationResult;\n\tfullOutputPath?: string;\n\t/** Settled handoff snapshot, not a command completion or exit code. */\n\tbackground?: { kind: \"background\"; taskId: string };\n}\n\n/**\n * Pluggable operations for the bash tool.\n * Override these to delegate command execution to remote systems (for example SSH).\n */\nexport interface BashOperations {\n\t/**\n\t * Execute a command and stream output.\n\t * @param command The command to execute\n\t * @param cwd Working directory\n\t * @param options Execution options\n\t * @returns Promise resolving to the exit code. Report signal terminations as 128 + signal number;\n\t * a null exit code is treated as a failed command.\n\t *\n\t * Error contract: reject with `new Error(\"aborted\")` when aborted via `signal`,\n\t * and `new Error(\"timeout:<seconds>\")` on timeout expiry. The shared shell\n\t * execution pipeline classifies outcomes from these exact markers.\n\t */\n\texec: (\n\t\tcommand: string,\n\t\tcwd: string,\n\t\toptions: {\n\t\t\tonData: (data: Buffer) => void;\n\t\t\tsignal?: AbortSignal;\n\t\t\ttimeout?: number;\n\t\t\tenv?: NodeJS.ProcessEnv;\n\t\t},\n\t) => Promise<{ exitCode: number | null }>;\n}\n\n/** Shared process execution used by the built-in shell tools. */\nexport function createLocalShellOperations(\n\tshellName: string,\n\tresolveShellConfig: () => ShellConfig,\n\tnormalizeCommand: (command: string) => string = (command) => command,\n): BashOperations {\n\treturn {\n\t\texec: async (command, cwd, { onData, signal, timeout, env }) => {\n\t\t\tconst timeoutMs = resolveTimeoutMs(timeout);\n\t\t\tif (signal?.aborted) {\n\t\t\t\tthrow new Error(\"aborted\");\n\t\t\t}\n\t\t\tconst shellConfig = resolveShellConfig();\n\t\t\ttry {\n\t\t\t\tawait fsAccess(cwd, constants.F_OK);\n\t\t\t} catch {\n\t\t\t\tthrow new Error(`Working directory does not exist: ${cwd}\\nCannot execute ${shellName} commands.`);\n\t\t\t}\n\n\t\t\tif (signal?.aborted) throw new Error(\"aborted\");\n\t\t\tconst commandFromStdin = shellConfig.commandTransport === \"stdin\";\n\t\t\tconst normalizedCommand = normalizeCommand(command);\n\t\t\tconst child = spawn(\n\t\t\t\tshellConfig.shell,\n\t\t\t\tcommandFromStdin ? shellConfig.args : [...shellConfig.args, normalizedCommand],\n\t\t\t\t{\n\t\t\t\t\tcwd,\n\t\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\t\tenv: env ?? getShellEnv(),\n\t\t\t\t\tstdio: [commandFromStdin ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\t\twindowsHide: true,\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (commandFromStdin) {\n\t\t\t\tchild.stdin?.on(\"error\", () => {});\n\t\t\t\tchild.stdin?.end(normalizedCommand);\n\t\t\t}\n\t\t\tif (child.pid) trackDetachedChildPid(child.pid);\n\t\t\tlet timedOut = false;\n\t\t\tlet timeoutHandle: NodeJS.Timeout | undefined;\n\t\t\tconst onAbort = () => {\n\t\t\t\tif (child.pid) killProcessTree(child.pid);\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\t// Set timeout if provided.\n\t\t\t\tif (timeoutMs !== undefined) {\n\t\t\t\t\ttimeoutHandle = setTimeout(() => {\n\t\t\t\t\t\ttimedOut = true;\n\t\t\t\t\t\tif (child.pid) killProcessTree(child.pid);\n\t\t\t\t\t}, timeoutMs);\n\t\t\t\t}\n\t\t\t\t// Stream stdout and stderr.\n\t\t\t\tchild.stdout?.on(\"data\", onData);\n\t\t\t\tchild.stderr?.on(\"data\", onData);\n\t\t\t\t// Handle abort signal by killing the entire process tree.\n\t\t\t\tif (signal) {\n\t\t\t\t\tif (signal.aborted) onAbort();\n\t\t\t\t\telse signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t}\n\t\t\t\t// Handle shell spawn errors and wait for the process to terminate without hanging\n\t\t\t\t// on inherited stdio handles held by detached descendants.\n\t\t\t\tconst exitCode = await waitForChildProcess(child);\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tthrow new Error(\"aborted\");\n\t\t\t\t}\n\t\t\t\tif (timedOut) {\n\t\t\t\t\tthrow new Error(`timeout:${timeout}`);\n\t\t\t\t}\n\t\t\t\t// A signal-killed shell has no exit code. Use the standard shell convention so\n\t\t\t\t// callers do not mistake the termination for a successful command.\n\t\t\t\tconst signalCode = child.signalCode;\n\t\t\t\treturn { exitCode: exitCode ?? (signalCode ? 128 + (osConstants.signals[signalCode] ?? 0) : 1) };\n\t\t\t} finally {\n\t\t\t\tif (child.pid) untrackDetachedChildPid(child.pid);\n\t\t\t\tif (timeoutHandle) clearTimeout(timeoutHandle);\n\t\t\t\tif (signal) signal.removeEventListener(\"abort\", onAbort);\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Create bash operations using pi's built-in local shell execution backend.\n *\n * This is useful for extensions that intercept user_bash and still want pi's\n * standard local shell behavior while wrapping or rewriting commands.\n */\n\nexport interface BashSpawnContext {\n\tcommand: string;\n\tcwd: string;\n\tenv: NodeJS.ProcessEnv;\n}\n\nexport type BashSpawnHook = (context: BashSpawnContext) => BashSpawnContext;\n\nexport function resolveSpawnContext(\n\tcommand: string,\n\tcwd: string,\n\tspawnHook: BashSpawnHook | undefined,\n\texposeSessionEnvironment: boolean,\n\tctx: ExtensionContext | undefined,\n): BashSpawnContext {\n\tconst env = { ...getShellEnv() };\n\tdelete env.PI_SESSION_ID;\n\tdelete env.PI_SESSION_FILE;\n\tdelete env.PI_PROVIDER;\n\tdelete env.PI_MODEL;\n\tdelete env.PI_REASONING_LEVEL;\n\tif (exposeSessionEnvironment && ctx) {\n\t\tconst model = ctx.model;\n\t\tenv.PI_SESSION_ID = ctx.sessionManager.getSessionId();\n\t\tconst sessionFile = ctx.sessionManager.getSessionFile();\n\t\tif (sessionFile) env.PI_SESSION_FILE = sessionFile;\n\t\tif (model) {\n\t\t\tenv.PI_PROVIDER = model.provider;\n\t\t\tenv.PI_MODEL = model.id;\n\t\t}\n\t\tif (ctx.thinkingLevel) env.PI_REASONING_LEVEL = ctx.thinkingLevel;\n\t}\n\tconst baseContext: BashSpawnContext = { command, cwd, env };\n\treturn spawnHook ? spawnHook(baseContext) : baseContext;\n}\n\nexport interface BashToolOptions {\n\t/** Custom operations for command execution. Default: local shell */\n\toperations?: BashOperations;\n\t/** Command prefix prepended to every command (for example shell setup commands) */\n\tcommandPrefix?: string;\n\t/** Optional explicit shell path from settings */\n\tshellPath?: string;\n\t/** Expose current Pi session metadata as PI_* environment variables. Default: true */\n\texposeSessionEnvironment?: boolean;\n\t/** Hook to adjust command, cwd, or env before execution */\n\tspawnHook?: BashSpawnHook;\n}\n\nexport type BashRenderState = {\n\tdispose?: () => void;\n};\n\nexport interface ShellToolConfig {\n\tname: string;\n\tlabel: string;\n\tshellName: string;\n\tprompt: string;\n\tpromptSnippet: string;\n\tpromptGuidelines?: readonly string[];\n\ttempFilePrefix: string;\n}\n\n/** Translate terminal shell failures to the native foreground tool contract once. */\nfunction shellToolResult(completion: TaskCompletion<BashToolDetails | undefined>, managed: boolean) {\n\tconst status = completion.status;\n\tif (completion.result.structuredContent) return completion.result;\n\tif (status === \"failed\" || status === \"timeout\" || status === \"cancelled\") {\n\t\tconst text = completion.result.content\n\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t.map((part) => part.text)\n\t\t\t.join(\"\\n\");\n\t\tconst message = completion.error ? text || completion.error : `${text ? `${text}\\n\\n` : \"\"}Command ${status}`;\n\t\tthrow managed ? new TaskExecutionError(message, status) : new Error(message);\n\t}\n\treturn completion.result;\n}\n\nexport function createShellToolDefinition(\n\tcwd: string,\n\tconfig: ShellToolConfig,\n\toptions: BashToolOptions & { operations: BashOperations },\n): ToolDefinition<typeof bashSchema, BashToolDetails | undefined, BashRenderState> {\n\tconst ops = options.operations;\n\tconst commandPrefix = options?.commandPrefix;\n\tconst exposeSessionEnvironment = options?.exposeSessionEnvironment ?? true;\n\tconst spawnHook = options?.spawnHook;\n\treturn {\n\t\tname: config.name,\n\t\tlabel: config.label,\n\t\tdescription: `Execute a ${config.shellName} command in the current working directory. Returns stdout and stderr, truncated to the last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first); the full output is saved to a temp file. Optionally provide a timeout in seconds (no default). Choose the mode per call: foreground (default) blocks until the command exits — use it when your next step needs the output; background: true returns immediately with a task ID — use it for long-running work (builds, servers, watchers, big test suites) or when you have independent work to continue. A handoff is not completion: the result arrives later as an automatic completion notification; meanwhile use tasks read to inspect output, tasks wait to block until it settles, tasks kill to stop it. Background output is limited to 20 MiB; an expired tasks wait window never stops the command.`,\n\t\tpromptSnippet: config.promptSnippet,\n\t\tpromptGuidelines: exposeSessionEnvironment && config.promptGuidelines ? [...config.promptGuidelines] : undefined,\n\t\tparameters: bashSchema,\n\t\toutputSchema: bashOutputSchema,\n\t\tconstrainedSampling: { type: \"json_schema\", strict: \"prefer\" },\n\t\tasync execute(\n\t\t\ttoolCallId,\n\t\t\t{ command, timeout, background }: BashToolInput,\n\t\t\tparentSignal?: AbortSignal,\n\t\t\toriginalUpdate?,\n\t\t\tctx?: ExtensionContext,\n\t\t) {\n\t\t\tconst host = ctx?.tasks;\n\t\t\tif (host?.closed) throw new Error(\"Task service is closed\");\n\t\t\tconst run = async (managed?: ManagedShellExecution): Promise<TaskCompletion<BashToolDetails | undefined>> => {\n\t\t\t\tconst signal = managed?.control.signal ?? parentSignal;\n\t\t\t\ttry {\n\t\t\t\t\tif (managed) {\n\t\t\t\t\t\tif (signal?.aborted) throw new Error(\"Command aborted\");\n\t\t\t\t\t\tresolveTimeoutMs(timeout);\n\t\t\t\t\t}\n\t\t\t\t\tconst resolvedCommand = commandPrefix ? `${commandPrefix}\\n${command}` : command;\n\t\t\t\t\tconst spawnContext = resolveSpawnContext(\n\t\t\t\t\t\tresolvedCommand,\n\t\t\t\t\t\tctx?.cwd || cwd,\n\t\t\t\t\t\tspawnHook,\n\t\t\t\t\t\texposeSessionEnvironment,\n\t\t\t\t\t\tctx,\n\t\t\t\t\t);\n\t\t\t\t\treturn await runShellCommand({\n\t\t\t\t\t\toperations: ops,\n\t\t\t\t\t\tcontext: spawnContext,\n\t\t\t\t\t\ttempFilePrefix: config.tempFilePrefix,\n\t\t\t\t\t\ttimeout,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\tonUpdate: originalUpdate,\n\t\t\t\t\t\tmanaged,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Setup and cleanup exceptions carry an explicit terminal status.\n\t\t\t\t\tif (!managed) throw error;\n\t\t\t\t\tthrow new TaskExecutionError(\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t\t\tmanaged.control.signal.aborted ? \"cancelled\" : \"failed\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (!host) {\n\t\t\t\tif (background)\n\t\t\t\t\tthrow new Error(\"Background execution is not available in this host. No command was started.\");\n\t\t\t\treturn shellToolResult(await run(), false);\n\t\t\t}\n\t\t\tconst outcome = await host.execute<BashToolDetails | undefined>({\n\t\t\t\tkind: config.name,\n\t\t\t\ttitle: command,\n\t\t\t\ttoolCallId,\n\t\t\t\tcommand,\n\t\t\t\tcwd: ctx?.cwd || cwd,\n\t\t\t\tbackground,\n\t\t\t\tsignal: parentSignal,\n\t\t\t\tonUpdate: originalUpdate,\n\t\t\t\trun: (control) => run({ control }),\n\t\t\t});\n\t\t\tif (outcome.kind === \"result\") return shellToolResult(outcome, true);\n\t\t\tconst tail = `Task ID: ${outcome.task.id}. Status: ${outcome.task.status}. Completion arrives automatically as a notification — do not poll or immediately wait on it; continue with other work or hand back to the user. Use tasks read to inspect output, tasks wait only when your next step is blocked on the result (prefer foreground next time in that case), or tasks kill to stop it.`;\n\t\t\t// Shell execution can become background work in two ways, and the model has to know which\n\t\t\t// one it got: a submitted background command starts from an empty log, while a detached\n\t\t\t// one already holds output and keeps its original timeout.\n\t\t\tconst handoff =\n\t\t\t\tbackground === true\n\t\t\t\t\t? `Command handed to background. ${tail}`\n\t\t\t\t\t: `Command moved to the background while it was running, by the user. The execution continues unchanged — no restart, and a supplied timeout is still measured from command startup. Output produced so far is already in the log, so tasks read now returns partial output, not a fresh start. ${tail}`;\n\t\t\treturn {\n\t\t\t\tstructuredContent: { task_id: outcome.task.id, status: outcome.task.status },\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: `${handoff}${outcome.task.outputPath ? `\\nFull output: ${outcome.task.outputPath}` : \"\"}`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: {\n\t\t\t\t\tbackground: { kind: \"background\", taskId: outcome.task.id },\n\t\t\t\t\tfullOutputPath: outcome.task.outputPath,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\t...createShellRenderers(config),\n\t};\n}\n"]}
|
|
@@ -17,9 +17,6 @@ export interface DeepWikiDetails {
|
|
|
17
17
|
/** Set when model-facing text was truncated to the character budget. */
|
|
18
18
|
shownPages?: number;
|
|
19
19
|
truncatedChars?: number;
|
|
20
|
-
/** Legacy fields kept so older session entries still render. */
|
|
21
|
-
sectionCount?: number;
|
|
22
|
-
sectionTitles?: string[];
|
|
23
20
|
errorMessage?: string;
|
|
24
21
|
}
|
|
25
22
|
export declare function executeDeepWiki(params: DeepWikiParams, signal: AbortSignal | undefined, onUpdate: AgentToolUpdateCallback<DeepWikiDetails> | undefined): Promise<AgentToolResult<DeepWikiDetails>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAI/F,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAA2B,MAAM,aAAa,CAAC;AAEhG,eAAO,MAAM,2BAA2B,SAAU,CAAC;AAGnD,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAI/F,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAA2B,MAAM,aAAa,CAAC;AAEhG,eAAO,MAAM,2BAA2B,SAAU,CAAC;AAGnD,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AA+BD,wBAAsB,eAAe,CACpC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,uBAAuB,CAAC,eAAe,CAAC,GAAG,SAAS,GAC5D,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAuE3C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/execute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAyB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAA4C,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEhG,MAAM,CAAC,MAAM,2BAA2B,GAAG,OAAO,CAAC;AACnD,MAAM,yBAAyB,GAAG,2BAA2B,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/execute.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult, AgentToolUpdateCallback } from \"../../core/extensions/types.ts\";\n\nimport { callDeepWiki, type DeepWikiResponse } from \"./client.ts\";\nimport { extractPage, truncateContentsByPages } from \"./contents.ts\";\nimport { type DeepWikiAction, type DeepWikiParams, normalizeDeepWikiParams } from \"./schema.ts\";\n\nexport const DEEPWIKI_OUTPUT_CHAR_BUDGET = 120_000;\nconst CONTENTS_BODY_CHAR_BUDGET = DEEPWIKI_OUTPUT_CHAR_BUDGET - 2_000;\n\nexport interface DeepWikiDetails {\n\taction: DeepWikiAction;\n\trepoName: string;\n\trepoNames?: string[];\n\tquestion?: string;\n\ttoolName?: string;\n\toutputLength?: number;\n\tcacheHit?: boolean;\n\tpageCount?: number;\n\tpageTitles?: string[];\n\t/** Resolved title and 1-based position of a single-page contents read. */\n\trequestedPage?: string;\n\tpageIndex?: number;\n\t/** Set when model-facing text was truncated to the character budget. */\n\tshownPages?: number;\n\ttruncatedChars?: number;\n\terrorMessage?: string;\n}\n\nfunction buildResult(\n\tparams: DeepWikiParams,\n\ttext: string,\n\textra: Partial<DeepWikiDetails> = {},\n): AgentToolResult<DeepWikiDetails> {\n\tconst repoNames = Array.isArray(params.repoName) ? params.repoName : [params.repoName];\n\treturn {\n\t\tcontent: [{ type: \"text\", text }],\n\t\tdetails: {\n\t\t\taction: params.action,\n\t\t\trepoName: repoNames.join(\", \"),\n\t\t\t...(repoNames.length > 1 ? { repoNames } : {}),\n\t\t\t...(params.question ? { question: params.question } : {}),\n\t\t\t...extra,\n\t\t},\n\t};\n}\n\nfunction boundDeepWikiOutput(\n\ttext: string,\n\taction: DeepWikiAction,\n): { text: string; truncated: boolean; truncatedChars: number } {\n\tif (text.length <= DEEPWIKI_OUTPUT_CHAR_BUDGET) return { text, truncated: false, truncatedChars: 0 };\n\tconst notice = `\\n\\n[DeepWiki ${action} output truncated to ${DEEPWIKI_OUTPUT_CHAR_BUDGET} characters. Use a focused page or question request for the omitted content.]`;\n\tconst keepLength = Math.max(0, DEEPWIKI_OUTPUT_CHAR_BUDGET - notice.length);\n\tconst kept = text.slice(0, keepLength).trimEnd();\n\treturn { text: `${kept}${notice}`, truncated: true, truncatedChars: text.length - kept.length };\n}\n\nexport async function executeDeepWiki(\n\tparams: DeepWikiParams,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: AgentToolUpdateCallback<DeepWikiDetails> | undefined,\n): Promise<AgentToolResult<DeepWikiDetails>> {\n\tconst normalizedParams = normalizeDeepWikiParams(params);\n\tconst repoLabel = Array.isArray(normalizedParams.repoName)\n\t\t? normalizedParams.repoName.join(\", \")\n\t\t: normalizedParams.repoName;\n\n\tonUpdate?.(buildResult(normalizedParams, `Querying DeepWiki for ${repoLabel}...`));\n\n\tlet response: DeepWikiResponse;\n\ttry {\n\t\tresponse = await callDeepWiki(normalizedParams, signal);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`DeepWiki call failed: ${message}`);\n\t}\n\n\tconst extra: Partial<DeepWikiDetails> = {\n\t\ttoolName: response.toolName,\n\t\toutputLength: response.outputLength,\n\t\t...(response.cacheHit ? { cacheHit: true } : {}),\n\t\t...(response.pageTitles\n\t\t\t? {\n\t\t\t\t\tpageCount: response.pageTitles.length,\n\t\t\t\t\tpageTitles: response.pageTitles,\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n\n\t// Bounded model-facing output: the cache keeps the full response\n\t// (outputLength/pageTitles describe it); only the returned text is cut.\n\t// truncateContentsByPages/extractPage are deterministic, so cached and\n\t// fresh calls produce identical text.\n\tlet resultText = response.text;\n\tif (normalizedParams.action === \"contents\") {\n\t\tif (normalizedParams.page !== undefined) {\n\t\t\t// Single-page read: upstream has no per-page fetch, so slice the page\n\t\t\t// out of the (cached) full wiki locally.\n\t\t\tconst lookup = extractPage(response.text, normalizedParams.page);\n\t\t\tif (!lookup.found) {\n\t\t\t\tif (lookup.titles.length === 0) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`page \"${normalizedParams.page}\" not found: this wiki has no page structure. Call contents without page.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst list = lookup.titles.slice(0, 30).join(\"; \");\n\t\t\t\tconst more = lookup.titles.length > 30 ? ` … +${lookup.titles.length - 30} more` : \"\";\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`page \"${normalizedParams.page}\" not found in ${repoLabel} wiki (${lookup.titles.length} pages).\\nAvailable pages: ${list}${more}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst truncation = truncateContentsByPages(lookup.found.text, CONTENTS_BODY_CHAR_BUDGET);\n\t\t\tresultText = truncation.text;\n\t\t\textra.requestedPage = lookup.found.title;\n\t\t\textra.pageIndex = lookup.found.index;\n\t\t\tif (truncation.truncated) extra.truncatedChars = truncation.truncatedChars;\n\t\t} else {\n\t\t\tconst truncation = truncateContentsByPages(response.text, CONTENTS_BODY_CHAR_BUDGET);\n\t\t\tif (truncation.truncated) {\n\t\t\t\tresultText = truncation.text;\n\t\t\t\textra.shownPages = truncation.shownPages;\n\t\t\t\textra.truncatedChars = truncation.truncatedChars;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst bounded = boundDeepWikiOutput(resultText, normalizedParams.action);\n\tif (bounded.truncated) {\n\t\tresultText = bounded.text;\n\t\textra.truncatedChars = Math.max(extra.truncatedChars ?? 0, bounded.truncatedChars);\n\t}\n\treturn buildResult(normalizedParams, resultText, extra);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/render.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,KAAK,SAAS,EAAqC,MAAM,wBAAwB,CAAC;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE/F,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAItF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/render.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,KAAK,SAAS,EAAqC,MAAM,wBAAwB,CAAC;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE/F,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAItF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA4HlD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,CAUhF;AASD,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,eAAe,CAAC,eAAe,CAAC,EACxC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,MAAM,GAChB,SAAS,CAwBX"}
|
|
@@ -46,11 +46,6 @@ function pageTitlesFromResult(text, details) {
|
|
|
46
46
|
if (titles.length)
|
|
47
47
|
return titles;
|
|
48
48
|
}
|
|
49
|
-
if (Array.isArray(details?.sectionTitles)) {
|
|
50
|
-
const titles = details.sectionTitles.filter((title) => typeof title === "string");
|
|
51
|
-
if (titles.length)
|
|
52
|
-
return titles;
|
|
53
|
-
}
|
|
54
49
|
const fromContent = extractContentPages(text);
|
|
55
50
|
if (fromContent.length)
|
|
56
51
|
return fromContent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/render.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * TUI rendering for the deepwiki tool (collapse / expand).\n *\n * Pi's fallback renderer dumps full `content` text and ignores `expanded`; this\n * extension returns large wiki payloads, so a private renderer stays local here.\n */\nimport { type Component, Container, Markdown, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolRenderResultOptions } from \"../../core/extensions/types.ts\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getMarkdownTheme, type Theme } from \"../../modes/interactive/theme/theme.ts\";\n\nimport { extractContentPages, extractStructureSections } from \"./client.ts\";\nimport { DEEPWIKI_LABEL } from \"./constants.ts\";\nimport type { DeepWikiDetails } from \"./execute.ts\";\nimport type { DeepWikiParams } from \"./schema.ts\";\n\nfunction truncateText(text: string, maxLength: number, options?: { word?: boolean }): string {\n\tif (text.length <= maxLength) return text;\n\tif (options?.word) {\n\t\tconst prefix = text.slice(0, maxLength - 3);\n\t\tconst lastSpace = prefix.lastIndexOf(\" \");\n\t\tif (lastSpace >= 40) return `${prefix.slice(0, lastSpace)}...`;\n\t}\n\treturn `${text.slice(0, maxLength - 3)}...`;\n}\n\nfunction singleLine(text: unknown): string {\n\treturn typeof text === \"string\" ? text.replace(/\\s+/g, \" \").trim() : \"\";\n}\n\nfunction firstText(result: AgentToolResult<DeepWikiDetails>): string {\n\tfor (const part of result.content ?? []) {\n\t\tif (part.type === \"text\" && typeof part.text === \"string\") return part.text;\n\t}\n\treturn \"\";\n}\n\nfunction firstContentLine(text: string): string {\n\treturn (\n\t\ttext\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => line.trim())\n\t\t\t.find((line) => line.length > 0) ?? \"DeepWiki response\"\n\t);\n}\n\nfunction formatPageList(pages: string[], maxItems = 4): string {\n\tconst shown = pages.slice(0, maxItems).map(singleLine).join(\", \");\n\treturn pages.length > maxItems ? `${shown}...` : shown;\n}\n\nfunction pageTitlesFromResult(text: string, details: DeepWikiDetails | undefined): string[] {\n\tif (Array.isArray(details?.pageTitles)) {\n\t\tconst titles = details.pageTitles.filter((title) => typeof title === \"string\");\n\t\tif (titles.length) return titles;\n\t}\n\tif (Array.isArray(details?.sectionTitles)) {\n\t\tconst titles = details.sectionTitles.filter((title) => typeof title === \"string\");\n\t\tif (titles.length) return titles;\n\t}\n\tconst fromContent = extractContentPages(text);\n\tif (fromContent.length) return fromContent;\n\treturn extractStructureSections(text);\n}\n\nfunction summarizeStructure(text: string, details: DeepWikiDetails | undefined): string {\n\tconst pages = pageTitlesFromResult(text, details);\n\tif (pages.length === 0) return truncateText(firstContentLine(text), 120);\n\tconst count = details?.pageCount ?? pages.length;\n\treturn `${count} pages · ${formatPageList(pages)}`;\n}\n\nfunction summarizeContents(text: string, details: DeepWikiDetails | undefined): string {\n\tif (typeof details?.requestedPage === \"string\" && details.requestedPage.trim()) {\n\t\tconst position =\n\t\t\tdetails.pageIndex !== undefined && details.pageCount ? `${details.pageIndex}/${details.pageCount} · ` : \"\";\n\t\tconst cut = details.truncatedChars ? \" (truncated)\" : \"\";\n\t\treturn `Page ${position}${singleLine(details.requestedPage)}${cut}`;\n\t}\n\tconst pages = pageTitlesFromResult(text, details);\n\tif (details?.shownPages !== undefined) {\n\t\tconst total = details.pageCount ?? pages.length;\n\t\tconst pagesPart = total > 0 ? `${details.shownPages}/${total} pages` : \"partial\";\n\t\treturn `Wiki · ${pagesPart} shown (truncated)`;\n\t}\n\tif (pages.length === 0) return \"Wiki loaded\";\n\treturn `Wiki · ${details?.pageCount ?? pages.length} pages`;\n}\n\nfunction stripDeepWikiTail(text: string): string {\n\tconst tailIndex = text.search(/\\n(?:#+\\s*)?(?:Wiki pages you might want to explore|View this search)/i);\n\tif (tailIndex < 0) return text;\n\treturn text.slice(0, tailIndex);\n}\n\nfunction summarizeQuestion(text: string): string {\n\tconst cleaned = stripDeepWikiTail(text)\n\t\t.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\")\n\t\t.replace(/[`*_]/g, \"\")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n\tif (!cleaned) return \"Answer ready\";\n\tconst sentenceMatch = cleaned.match(/^.{40,}?[.!?](?=\\s|$)/);\n\treturn truncateText(sentenceMatch?.[0] ?? cleaned, 140, { word: true });\n}\n\nfunction summarizeCollapsed(text: string, details: DeepWikiDetails | undefined): string {\n\tlet summary: string;\n\tif (details?.action === \"structure\") summary = summarizeStructure(text, details);\n\telse if (details?.action === \"contents\") summary = summarizeContents(text, details);\n\telse if (details?.action === \"question\") summary = summarizeQuestion(text);\n\telse summary = truncateText(firstContentLine(text), 120);\n\treturn truncateText(singleLine(summary), 180, { word: true });\n}\n\nfunction repoLabel(repoName: DeepWikiParams[\"repoName\"] | undefined): string {\n\tif (Array.isArray(repoName)) {\n\t\tif (repoName.length === 0) return \"repo\";\n\t\tif (repoName.length === 1) return repoName[0];\n\t\treturn `${repoName.length} repos: ${repoName.slice(0, 2).join(\", \")}${repoName.length > 2 ? \"...\" : \"\"}`;\n\t}\n\treturn repoName ?? \"repo\";\n}\n\n/** renderCall sees raw tool args; normalize JSON-array strings for display. */\nfunction repoLabelForCall(repoName: unknown): string {\n\tif (Array.isArray(repoName)) return repoLabel(repoName as DeepWikiParams[\"repoName\"]);\n\tif (typeof repoName === \"string\") {\n\t\tconst trimmed = repoName.trim();\n\t\tif (trimmed.startsWith(\"[\")) {\n\t\t\ttry {\n\t\t\t\tconst parsed: unknown = JSON.parse(trimmed);\n\t\t\t\tif (Array.isArray(parsed)) return repoLabel(parsed as string[]);\n\t\t\t} catch {\n\t\t\t\t/* fall through */\n\t\t\t}\n\t\t}\n\t\treturn repoLabel(repoName);\n\t}\n\treturn repoLabel(undefined);\n}\n\nexport function renderDeepWikiCall(args: DeepWikiParams, theme: Theme): Component {\n\tlet line = theme.fg(\"toolTitle\", theme.bold(`${DEEPWIKI_LABEL} `));\n\tline += theme.fg(\"muted\", args.action);\n\tline += ` ${theme.fg(\"accent\", repoLabelForCall(args.repoName))}`;\n\tif (args.action === \"question\" && args.question) {\n\t\tline += ` ${theme.fg(\"dim\", truncateText(singleLine(args.question), 64))}`;\n\t} else if (args.action === \"contents\" && args.page !== undefined) {\n\t\tline += ` ${theme.fg(\"dim\", truncateText(singleLine(String(args.page)), 40))}`;\n\t}\n\treturn new Text(line, 0, 0);\n}\n\nfunction markdownBlock(text: string): Component {\n\tconst container = new Container();\n\tcontainer.addChild(new Spacer(1));\n\tcontainer.addChild(new Markdown(text, 1, 0, getMarkdownTheme()));\n\treturn container;\n}\n\nexport function renderDeepWikiResult(\n\tresult: AgentToolResult<DeepWikiDetails>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tisError: boolean,\n\telapsedMs?: number,\n): Component {\n\tif (options.isPartial) {\n\t\tconst repo = typeof result.details?.repoName === \"string\" ? singleLine(result.details.repoName) : \"\";\n\t\tconst label = repo ? `Querying ${repo}...` : \"Querying...\";\n\t\t// Slow network calls earn a visible elapsed count; sub-2s stays quiet.\n\t\tconst suffix =\n\t\t\telapsedMs !== undefined && elapsedMs >= 2000 ? theme.fg(\"muted\", ` (${Math.round(elapsedMs / 1000)}s)`) : \"\";\n\t\treturn new Text(`${theme.fg(\"warning\", label)}${suffix}`, 0, 0);\n\t}\n\n\tconst text = firstText(result);\n\tconst errorMessage = typeof result.details?.errorMessage === \"string\" ? result.details.errorMessage : undefined;\n\tif (isError || errorMessage) {\n\t\tconst line = truncateText(errorMessage ?? firstContentLine(text), 200);\n\t\treturn new Text(theme.fg(\"error\", `failed · ${line}`), 0, 0);\n\t}\n\n\tif (!options.expanded) {\n\t\tconst summary = theme.fg(\"toolOutput\", summarizeCollapsed(text, result.details));\n\t\tconst hint = `${theme.fg(\"muted\", \" (\")}${keyHint(\"app.tools.expand\", \"to expand\")}${theme.fg(\"muted\", \")\")}`;\n\t\treturn new Text(`${summary}${hint}`, 0, 0);\n\t}\n\n\treturn markdownBlock(text);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/render.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * TUI rendering for the deepwiki tool (collapse / expand).\n *\n * Pi's fallback renderer dumps full `content` text and ignores `expanded`; this\n * extension returns large wiki payloads, so a private renderer stays local here.\n */\nimport { type Component, Container, Markdown, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolRenderResultOptions } from \"../../core/extensions/types.ts\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getMarkdownTheme, type Theme } from \"../../modes/interactive/theme/theme.ts\";\n\nimport { extractContentPages, extractStructureSections } from \"./client.ts\";\nimport { DEEPWIKI_LABEL } from \"./constants.ts\";\nimport type { DeepWikiDetails } from \"./execute.ts\";\nimport type { DeepWikiParams } from \"./schema.ts\";\n\nfunction truncateText(text: string, maxLength: number, options?: { word?: boolean }): string {\n\tif (text.length <= maxLength) return text;\n\tif (options?.word) {\n\t\tconst prefix = text.slice(0, maxLength - 3);\n\t\tconst lastSpace = prefix.lastIndexOf(\" \");\n\t\tif (lastSpace >= 40) return `${prefix.slice(0, lastSpace)}...`;\n\t}\n\treturn `${text.slice(0, maxLength - 3)}...`;\n}\n\nfunction singleLine(text: unknown): string {\n\treturn typeof text === \"string\" ? text.replace(/\\s+/g, \" \").trim() : \"\";\n}\n\nfunction firstText(result: AgentToolResult<DeepWikiDetails>): string {\n\tfor (const part of result.content ?? []) {\n\t\tif (part.type === \"text\" && typeof part.text === \"string\") return part.text;\n\t}\n\treturn \"\";\n}\n\nfunction firstContentLine(text: string): string {\n\treturn (\n\t\ttext\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => line.trim())\n\t\t\t.find((line) => line.length > 0) ?? \"DeepWiki response\"\n\t);\n}\n\nfunction formatPageList(pages: string[], maxItems = 4): string {\n\tconst shown = pages.slice(0, maxItems).map(singleLine).join(\", \");\n\treturn pages.length > maxItems ? `${shown}...` : shown;\n}\n\nfunction pageTitlesFromResult(text: string, details: DeepWikiDetails | undefined): string[] {\n\tif (Array.isArray(details?.pageTitles)) {\n\t\tconst titles = details.pageTitles.filter((title) => typeof title === \"string\");\n\t\tif (titles.length) return titles;\n\t}\n\tconst fromContent = extractContentPages(text);\n\tif (fromContent.length) return fromContent;\n\treturn extractStructureSections(text);\n}\n\nfunction summarizeStructure(text: string, details: DeepWikiDetails | undefined): string {\n\tconst pages = pageTitlesFromResult(text, details);\n\tif (pages.length === 0) return truncateText(firstContentLine(text), 120);\n\tconst count = details?.pageCount ?? pages.length;\n\treturn `${count} pages · ${formatPageList(pages)}`;\n}\n\nfunction summarizeContents(text: string, details: DeepWikiDetails | undefined): string {\n\tif (typeof details?.requestedPage === \"string\" && details.requestedPage.trim()) {\n\t\tconst position =\n\t\t\tdetails.pageIndex !== undefined && details.pageCount ? `${details.pageIndex}/${details.pageCount} · ` : \"\";\n\t\tconst cut = details.truncatedChars ? \" (truncated)\" : \"\";\n\t\treturn `Page ${position}${singleLine(details.requestedPage)}${cut}`;\n\t}\n\tconst pages = pageTitlesFromResult(text, details);\n\tif (details?.shownPages !== undefined) {\n\t\tconst total = details.pageCount ?? pages.length;\n\t\tconst pagesPart = total > 0 ? `${details.shownPages}/${total} pages` : \"partial\";\n\t\treturn `Wiki · ${pagesPart} shown (truncated)`;\n\t}\n\tif (pages.length === 0) return \"Wiki loaded\";\n\treturn `Wiki · ${details?.pageCount ?? pages.length} pages`;\n}\n\nfunction stripDeepWikiTail(text: string): string {\n\tconst tailIndex = text.search(/\\n(?:#+\\s*)?(?:Wiki pages you might want to explore|View this search)/i);\n\tif (tailIndex < 0) return text;\n\treturn text.slice(0, tailIndex);\n}\n\nfunction summarizeQuestion(text: string): string {\n\tconst cleaned = stripDeepWikiTail(text)\n\t\t.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\")\n\t\t.replace(/[`*_]/g, \"\")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n\tif (!cleaned) return \"Answer ready\";\n\tconst sentenceMatch = cleaned.match(/^.{40,}?[.!?](?=\\s|$)/);\n\treturn truncateText(sentenceMatch?.[0] ?? cleaned, 140, { word: true });\n}\n\nfunction summarizeCollapsed(text: string, details: DeepWikiDetails | undefined): string {\n\tlet summary: string;\n\tif (details?.action === \"structure\") summary = summarizeStructure(text, details);\n\telse if (details?.action === \"contents\") summary = summarizeContents(text, details);\n\telse if (details?.action === \"question\") summary = summarizeQuestion(text);\n\telse summary = truncateText(firstContentLine(text), 120);\n\treturn truncateText(singleLine(summary), 180, { word: true });\n}\n\nfunction repoLabel(repoName: DeepWikiParams[\"repoName\"] | undefined): string {\n\tif (Array.isArray(repoName)) {\n\t\tif (repoName.length === 0) return \"repo\";\n\t\tif (repoName.length === 1) return repoName[0];\n\t\treturn `${repoName.length} repos: ${repoName.slice(0, 2).join(\", \")}${repoName.length > 2 ? \"...\" : \"\"}`;\n\t}\n\treturn repoName ?? \"repo\";\n}\n\n/** renderCall sees raw tool args; normalize JSON-array strings for display. */\nfunction repoLabelForCall(repoName: unknown): string {\n\tif (Array.isArray(repoName)) return repoLabel(repoName as DeepWikiParams[\"repoName\"]);\n\tif (typeof repoName === \"string\") {\n\t\tconst trimmed = repoName.trim();\n\t\tif (trimmed.startsWith(\"[\")) {\n\t\t\ttry {\n\t\t\t\tconst parsed: unknown = JSON.parse(trimmed);\n\t\t\t\tif (Array.isArray(parsed)) return repoLabel(parsed as string[]);\n\t\t\t} catch {\n\t\t\t\t/* fall through */\n\t\t\t}\n\t\t}\n\t\treturn repoLabel(repoName);\n\t}\n\treturn repoLabel(undefined);\n}\n\nexport function renderDeepWikiCall(args: DeepWikiParams, theme: Theme): Component {\n\tlet line = theme.fg(\"toolTitle\", theme.bold(`${DEEPWIKI_LABEL} `));\n\tline += theme.fg(\"muted\", args.action);\n\tline += ` ${theme.fg(\"accent\", repoLabelForCall(args.repoName))}`;\n\tif (args.action === \"question\" && args.question) {\n\t\tline += ` ${theme.fg(\"dim\", truncateText(singleLine(args.question), 64))}`;\n\t} else if (args.action === \"contents\" && args.page !== undefined) {\n\t\tline += ` ${theme.fg(\"dim\", truncateText(singleLine(String(args.page)), 40))}`;\n\t}\n\treturn new Text(line, 0, 0);\n}\n\nfunction markdownBlock(text: string): Component {\n\tconst container = new Container();\n\tcontainer.addChild(new Spacer(1));\n\tcontainer.addChild(new Markdown(text, 1, 0, getMarkdownTheme()));\n\treturn container;\n}\n\nexport function renderDeepWikiResult(\n\tresult: AgentToolResult<DeepWikiDetails>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tisError: boolean,\n\telapsedMs?: number,\n): Component {\n\tif (options.isPartial) {\n\t\tconst repo = typeof result.details?.repoName === \"string\" ? singleLine(result.details.repoName) : \"\";\n\t\tconst label = repo ? `Querying ${repo}...` : \"Querying...\";\n\t\t// Slow network calls earn a visible elapsed count; sub-2s stays quiet.\n\t\tconst suffix =\n\t\t\telapsedMs !== undefined && elapsedMs >= 2000 ? theme.fg(\"muted\", ` (${Math.round(elapsedMs / 1000)}s)`) : \"\";\n\t\treturn new Text(`${theme.fg(\"warning\", label)}${suffix}`, 0, 0);\n\t}\n\n\tconst text = firstText(result);\n\tconst errorMessage = typeof result.details?.errorMessage === \"string\" ? result.details.errorMessage : undefined;\n\tif (isError || errorMessage) {\n\t\tconst line = truncateText(errorMessage ?? firstContentLine(text), 200);\n\t\treturn new Text(theme.fg(\"error\", `failed · ${line}`), 0, 0);\n\t}\n\n\tif (!options.expanded) {\n\t\tconst summary = theme.fg(\"toolOutput\", summarizeCollapsed(text, result.details));\n\t\tconst hint = `${theme.fg(\"muted\", \" (\")}${keyHint(\"app.tools.expand\", \"to expand\")}${theme.fg(\"muted\", \")\")}`;\n\t\treturn new Text(`${summary}${hint}`, 0, 0);\n\t}\n\n\treturn markdownBlock(text);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAIpE,KAAK,aAAa,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAE3C,KAAK,UAAU,GAAG;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAIpE,KAAK,aAAa,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAE3C,KAAK,UAAU,GAAG;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAiMF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAavF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAqBnH"}
|
|
@@ -152,12 +152,8 @@ function normalizeDetails(value) {
|
|
|
152
152
|
const message = oneLine(safeValue(raw, "message"), MAX_RENDERED_ERROR_CHARS);
|
|
153
153
|
return { answers, outcome, ...(message ? { message } : {}) };
|
|
154
154
|
}
|
|
155
|
-
function errorMessage(
|
|
156
|
-
|
|
157
|
-
return details.message;
|
|
158
|
-
const fallback = resultFallback(result).trim();
|
|
159
|
-
const match = /^Question tool error \([^)]*\):\s*([\s\S]+)$/u.exec(fallback);
|
|
160
|
-
return truncate(match?.[1]?.trim() || "The question tool could not continue", MAX_RENDERED_ERROR_CHARS);
|
|
155
|
+
function errorMessage(details) {
|
|
156
|
+
return details.message ?? "The question tool could not continue";
|
|
161
157
|
}
|
|
162
158
|
function answerLines(answers, theme) {
|
|
163
159
|
return answers.map((answer) => {
|
|
@@ -194,7 +190,7 @@ export function renderQuestionResult(result, options, theme, args) {
|
|
|
194
190
|
if (!details)
|
|
195
191
|
return renderFallbackResult(result, options.expanded, theme);
|
|
196
192
|
if (details.outcome === "error") {
|
|
197
|
-
return new Text(theme.fg("error", `Question error: ${errorMessage(
|
|
193
|
+
return new Text(theme.fg("error", `Question error: ${errorMessage(details)}`), 0, 0);
|
|
198
194
|
}
|
|
199
195
|
if (details.outcome === "cancelled") {
|
|
200
196
|
const title = theme.fg("warning", `Cancelled · ${answerProgress(details, args)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/extensions/question/render.ts"],"names":[],"mappings":"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","sourcesContent":["import { Text } from \"@earendil-works/pi-tui\";\nimport { keyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { QUESTION_LIMITS } from \"./limits.ts\";\nimport type { AnswerNote, QuestionOutcome } from \"./types.ts\";\n\ntype RenderOptions = { expanded: boolean };\n\ntype ResultLike = {\n\tcontent?: unknown;\n\tdetails?: unknown;\n};\n\ninterface RenderQuestion {\n\theader: string;\n\tquestion: string;\n\tmultiSelect: boolean;\n}\n\n/** The parts of a stored answer the transcript shows. */\ninterface AnswerLine {\n\theader: string;\n\ttext: string;\n\tnotes: AnswerNote[];\n}\n\ninterface RenderDetails {\n\tanswers: AnswerLine[];\n\toutcome: QuestionOutcome;\n\tmessage?: string;\n}\n\nconst MAX_RENDERED_QUESTIONS = 4;\nconst MAX_RENDERED_ANSWERS = 4;\nconst MAX_RENDERED_SELECTIONS = 5;\nconst MAX_RENDERED_ANSWER_CHARS = 400;\nconst MAX_RENDERED_NOTE_CHARS = 400;\nconst MAX_RENDERED_ERROR_CHARS = 400;\nconst MAX_RENDERED_VALIDATION_SUMMARY_CHARS = 240;\nconst MAX_RENDERED_FALLBACK_CHARS = 1_000;\n\nfunction safeRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction safeValue(record: Record<string, unknown>, key: string): unknown {\n\ttry {\n\t\treturn record[key];\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction truncate(text: string, limit: number): string {\n\treturn text.length > limit ? `${text.slice(0, Math.max(0, limit - 1))}…` : text;\n}\n\nfunction oneLine(value: unknown, limit: number): string {\n\treturn typeof value === \"string\" ? truncate(value.replace(/\\s+/gu, \" \").trim(), limit) : \"\";\n}\n\nfunction questionsFromArgs(args: unknown): RenderQuestion[] {\n\tconst record = safeRecord(args);\n\tif (!record) return [];\n\tconst rawQuestions = safeValue(record, \"questions\");\n\tif (!Array.isArray(rawQuestions)) return [];\n\tconst questions: RenderQuestion[] = [];\n\tfor (const rawQuestion of rawQuestions.slice(0, MAX_RENDERED_QUESTIONS)) {\n\t\tconst question = safeRecord(rawQuestion);\n\t\tif (!question) continue;\n\t\tconst rawHeader = safeValue(question, \"header\");\n\t\tif (typeof rawHeader !== \"string\") continue;\n\t\tconst header = oneLine(rawHeader, QUESTION_LIMITS.headerChars) || `Decision ${questions.length + 1}`;\n\t\tquestions.push({\n\t\t\theader,\n\t\t\tquestion: oneLine(safeValue(question, \"question\"), QUESTION_LIMITS.questionChars),\n\t\t\tmultiSelect: safeValue(question, \"multiSelect\") === true,\n\t\t});\n\t}\n\treturn questions;\n}\n\nfunction resultFallback(result: ResultLike): string {\n\tif (!Array.isArray(result.content)) return \"\";\n\tconst blocks: string[] = [];\n\tfor (const rawBlock of result.content.slice(0, 8)) {\n\t\tconst block = safeRecord(rawBlock);\n\t\tif (!block || safeValue(block, \"type\") !== \"text\") continue;\n\t\tconst text = safeValue(block, \"text\");\n\t\tif (typeof text === \"string\") blocks.push(text);\n\t}\n\treturn truncate(blocks.join(\"\\n\"), MAX_RENDERED_FALLBACK_CHARS);\n}\n\nfunction validationSummary(text: string): { summary: string; hiddenErrors: number } | undefined {\n\tconst match = /^Validation failed for tool\\s+\"question\":\\s*([\\s\\S]*?)(?:\\r?\\n\\s*\\r?\\nReceived arguments:|$)/u.exec(\n\t\ttext.trim(),\n\t);\n\tif (!match) return undefined;\n\tconst errors = match[1]\n\t\t.split(/\\r?\\n/u)\n\t\t.map((line) => line.trim().replace(/^-\\s*/u, \"\"))\n\t\t.filter(Boolean);\n\tconst firstError = oneLine(errors[0], MAX_RENDERED_VALIDATION_SUMMARY_CHARS) || \"schema validation failed\";\n\treturn {\n\t\tsummary: `Invalid arguments · ${firstError}`,\n\t\thiddenErrors: Math.max(0, errors.length - 1),\n\t};\n}\n\nfunction renderFallbackResult(result: ResultLike, expanded: boolean, theme: Theme): Text {\n\tconst fallback = resultFallback(result);\n\tif (!fallback) return new Text(\"Question result unavailable\", 0, 0);\n\tconst validation = validationSummary(fallback);\n\tif (!validation || expanded) return new Text(fallback, 0, 0);\n\n\tconst moreErrors = validation.hiddenErrors > 0 ? ` · +${validation.hiddenErrors} more` : \"\";\n\tconst expandKey = keyLabel(\"app.tools.expand\");\n\tconst hint = theme.fg(\"muted\", expandKey ? ` (${expandKey} to expand)` : \" (more details available)\");\n\treturn new Text(`${theme.fg(\"error\", validation.summary)}${theme.fg(\"muted\", moreErrors)}${hint}`, 0, 0);\n}\n\nfunction normalizeAnswer(value: unknown, index: number): AnswerLine | undefined {\n\tconst raw = safeRecord(value);\n\tif (!raw) return undefined;\n\tconst rawHeader = safeValue(raw, \"header\");\n\tif (typeof rawHeader !== \"string\") return undefined;\n\tconst header = oneLine(rawHeader, QUESTION_LIMITS.headerChars) || `Decision ${index + 1}`;\n\n\tlet text: string;\n\tif (safeValue(raw, \"kind\") === \"multi\") {\n\t\tconst rawSelected = safeValue(raw, \"selected\");\n\t\ttext = Array.isArray(rawSelected)\n\t\t\t? rawSelected\n\t\t\t\t\t.slice(0, MAX_RENDERED_SELECTIONS)\n\t\t\t\t\t.map((entry, selectedIndex) => {\n\t\t\t\t\t\tif (typeof entry !== \"string\") return \"\";\n\t\t\t\t\t\treturn oneLine(entry, MAX_RENDERED_ANSWER_CHARS) || `Option ${selectedIndex + 1}`;\n\t\t\t\t\t})\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join(\", \")\n\t\t\t: \"\";\n\t} else {\n\t\ttext = oneLine(safeValue(raw, \"answer\"), MAX_RENDERED_ANSWER_CHARS);\n\t}\n\n\tconst rawNotes = safeValue(raw, \"notes\");\n\tconst notes = Array.isArray(rawNotes)\n\t\t? rawNotes\n\t\t\t\t.slice(0, MAX_RENDERED_ANSWERS)\n\t\t\t\t.map((entry) => {\n\t\t\t\t\tconst note = safeRecord(entry);\n\t\t\t\t\tif (!note) return undefined;\n\t\t\t\t\tconst option = oneLine(safeValue(note, \"option\"), QUESTION_LIMITS.optionLabelChars);\n\t\t\t\t\tconst text = oneLine(safeValue(note, \"text\"), MAX_RENDERED_NOTE_CHARS);\n\t\t\t\t\treturn option && text ? { option, text } : undefined;\n\t\t\t\t})\n\t\t\t\t.filter((note): note is AnswerNote => note !== undefined)\n\t\t: [];\n\n\treturn { header, text: text || \"(no input)\", notes };\n}\n\nfunction normalizeDetails(value: unknown): RenderDetails | undefined {\n\tconst raw = safeRecord(value);\n\tif (!raw) return undefined;\n\tconst outcome = safeValue(raw, \"outcome\");\n\tif (outcome !== \"answered\" && outcome !== \"cancelled\" && outcome !== \"needs_clarification\" && outcome !== \"error\") {\n\t\treturn undefined;\n\t}\n\tconst rawAnswers = safeValue(raw, \"answers\");\n\tconst answers = Array.isArray(rawAnswers)\n\t\t? rawAnswers\n\t\t\t\t.slice(0, MAX_RENDERED_ANSWERS)\n\t\t\t\t.map((answer, index) => normalizeAnswer(answer, index))\n\t\t\t\t.filter((answer): answer is AnswerLine => answer !== undefined)\n\t\t: [];\n\tconst message = oneLine(safeValue(raw, \"message\"), MAX_RENDERED_ERROR_CHARS);\n\treturn { answers, outcome, ...(message ? { message } : {}) };\n}\n\nfunction errorMessage(result: ResultLike, details: RenderDetails): string {\n\tif (details.message) return details.message;\n\tconst fallback = resultFallback(result).trim();\n\tconst match = /^Question tool error \\([^)]*\\):\\s*([\\s\\S]+)$/u.exec(fallback);\n\treturn truncate(match?.[1]?.trim() || \"The question tool could not continue\", MAX_RENDERED_ERROR_CHARS);\n}\n\nfunction answerLines(answers: AnswerLine[], theme: Theme): string[] {\n\treturn answers.map((answer) => {\n\t\tconst notes = answer.notes.map((note) => `\\n${theme.fg(\"muted\", ` Note for ${note.option}: ${note.text}`)}`);\n\t\treturn `${theme.fg(\"accent\", answer.header)}: ${theme.fg(\"text\", answer.text)}${notes.join(\"\")}`;\n\t});\n}\n\nfunction renderOutcome(title: string, details: RenderDetails, expanded: boolean, theme: Theme): Text {\n\tif (!expanded || details.answers.length === 0) return new Text(title, 0, 0);\n\treturn new Text(`${title}\\n${answerLines(details.answers, theme).join(\"\\n\")}`, 0, 0);\n}\n\nfunction answerProgress(details: RenderDetails, args: unknown): string {\n\tconst total = questionsFromArgs(args).length;\n\treturn total > 0 ? `answered ${details.answers.length} of ${total}` : `answered ${details.answers.length}`;\n}\n\nexport function renderQuestionCall(args: unknown, theme: Theme, expanded: boolean): Text {\n\tconst questions = questionsFromArgs(args);\n\tconst headers = questions.map((question) => question.header).join(\", \");\n\tconst count = `${questions.length} decision${questions.length === 1 ? \"\" : \"s\"}`;\n\tconst summary = questions.length === 0 ? \"asking for a decision\" : headers ? `${count}: ${headers}` : count;\n\tconst title = `${theme.fg(\"toolTitle\", theme.bold(\"question\"))} ${theme.fg(\"muted\", summary)}`;\n\tif (!expanded || questions.length === 0) return new Text(title, 0, 0);\n\tconst detailLines = questions.map((question) => {\n\t\tconst multi = question.multiSelect ? \" (multi-select)\" : \"\";\n\t\tconst body = question.question ? `: ${question.question}` : \"\";\n\t\treturn theme.fg(\"dim\", `${question.header}${multi}${body}`);\n\t});\n\treturn new Text(`${title}\\n${detailLines.join(\"\\n\")}`, 0, 0);\n}\n\nexport function renderQuestionResult(result: ResultLike, options: RenderOptions, theme: Theme, args?: unknown): Text {\n\tconst details = normalizeDetails(result.details);\n\tif (!details) return renderFallbackResult(result, options.expanded, theme);\n\n\tif (details.outcome === \"error\") {\n\t\treturn new Text(theme.fg(\"error\", `Question error: ${errorMessage(result, details)}`), 0, 0);\n\t}\n\tif (details.outcome === \"cancelled\") {\n\t\tconst title = theme.fg(\"warning\", `Cancelled · ${answerProgress(details, args)}`);\n\t\treturn renderOutcome(title, details, options.expanded, theme);\n\t}\n\tif (details.outcome === \"needs_clarification\") {\n\t\tconst title = theme.fg(\"warning\", `Wants to discuss · ${answerProgress(details, args)}`);\n\t\treturn renderOutcome(title, details, options.expanded, theme);\n\t}\n\n\tconst title = theme.fg(\n\t\t\"success\",\n\t\t`✓ Answered ${details.answers.length} decision${details.answers.length === 1 ? \"\" : \"s\"}`,\n\t);\n\treturn renderOutcome(title, details, options.expanded, theme);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/extensions/question/render.ts"],"names":[],"mappings":"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","sourcesContent":["import { Text } from \"@earendil-works/pi-tui\";\nimport { keyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { QUESTION_LIMITS } from \"./limits.ts\";\nimport type { AnswerNote, QuestionOutcome } from \"./types.ts\";\n\ntype RenderOptions = { expanded: boolean };\n\ntype ResultLike = {\n\tcontent?: unknown;\n\tdetails?: unknown;\n};\n\ninterface RenderQuestion {\n\theader: string;\n\tquestion: string;\n\tmultiSelect: boolean;\n}\n\n/** The parts of a stored answer the transcript shows. */\ninterface AnswerLine {\n\theader: string;\n\ttext: string;\n\tnotes: AnswerNote[];\n}\n\ninterface RenderDetails {\n\tanswers: AnswerLine[];\n\toutcome: QuestionOutcome;\n\tmessage?: string;\n}\n\nconst MAX_RENDERED_QUESTIONS = 4;\nconst MAX_RENDERED_ANSWERS = 4;\nconst MAX_RENDERED_SELECTIONS = 5;\nconst MAX_RENDERED_ANSWER_CHARS = 400;\nconst MAX_RENDERED_NOTE_CHARS = 400;\nconst MAX_RENDERED_ERROR_CHARS = 400;\nconst MAX_RENDERED_VALIDATION_SUMMARY_CHARS = 240;\nconst MAX_RENDERED_FALLBACK_CHARS = 1_000;\n\nfunction safeRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction safeValue(record: Record<string, unknown>, key: string): unknown {\n\ttry {\n\t\treturn record[key];\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction truncate(text: string, limit: number): string {\n\treturn text.length > limit ? `${text.slice(0, Math.max(0, limit - 1))}…` : text;\n}\n\nfunction oneLine(value: unknown, limit: number): string {\n\treturn typeof value === \"string\" ? truncate(value.replace(/\\s+/gu, \" \").trim(), limit) : \"\";\n}\n\nfunction questionsFromArgs(args: unknown): RenderQuestion[] {\n\tconst record = safeRecord(args);\n\tif (!record) return [];\n\tconst rawQuestions = safeValue(record, \"questions\");\n\tif (!Array.isArray(rawQuestions)) return [];\n\tconst questions: RenderQuestion[] = [];\n\tfor (const rawQuestion of rawQuestions.slice(0, MAX_RENDERED_QUESTIONS)) {\n\t\tconst question = safeRecord(rawQuestion);\n\t\tif (!question) continue;\n\t\tconst rawHeader = safeValue(question, \"header\");\n\t\tif (typeof rawHeader !== \"string\") continue;\n\t\tconst header = oneLine(rawHeader, QUESTION_LIMITS.headerChars) || `Decision ${questions.length + 1}`;\n\t\tquestions.push({\n\t\t\theader,\n\t\t\tquestion: oneLine(safeValue(question, \"question\"), QUESTION_LIMITS.questionChars),\n\t\t\tmultiSelect: safeValue(question, \"multiSelect\") === true,\n\t\t});\n\t}\n\treturn questions;\n}\n\nfunction resultFallback(result: ResultLike): string {\n\tif (!Array.isArray(result.content)) return \"\";\n\tconst blocks: string[] = [];\n\tfor (const rawBlock of result.content.slice(0, 8)) {\n\t\tconst block = safeRecord(rawBlock);\n\t\tif (!block || safeValue(block, \"type\") !== \"text\") continue;\n\t\tconst text = safeValue(block, \"text\");\n\t\tif (typeof text === \"string\") blocks.push(text);\n\t}\n\treturn truncate(blocks.join(\"\\n\"), MAX_RENDERED_FALLBACK_CHARS);\n}\n\nfunction validationSummary(text: string): { summary: string; hiddenErrors: number } | undefined {\n\tconst match = /^Validation failed for tool\\s+\"question\":\\s*([\\s\\S]*?)(?:\\r?\\n\\s*\\r?\\nReceived arguments:|$)/u.exec(\n\t\ttext.trim(),\n\t);\n\tif (!match) return undefined;\n\tconst errors = match[1]\n\t\t.split(/\\r?\\n/u)\n\t\t.map((line) => line.trim().replace(/^-\\s*/u, \"\"))\n\t\t.filter(Boolean);\n\tconst firstError = oneLine(errors[0], MAX_RENDERED_VALIDATION_SUMMARY_CHARS) || \"schema validation failed\";\n\treturn {\n\t\tsummary: `Invalid arguments · ${firstError}`,\n\t\thiddenErrors: Math.max(0, errors.length - 1),\n\t};\n}\n\nfunction renderFallbackResult(result: ResultLike, expanded: boolean, theme: Theme): Text {\n\tconst fallback = resultFallback(result);\n\tif (!fallback) return new Text(\"Question result unavailable\", 0, 0);\n\tconst validation = validationSummary(fallback);\n\tif (!validation || expanded) return new Text(fallback, 0, 0);\n\n\tconst moreErrors = validation.hiddenErrors > 0 ? ` · +${validation.hiddenErrors} more` : \"\";\n\tconst expandKey = keyLabel(\"app.tools.expand\");\n\tconst hint = theme.fg(\"muted\", expandKey ? ` (${expandKey} to expand)` : \" (more details available)\");\n\treturn new Text(`${theme.fg(\"error\", validation.summary)}${theme.fg(\"muted\", moreErrors)}${hint}`, 0, 0);\n}\n\nfunction normalizeAnswer(value: unknown, index: number): AnswerLine | undefined {\n\tconst raw = safeRecord(value);\n\tif (!raw) return undefined;\n\tconst rawHeader = safeValue(raw, \"header\");\n\tif (typeof rawHeader !== \"string\") return undefined;\n\tconst header = oneLine(rawHeader, QUESTION_LIMITS.headerChars) || `Decision ${index + 1}`;\n\n\tlet text: string;\n\tif (safeValue(raw, \"kind\") === \"multi\") {\n\t\tconst rawSelected = safeValue(raw, \"selected\");\n\t\ttext = Array.isArray(rawSelected)\n\t\t\t? rawSelected\n\t\t\t\t\t.slice(0, MAX_RENDERED_SELECTIONS)\n\t\t\t\t\t.map((entry, selectedIndex) => {\n\t\t\t\t\t\tif (typeof entry !== \"string\") return \"\";\n\t\t\t\t\t\treturn oneLine(entry, MAX_RENDERED_ANSWER_CHARS) || `Option ${selectedIndex + 1}`;\n\t\t\t\t\t})\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join(\", \")\n\t\t\t: \"\";\n\t} else {\n\t\ttext = oneLine(safeValue(raw, \"answer\"), MAX_RENDERED_ANSWER_CHARS);\n\t}\n\n\tconst rawNotes = safeValue(raw, \"notes\");\n\tconst notes = Array.isArray(rawNotes)\n\t\t? rawNotes\n\t\t\t\t.slice(0, MAX_RENDERED_ANSWERS)\n\t\t\t\t.map((entry) => {\n\t\t\t\t\tconst note = safeRecord(entry);\n\t\t\t\t\tif (!note) return undefined;\n\t\t\t\t\tconst option = oneLine(safeValue(note, \"option\"), QUESTION_LIMITS.optionLabelChars);\n\t\t\t\t\tconst text = oneLine(safeValue(note, \"text\"), MAX_RENDERED_NOTE_CHARS);\n\t\t\t\t\treturn option && text ? { option, text } : undefined;\n\t\t\t\t})\n\t\t\t\t.filter((note): note is AnswerNote => note !== undefined)\n\t\t: [];\n\n\treturn { header, text: text || \"(no input)\", notes };\n}\n\nfunction normalizeDetails(value: unknown): RenderDetails | undefined {\n\tconst raw = safeRecord(value);\n\tif (!raw) return undefined;\n\tconst outcome = safeValue(raw, \"outcome\");\n\tif (outcome !== \"answered\" && outcome !== \"cancelled\" && outcome !== \"needs_clarification\" && outcome !== \"error\") {\n\t\treturn undefined;\n\t}\n\tconst rawAnswers = safeValue(raw, \"answers\");\n\tconst answers = Array.isArray(rawAnswers)\n\t\t? rawAnswers\n\t\t\t\t.slice(0, MAX_RENDERED_ANSWERS)\n\t\t\t\t.map((answer, index) => normalizeAnswer(answer, index))\n\t\t\t\t.filter((answer): answer is AnswerLine => answer !== undefined)\n\t\t: [];\n\tconst message = oneLine(safeValue(raw, \"message\"), MAX_RENDERED_ERROR_CHARS);\n\treturn { answers, outcome, ...(message ? { message } : {}) };\n}\n\nfunction errorMessage(details: RenderDetails): string {\n\treturn details.message ?? \"The question tool could not continue\";\n}\n\nfunction answerLines(answers: AnswerLine[], theme: Theme): string[] {\n\treturn answers.map((answer) => {\n\t\tconst notes = answer.notes.map((note) => `\\n${theme.fg(\"muted\", ` Note for ${note.option}: ${note.text}`)}`);\n\t\treturn `${theme.fg(\"accent\", answer.header)}: ${theme.fg(\"text\", answer.text)}${notes.join(\"\")}`;\n\t});\n}\n\nfunction renderOutcome(title: string, details: RenderDetails, expanded: boolean, theme: Theme): Text {\n\tif (!expanded || details.answers.length === 0) return new Text(title, 0, 0);\n\treturn new Text(`${title}\\n${answerLines(details.answers, theme).join(\"\\n\")}`, 0, 0);\n}\n\nfunction answerProgress(details: RenderDetails, args: unknown): string {\n\tconst total = questionsFromArgs(args).length;\n\treturn total > 0 ? `answered ${details.answers.length} of ${total}` : `answered ${details.answers.length}`;\n}\n\nexport function renderQuestionCall(args: unknown, theme: Theme, expanded: boolean): Text {\n\tconst questions = questionsFromArgs(args);\n\tconst headers = questions.map((question) => question.header).join(\", \");\n\tconst count = `${questions.length} decision${questions.length === 1 ? \"\" : \"s\"}`;\n\tconst summary = questions.length === 0 ? \"asking for a decision\" : headers ? `${count}: ${headers}` : count;\n\tconst title = `${theme.fg(\"toolTitle\", theme.bold(\"question\"))} ${theme.fg(\"muted\", summary)}`;\n\tif (!expanded || questions.length === 0) return new Text(title, 0, 0);\n\tconst detailLines = questions.map((question) => {\n\t\tconst multi = question.multiSelect ? \" (multi-select)\" : \"\";\n\t\tconst body = question.question ? `: ${question.question}` : \"\";\n\t\treturn theme.fg(\"dim\", `${question.header}${multi}${body}`);\n\t});\n\treturn new Text(`${title}\\n${detailLines.join(\"\\n\")}`, 0, 0);\n}\n\nexport function renderQuestionResult(result: ResultLike, options: RenderOptions, theme: Theme, args?: unknown): Text {\n\tconst details = normalizeDetails(result.details);\n\tif (!details) return renderFallbackResult(result, options.expanded, theme);\n\n\tif (details.outcome === \"error\") {\n\t\treturn new Text(theme.fg(\"error\", `Question error: ${errorMessage(details)}`), 0, 0);\n\t}\n\tif (details.outcome === \"cancelled\") {\n\t\tconst title = theme.fg(\"warning\", `Cancelled · ${answerProgress(details, args)}`);\n\t\treturn renderOutcome(title, details, options.expanded, theme);\n\t}\n\tif (details.outcome === \"needs_clarification\") {\n\t\tconst title = theme.fg(\"warning\", `Wants to discuss · ${answerProgress(details, args)}`);\n\t\treturn renderOutcome(title, details, options.expanded, theme);\n\t}\n\n\tconst title = theme.fg(\n\t\t\"success\",\n\t\t`✓ Answered ${details.answers.length} decision${details.answers.length === 1 ? \"\" : \"s\"}`,\n\t);\n\treturn renderOutcome(title, details, options.expanded, theme);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode.ts"],"names":[],"mappings":"AAaA,OAAO,EAEN,KAAK,YAAY,EAKjB,MAAM,8BAA8B,CAAC;AActC,OAAO,EAYN,KAAK,QAAQ,EASb,MAAM,wBAAwB,CAAC;AAgBhC,OAAO,EAAE,KAAK,mBAAmB,EAAkC,MAAM,qCAAqC,CAAC;AAC/G,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AAuC1F,OAAO,EAEN,cAAc,EAGd,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAmBpF,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAwE1F,OAAO,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"interactive-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ import { findExtensionStackMatches, recordCrash, takeUnnotifiedCrash } from "../
|
|
|
22
22
|
import { DEFAULT_THINKING_LEVEL, THINKING_LEVEL_OPTIONS } from "../../core/defaults.js";
|
|
23
23
|
import { FooterDataProvider } from "../../core/footer-data-provider.js";
|
|
24
24
|
import { configureHttpDispatcher, formatHttpIdleTimeoutMs } from "../../core/http-dispatcher.js";
|
|
25
|
-
import { KeybindingsManager } from "../../core/keybindings.js";
|
|
25
|
+
import { KEYBINDINGS, KeybindingsManager } from "../../core/keybindings.js";
|
|
26
26
|
import { createCompactionSummaryMessage, createCustomMessage } from "../../core/messages.js";
|
|
27
27
|
import { defaultModelPerProvider, findExactModelReferenceMatch, resolveModelScopeFromModels, } from "../../core/model-resolver.js";
|
|
28
28
|
import { CredentialSynchronizationError } from "../../core/model-runtime.js";
|
|
@@ -131,6 +131,22 @@ function isCompactionCostNotice(item) {
|
|
|
131
131
|
function isUsageSessionEntry(item) {
|
|
132
132
|
return "type" in item && item.type === "usage";
|
|
133
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* Task rows for `/hotkeys`. Task keybindings act outside the editor, so they never showed up in
|
|
136
|
+
* the editor-driven sections; labels come from KEYBINDINGS so the table cannot drift from the
|
|
137
|
+
* binding registry.
|
|
138
|
+
*/
|
|
139
|
+
function hotkeysTaskSection(display) {
|
|
140
|
+
const detach = KEYBINDINGS["app.tasks.detach"];
|
|
141
|
+
const detachSelected = KEYBINDINGS["app.tasks.detachSelected"];
|
|
142
|
+
return `
|
|
143
|
+
**Tasks**
|
|
144
|
+
| Key | Action |
|
|
145
|
+
|-----|--------|
|
|
146
|
+
| \`${display("app.tasks.detach")}\` | ${detach.description} |
|
|
147
|
+
| \`${display("app.tasks.detachSelected")}\` | ${detachSelected.description} (while /tasks is open) |
|
|
148
|
+
`;
|
|
149
|
+
}
|
|
134
150
|
const DEAD_TERMINAL_ERROR_CODES = new Set(["EIO", "EPIPE", "ENOTCONN"]);
|
|
135
151
|
function isDeadTerminalError(error) {
|
|
136
152
|
if (!error || typeof error !== "object" || !("code" in error)) {
|
|
@@ -5710,6 +5726,8 @@ export class InteractiveMode {
|
|
|
5710
5726
|
| \`!\` | Run bash command |
|
|
5711
5727
|
| \`!!\` | Run bash command (excluded from context) |
|
|
5712
5728
|
`;
|
|
5729
|
+
// Task keybindings act outside the editor contexts this table was built from.
|
|
5730
|
+
hotkeys += hotkeysTaskSection((action) => this.getAppKeyDisplay(action));
|
|
5713
5731
|
// Add extension-registered shortcuts
|
|
5714
5732
|
const extensionRunner = this.session.extensionRunner;
|
|
5715
5733
|
const shortcuts = extensionRunner.getShortcuts(this.keybindings.getEffectiveConfig());
|