@opengsd/gsd-pi 1.4.0-dev.5fc22c6f → 1.4.0-dev.c18009cd
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/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +58 -4
- package/dist/resources/extensions/gsd/artifact-verification.js +17 -5
- package/dist/resources/extensions/gsd/auto/closeout.js +45 -42
- package/dist/resources/extensions/gsd/auto/finalize.js +9 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +1 -1
- package/dist/resources/extensions/gsd/auto/run-unit.js +5 -2
- package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +3 -0
- package/dist/resources/extensions/gsd/auto.js +10 -3
- package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +58 -9
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +174 -16
- package/dist/resources/extensions/gsd/gsd-db.js +52 -0
- package/dist/resources/extensions/gsd/migrate-external.js +13 -4
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +3 -3
- package/dist/resources/extensions/gsd/repo-identity.js +16 -0
- package/dist/resources/extensions/gsd/root-write-leak-guard.js +4 -2
- package/dist/resources/extensions/gsd/unit-registry.js +27 -2
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +67 -5
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/integrations/hermes/CONTEXT.md +47 -0
- package/integrations/hermes/README.md +21 -0
- package/integrations/hermes/docs/issue-1162-grilling.md +197 -0
- package/integrations/hermes/docs/setup.md +4 -0
- package/integrations/hermes/open_gsd_hermes/commands.py +141 -0
- package/integrations/hermes/open_gsd_hermes/config.py +2 -0
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +594 -31
- package/integrations/hermes/open_gsd_hermes/notifications.py +10 -1
- package/integrations/hermes/plugin.yaml +4 -0
- package/integrations/hermes/tests/test_config.py +6 -0
- package/integrations/hermes/tests/test_gsd_client_cache.py +3 -0
- package/integrations/hermes/tests/test_gsd_client_execute.py +35 -0
- package/integrations/hermes/tests/test_gsd_client_process_cwd.py +22 -0
- package/integrations/hermes/tests/test_gsd_client_timeout.py +98 -0
- package/integrations/hermes/tests/test_milestone_client.py +447 -0
- package/integrations/hermes/tests/test_new_milestone_command.py +313 -0
- package/integrations/hermes/tests/test_supervisor_fsm.py +40 -0
- package/package.json +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/session-manager.js +1 -1
- package/packages/daemon/dist/session-manager.js.map +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.js +4 -1
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/server.d.ts +18 -5
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +46 -5
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +1 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +3 -0
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +64 -3
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +212 -39
- package/src/resources/extensions/gsd/artifact-verification.ts +16 -4
- package/src/resources/extensions/gsd/auto/closeout.ts +54 -56
- package/src/resources/extensions/gsd/auto/finalize.ts +8 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +1 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +5 -2
- package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +8 -0
- package/src/resources/extensions/gsd/auto.ts +9 -3
- package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +80 -12
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +230 -21
- package/src/resources/extensions/gsd/gsd-db.ts +72 -0
- package/src/resources/extensions/gsd/migrate-external.ts +14 -4
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +4 -4
- package/src/resources/extensions/gsd/repo-identity.ts +17 -0
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +3 -2
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +131 -5
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +335 -0
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +152 -22
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +50 -6
- package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +31 -9
- package/src/resources/extensions/gsd/tests/schedule-wakeup-tool.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
- package/src/resources/extensions/gsd/unit-registry.ts +34 -2
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +135 -11
- /package/dist/web/standalone/.next/static/{kIEFsCryyGy6RzifULbJl → L2UMqXELiDH3oz-7yguXp}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{kIEFsCryyGy6RzifULbJl → L2UMqXELiDH3oz-7yguXp}/_ssgManifest.js +0 -0
|
@@ -43,7 +43,10 @@ export class AgentSessionNavigationModule {
|
|
|
43
43
|
this.host.agent.reset();
|
|
44
44
|
const previousCwd = this.host._cwd;
|
|
45
45
|
this.host._cwd = options?.workspaceRoot ?? process.cwd();
|
|
46
|
-
this.host.sessionManager.newSession({
|
|
46
|
+
this.host.sessionManager.newSession({
|
|
47
|
+
cwd: this.host._cwd,
|
|
48
|
+
parentSession: options?.parentSession,
|
|
49
|
+
});
|
|
47
50
|
this.host.agent.sessionId = this.host.sessionManager.getSessionId();
|
|
48
51
|
this.host._steeringMessages = [];
|
|
49
52
|
this.host._followUpMessages = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-navigation.js","sourceRoot":"","sources":["../../src/session/agent-session-navigation.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { ThinkingLevel } from \"@gsd/pi-agent-core\";\nimport type { AssistantMessage } from \"@gsd/pi-ai\";\nimport { resolvePath } from \"@gsd/pi-coding-agent/utils/paths.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"@gsd/pi-coding-agent/core/defaults.js\";\nimport type { ContextUsage } from \"@gsd/pi-coding-agent/core/extensions/index.js\";\nimport type {\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeResult,\n\tTreePreparation,\n} from \"@gsd/pi-coding-agent/core/extensions/index.js\";\nimport type { BranchSummaryEntry, SessionManager } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport { CURRENT_SESSION_VERSION, getLatestCompactionEntry, type SessionHeader } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport {\n\tcalculateContextTokens,\n\tcollectEntriesForBranchSummary,\n\testimateContextTokens,\n\tgenerateBranchSummary,\n} from \"../compaction/index.js\";\nimport { exportSessionToHtml, type ToolHtmlRenderer } from \"../export-html/index.js\";\nimport { createToolHtmlRenderer } from \"../export-html/tool-renderer.js\";\nimport type { SessionStats } from \"./agent-session-types.js\";\nimport type { AgentSessionHost } from \"./agent-session-host.js\";\n\nexport class AgentSessionNavigationModule {\n\tconstructor(readonly host: AgentSessionHost) {}\n\n\tsetSessionName(name: string): void {\n\t\tthis.host.sessionManager.appendSessionInfo(name);\n\t\tthis.host.emit({ type: \"session_info_changed\", name: this.host.sessionManager.getSessionName() });\n\t}\n\n\tasync settleCurrentTurnForSessionTransition(): Promise<void> {\n\t\tif (!this.host.agent.state.isStreaming) {\n\t\t\tthis.host.abortRetry();\n\t\t\tawait this.host.agent.waitForIdle();\n\t\t\treturn;\n\t\t}\n\t\tawait this.host.abort();\n\t}\n\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\tworkspaceRoot?: string;\n\t\tabortSignal?: AbortSignal;\n\t}): Promise<boolean> {\n\t\tconst previousSessionFile = this.host.sessionFile;\n\n\t\tif (this.host._extensionRunner?.hasHandlers(\"session_before_switch\")) {\n\t\t\tconst result = (await this.host._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_switch\",\n\t\t\t\treason: \"new\",\n\t\t\t})) as SessionBeforeSwitchResult | undefined;\n\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tawait this.settleCurrentTurnForSessionTransition();\n\n\t\tif (options?.abortSignal?.aborted) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.host.disconnectFromAgent();\n\t\tthis.host.agent.reset();\n\n\t\tconst previousCwd = this.host._cwd;\n\t\tthis.host._cwd = options?.workspaceRoot ?? process.cwd();\n\n\t\tthis.host.sessionManager.newSession({ parentSession: options?.parentSession });\n\t\tthis.host.agent.sessionId = this.host.sessionManager.getSessionId();\n\t\tthis.host._steeringMessages = [];\n\t\tthis.host._followUpMessages = [];\n\t\tthis.host._pendingNextTurnMessages = [];\n\n\t\tthis.host.sessionManager.appendThinkingLevelChange(this.host.thinkingLevel);\n\n\t\tif (this.host._cwd !== previousCwd) {\n\t\t\tthis.host.buildRuntime({\n\t\t\t\tactiveToolNames: this.host.getActiveToolNames(),\n\t\t\t\tincludeAllExtensionTools: true,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.host.refreshToolRegistry({\n\t\t\t\tactiveToolNames: this.host.getActiveToolNames(),\n\t\t\t\tincludeAllExtensionTools: true,\n\t\t\t});\n\t\t}\n\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.host.sessionManager);\n\t\t\tconst sessionContext = this.host.sessionManager.buildSessionContext();\n\t\t\tthis.host.agent.state.messages = sessionContext.messages;\n\t\t}\n\n\t\tthis.host.reconnectToAgent();\n\n\t\tif (this.host._extensionRunner) {\n\t\t\tawait this.host.emitSessionStartWithLegacySwitch({\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"new\",\n\t\t\t\tpreviousSessionFile,\n\t\t\t});\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tasync switchSession(sessionPath: string): Promise<boolean> {\n\t\tconst previousSessionFile = this.host.sessionManager.getSessionFile();\n\n\t\tif (this.host._extensionRunner?.hasHandlers(\"session_before_switch\")) {\n\t\t\tconst result = (await this.host._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_switch\",\n\t\t\t\treason: \"resume\",\n\t\t\t\ttargetSessionFile: sessionPath,\n\t\t\t})) as SessionBeforeSwitchResult | undefined;\n\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tawait this.settleCurrentTurnForSessionTransition();\n\t\tthis.host.disconnectFromAgent();\n\n\t\tthis.host._steeringMessages = [];\n\t\tthis.host._followUpMessages = [];\n\t\tthis.host._pendingNextTurnMessages = [];\n\n\t\tthis.host.sessionManager.setSessionFile(sessionPath);\n\t\tthis.host.agent.sessionId = this.host.sessionManager.getSessionId();\n\n\t\tconst sessionContext = this.host.sessionManager.buildSessionContext();\n\t\tthis.host.agent.state.messages = sessionContext.messages;\n\n\t\tif (sessionContext.model) {\n\t\t\tconst previousModel = this.host.model;\n\t\t\tconst availableModels = await this.host.modelRegistry.getAvailable();\n\t\t\tconst match = availableModels.find(\n\t\t\t\t(m) => m.provider === sessionContext.model!.provider && m.id === sessionContext.model!.modelId,\n\t\t\t);\n\t\t\tif (match) {\n\t\t\t\tthis.host.agent.state.model = match;\n\t\t\t\tawait this.host.emitModelSelect(match, previousModel, \"restore\");\n\t\t\t}\n\t\t}\n\n\t\tconst hasThinkingEntry = this.host.sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\t\tconst defaultThinkingLevel = this.host.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\n\t\tif (hasThinkingEntry) {\n\t\t\tthis.host.setThinkingLevel(sessionContext.thinkingLevel as ThinkingLevel);\n\t\t} else {\n\t\t\tconst availableLevels = this.host.getAvailableThinkingLevels();\n\t\t\tconst effectiveLevel = availableLevels.includes(defaultThinkingLevel)\n\t\t\t\t? defaultThinkingLevel\n\t\t\t\t: this.host.clampThinkingLevel(defaultThinkingLevel, availableLevels);\n\t\t\tthis.host.agent.state.thinkingLevel = effectiveLevel;\n\t\t\tthis.host.sessionManager.appendThinkingLevelChange(effectiveLevel);\n\t\t}\n\n\t\tif (this.host._extensionRunner) {\n\t\t\tawait this.host.emitSessionStartWithLegacySwitch({\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"resume\",\n\t\t\t\tpreviousSessionFile,\n\t\t\t});\n\t\t}\n\n\t\tthis.host.reconnectToAgent();\n\t\treturn true;\n\t}\n\n\tasync fork(entryId: string): Promise<{ selectedText: string; cancelled: boolean }> {\n\t\tconst previousSessionFile = this.host.sessionFile;\n\t\tconst selectedEntry = this.host.sessionManager.getEntry(entryId);\n\n\t\tif (!selectedEntry || selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tconst selectedText = this.extractUserMessageText(selectedEntry.message.content);\n\n\t\tlet skipConversationRestore = false;\n\n\t\tif (this.host._extensionRunner?.hasHandlers(\"session_before_fork\")) {\n\t\t\tconst result = (await this.host._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_fork\",\n\t\t\t\tentryId,\n\t\t\t\tposition: \"at\",\n\t\t\t})) as SessionBeforeForkResult | undefined;\n\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn { selectedText, cancelled: true };\n\t\t\t}\n\t\t\tskipConversationRestore = result?.skipConversationRestore ?? false;\n\t\t}\n\n\t\tthis.host._pendingNextTurnMessages = [];\n\n\t\tif (!selectedEntry.parentId) {\n\t\t\tthis.host.sessionManager.newSession({ parentSession: previousSessionFile });\n\t\t} else {\n\t\t\tthis.host.sessionManager.createBranchedSession(selectedEntry.parentId);\n\t\t}\n\t\tthis.host.agent.sessionId = this.host.sessionManager.getSessionId();\n\n\t\tconst sessionContext = this.host.sessionManager.buildSessionContext();\n\n\t\tif (this.host._extensionRunner) {\n\t\t\tawait this.host._extensionRunner.emit({\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"fork\",\n\t\t\t\tpreviousSessionFile,\n\t\t\t});\n\t\t}\n\n\t\tif (!skipConversationRestore) {\n\t\t\tthis.host.agent.state.messages = sessionContext.messages;\n\t\t}\n\n\t\treturn { selectedText, cancelled: false };\n\t}\n\n\tgetLastTurnCost(): number {\n\t\treturn this.host._lastTurnCost;\n\t}\n\n\tget editMode(): \"standard\" | \"hashline\" {\n\t\treturn this.host.settingsManager.getEditMode();\n\t}\n\n\tsetEditMode(mode: \"standard\" | \"hashline\"): void {\n\t\tthis.host.settingsManager.setEditMode(mode);\n\t}\n\n\tasync navigateTree(\n\t\ttargetId: string,\n\t\toptions: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string } = {},\n\t): Promise<{ editorText?: string; cancelled: boolean; aborted?: boolean; summaryEntry?: BranchSummaryEntry }> {\n\t\tconst oldLeafId = this.host.sessionManager.getLeafId();\n\n\t\tif (targetId === oldLeafId) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tif (options.summarize && !this.host.model) {\n\t\t\tthrow new Error(\"No model available for summarization\");\n\t\t}\n\n\t\tconst targetEntry = this.host.sessionManager.getEntry(targetId);\n\t\tif (!targetEntry) {\n\t\t\tthrow new Error(`Entry ${targetId} not found`);\n\t\t}\n\n\t\tconst { entries: entriesToSummarize, commonAncestorId } = collectEntriesForBranchSummary(\n\t\t\tthis.host.sessionManager,\n\t\t\toldLeafId,\n\t\t\ttargetId,\n\t\t);\n\n\t\tlet customInstructions = options.customInstructions;\n\t\tlet replaceInstructions = options.replaceInstructions;\n\t\tlet label = options.label;\n\n\t\tconst preparation: TreePreparation = {\n\t\t\ttargetId,\n\t\t\toldLeafId,\n\t\t\tcommonAncestorId,\n\t\t\tentriesToSummarize,\n\t\t\tuserWantsSummary: options.summarize ?? false,\n\t\t\tcustomInstructions,\n\t\t\treplaceInstructions,\n\t\t\tlabel,\n\t\t};\n\n\t\tthis.host._branchSummaryAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tlet extensionSummary: { summary: string; details?: unknown } | undefined;\n\t\t\tlet fromExtension = false;\n\n\t\t\tif (this.host._extensionRunner.hasHandlers(\"session_before_tree\")) {\n\t\t\t\tconst result = (await this.host._extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_tree\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tsignal: this.host._branchSummaryAbortController.signal,\n\t\t\t\t})) as SessionBeforeTreeResult | undefined;\n\n\t\t\t\tif (result?.cancel) {\n\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t}\n\n\t\t\t\tif (result?.summary && options.summarize) {\n\t\t\t\t\textensionSummary = result.summary;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\n\t\t\t\tif (result?.customInstructions !== undefined) {\n\t\t\t\t\tcustomInstructions = result.customInstructions;\n\t\t\t\t}\n\t\t\t\tif (result?.replaceInstructions !== undefined) {\n\t\t\t\t\treplaceInstructions = result.replaceInstructions;\n\t\t\t\t}\n\t\t\t\tif (result?.label !== undefined) {\n\t\t\t\t\tlabel = result.label;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summaryText: string | undefined;\n\t\t\tlet summaryDetails: unknown;\n\t\t\tif (options.summarize && entriesToSummarize.length > 0 && !extensionSummary) {\n\t\t\t\tconst model = this.host.model!;\n\t\t\t\tconst { apiKey, headers } = await this.host.getRequiredRequestAuth(model);\n\t\t\t\tconst branchSummarySettings = this.host.settingsManager.getBranchSummarySettings();\n\t\t\t\tconst result = await generateBranchSummary(entriesToSummarize, {\n\t\t\t\t\tmodel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\theaders,\n\t\t\t\t\tsignal: this.host._branchSummaryAbortController.signal,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\treplaceInstructions,\n\t\t\t\t\treserveTokens: branchSummarySettings.reserveTokens,\n\t\t\t\t});\n\t\t\t\tif (result.aborted) {\n\t\t\t\t\treturn { cancelled: true, aborted: true };\n\t\t\t\t}\n\t\t\t\tif (result.error) {\n\t\t\t\t\tthrow new Error(result.error);\n\t\t\t\t}\n\t\t\t\tsummaryText = result.summary;\n\t\t\t\tsummaryDetails = {\n\t\t\t\t\treadFiles: result.readFiles || [],\n\t\t\t\t\tmodifiedFiles: result.modifiedFiles || [],\n\t\t\t\t};\n\t\t\t} else if (extensionSummary) {\n\t\t\t\tsummaryText = extensionSummary.summary;\n\t\t\t\tsummaryDetails = extensionSummary.details;\n\t\t\t}\n\n\t\t\tlet newLeafId: string | null;\n\t\t\tlet editorText: string | undefined;\n\n\t\t\tif (targetEntry.type === \"message\" && targetEntry.message.role === \"user\") {\n\t\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\t\teditorText = this.extractUserMessageText(targetEntry.message.content);\n\t\t\t} else if (targetEntry.type === \"custom_message\") {\n\t\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\t\teditorText =\n\t\t\t\t\ttypeof targetEntry.content === \"string\"\n\t\t\t\t\t\t? targetEntry.content\n\t\t\t\t\t\t: targetEntry.content\n\t\t\t\t\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t\t\t\t\t.map((c) => c.text)\n\t\t\t\t\t\t\t\t.join(\"\");\n\t\t\t} else {\n\t\t\t\tnewLeafId = targetId;\n\t\t\t}\n\n\t\t\tlet summaryEntry: BranchSummaryEntry | undefined;\n\t\t\tif (summaryText) {\n\t\t\t\tconst summaryId = this.host.sessionManager.branchWithSummary(\n\t\t\t\t\tnewLeafId,\n\t\t\t\t\tsummaryText,\n\t\t\t\t\tsummaryDetails,\n\t\t\t\t\tfromExtension,\n\t\t\t\t);\n\t\t\t\tsummaryEntry = this.host.sessionManager.getEntry(summaryId) as BranchSummaryEntry;\n\n\t\t\t\tif (label) {\n\t\t\t\t\tthis.host.sessionManager.appendLabelChange(summaryId, label);\n\t\t\t\t}\n\t\t\t} else if (newLeafId === null) {\n\t\t\t\tthis.host.sessionManager.resetLeaf();\n\t\t\t} else {\n\t\t\t\tthis.host.sessionManager.branch(newLeafId);\n\t\t\t}\n\n\t\t\tif (label && !summaryText) {\n\t\t\t\tthis.host.sessionManager.appendLabelChange(targetId, label);\n\t\t\t}\n\n\t\t\tconst sessionContext = this.host.sessionManager.buildSessionContext();\n\t\t\tthis.host.agent.state.messages = sessionContext.messages;\n\n\t\t\tawait this.host._extensionRunner.emit({\n\t\t\t\ttype: \"session_tree\",\n\t\t\t\tnewLeafId: this.host.sessionManager.getLeafId(),\n\t\t\t\toldLeafId,\n\t\t\t\tsummaryEntry,\n\t\t\t\tfromExtension: summaryText ? fromExtension : undefined,\n\t\t\t});\n\n\t\t\treturn { editorText, cancelled: false, summaryEntry };\n\t\t} finally {\n\t\t\tthis.host._branchSummaryAbortController = undefined;\n\t\t}\n\t}\n\n\tgetUserMessagesForForking(): Array<{ entryId: string; text: string }> {\n\t\tconst entries = this.host.sessionManager.getEntries();\n\t\tconst result: Array<{ entryId: string; text: string }> = [];\n\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.type !== \"message\") continue;\n\t\t\tif (entry.message.role !== \"user\") continue;\n\n\t\t\tconst text = this.extractUserMessageText(entry.message.content);\n\t\t\tif (text) {\n\t\t\t\tresult.push({ entryId: entry.id, text });\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\textractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\t\tif (typeof content === \"string\") return content;\n\t\tif (Array.isArray(content)) {\n\t\t\treturn content\n\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.join(\"\");\n\t\t}\n\t\treturn \"\";\n\t}\n\n\tgetSessionStats(): SessionStats {\n\t\tconst state = this.host.state;\n\t\tconst userMessages = state.messages.filter((m) => m.role === \"user\").length;\n\t\tconst assistantMessages = state.messages.filter((m) => m.role === \"assistant\").length;\n\t\tconst toolResults = state.messages.filter((m) => m.role === \"toolResult\").length;\n\n\t\tlet toolCalls = 0;\n\t\tlet totalInput = 0;\n\t\tlet totalOutput = 0;\n\t\tlet totalCacheRead = 0;\n\t\tlet totalCacheWrite = 0;\n\t\tlet totalCost = 0;\n\n\t\tfor (const message of state.messages) {\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\tconst assistantMsg = message as AssistantMessage;\n\t\t\t\ttoolCalls += assistantMsg.content.filter((c) => c.type === \"toolCall\").length;\n\t\t\t\ttotalInput += assistantMsg.usage.input;\n\t\t\t\ttotalOutput += assistantMsg.usage.output;\n\t\t\t\ttotalCacheRead += assistantMsg.usage.cacheRead;\n\t\t\t\ttotalCacheWrite += assistantMsg.usage.cacheWrite;\n\t\t\t\ttotalCost += assistantMsg.usage.cost.total;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsessionFile: this.host.sessionFile,\n\t\t\tsessionId: this.host.sessionId,\n\t\t\tuserMessages,\n\t\t\tassistantMessages,\n\t\t\ttoolCalls,\n\t\t\ttoolResults,\n\t\t\ttotalMessages: state.messages.length,\n\t\t\ttokens: {\n\t\t\t\tinput: totalInput,\n\t\t\t\toutput: totalOutput,\n\t\t\t\tcacheRead: totalCacheRead,\n\t\t\t\tcacheWrite: totalCacheWrite,\n\t\t\t\ttotal: totalInput + totalOutput + totalCacheRead + totalCacheWrite,\n\t\t\t},\n\t\t\tcost: totalCost,\n\t\t\tcontextUsage: this.getContextUsage(),\n\t\t};\n\t}\n\n\tgetContextUsage(): ContextUsage | undefined {\n\t\tconst model = this.host.model;\n\t\tif (!model) return undefined;\n\n\t\tconst contextWindow = model.contextWindow ?? 0;\n\t\tif (contextWindow <= 0) return undefined;\n\n\t\t// After compaction, the last assistant usage reflects pre-compaction context size.\n\t\t// We can only trust usage from an assistant that responded after the latest compaction.\n\t\t// If no such assistant exists, context token count is unknown until the next LLM response.\n\t\tconst branchEntries = this.host.sessionManager.getBranch();\n\t\tconst latestCompaction = getLatestCompactionEntry(branchEntries);\n\n\t\tif (latestCompaction) {\n\t\t\t// Check if there's a valid assistant usage after the compaction boundary\n\t\t\tconst compactionIndex = branchEntries.lastIndexOf(latestCompaction);\n\t\t\tlet hasPostCompactionUsage = false;\n\t\t\tfor (let i = branchEntries.length - 1; i > compactionIndex; i--) {\n\t\t\t\tconst entry = branchEntries[i];\n\t\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\t\tconst assistant = entry.message;\n\t\t\t\t\tif (assistant.stopReason !== \"aborted\" && assistant.stopReason !== \"error\") {\n\t\t\t\t\t\tconst contextTokens = calculateContextTokens(assistant.usage);\n\t\t\t\t\t\tif (contextTokens > 0) {\n\t\t\t\t\t\t\thasPostCompactionUsage = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!hasPostCompactionUsage) {\n\t\t\t\treturn { tokens: null, contextWindow, percent: null };\n\t\t\t}\n\t\t}\n\n\t\tconst estimate = estimateContextTokens(this.host.messages);\n\t\tconst percent = (estimate.tokens / contextWindow) * 100;\n\n\t\treturn {\n\t\t\ttokens: estimate.tokens,\n\t\t\tcontextWindow,\n\t\t\tpercent,\n\t\t};\n\t}\n\n\tasync exportToHtml(outputPath?: string): Promise<string> {\n\t\tconst themeName = this.host.settingsManager.getTheme();\n\n\t\t// Create tool renderer if we have an extension runner (for custom tool HTML rendering)\n\t\tconst toolRenderer: ToolHtmlRenderer = createToolHtmlRenderer({\n\t\t\tgetToolDefinition: (name) => this.host.getToolDefinition(name),\n\t\t\ttheme,\n\t\t\tcwd: this.host.sessionManager.getCwd(),\n\t\t});\n\n\t\treturn await exportSessionToHtml(this.host.sessionManager, this.host.state, {\n\t\t\toutputPath,\n\t\t\tthemeName,\n\t\t\ttoolRenderer,\n\t\t});\n\t}\n\n\texportToJsonl(outputPath?: string): string {\n\t\tconst filePath = resolvePath(\n\t\t\toutputPath ?? `session-${new Date().toISOString().replace(/[:.]/g, \"-\")}.jsonl`,\n\t\t\tprocess.cwd(),\n\t\t);\n\t\tconst dir = dirname(filePath);\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t}\n\n\t\tconst header: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: this.host.sessionManager.getSessionId(),\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tcwd: this.host.sessionManager.getCwd(),\n\t\t};\n\n\t\tconst branchEntries = this.host.sessionManager.getBranch();\n\t\tconst lines = [JSON.stringify(header)];\n\n\t\t// Re-chain parentIds to form a linear sequence\n\t\tlet prevId: string | null = null;\n\t\tfor (const entry of branchEntries) {\n\t\t\tconst linear = { ...entry, parentId: prevId };\n\t\t\tlines.push(JSON.stringify(linear));\n\t\t\tprevId = entry.id;\n\t\t}\n\n\t\twriteFileSync(filePath, `${lines.join(\"\\n\")}\\n`);\n\t\treturn filePath;\n\t}\n\n\tgetLastAssistantText(): string | undefined {\n\t\tconst lastAssistant = this.host.messages\n\t\t\t.slice()\n\t\t\t.reverse()\n\t\t\t.find((m) => {\n\t\t\t\tif (m.role !== \"assistant\") return false;\n\t\t\t\tconst msg = m as AssistantMessage;\n\t\t\t\t// Skip aborted messages with no content\n\t\t\t\tif (msg.stopReason === \"aborted\" && msg.content.length === 0) return false;\n\t\t\t\treturn true;\n\t\t\t});\n\n\t\tif (!lastAssistant) return undefined;\n\n\t\tlet text = \"\";\n\t\tfor (const content of (lastAssistant as AssistantMessage).content) {\n\t\t\tif (content.type === \"text\") {\n\t\t\t\ttext += content.text;\n\t\t\t}\n\t\t}\n\n\t\treturn text.trim() || undefined;\n\t}\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-navigation.js","sourceRoot":"","sources":["../../src/session/agent-session-navigation.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { ThinkingLevel } from \"@gsd/pi-agent-core\";\nimport type { AssistantMessage } from \"@gsd/pi-ai\";\nimport { resolvePath } from \"@gsd/pi-coding-agent/utils/paths.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"@gsd/pi-coding-agent/core/defaults.js\";\nimport type { ContextUsage } from \"@gsd/pi-coding-agent/core/extensions/index.js\";\nimport type {\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeResult,\n\tTreePreparation,\n} from \"@gsd/pi-coding-agent/core/extensions/index.js\";\nimport type { BranchSummaryEntry, SessionManager } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport { CURRENT_SESSION_VERSION, getLatestCompactionEntry, type SessionHeader } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport {\n\tcalculateContextTokens,\n\tcollectEntriesForBranchSummary,\n\testimateContextTokens,\n\tgenerateBranchSummary,\n} from \"../compaction/index.js\";\nimport { exportSessionToHtml, type ToolHtmlRenderer } from \"../export-html/index.js\";\nimport { createToolHtmlRenderer } from \"../export-html/tool-renderer.js\";\nimport type { SessionStats } from \"./agent-session-types.js\";\nimport type { AgentSessionHost } from \"./agent-session-host.js\";\n\nexport class AgentSessionNavigationModule {\n\tconstructor(readonly host: AgentSessionHost) {}\n\n\tsetSessionName(name: string): void {\n\t\tthis.host.sessionManager.appendSessionInfo(name);\n\t\tthis.host.emit({ type: \"session_info_changed\", name: this.host.sessionManager.getSessionName() });\n\t}\n\n\tasync settleCurrentTurnForSessionTransition(): Promise<void> {\n\t\tif (!this.host.agent.state.isStreaming) {\n\t\t\tthis.host.abortRetry();\n\t\t\tawait this.host.agent.waitForIdle();\n\t\t\treturn;\n\t\t}\n\t\tawait this.host.abort();\n\t}\n\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\tworkspaceRoot?: string;\n\t\tabortSignal?: AbortSignal;\n\t}): Promise<boolean> {\n\t\tconst previousSessionFile = this.host.sessionFile;\n\n\t\tif (this.host._extensionRunner?.hasHandlers(\"session_before_switch\")) {\n\t\t\tconst result = (await this.host._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_switch\",\n\t\t\t\treason: \"new\",\n\t\t\t})) as SessionBeforeSwitchResult | undefined;\n\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tawait this.settleCurrentTurnForSessionTransition();\n\n\t\tif (options?.abortSignal?.aborted) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.host.disconnectFromAgent();\n\t\tthis.host.agent.reset();\n\n\t\tconst previousCwd = this.host._cwd;\n\t\tthis.host._cwd = options?.workspaceRoot ?? process.cwd();\n\n\t\tthis.host.sessionManager.newSession({\n\t\t\tcwd: this.host._cwd,\n\t\t\tparentSession: options?.parentSession,\n\t\t});\n\t\tthis.host.agent.sessionId = this.host.sessionManager.getSessionId();\n\t\tthis.host._steeringMessages = [];\n\t\tthis.host._followUpMessages = [];\n\t\tthis.host._pendingNextTurnMessages = [];\n\n\t\tthis.host.sessionManager.appendThinkingLevelChange(this.host.thinkingLevel);\n\n\t\tif (this.host._cwd !== previousCwd) {\n\t\t\tthis.host.buildRuntime({\n\t\t\t\tactiveToolNames: this.host.getActiveToolNames(),\n\t\t\t\tincludeAllExtensionTools: true,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.host.refreshToolRegistry({\n\t\t\t\tactiveToolNames: this.host.getActiveToolNames(),\n\t\t\t\tincludeAllExtensionTools: true,\n\t\t\t});\n\t\t}\n\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.host.sessionManager);\n\t\t\tconst sessionContext = this.host.sessionManager.buildSessionContext();\n\t\t\tthis.host.agent.state.messages = sessionContext.messages;\n\t\t}\n\n\t\tthis.host.reconnectToAgent();\n\n\t\tif (this.host._extensionRunner) {\n\t\t\tawait this.host.emitSessionStartWithLegacySwitch({\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"new\",\n\t\t\t\tpreviousSessionFile,\n\t\t\t});\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tasync switchSession(sessionPath: string): Promise<boolean> {\n\t\tconst previousSessionFile = this.host.sessionManager.getSessionFile();\n\n\t\tif (this.host._extensionRunner?.hasHandlers(\"session_before_switch\")) {\n\t\t\tconst result = (await this.host._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_switch\",\n\t\t\t\treason: \"resume\",\n\t\t\t\ttargetSessionFile: sessionPath,\n\t\t\t})) as SessionBeforeSwitchResult | undefined;\n\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tawait this.settleCurrentTurnForSessionTransition();\n\t\tthis.host.disconnectFromAgent();\n\n\t\tthis.host._steeringMessages = [];\n\t\tthis.host._followUpMessages = [];\n\t\tthis.host._pendingNextTurnMessages = [];\n\n\t\tthis.host.sessionManager.setSessionFile(sessionPath);\n\t\tthis.host.agent.sessionId = this.host.sessionManager.getSessionId();\n\n\t\tconst sessionContext = this.host.sessionManager.buildSessionContext();\n\t\tthis.host.agent.state.messages = sessionContext.messages;\n\n\t\tif (sessionContext.model) {\n\t\t\tconst previousModel = this.host.model;\n\t\t\tconst availableModels = await this.host.modelRegistry.getAvailable();\n\t\t\tconst match = availableModels.find(\n\t\t\t\t(m) => m.provider === sessionContext.model!.provider && m.id === sessionContext.model!.modelId,\n\t\t\t);\n\t\t\tif (match) {\n\t\t\t\tthis.host.agent.state.model = match;\n\t\t\t\tawait this.host.emitModelSelect(match, previousModel, \"restore\");\n\t\t\t}\n\t\t}\n\n\t\tconst hasThinkingEntry = this.host.sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\t\tconst defaultThinkingLevel = this.host.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\n\t\tif (hasThinkingEntry) {\n\t\t\tthis.host.setThinkingLevel(sessionContext.thinkingLevel as ThinkingLevel);\n\t\t} else {\n\t\t\tconst availableLevels = this.host.getAvailableThinkingLevels();\n\t\t\tconst effectiveLevel = availableLevels.includes(defaultThinkingLevel)\n\t\t\t\t? defaultThinkingLevel\n\t\t\t\t: this.host.clampThinkingLevel(defaultThinkingLevel, availableLevels);\n\t\t\tthis.host.agent.state.thinkingLevel = effectiveLevel;\n\t\t\tthis.host.sessionManager.appendThinkingLevelChange(effectiveLevel);\n\t\t}\n\n\t\tif (this.host._extensionRunner) {\n\t\t\tawait this.host.emitSessionStartWithLegacySwitch({\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"resume\",\n\t\t\t\tpreviousSessionFile,\n\t\t\t});\n\t\t}\n\n\t\tthis.host.reconnectToAgent();\n\t\treturn true;\n\t}\n\n\tasync fork(entryId: string): Promise<{ selectedText: string; cancelled: boolean }> {\n\t\tconst previousSessionFile = this.host.sessionFile;\n\t\tconst selectedEntry = this.host.sessionManager.getEntry(entryId);\n\n\t\tif (!selectedEntry || selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tconst selectedText = this.extractUserMessageText(selectedEntry.message.content);\n\n\t\tlet skipConversationRestore = false;\n\n\t\tif (this.host._extensionRunner?.hasHandlers(\"session_before_fork\")) {\n\t\t\tconst result = (await this.host._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_fork\",\n\t\t\t\tentryId,\n\t\t\t\tposition: \"at\",\n\t\t\t})) as SessionBeforeForkResult | undefined;\n\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn { selectedText, cancelled: true };\n\t\t\t}\n\t\t\tskipConversationRestore = result?.skipConversationRestore ?? false;\n\t\t}\n\n\t\tthis.host._pendingNextTurnMessages = [];\n\n\t\tif (!selectedEntry.parentId) {\n\t\t\tthis.host.sessionManager.newSession({ parentSession: previousSessionFile });\n\t\t} else {\n\t\t\tthis.host.sessionManager.createBranchedSession(selectedEntry.parentId);\n\t\t}\n\t\tthis.host.agent.sessionId = this.host.sessionManager.getSessionId();\n\n\t\tconst sessionContext = this.host.sessionManager.buildSessionContext();\n\n\t\tif (this.host._extensionRunner) {\n\t\t\tawait this.host._extensionRunner.emit({\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"fork\",\n\t\t\t\tpreviousSessionFile,\n\t\t\t});\n\t\t}\n\n\t\tif (!skipConversationRestore) {\n\t\t\tthis.host.agent.state.messages = sessionContext.messages;\n\t\t}\n\n\t\treturn { selectedText, cancelled: false };\n\t}\n\n\tgetLastTurnCost(): number {\n\t\treturn this.host._lastTurnCost;\n\t}\n\n\tget editMode(): \"standard\" | \"hashline\" {\n\t\treturn this.host.settingsManager.getEditMode();\n\t}\n\n\tsetEditMode(mode: \"standard\" | \"hashline\"): void {\n\t\tthis.host.settingsManager.setEditMode(mode);\n\t}\n\n\tasync navigateTree(\n\t\ttargetId: string,\n\t\toptions: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string } = {},\n\t): Promise<{ editorText?: string; cancelled: boolean; aborted?: boolean; summaryEntry?: BranchSummaryEntry }> {\n\t\tconst oldLeafId = this.host.sessionManager.getLeafId();\n\n\t\tif (targetId === oldLeafId) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tif (options.summarize && !this.host.model) {\n\t\t\tthrow new Error(\"No model available for summarization\");\n\t\t}\n\n\t\tconst targetEntry = this.host.sessionManager.getEntry(targetId);\n\t\tif (!targetEntry) {\n\t\t\tthrow new Error(`Entry ${targetId} not found`);\n\t\t}\n\n\t\tconst { entries: entriesToSummarize, commonAncestorId } = collectEntriesForBranchSummary(\n\t\t\tthis.host.sessionManager,\n\t\t\toldLeafId,\n\t\t\ttargetId,\n\t\t);\n\n\t\tlet customInstructions = options.customInstructions;\n\t\tlet replaceInstructions = options.replaceInstructions;\n\t\tlet label = options.label;\n\n\t\tconst preparation: TreePreparation = {\n\t\t\ttargetId,\n\t\t\toldLeafId,\n\t\t\tcommonAncestorId,\n\t\t\tentriesToSummarize,\n\t\t\tuserWantsSummary: options.summarize ?? false,\n\t\t\tcustomInstructions,\n\t\t\treplaceInstructions,\n\t\t\tlabel,\n\t\t};\n\n\t\tthis.host._branchSummaryAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tlet extensionSummary: { summary: string; details?: unknown } | undefined;\n\t\t\tlet fromExtension = false;\n\n\t\t\tif (this.host._extensionRunner.hasHandlers(\"session_before_tree\")) {\n\t\t\t\tconst result = (await this.host._extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_tree\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tsignal: this.host._branchSummaryAbortController.signal,\n\t\t\t\t})) as SessionBeforeTreeResult | undefined;\n\n\t\t\t\tif (result?.cancel) {\n\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t}\n\n\t\t\t\tif (result?.summary && options.summarize) {\n\t\t\t\t\textensionSummary = result.summary;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\n\t\t\t\tif (result?.customInstructions !== undefined) {\n\t\t\t\t\tcustomInstructions = result.customInstructions;\n\t\t\t\t}\n\t\t\t\tif (result?.replaceInstructions !== undefined) {\n\t\t\t\t\treplaceInstructions = result.replaceInstructions;\n\t\t\t\t}\n\t\t\t\tif (result?.label !== undefined) {\n\t\t\t\t\tlabel = result.label;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summaryText: string | undefined;\n\t\t\tlet summaryDetails: unknown;\n\t\t\tif (options.summarize && entriesToSummarize.length > 0 && !extensionSummary) {\n\t\t\t\tconst model = this.host.model!;\n\t\t\t\tconst { apiKey, headers } = await this.host.getRequiredRequestAuth(model);\n\t\t\t\tconst branchSummarySettings = this.host.settingsManager.getBranchSummarySettings();\n\t\t\t\tconst result = await generateBranchSummary(entriesToSummarize, {\n\t\t\t\t\tmodel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\theaders,\n\t\t\t\t\tsignal: this.host._branchSummaryAbortController.signal,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\treplaceInstructions,\n\t\t\t\t\treserveTokens: branchSummarySettings.reserveTokens,\n\t\t\t\t});\n\t\t\t\tif (result.aborted) {\n\t\t\t\t\treturn { cancelled: true, aborted: true };\n\t\t\t\t}\n\t\t\t\tif (result.error) {\n\t\t\t\t\tthrow new Error(result.error);\n\t\t\t\t}\n\t\t\t\tsummaryText = result.summary;\n\t\t\t\tsummaryDetails = {\n\t\t\t\t\treadFiles: result.readFiles || [],\n\t\t\t\t\tmodifiedFiles: result.modifiedFiles || [],\n\t\t\t\t};\n\t\t\t} else if (extensionSummary) {\n\t\t\t\tsummaryText = extensionSummary.summary;\n\t\t\t\tsummaryDetails = extensionSummary.details;\n\t\t\t}\n\n\t\t\tlet newLeafId: string | null;\n\t\t\tlet editorText: string | undefined;\n\n\t\t\tif (targetEntry.type === \"message\" && targetEntry.message.role === \"user\") {\n\t\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\t\teditorText = this.extractUserMessageText(targetEntry.message.content);\n\t\t\t} else if (targetEntry.type === \"custom_message\") {\n\t\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\t\teditorText =\n\t\t\t\t\ttypeof targetEntry.content === \"string\"\n\t\t\t\t\t\t? targetEntry.content\n\t\t\t\t\t\t: targetEntry.content\n\t\t\t\t\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t\t\t\t\t.map((c) => c.text)\n\t\t\t\t\t\t\t\t.join(\"\");\n\t\t\t} else {\n\t\t\t\tnewLeafId = targetId;\n\t\t\t}\n\n\t\t\tlet summaryEntry: BranchSummaryEntry | undefined;\n\t\t\tif (summaryText) {\n\t\t\t\tconst summaryId = this.host.sessionManager.branchWithSummary(\n\t\t\t\t\tnewLeafId,\n\t\t\t\t\tsummaryText,\n\t\t\t\t\tsummaryDetails,\n\t\t\t\t\tfromExtension,\n\t\t\t\t);\n\t\t\t\tsummaryEntry = this.host.sessionManager.getEntry(summaryId) as BranchSummaryEntry;\n\n\t\t\t\tif (label) {\n\t\t\t\t\tthis.host.sessionManager.appendLabelChange(summaryId, label);\n\t\t\t\t}\n\t\t\t} else if (newLeafId === null) {\n\t\t\t\tthis.host.sessionManager.resetLeaf();\n\t\t\t} else {\n\t\t\t\tthis.host.sessionManager.branch(newLeafId);\n\t\t\t}\n\n\t\t\tif (label && !summaryText) {\n\t\t\t\tthis.host.sessionManager.appendLabelChange(targetId, label);\n\t\t\t}\n\n\t\t\tconst sessionContext = this.host.sessionManager.buildSessionContext();\n\t\t\tthis.host.agent.state.messages = sessionContext.messages;\n\n\t\t\tawait this.host._extensionRunner.emit({\n\t\t\t\ttype: \"session_tree\",\n\t\t\t\tnewLeafId: this.host.sessionManager.getLeafId(),\n\t\t\t\toldLeafId,\n\t\t\t\tsummaryEntry,\n\t\t\t\tfromExtension: summaryText ? fromExtension : undefined,\n\t\t\t});\n\n\t\t\treturn { editorText, cancelled: false, summaryEntry };\n\t\t} finally {\n\t\t\tthis.host._branchSummaryAbortController = undefined;\n\t\t}\n\t}\n\n\tgetUserMessagesForForking(): Array<{ entryId: string; text: string }> {\n\t\tconst entries = this.host.sessionManager.getEntries();\n\t\tconst result: Array<{ entryId: string; text: string }> = [];\n\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.type !== \"message\") continue;\n\t\t\tif (entry.message.role !== \"user\") continue;\n\n\t\t\tconst text = this.extractUserMessageText(entry.message.content);\n\t\t\tif (text) {\n\t\t\t\tresult.push({ entryId: entry.id, text });\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\textractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\t\tif (typeof content === \"string\") return content;\n\t\tif (Array.isArray(content)) {\n\t\t\treturn content\n\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.join(\"\");\n\t\t}\n\t\treturn \"\";\n\t}\n\n\tgetSessionStats(): SessionStats {\n\t\tconst state = this.host.state;\n\t\tconst userMessages = state.messages.filter((m) => m.role === \"user\").length;\n\t\tconst assistantMessages = state.messages.filter((m) => m.role === \"assistant\").length;\n\t\tconst toolResults = state.messages.filter((m) => m.role === \"toolResult\").length;\n\n\t\tlet toolCalls = 0;\n\t\tlet totalInput = 0;\n\t\tlet totalOutput = 0;\n\t\tlet totalCacheRead = 0;\n\t\tlet totalCacheWrite = 0;\n\t\tlet totalCost = 0;\n\n\t\tfor (const message of state.messages) {\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\tconst assistantMsg = message as AssistantMessage;\n\t\t\t\ttoolCalls += assistantMsg.content.filter((c) => c.type === \"toolCall\").length;\n\t\t\t\ttotalInput += assistantMsg.usage.input;\n\t\t\t\ttotalOutput += assistantMsg.usage.output;\n\t\t\t\ttotalCacheRead += assistantMsg.usage.cacheRead;\n\t\t\t\ttotalCacheWrite += assistantMsg.usage.cacheWrite;\n\t\t\t\ttotalCost += assistantMsg.usage.cost.total;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsessionFile: this.host.sessionFile,\n\t\t\tsessionId: this.host.sessionId,\n\t\t\tuserMessages,\n\t\t\tassistantMessages,\n\t\t\ttoolCalls,\n\t\t\ttoolResults,\n\t\t\ttotalMessages: state.messages.length,\n\t\t\ttokens: {\n\t\t\t\tinput: totalInput,\n\t\t\t\toutput: totalOutput,\n\t\t\t\tcacheRead: totalCacheRead,\n\t\t\t\tcacheWrite: totalCacheWrite,\n\t\t\t\ttotal: totalInput + totalOutput + totalCacheRead + totalCacheWrite,\n\t\t\t},\n\t\t\tcost: totalCost,\n\t\t\tcontextUsage: this.getContextUsage(),\n\t\t};\n\t}\n\n\tgetContextUsage(): ContextUsage | undefined {\n\t\tconst model = this.host.model;\n\t\tif (!model) return undefined;\n\n\t\tconst contextWindow = model.contextWindow ?? 0;\n\t\tif (contextWindow <= 0) return undefined;\n\n\t\t// After compaction, the last assistant usage reflects pre-compaction context size.\n\t\t// We can only trust usage from an assistant that responded after the latest compaction.\n\t\t// If no such assistant exists, context token count is unknown until the next LLM response.\n\t\tconst branchEntries = this.host.sessionManager.getBranch();\n\t\tconst latestCompaction = getLatestCompactionEntry(branchEntries);\n\n\t\tif (latestCompaction) {\n\t\t\t// Check if there's a valid assistant usage after the compaction boundary\n\t\t\tconst compactionIndex = branchEntries.lastIndexOf(latestCompaction);\n\t\t\tlet hasPostCompactionUsage = false;\n\t\t\tfor (let i = branchEntries.length - 1; i > compactionIndex; i--) {\n\t\t\t\tconst entry = branchEntries[i];\n\t\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\t\tconst assistant = entry.message;\n\t\t\t\t\tif (assistant.stopReason !== \"aborted\" && assistant.stopReason !== \"error\") {\n\t\t\t\t\t\tconst contextTokens = calculateContextTokens(assistant.usage);\n\t\t\t\t\t\tif (contextTokens > 0) {\n\t\t\t\t\t\t\thasPostCompactionUsage = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!hasPostCompactionUsage) {\n\t\t\t\treturn { tokens: null, contextWindow, percent: null };\n\t\t\t}\n\t\t}\n\n\t\tconst estimate = estimateContextTokens(this.host.messages);\n\t\tconst percent = (estimate.tokens / contextWindow) * 100;\n\n\t\treturn {\n\t\t\ttokens: estimate.tokens,\n\t\t\tcontextWindow,\n\t\t\tpercent,\n\t\t};\n\t}\n\n\tasync exportToHtml(outputPath?: string): Promise<string> {\n\t\tconst themeName = this.host.settingsManager.getTheme();\n\n\t\t// Create tool renderer if we have an extension runner (for custom tool HTML rendering)\n\t\tconst toolRenderer: ToolHtmlRenderer = createToolHtmlRenderer({\n\t\t\tgetToolDefinition: (name) => this.host.getToolDefinition(name),\n\t\t\ttheme,\n\t\t\tcwd: this.host.sessionManager.getCwd(),\n\t\t});\n\n\t\treturn await exportSessionToHtml(this.host.sessionManager, this.host.state, {\n\t\t\toutputPath,\n\t\t\tthemeName,\n\t\t\ttoolRenderer,\n\t\t});\n\t}\n\n\texportToJsonl(outputPath?: string): string {\n\t\tconst filePath = resolvePath(\n\t\t\toutputPath ?? `session-${new Date().toISOString().replace(/[:.]/g, \"-\")}.jsonl`,\n\t\t\tprocess.cwd(),\n\t\t);\n\t\tconst dir = dirname(filePath);\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t}\n\n\t\tconst header: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: this.host.sessionManager.getSessionId(),\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tcwd: this.host.sessionManager.getCwd(),\n\t\t};\n\n\t\tconst branchEntries = this.host.sessionManager.getBranch();\n\t\tconst lines = [JSON.stringify(header)];\n\n\t\t// Re-chain parentIds to form a linear sequence\n\t\tlet prevId: string | null = null;\n\t\tfor (const entry of branchEntries) {\n\t\t\tconst linear = { ...entry, parentId: prevId };\n\t\t\tlines.push(JSON.stringify(linear));\n\t\t\tprevId = entry.id;\n\t\t}\n\n\t\twriteFileSync(filePath, `${lines.join(\"\\n\")}\\n`);\n\t\treturn filePath;\n\t}\n\n\tgetLastAssistantText(): string | undefined {\n\t\tconst lastAssistant = this.host.messages\n\t\t\t.slice()\n\t\t\t.reverse()\n\t\t\t.find((m) => {\n\t\t\t\tif (m.role !== \"assistant\") return false;\n\t\t\t\tconst msg = m as AssistantMessage;\n\t\t\t\t// Skip aborted messages with no content\n\t\t\t\tif (msg.stopReason === \"aborted\" && msg.content.length === 0) return false;\n\t\t\t\treturn true;\n\t\t\t});\n\n\t\tif (!lastAssistant) return undefined;\n\n\t\tlet text = \"\";\n\t\tfor (const content of (lastAssistant as AssistantMessage).content) {\n\t\t\tif (content.type === \"text\") {\n\t\t\t\ttext += content.text;\n\t\t\t}\n\t\t}\n\n\t\treturn text.trim() || undefined;\n\t}\n\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gsd/agent-core",
|
|
3
|
-
"version": "1.4.0-dev.
|
|
3
|
+
"version": "1.4.0-dev.c18009cd",
|
|
4
4
|
"description": "GSD session orchestration layer on top of @gsd/pi-coding-agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"gsd": {
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"test": "node --import ../../src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/*.test.ts src/**/*.test.ts"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@gsd/native": "^1.4.0-dev.
|
|
29
|
-
"@gsd/pi-agent-core": "^1.4.0-dev.
|
|
30
|
-
"@gsd/pi-ai": "^1.4.0-dev.
|
|
31
|
-
"@gsd/pi-coding-agent": "^1.4.0-dev.
|
|
28
|
+
"@gsd/native": "^1.4.0-dev.c18009cd",
|
|
29
|
+
"@gsd/pi-agent-core": "^1.4.0-dev.c18009cd",
|
|
30
|
+
"@gsd/pi-ai": "^1.4.0-dev.c18009cd",
|
|
31
|
+
"@gsd/pi-coding-agent": "^1.4.0-dev.c18009cd"
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gsd/agent-modes",
|
|
3
|
-
"version": "1.4.0-dev.
|
|
3
|
+
"version": "1.4.0-dev.c18009cd",
|
|
4
4
|
"description": "GSD run modes and CLI layer",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"gsd": {
|
|
@@ -25,12 +25,12 @@
|
|
|
25
25
|
"test": "node --import ../../src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/**/*.test.ts"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@gsd/agent-core": "^1.4.0-dev.
|
|
29
|
-
"@gsd/pi-agent-core": "^1.4.0-dev.
|
|
30
|
-
"@gsd/pi-ai": "^1.4.0-dev.
|
|
31
|
-
"@gsd/pi-coding-agent": "^1.4.0-dev.
|
|
32
|
-
"@gsd/pi-tui": "^1.4.0-dev.
|
|
33
|
-
"@opengsd/contracts": "^1.4.0-dev.
|
|
28
|
+
"@gsd/agent-core": "^1.4.0-dev.c18009cd",
|
|
29
|
+
"@gsd/pi-agent-core": "^1.4.0-dev.c18009cd",
|
|
30
|
+
"@gsd/pi-ai": "^1.4.0-dev.c18009cd",
|
|
31
|
+
"@gsd/pi-coding-agent": "^1.4.0-dev.c18009cd",
|
|
32
|
+
"@gsd/pi-tui": "^1.4.0-dev.c18009cd",
|
|
33
|
+
"@opengsd/contracts": "^1.4.0-dev.c18009cd",
|
|
34
34
|
"chalk": "^5.5.0"
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -42,10 +42,14 @@ export interface McpToolExtra {
|
|
|
42
42
|
requestId?: string | number;
|
|
43
43
|
sendNotification?: (notification: unknown) => void | Promise<void>;
|
|
44
44
|
}
|
|
45
|
+
interface ElicitRequestOptions {
|
|
46
|
+
timeout?: number;
|
|
47
|
+
signal?: AbortSignal;
|
|
48
|
+
}
|
|
45
49
|
interface McpServerInstance {
|
|
46
50
|
tool(name: string, description: string, params: Record<string, unknown>, handler: (args: Record<string, unknown>, extra?: McpToolExtra) => Promise<unknown>): unknown;
|
|
47
51
|
server: {
|
|
48
|
-
elicitInput(params: AskUserQuestionsElicitRequest | ElicitRequestFormParams, options?:
|
|
52
|
+
elicitInput(params: AskUserQuestionsElicitRequest | ElicitRequestFormParams, options?: ElicitRequestOptions): Promise<AskUserQuestionsElicitResult>;
|
|
49
53
|
};
|
|
50
54
|
connect(transport: unknown): Promise<void>;
|
|
51
55
|
close(): Promise<void>;
|
|
@@ -141,7 +145,7 @@ export declare function formatAskUserQuestionsTimeoutMessage(err: unknown): stri
|
|
|
141
145
|
*/
|
|
142
146
|
export declare function buildAskUserQuestionsRoundResult(questions: AskUserQuestion[], result: AskUserQuestionsElicitResult): AskUserQuestionsRoundResult;
|
|
143
147
|
interface AskUserQuestionsHandlerDeps {
|
|
144
|
-
elicitInput(params: AskUserQuestionsElicitRequest): Promise<AskUserQuestionsElicitResult>;
|
|
148
|
+
elicitInput(params: AskUserQuestionsElicitRequest, options?: ElicitRequestOptions): Promise<AskUserQuestionsElicitResult>;
|
|
145
149
|
isRemoteConfigured(): boolean;
|
|
146
150
|
tryRemoteQuestions(questions: AskUserQuestion[], signal?: AbortSignal): Promise<RemoteToolResult | null>;
|
|
147
151
|
writeGate?: AskUserQuestionsWriteGateModule | null;
|
|
@@ -151,15 +155,24 @@ interface AskUserQuestionsHandlerDeps {
|
|
|
151
155
|
* Detect an elicitation-side timeout error so the handler returns a clean
|
|
152
156
|
* "timed_out" result rather than a raw error the model will retry.
|
|
153
157
|
*
|
|
154
|
-
* The
|
|
155
|
-
* (`MCP error -32001: Request timed out`); `withElicitTimeout` enforces
|
|
156
|
-
*
|
|
158
|
+
* The MCP SDK surfaces request deadline expiry as
|
|
159
|
+
* (`MCP error -32001: Request timed out`); `withElicitTimeout` also enforces
|
|
160
|
+
* the 10-minute user window (`… timed out after … minutes`). Both surface as
|
|
157
161
|
* elicitation fallback errors that should never become a raw `errorContent`
|
|
158
162
|
* response — without recognition they re-throw, skip
|
|
159
163
|
* `recordAskUserQuestionsGateResult`, leave the depth-verification gate
|
|
160
164
|
* pending, and the model loops on the blocked call (#852).
|
|
161
165
|
*/
|
|
162
166
|
export declare function isLocalElicitTimeoutError(err: unknown): boolean;
|
|
167
|
+
/**
|
|
168
|
+
* Detect a client-side cancellation of the tools/call. `withElicitTimeout`
|
|
169
|
+
* rejects with `<label> cancelled by client` when the tool-call AbortSignal
|
|
170
|
+
* fires. This is the caller tearing down the request, not a channel failure,
|
|
171
|
+
* so the handler must return a clean cancelled result rather than re-throwing
|
|
172
|
+
* into a raw `isError` response that skips `recordAskUserQuestionsGateResult`
|
|
173
|
+
* and leaves the depth-verification gate pending with no cancellation signal.
|
|
174
|
+
*/
|
|
175
|
+
export declare function isLocalElicitClientAbortError(err: unknown): boolean;
|
|
163
176
|
export declare function askUserQuestionsHandler(questions: AskUserQuestion[], extra: McpToolExtra | undefined, deps: AskUserQuestionsHandlerDeps): Promise<ToolContent>;
|
|
164
177
|
export type ElicitInputFn = (params: {
|
|
165
178
|
message: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAmF9D;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,KAAK,EAAE,MAAM,EACb,SAAS,SAAoB,EAC7B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,CAAC,CAAC,CA8BZ;AA6KD,UAAU,uBAAuB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE;QACf,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACpD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAED,UAAU,iBAAiB;IACzB,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,GACjF,OAAO,CAAC;IACX,MAAM,EAAE;QACN,WAAW,CACT,MAAM,EAAE,6BAA6B,GAAG,uBAAuB,EAC/D,OAAO,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -481,9 +481,9 @@ async function recordAskUserQuestionsGateResult(structured, deps) {
|
|
|
481
481
|
* Detect an elicitation-side timeout error so the handler returns a clean
|
|
482
482
|
* "timed_out" result rather than a raw error the model will retry.
|
|
483
483
|
*
|
|
484
|
-
* The
|
|
485
|
-
* (`MCP error -32001: Request timed out`); `withElicitTimeout` enforces
|
|
486
|
-
*
|
|
484
|
+
* The MCP SDK surfaces request deadline expiry as
|
|
485
|
+
* (`MCP error -32001: Request timed out`); `withElicitTimeout` also enforces
|
|
486
|
+
* the 10-minute user window (`… timed out after … minutes`). Both surface as
|
|
487
487
|
* elicitation fallback errors that should never become a raw `errorContent`
|
|
488
488
|
* response — without recognition they re-throw, skip
|
|
489
489
|
* `recordAskUserQuestionsGateResult`, leave the depth-verification gate
|
|
@@ -497,9 +497,24 @@ export function isLocalElicitTimeoutError(err) {
|
|
|
497
497
|
message.includes('request timed out') ||
|
|
498
498
|
message.includes('timed out after'));
|
|
499
499
|
}
|
|
500
|
+
/**
|
|
501
|
+
* Detect a client-side cancellation of the tools/call. `withElicitTimeout`
|
|
502
|
+
* rejects with `<label> cancelled by client` when the tool-call AbortSignal
|
|
503
|
+
* fires. This is the caller tearing down the request, not a channel failure,
|
|
504
|
+
* so the handler must return a clean cancelled result rather than re-throwing
|
|
505
|
+
* into a raw `isError` response that skips `recordAskUserQuestionsGateResult`
|
|
506
|
+
* and leaves the depth-verification gate pending with no cancellation signal.
|
|
507
|
+
*/
|
|
508
|
+
export function isLocalElicitClientAbortError(err) {
|
|
509
|
+
if (!(err instanceof Error))
|
|
510
|
+
return false;
|
|
511
|
+
return err.message.toLowerCase().includes('cancelled by client');
|
|
512
|
+
}
|
|
500
513
|
function isLocalElicitFallbackError(err) {
|
|
501
514
|
if (isLocalElicitTimeoutError(err))
|
|
502
515
|
return true;
|
|
516
|
+
if (isLocalElicitClientAbortError(err))
|
|
517
|
+
return true;
|
|
503
518
|
if (!(err instanceof Error))
|
|
504
519
|
return false;
|
|
505
520
|
const message = err.message.toLowerCase();
|
|
@@ -537,8 +552,12 @@ export async function askUserQuestionsHandler(questions, extra, deps) {
|
|
|
537
552
|
// depth-verification gate when the user is sitting in front of the host.
|
|
538
553
|
let localElicitError;
|
|
539
554
|
let localElicitTimedOut = false;
|
|
555
|
+
let localElicitCancelledByClient = false;
|
|
540
556
|
try {
|
|
541
|
-
const elicitation = await withElicitTimeout(deps.elicitInput(buildAskUserQuestionsElicitRequest(questions)
|
|
557
|
+
const elicitation = await withElicitTimeout(deps.elicitInput(buildAskUserQuestionsElicitRequest(questions), {
|
|
558
|
+
timeout: ELICIT_TIMEOUT_MS,
|
|
559
|
+
...(extra?.signal ? { signal: extra.signal } : {}),
|
|
560
|
+
}), 'ask_user_questions', undefined, extra?.signal);
|
|
542
561
|
if (elicitation.action === 'accept' && elicitation.content) {
|
|
543
562
|
const structured = {
|
|
544
563
|
questions,
|
|
@@ -563,6 +582,12 @@ export async function askUserQuestionsHandler(questions, extra, deps) {
|
|
|
563
582
|
if (isLocalElicitTimeoutError(err)) {
|
|
564
583
|
localElicitTimedOut = true;
|
|
565
584
|
}
|
|
585
|
+
else if (isLocalElicitClientAbortError(err)) {
|
|
586
|
+
// The caller aborted the tools/call. Handled below (do not fall
|
|
587
|
+
// through to remote; the signal is already aborted and no one is
|
|
588
|
+
// there to answer it either).
|
|
589
|
+
localElicitCancelledByClient = true;
|
|
590
|
+
}
|
|
566
591
|
else {
|
|
567
592
|
console.warn(`[gsd:mcp] ask_user_questions local elicitation unavailable; trying remote fallback: ${formatErrorMessage(err)}`);
|
|
568
593
|
}
|
|
@@ -583,6 +608,22 @@ export async function askUserQuestionsHandler(questions, extra, deps) {
|
|
|
583
608
|
structuredContent: timedOutStructured,
|
|
584
609
|
};
|
|
585
610
|
}
|
|
611
|
+
// Client aborted the tools/call. Do not fall through to remote (the signal
|
|
612
|
+
// is already aborted and no one is there to answer). Return a clean
|
|
613
|
+
// `cancelled` result so the gate hook sees a cancellation (gate stays
|
|
614
|
+
// pending, model re-asks) instead of a raw `isError` that skips the gate
|
|
615
|
+
// result recording entirely.
|
|
616
|
+
if (localElicitCancelledByClient) {
|
|
617
|
+
const cancelledStructured = {
|
|
618
|
+
questions,
|
|
619
|
+
response: null,
|
|
620
|
+
cancelled: true,
|
|
621
|
+
};
|
|
622
|
+
return {
|
|
623
|
+
content: [{ type: 'text', text: 'ask_user_questions was cancelled by the client' }],
|
|
624
|
+
structuredContent: cancelledStructured,
|
|
625
|
+
};
|
|
626
|
+
}
|
|
586
627
|
// Local cancelled / unavailable — fall back to the configured remote
|
|
587
628
|
// channel (Discord, Slack, Telegram) if one is set.
|
|
588
629
|
if (deps.isRemoteConfigured()) {
|
|
@@ -931,7 +972,7 @@ export async function createMcpServer(sessionManager) {
|
|
|
931
972
|
}, async (args, extra) => {
|
|
932
973
|
const { questions } = args;
|
|
933
974
|
return askUserQuestionsHandler(questions, extra, {
|
|
934
|
-
elicitInput: (params) => server.server.elicitInput(params),
|
|
975
|
+
elicitInput: (params, options) => server.server.elicitInput(params, options),
|
|
935
976
|
isRemoteConfigured,
|
|
936
977
|
tryRemoteQuestions,
|
|
937
978
|
});
|