gsd-pi 2.74.0-dev.b741afb → 2.74.0-dev.ffbcc03
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/extensions/gsd/activity-log.js +16 -0
- package/dist/resources/extensions/gsd/auto/loop.js +147 -10
- package/dist/resources/extensions/gsd/auto/phases.js +113 -3
- package/dist/resources/extensions/gsd/auto/session.js +10 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +11 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +51 -5
- package/dist/resources/extensions/gsd/auto-post-unit.js +215 -8
- package/dist/resources/extensions/gsd/auto-recovery.js +24 -10
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
- package/dist/resources/extensions/gsd/auto-verification.js +100 -2
- package/dist/resources/extensions/gsd/auto.js +28 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +10 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +61 -9
- package/dist/resources/extensions/gsd/cache.js +16 -5
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +14 -1
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
- package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
- package/dist/resources/extensions/gsd/git-service.js +49 -1
- package/dist/resources/extensions/gsd/graph-context.js +98 -7
- package/dist/resources/extensions/gsd/gsd-db.js +260 -2
- package/dist/resources/extensions/gsd/guided-flow.js +24 -1
- package/dist/resources/extensions/gsd/init-wizard.js +1 -0
- package/dist/resources/extensions/gsd/journal.js +27 -0
- package/dist/resources/extensions/gsd/metrics.js +19 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
- package/dist/resources/extensions/gsd/preferences-models.js +20 -3
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +108 -2
- package/dist/resources/extensions/gsd/preferences.js +26 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +15 -30
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +5 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
- package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
- package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
- package/dist/resources/extensions/gsd/uok/audit.js +40 -0
- package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
- package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
- package/dist/resources/extensions/gsd/uok/flags.js +29 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
- package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
- package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
- package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
- 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 +9 -9
- 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/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +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 +9 -9
- package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- 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/package.json +1 -1
- package/packages/mcp-server/dist/readers/graph.d.ts +1 -1
- package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -1
- package/packages/mcp-server/dist/readers/graph.js +107 -0
- package/packages/mcp-server/dist/readers/graph.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +88 -6
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/readers/graph.test.ts +178 -0
- package/packages/mcp-server/src/readers/graph.ts +148 -1
- package/packages/mcp-server/src/workflow-tools.ts +95 -10
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/index.d.ts +1 -9
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -9
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/capability-patches.js +36 -0
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
- package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
- package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
- package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
- package/packages/pi-ai/dist/models/custom.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
- package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
- package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
- package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google.js +464 -0
- package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
- package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/groq.js +311 -0
- package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
- package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
- package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
- package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
- package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
- package/packages/pi-ai/dist/models/generated/index.js +51 -0
- package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
- package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
- package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
- package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai.js +702 -0
- package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
- package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
- package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
- package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/xai.js +413 -0
- package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
- package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/zai.js +239 -0
- package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
- package/packages/pi-ai/dist/models/index.d.ts +27 -0
- package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/index.js +80 -0
- package/packages/pi-ai/dist/models/index.js.map +1 -0
- package/packages/pi-ai/dist/models.d.ts +1 -36
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +1 -2
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/models.js +3 -112
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +6 -5
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +74 -40
- package/packages/pi-ai/src/index.ts +1 -9
- package/packages/pi-ai/src/models/capability-patches.ts +40 -0
- package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
- package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
- package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
- package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
- package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
- package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
- package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
- package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
- package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
- package/packages/pi-ai/src/models/generated/google.ts +466 -0
- package/packages/pi-ai/src/models/generated/groq.ts +313 -0
- package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
- package/packages/pi-ai/src/models/generated/index.ts +52 -0
- package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
- package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
- package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
- package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
- package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
- package/packages/pi-ai/src/models/generated/openai.ts +704 -0
- package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
- package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
- package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
- package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
- package/packages/pi-ai/src/models/generated/xai.ts +415 -0
- package/packages/pi-ai/src/models/generated/zai.ts +241 -0
- package/packages/pi-ai/src/models/index.ts +106 -0
- package/packages/pi-ai/src/models.generated.test.ts +1 -2
- package/packages/pi-ai/src/models.test.ts +6 -5
- package/packages/pi-ai/src/models.ts +3 -153
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +23 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +47 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +8 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +68 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +232 -18
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +14 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +70 -6
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -0
- package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +67 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +83 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +92 -6
- package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
- package/packages/pi-coding-agent/tsconfig.json +2 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/src/resources/extensions/gsd/activity-log.ts +21 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +4 -0
- package/src/resources/extensions/gsd/auto/loop.ts +159 -10
- package/src/resources/extensions/gsd/auto/phases.ts +123 -3
- package/src/resources/extensions/gsd/auto/session.ts +10 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
- package/src/resources/extensions/gsd/auto-model-selection.ts +66 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +226 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +29 -9
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
- package/src/resources/extensions/gsd/auto-verification.ts +129 -2
- package/src/resources/extensions/gsd/auto.ts +34 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +72 -8
- package/src/resources/extensions/gsd/cache.ts +16 -5
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +14 -1
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
- package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
- package/src/resources/extensions/gsd/git-service.ts +68 -0
- package/src/resources/extensions/gsd/graph-context.ts +139 -12
- package/src/resources/extensions/gsd/gsd-db.ts +321 -3
- package/src/resources/extensions/gsd/guided-flow.ts +33 -1
- package/src/resources/extensions/gsd/init-wizard.ts +3 -2
- package/src/resources/extensions/gsd/journal.ts +30 -0
- package/src/resources/extensions/gsd/metrics.ts +26 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
- package/src/resources/extensions/gsd/preferences-models.ts +20 -3
- package/src/resources/extensions/gsd/preferences-types.ts +32 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +107 -2
- package/src/resources/extensions/gsd/preferences.ts +28 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +15 -31
- package/src/resources/extensions/gsd/session-lock.ts +14 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +177 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +272 -0
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -5
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +9 -2
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
- package/src/resources/extensions/gsd/types.ts +14 -1
- package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
- package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
- package/src/resources/extensions/gsd/uok/audit.ts +51 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
- package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
- package/src/resources/extensions/gsd/uok/flags.ts +45 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
- package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
- package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
- package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
- package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
- package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
- package/packages/pi-ai/dist/models.custom.js.map +0 -1
- package/packages/pi-ai/dist/models.generated.js +0 -14343
- package/packages/pi-ai/dist/models.generated.js.map +0 -1
- package/packages/pi-ai/src/models.generated.ts +0 -14345
- /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → kn6xzWKYnogsxp2b6RpDD}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{XnHY5eXUsTCFmNodWHetD → kn6xzWKYnogsxp2b6RpDD}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/user-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAsB,MAAM,
|
|
1
|
+
{"version":3,"file":"user-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/user-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAsB,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAC3C,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAIlD,YAAY,IAAY,EAAE,gBAA+B,gBAAgB,EAAE,EAAE,SAAkB,EAAE,kBAAmC,eAAe;QAClJ,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;IACxD,CAAC;IAEQ,MAAM,CAAC,KAAa;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE;YACjD,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,aAAa,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QACf,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC;QAC5B,MAAM,cAAc,GAAG,CAAC,CAAC;QACzB,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACrC,GAAG,CAAC,cAAc,CAAC,GAAG,iBAAiB,GAAG,GAAG,CAAC,cAAc,CAAC,CAAC;QAC9D,GAAG,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,eAAe,CAAC;QAC1D,OAAO,GAAG,CAAC;IACZ,CAAC;CACD","sourcesContent":["import { Container, Markdown, type MarkdownTheme } from \"@gsd/pi-tui\";\nimport { getMarkdownTheme } from \"../theme/theme.js\";\nimport { type TimestampFormat } from \"./timestamp.js\";\nimport { renderChatFrame } from \"./chat-frame.js\";\n\nconst OSC133_ZONE_START = \"\\x1b]133;A\\x07\";\nconst OSC133_ZONE_END = \"\\x1b]133;B\\x07\";\n\n/**\n * Component that renders a user message with a right-aligned timestamp.\n */\nexport class UserMessageComponent extends Container {\n\tprivate timestamp: number | undefined;\n\tprivate timestampFormat: TimestampFormat;\n\n\tconstructor(text: string, markdownTheme: MarkdownTheme = getMarkdownTheme(), timestamp?: number, timestampFormat: TimestampFormat = \"date-time-iso\") {\n\t\tsuper();\n\t\tthis.timestamp = timestamp;\n\t\tthis.timestampFormat = timestampFormat;\n\t\tthis.addChild(new Markdown(text, 0, 0, markdownTheme));\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst frameWidth = Math.max(20, width);\n\t\tconst contentWidth = Math.max(1, frameWidth - 4);\n\t\tconst lines = super.render(contentWidth);\n\t\tconst framed = renderChatFrame(lines, frameWidth, {\n\t\t\tlabel: \"You\",\n\t\t\ttone: \"user\",\n\t\t\ttimestamp: this.timestamp,\n\t\t\ttimestampFormat: this.timestampFormat,\n\t\t\tshowTimestamp: true,\n\t\t});\n\t\tif (framed.length === 0) {\n\t\t\treturn framed;\n\t\t}\n\t\tconst out = [\"\", ...framed];\n\t\tconst firstFrameLine = 1;\n\t\tconst lastFrameLine = out.length - 1;\n\t\tout[firstFrameLine] = OSC133_ZONE_START + out[firstFrameLine];\n\t\tout[lastFrameLine] = out[lastFrameLine] + OSC133_ZONE_END;\n\t\treturn out;\n\t}\n}\n"]}
|
package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-controller.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/controllers/chat-controller.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-controller.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/controllers/chat-controller.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AA+CnG,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAgBxE;AAWD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,wBAAwB,GAAG;IACvE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,4BAA4B,EAAE,MAAM,GAAG,CAAC;IACxC,gBAAgB,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACxD,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;IACpD,2BAA2B,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,CAAC;IACvD,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,oBAAoB,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,4BAA4B,EAAE,MAAM,IAAI,CAAC;IACzC,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,wBAAwB,EAAE;QAAE,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;CAChD,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8zB7C"}
|
|
@@ -10,6 +10,10 @@ let lastProcessedContentIndex = 0;
|
|
|
10
10
|
// the assistant content array for a new provider sub-turn within one lifecycle.
|
|
11
11
|
let lastContentLength = 0;
|
|
12
12
|
let renderedSegments = [];
|
|
13
|
+
// When providers reuse one assistant lifecycle across internal sub-turns,
|
|
14
|
+
// a content[] shrink resets renderedSegments. Keep the displaced segments so
|
|
15
|
+
// claude-code MCP pruning can remove stale provisional text later.
|
|
16
|
+
let orphanedSegments = [];
|
|
13
17
|
function hasVisibleAssistantContent(message) {
|
|
14
18
|
return message.content.some((c) => (c.type === "text" && typeof c.text === "string" && c.text.trim().length > 0)
|
|
15
19
|
|| (c.type === "thinking" && typeof c.thinking === "string" && c.thinking.trim().length > 0));
|
|
@@ -51,6 +55,7 @@ export async function handleAgentEvent(host, event) {
|
|
|
51
55
|
await host.init();
|
|
52
56
|
}
|
|
53
57
|
host.footer.invalidate();
|
|
58
|
+
const timestampFormat = host.settingsManager.getTimestampFormat();
|
|
54
59
|
// Reset content index tracker and pinned state when a new assistant message starts
|
|
55
60
|
if (event.type === "message_start" && event.message.role === "assistant") {
|
|
56
61
|
lastProcessedContentIndex = 0;
|
|
@@ -58,6 +63,7 @@ export async function handleAgentEvent(host, event) {
|
|
|
58
63
|
lastPinnedText = "";
|
|
59
64
|
hasToolsInTurn = false;
|
|
60
65
|
renderedSegments = [];
|
|
66
|
+
orphanedSegments = [];
|
|
61
67
|
if (pinnedBorder)
|
|
62
68
|
pinnedBorder.stopSpinner();
|
|
63
69
|
pinnedBorder = undefined;
|
|
@@ -78,6 +84,7 @@ export async function handleAgentEvent(host, event) {
|
|
|
78
84
|
lastPinnedText = "";
|
|
79
85
|
hasToolsInTurn = false;
|
|
80
86
|
renderedSegments = [];
|
|
87
|
+
orphanedSegments = [];
|
|
81
88
|
lastContentLength = 0;
|
|
82
89
|
if (pinnedBorder)
|
|
83
90
|
pinnedBorder.stopSpinner();
|
|
@@ -184,6 +191,10 @@ export async function handleAgentEvent(host, event) {
|
|
|
184
191
|
// content (#4144 regression). Prior sub-turn children stay in
|
|
185
192
|
// chatContainer as frozen history; new segments append after them.
|
|
186
193
|
if (contentBlocks.length < lastContentLength) {
|
|
194
|
+
// Accumulate across successive shrinks — overwriting would drop
|
|
195
|
+
// segments displaced by an earlier shrink, leaving them stranded
|
|
196
|
+
// in chatContainer once the prune pass finally runs.
|
|
197
|
+
orphanedSegments = [...orphanedSegments, ...renderedSegments];
|
|
187
198
|
renderedSegments = [];
|
|
188
199
|
lastPinnedText = "";
|
|
189
200
|
lastProcessedContentIndex = 0;
|
|
@@ -251,28 +262,119 @@ export async function handleAgentEvent(host, event) {
|
|
|
251
262
|
// Build desired segment plan from content[].
|
|
252
263
|
{
|
|
253
264
|
const blocks = host.streamingMessage.content;
|
|
265
|
+
const isClaudeCodeProvider = host.streamingMessage.provider === "claude-code";
|
|
266
|
+
const hasMcpToolBlock = blocks.some((b) => {
|
|
267
|
+
if (b?.type === "toolCall") {
|
|
268
|
+
return typeof b?.mcpServer === "string" || String(b?.name ?? "").startsWith("mcp__");
|
|
269
|
+
}
|
|
270
|
+
if (b?.type === "serverToolUse") {
|
|
271
|
+
return typeof b?.mcpServer === "string" || String(b?.name ?? "").startsWith("mcp__");
|
|
272
|
+
}
|
|
273
|
+
return false;
|
|
274
|
+
});
|
|
275
|
+
const firstToolIdx = blocks.findIndex((b) => b.type === "toolCall" || b.type === "serverToolUse");
|
|
276
|
+
const hasPostToolText = firstToolIdx >= 0
|
|
277
|
+
&& blocks.some((b, idx) => (idx > firstToolIdx
|
|
278
|
+
&& b?.type === "text"
|
|
279
|
+
&& typeof b?.text === "string"
|
|
280
|
+
&& b.text.trim().length > 0));
|
|
281
|
+
// Only prune provisional pre-tool prose after post-tool prose exists,
|
|
282
|
+
// so MCP tool-only windows do not blank the assistant content.
|
|
283
|
+
const shouldDropPreToolProse = isClaudeCodeProvider && hasMcpToolBlock && hasPostToolText;
|
|
254
284
|
const desired = [];
|
|
255
285
|
let runStart = -1;
|
|
286
|
+
let runEnd = -1;
|
|
287
|
+
let runType;
|
|
288
|
+
const closeRun = () => {
|
|
289
|
+
if (runStart !== -1 && runType) {
|
|
290
|
+
desired.push({ kind: "text-run", startIndex: runStart, endIndex: runEnd, contentType: runType });
|
|
291
|
+
runStart = -1;
|
|
292
|
+
runEnd = -1;
|
|
293
|
+
runType = undefined;
|
|
294
|
+
}
|
|
295
|
+
};
|
|
256
296
|
for (let i = 0; i < blocks.length; i++) {
|
|
257
297
|
const b = blocks[i];
|
|
258
|
-
const
|
|
298
|
+
const blockType = b.type === "text" || b.type === "thinking" ? b.type : undefined;
|
|
299
|
+
const isTextLike = blockType === "text" || blockType === "thinking";
|
|
259
300
|
const isTool = b.type === "toolCall" || b.type === "serverToolUse";
|
|
260
|
-
|
|
261
|
-
|
|
301
|
+
// For Claude Code MCP turns, prune only pre-tool prose, never thinking.
|
|
302
|
+
const textValue = blockType === "text" && typeof b?.text === "string" ? b.text : "";
|
|
303
|
+
const isLikelyQuestion = blockType === "text" && typeof textValue === "string" && /\?\s*$/.test(textValue.trim());
|
|
304
|
+
const shouldSkipProse = shouldDropPreToolProse
|
|
305
|
+
&& firstToolIdx >= 0
|
|
306
|
+
&& i < firstToolIdx
|
|
307
|
+
&& blockType === "text"
|
|
308
|
+
&& !isLikelyQuestion;
|
|
309
|
+
if (shouldSkipProse) {
|
|
310
|
+
closeRun();
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (isTextLike) {
|
|
314
|
+
if (runStart === -1) {
|
|
262
315
|
runStart = i;
|
|
316
|
+
runEnd = i;
|
|
317
|
+
runType = blockType;
|
|
318
|
+
}
|
|
319
|
+
else if (runType !== blockType) {
|
|
320
|
+
closeRun();
|
|
321
|
+
runStart = i;
|
|
322
|
+
runEnd = i;
|
|
323
|
+
runType = blockType;
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
runEnd = i;
|
|
327
|
+
}
|
|
263
328
|
}
|
|
264
329
|
else {
|
|
265
|
-
|
|
266
|
-
desired.push({ kind: "text-run", startIndex: runStart, endIndex: i - 1 });
|
|
267
|
-
runStart = -1;
|
|
268
|
-
}
|
|
330
|
+
closeRun();
|
|
269
331
|
if (isTool) {
|
|
270
332
|
desired.push({ kind: "tool", contentIndex: i, toolId: b.id });
|
|
271
333
|
}
|
|
272
334
|
}
|
|
273
335
|
}
|
|
274
|
-
|
|
275
|
-
|
|
336
|
+
closeRun();
|
|
337
|
+
// Claude Code MCP can emit provisional pre-tool prose that gets
|
|
338
|
+
// superseded by post-tool output. Prune stale text-run segments so
|
|
339
|
+
// the final assistant output remains below tool output.
|
|
340
|
+
if (shouldDropPreToolProse && firstToolIdx >= 0) {
|
|
341
|
+
if (orphanedSegments.length > 0) {
|
|
342
|
+
const remainingOrphans = [];
|
|
343
|
+
for (const orphan of orphanedSegments) {
|
|
344
|
+
if (orphan.kind === "text-run" && orphan.contentType === "text") {
|
|
345
|
+
host.chatContainer.removeChild(orphan.component);
|
|
346
|
+
if (host.streamingComponent === orphan.component) {
|
|
347
|
+
host.streamingComponent = undefined;
|
|
348
|
+
}
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
remainingOrphans.push(orphan);
|
|
352
|
+
}
|
|
353
|
+
orphanedSegments = remainingOrphans;
|
|
354
|
+
}
|
|
355
|
+
const desiredTextKeys = new Set(desired
|
|
356
|
+
.filter((seg) => seg.kind === "text-run")
|
|
357
|
+
.map((seg) => `${seg.contentType}:${seg.startIndex}`));
|
|
358
|
+
const desiredToolIndices = new Set(desired
|
|
359
|
+
.filter((seg) => seg.kind === "tool")
|
|
360
|
+
.map((seg) => seg.contentIndex));
|
|
361
|
+
const nextRendered = [];
|
|
362
|
+
for (const seg of renderedSegments) {
|
|
363
|
+
if (seg.kind === "text-run"
|
|
364
|
+
&& seg.contentType === "text"
|
|
365
|
+
&& !desiredTextKeys.has(`${seg.contentType}:${seg.startIndex}`)) {
|
|
366
|
+
host.chatContainer.removeChild(seg.component);
|
|
367
|
+
if (host.streamingComponent === seg.component) {
|
|
368
|
+
host.streamingComponent = undefined;
|
|
369
|
+
}
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
if (seg.kind === "tool" && !desiredToolIndices.has(seg.contentIndex)) {
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
nextRendered.push(seg);
|
|
376
|
+
}
|
|
377
|
+
renderedSegments = nextRendered;
|
|
276
378
|
}
|
|
277
379
|
// Append any newly needed segments (never reorder existing ones).
|
|
278
380
|
for (const seg of desired) {
|
|
@@ -289,11 +391,17 @@ export async function handleAgentEvent(host, event) {
|
|
|
289
391
|
}
|
|
290
392
|
else {
|
|
291
393
|
// text-run segment
|
|
292
|
-
const existing = renderedSegments.find((s) => s.kind === "text-run" && s.startIndex === seg.startIndex);
|
|
394
|
+
const existing = renderedSegments.find((s) => s.kind === "text-run" && s.startIndex === seg.startIndex && s.contentType === seg.contentType);
|
|
293
395
|
if (!existing) {
|
|
294
|
-
const comp = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(),
|
|
396
|
+
const comp = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(), timestampFormat, { startIndex: seg.startIndex, endIndex: seg.endIndex });
|
|
295
397
|
host.chatContainer.addChild(comp);
|
|
296
|
-
renderedSegments.push({
|
|
398
|
+
renderedSegments.push({
|
|
399
|
+
kind: "text-run",
|
|
400
|
+
startIndex: seg.startIndex,
|
|
401
|
+
endIndex: seg.endIndex,
|
|
402
|
+
contentType: seg.contentType,
|
|
403
|
+
component: comp,
|
|
404
|
+
});
|
|
297
405
|
host.streamingComponent = comp;
|
|
298
406
|
}
|
|
299
407
|
}
|
|
@@ -303,7 +411,7 @@ export async function handleAgentEvent(host, event) {
|
|
|
303
411
|
for (const seg of renderedSegments) {
|
|
304
412
|
if (seg.kind === "text-run") {
|
|
305
413
|
// Find corresponding desired segment to get current endIndex
|
|
306
|
-
const d = desired.find((ds) => ds.kind === "text-run" && ds.startIndex === seg.startIndex);
|
|
414
|
+
const d = desired.find((ds) => ds.kind === "text-run" && ds.startIndex === seg.startIndex && ds.contentType === seg.contentType);
|
|
307
415
|
if (d && d.kind === "text-run" && d.endIndex !== seg.endIndex) {
|
|
308
416
|
seg.endIndex = d.endIndex;
|
|
309
417
|
seg.component.setRange({ startIndex: seg.startIndex, endIndex: seg.endIndex });
|
|
@@ -379,8 +487,109 @@ export async function handleAgentEvent(host, event) {
|
|
|
379
487
|
const shouldRenderAssistant = hasVisibleAssistantContent(host.streamingMessage)
|
|
380
488
|
|| ((host.streamingMessage.stopReason === "aborted" || host.streamingMessage.stopReason === "error")
|
|
381
489
|
&& !hasAssistantToolBlocks(host.streamingMessage));
|
|
490
|
+
// The final message_end payload can contain additional text/thinking
|
|
491
|
+
// blocks that never arrived via message_update (e.g. SDK result
|
|
492
|
+
// aggregation). Rebuild this in-flight turn from final content so
|
|
493
|
+
// ranges/components don't keep stale partial indices.
|
|
494
|
+
if (renderedSegments.length > 0) {
|
|
495
|
+
const finalBlocks = host.streamingMessage.content;
|
|
496
|
+
const desired = [];
|
|
497
|
+
let runStart = -1;
|
|
498
|
+
let runEnd = -1;
|
|
499
|
+
let runType;
|
|
500
|
+
const closeRun = () => {
|
|
501
|
+
if (runStart !== -1 && runType) {
|
|
502
|
+
desired.push({ kind: "text-run", startIndex: runStart, endIndex: runEnd, contentType: runType });
|
|
503
|
+
runStart = -1;
|
|
504
|
+
runEnd = -1;
|
|
505
|
+
runType = undefined;
|
|
506
|
+
}
|
|
507
|
+
};
|
|
508
|
+
for (let i = 0; i < finalBlocks.length; i++) {
|
|
509
|
+
const block = finalBlocks[i];
|
|
510
|
+
const blockType = block?.type === "text" || block?.type === "thinking" ? block.type : undefined;
|
|
511
|
+
const isTextLike = blockType === "text" || blockType === "thinking";
|
|
512
|
+
const isTool = block?.type === "toolCall" || block?.type === "serverToolUse";
|
|
513
|
+
if (isTextLike) {
|
|
514
|
+
if (runStart === -1) {
|
|
515
|
+
runStart = i;
|
|
516
|
+
runEnd = i;
|
|
517
|
+
runType = blockType;
|
|
518
|
+
}
|
|
519
|
+
else if (runType !== blockType) {
|
|
520
|
+
closeRun();
|
|
521
|
+
runStart = i;
|
|
522
|
+
runEnd = i;
|
|
523
|
+
runType = blockType;
|
|
524
|
+
}
|
|
525
|
+
else {
|
|
526
|
+
runEnd = i;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
closeRun();
|
|
531
|
+
if (isTool) {
|
|
532
|
+
desired.push({ kind: "tool", contentIndex: i, toolId: block.id });
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
closeRun();
|
|
537
|
+
const toolComponentsById = new Map();
|
|
538
|
+
for (const [toolId, component] of host.pendingTools.entries()) {
|
|
539
|
+
toolComponentsById.set(toolId, component);
|
|
540
|
+
}
|
|
541
|
+
for (const seg of renderedSegments) {
|
|
542
|
+
host.chatContainer.removeChild(seg.component);
|
|
543
|
+
if (seg.kind === "tool") {
|
|
544
|
+
const priorBlocks = host.streamingMessage.content;
|
|
545
|
+
const priorBlock = priorBlocks[seg.contentIndex];
|
|
546
|
+
if (priorBlock?.id && !toolComponentsById.has(priorBlock.id)) {
|
|
547
|
+
toolComponentsById.set(priorBlock.id, seg.component);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
renderedSegments = [];
|
|
552
|
+
host.streamingComponent = undefined;
|
|
553
|
+
for (const seg of desired) {
|
|
554
|
+
if (seg.kind === "tool") {
|
|
555
|
+
const finalBlock = finalBlocks[seg.contentIndex];
|
|
556
|
+
let component = toolComponentsById.get(seg.toolId);
|
|
557
|
+
if (!component && finalBlock?.id) {
|
|
558
|
+
component = host.pendingTools.get(finalBlock.id);
|
|
559
|
+
}
|
|
560
|
+
if (!component && finalBlock?.type === "toolCall") {
|
|
561
|
+
component = new ToolExecutionComponent(finalBlock.name, finalBlock.arguments, { showImages: host.settingsManager.getShowImages() }, host.getRegisteredToolDefinition(finalBlock.name), host.ui);
|
|
562
|
+
component.setExpanded(host.toolOutputExpanded);
|
|
563
|
+
host.pendingTools.set(finalBlock.id, component);
|
|
564
|
+
toolComponentsById.set(finalBlock.id, component);
|
|
565
|
+
}
|
|
566
|
+
else if (!component && finalBlock?.type === "serverToolUse") {
|
|
567
|
+
component = new ToolExecutionComponent(finalBlock.name, finalBlock.input ?? {}, { showImages: host.settingsManager.getShowImages() }, undefined, host.ui);
|
|
568
|
+
component.setExpanded(host.toolOutputExpanded);
|
|
569
|
+
host.pendingTools.set(finalBlock.id, component);
|
|
570
|
+
toolComponentsById.set(finalBlock.id, component);
|
|
571
|
+
}
|
|
572
|
+
if (component) {
|
|
573
|
+
host.chatContainer.addChild(component);
|
|
574
|
+
renderedSegments.push({ kind: "tool", contentIndex: seg.contentIndex, component });
|
|
575
|
+
}
|
|
576
|
+
continue;
|
|
577
|
+
}
|
|
578
|
+
const comp = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(), timestampFormat, { startIndex: seg.startIndex, endIndex: seg.endIndex });
|
|
579
|
+
comp.updateContent(host.streamingMessage);
|
|
580
|
+
host.chatContainer.addChild(comp);
|
|
581
|
+
renderedSegments.push({
|
|
582
|
+
kind: "text-run",
|
|
583
|
+
startIndex: seg.startIndex,
|
|
584
|
+
endIndex: seg.endIndex,
|
|
585
|
+
contentType: seg.contentType,
|
|
586
|
+
component: comp,
|
|
587
|
+
});
|
|
588
|
+
host.streamingComponent = comp;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
382
591
|
if (!host.streamingComponent && shouldRenderAssistant) {
|
|
383
|
-
host.streamingComponent = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(),
|
|
592
|
+
host.streamingComponent = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(), timestampFormat);
|
|
384
593
|
host.chatContainer.addChild(host.streamingComponent);
|
|
385
594
|
}
|
|
386
595
|
if (host.streamingComponent) {
|
|
@@ -409,6 +618,7 @@ export async function handleAgentEvent(host, event) {
|
|
|
409
618
|
host.streamingComponent = undefined;
|
|
410
619
|
host.streamingMessage = undefined;
|
|
411
620
|
renderedSegments = [];
|
|
621
|
+
orphanedSegments = [];
|
|
412
622
|
lastContentLength = 0;
|
|
413
623
|
// Clear pinned output once the message is finalized in the chat
|
|
414
624
|
// container — prevents duplicate display when the agent continues
|
|
@@ -456,11 +666,15 @@ export async function handleAgentEvent(host, event) {
|
|
|
456
666
|
host.loadingAnimation = undefined;
|
|
457
667
|
host.statusContainer.clear();
|
|
458
668
|
}
|
|
459
|
-
if (host.streamingComponent) {
|
|
460
|
-
host.
|
|
461
|
-
host.streamingComponent
|
|
462
|
-
host.streamingMessage = undefined;
|
|
669
|
+
if (host.streamingComponent && host.streamingMessage) {
|
|
670
|
+
host.streamingComponent.setShowMetadata(true);
|
|
671
|
+
host.streamingComponent.updateContent(host.streamingMessage);
|
|
463
672
|
}
|
|
673
|
+
host.streamingComponent = undefined;
|
|
674
|
+
host.streamingMessage = undefined;
|
|
675
|
+
renderedSegments = [];
|
|
676
|
+
orphanedSegments = [];
|
|
677
|
+
lastContentLength = 0;
|
|
464
678
|
host.pendingTools.clear();
|
|
465
679
|
// Pinned output is only useful while work is actively streaming.
|
|
466
680
|
// Keep chat history as the single source after completion.
|