lsd-pi 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +283 -648
- package/dist/cli-theme.d.ts +1 -1
- package/dist/cli-theme.js +4 -4
- package/dist/cli.js +2 -2
- package/dist/headless.js +4 -6
- package/dist/help-text.js +1 -3
- package/dist/loader.js +8 -7
- package/dist/logo.d.ts +9 -0
- package/dist/logo.js +18 -8
- package/dist/lsd-brand.d.ts +14 -0
- package/dist/lsd-brand.js +42 -0
- package/dist/onboarding.js +51 -0
- package/dist/resource-loader.d.ts +2 -3
- package/dist/resource-loader.js +18 -20
- package/dist/resources/agents/generic.md +29 -0
- package/dist/resources/agents/scout.md +1 -0
- package/dist/resources/extensions/ask-user-questions.js +0 -4
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +6 -0
- package/dist/resources/extensions/get-secrets-from-user.js +2 -3
- package/dist/resources/extensions/memory/auto-extract.js +154 -0
- package/dist/resources/extensions/memory/extension-manifest.json +11 -0
- package/dist/resources/extensions/memory/index.js +223 -0
- package/dist/resources/extensions/memory/memory-age.js +43 -0
- package/dist/resources/extensions/memory/memory-paths.js +49 -0
- package/dist/resources/extensions/memory/memory-recall.js +150 -0
- package/dist/resources/extensions/memory/memory-scan.js +90 -0
- package/dist/resources/extensions/memory/memory-types.js +96 -0
- package/dist/resources/extensions/remote-questions/config.js +3 -3
- package/dist/resources/extensions/remote-questions/extension-manifest.json +1 -1
- package/dist/resources/extensions/remote-questions/index.js +53 -0
- package/dist/resources/extensions/remote-questions/remote-command.js +4 -27
- package/dist/resources/extensions/remote-questions/telegram-adapter.js +6 -13
- package/dist/resources/extensions/remote-questions/telegram-live-relay.js +447 -0
- package/dist/resources/extensions/remote-questions/telegram-update-stream.js +67 -0
- package/dist/resources/extensions/search-the-web/native-search.js +1 -1
- package/dist/resources/extensions/search-the-web/provider.js +4 -12
- package/dist/resources/extensions/shared/debug-logger.js +103 -0
- package/dist/resources/extensions/shared/env-utils.js +17 -0
- package/dist/resources/extensions/shared/paths.js +17 -0
- package/dist/resources/extensions/shared/preferences.js +90 -0
- package/dist/resources/extensions/shared/remote-questions-config.js +27 -0
- package/dist/resources/extensions/shared/rtk-session-stats.js +2 -2
- package/dist/resources/extensions/shared/secrets-manifest.js +115 -0
- package/dist/resources/extensions/slash-commands/extension-manifest.json +2 -1
- package/dist/resources/extensions/slash-commands/index.js +2 -0
- package/dist/resources/extensions/slash-commands/plan.js +284 -0
- package/dist/resources/extensions/subagent/agents.js +1 -1
- package/dist/resources/extensions/subagent/approval-proxy.js +34 -0
- package/dist/resources/extensions/subagent/configured-model.js +9 -0
- package/dist/resources/extensions/subagent/index.js +95 -144
- package/dist/resources/extensions/subagent/model-resolution.js +12 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +1 -1
- package/dist/resources/skills/create-skill/SKILL.md +2 -2
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +8 -7
- package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
- package/dist/resources/skills/create-skill/workflows/create-new-skill.md +6 -5
- package/dist/shared-paths.d.ts +1 -0
- package/dist/shared-paths.js +17 -0
- package/dist/shared-preferences.d.ts +37 -0
- package/dist/shared-preferences.js +102 -0
- package/dist/welcome-screen.js +24 -18
- package/dist/worktree-cli.d.ts +4 -49
- package/dist/worktree-cli.js +197 -113
- package/package.json +6 -6
- package/packages/pi-coding-agent/dist/cli/args.d.ts +1 -1
- package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +13 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +35 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +24 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +8 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +77 -15
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +76 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/keybindings.js +2 -2
- package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +8 -8
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.js +59 -0
- package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +32 -14
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +13 -3
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +4 -6
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +18 -13
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tool-approval.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/tool-approval.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tool-approval.js +2 -0
- package/packages/pi-coding-agent/dist/core/tool-approval.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +1 -1
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +5 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +11 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +11 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +7 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +33 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -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 +129 -57
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.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 +12 -3
- 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.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +46 -6
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +28 -20
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/cli/args.ts +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +14 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +30 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +36 -0
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +9 -0
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +87 -0
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +84 -16
- package/packages/pi-coding-agent/src/core/keybindings.ts +2 -2
- package/packages/pi-coding-agent/src/core/package-manager.ts +8 -8
- package/packages/pi-coding-agent/src/core/resource-loader-lsd-md.test.ts +67 -0
- package/packages/pi-coding-agent/src/core/resource-loader.ts +32 -13
- package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -5
- package/packages/pi-coding-agent/src/core/skills.ts +20 -14
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -1
- package/packages/pi-coding-agent/src/core/tool-approval.js +111 -0
- package/packages/pi-coding-agent/src/core/tool-approval.ts +2 -1
- package/packages/pi-coding-agent/src/index.ts +2 -0
- package/packages/pi-coding-agent/src/main.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +14 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +11 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +40 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +135 -66
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +12 -3
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +70 -6
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +28 -20
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +28 -20
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/agents/generic.md +29 -0
- package/src/resources/agents/scout.md +1 -0
- package/src/resources/extensions/ask-user-questions.ts +0 -3
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +6 -0
- package/src/resources/extensions/cmux/index.ts +29 -10
- package/src/resources/extensions/get-secrets-from-user.ts +2 -4
- package/src/resources/extensions/gsd/tests/test-helpers.ts +44 -44
- package/src/resources/extensions/memory/auto-extract.ts +172 -0
- package/src/resources/extensions/memory/extension-manifest.json +11 -0
- package/src/resources/extensions/memory/index.ts +263 -0
- package/src/resources/extensions/memory/memory-age.ts +43 -0
- package/src/resources/extensions/memory/memory-paths.ts +55 -0
- package/src/resources/extensions/memory/memory-recall.ts +186 -0
- package/src/resources/extensions/memory/memory-scan.ts +118 -0
- package/src/resources/extensions/memory/memory-types.ts +106 -0
- package/src/resources/extensions/memory/tests/auto-extract.test.ts +141 -0
- package/src/resources/extensions/memory/tests/memory-age.test.ts +60 -0
- package/src/resources/extensions/memory/tests/memory-paths.test.ts +89 -0
- package/src/resources/extensions/memory/tests/memory-scan.test.ts +244 -0
- package/src/resources/extensions/remote-questions/config.ts +3 -3
- package/src/resources/extensions/remote-questions/extension-manifest.json +1 -1
- package/src/resources/extensions/remote-questions/index.ts +65 -0
- package/src/resources/extensions/remote-questions/remote-command.ts +4 -30
- package/src/resources/extensions/remote-questions/telegram-adapter.ts +6 -14
- package/src/resources/extensions/remote-questions/telegram-live-relay.ts +471 -0
- package/src/resources/extensions/remote-questions/telegram-update-stream.ts +116 -0
- package/src/resources/extensions/search-the-web/native-search.ts +2 -1
- package/src/resources/extensions/search-the-web/provider.ts +3 -10
- package/src/resources/extensions/shared/debug-logger.ts +102 -0
- package/src/resources/extensions/shared/env-utils.ts +18 -0
- package/src/resources/extensions/shared/paths.ts +15 -0
- package/src/resources/extensions/shared/preferences.ts +122 -0
- package/src/resources/extensions/shared/remote-questions-config.ts +30 -0
- package/src/resources/extensions/shared/rtk-session-stats.ts +2 -2
- package/src/resources/extensions/shared/secrets-manifest.ts +130 -0
- package/src/resources/extensions/slash-commands/extension-manifest.json +2 -1
- package/src/resources/extensions/slash-commands/index.ts +2 -0
- package/src/resources/extensions/slash-commands/plan.ts +328 -0
- package/src/resources/extensions/subagent/agents.ts +1 -1
- package/src/resources/extensions/subagent/approval-proxy.ts +70 -0
- package/src/resources/extensions/subagent/configured-model.ts +15 -0
- package/src/resources/extensions/subagent/index.ts +126 -185
- package/src/resources/extensions/subagent/model-resolution.ts +26 -0
- package/src/resources/extensions/ttsr/ttsr-manager.ts +1 -1
- package/src/resources/skills/create-skill/SKILL.md +2 -2
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +8 -7
- package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
- package/src/resources/skills/create-skill/workflows/create-new-skill.md +6 -5
- package/dist/resources/extensions/github-sync/cli.js +0 -284
- package/dist/resources/extensions/github-sync/index.js +0 -73
- package/dist/resources/extensions/github-sync/mapping.js +0 -67
- package/dist/resources/extensions/github-sync/sync.js +0 -425
- package/dist/resources/extensions/github-sync/templates.js +0 -118
- package/dist/resources/extensions/github-sync/types.js +0 -7
- package/dist/resources/extensions/gsd/activity-log.js +0 -153
- package/dist/resources/extensions/gsd/atomic-write.js +0 -134
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +0 -49
- package/dist/resources/extensions/gsd/auto/infra-errors.js +0 -49
- package/dist/resources/extensions/gsd/auto/loop-deps.js +0 -6
- package/dist/resources/extensions/gsd/auto/loop.js +0 -256
- package/dist/resources/extensions/gsd/auto/phases.js +0 -942
- package/dist/resources/extensions/gsd/auto/resolve.js +0 -90
- package/dist/resources/extensions/gsd/auto/run-unit.js +0 -106
- package/dist/resources/extensions/gsd/auto/session.js +0 -171
- package/dist/resources/extensions/gsd/auto/types.js +0 -23
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +0 -116
- package/dist/resources/extensions/gsd/auto-budget.js +0 -30
- package/dist/resources/extensions/gsd/auto-dashboard.js +0 -751
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +0 -212
- package/dist/resources/extensions/gsd/auto-dispatch.js +0 -627
- package/dist/resources/extensions/gsd/auto-loop.js +0 -13
- package/dist/resources/extensions/gsd/auto-model-selection.js +0 -192
- package/dist/resources/extensions/gsd/auto-observability.js +0 -54
- package/dist/resources/extensions/gsd/auto-post-unit.js +0 -548
- package/dist/resources/extensions/gsd/auto-prompts.js +0 -1686
- package/dist/resources/extensions/gsd/auto-recovery.js +0 -533
- package/dist/resources/extensions/gsd/auto-start.js +0 -544
- package/dist/resources/extensions/gsd/auto-supervisor.js +0 -73
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +0 -180
- package/dist/resources/extensions/gsd/auto-timers.js +0 -261
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +0 -77
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +0 -30
- package/dist/resources/extensions/gsd/auto-utils.js +0 -20
- package/dist/resources/extensions/gsd/auto-verification.js +0 -163
- package/dist/resources/extensions/gsd/auto-worktree.js +0 -1645
- package/dist/resources/extensions/gsd/auto.js +0 -1087
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +0 -191
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +0 -1207
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +0 -149
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +0 -62
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +0 -18
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +0 -53
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +0 -267
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +0 -45
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +0 -367
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +0 -75
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +0 -105
- package/dist/resources/extensions/gsd/branch-patterns.js +0 -13
- package/dist/resources/extensions/gsd/cache.js +0 -27
- package/dist/resources/extensions/gsd/captures.js +0 -414
- package/dist/resources/extensions/gsd/changelog.js +0 -162
- package/dist/resources/extensions/gsd/claude-import.js +0 -591
- package/dist/resources/extensions/gsd/collision-diagnostics.js +0 -226
- package/dist/resources/extensions/gsd/commands/catalog.js +0 -336
- package/dist/resources/extensions/gsd/commands/context.js +0 -87
- package/dist/resources/extensions/gsd/commands/dispatcher.js +0 -21
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +0 -175
- package/dist/resources/extensions/gsd/commands/handlers/core.js +0 -249
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +0 -207
- package/dist/resources/extensions/gsd/commands/handlers/parallel.js +0 -106
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +0 -253
- package/dist/resources/extensions/gsd/commands/index.js +0 -11
- package/dist/resources/extensions/gsd/commands-bootstrap.js +0 -224
- package/dist/resources/extensions/gsd/commands-cmux.js +0 -120
- package/dist/resources/extensions/gsd/commands-config.js +0 -94
- package/dist/resources/extensions/gsd/commands-extensions.js +0 -260
- package/dist/resources/extensions/gsd/commands-handlers.js +0 -318
- package/dist/resources/extensions/gsd/commands-inspect.js +0 -77
- package/dist/resources/extensions/gsd/commands-logs.js +0 -468
- package/dist/resources/extensions/gsd/commands-maintenance.js +0 -485
- package/dist/resources/extensions/gsd/commands-mcp-status.js +0 -187
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +0 -664
- package/dist/resources/extensions/gsd/commands-rate.js +0 -31
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +0 -408
- package/dist/resources/extensions/gsd/commands.js +0 -9
- package/dist/resources/extensions/gsd/complexity-classifier.js +0 -259
- package/dist/resources/extensions/gsd/constants.js +0 -15
- package/dist/resources/extensions/gsd/context-budget.js +0 -179
- package/dist/resources/extensions/gsd/context-injector.js +0 -74
- package/dist/resources/extensions/gsd/context-store.js +0 -166
- package/dist/resources/extensions/gsd/crash-recovery.js +0 -112
- package/dist/resources/extensions/gsd/custom-execution-policy.js +0 -48
- package/dist/resources/extensions/gsd/custom-verification.js +0 -147
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +0 -165
- package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -539
- package/dist/resources/extensions/gsd/db-writer.js +0 -518
- package/dist/resources/extensions/gsd/debug-logger.js +0 -161
- package/dist/resources/extensions/gsd/definition-loader.js +0 -352
- package/dist/resources/extensions/gsd/detection.js +0 -977
- package/dist/resources/extensions/gsd/dev-execution-policy.js +0 -24
- package/dist/resources/extensions/gsd/dev-workflow-engine.js +0 -82
- package/dist/resources/extensions/gsd/diff-context.js +0 -168
- package/dist/resources/extensions/gsd/dispatch-guard.js +0 -114
- package/dist/resources/extensions/gsd/docs/claude-marketplace-import.md +0 -214
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -671
- package/dist/resources/extensions/gsd/doctor-checks.js +0 -5
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +0 -168
- package/dist/resources/extensions/gsd/doctor-environment.js +0 -565
- package/dist/resources/extensions/gsd/doctor-format.js +0 -86
- package/dist/resources/extensions/gsd/doctor-git-checks.js +0 -433
- package/dist/resources/extensions/gsd/doctor-global-checks.js +0 -74
- package/dist/resources/extensions/gsd/doctor-proactive.js +0 -349
- package/dist/resources/extensions/gsd/doctor-providers.js +0 -356
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +0 -601
- package/dist/resources/extensions/gsd/doctor-types.js +0 -15
- package/dist/resources/extensions/gsd/doctor.js +0 -765
- package/dist/resources/extensions/gsd/engine-resolver.js +0 -40
- package/dist/resources/extensions/gsd/engine-types.js +0 -8
- package/dist/resources/extensions/gsd/env-utils.js +0 -29
- package/dist/resources/extensions/gsd/error-classifier.js +0 -108
- package/dist/resources/extensions/gsd/error-utils.js +0 -6
- package/dist/resources/extensions/gsd/errors.js +0 -24
- package/dist/resources/extensions/gsd/execution-policy.js +0 -8
- package/dist/resources/extensions/gsd/exit-command.js +0 -22
- package/dist/resources/extensions/gsd/export-html.js +0 -1271
- package/dist/resources/extensions/gsd/export.js +0 -264
- package/dist/resources/extensions/gsd/extension-manifest.json +0 -33
- package/dist/resources/extensions/gsd/file-watcher.js +0 -80
- package/dist/resources/extensions/gsd/files.js +0 -863
- package/dist/resources/extensions/gsd/forensics.js +0 -996
- package/dist/resources/extensions/gsd/git-constants.js +0 -11
- package/dist/resources/extensions/gsd/git-self-heal.js +0 -113
- package/dist/resources/extensions/gsd/git-service.js +0 -586
- package/dist/resources/extensions/gsd/gitignore.js +0 -285
- package/dist/resources/extensions/gsd/graph.js +0 -225
- package/dist/resources/extensions/gsd/gsd-db.js +0 -1808
- package/dist/resources/extensions/gsd/guided-flow-queue.js +0 -365
- package/dist/resources/extensions/gsd/guided-flow.js +0 -1456
- package/dist/resources/extensions/gsd/health-widget-core.js +0 -89
- package/dist/resources/extensions/gsd/health-widget.js +0 -126
- package/dist/resources/extensions/gsd/history.js +0 -119
- package/dist/resources/extensions/gsd/index.js +0 -5
- package/dist/resources/extensions/gsd/init-wizard.js +0 -487
- package/dist/resources/extensions/gsd/journal.js +0 -85
- package/dist/resources/extensions/gsd/json-persistence.js +0 -70
- package/dist/resources/extensions/gsd/jsonl-utils.js +0 -24
- package/dist/resources/extensions/gsd/key-manager.js +0 -820
- package/dist/resources/extensions/gsd/markdown-renderer.js +0 -891
- package/dist/resources/extensions/gsd/marketplace-discovery.js +0 -356
- package/dist/resources/extensions/gsd/md-importer.js +0 -623
- package/dist/resources/extensions/gsd/memory-extractor.js +0 -302
- package/dist/resources/extensions/gsd/memory-store.js +0 -366
- package/dist/resources/extensions/gsd/metrics.js +0 -419
- package/dist/resources/extensions/gsd/migrate/command.js +0 -157
- package/dist/resources/extensions/gsd/migrate/index.js +0 -7
- package/dist/resources/extensions/gsd/migrate/parser.js +0 -268
- package/dist/resources/extensions/gsd/migrate/parsers.js +0 -477
- package/dist/resources/extensions/gsd/migrate/preview.js +0 -47
- package/dist/resources/extensions/gsd/migrate/transformer.js +0 -278
- package/dist/resources/extensions/gsd/migrate/types.js +0 -4
- package/dist/resources/extensions/gsd/migrate/validator.js +0 -41
- package/dist/resources/extensions/gsd/migrate/writer.js +0 -477
- package/dist/resources/extensions/gsd/migrate-external.js +0 -207
- package/dist/resources/extensions/gsd/milestone-actions.js +0 -130
- package/dist/resources/extensions/gsd/milestone-id-utils.js +0 -28
- package/dist/resources/extensions/gsd/milestone-ids.js +0 -116
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +0 -45
- package/dist/resources/extensions/gsd/model-cost-table.js +0 -66
- package/dist/resources/extensions/gsd/model-router.js +0 -246
- package/dist/resources/extensions/gsd/namespaced-registry.js +0 -322
- package/dist/resources/extensions/gsd/namespaced-resolver.js +0 -176
- package/dist/resources/extensions/gsd/native-git-bridge.js +0 -992
- package/dist/resources/extensions/gsd/native-parser-bridge.js +0 -156
- package/dist/resources/extensions/gsd/notifications.js +0 -105
- package/dist/resources/extensions/gsd/observability-validator.js +0 -422
- package/dist/resources/extensions/gsd/package.json +0 -11
- package/dist/resources/extensions/gsd/parallel-eligibility.js +0 -188
- package/dist/resources/extensions/gsd/parallel-merge.js +0 -194
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +0 -413
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +0 -850
- package/dist/resources/extensions/gsd/parsers-legacy.js +0 -256
- package/dist/resources/extensions/gsd/paths.js +0 -527
- package/dist/resources/extensions/gsd/plugin-importer.js +0 -254
- package/dist/resources/extensions/gsd/post-unit-hooks.js +0 -48
- package/dist/resources/extensions/gsd/preferences-models.js +0 -295
- package/dist/resources/extensions/gsd/preferences-skills.js +0 -160
- package/dist/resources/extensions/gsd/preferences-types.js +0 -82
- package/dist/resources/extensions/gsd/preferences-validation.js +0 -852
- package/dist/resources/extensions/gsd/preferences.js +0 -432
- package/dist/resources/extensions/gsd/progress-score.js +0 -121
- package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +0 -150
- package/dist/resources/extensions/gsd/prompt-loader.js +0 -156
- package/dist/resources/extensions/gsd/prompt-ordering.js +0 -170
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +0 -66
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +0 -40
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +0 -253
- package/dist/resources/extensions/gsd/prompts/discuss.md +0 -290
- package/dist/resources/extensions/gsd/prompts/doctor-heal.md +0 -29
- package/dist/resources/extensions/gsd/prompts/execute-task.md +0 -80
- package/dist/resources/extensions/gsd/prompts/forensics.md +0 -196
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +0 -32
- package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +0 -3
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +0 -110
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +0 -62
- package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +0 -3
- package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +0 -30
- package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +0 -3
- package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +0 -15
- package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +0 -1
- package/dist/resources/extensions/gsd/prompts/heal-skill.md +0 -45
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +0 -108
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +0 -89
- package/dist/resources/extensions/gsd/prompts/queue.md +0 -132
- package/dist/resources/extensions/gsd/prompts/quick-task.md +0 -44
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +0 -44
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +0 -66
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +0 -39
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +0 -47
- package/dist/resources/extensions/gsd/prompts/research-slice.md +0 -57
- package/dist/resources/extensions/gsd/prompts/rethink.md +0 -83
- package/dist/resources/extensions/gsd/prompts/review-migration.md +0 -66
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +0 -31
- package/dist/resources/extensions/gsd/prompts/run-uat.md +0 -89
- package/dist/resources/extensions/gsd/prompts/system.md +0 -220
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +0 -63
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +0 -47
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +0 -28
- package/dist/resources/extensions/gsd/prompts/worktree-merge.md +0 -123
- package/dist/resources/extensions/gsd/provider-error-pause.js +0 -31
- package/dist/resources/extensions/gsd/queue-order.js +0 -178
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +0 -235
- package/dist/resources/extensions/gsd/quick.js +0 -206
- package/dist/resources/extensions/gsd/reactive-graph.js +0 -257
- package/dist/resources/extensions/gsd/repo-identity.js +0 -641
- package/dist/resources/extensions/gsd/reports.js +0 -409
- package/dist/resources/extensions/gsd/rethink.js +0 -120
- package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
- package/dist/resources/extensions/gsd/roadmap-slices.js +0 -255
- package/dist/resources/extensions/gsd/routing-history.js +0 -210
- package/dist/resources/extensions/gsd/rtk-status.js +0 -43
- package/dist/resources/extensions/gsd/rule-registry.js +0 -488
- package/dist/resources/extensions/gsd/rule-types.js +0 -6
- package/dist/resources/extensions/gsd/run-manager.js +0 -134
- package/dist/resources/extensions/gsd/safe-fs.js +0 -52
- package/dist/resources/extensions/gsd/service-tier.js +0 -158
- package/dist/resources/extensions/gsd/session-forensics.js +0 -435
- package/dist/resources/extensions/gsd/session-lock.js +0 -554
- package/dist/resources/extensions/gsd/session-status-io.js +0 -134
- package/dist/resources/extensions/gsd/skill-catalog.js +0 -1026
- package/dist/resources/extensions/gsd/skill-discovery.js +0 -122
- package/dist/resources/extensions/gsd/skill-health.js +0 -326
- package/dist/resources/extensions/gsd/skill-telemetry.js +0 -121
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +0 -242
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +0 -83
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +0 -64
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/multi-session.md +0 -176
- package/dist/resources/extensions/gsd/state.js +0 -1407
- package/dist/resources/extensions/gsd/status-guards.js +0 -12
- package/dist/resources/extensions/gsd/structured-data-formatter.js +0 -98
- package/dist/resources/extensions/gsd/sync-lock.js +0 -89
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +0 -80
- package/dist/resources/extensions/gsd/templates/context.md +0 -76
- package/dist/resources/extensions/gsd/templates/decisions.md +0 -8
- package/dist/resources/extensions/gsd/templates/knowledge.md +0 -19
- package/dist/resources/extensions/gsd/templates/milestone-summary.md +0 -81
- package/dist/resources/extensions/gsd/templates/milestone-validation.md +0 -74
- package/dist/resources/extensions/gsd/templates/plan.md +0 -148
- package/dist/resources/extensions/gsd/templates/project.md +0 -31
- package/dist/resources/extensions/gsd/templates/reassessment.md +0 -29
- package/dist/resources/extensions/gsd/templates/requirements.md +0 -81
- package/dist/resources/extensions/gsd/templates/research.md +0 -79
- package/dist/resources/extensions/gsd/templates/roadmap.md +0 -131
- package/dist/resources/extensions/gsd/templates/runtime.md +0 -21
- package/dist/resources/extensions/gsd/templates/secrets-manifest.md +0 -22
- package/dist/resources/extensions/gsd/templates/slice-context.md +0 -58
- package/dist/resources/extensions/gsd/templates/slice-summary.md +0 -108
- package/dist/resources/extensions/gsd/templates/state.md +0 -17
- package/dist/resources/extensions/gsd/templates/task-plan.md +0 -87
- package/dist/resources/extensions/gsd/templates/task-summary.md +0 -66
- package/dist/resources/extensions/gsd/templates/uat.md +0 -54
- package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
- package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
- package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
- package/dist/resources/extensions/gsd/token-counter.js +0 -54
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +0 -172
- package/dist/resources/extensions/gsd/tools/complete-slice.js +0 -276
- package/dist/resources/extensions/gsd/tools/complete-task.js +0 -205
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +0 -250
- package/dist/resources/extensions/gsd/tools/plan-slice.js +0 -199
- package/dist/resources/extensions/gsd/tools/plan-task.js +0 -121
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +0 -219
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +0 -87
- package/dist/resources/extensions/gsd/tools/reopen-task.js +0 -91
- package/dist/resources/extensions/gsd/tools/replan-slice.js +0 -188
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +0 -110
- package/dist/resources/extensions/gsd/triage-resolution.js +0 -322
- package/dist/resources/extensions/gsd/triage-ui.js +0 -135
- package/dist/resources/extensions/gsd/types.js +0 -4
- package/dist/resources/extensions/gsd/undo.js +0 -400
- package/dist/resources/extensions/gsd/unit-id.js +0 -7
- package/dist/resources/extensions/gsd/unit-ownership.js +0 -216
- package/dist/resources/extensions/gsd/unit-runtime.js +0 -132
- package/dist/resources/extensions/gsd/validate-directory.js +0 -143
- package/dist/resources/extensions/gsd/validation.js +0 -21
- package/dist/resources/extensions/gsd/verdict-parser.js +0 -96
- package/dist/resources/extensions/gsd/verification-evidence.js +0 -122
- package/dist/resources/extensions/gsd/verification-gate.js +0 -519
- package/dist/resources/extensions/gsd/visualizer-data.js +0 -674
- package/dist/resources/extensions/gsd/visualizer-overlay.js +0 -501
- package/dist/resources/extensions/gsd/visualizer-views.js +0 -945
- package/dist/resources/extensions/gsd/workflow-engine.js +0 -7
- package/dist/resources/extensions/gsd/workflow-events.js +0 -102
- package/dist/resources/extensions/gsd/workflow-logger.js +0 -192
- package/dist/resources/extensions/gsd/workflow-manifest.js +0 -263
- package/dist/resources/extensions/gsd/workflow-migration.js +0 -280
- package/dist/resources/extensions/gsd/workflow-projections.js +0 -405
- package/dist/resources/extensions/gsd/workflow-reconcile.js +0 -441
- package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +0 -87
- package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +0 -74
- package/dist/resources/extensions/gsd/workflow-templates/full-project.md +0 -40
- package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +0 -45
- package/dist/resources/extensions/gsd/workflow-templates/refactor.md +0 -83
- package/dist/resources/extensions/gsd/workflow-templates/registry.json +0 -85
- package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +0 -73
- package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +0 -81
- package/dist/resources/extensions/gsd/workflow-templates/spike.md +0 -69
- package/dist/resources/extensions/gsd/workflow-templates.js +0 -200
- package/dist/resources/extensions/gsd/workspace-index.js +0 -190
- package/dist/resources/extensions/gsd/worktree-command-bootstrap.js +0 -40
- package/dist/resources/extensions/gsd/worktree-command.js +0 -702
- package/dist/resources/extensions/gsd/worktree-health.js +0 -126
- package/dist/resources/extensions/gsd/worktree-manager.js +0 -518
- package/dist/resources/extensions/gsd/worktree-resolver.js +0 -480
- package/dist/resources/extensions/gsd/worktree.js +0 -310
- package/dist/resources/extensions/gsd/write-intercept.js +0 -84
- package/src/resources/extensions/github-sync/cli.ts +0 -364
- package/src/resources/extensions/github-sync/index.ts +0 -93
- package/src/resources/extensions/github-sync/mapping.ts +0 -81
- package/src/resources/extensions/github-sync/sync.ts +0 -557
- package/src/resources/extensions/github-sync/templates.ts +0 -183
- package/src/resources/extensions/github-sync/tests/cli.test.ts +0 -20
- package/src/resources/extensions/github-sync/tests/commit-linking.test.ts +0 -43
- package/src/resources/extensions/github-sync/tests/mapping.test.ts +0 -104
- package/src/resources/extensions/github-sync/tests/templates.test.ts +0 -110
- package/src/resources/extensions/github-sync/types.ts +0 -47
- package/src/resources/extensions/gsd/activity-log.ts +0 -163
- package/src/resources/extensions/gsd/atomic-write.ts +0 -185
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +0 -60
- package/src/resources/extensions/gsd/auto/infra-errors.ts +0 -48
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -268
- package/src/resources/extensions/gsd/auto/loop.ts +0 -318
- package/src/resources/extensions/gsd/auto/phases.ts +0 -1327
- package/src/resources/extensions/gsd/auto/resolve.ts +0 -106
- package/src/resources/extensions/gsd/auto/run-unit.ts +0 -136
- package/src/resources/extensions/gsd/auto/session.ts +0 -237
- package/src/resources/extensions/gsd/auto/types.ts +0 -117
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +0 -135
- package/src/resources/extensions/gsd/auto-budget.ts +0 -32
- package/src/resources/extensions/gsd/auto-dashboard.ts +0 -880
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +0 -256
- package/src/resources/extensions/gsd/auto-dispatch.ts +0 -781
- package/src/resources/extensions/gsd/auto-loop.ts +0 -16
- package/src/resources/extensions/gsd/auto-model-selection.ts +0 -251
- package/src/resources/extensions/gsd/auto-observability.ts +0 -72
- package/src/resources/extensions/gsd/auto-post-unit.ts +0 -687
- package/src/resources/extensions/gsd/auto-prompts.ts +0 -1896
- package/src/resources/extensions/gsd/auto-recovery.ts +0 -594
- package/src/resources/extensions/gsd/auto-start.ts +0 -737
- package/src/resources/extensions/gsd/auto-supervisor.ts +0 -79
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +0 -262
- package/src/resources/extensions/gsd/auto-timers.ts +0 -313
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +0 -85
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +0 -48
- package/src/resources/extensions/gsd/auto-utils.ts +0 -25
- package/src/resources/extensions/gsd/auto-verification.ts +0 -225
- package/src/resources/extensions/gsd/auto-worktree.ts +0 -1897
- package/src/resources/extensions/gsd/auto.ts +0 -1477
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +0 -219
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +0 -1286
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +0 -194
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +0 -62
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +0 -53
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +0 -61
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +0 -282
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +0 -56
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +0 -416
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +0 -91
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +0 -126
- package/src/resources/extensions/gsd/branch-patterns.ts +0 -16
- package/src/resources/extensions/gsd/cache.ts +0 -29
- package/src/resources/extensions/gsd/captures.ts +0 -502
- package/src/resources/extensions/gsd/changelog.ts +0 -213
- package/src/resources/extensions/gsd/claude-import.ts +0 -705
- package/src/resources/extensions/gsd/collision-diagnostics.ts +0 -332
- package/src/resources/extensions/gsd/commands/catalog.ts +0 -359
- package/src/resources/extensions/gsd/commands/context.ts +0 -108
- package/src/resources/extensions/gsd/commands/dispatcher.ts +0 -32
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +0 -184
- package/src/resources/extensions/gsd/commands/handlers/core.ts +0 -277
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +0 -210
- package/src/resources/extensions/gsd/commands/handlers/parallel.ts +0 -135
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +0 -281
- package/src/resources/extensions/gsd/commands/index.ts +0 -14
- package/src/resources/extensions/gsd/commands-bootstrap.ts +0 -253
- package/src/resources/extensions/gsd/commands-cmux.ts +0 -143
- package/src/resources/extensions/gsd/commands-config.ts +0 -108
- package/src/resources/extensions/gsd/commands-extensions.ts +0 -330
- package/src/resources/extensions/gsd/commands-handlers.ts +0 -404
- package/src/resources/extensions/gsd/commands-inspect.ts +0 -98
- package/src/resources/extensions/gsd/commands-logs.ts +0 -536
- package/src/resources/extensions/gsd/commands-maintenance.ts +0 -535
- package/src/resources/extensions/gsd/commands-mcp-status.ts +0 -247
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +0 -784
- package/src/resources/extensions/gsd/commands-rate.ts +0 -55
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +0 -543
- package/src/resources/extensions/gsd/commands.ts +0 -17
- package/src/resources/extensions/gsd/complexity-classifier.ts +0 -322
- package/src/resources/extensions/gsd/constants.ts +0 -21
- package/src/resources/extensions/gsd/context-budget.ts +0 -256
- package/src/resources/extensions/gsd/context-injector.ts +0 -100
- package/src/resources/extensions/gsd/context-store.ts +0 -196
- package/src/resources/extensions/gsd/crash-recovery.ts +0 -120
- package/src/resources/extensions/gsd/custom-execution-policy.ts +0 -74
- package/src/resources/extensions/gsd/custom-verification.ts +0 -182
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +0 -217
- package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -659
- package/src/resources/extensions/gsd/db-writer.ts +0 -612
- package/src/resources/extensions/gsd/debug-logger.ts +0 -178
- package/src/resources/extensions/gsd/definition-loader.ts +0 -462
- package/src/resources/extensions/gsd/detection.ts +0 -1148
- package/src/resources/extensions/gsd/dev-execution-policy.ts +0 -51
- package/src/resources/extensions/gsd/dev-workflow-engine.ts +0 -110
- package/src/resources/extensions/gsd/diff-context.ts +0 -214
- package/src/resources/extensions/gsd/dispatch-guard.ts +0 -120
- package/src/resources/extensions/gsd/docs/claude-marketplace-import.md +0 -214
- package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -671
- package/src/resources/extensions/gsd/doctor-checks.ts +0 -5
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +0 -182
- package/src/resources/extensions/gsd/doctor-environment.ts +0 -642
- package/src/resources/extensions/gsd/doctor-format.ts +0 -98
- package/src/resources/extensions/gsd/doctor-git-checks.ts +0 -441
- package/src/resources/extensions/gsd/doctor-global-checks.ts +0 -84
- package/src/resources/extensions/gsd/doctor-proactive.ts +0 -431
- package/src/resources/extensions/gsd/doctor-providers.ts +0 -415
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +0 -627
- package/src/resources/extensions/gsd/doctor-types.ts +0 -123
- package/src/resources/extensions/gsd/doctor.ts +0 -808
- package/src/resources/extensions/gsd/engine-resolver.ts +0 -57
- package/src/resources/extensions/gsd/engine-types.ts +0 -71
- package/src/resources/extensions/gsd/env-utils.ts +0 -31
- package/src/resources/extensions/gsd/error-classifier.ts +0 -142
- package/src/resources/extensions/gsd/error-utils.ts +0 -6
- package/src/resources/extensions/gsd/errors.ts +0 -29
- package/src/resources/extensions/gsd/execution-policy.ts +0 -43
- package/src/resources/extensions/gsd/exit-command.ts +0 -30
- package/src/resources/extensions/gsd/export-html.ts +0 -1408
- package/src/resources/extensions/gsd/export.ts +0 -310
- package/src/resources/extensions/gsd/extension-manifest.json +0 -33
- package/src/resources/extensions/gsd/file-watcher.ts +0 -100
- package/src/resources/extensions/gsd/files.ts +0 -971
- package/src/resources/extensions/gsd/forensics.ts +0 -1178
- package/src/resources/extensions/gsd/git-constants.ts +0 -12
- package/src/resources/extensions/gsd/git-self-heal.ts +0 -127
- package/src/resources/extensions/gsd/git-service.ts +0 -755
- package/src/resources/extensions/gsd/gitignore.ts +0 -315
- package/src/resources/extensions/gsd/graph.ts +0 -312
- package/src/resources/extensions/gsd/gsd-db.ts +0 -2205
- package/src/resources/extensions/gsd/guided-flow-queue.ts +0 -439
- package/src/resources/extensions/gsd/guided-flow.ts +0 -1666
- package/src/resources/extensions/gsd/health-widget-core.ts +0 -111
- package/src/resources/extensions/gsd/health-widget.ts +0 -143
- package/src/resources/extensions/gsd/history.ts +0 -144
- package/src/resources/extensions/gsd/index.ts +0 -14
- package/src/resources/extensions/gsd/init-wizard.ts +0 -595
- package/src/resources/extensions/gsd/journal.ts +0 -139
- package/src/resources/extensions/gsd/json-persistence.ts +0 -75
- package/src/resources/extensions/gsd/jsonl-utils.ts +0 -21
- package/src/resources/extensions/gsd/key-manager.ts +0 -987
- package/src/resources/extensions/gsd/markdown-renderer.ts +0 -1132
- package/src/resources/extensions/gsd/marketplace-discovery.ts +0 -508
- package/src/resources/extensions/gsd/md-importer.ts +0 -742
- package/src/resources/extensions/gsd/memory-extractor.ts +0 -360
- package/src/resources/extensions/gsd/memory-store.ts +0 -452
- package/src/resources/extensions/gsd/metrics.ts +0 -575
- package/src/resources/extensions/gsd/migrate/command.ts +0 -219
- package/src/resources/extensions/gsd/migrate/index.ts +0 -42
- package/src/resources/extensions/gsd/migrate/parser.ts +0 -323
- package/src/resources/extensions/gsd/migrate/parsers.ts +0 -539
- package/src/resources/extensions/gsd/migrate/preview.ts +0 -48
- package/src/resources/extensions/gsd/migrate/transformer.ts +0 -346
- package/src/resources/extensions/gsd/migrate/types.ts +0 -370
- package/src/resources/extensions/gsd/migrate/validator.ts +0 -55
- package/src/resources/extensions/gsd/migrate/writer.ts +0 -579
- package/src/resources/extensions/gsd/migrate-external.ts +0 -210
- package/src/resources/extensions/gsd/milestone-actions.ts +0 -143
- package/src/resources/extensions/gsd/milestone-id-utils.ts +0 -32
- package/src/resources/extensions/gsd/milestone-ids.ts +0 -135
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +0 -56
- package/src/resources/extensions/gsd/model-cost-table.ts +0 -84
- package/src/resources/extensions/gsd/model-router.ts +0 -315
- package/src/resources/extensions/gsd/namespaced-registry.ts +0 -467
- package/src/resources/extensions/gsd/namespaced-resolver.ts +0 -307
- package/src/resources/extensions/gsd/native-git-bridge.ts +0 -1197
- package/src/resources/extensions/gsd/native-parser-bridge.ts +0 -267
- package/src/resources/extensions/gsd/notifications.ts +0 -135
- package/src/resources/extensions/gsd/observability-validator.ts +0 -456
- package/src/resources/extensions/gsd/package.json +0 -11
- package/src/resources/extensions/gsd/parallel-eligibility.ts +0 -242
- package/src/resources/extensions/gsd/parallel-merge.ts +0 -240
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +0 -497
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +0 -1013
- package/src/resources/extensions/gsd/parsers-legacy.ts +0 -290
- package/src/resources/extensions/gsd/paths.ts +0 -561
- package/src/resources/extensions/gsd/plugin-importer.ts +0 -411
- package/src/resources/extensions/gsd/post-unit-hooks.ts +0 -86
- package/src/resources/extensions/gsd/preferences-models.ts +0 -330
- package/src/resources/extensions/gsd/preferences-skills.ts +0 -175
- package/src/resources/extensions/gsd/preferences-types.ts +0 -285
- package/src/resources/extensions/gsd/preferences-validation.ts +0 -823
- package/src/resources/extensions/gsd/preferences.ts +0 -539
- package/src/resources/extensions/gsd/progress-score.ts +0 -161
- package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +0 -213
- package/src/resources/extensions/gsd/prompt-loader.ts +0 -169
- package/src/resources/extensions/gsd/prompt-ordering.ts +0 -200
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +0 -66
- package/src/resources/extensions/gsd/prompts/complete-slice.md +0 -40
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +0 -253
- package/src/resources/extensions/gsd/prompts/discuss.md +0 -290
- package/src/resources/extensions/gsd/prompts/doctor-heal.md +0 -29
- package/src/resources/extensions/gsd/prompts/execute-task.md +0 -80
- package/src/resources/extensions/gsd/prompts/forensics.md +0 -196
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +0 -32
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +0 -3
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +0 -110
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +0 -62
- package/src/resources/extensions/gsd/prompts/guided-execute-task.md +0 -3
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +0 -30
- package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +0 -3
- package/src/resources/extensions/gsd/prompts/guided-research-slice.md +0 -15
- package/src/resources/extensions/gsd/prompts/guided-resume-task.md +0 -1
- package/src/resources/extensions/gsd/prompts/heal-skill.md +0 -45
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +0 -108
- package/src/resources/extensions/gsd/prompts/plan-slice.md +0 -89
- package/src/resources/extensions/gsd/prompts/queue.md +0 -132
- package/src/resources/extensions/gsd/prompts/quick-task.md +0 -44
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +0 -44
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +0 -66
- package/src/resources/extensions/gsd/prompts/replan-slice.md +0 -39
- package/src/resources/extensions/gsd/prompts/research-milestone.md +0 -47
- package/src/resources/extensions/gsd/prompts/research-slice.md +0 -57
- package/src/resources/extensions/gsd/prompts/rethink.md +0 -83
- package/src/resources/extensions/gsd/prompts/review-migration.md +0 -66
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +0 -31
- package/src/resources/extensions/gsd/prompts/run-uat.md +0 -89
- package/src/resources/extensions/gsd/prompts/system.md +0 -220
- package/src/resources/extensions/gsd/prompts/triage-captures.md +0 -63
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +0 -47
- package/src/resources/extensions/gsd/prompts/workflow-start.md +0 -28
- package/src/resources/extensions/gsd/prompts/worktree-merge.md +0 -123
- package/src/resources/extensions/gsd/provider-error-pause.ts +0 -49
- package/src/resources/extensions/gsd/queue-order.ts +0 -230
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +0 -277
- package/src/resources/extensions/gsd/quick.ts +0 -257
- package/src/resources/extensions/gsd/reactive-graph.ts +0 -319
- package/src/resources/extensions/gsd/repo-identity.ts +0 -657
- package/src/resources/extensions/gsd/reports.ts +0 -504
- package/src/resources/extensions/gsd/rethink.ts +0 -160
- package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
- package/src/resources/extensions/gsd/roadmap-slices.ts +0 -273
- package/src/resources/extensions/gsd/routing-history.ts +0 -286
- package/src/resources/extensions/gsd/rtk-status.ts +0 -53
- package/src/resources/extensions/gsd/rule-registry.ts +0 -598
- package/src/resources/extensions/gsd/rule-types.ts +0 -68
- package/src/resources/extensions/gsd/run-manager.ts +0 -180
- package/src/resources/extensions/gsd/safe-fs.ts +0 -47
- package/src/resources/extensions/gsd/service-tier.ts +0 -196
- package/src/resources/extensions/gsd/session-forensics.ts +0 -546
- package/src/resources/extensions/gsd/session-lock.ts +0 -640
- package/src/resources/extensions/gsd/session-status-io.ts +0 -179
- package/src/resources/extensions/gsd/skill-catalog.ts +0 -1085
- package/src/resources/extensions/gsd/skill-discovery.ts +0 -140
- package/src/resources/extensions/gsd/skill-health.ts +0 -418
- package/src/resources/extensions/gsd/skill-telemetry.ts +0 -137
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +0 -242
- package/src/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +0 -83
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +0 -64
- package/src/resources/extensions/gsd/skills/gsd-headless/references/multi-session.md +0 -176
- package/src/resources/extensions/gsd/state.ts +0 -1554
- package/src/resources/extensions/gsd/status-guards.ts +0 -13
- package/src/resources/extensions/gsd/structured-data-formatter.ts +0 -146
- package/src/resources/extensions/gsd/sync-lock.ts +0 -94
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +0 -80
- package/src/resources/extensions/gsd/templates/context.md +0 -76
- package/src/resources/extensions/gsd/templates/decisions.md +0 -8
- package/src/resources/extensions/gsd/templates/knowledge.md +0 -19
- package/src/resources/extensions/gsd/templates/milestone-summary.md +0 -81
- package/src/resources/extensions/gsd/templates/milestone-validation.md +0 -74
- package/src/resources/extensions/gsd/templates/plan.md +0 -148
- package/src/resources/extensions/gsd/templates/project.md +0 -31
- package/src/resources/extensions/gsd/templates/reassessment.md +0 -29
- package/src/resources/extensions/gsd/templates/requirements.md +0 -81
- package/src/resources/extensions/gsd/templates/research.md +0 -79
- package/src/resources/extensions/gsd/templates/roadmap.md +0 -131
- package/src/resources/extensions/gsd/templates/runtime.md +0 -21
- package/src/resources/extensions/gsd/templates/secrets-manifest.md +0 -22
- package/src/resources/extensions/gsd/templates/slice-context.md +0 -58
- package/src/resources/extensions/gsd/templates/slice-summary.md +0 -108
- package/src/resources/extensions/gsd/templates/state.md +0 -17
- package/src/resources/extensions/gsd/templates/task-plan.md +0 -87
- package/src/resources/extensions/gsd/templates/task-summary.md +0 -66
- package/src/resources/extensions/gsd/templates/uat.md +0 -54
- package/src/resources/extensions/gsd/tests/active-milestone-id-guard.test.ts +0 -91
- package/src/resources/extensions/gsd/tests/activity-log.test.ts +0 -175
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +0 -143
- package/src/resources/extensions/gsd/tests/atomic-write.test.ts +0 -144
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +0 -50
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -211
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +0 -213
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -2307
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +0 -61
- package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +0 -71
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +0 -209
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +0 -129
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +0 -88
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +0 -255
- package/src/resources/extensions/gsd/tests/auto-stale-lock-self-kill.test.ts +0 -87
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +0 -37
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -28
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +0 -218
- package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +0 -80
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +0 -83
- package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -133
- package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +0 -220
- package/src/resources/extensions/gsd/tests/bundled-workflow-defs.test.ts +0 -180
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -294
- package/src/resources/extensions/gsd/tests/captures.test.ts +0 -524
- package/src/resources/extensions/gsd/tests/claude-import-marketplace-discovery.test.ts +0 -191
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +0 -350
- package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/cmux.test.ts +0 -215
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +0 -506
- package/src/resources/extensions/gsd/tests/collision-diagnostics.test.ts +0 -705
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +0 -24
- package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +0 -46
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +0 -241
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +0 -283
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -311
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +0 -432
- package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +0 -106
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +0 -454
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +0 -111
- package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +0 -192
- package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +0 -181
- package/src/resources/extensions/gsd/tests/context-budget.test.ts +0 -352
- package/src/resources/extensions/gsd/tests/context-injector.test.ts +0 -313
- package/src/resources/extensions/gsd/tests/context-store.test.ts +0 -454
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +0 -120
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +0 -122
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -535
- package/src/resources/extensions/gsd/tests/custom-verification.test.ts +0 -415
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +0 -339
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +0 -329
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +0 -87
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +0 -131
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +0 -656
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +0 -185
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +0 -762
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +0 -512
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +0 -121
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +0 -1127
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -641
- package/src/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -310
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -982
- package/src/resources/extensions/gsd/tests/detection.test.ts +0 -1190
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +0 -314
- package/src/resources/extensions/gsd/tests/diff-context.test.ts +0 -136
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +0 -15
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -281
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -265
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +0 -126
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +0 -172
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -603
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -169
- package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +0 -20
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -74
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +0 -271
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +0 -164
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +0 -120
- package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/export-html-all.test.ts +0 -105
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +0 -379
- package/src/resources/extensions/gsd/tests/extension-selector-separator.test.ts +0 -144
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +0 -18
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +0 -278
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -129
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
- package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +0 -121
- package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +0 -43
- package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +0 -232
- package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +0 -189
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +0 -156
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -593
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +0 -351
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +0 -114
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +0 -440
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +0 -406
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +0 -164
- package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +0 -135
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +0 -340
- package/src/resources/extensions/gsd/tests/headless-query.test.ts +0 -184
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +0 -179
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +0 -98
- package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -125
- package/src/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +0 -32
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +0 -129
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +0 -195
- package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +0 -248
- package/src/resources/extensions/gsd/tests/integration/atomic-task-closeout.test.ts +0 -72
- package/src/resources/extensions/gsd/tests/integration/auto-preflight.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +0 -825
- package/src/resources/extensions/gsd/tests/integration/auto-secrets-gate.test.ts +0 -194
- package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +0 -121
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +0 -759
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -348
- package/src/resources/extensions/gsd/tests/integration/continue-here.test.ts +0 -281
- package/src/resources/extensions/gsd/tests/integration/doctor-completion-deferral.test.ts +0 -88
- package/src/resources/extensions/gsd/tests/integration/doctor-delimiter-fix.test.ts +0 -83
- package/src/resources/extensions/gsd/tests/integration/doctor-enhancements.test.ts +0 -243
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-worktree.test.ts +0 -164
- package/src/resources/extensions/gsd/tests/integration/doctor-environment.test.ts +0 -403
- package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
- package/src/resources/extensions/gsd/tests/integration/doctor-fixlevel.test.ts +0 -212
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +0 -653
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +0 -325
- package/src/resources/extensions/gsd/tests/integration/doctor-roadmap-summary-atomicity.test.ts +0 -123
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +0 -377
- package/src/resources/extensions/gsd/tests/integration/doctor.test.ts +0 -612
- package/src/resources/extensions/gsd/tests/integration/e2e-workflow-pipeline-integration.test.ts +0 -476
- package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +0 -415
- package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +0 -119
- package/src/resources/extensions/gsd/tests/integration/git-self-heal.test.ts +0 -131
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +0 -1458
- package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +0 -256
- package/src/resources/extensions/gsd/tests/integration/headless-command.ts +0 -534
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +0 -359
- package/src/resources/extensions/gsd/tests/integration/inherited-repo-home-dir.test.ts +0 -191
- package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +0 -266
- package/src/resources/extensions/gsd/tests/integration/integration-mixed-milestones.test.ts +0 -539
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +0 -634
- package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +0 -360
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -166
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +0 -577
- package/src/resources/extensions/gsd/tests/integration/parallel-workers-multi-milestone-e2e.test.ts +0 -337
- package/src/resources/extensions/gsd/tests/integration/paths.test.ts +0 -98
- package/src/resources/extensions/gsd/tests/integration/plugin-importer-live.test.ts +0 -481
- package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +0 -155
- package/src/resources/extensions/gsd/tests/integration/queue-reorder-e2e.test.ts +0 -335
- package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +0 -253
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +0 -609
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -959
- package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +0 -364
- package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +0 -237
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +0 -223
- package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +0 -119
- package/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts +0 -429
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -601
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +0 -147
- package/src/resources/extensions/gsd/tests/journal.test.ts +0 -341
- package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +0 -183
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +0 -429
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +0 -250
- package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +0 -15
- package/src/resources/extensions/gsd/tests/manifest-status.test.ts +0 -274
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +0 -1161
- package/src/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +0 -91
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +0 -416
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +0 -254
- package/src/resources/extensions/gsd/tests/memory-leak-guards.test.ts +0 -91
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +0 -332
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +0 -66
- package/src/resources/extensions/gsd/tests/metrics.test.ts +0 -384
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +0 -105
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +0 -429
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +0 -748
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +0 -619
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +0 -390
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -295
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +0 -361
- package/src/resources/extensions/gsd/tests/milestone-id-reservation.test.ts +0 -73
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +0 -51
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +0 -130
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/model-isolation.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/model-router.test.ts +0 -272
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +0 -220
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +0 -278
- package/src/resources/extensions/gsd/tests/namespaced-registry.test.ts +0 -1027
- package/src/resources/extensions/gsd/tests/namespaced-resolver.test.ts +0 -671
- package/src/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +0 -61
- package/src/resources/extensions/gsd/tests/next-milestone-id.test.ts +0 -23
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +0 -152
- package/src/resources/extensions/gsd/tests/notifications.test.ts +0 -134
- package/src/resources/extensions/gsd/tests/overrides.test.ts +0 -124
- package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -330
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +0 -159
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -284
- package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +0 -60
- package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +0 -736
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +0 -277
- package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +0 -226
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -199
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +0 -85
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -253
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +0 -354
- package/src/resources/extensions/gsd/tests/parsers.test.ts +0 -1867
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/plan-milestone-queue-context.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +0 -70
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +0 -231
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +0 -298
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +0 -179
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +0 -145
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +0 -305
- package/src/resources/extensions/gsd/tests/plugin-importer.test.ts +0 -1383
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +0 -171
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +0 -300
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +0 -133
- package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -463
- package/src/resources/extensions/gsd/tests/preflight-context-draft-filter.test.ts +0 -115
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +0 -297
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +0 -464
- package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +0 -314
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +0 -239
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +0 -387
- package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +0 -178
- package/src/resources/extensions/gsd/tests/prompt-ordering.test.ts +0 -296
- package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +0 -69
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -479
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +0 -347
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +0 -100
- package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +0 -192
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +0 -100
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +0 -90
- package/src/resources/extensions/gsd/tests/rate-limit-model-fallback.test.ts +0 -90
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +0 -511
- package/src/resources/extensions/gsd/tests/reactive-graph.test.ts +0 -299
- package/src/resources/extensions/gsd/tests/reassess-detection.test.ts +0 -154
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +0 -442
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +0 -135
- package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +0 -176
- package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +0 -281
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +0 -59
- package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +0 -110
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +0 -755
- package/src/resources/extensions/gsd/tests/remote-status.test.ts +0 -99
- package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +0 -155
- package/src/resources/extensions/gsd/tests/reopen-task.test.ts +0 -165
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +0 -410
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +0 -606
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +0 -231
- package/src/resources/extensions/gsd/tests/requirements.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
- package/src/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
- package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +0 -161
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +0 -305
- package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +0 -82
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +0 -399
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -395
- package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +0 -296
- package/src/resources/extensions/gsd/tests/routing-history.test.ts +0 -229
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +0 -411
- package/src/resources/extensions/gsd/tests/run-manager.test.ts +0 -229
- package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +0 -176
- package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -319
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +0 -166
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +0 -315
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +0 -224
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +0 -209
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +0 -181
- package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +0 -233
- package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +0 -193
- package/src/resources/extensions/gsd/tests/skill-lifecycle.test.ts +0 -126
- package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +0 -233
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +0 -53
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +0 -123
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +0 -65
- package/src/resources/extensions/gsd/tests/stale-milestone-id-reservation.test.ts +0 -79
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -139
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +0 -100
- package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +0 -125
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +0 -305
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +0 -405
- package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +0 -257
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +0 -1628
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +0 -30
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +0 -67
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +0 -106
- package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +0 -158
- package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +0 -366
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/subagent-agent-discovery.test.ts +0 -44
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +0 -221
- package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +0 -108
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +0 -145
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +0 -122
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +0 -84
- package/src/resources/extensions/gsd/tests/test-utils.ts +0 -165
- package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +0 -118
- package/src/resources/extensions/gsd/tests/token-counter.test.ts +0 -129
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +0 -268
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +0 -166
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +0 -125
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +0 -345
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -563
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +0 -289
- package/src/resources/extensions/gsd/tests/unborn-branch.test.ts +0 -85
- package/src/resources/extensions/gsd/tests/undo.test.ts +0 -462
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +0 -203
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +0 -258
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +0 -257
- package/src/resources/extensions/gsd/tests/update-command.test.ts +0 -67
- package/src/resources/extensions/gsd/tests/vacuous-truth-slices.test.ts +0 -115
- package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +0 -154
- package/src/resources/extensions/gsd/tests/validate-directory.test.ts +0 -237
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +0 -115
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -393
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +0 -166
- package/src/resources/extensions/gsd/tests/validation.test.ts +0 -72
- package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +0 -156
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -601
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +0 -999
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +0 -82
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +0 -143
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +0 -444
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +0 -235
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +0 -716
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +0 -146
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +0 -205
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +0 -403
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +0 -278
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +0 -173
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +0 -171
- package/src/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +0 -202
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +0 -175
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +0 -445
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +0 -142
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +0 -181
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -200
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +0 -220
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +0 -238
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +0 -165
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +0 -155
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -962
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +0 -65
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +0 -133
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +0 -617
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +0 -204
- package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +0 -206
- package/src/resources/extensions/gsd/tests/worktree.test.ts +0 -279
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +0 -193
- package/src/resources/extensions/gsd/tests/write-intercept.test.ts +0 -76
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +0 -95
- package/src/resources/extensions/gsd/token-counter.ts +0 -65
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +0 -229
- package/src/resources/extensions/gsd/tools/complete-slice.ts +0 -340
- package/src/resources/extensions/gsd/tools/complete-task.ts +0 -257
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +0 -304
- package/src/resources/extensions/gsd/tools/plan-slice.ts +0 -250
- package/src/resources/extensions/gsd/tools/plan-task.ts +0 -152
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +0 -288
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +0 -126
- package/src/resources/extensions/gsd/tools/reopen-task.ts +0 -130
- package/src/resources/extensions/gsd/tools/replan-slice.ts +0 -243
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +0 -156
- package/src/resources/extensions/gsd/triage-resolution.ts +0 -413
- package/src/resources/extensions/gsd/triage-ui.ts +0 -187
- package/src/resources/extensions/gsd/types.ts +0 -593
- package/src/resources/extensions/gsd/undo.ts +0 -464
- package/src/resources/extensions/gsd/unit-id.ts +0 -14
- package/src/resources/extensions/gsd/unit-ownership.ts +0 -275
- package/src/resources/extensions/gsd/unit-runtime.ts +0 -189
- package/src/resources/extensions/gsd/validate-directory.ts +0 -164
- package/src/resources/extensions/gsd/validation.ts +0 -23
- package/src/resources/extensions/gsd/verdict-parser.ts +0 -110
- package/src/resources/extensions/gsd/verification-evidence.ts +0 -202
- package/src/resources/extensions/gsd/verification-gate.ts +0 -634
- package/src/resources/extensions/gsd/visualizer-data.ts +0 -953
- package/src/resources/extensions/gsd/visualizer-overlay.ts +0 -566
- package/src/resources/extensions/gsd/visualizer-views.ts +0 -1229
- package/src/resources/extensions/gsd/workflow-engine.ts +0 -38
- package/src/resources/extensions/gsd/workflow-events.ts +0 -154
- package/src/resources/extensions/gsd/workflow-logger.ts +0 -244
- package/src/resources/extensions/gsd/workflow-manifest.ts +0 -351
- package/src/resources/extensions/gsd/workflow-migration.ts +0 -345
- package/src/resources/extensions/gsd/workflow-projections.ts +0 -458
- package/src/resources/extensions/gsd/workflow-reconcile.ts +0 -532
- package/src/resources/extensions/gsd/workflow-templates/bugfix.md +0 -87
- package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +0 -74
- package/src/resources/extensions/gsd/workflow-templates/full-project.md +0 -40
- package/src/resources/extensions/gsd/workflow-templates/hotfix.md +0 -45
- package/src/resources/extensions/gsd/workflow-templates/refactor.md +0 -83
- package/src/resources/extensions/gsd/workflow-templates/registry.json +0 -85
- package/src/resources/extensions/gsd/workflow-templates/security-audit.md +0 -73
- package/src/resources/extensions/gsd/workflow-templates/small-feature.md +0 -81
- package/src/resources/extensions/gsd/workflow-templates/spike.md +0 -69
- package/src/resources/extensions/gsd/workflow-templates.ts +0 -252
- package/src/resources/extensions/gsd/workspace-index.ts +0 -272
- package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +0 -46
- package/src/resources/extensions/gsd/worktree-command.ts +0 -846
- package/src/resources/extensions/gsd/worktree-health.ts +0 -178
- package/src/resources/extensions/gsd/worktree-manager.ts +0 -630
- package/src/resources/extensions/gsd/worktree-resolver.ts +0 -640
- package/src/resources/extensions/gsd/worktree.ts +0 -336
- package/src/resources/extensions/gsd/write-intercept.ts +0 -90
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../../src/core/compaction/compaction.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context compaction for long sessions.\n *\n * Pure functions for compaction logic. The session manager handles I/O,\n * and after compaction the session is reloaded.\n */\n\nimport type { AgentMessage } from \"@gsd/pi-agent-core\";\nimport type { AssistantMessage, Model, Usage } from \"@gsd/pi-ai\";\nimport { completeSimple } from \"@gsd/pi-ai\";\nimport { COMPACTION_KEEP_RECENT_TOKENS, COMPACTION_RESERVE_TOKENS } from \"../constants.js\";\nimport { convertToLlm } from \"../messages.js\";\nimport type { CompactionEntry, SessionEntry } from \"../session-manager.js\";\nimport {\n\tcollectMessages,\n\tcomputeFileLists,\n\tcreateFileOps,\n\tcreateSummarizationMessage,\n\textractFileOpsFromMessage,\n\textractTextContent,\n\ttype FileOperations,\n\tformatFileOperations,\n\tgetMessageFromEntry,\n\tSUMMARIZATION_SYSTEM_PROMPT,\n\tserializeConversation,\n} from \"./utils.js\";\n\n// ============================================================================\n// File Operation Tracking\n// ============================================================================\n\n/** Details stored in CompactionEntry.details for file tracking */\nexport interface CompactionDetails {\n\treadFiles: string[];\n\tmodifiedFiles: string[];\n}\n\n/**\n * Extract file operations from messages and previous compaction entries.\n */\nfunction extractFileOperations(\n\tmessages: AgentMessage[],\n\tentries: SessionEntry[],\n\tprevCompactionIndex: number,\n): FileOperations {\n\tconst fileOps = createFileOps();\n\n\t// Collect from previous compaction's details (if pi-generated)\n\tif (prevCompactionIndex >= 0) {\n\t\tconst prevCompaction = entries[prevCompactionIndex] as CompactionEntry;\n\t\tif (!prevCompaction.fromHook && prevCompaction.details) {\n\t\t\t// fromHook field kept for session file compatibility\n\t\t\tconst details = prevCompaction.details as CompactionDetails;\n\t\t\tif (Array.isArray(details.readFiles)) {\n\t\t\t\tfor (const f of details.readFiles) fileOps.read.add(f);\n\t\t\t}\n\t\t\tif (Array.isArray(details.modifiedFiles)) {\n\t\t\t\tfor (const f of details.modifiedFiles) fileOps.edited.add(f);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Extract from tool calls in messages\n\tfor (const msg of messages) {\n\t\textractFileOpsFromMessage(msg, fileOps);\n\t}\n\n\treturn fileOps;\n}\n\n/** Result from compact() - SessionManager adds uuid/parentUuid when saving */\nexport interface CompactionResult<T = unknown> {\n\tsummary: string;\n\tfirstKeptEntryId: string;\n\ttokensBefore: number;\n\t/** Extension-specific data (e.g., ArtifactIndex, version markers for structured compaction) */\n\tdetails?: T;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CompactionSettings {\n\tenabled: boolean;\n\treserveTokens: number;\n\tkeepRecentTokens: number;\n}\n\nexport const DEFAULT_COMPACTION_SETTINGS: CompactionSettings = {\n\tenabled: true,\n\treserveTokens: COMPACTION_RESERVE_TOKENS,\n\tkeepRecentTokens: COMPACTION_KEEP_RECENT_TOKENS,\n};\n\n// ============================================================================\n// Token calculation\n// ============================================================================\n\n/**\n * Calculate total context tokens from usage.\n * Uses the native totalTokens field when available, falls back to computing from components.\n */\nexport function calculateContextTokens(usage: Usage): number {\n\treturn usage.totalTokens || usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n}\n\n/**\n * Get usage from an assistant message if available.\n * Skips aborted and error messages as they don't have valid usage data.\n */\nfunction getAssistantUsage(msg: AgentMessage): Usage | undefined {\n\tif (msg.role === \"assistant\" && \"usage\" in msg) {\n\t\tconst assistantMsg = msg as AssistantMessage;\n\t\tif (assistantMsg.stopReason !== \"aborted\" && assistantMsg.stopReason !== \"error\" && assistantMsg.usage) {\n\t\t\treturn assistantMsg.usage;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * Find the last non-aborted assistant message usage from session entries.\n */\nexport function getLastAssistantUsage(entries: SessionEntry[]): Usage | undefined {\n\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\tconst entry = entries[i];\n\t\tif (entry.type === \"message\") {\n\t\t\tconst usage = getAssistantUsage(entry.message);\n\t\t\tif (usage) return usage;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport interface ContextUsageEstimate {\n\ttokens: number;\n\tusageTokens: number;\n\ttrailingTokens: number;\n\tlastUsageIndex: number | null;\n}\n\nfunction getLastAssistantUsageInfo(messages: AgentMessage[]): { usage: Usage; index: number } | undefined {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst usage = getAssistantUsage(messages[i]);\n\t\tif (usage) return { usage, index: i };\n\t}\n\treturn undefined;\n}\n\n/**\n * Estimate context tokens from messages, using the last assistant usage when available.\n * If there are messages after the last usage, estimate their tokens with estimateTokens.\n */\nexport function estimateContextTokens(messages: AgentMessage[]): ContextUsageEstimate {\n\tconst usageInfo = getLastAssistantUsageInfo(messages);\n\n\tif (!usageInfo) {\n\t\tlet estimated = 0;\n\t\tfor (const message of messages) {\n\t\t\testimated += estimateTokens(message);\n\t\t}\n\t\treturn {\n\t\t\ttokens: estimated,\n\t\t\tusageTokens: 0,\n\t\t\ttrailingTokens: estimated,\n\t\t\tlastUsageIndex: null,\n\t\t};\n\t}\n\n\tconst usageTokens = calculateContextTokens(usageInfo.usage);\n\tlet trailingTokens = 0;\n\tfor (let i = usageInfo.index + 1; i < messages.length; i++) {\n\t\ttrailingTokens += estimateTokens(messages[i]);\n\t}\n\n\treturn {\n\t\ttokens: usageTokens + trailingTokens,\n\t\tusageTokens,\n\t\ttrailingTokens,\n\t\tlastUsageIndex: usageInfo.index,\n\t};\n}\n\n/**\n * Check if compaction should trigger based on context usage.\n */\nexport function shouldCompact(contextTokens: number, contextWindow: number, settings: CompactionSettings): boolean {\n\tif (!settings.enabled) return false;\n\treturn contextTokens > contextWindow - settings.reserveTokens;\n}\n\n// ============================================================================\n// Cut point detection\n// ============================================================================\n\n/**\n * Estimate token count for a message using chars/4 heuristic.\n * This is conservative (overestimates tokens).\n */\nexport function estimateTokens(message: AgentMessage): number {\n\tlet chars = 0;\n\n\tswitch (message.role) {\n\t\tcase \"user\": {\n\t\t\tconst content = (message as { content: string | Array<{ type: string; text?: string }> }).content;\n\t\t\tif (typeof content === \"string\") {\n\t\t\t\tchars = content.length;\n\t\t\t} else if (Array.isArray(content)) {\n\t\t\t\tfor (const block of content) {\n\t\t\t\t\tif (block.type === \"text\" && block.text) {\n\t\t\t\t\t\tchars += block.text.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Math.ceil(chars / 4);\n\t\t}\n\t\tcase \"assistant\": {\n\t\t\tconst assistant = message as AssistantMessage;\n\t\t\tfor (const block of assistant.content) {\n\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\tchars += block.text.length;\n\t\t\t\t} else if (block.type === \"thinking\") {\n\t\t\t\t\tchars += block.thinking.length;\n\t\t\t\t} else if (block.type === \"toolCall\") {\n\t\t\t\t\tchars += block.name.length + JSON.stringify(block.arguments).length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Math.ceil(chars / 4);\n\t\t}\n\t\tcase \"custom\":\n\t\tcase \"toolResult\": {\n\t\t\tif (typeof message.content === \"string\") {\n\t\t\t\tchars = message.content.length;\n\t\t\t} else {\n\t\t\t\tfor (const block of message.content) {\n\t\t\t\t\tif (block.type === \"text\" && block.text) {\n\t\t\t\t\t\tchars += block.text.length;\n\t\t\t\t\t}\n\t\t\t\t\tif (block.type === \"image\") {\n\t\t\t\t\t\tchars += 4800; // Estimate images as 4000 chars, or 1200 tokens\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Math.ceil(chars / 4);\n\t\t}\n\t\tcase \"bashExecution\": {\n\t\t\tchars = message.command.length + message.output.length;\n\t\t\treturn Math.ceil(chars / 4);\n\t\t}\n\t\tcase \"branchSummary\":\n\t\tcase \"compactionSummary\": {\n\t\t\tchars = message.summary.length;\n\t\t\treturn Math.ceil(chars / 4);\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n/**\n * Find valid cut points: indices of user, assistant, custom, or bashExecution messages.\n * Never cut at tool results (they must follow their tool call).\n * When we cut at an assistant message with tool calls, its tool results follow it\n * and will be kept.\n * BashExecutionMessage is treated like a user message (user-initiated context).\n */\nfunction findValidCutPoints(entries: SessionEntry[], startIndex: number, endIndex: number): number[] {\n\tconst cutPoints: number[] = [];\n\tfor (let i = startIndex; i < endIndex; i++) {\n\t\tconst entry = entries[i];\n\t\tswitch (entry.type) {\n\t\t\tcase \"message\": {\n\t\t\t\tconst role = entry.message.role;\n\t\t\t\tswitch (role) {\n\t\t\t\t\tcase \"bashExecution\":\n\t\t\t\t\tcase \"custom\":\n\t\t\t\t\tcase \"branchSummary\":\n\t\t\t\t\tcase \"compactionSummary\":\n\t\t\t\t\tcase \"user\":\n\t\t\t\t\tcase \"assistant\":\n\t\t\t\t\t\tcutPoints.push(i);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"toolResult\":\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"thinking_level_change\":\n\t\t\tcase \"model_change\":\n\t\t\tcase \"compaction\":\n\t\t\tcase \"branch_summary\":\n\t\t\tcase \"custom\":\n\t\t\tcase \"custom_message\":\n\t\t\tcase \"label\":\n\t\t}\n\t\t// branch_summary and custom_message are user-role messages, valid cut points\n\t\tif (entry.type === \"branch_summary\" || entry.type === \"custom_message\") {\n\t\t\tcutPoints.push(i);\n\t\t}\n\t}\n\treturn cutPoints;\n}\n\n/**\n * Find the user message (or bashExecution) that starts the turn containing the given entry index.\n * Returns -1 if no turn start found before the index.\n * BashExecutionMessage is treated like a user message for turn boundaries.\n */\nexport function findTurnStartIndex(entries: SessionEntry[], entryIndex: number, startIndex: number): number {\n\tfor (let i = entryIndex; i >= startIndex; i--) {\n\t\tconst entry = entries[i];\n\t\t// branch_summary and custom_message are user-role messages, can start a turn\n\t\tif (entry.type === \"branch_summary\" || entry.type === \"custom_message\") {\n\t\t\treturn i;\n\t\t}\n\t\tif (entry.type === \"message\") {\n\t\t\tconst role = entry.message.role;\n\t\t\tif (role === \"user\" || role === \"bashExecution\") {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t}\n\treturn -1;\n}\n\nexport interface CutPointResult {\n\t/** Index of first entry to keep */\n\tfirstKeptEntryIndex: number;\n\t/** Index of user message that starts the turn being split, or -1 if not splitting */\n\tturnStartIndex: number;\n\t/** Whether this cut splits a turn (cut point is not a user message) */\n\tisSplitTurn: boolean;\n}\n\n/**\n * Find the cut point in session entries that keeps approximately `keepRecentTokens`.\n *\n * Algorithm: Walk backwards from newest, accumulating estimated message sizes.\n * Stop when we've accumulated >= keepRecentTokens. Cut at that point.\n *\n * Can cut at user OR assistant messages (never tool results). When cutting at an\n * assistant message with tool calls, its tool results come after and will be kept.\n *\n * Returns CutPointResult with:\n * - firstKeptEntryIndex: the entry index to start keeping from\n * - turnStartIndex: if cutting mid-turn, the user message that started that turn\n * - isSplitTurn: whether we're cutting in the middle of a turn\n *\n * Only considers entries between `startIndex` and `endIndex` (exclusive).\n */\nexport function findCutPoint(\n\tentries: SessionEntry[],\n\tstartIndex: number,\n\tendIndex: number,\n\tkeepRecentTokens: number,\n): CutPointResult {\n\tconst cutPoints = findValidCutPoints(entries, startIndex, endIndex);\n\n\tif (cutPoints.length === 0) {\n\t\treturn { firstKeptEntryIndex: startIndex, turnStartIndex: -1, isSplitTurn: false };\n\t}\n\n\t// Walk backwards from newest, accumulating estimated message sizes\n\tlet accumulatedTokens = 0;\n\tlet cutIndex = cutPoints[0]; // Default: keep from first message (not header)\n\n\tfor (let i = endIndex - 1; i >= startIndex; i--) {\n\t\tconst entry = entries[i];\n\t\tif (entry.type !== \"message\") continue;\n\n\t\t// Estimate this message's size\n\t\tconst messageTokens = estimateTokens(entry.message);\n\t\taccumulatedTokens += messageTokens;\n\n\t\t// Check if we've exceeded the budget\n\t\tif (accumulatedTokens >= keepRecentTokens) {\n\t\t\t// Find the closest valid cut point at or after this entry\n\t\t\tfor (let c = 0; c < cutPoints.length; c++) {\n\t\t\t\tif (cutPoints[c] >= i) {\n\t\t\t\t\tcutIndex = cutPoints[c];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Scan backwards from cutIndex to include any non-message entries (bash, settings, etc.)\n\twhile (cutIndex > startIndex) {\n\t\tconst prevEntry = entries[cutIndex - 1];\n\t\t// Stop at session header or compaction boundaries\n\t\tif (prevEntry.type === \"compaction\") {\n\t\t\tbreak;\n\t\t}\n\t\tif (prevEntry.type === \"message\") {\n\t\t\t// Stop if we hit any message\n\t\t\tbreak;\n\t\t}\n\t\t// Include this non-message entry (bash, settings change, etc.)\n\t\tcutIndex--;\n\t}\n\n\t// Determine if this is a split turn\n\tconst cutEntry = entries[cutIndex];\n\tconst isUserMessage = cutEntry.type === \"message\" && cutEntry.message.role === \"user\";\n\tconst turnStartIndex = isUserMessage ? -1 : findTurnStartIndex(entries, cutIndex, startIndex);\n\n\treturn {\n\t\tfirstKeptEntryIndex: cutIndex,\n\t\tturnStartIndex,\n\t\tisSplitTurn: !isUserMessage && turnStartIndex !== -1,\n\t};\n}\n\n// ============================================================================\n// Summarization\n// ============================================================================\n\nconst SUMMARIZATION_PROMPT = `The messages above are a conversation to summarize. Create a structured context checkpoint summary that another LLM will use to continue the work.\n\nUse this EXACT format:\n\n## Goal\n[What is the user trying to accomplish? Can be multiple items if the session covers different tasks.]\n\n## Constraints & Preferences\n- [Any constraints, preferences, or requirements mentioned by user]\n- [Or \"(none)\" if none were mentioned]\n\n## Progress\n### Done\n- [x] [Completed tasks/changes]\n\n### In Progress\n- [ ] [Current work]\n\n### Blocked\n- [Issues preventing progress, if any]\n\n## Key Decisions\n- **[Decision]**: [Brief rationale]\n\n## Next Steps\n1. [Ordered list of what should happen next]\n\n## Critical Context\n- [Any data, examples, or references needed to continue]\n- [Or \"(none)\" if not applicable]\n\nKeep each section concise. Preserve exact file paths, function names, and error messages.`;\n\nconst UPDATE_SUMMARIZATION_PROMPT = `The messages above are NEW conversation messages to incorporate into the existing summary provided in <previous-summary> tags.\n\nUpdate the existing structured summary with new information. RULES:\n- PRESERVE all existing information from the previous summary\n- ADD new progress, decisions, and context from the new messages\n- UPDATE the Progress section: move items from \"In Progress\" to \"Done\" when completed\n- UPDATE \"Next Steps\" based on what was accomplished\n- PRESERVE exact file paths, function names, and error messages\n- If something is no longer relevant, you may remove it\n\nUse this EXACT format:\n\n## Goal\n[Preserve existing goals, add new ones if the task expanded]\n\n## Constraints & Preferences\n- [Preserve existing, add new ones discovered]\n\n## Progress\n### Done\n- [x] [Include previously done items AND newly completed items]\n\n### In Progress\n- [ ] [Current work - update based on progress]\n\n### Blocked\n- [Current blockers - remove if resolved]\n\n## Key Decisions\n- **[Decision]**: [Brief rationale] (preserve all previous, add new)\n\n## Next Steps\n1. [Update based on current state]\n\n## Critical Context\n- [Preserve important context, add new if needed]\n\nKeep each section concise. Preserve exact file paths, function names, and error messages.`;\n\n/**\n * Split messages into chunks where each chunk's estimated token count\n * stays within `maxTokensPerChunk`. A single message that exceeds the\n * budget is placed alone in its own chunk (never dropped).\n */\nexport function chunkMessages(messages: AgentMessage[], maxTokensPerChunk: number): AgentMessage[][] {\n\tconst chunks: AgentMessage[][] = [];\n\tlet currentChunk: AgentMessage[] = [];\n\tlet currentTokens = 0;\n\n\tfor (const msg of messages) {\n\t\tconst msgTokens = estimateTokens(msg);\n\n\t\tif (currentChunk.length > 0 && currentTokens + msgTokens > maxTokensPerChunk) {\n\t\t\t// Current chunk is full — start a new one\n\t\t\tchunks.push(currentChunk);\n\t\t\tcurrentChunk = [msg];\n\t\t\tcurrentTokens = msgTokens;\n\t\t} else {\n\t\t\tcurrentChunk.push(msg);\n\t\t\tcurrentTokens += msgTokens;\n\t\t}\n\t}\n\n\tif (currentChunk.length > 0) {\n\t\tchunks.push(currentChunk);\n\t}\n\n\treturn chunks;\n}\n\n/** Type for the completion function, allowing injection for tests. */\ntype CompleteFn = typeof completeSimple;\n\n/**\n * Generate a summary of the conversation using the LLM.\n * If previousSummary is provided, uses the update prompt to merge.\n *\n * When the messages exceed the model's context window, automatically\n * falls back to chunked summarization: summarize the first chunk,\n * then iteratively merge subsequent chunks using the update prompt.\n *\n * @param _completeFn - Internal override for testing; defaults to completeSimple.\n */\nexport async function generateSummary(\n\tcurrentMessages: AgentMessage[],\n\tmodel: Model<any>,\n\treserveTokens: number,\n\tapiKey: string | undefined,\n\tsignal?: AbortSignal,\n\tcustomInstructions?: string,\n\tpreviousSummary?: string,\n\t_completeFn?: CompleteFn,\n): Promise<string> {\n\tconst complete = _completeFn ?? completeSimple;\n\n\t// Estimate total tokens for the messages to summarize\n\tlet totalTokens = 0;\n\tfor (const msg of currentMessages) {\n\t\ttotalTokens += estimateTokens(msg);\n\t}\n\n\t// Overhead for the prompt framing, system prompt, and response budget\n\tconst promptOverhead = 4_000;\n\tconst maxTokens = Math.floor(0.8 * reserveTokens);\n\tconst maxInputTokens = (model.contextWindow || 200_000) - reserveTokens - promptOverhead;\n\n\t// If messages fit in the context window, use single-pass summarization\n\tif (totalTokens <= maxInputTokens) {\n\t\treturn singlePassSummary(currentMessages, model, reserveTokens, apiKey, signal, customInstructions, previousSummary, complete);\n\t}\n\n\t// Chunked fallback: split messages and iteratively summarize\n\tconst chunks = chunkMessages(currentMessages, maxInputTokens);\n\tlet runningSummary = previousSummary;\n\n\tfor (let i = 0; i < chunks.length; i++) {\n\t\trunningSummary = await singlePassSummary(\n\t\t\tchunks[i],\n\t\t\tmodel,\n\t\t\treserveTokens,\n\t\t\tapiKey,\n\t\t\tsignal,\n\t\t\tcustomInstructions,\n\t\t\trunningSummary,\n\t\t\tcomplete,\n\t\t);\n\t}\n\n\treturn runningSummary!;\n}\n\n/**\n * Single-pass summarization of messages using the LLM.\n * If previousSummary is provided, uses the update prompt to merge.\n */\nasync function singlePassSummary(\n\tcurrentMessages: AgentMessage[],\n\tmodel: Model<any>,\n\treserveTokens: number,\n\tapiKey: string | undefined,\n\tsignal?: AbortSignal,\n\tcustomInstructions?: string,\n\tpreviousSummary?: string,\n\tcomplete: CompleteFn = completeSimple,\n): Promise<string> {\n\tconst maxTokens = Math.floor(0.8 * reserveTokens);\n\n\t// Use update prompt if we have a previous summary, otherwise initial prompt\n\tlet basePrompt = previousSummary ? UPDATE_SUMMARIZATION_PROMPT : SUMMARIZATION_PROMPT;\n\tif (customInstructions) {\n\t\tbasePrompt = `${basePrompt}\\n\\nAdditional focus: ${customInstructions}`;\n\t}\n\n\t// Serialize conversation to text so model doesn't try to continue it\n\t// Convert to LLM messages first (handles custom types like bashExecution, custom, etc.)\n\tconst llmMessages = convertToLlm(currentMessages);\n\tconst conversationText = serializeConversation(llmMessages);\n\n\t// Build the prompt with conversation wrapped in tags\n\tlet promptText = `<conversation>\\n${conversationText}\\n</conversation>\\n\\n`;\n\tif (previousSummary) {\n\t\tpromptText += `<previous-summary>\\n${previousSummary}\\n</previous-summary>\\n\\n`;\n\t}\n\tpromptText += basePrompt;\n\n\tconst completionOptions = model.reasoning\n\t\t? { maxTokens, signal, apiKey, reasoning: \"high\" as const }\n\t\t: { maxTokens, signal, apiKey };\n\n\tconst response = await complete(\n\t\tmodel,\n\t\t{ systemPrompt: SUMMARIZATION_SYSTEM_PROMPT, messages: createSummarizationMessage(promptText) },\n\t\tcompletionOptions,\n\t);\n\n\tif (response.stopReason === \"error\") {\n\t\tthrow new Error(`Summarization failed: ${response.errorMessage || \"Unknown error\"}`);\n\t}\n\n\treturn extractTextContent(response.content);\n}\n\n// ============================================================================\n// Compaction Preparation (for extensions)\n// ============================================================================\n\nexport interface CompactionPreparation {\n\t/** UUID of first entry to keep */\n\tfirstKeptEntryId: string;\n\t/** Messages that will be summarized and discarded */\n\tmessagesToSummarize: AgentMessage[];\n\t/** Messages that will be turned into turn prefix summary (if splitting) */\n\tturnPrefixMessages: AgentMessage[];\n\t/** Whether this is a split turn (cut point in middle of turn) */\n\tisSplitTurn: boolean;\n\ttokensBefore: number;\n\t/** Summary from previous compaction, for iterative update */\n\tpreviousSummary?: string;\n\t/** File operations extracted from messagesToSummarize */\n\tfileOps: FileOperations;\n\t/** Compaction settions from settings.jsonl\t*/\n\tsettings: CompactionSettings;\n}\n\nexport function prepareCompaction(\n\tpathEntries: SessionEntry[],\n\tsettings: CompactionSettings,\n): CompactionPreparation | undefined {\n\tif (pathEntries.length > 0 && pathEntries[pathEntries.length - 1].type === \"compaction\") {\n\t\treturn undefined;\n\t}\n\n\tlet prevCompactionIndex = -1;\n\tfor (let i = pathEntries.length - 1; i >= 0; i--) {\n\t\tif (pathEntries[i].type === \"compaction\") {\n\t\t\tprevCompactionIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst boundaryStart = prevCompactionIndex + 1;\n\tconst boundaryEnd = pathEntries.length;\n\n\tconst usageStart = prevCompactionIndex >= 0 ? prevCompactionIndex : 0;\n\tconst usageMessages = collectMessages(pathEntries, usageStart, boundaryEnd);\n\tconst tokensBefore = estimateContextTokens(usageMessages).tokens;\n\n\tconst cutPoint = findCutPoint(pathEntries, boundaryStart, boundaryEnd, settings.keepRecentTokens);\n\n\t// Get UUID of first kept entry\n\tconst firstKeptEntry = pathEntries[cutPoint.firstKeptEntryIndex];\n\tif (!firstKeptEntry?.id) {\n\t\treturn undefined; // Session needs migration\n\t}\n\tconst firstKeptEntryId = firstKeptEntry.id;\n\n\tconst historyEnd = cutPoint.isSplitTurn ? cutPoint.turnStartIndex : cutPoint.firstKeptEntryIndex;\n\n\t// Messages to summarize (will be discarded after summary)\n\tconst messagesToSummarize = collectMessages(pathEntries, boundaryStart, historyEnd);\n\n\t// Messages for turn prefix summary (if splitting a turn)\n\tconst turnPrefixMessages = cutPoint.isSplitTurn\n\t\t? collectMessages(pathEntries, cutPoint.turnStartIndex, cutPoint.firstKeptEntryIndex)\n\t\t: [];\n\n\t// Get previous summary for iterative update\n\tlet previousSummary: string | undefined;\n\tif (prevCompactionIndex >= 0) {\n\t\tconst prevCompaction = pathEntries[prevCompactionIndex] as CompactionEntry;\n\t\tpreviousSummary = prevCompaction.summary;\n\t}\n\n\t// Extract file operations from messages and previous compaction\n\tconst fileOps = extractFileOperations(messagesToSummarize, pathEntries, prevCompactionIndex);\n\n\t// Also extract file ops from turn prefix if splitting\n\tif (cutPoint.isSplitTurn) {\n\t\tfor (const msg of turnPrefixMessages) {\n\t\t\textractFileOpsFromMessage(msg, fileOps);\n\t\t}\n\t}\n\n\treturn {\n\t\tfirstKeptEntryId,\n\t\tmessagesToSummarize,\n\t\tturnPrefixMessages,\n\t\tisSplitTurn: cutPoint.isSplitTurn,\n\t\ttokensBefore,\n\t\tpreviousSummary,\n\t\tfileOps,\n\t\tsettings,\n\t};\n}\n\n// ============================================================================\n// Main compaction function\n// ============================================================================\n\nconst TURN_PREFIX_SUMMARIZATION_PROMPT = `This is the PREFIX of a turn that was too large to keep. The SUFFIX (recent work) is retained.\n\nSummarize the prefix to provide context for the retained suffix:\n\n## Original Request\n[What did the user ask for in this turn?]\n\n## Early Progress\n- [Key decisions and work done in the prefix]\n\n## Context for Suffix\n- [Information needed to understand the retained recent work]\n\nBe concise. Focus on what's needed to understand the kept suffix.`;\n\n/**\n * Generate summaries for compaction using prepared data.\n * Returns CompactionResult - SessionManager adds uuid/parentUuid when saving.\n *\n * @param preparation - Pre-calculated preparation from prepareCompaction()\n * @param customInstructions - Optional custom focus for the summary\n */\nexport async function compact(\n\tpreparation: CompactionPreparation,\n\tmodel: Model<any>,\n\tapiKey: string | undefined,\n\tcustomInstructions?: string,\n\tsignal?: AbortSignal,\n): Promise<CompactionResult> {\n\tconst {\n\t\tfirstKeptEntryId,\n\t\tmessagesToSummarize,\n\t\tturnPrefixMessages,\n\t\tisSplitTurn,\n\t\ttokensBefore,\n\t\tpreviousSummary,\n\t\tfileOps,\n\t\tsettings,\n\t} = preparation;\n\n\t// Generate summaries (can be parallel if both needed) and merge into one\n\tlet summary: string;\n\n\tif (isSplitTurn && turnPrefixMessages.length > 0) {\n\t\t// Generate both summaries in parallel\n\t\tconst [historyResult, turnPrefixResult] = await Promise.all([\n\t\t\tmessagesToSummarize.length > 0\n\t\t\t\t? generateSummary(\n\t\t\t\t\t\tmessagesToSummarize,\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tsettings.reserveTokens,\n\t\t\t\t\t\tapiKey,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\tcustomInstructions,\n\t\t\t\t\t\tpreviousSummary,\n\t\t\t\t\t)\n\t\t\t\t: Promise.resolve(\"No prior history.\"),\n\t\t\tgenerateTurnPrefixSummary(turnPrefixMessages, model, settings.reserveTokens, apiKey, signal),\n\t\t]);\n\t\t// Merge into single summary\n\t\tsummary = `${historyResult}\\n\\n---\\n\\n**Turn Context (split turn):**\\n\\n${turnPrefixResult}`;\n\t} else {\n\t\t// Just generate history summary\n\t\tsummary = await generateSummary(\n\t\t\tmessagesToSummarize,\n\t\t\tmodel,\n\t\t\tsettings.reserveTokens,\n\t\t\tapiKey,\n\t\t\tsignal,\n\t\t\tcustomInstructions,\n\t\t\tpreviousSummary,\n\t\t);\n\t}\n\n\t// Compute file lists and append to summary\n\tconst { readFiles, modifiedFiles } = computeFileLists(fileOps);\n\tsummary += formatFileOperations(readFiles, modifiedFiles);\n\n\tif (!firstKeptEntryId) {\n\t\tthrow new Error(\"First kept entry has no UUID - session may need migration\");\n\t}\n\n\treturn {\n\t\tsummary,\n\t\tfirstKeptEntryId,\n\t\ttokensBefore,\n\t\tdetails: { readFiles, modifiedFiles } as CompactionDetails,\n\t};\n}\n\n/**\n * Generate a summary for a turn prefix (when splitting a turn).\n */\nasync function generateTurnPrefixSummary(\n\tmessages: AgentMessage[],\n\tmodel: Model<any>,\n\treserveTokens: number,\n\tapiKey: string | undefined,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tconst maxTokens = Math.floor(0.5 * reserveTokens); // Smaller budget for turn prefix\n\tconst llmMessages = convertToLlm(messages);\n\tconst conversationText = serializeConversation(llmMessages);\n\tconst promptText = `<conversation>\\n${conversationText}\\n</conversation>\\n\\n${TURN_PREFIX_SUMMARIZATION_PROMPT}`;\n\n\tconst response = await completeSimple(\n\t\tmodel,\n\t\t{ systemPrompt: SUMMARIZATION_SYSTEM_PROMPT, messages: createSummarizationMessage(promptText) },\n\t\t{ maxTokens, signal, apiKey },\n\t);\n\n\tif (response.stopReason === \"error\") {\n\t\tthrow new Error(`Turn prefix summarization failed: ${response.errorMessage || \"Unknown error\"}`);\n\t}\n\n\treturn extractTextContent(response.content);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../../src/core/compaction/compaction.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context compaction for long sessions.\n *\n * Pure functions for compaction logic. The session manager handles I/O,\n * and after compaction the session is reloaded.\n */\n\nimport type { AgentMessage } from \"@gsd/pi-agent-core\";\nimport type { AssistantMessage, Model, Usage } from \"@gsd/pi-ai\";\nimport { completeSimple } from \"@gsd/pi-ai\";\nimport { COMPACTION_KEEP_RECENT_TOKENS, COMPACTION_RESERVE_TOKENS } from \"../constants.js\";\nimport { convertToLlm } from \"../messages.js\";\nimport type { CompactionEntry, SessionEntry } from \"../session-manager.js\";\nimport {\n\tcollectMessages,\n\tcomputeFileLists,\n\tcreateFileOps,\n\tcreateSummarizationMessage,\n\textractFileOpsFromMessage,\n\textractTextContent,\n\ttype FileOperations,\n\tformatFileOperations,\n\tgetMessageFromEntry,\n\tSUMMARIZATION_SYSTEM_PROMPT,\n\tserializeConversation,\n} from \"./utils.js\";\n\n// ============================================================================\n// File Operation Tracking\n// ============================================================================\n\n/** Details stored in CompactionEntry.details for file tracking */\nexport interface CompactionDetails {\n\treadFiles: string[];\n\tmodifiedFiles: string[];\n}\n\n/**\n * Extract file operations from messages and previous compaction entries.\n */\nfunction extractFileOperations(\n\tmessages: AgentMessage[],\n\tentries: SessionEntry[],\n\tprevCompactionIndex: number,\n): FileOperations {\n\tconst fileOps = createFileOps();\n\n\t// Collect from previous compaction's details (if pi-generated)\n\tif (prevCompactionIndex >= 0) {\n\t\tconst prevCompaction = entries[prevCompactionIndex] as CompactionEntry;\n\t\tif (!prevCompaction.fromHook && prevCompaction.details) {\n\t\t\t// fromHook field kept for session file compatibility\n\t\t\tconst details = prevCompaction.details as CompactionDetails;\n\t\t\tif (Array.isArray(details.readFiles)) {\n\t\t\t\tfor (const f of details.readFiles) fileOps.read.add(f);\n\t\t\t}\n\t\t\tif (Array.isArray(details.modifiedFiles)) {\n\t\t\t\tfor (const f of details.modifiedFiles) fileOps.edited.add(f);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Extract from tool calls in messages\n\tfor (const msg of messages) {\n\t\textractFileOpsFromMessage(msg, fileOps);\n\t}\n\n\treturn fileOps;\n}\n\n/** Result from compact() - SessionManager adds uuid/parentUuid when saving */\nexport interface CompactionResult<T = unknown> {\n\tsummary: string;\n\tfirstKeptEntryId: string;\n\ttokensBefore: number;\n\t/** Extension-specific data (e.g., ArtifactIndex, version markers for structured compaction) */\n\tdetails?: T;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CompactionSettings {\n\tenabled: boolean;\n\treserveTokens: number;\n\tkeepRecentTokens: number;\n\tthresholdPercent: number;\n}\n\nexport const DEFAULT_COMPACTION_SETTINGS: CompactionSettings = {\n\tenabled: true,\n\treserveTokens: COMPACTION_RESERVE_TOKENS,\n\tkeepRecentTokens: COMPACTION_KEEP_RECENT_TOKENS,\n\tthresholdPercent: 85,\n};\n\n// ============================================================================\n// Token calculation\n// ============================================================================\n\n/**\n * Calculate total context tokens from usage.\n * Uses the native totalTokens field when available, falls back to computing from components.\n */\nexport function calculateContextTokens(usage: Usage): number {\n\treturn usage.totalTokens || usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n}\n\n/**\n * Get usage from an assistant message if available.\n * Skips aborted and error messages as they don't have valid usage data.\n */\nfunction getAssistantUsage(msg: AgentMessage): Usage | undefined {\n\tif (msg.role === \"assistant\" && \"usage\" in msg) {\n\t\tconst assistantMsg = msg as AssistantMessage;\n\t\tif (assistantMsg.stopReason !== \"aborted\" && assistantMsg.stopReason !== \"error\" && assistantMsg.usage) {\n\t\t\treturn assistantMsg.usage;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * Find the last non-aborted assistant message usage from session entries.\n */\nexport function getLastAssistantUsage(entries: SessionEntry[]): Usage | undefined {\n\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\tconst entry = entries[i];\n\t\tif (entry.type === \"message\") {\n\t\t\tconst usage = getAssistantUsage(entry.message);\n\t\t\tif (usage) return usage;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport interface ContextUsageEstimate {\n\ttokens: number;\n\tusageTokens: number;\n\ttrailingTokens: number;\n\tlastUsageIndex: number | null;\n}\n\nfunction getLastAssistantUsageInfo(messages: AgentMessage[]): { usage: Usage; index: number } | undefined {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst usage = getAssistantUsage(messages[i]);\n\t\tif (usage) return { usage, index: i };\n\t}\n\treturn undefined;\n}\n\n/**\n * Estimate context tokens from messages, using the last assistant usage when available.\n * If there are messages after the last usage, estimate their tokens with estimateTokens.\n */\nexport function estimateContextTokens(messages: AgentMessage[]): ContextUsageEstimate {\n\tconst usageInfo = getLastAssistantUsageInfo(messages);\n\n\tif (!usageInfo) {\n\t\tlet estimated = 0;\n\t\tfor (const message of messages) {\n\t\t\testimated += estimateTokens(message);\n\t\t}\n\t\treturn {\n\t\t\ttokens: estimated,\n\t\t\tusageTokens: 0,\n\t\t\ttrailingTokens: estimated,\n\t\t\tlastUsageIndex: null,\n\t\t};\n\t}\n\n\tconst usageTokens = calculateContextTokens(usageInfo.usage);\n\tlet trailingTokens = 0;\n\tfor (let i = usageInfo.index + 1; i < messages.length; i++) {\n\t\ttrailingTokens += estimateTokens(messages[i]);\n\t}\n\n\treturn {\n\t\ttokens: usageTokens + trailingTokens,\n\t\tusageTokens,\n\t\ttrailingTokens,\n\t\tlastUsageIndex: usageInfo.index,\n\t};\n}\n\n/**\n * Check if compaction should trigger based on context usage.\n * Uses thresholdPercent (e.g. 85 = trigger at 85% of context window) when contextWindow > 0.\n * Falls back to reserveTokens for overflow/unknown-window cases.\n */\nexport function shouldCompact(contextTokens: number, contextWindow: number, settings: CompactionSettings): boolean {\n\tif (!settings.enabled) return false;\n\tif (contextWindow > 0) {\n\t\tconst threshold = Math.floor(contextWindow * (settings.thresholdPercent / 100));\n\t\treturn contextTokens >= threshold;\n\t}\n\t// No context window info — fall back to reserve-token guard\n\treturn contextTokens > contextWindow - settings.reserveTokens;\n}\n\n// ============================================================================\n// Cut point detection\n// ============================================================================\n\n/**\n * Estimate token count for a message using chars/4 heuristic.\n * This is conservative (overestimates tokens).\n */\nexport function estimateTokens(message: AgentMessage): number {\n\tlet chars = 0;\n\n\tswitch (message.role) {\n\t\tcase \"user\": {\n\t\t\tconst content = (message as { content: string | Array<{ type: string; text?: string }> }).content;\n\t\t\tif (typeof content === \"string\") {\n\t\t\t\tchars = content.length;\n\t\t\t} else if (Array.isArray(content)) {\n\t\t\t\tfor (const block of content) {\n\t\t\t\t\tif (block.type === \"text\" && block.text) {\n\t\t\t\t\t\tchars += block.text.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Math.ceil(chars / 4);\n\t\t}\n\t\tcase \"assistant\": {\n\t\t\tconst assistant = message as AssistantMessage;\n\t\t\tfor (const block of assistant.content) {\n\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\tchars += block.text.length;\n\t\t\t\t} else if (block.type === \"thinking\") {\n\t\t\t\t\tchars += block.thinking.length;\n\t\t\t\t} else if (block.type === \"toolCall\") {\n\t\t\t\t\tchars += block.name.length + JSON.stringify(block.arguments).length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Math.ceil(chars / 4);\n\t\t}\n\t\tcase \"custom\":\n\t\tcase \"toolResult\": {\n\t\t\tif (typeof message.content === \"string\") {\n\t\t\t\tchars = message.content.length;\n\t\t\t} else {\n\t\t\t\tfor (const block of message.content) {\n\t\t\t\t\tif (block.type === \"text\" && block.text) {\n\t\t\t\t\t\tchars += block.text.length;\n\t\t\t\t\t}\n\t\t\t\t\tif (block.type === \"image\") {\n\t\t\t\t\t\tchars += 4800; // Estimate images as 4000 chars, or 1200 tokens\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Math.ceil(chars / 4);\n\t\t}\n\t\tcase \"bashExecution\": {\n\t\t\tchars = message.command.length + message.output.length;\n\t\t\treturn Math.ceil(chars / 4);\n\t\t}\n\t\tcase \"branchSummary\":\n\t\tcase \"compactionSummary\": {\n\t\t\tchars = message.summary.length;\n\t\t\treturn Math.ceil(chars / 4);\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n/**\n * Find valid cut points: indices of user, assistant, custom, or bashExecution messages.\n * Never cut at tool results (they must follow their tool call).\n * When we cut at an assistant message with tool calls, its tool results follow it\n * and will be kept.\n * BashExecutionMessage is treated like a user message (user-initiated context).\n */\nfunction findValidCutPoints(entries: SessionEntry[], startIndex: number, endIndex: number): number[] {\n\tconst cutPoints: number[] = [];\n\tfor (let i = startIndex; i < endIndex; i++) {\n\t\tconst entry = entries[i];\n\t\tswitch (entry.type) {\n\t\t\tcase \"message\": {\n\t\t\t\tconst role = entry.message.role;\n\t\t\t\tswitch (role) {\n\t\t\t\t\tcase \"bashExecution\":\n\t\t\t\t\tcase \"custom\":\n\t\t\t\t\tcase \"branchSummary\":\n\t\t\t\t\tcase \"compactionSummary\":\n\t\t\t\t\tcase \"user\":\n\t\t\t\t\tcase \"assistant\":\n\t\t\t\t\t\tcutPoints.push(i);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"toolResult\":\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"thinking_level_change\":\n\t\t\tcase \"model_change\":\n\t\t\tcase \"compaction\":\n\t\t\tcase \"branch_summary\":\n\t\t\tcase \"custom\":\n\t\t\tcase \"custom_message\":\n\t\t\tcase \"label\":\n\t\t}\n\t\t// branch_summary and custom_message are user-role messages, valid cut points\n\t\tif (entry.type === \"branch_summary\" || entry.type === \"custom_message\") {\n\t\t\tcutPoints.push(i);\n\t\t}\n\t}\n\treturn cutPoints;\n}\n\n/**\n * Find the user message (or bashExecution) that starts the turn containing the given entry index.\n * Returns -1 if no turn start found before the index.\n * BashExecutionMessage is treated like a user message for turn boundaries.\n */\nexport function findTurnStartIndex(entries: SessionEntry[], entryIndex: number, startIndex: number): number {\n\tfor (let i = entryIndex; i >= startIndex; i--) {\n\t\tconst entry = entries[i];\n\t\t// branch_summary and custom_message are user-role messages, can start a turn\n\t\tif (entry.type === \"branch_summary\" || entry.type === \"custom_message\") {\n\t\t\treturn i;\n\t\t}\n\t\tif (entry.type === \"message\") {\n\t\t\tconst role = entry.message.role;\n\t\t\tif (role === \"user\" || role === \"bashExecution\") {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t}\n\treturn -1;\n}\n\nexport interface CutPointResult {\n\t/** Index of first entry to keep */\n\tfirstKeptEntryIndex: number;\n\t/** Index of user message that starts the turn being split, or -1 if not splitting */\n\tturnStartIndex: number;\n\t/** Whether this cut splits a turn (cut point is not a user message) */\n\tisSplitTurn: boolean;\n}\n\n/**\n * Find the cut point in session entries that keeps approximately `keepRecentTokens`.\n *\n * Algorithm: Walk backwards from newest, accumulating estimated message sizes.\n * Stop when we've accumulated >= keepRecentTokens. Cut at that point.\n *\n * Can cut at user OR assistant messages (never tool results). When cutting at an\n * assistant message with tool calls, its tool results come after and will be kept.\n *\n * Returns CutPointResult with:\n * - firstKeptEntryIndex: the entry index to start keeping from\n * - turnStartIndex: if cutting mid-turn, the user message that started that turn\n * - isSplitTurn: whether we're cutting in the middle of a turn\n *\n * Only considers entries between `startIndex` and `endIndex` (exclusive).\n */\nexport function findCutPoint(\n\tentries: SessionEntry[],\n\tstartIndex: number,\n\tendIndex: number,\n\tkeepRecentTokens: number,\n): CutPointResult {\n\tconst cutPoints = findValidCutPoints(entries, startIndex, endIndex);\n\n\tif (cutPoints.length === 0) {\n\t\treturn { firstKeptEntryIndex: startIndex, turnStartIndex: -1, isSplitTurn: false };\n\t}\n\n\t// Walk backwards from newest, accumulating estimated message sizes\n\tlet accumulatedTokens = 0;\n\tlet cutIndex = cutPoints[0]; // Default: keep from first message (not header)\n\n\tfor (let i = endIndex - 1; i >= startIndex; i--) {\n\t\tconst entry = entries[i];\n\t\tif (entry.type !== \"message\") continue;\n\n\t\t// Estimate this message's size\n\t\tconst messageTokens = estimateTokens(entry.message);\n\t\taccumulatedTokens += messageTokens;\n\n\t\t// Check if we've exceeded the budget\n\t\tif (accumulatedTokens >= keepRecentTokens) {\n\t\t\t// Find the closest valid cut point at or after this entry\n\t\t\tfor (let c = 0; c < cutPoints.length; c++) {\n\t\t\t\tif (cutPoints[c] >= i) {\n\t\t\t\t\tcutIndex = cutPoints[c];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Scan backwards from cutIndex to include any non-message entries (bash, settings, etc.)\n\twhile (cutIndex > startIndex) {\n\t\tconst prevEntry = entries[cutIndex - 1];\n\t\t// Stop at session header or compaction boundaries\n\t\tif (prevEntry.type === \"compaction\") {\n\t\t\tbreak;\n\t\t}\n\t\tif (prevEntry.type === \"message\") {\n\t\t\t// Stop if we hit any message\n\t\t\tbreak;\n\t\t}\n\t\t// Include this non-message entry (bash, settings change, etc.)\n\t\tcutIndex--;\n\t}\n\n\t// Determine if this is a split turn\n\tconst cutEntry = entries[cutIndex];\n\tconst isUserMessage = cutEntry.type === \"message\" && cutEntry.message.role === \"user\";\n\tconst turnStartIndex = isUserMessage ? -1 : findTurnStartIndex(entries, cutIndex, startIndex);\n\n\treturn {\n\t\tfirstKeptEntryIndex: cutIndex,\n\t\tturnStartIndex,\n\t\tisSplitTurn: !isUserMessage && turnStartIndex !== -1,\n\t};\n}\n\n// ============================================================================\n// Summarization\n// ============================================================================\n\nconst SUMMARIZATION_PROMPT = `The messages above are a conversation to summarize. Create a structured context checkpoint summary that another LLM will use to continue the work.\n\nUse this EXACT format:\n\n## Goal\n[What is the user trying to accomplish? Can be multiple items if the session covers different tasks.]\n\n## Constraints & Preferences\n- [Any constraints, preferences, or requirements mentioned by user]\n- [Or \"(none)\" if none were mentioned]\n\n## Progress\n### Done\n- [x] [Completed tasks/changes]\n\n### In Progress\n- [ ] [Current work]\n\n### Blocked\n- [Issues preventing progress, if any]\n\n## Key Decisions\n- **[Decision]**: [Brief rationale]\n\n## Next Steps\n1. [Ordered list of what should happen next]\n\n## Critical Context\n- [Any data, examples, or references needed to continue]\n- [Or \"(none)\" if not applicable]\n\nKeep each section concise. Preserve exact file paths, function names, and error messages.`;\n\nconst UPDATE_SUMMARIZATION_PROMPT = `The messages above are NEW conversation messages to incorporate into the existing summary provided in <previous-summary> tags.\n\nUpdate the existing structured summary with new information. RULES:\n- PRESERVE all existing information from the previous summary\n- ADD new progress, decisions, and context from the new messages\n- UPDATE the Progress section: move items from \"In Progress\" to \"Done\" when completed\n- UPDATE \"Next Steps\" based on what was accomplished\n- PRESERVE exact file paths, function names, and error messages\n- If something is no longer relevant, you may remove it\n\nUse this EXACT format:\n\n## Goal\n[Preserve existing goals, add new ones if the task expanded]\n\n## Constraints & Preferences\n- [Preserve existing, add new ones discovered]\n\n## Progress\n### Done\n- [x] [Include previously done items AND newly completed items]\n\n### In Progress\n- [ ] [Current work - update based on progress]\n\n### Blocked\n- [Current blockers - remove if resolved]\n\n## Key Decisions\n- **[Decision]**: [Brief rationale] (preserve all previous, add new)\n\n## Next Steps\n1. [Update based on current state]\n\n## Critical Context\n- [Preserve important context, add new if needed]\n\nKeep each section concise. Preserve exact file paths, function names, and error messages.`;\n\n/**\n * Split messages into chunks where each chunk's estimated token count\n * stays within `maxTokensPerChunk`. A single message that exceeds the\n * budget is placed alone in its own chunk (never dropped).\n */\nexport function chunkMessages(messages: AgentMessage[], maxTokensPerChunk: number): AgentMessage[][] {\n\tconst chunks: AgentMessage[][] = [];\n\tlet currentChunk: AgentMessage[] = [];\n\tlet currentTokens = 0;\n\n\tfor (const msg of messages) {\n\t\tconst msgTokens = estimateTokens(msg);\n\n\t\tif (currentChunk.length > 0 && currentTokens + msgTokens > maxTokensPerChunk) {\n\t\t\t// Current chunk is full — start a new one\n\t\t\tchunks.push(currentChunk);\n\t\t\tcurrentChunk = [msg];\n\t\t\tcurrentTokens = msgTokens;\n\t\t} else {\n\t\t\tcurrentChunk.push(msg);\n\t\t\tcurrentTokens += msgTokens;\n\t\t}\n\t}\n\n\tif (currentChunk.length > 0) {\n\t\tchunks.push(currentChunk);\n\t}\n\n\treturn chunks;\n}\n\n/** Type for the completion function, allowing injection for tests. */\ntype CompleteFn = typeof completeSimple;\n\n/**\n * Generate a summary of the conversation using the LLM.\n * If previousSummary is provided, uses the update prompt to merge.\n *\n * When the messages exceed the model's context window, automatically\n * falls back to chunked summarization: summarize the first chunk,\n * then iteratively merge subsequent chunks using the update prompt.\n *\n * @param _completeFn - Internal override for testing; defaults to completeSimple.\n */\nexport async function generateSummary(\n\tcurrentMessages: AgentMessage[],\n\tmodel: Model<any>,\n\treserveTokens: number,\n\tapiKey: string | undefined,\n\tsignal?: AbortSignal,\n\tcustomInstructions?: string,\n\tpreviousSummary?: string,\n\t_completeFn?: CompleteFn,\n): Promise<string> {\n\tconst complete = _completeFn ?? completeSimple;\n\n\t// Estimate total tokens for the messages to summarize\n\tlet totalTokens = 0;\n\tfor (const msg of currentMessages) {\n\t\ttotalTokens += estimateTokens(msg);\n\t}\n\n\t// Overhead for the prompt framing, system prompt, and response budget\n\tconst promptOverhead = 4_000;\n\tconst maxTokens = Math.floor(0.8 * reserveTokens);\n\tconst maxInputTokens = (model.contextWindow || 200_000) - reserveTokens - promptOverhead;\n\n\t// If messages fit in the context window, use single-pass summarization\n\tif (totalTokens <= maxInputTokens) {\n\t\treturn singlePassSummary(currentMessages, model, reserveTokens, apiKey, signal, customInstructions, previousSummary, complete);\n\t}\n\n\t// Chunked fallback: split messages and iteratively summarize\n\tconst chunks = chunkMessages(currentMessages, maxInputTokens);\n\tlet runningSummary = previousSummary;\n\n\tfor (let i = 0; i < chunks.length; i++) {\n\t\trunningSummary = await singlePassSummary(\n\t\t\tchunks[i],\n\t\t\tmodel,\n\t\t\treserveTokens,\n\t\t\tapiKey,\n\t\t\tsignal,\n\t\t\tcustomInstructions,\n\t\t\trunningSummary,\n\t\t\tcomplete,\n\t\t);\n\t}\n\n\treturn runningSummary!;\n}\n\n/**\n * Single-pass summarization of messages using the LLM.\n * If previousSummary is provided, uses the update prompt to merge.\n */\nasync function singlePassSummary(\n\tcurrentMessages: AgentMessage[],\n\tmodel: Model<any>,\n\treserveTokens: number,\n\tapiKey: string | undefined,\n\tsignal?: AbortSignal,\n\tcustomInstructions?: string,\n\tpreviousSummary?: string,\n\tcomplete: CompleteFn = completeSimple,\n): Promise<string> {\n\tconst maxTokens = Math.floor(0.8 * reserveTokens);\n\n\t// Use update prompt if we have a previous summary, otherwise initial prompt\n\tlet basePrompt = previousSummary ? UPDATE_SUMMARIZATION_PROMPT : SUMMARIZATION_PROMPT;\n\tif (customInstructions) {\n\t\tbasePrompt = `${basePrompt}\\n\\nAdditional focus: ${customInstructions}`;\n\t}\n\n\t// Serialize conversation to text so model doesn't try to continue it\n\t// Convert to LLM messages first (handles custom types like bashExecution, custom, etc.)\n\tconst llmMessages = convertToLlm(currentMessages);\n\tconst conversationText = serializeConversation(llmMessages);\n\n\t// Build the prompt with conversation wrapped in tags\n\tlet promptText = `<conversation>\\n${conversationText}\\n</conversation>\\n\\n`;\n\tif (previousSummary) {\n\t\tpromptText += `<previous-summary>\\n${previousSummary}\\n</previous-summary>\\n\\n`;\n\t}\n\tpromptText += basePrompt;\n\n\tconst completionOptions = model.reasoning\n\t\t? { maxTokens, signal, apiKey, reasoning: \"high\" as const }\n\t\t: { maxTokens, signal, apiKey };\n\n\tconst response = await complete(\n\t\tmodel,\n\t\t{ systemPrompt: SUMMARIZATION_SYSTEM_PROMPT, messages: createSummarizationMessage(promptText) },\n\t\tcompletionOptions,\n\t);\n\n\tif (response.stopReason === \"error\") {\n\t\tthrow new Error(`Summarization failed: ${response.errorMessage || \"Unknown error\"}`);\n\t}\n\n\treturn extractTextContent(response.content);\n}\n\n// ============================================================================\n// Compaction Preparation (for extensions)\n// ============================================================================\n\nexport interface CompactionPreparation {\n\t/** UUID of first entry to keep */\n\tfirstKeptEntryId: string;\n\t/** Messages that will be summarized and discarded */\n\tmessagesToSummarize: AgentMessage[];\n\t/** Messages that will be turned into turn prefix summary (if splitting) */\n\tturnPrefixMessages: AgentMessage[];\n\t/** Whether this is a split turn (cut point in middle of turn) */\n\tisSplitTurn: boolean;\n\ttokensBefore: number;\n\t/** Summary from previous compaction, for iterative update */\n\tpreviousSummary?: string;\n\t/** File operations extracted from messagesToSummarize */\n\tfileOps: FileOperations;\n\t/** Compaction settions from settings.jsonl\t*/\n\tsettings: CompactionSettings;\n}\n\nexport function prepareCompaction(\n\tpathEntries: SessionEntry[],\n\tsettings: CompactionSettings,\n): CompactionPreparation | undefined {\n\tif (pathEntries.length > 0 && pathEntries[pathEntries.length - 1].type === \"compaction\") {\n\t\treturn undefined;\n\t}\n\n\tlet prevCompactionIndex = -1;\n\tfor (let i = pathEntries.length - 1; i >= 0; i--) {\n\t\tif (pathEntries[i].type === \"compaction\") {\n\t\t\tprevCompactionIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst boundaryStart = prevCompactionIndex + 1;\n\tconst boundaryEnd = pathEntries.length;\n\n\tconst usageStart = prevCompactionIndex >= 0 ? prevCompactionIndex : 0;\n\tconst usageMessages = collectMessages(pathEntries, usageStart, boundaryEnd);\n\tconst tokensBefore = estimateContextTokens(usageMessages).tokens;\n\n\tconst cutPoint = findCutPoint(pathEntries, boundaryStart, boundaryEnd, settings.keepRecentTokens);\n\n\t// Get UUID of first kept entry\n\tconst firstKeptEntry = pathEntries[cutPoint.firstKeptEntryIndex];\n\tif (!firstKeptEntry?.id) {\n\t\treturn undefined; // Session needs migration\n\t}\n\tconst firstKeptEntryId = firstKeptEntry.id;\n\n\tconst historyEnd = cutPoint.isSplitTurn ? cutPoint.turnStartIndex : cutPoint.firstKeptEntryIndex;\n\n\t// Messages to summarize (will be discarded after summary)\n\tconst messagesToSummarize = collectMessages(pathEntries, boundaryStart, historyEnd);\n\n\t// Messages for turn prefix summary (if splitting a turn)\n\tconst turnPrefixMessages = cutPoint.isSplitTurn\n\t\t? collectMessages(pathEntries, cutPoint.turnStartIndex, cutPoint.firstKeptEntryIndex)\n\t\t: [];\n\n\t// Get previous summary for iterative update\n\tlet previousSummary: string | undefined;\n\tif (prevCompactionIndex >= 0) {\n\t\tconst prevCompaction = pathEntries[prevCompactionIndex] as CompactionEntry;\n\t\tpreviousSummary = prevCompaction.summary;\n\t}\n\n\t// Extract file operations from messages and previous compaction\n\tconst fileOps = extractFileOperations(messagesToSummarize, pathEntries, prevCompactionIndex);\n\n\t// Also extract file ops from turn prefix if splitting\n\tif (cutPoint.isSplitTurn) {\n\t\tfor (const msg of turnPrefixMessages) {\n\t\t\textractFileOpsFromMessage(msg, fileOps);\n\t\t}\n\t}\n\n\treturn {\n\t\tfirstKeptEntryId,\n\t\tmessagesToSummarize,\n\t\tturnPrefixMessages,\n\t\tisSplitTurn: cutPoint.isSplitTurn,\n\t\ttokensBefore,\n\t\tpreviousSummary,\n\t\tfileOps,\n\t\tsettings,\n\t};\n}\n\n// ============================================================================\n// Main compaction function\n// ============================================================================\n\nconst TURN_PREFIX_SUMMARIZATION_PROMPT = `This is the PREFIX of a turn that was too large to keep. The SUFFIX (recent work) is retained.\n\nSummarize the prefix to provide context for the retained suffix:\n\n## Original Request\n[What did the user ask for in this turn?]\n\n## Early Progress\n- [Key decisions and work done in the prefix]\n\n## Context for Suffix\n- [Information needed to understand the retained recent work]\n\nBe concise. Focus on what's needed to understand the kept suffix.`;\n\n/**\n * Generate summaries for compaction using prepared data.\n * Returns CompactionResult - SessionManager adds uuid/parentUuid when saving.\n *\n * @param preparation - Pre-calculated preparation from prepareCompaction()\n * @param customInstructions - Optional custom focus for the summary\n */\nexport async function compact(\n\tpreparation: CompactionPreparation,\n\tmodel: Model<any>,\n\tapiKey: string | undefined,\n\tcustomInstructions?: string,\n\tsignal?: AbortSignal,\n): Promise<CompactionResult> {\n\tconst {\n\t\tfirstKeptEntryId,\n\t\tmessagesToSummarize,\n\t\tturnPrefixMessages,\n\t\tisSplitTurn,\n\t\ttokensBefore,\n\t\tpreviousSummary,\n\t\tfileOps,\n\t\tsettings,\n\t} = preparation;\n\n\t// Generate summaries (can be parallel if both needed) and merge into one\n\tlet summary: string;\n\n\tif (isSplitTurn && turnPrefixMessages.length > 0) {\n\t\t// Generate both summaries in parallel\n\t\tconst [historyResult, turnPrefixResult] = await Promise.all([\n\t\t\tmessagesToSummarize.length > 0\n\t\t\t\t? generateSummary(\n\t\t\t\t\t\tmessagesToSummarize,\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tsettings.reserveTokens,\n\t\t\t\t\t\tapiKey,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\tcustomInstructions,\n\t\t\t\t\t\tpreviousSummary,\n\t\t\t\t\t)\n\t\t\t\t: Promise.resolve(\"No prior history.\"),\n\t\t\tgenerateTurnPrefixSummary(turnPrefixMessages, model, settings.reserveTokens, apiKey, signal),\n\t\t]);\n\t\t// Merge into single summary\n\t\tsummary = `${historyResult}\\n\\n---\\n\\n**Turn Context (split turn):**\\n\\n${turnPrefixResult}`;\n\t} else {\n\t\t// Just generate history summary\n\t\tsummary = await generateSummary(\n\t\t\tmessagesToSummarize,\n\t\t\tmodel,\n\t\t\tsettings.reserveTokens,\n\t\t\tapiKey,\n\t\t\tsignal,\n\t\t\tcustomInstructions,\n\t\t\tpreviousSummary,\n\t\t);\n\t}\n\n\t// Compute file lists and append to summary\n\tconst { readFiles, modifiedFiles } = computeFileLists(fileOps);\n\tsummary += formatFileOperations(readFiles, modifiedFiles);\n\n\tif (!firstKeptEntryId) {\n\t\tthrow new Error(\"First kept entry has no UUID - session may need migration\");\n\t}\n\n\treturn {\n\t\tsummary,\n\t\tfirstKeptEntryId,\n\t\ttokensBefore,\n\t\tdetails: { readFiles, modifiedFiles } as CompactionDetails,\n\t};\n}\n\n/**\n * Generate a summary for a turn prefix (when splitting a turn).\n */\nasync function generateTurnPrefixSummary(\n\tmessages: AgentMessage[],\n\tmodel: Model<any>,\n\treserveTokens: number,\n\tapiKey: string | undefined,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tconst maxTokens = Math.floor(0.5 * reserveTokens); // Smaller budget for turn prefix\n\tconst llmMessages = convertToLlm(messages);\n\tconst conversationText = serializeConversation(llmMessages);\n\tconst promptText = `<conversation>\\n${conversationText}\\n</conversation>\\n\\n${TURN_PREFIX_SUMMARIZATION_PROMPT}`;\n\n\tconst response = await completeSimple(\n\t\tmodel,\n\t\t{ systemPrompt: SUMMARIZATION_SYSTEM_PROMPT, messages: createSummarizationMessage(promptText) },\n\t\t{ maxTokens, signal, apiKey },\n\t);\n\n\tif (response.stopReason === \"error\") {\n\t\tthrow new Error(`Turn prefix summarization failed: ${response.errorMessage || \"Unknown error\"}`);\n\t}\n\n\treturn extractTextContent(response.content);\n}\n"]}
|
|
@@ -36,9 +36,21 @@ export declare class CompactionOrchestrator {
|
|
|
36
36
|
private _autoCompactionAbortController;
|
|
37
37
|
private _overflowRecoveryAttempted;
|
|
38
38
|
private _branchSummaryAbortController;
|
|
39
|
+
private _autoCompactionPromise;
|
|
40
|
+
private _autoCompactionResolve;
|
|
41
|
+
private _pendingAutoContinues;
|
|
39
42
|
constructor(_deps: CompactionOrchestratorDeps);
|
|
40
43
|
/** Whether compaction or branch summarization is currently running */
|
|
41
44
|
get isCompacting(): boolean;
|
|
45
|
+
/** Whether an auto-compaction follow-up (including resume/continue) is in progress */
|
|
46
|
+
get hasPendingAutoCompaction(): boolean;
|
|
47
|
+
/** Create an auto-compaction wait promise synchronously for agent_end events. */
|
|
48
|
+
createAutoCompactionPromiseForAgentEnd(messages: Array<{
|
|
49
|
+
role: string;
|
|
50
|
+
} & Record<string, any>>): void;
|
|
51
|
+
/** Wait for any in-progress auto-compaction follow-up to settle. */
|
|
52
|
+
waitForAutoCompaction(): Promise<void>;
|
|
53
|
+
private _resolveAutoCompaction;
|
|
42
54
|
/** Reset overflow recovery flag (called when a new user message starts) */
|
|
43
55
|
resetOverflowRecovery(): void;
|
|
44
56
|
/** Mark overflow recovery as not needed (called on successful assistant response) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compaction-orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/compaction-orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,EACN,KAAK,gBAAgB,EAMrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,eAAe,EAA8B,MAAM,uBAAuB,CAAC;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,0EAA0E;AAC1E,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACvC,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,eAAe,GAAG,SAAS,CAAC;IACtD,IAAI,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACzC,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,qBAAa,sBAAsB;
|
|
1
|
+
{"version":3,"file":"compaction-orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/compaction-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,9 @@ export class CompactionOrchestrator {
|
|
|
19
19
|
this._autoCompactionAbortController = undefined;
|
|
20
20
|
this._overflowRecoveryAttempted = false;
|
|
21
21
|
this._branchSummaryAbortController = undefined;
|
|
22
|
+
this._autoCompactionPromise = undefined;
|
|
23
|
+
this._autoCompactionResolve = undefined;
|
|
24
|
+
this._pendingAutoContinues = 0;
|
|
22
25
|
}
|
|
23
26
|
/** Whether compaction or branch summarization is currently running */
|
|
24
27
|
get isCompacting() {
|
|
@@ -26,6 +29,39 @@ export class CompactionOrchestrator {
|
|
|
26
29
|
this._compactionAbortController !== undefined ||
|
|
27
30
|
this._branchSummaryAbortController !== undefined);
|
|
28
31
|
}
|
|
32
|
+
/** Whether an auto-compaction follow-up (including resume/continue) is in progress */
|
|
33
|
+
get hasPendingAutoCompaction() {
|
|
34
|
+
return this._autoCompactionPromise !== undefined;
|
|
35
|
+
}
|
|
36
|
+
/** Create an auto-compaction wait promise synchronously for agent_end events. */
|
|
37
|
+
createAutoCompactionPromiseForAgentEnd(messages) {
|
|
38
|
+
if (this._autoCompactionPromise)
|
|
39
|
+
return;
|
|
40
|
+
if (!this._deps.settingsManager.getCompactionEnabled())
|
|
41
|
+
return;
|
|
42
|
+
const hasAssistant = messages.some((message) => message.role === "assistant");
|
|
43
|
+
if (!hasAssistant)
|
|
44
|
+
return;
|
|
45
|
+
this._autoCompactionPromise = new Promise((resolve) => {
|
|
46
|
+
this._autoCompactionResolve = resolve;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/** Wait for any in-progress auto-compaction follow-up to settle. */
|
|
50
|
+
async waitForAutoCompaction() {
|
|
51
|
+
if (this._autoCompactionPromise) {
|
|
52
|
+
await this._autoCompactionPromise;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
_resolveAutoCompaction() {
|
|
56
|
+
if (this._pendingAutoContinues > 0 || this._autoCompactionAbortController !== undefined) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (this._autoCompactionResolve) {
|
|
60
|
+
this._autoCompactionResolve();
|
|
61
|
+
this._autoCompactionResolve = undefined;
|
|
62
|
+
this._autoCompactionPromise = undefined;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
29
65
|
/** Reset overflow recovery flag (called when a new user message starts) */
|
|
30
66
|
resetOverflowRecovery() {
|
|
31
67
|
this._overflowRecoveryAttempted = false;
|
|
@@ -150,18 +186,24 @@ export class CompactionOrchestrator {
|
|
|
150
186
|
*/
|
|
151
187
|
async checkCompaction(assistantMessage, skipAbortedCheck = true) {
|
|
152
188
|
const settings = this._deps.settingsManager.getCompactionSettings();
|
|
153
|
-
if (!settings.enabled)
|
|
189
|
+
if (!settings.enabled) {
|
|
190
|
+
this._resolveAutoCompaction();
|
|
154
191
|
return;
|
|
155
|
-
|
|
192
|
+
}
|
|
193
|
+
if (skipAbortedCheck && assistantMessage.stopReason === "aborted") {
|
|
194
|
+
this._resolveAutoCompaction();
|
|
156
195
|
return;
|
|
196
|
+
}
|
|
157
197
|
const model = this._deps.getModel();
|
|
158
198
|
const contextWindow = model?.contextWindow ?? 0;
|
|
159
199
|
const sameModel = model && assistantMessage.provider === model.provider && assistantMessage.model === model.id;
|
|
160
200
|
const branchEntries = this._deps.sessionManager.getBranch();
|
|
161
201
|
const compactionEntry = getLatestCompactionEntry(branchEntries);
|
|
162
202
|
const assistantIsFromBeforeCompaction = compactionEntry !== null && assistantMessage.timestamp <= new Date(compactionEntry.timestamp).getTime();
|
|
163
|
-
if (assistantIsFromBeforeCompaction)
|
|
203
|
+
if (assistantIsFromBeforeCompaction) {
|
|
204
|
+
this._resolveAutoCompaction();
|
|
164
205
|
return;
|
|
206
|
+
}
|
|
165
207
|
// Case 1: Overflow - LLM returned context overflow error
|
|
166
208
|
if (sameModel && isContextOverflow(assistantMessage, contextWindow)) {
|
|
167
209
|
if (this._overflowRecoveryAttempted) {
|
|
@@ -172,6 +214,7 @@ export class CompactionOrchestrator {
|
|
|
172
214
|
willRetry: false,
|
|
173
215
|
errorMessage: "Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.",
|
|
174
216
|
});
|
|
217
|
+
this._resolveAutoCompaction();
|
|
175
218
|
return;
|
|
176
219
|
}
|
|
177
220
|
this._overflowRecoveryAttempted = true;
|
|
@@ -187,12 +230,15 @@ export class CompactionOrchestrator {
|
|
|
187
230
|
if (assistantMessage.stopReason === "error") {
|
|
188
231
|
const messages = this._deps.agent.state.messages;
|
|
189
232
|
const estimate = estimateContextTokens(messages);
|
|
190
|
-
if (estimate.lastUsageIndex === null)
|
|
233
|
+
if (estimate.lastUsageIndex === null) {
|
|
234
|
+
this._resolveAutoCompaction();
|
|
191
235
|
return;
|
|
236
|
+
}
|
|
192
237
|
const usageMsg = messages[estimate.lastUsageIndex];
|
|
193
238
|
if (compactionEntry &&
|
|
194
239
|
usageMsg.role === "assistant" &&
|
|
195
240
|
usageMsg.timestamp <= new Date(compactionEntry.timestamp).getTime()) {
|
|
241
|
+
this._resolveAutoCompaction();
|
|
196
242
|
return;
|
|
197
243
|
}
|
|
198
244
|
contextTokens = estimate.tokens;
|
|
@@ -202,7 +248,9 @@ export class CompactionOrchestrator {
|
|
|
202
248
|
}
|
|
203
249
|
if (shouldCompact(contextTokens, contextWindow, settings)) {
|
|
204
250
|
await this._runAutoCompaction("threshold", false);
|
|
251
|
+
return;
|
|
205
252
|
}
|
|
253
|
+
this._resolveAutoCompaction();
|
|
206
254
|
}
|
|
207
255
|
/** Toggle auto-compaction setting */
|
|
208
256
|
setAutoCompactionEnabled(enabled) {
|
|
@@ -223,10 +271,12 @@ export class CompactionOrchestrator {
|
|
|
223
271
|
const model = this._deps.getModel();
|
|
224
272
|
if (!model) {
|
|
225
273
|
this._deps.emit({ type: "auto_compaction_end", result: undefined, aborted: false, willRetry: false });
|
|
274
|
+
this._resolveAutoCompaction();
|
|
226
275
|
return;
|
|
227
276
|
}
|
|
228
277
|
if (!this._deps.modelRegistry.isProviderRequestReady(model.provider)) {
|
|
229
278
|
this._deps.emit({ type: "auto_compaction_end", result: undefined, aborted: false, willRetry: false });
|
|
279
|
+
this._resolveAutoCompaction();
|
|
230
280
|
return;
|
|
231
281
|
}
|
|
232
282
|
// undefined for externalCli/none providers — stripped at the streamSimple boundary (model-registry.ts)
|
|
@@ -235,6 +285,7 @@ export class CompactionOrchestrator {
|
|
|
235
285
|
const preparation = prepareCompaction(pathEntries, settings);
|
|
236
286
|
if (!preparation) {
|
|
237
287
|
this._deps.emit({ type: "auto_compaction_end", result: undefined, aborted: false, willRetry: false });
|
|
288
|
+
this._resolveAutoCompaction();
|
|
238
289
|
return;
|
|
239
290
|
}
|
|
240
291
|
let extensionCompaction;
|
|
@@ -255,6 +306,7 @@ export class CompactionOrchestrator {
|
|
|
255
306
|
aborted: true,
|
|
256
307
|
willRetry: false,
|
|
257
308
|
});
|
|
309
|
+
this._resolveAutoCompaction();
|
|
258
310
|
return;
|
|
259
311
|
}
|
|
260
312
|
if (extensionResult?.compaction) {
|
|
@@ -281,6 +333,7 @@ export class CompactionOrchestrator {
|
|
|
281
333
|
}
|
|
282
334
|
if (this._autoCompactionAbortController.signal.aborted) {
|
|
283
335
|
this._deps.emit({ type: "auto_compaction_end", result: undefined, aborted: true, willRetry: false });
|
|
336
|
+
this._resolveAutoCompaction();
|
|
284
337
|
return;
|
|
285
338
|
}
|
|
286
339
|
this._deps.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);
|
|
@@ -297,20 +350,27 @@ export class CompactionOrchestrator {
|
|
|
297
350
|
}
|
|
298
351
|
const result = { summary, firstKeptEntryId, tokensBefore, details };
|
|
299
352
|
this._deps.emit({ type: "auto_compaction_end", result, aborted: false, willRetry });
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
if (lastMsg?.role === "assistant" && lastMsg.stopReason === "error") {
|
|
304
|
-
this._deps.agent.replaceMessages(messages.slice(0, -1));
|
|
305
|
-
}
|
|
353
|
+
const shouldContinue = willRetry || this._deps.agent.hasQueuedMessages();
|
|
354
|
+
if (shouldContinue) {
|
|
355
|
+
this._pendingAutoContinues++;
|
|
306
356
|
setTimeout(() => {
|
|
307
|
-
|
|
357
|
+
if (willRetry) {
|
|
358
|
+
const messages = this._deps.agent.state.messages;
|
|
359
|
+
const lastMsg = messages[messages.length - 1];
|
|
360
|
+
if (lastMsg?.role === "assistant" && lastMsg.stopReason === "error") {
|
|
361
|
+
this._deps.agent.replaceMessages(messages.slice(0, -1));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
this._deps.agent.continue()
|
|
365
|
+
.catch(() => { })
|
|
366
|
+
.finally(() => {
|
|
367
|
+
this._pendingAutoContinues = Math.max(0, this._pendingAutoContinues - 1);
|
|
368
|
+
this._resolveAutoCompaction();
|
|
369
|
+
});
|
|
308
370
|
}, 100);
|
|
309
371
|
}
|
|
310
|
-
else
|
|
311
|
-
|
|
312
|
-
this._deps.agent.continue().catch(() => { });
|
|
313
|
-
}, 100);
|
|
372
|
+
else {
|
|
373
|
+
this._resolveAutoCompaction();
|
|
314
374
|
}
|
|
315
375
|
}
|
|
316
376
|
catch (error) {
|
|
@@ -324,9 +384,11 @@ export class CompactionOrchestrator {
|
|
|
324
384
|
? `Context overflow recovery failed: ${errorMessage}`
|
|
325
385
|
: `Auto-compaction failed: ${errorMessage}`,
|
|
326
386
|
});
|
|
387
|
+
this._resolveAutoCompaction();
|
|
327
388
|
}
|
|
328
389
|
finally {
|
|
329
390
|
this._autoCompactionAbortController = undefined;
|
|
391
|
+
this._resolveAutoCompaction();
|
|
330
392
|
}
|
|
331
393
|
}
|
|
332
394
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compaction-orchestrator.js","sourceRoot":"","sources":["../../src/core/compaction-orchestrator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CompactionOrchestrator - Manages manual and automatic context compaction.\n *\n * Handles:\n * - Manual compaction (user-triggered /compact)\n * - Auto-compaction when context exceeds threshold\n * - Overflow recovery when LLM returns context overflow errors\n * - Extension integration for custom compaction providers\n * - Branch summarization abort coordination\n */\n\nimport type { Agent } from \"@gsd/pi-agent-core\";\nimport type { AssistantMessage, Model } from \"@gsd/pi-ai\";\nimport { isContextOverflow } from \"@gsd/pi-ai\";\nimport {\n\ttype CompactionResult,\n\tcalculateContextTokens,\n\tcompact,\n\testimateContextTokens,\n\tprepareCompaction,\n\tshouldCompact,\n} from \"./compaction/index.js\";\nimport type { ExtensionRunner, SessionBeforeCompactResult } from \"./extensions/index.js\";\nimport type { ModelRegistry } from \"./model-registry.js\";\nimport { getLatestCompactionEntry } from \"./session-manager.js\";\nimport type { CompactionEntry, SessionManager } from \"./session-manager.js\";\nimport type { SettingsManager } from \"./settings-manager.js\";\nimport type { AgentSessionEvent } from \"./agent-session.js\";\nimport { getErrorMessage } from \"../utils/error.js\";\n\n/** Dependencies injected from AgentSession into CompactionOrchestrator */\nexport interface CompactionOrchestratorDeps {\n\treadonly agent: Agent;\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\treadonly modelRegistry: ModelRegistry;\n\tgetModel: () => Model<any> | undefined;\n\tgetSessionId: () => string;\n\tgetExtensionRunner: () => ExtensionRunner | undefined;\n\temit: (event: AgentSessionEvent) => void;\n\tdisconnectFromAgent: () => void;\n\treconnectToAgent: () => void;\n\tabort: () => Promise<void>;\n}\n\nexport class CompactionOrchestrator {\n\tprivate _compactionAbortController: AbortController | undefined = undefined;\n\tprivate _autoCompactionAbortController: AbortController | undefined = undefined;\n\tprivate _overflowRecoveryAttempted = false;\n\tprivate _branchSummaryAbortController: AbortController | undefined = undefined;\n\n\tconstructor(private readonly _deps: CompactionOrchestratorDeps) {}\n\n\t/** Whether compaction or branch summarization is currently running */\n\tget isCompacting(): boolean {\n\t\treturn (\n\t\t\tthis._autoCompactionAbortController !== undefined ||\n\t\t\tthis._compactionAbortController !== undefined ||\n\t\t\tthis._branchSummaryAbortController !== undefined\n\t\t);\n\t}\n\n\t/** Reset overflow recovery flag (called when a new user message starts) */\n\tresetOverflowRecovery(): void {\n\t\tthis._overflowRecoveryAttempted = false;\n\t}\n\n\t/** Mark overflow recovery as not needed (called on successful assistant response) */\n\tclearOverflowRecovery(): void {\n\t\tthis._overflowRecoveryAttempted = false;\n\t}\n\n\t/** Get/set the branch summary abort controller (used by navigateTree) */\n\tget branchSummaryAbortController(): AbortController | undefined {\n\t\treturn this._branchSummaryAbortController;\n\t}\n\tset branchSummaryAbortController(controller: AbortController | undefined) {\n\t\tthis._branchSummaryAbortController = controller;\n\t}\n\n\t/**\n\t * Manually compact the session context.\n\t * Aborts current agent operation first.\n\t * @param customInstructions Optional instructions for the compaction summary\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tthis._deps.disconnectFromAgent();\n\t\tawait this._deps.abort();\n\t\tthis._compactionAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tconst model = this._deps.getModel();\n\t\t\tif (!model) {\n\t\t\t\tthrow new Error(\"No model selected\");\n\t\t\t}\n\n\t\t\tif (!this._deps.modelRegistry.isProviderRequestReady(model.provider)) {\n\t\t\t\tthrow new Error(`No API key for ${model.provider}`);\n\t\t\t}\n\t\t\t// undefined for externalCli/none providers — stripped at the streamSimple boundary (model-registry.ts)\n\t\t\tconst apiKey = await this._deps.modelRegistry.getApiKey(model, this._deps.getSessionId());\n\n\t\t\tconst pathEntries = this._deps.sessionManager.getBranch();\n\t\t\tconst settings = this._deps.settingsManager.getCompactionSettings();\n\n\t\t\tconst preparation = prepareCompaction(pathEntries, settings);\n\t\t\tif (!preparation) {\n\t\t\t\tconst lastEntry = pathEntries[pathEntries.length - 1];\n\t\t\t\tif (lastEntry?.type === \"compaction\") {\n\t\t\t\t\tthrow new Error(\"Already compacted\");\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Nothing to compact (session too small)\");\n\t\t\t}\n\n\t\t\tlet extensionCompaction: CompactionResult | undefined;\n\t\t\tlet fromExtension = false;\n\t\t\tconst extensionRunner = this._deps.getExtensionRunner();\n\n\t\t\tif (extensionRunner?.hasHandlers(\"session_before_compact\")) {\n\t\t\t\tconst result = (await extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\tsignal: this._compactionAbortController.signal,\n\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\n\t\t\t\tif (result?.cancel) {\n\t\t\t\t\tthrow new Error(\"Compaction cancelled\");\n\t\t\t\t}\n\n\t\t\t\tif (result?.compaction) {\n\t\t\t\t\textensionCompaction = result.compaction;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summary: string;\n\t\t\tlet firstKeptEntryId: string;\n\t\t\tlet tokensBefore: number;\n\t\t\tlet details: unknown;\n\n\t\t\tif (extensionCompaction) {\n\t\t\t\tsummary = extensionCompaction.summary;\n\t\t\t\tfirstKeptEntryId = extensionCompaction.firstKeptEntryId;\n\t\t\t\ttokensBefore = extensionCompaction.tokensBefore;\n\t\t\t\tdetails = extensionCompaction.details;\n\t\t\t} else {\n\t\t\t\tconst result = await compact(\n\t\t\t\t\tpreparation,\n\t\t\t\t\tmodel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\tthis._compactionAbortController.signal,\n\t\t\t\t);\n\t\t\t\tsummary = result.summary;\n\t\t\t\tfirstKeptEntryId = result.firstKeptEntryId;\n\t\t\t\ttokensBefore = result.tokensBefore;\n\t\t\t\tdetails = result.details;\n\t\t\t}\n\n\t\t\tif (this._compactionAbortController.signal.aborted) {\n\t\t\t\tthrow new Error(\"Compaction cancelled\");\n\t\t\t}\n\n\t\t\tthis._deps.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);\n\t\t\tconst newEntries = this._deps.sessionManager.getEntries();\n\t\t\tconst sessionContext = this._deps.sessionManager.buildSessionContext();\n\t\t\tthis._deps.agent.replaceMessages(sessionContext.messages);\n\n\t\t\tconst savedCompactionEntry = newEntries.find(\n\t\t\t\t(e) => e.type === \"compaction\" && e.summary === summary,\n\t\t\t) as CompactionEntry | undefined;\n\n\t\t\tif (extensionRunner && savedCompactionEntry) {\n\t\t\t\tawait extensionRunner.emit({\n\t\t\t\t\ttype: \"session_compact\",\n\t\t\t\t\tcompactionEntry: savedCompactionEntry,\n\t\t\t\t\tfromExtension,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn { summary, firstKeptEntryId, tokensBefore, details };\n\t\t} finally {\n\t\t\tthis._compactionAbortController = undefined;\n\t\t\tthis._deps.reconnectToAgent();\n\t\t}\n\t}\n\n\t/** Cancel in-progress compaction (manual or auto) */\n\tabortCompaction(): void {\n\t\tthis._compactionAbortController?.abort();\n\t\tthis._autoCompactionAbortController?.abort();\n\t}\n\n\t/** Cancel in-progress branch summarization */\n\tabortBranchSummary(): void {\n\t\tthis._branchSummaryAbortController?.abort();\n\t}\n\n\t/**\n\t * Check if compaction is needed and run it.\n\t * Called after agent_end and before prompt submission.\n\t *\n\t * Two cases:\n\t * 1. Overflow: LLM returned context overflow error, remove error message, compact, auto-retry\n\t * 2. Threshold: Context over threshold, compact, NO auto-retry\n\t *\n\t * @param assistantMessage The assistant message to check\n\t * @param skipAbortedCheck If false, include aborted messages (for pre-prompt check). Default: true\n\t */\n\tasync checkCompaction(assistantMessage: AssistantMessage, skipAbortedCheck = true): Promise<void> {\n\t\tconst settings = this._deps.settingsManager.getCompactionSettings();\n\t\tif (!settings.enabled) return;\n\n\t\tif (skipAbortedCheck && assistantMessage.stopReason === \"aborted\") return;\n\n\t\tconst model = this._deps.getModel();\n\t\tconst contextWindow = model?.contextWindow ?? 0;\n\n\t\tconst sameModel =\n\t\t\tmodel && assistantMessage.provider === model.provider && assistantMessage.model === model.id;\n\n\t\tconst branchEntries = this._deps.sessionManager.getBranch();\n\t\tconst compactionEntry = getLatestCompactionEntry(branchEntries);\n\t\tconst assistantIsFromBeforeCompaction =\n\t\t\tcompactionEntry !== null && assistantMessage.timestamp <= new Date(compactionEntry.timestamp).getTime();\n\t\tif (assistantIsFromBeforeCompaction) return;\n\n\t\t// Case 1: Overflow - LLM returned context overflow error\n\t\tif (sameModel && isContextOverflow(assistantMessage, contextWindow)) {\n\t\t\tif (this._overflowRecoveryAttempted) {\n\t\t\t\tthis._deps.emit({\n\t\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: false,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\"Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._overflowRecoveryAttempted = true;\n\t\t\tconst messages = this._deps.agent.state.messages;\n\t\t\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\t\t\tthis._deps.agent.replaceMessages(messages.slice(0, -1));\n\t\t\t}\n\t\t\tawait this._runAutoCompaction(\"overflow\", true);\n\t\t\treturn;\n\t\t}\n\n\t\t// Case 2: Threshold - context is getting large\n\t\tlet contextTokens: number;\n\t\tif (assistantMessage.stopReason === \"error\") {\n\t\t\tconst messages = this._deps.agent.state.messages;\n\t\t\tconst estimate = estimateContextTokens(messages);\n\t\t\tif (estimate.lastUsageIndex === null) return;\n\t\t\tconst usageMsg = messages[estimate.lastUsageIndex];\n\t\t\tif (\n\t\t\t\tcompactionEntry &&\n\t\t\t\tusageMsg.role === \"assistant\" &&\n\t\t\t\t(usageMsg as AssistantMessage).timestamp <= new Date(compactionEntry.timestamp).getTime()\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontextTokens = estimate.tokens;\n\t\t} else {\n\t\t\tcontextTokens = calculateContextTokens(assistantMessage.usage);\n\t\t}\n\t\tif (shouldCompact(contextTokens, contextWindow, settings)) {\n\t\t\tawait this._runAutoCompaction(\"threshold\", false);\n\t\t}\n\t}\n\n\t/** Toggle auto-compaction setting */\n\tsetAutoCompactionEnabled(enabled: boolean): void {\n\t\tthis._deps.settingsManager.setCompactionEnabled(enabled);\n\t}\n\n\t/** Whether auto-compaction is enabled */\n\tget autoCompactionEnabled(): boolean {\n\t\treturn this._deps.settingsManager.getCompactionEnabled();\n\t}\n\n\t// =========================================================================\n\t// Private helpers\n\t// =========================================================================\n\n\tprivate async _runAutoCompaction(reason: \"overflow\" | \"threshold\", willRetry: boolean): Promise<void> {\n\t\tconst settings = this._deps.settingsManager.getCompactionSettings();\n\n\t\tthis._deps.emit({ type: \"auto_compaction_start\", reason });\n\t\tthis._autoCompactionAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tconst model = this._deps.getModel();\n\t\t\tif (!model) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this._deps.modelRegistry.isProviderRequestReady(model.provider)) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// undefined for externalCli/none providers — stripped at the streamSimple boundary (model-registry.ts)\n\t\t\tconst apiKey = await this._deps.modelRegistry.getApiKey(model, this._deps.getSessionId());\n\n\t\t\tconst pathEntries = this._deps.sessionManager.getBranch();\n\t\t\tconst preparation = prepareCompaction(pathEntries, settings);\n\t\t\tif (!preparation) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet extensionCompaction: CompactionResult | undefined;\n\t\t\tlet fromExtension = false;\n\t\t\tconst extensionRunner = this._deps.getExtensionRunner();\n\n\t\t\tif (extensionRunner?.hasHandlers(\"session_before_compact\")) {\n\t\t\t\tconst extensionResult = (await extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\tcustomInstructions: undefined,\n\t\t\t\t\tsignal: this._autoCompactionAbortController.signal,\n\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\n\t\t\t\tif (extensionResult?.cancel) {\n\t\t\t\t\tthis._deps.emit({\n\t\t\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\t\t\tresult: undefined,\n\t\t\t\t\t\taborted: true,\n\t\t\t\t\t\twillRetry: false,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (extensionResult?.compaction) {\n\t\t\t\t\textensionCompaction = extensionResult.compaction;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summary: string;\n\t\t\tlet firstKeptEntryId: string;\n\t\t\tlet tokensBefore: number;\n\t\t\tlet details: unknown;\n\n\t\t\tif (extensionCompaction) {\n\t\t\t\tsummary = extensionCompaction.summary;\n\t\t\t\tfirstKeptEntryId = extensionCompaction.firstKeptEntryId;\n\t\t\t\ttokensBefore = extensionCompaction.tokensBefore;\n\t\t\t\tdetails = extensionCompaction.details;\n\t\t\t} else {\n\t\t\t\tconst compactResult = await compact(\n\t\t\t\t\tpreparation,\n\t\t\t\t\tmodel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\tundefined,\n\t\t\t\t\tthis._autoCompactionAbortController.signal,\n\t\t\t\t);\n\t\t\t\tsummary = compactResult.summary;\n\t\t\t\tfirstKeptEntryId = compactResult.firstKeptEntryId;\n\t\t\t\ttokensBefore = compactResult.tokensBefore;\n\t\t\t\tdetails = compactResult.details;\n\t\t\t}\n\n\t\t\tif (this._autoCompactionAbortController.signal.aborted) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: true, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._deps.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);\n\t\t\tconst newEntries = this._deps.sessionManager.getEntries();\n\t\t\tconst sessionContext = this._deps.sessionManager.buildSessionContext();\n\t\t\tthis._deps.agent.replaceMessages(sessionContext.messages);\n\n\t\t\tconst savedCompactionEntry = newEntries.find(\n\t\t\t\t(e) => e.type === \"compaction\" && e.summary === summary,\n\t\t\t) as CompactionEntry | undefined;\n\n\t\t\tif (extensionRunner && savedCompactionEntry) {\n\t\t\t\tawait extensionRunner.emit({\n\t\t\t\t\ttype: \"session_compact\",\n\t\t\t\t\tcompactionEntry: savedCompactionEntry,\n\t\t\t\t\tfromExtension,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result: CompactionResult = { summary, firstKeptEntryId, tokensBefore, details };\n\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result, aborted: false, willRetry });\n\n\t\t\tif (willRetry) {\n\t\t\t\tconst messages = this._deps.agent.state.messages;\n\t\t\t\tconst lastMsg = messages[messages.length - 1];\n\t\t\t\tif (lastMsg?.role === \"assistant\" && (lastMsg as AssistantMessage).stopReason === \"error\") {\n\t\t\t\t\tthis._deps.agent.replaceMessages(messages.slice(0, -1));\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._deps.agent.continue().catch(() => {});\n\t\t\t\t}, 100);\n\t\t\t} else if (this._deps.agent.hasQueuedMessages()) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._deps.agent.continue().catch(() => {});\n\t\t\t\t}, 100);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst errorMessage = getErrorMessage(error);\n\t\t\tthis._deps.emit({\n\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\terrorMessage:\n\t\t\t\t\treason === \"overflow\"\n\t\t\t\t\t\t? `Context overflow recovery failed: ${errorMessage}`\n\t\t\t\t\t\t: `Auto-compaction failed: ${errorMessage}`,\n\t\t\t});\n\t\t} finally {\n\t\t\tthis._autoCompactionAbortController = undefined;\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"compaction-orchestrator.js","sourceRoot":"","sources":["../../src/core/compaction-orchestrator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CompactionOrchestrator - Manages manual and automatic context compaction.\n *\n * Handles:\n * - Manual compaction (user-triggered /compact)\n * - Auto-compaction when context exceeds threshold\n * - Overflow recovery when LLM returns context overflow errors\n * - Extension integration for custom compaction providers\n * - Branch summarization abort coordination\n */\n\nimport type { Agent } from \"@gsd/pi-agent-core\";\nimport type { AssistantMessage, Model } from \"@gsd/pi-ai\";\nimport { isContextOverflow } from \"@gsd/pi-ai\";\nimport {\n\ttype CompactionResult,\n\tcalculateContextTokens,\n\tcompact,\n\testimateContextTokens,\n\tprepareCompaction,\n\tshouldCompact,\n} from \"./compaction/index.js\";\nimport type { ExtensionRunner, SessionBeforeCompactResult } from \"./extensions/index.js\";\nimport type { ModelRegistry } from \"./model-registry.js\";\nimport { getLatestCompactionEntry } from \"./session-manager.js\";\nimport type { CompactionEntry, SessionManager } from \"./session-manager.js\";\nimport type { SettingsManager } from \"./settings-manager.js\";\nimport type { AgentSessionEvent } from \"./agent-session.js\";\nimport { getErrorMessage } from \"../utils/error.js\";\n\n/** Dependencies injected from AgentSession into CompactionOrchestrator */\nexport interface CompactionOrchestratorDeps {\n\treadonly agent: Agent;\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\treadonly modelRegistry: ModelRegistry;\n\tgetModel: () => Model<any> | undefined;\n\tgetSessionId: () => string;\n\tgetExtensionRunner: () => ExtensionRunner | undefined;\n\temit: (event: AgentSessionEvent) => void;\n\tdisconnectFromAgent: () => void;\n\treconnectToAgent: () => void;\n\tabort: () => Promise<void>;\n}\n\nexport class CompactionOrchestrator {\n\tprivate _compactionAbortController: AbortController | undefined = undefined;\n\tprivate _autoCompactionAbortController: AbortController | undefined = undefined;\n\tprivate _overflowRecoveryAttempted = false;\n\tprivate _branchSummaryAbortController: AbortController | undefined = undefined;\n\tprivate _autoCompactionPromise: Promise<void> | undefined = undefined;\n\tprivate _autoCompactionResolve: (() => void) | undefined = undefined;\n\tprivate _pendingAutoContinues = 0;\n\n\tconstructor(private readonly _deps: CompactionOrchestratorDeps) {}\n\n\t/** Whether compaction or branch summarization is currently running */\n\tget isCompacting(): boolean {\n\t\treturn (\n\t\t\tthis._autoCompactionAbortController !== undefined ||\n\t\t\tthis._compactionAbortController !== undefined ||\n\t\t\tthis._branchSummaryAbortController !== undefined\n\t\t);\n\t}\n\n\t/** Whether an auto-compaction follow-up (including resume/continue) is in progress */\n\tget hasPendingAutoCompaction(): boolean {\n\t\treturn this._autoCompactionPromise !== undefined;\n\t}\n\n\t/** Create an auto-compaction wait promise synchronously for agent_end events. */\n\tcreateAutoCompactionPromiseForAgentEnd(messages: Array<{ role: string } & Record<string, any>>): void {\n\t\tif (this._autoCompactionPromise) return;\n\t\tif (!this._deps.settingsManager.getCompactionEnabled()) return;\n\t\tconst hasAssistant = messages.some((message) => message.role === \"assistant\");\n\t\tif (!hasAssistant) return;\n\t\tthis._autoCompactionPromise = new Promise((resolve) => {\n\t\t\tthis._autoCompactionResolve = resolve;\n\t\t});\n\t}\n\n\t/** Wait for any in-progress auto-compaction follow-up to settle. */\n\tasync waitForAutoCompaction(): Promise<void> {\n\t\tif (this._autoCompactionPromise) {\n\t\t\tawait this._autoCompactionPromise;\n\t\t}\n\t}\n\n\tprivate _resolveAutoCompaction(): void {\n\t\tif (this._pendingAutoContinues > 0 || this._autoCompactionAbortController !== undefined) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._autoCompactionResolve) {\n\t\t\tthis._autoCompactionResolve();\n\t\t\tthis._autoCompactionResolve = undefined;\n\t\t\tthis._autoCompactionPromise = undefined;\n\t\t}\n\t}\n\n\t/** Reset overflow recovery flag (called when a new user message starts) */\n\tresetOverflowRecovery(): void {\n\t\tthis._overflowRecoveryAttempted = false;\n\t}\n\n\t/** Mark overflow recovery as not needed (called on successful assistant response) */\n\tclearOverflowRecovery(): void {\n\t\tthis._overflowRecoveryAttempted = false;\n\t}\n\n\t/** Get/set the branch summary abort controller (used by navigateTree) */\n\tget branchSummaryAbortController(): AbortController | undefined {\n\t\treturn this._branchSummaryAbortController;\n\t}\n\tset branchSummaryAbortController(controller: AbortController | undefined) {\n\t\tthis._branchSummaryAbortController = controller;\n\t}\n\n\t/**\n\t * Manually compact the session context.\n\t * Aborts current agent operation first.\n\t * @param customInstructions Optional instructions for the compaction summary\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tthis._deps.disconnectFromAgent();\n\t\tawait this._deps.abort();\n\t\tthis._compactionAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tconst model = this._deps.getModel();\n\t\t\tif (!model) {\n\t\t\t\tthrow new Error(\"No model selected\");\n\t\t\t}\n\n\t\t\tif (!this._deps.modelRegistry.isProviderRequestReady(model.provider)) {\n\t\t\t\tthrow new Error(`No API key for ${model.provider}`);\n\t\t\t}\n\t\t\t// undefined for externalCli/none providers — stripped at the streamSimple boundary (model-registry.ts)\n\t\t\tconst apiKey = await this._deps.modelRegistry.getApiKey(model, this._deps.getSessionId());\n\n\t\t\tconst pathEntries = this._deps.sessionManager.getBranch();\n\t\t\tconst settings = this._deps.settingsManager.getCompactionSettings();\n\n\t\t\tconst preparation = prepareCompaction(pathEntries, settings);\n\t\t\tif (!preparation) {\n\t\t\t\tconst lastEntry = pathEntries[pathEntries.length - 1];\n\t\t\t\tif (lastEntry?.type === \"compaction\") {\n\t\t\t\t\tthrow new Error(\"Already compacted\");\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Nothing to compact (session too small)\");\n\t\t\t}\n\n\t\t\tlet extensionCompaction: CompactionResult | undefined;\n\t\t\tlet fromExtension = false;\n\t\t\tconst extensionRunner = this._deps.getExtensionRunner();\n\n\t\t\tif (extensionRunner?.hasHandlers(\"session_before_compact\")) {\n\t\t\t\tconst result = (await extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\tsignal: this._compactionAbortController.signal,\n\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\n\t\t\t\tif (result?.cancel) {\n\t\t\t\t\tthrow new Error(\"Compaction cancelled\");\n\t\t\t\t}\n\n\t\t\t\tif (result?.compaction) {\n\t\t\t\t\textensionCompaction = result.compaction;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summary: string;\n\t\t\tlet firstKeptEntryId: string;\n\t\t\tlet tokensBefore: number;\n\t\t\tlet details: unknown;\n\n\t\t\tif (extensionCompaction) {\n\t\t\t\tsummary = extensionCompaction.summary;\n\t\t\t\tfirstKeptEntryId = extensionCompaction.firstKeptEntryId;\n\t\t\t\ttokensBefore = extensionCompaction.tokensBefore;\n\t\t\t\tdetails = extensionCompaction.details;\n\t\t\t} else {\n\t\t\t\tconst result = await compact(\n\t\t\t\t\tpreparation,\n\t\t\t\t\tmodel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\tthis._compactionAbortController.signal,\n\t\t\t\t);\n\t\t\t\tsummary = result.summary;\n\t\t\t\tfirstKeptEntryId = result.firstKeptEntryId;\n\t\t\t\ttokensBefore = result.tokensBefore;\n\t\t\t\tdetails = result.details;\n\t\t\t}\n\n\t\t\tif (this._compactionAbortController.signal.aborted) {\n\t\t\t\tthrow new Error(\"Compaction cancelled\");\n\t\t\t}\n\n\t\t\tthis._deps.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);\n\t\t\tconst newEntries = this._deps.sessionManager.getEntries();\n\t\t\tconst sessionContext = this._deps.sessionManager.buildSessionContext();\n\t\t\tthis._deps.agent.replaceMessages(sessionContext.messages);\n\n\t\t\tconst savedCompactionEntry = newEntries.find(\n\t\t\t\t(e) => e.type === \"compaction\" && e.summary === summary,\n\t\t\t) as CompactionEntry | undefined;\n\n\t\t\tif (extensionRunner && savedCompactionEntry) {\n\t\t\t\tawait extensionRunner.emit({\n\t\t\t\t\ttype: \"session_compact\",\n\t\t\t\t\tcompactionEntry: savedCompactionEntry,\n\t\t\t\t\tfromExtension,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn { summary, firstKeptEntryId, tokensBefore, details };\n\t\t} finally {\n\t\t\tthis._compactionAbortController = undefined;\n\t\t\tthis._deps.reconnectToAgent();\n\t\t}\n\t}\n\n\t/** Cancel in-progress compaction (manual or auto) */\n\tabortCompaction(): void {\n\t\tthis._compactionAbortController?.abort();\n\t\tthis._autoCompactionAbortController?.abort();\n\t}\n\n\t/** Cancel in-progress branch summarization */\n\tabortBranchSummary(): void {\n\t\tthis._branchSummaryAbortController?.abort();\n\t}\n\n\t/**\n\t * Check if compaction is needed and run it.\n\t * Called after agent_end and before prompt submission.\n\t *\n\t * Two cases:\n\t * 1. Overflow: LLM returned context overflow error, remove error message, compact, auto-retry\n\t * 2. Threshold: Context over threshold, compact, NO auto-retry\n\t *\n\t * @param assistantMessage The assistant message to check\n\t * @param skipAbortedCheck If false, include aborted messages (for pre-prompt check). Default: true\n\t */\n\tasync checkCompaction(assistantMessage: AssistantMessage, skipAbortedCheck = true): Promise<void> {\n\t\tconst settings = this._deps.settingsManager.getCompactionSettings();\n\t\tif (!settings.enabled) {\n\t\t\tthis._resolveAutoCompaction();\n\t\t\treturn;\n\t\t}\n\n\t\tif (skipAbortedCheck && assistantMessage.stopReason === \"aborted\") {\n\t\t\tthis._resolveAutoCompaction();\n\t\t\treturn;\n\t\t}\n\n\t\tconst model = this._deps.getModel();\n\t\tconst contextWindow = model?.contextWindow ?? 0;\n\n\t\tconst sameModel =\n\t\t\tmodel && assistantMessage.provider === model.provider && assistantMessage.model === model.id;\n\n\t\tconst branchEntries = this._deps.sessionManager.getBranch();\n\t\tconst compactionEntry = getLatestCompactionEntry(branchEntries);\n\t\tconst assistantIsFromBeforeCompaction =\n\t\t\tcompactionEntry !== null && assistantMessage.timestamp <= new Date(compactionEntry.timestamp).getTime();\n\t\tif (assistantIsFromBeforeCompaction) {\n\t\t\tthis._resolveAutoCompaction();\n\t\t\treturn;\n\t\t}\n\n\t\t// Case 1: Overflow - LLM returned context overflow error\n\t\tif (sameModel && isContextOverflow(assistantMessage, contextWindow)) {\n\t\t\tif (this._overflowRecoveryAttempted) {\n\t\t\t\tthis._deps.emit({\n\t\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: false,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\"Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.\",\n\t\t\t\t});\n\t\t\t\tthis._resolveAutoCompaction();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._overflowRecoveryAttempted = true;\n\t\t\tconst messages = this._deps.agent.state.messages;\n\t\t\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\t\t\tthis._deps.agent.replaceMessages(messages.slice(0, -1));\n\t\t\t}\n\t\t\tawait this._runAutoCompaction(\"overflow\", true);\n\t\t\treturn;\n\t\t}\n\n\t\t// Case 2: Threshold - context is getting large\n\t\tlet contextTokens: number;\n\t\tif (assistantMessage.stopReason === \"error\") {\n\t\t\tconst messages = this._deps.agent.state.messages;\n\t\t\tconst estimate = estimateContextTokens(messages);\n\t\t\tif (estimate.lastUsageIndex === null) {\n\t\t\t\tthis._resolveAutoCompaction();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst usageMsg = messages[estimate.lastUsageIndex];\n\t\t\tif (\n\t\t\t\tcompactionEntry &&\n\t\t\t\tusageMsg.role === \"assistant\" &&\n\t\t\t\t(usageMsg as AssistantMessage).timestamp <= new Date(compactionEntry.timestamp).getTime()\n\t\t\t) {\n\t\t\t\tthis._resolveAutoCompaction();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontextTokens = estimate.tokens;\n\t\t} else {\n\t\t\tcontextTokens = calculateContextTokens(assistantMessage.usage);\n\t\t}\n\t\tif (shouldCompact(contextTokens, contextWindow, settings)) {\n\t\t\tawait this._runAutoCompaction(\"threshold\", false);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._resolveAutoCompaction();\n\t}\n\n\t/** Toggle auto-compaction setting */\n\tsetAutoCompactionEnabled(enabled: boolean): void {\n\t\tthis._deps.settingsManager.setCompactionEnabled(enabled);\n\t}\n\n\t/** Whether auto-compaction is enabled */\n\tget autoCompactionEnabled(): boolean {\n\t\treturn this._deps.settingsManager.getCompactionEnabled();\n\t}\n\n\t// =========================================================================\n\t// Private helpers\n\t// =========================================================================\n\n\tprivate async _runAutoCompaction(reason: \"overflow\" | \"threshold\", willRetry: boolean): Promise<void> {\n\t\tconst settings = this._deps.settingsManager.getCompactionSettings();\n\n\t\tthis._deps.emit({ type: \"auto_compaction_start\", reason });\n\t\tthis._autoCompactionAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tconst model = this._deps.getModel();\n\t\t\tif (!model) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\tthis._resolveAutoCompaction();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this._deps.modelRegistry.isProviderRequestReady(model.provider)) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\tthis._resolveAutoCompaction();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// undefined for externalCli/none providers — stripped at the streamSimple boundary (model-registry.ts)\n\t\t\tconst apiKey = await this._deps.modelRegistry.getApiKey(model, this._deps.getSessionId());\n\n\t\t\tconst pathEntries = this._deps.sessionManager.getBranch();\n\t\t\tconst preparation = prepareCompaction(pathEntries, settings);\n\t\t\tif (!preparation) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\tthis._resolveAutoCompaction();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet extensionCompaction: CompactionResult | undefined;\n\t\t\tlet fromExtension = false;\n\t\t\tconst extensionRunner = this._deps.getExtensionRunner();\n\n\t\t\tif (extensionRunner?.hasHandlers(\"session_before_compact\")) {\n\t\t\t\tconst extensionResult = (await extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\tcustomInstructions: undefined,\n\t\t\t\t\tsignal: this._autoCompactionAbortController.signal,\n\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\n\t\t\t\tif (extensionResult?.cancel) {\n\t\t\t\t\tthis._deps.emit({\n\t\t\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\t\t\tresult: undefined,\n\t\t\t\t\t\taborted: true,\n\t\t\t\t\t\twillRetry: false,\n\t\t\t\t\t});\n\t\t\t\t\tthis._resolveAutoCompaction();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (extensionResult?.compaction) {\n\t\t\t\t\textensionCompaction = extensionResult.compaction;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summary: string;\n\t\t\tlet firstKeptEntryId: string;\n\t\t\tlet tokensBefore: number;\n\t\t\tlet details: unknown;\n\n\t\t\tif (extensionCompaction) {\n\t\t\t\tsummary = extensionCompaction.summary;\n\t\t\t\tfirstKeptEntryId = extensionCompaction.firstKeptEntryId;\n\t\t\t\ttokensBefore = extensionCompaction.tokensBefore;\n\t\t\t\tdetails = extensionCompaction.details;\n\t\t\t} else {\n\t\t\t\tconst compactResult = await compact(\n\t\t\t\t\tpreparation,\n\t\t\t\t\tmodel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\tundefined,\n\t\t\t\t\tthis._autoCompactionAbortController.signal,\n\t\t\t\t);\n\t\t\t\tsummary = compactResult.summary;\n\t\t\t\tfirstKeptEntryId = compactResult.firstKeptEntryId;\n\t\t\t\ttokensBefore = compactResult.tokensBefore;\n\t\t\t\tdetails = compactResult.details;\n\t\t\t}\n\n\t\t\tif (this._autoCompactionAbortController.signal.aborted) {\n\t\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result: undefined, aborted: true, willRetry: false });\n\t\t\t\tthis._resolveAutoCompaction();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._deps.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);\n\t\t\tconst newEntries = this._deps.sessionManager.getEntries();\n\t\t\tconst sessionContext = this._deps.sessionManager.buildSessionContext();\n\t\t\tthis._deps.agent.replaceMessages(sessionContext.messages);\n\n\t\t\tconst savedCompactionEntry = newEntries.find(\n\t\t\t\t(e) => e.type === \"compaction\" && e.summary === summary,\n\t\t\t) as CompactionEntry | undefined;\n\n\t\t\tif (extensionRunner && savedCompactionEntry) {\n\t\t\t\tawait extensionRunner.emit({\n\t\t\t\t\ttype: \"session_compact\",\n\t\t\t\t\tcompactionEntry: savedCompactionEntry,\n\t\t\t\t\tfromExtension,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result: CompactionResult = { summary, firstKeptEntryId, tokensBefore, details };\n\t\t\tthis._deps.emit({ type: \"auto_compaction_end\", result, aborted: false, willRetry });\n\n\t\t\tconst shouldContinue = willRetry || this._deps.agent.hasQueuedMessages();\n\t\t\tif (shouldContinue) {\n\t\t\t\tthis._pendingAutoContinues++;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (willRetry) {\n\t\t\t\t\t\tconst messages = this._deps.agent.state.messages;\n\t\t\t\t\t\tconst lastMsg = messages[messages.length - 1];\n\t\t\t\t\t\tif (lastMsg?.role === \"assistant\" && (lastMsg as AssistantMessage).stopReason === \"error\") {\n\t\t\t\t\t\t\tthis._deps.agent.replaceMessages(messages.slice(0, -1));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._deps.agent.continue()\n\t\t\t\t\t\t.catch(() => {})\n\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\tthis._pendingAutoContinues = Math.max(0, this._pendingAutoContinues - 1);\n\t\t\t\t\t\t\tthis._resolveAutoCompaction();\n\t\t\t\t\t\t});\n\t\t\t\t}, 100);\n\t\t\t} else {\n\t\t\t\tthis._resolveAutoCompaction();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst errorMessage = getErrorMessage(error);\n\t\t\tthis._deps.emit({\n\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\terrorMessage:\n\t\t\t\t\treason === \"overflow\"\n\t\t\t\t\t\t? `Context overflow recovery failed: ${errorMessage}`\n\t\t\t\t\t\t: `Auto-compaction failed: ${errorMessage}`,\n\t\t\t});\n\t\t\tthis._resolveAutoCompaction();\n\t\t} finally {\n\t\t\tthis._autoCompactionAbortController = undefined;\n\t\t\tthis._resolveAutoCompaction();\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-orchestrator.test.d.ts","sourceRoot":"","sources":["../../src/core/compaction-orchestrator.test.ts"],"names":[],"mappings":""}
|