@hiai-gg/hiai-opencode 0.1.1 → 0.1.2
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/.env.example +57 -57
- package/AGENTS.md +280 -281
- package/ARCHITECTURE.md +280 -281
- package/LICENSE.md +59 -59
- package/README.md +301 -301
- package/assets/mcp/mempalace.mjs +153 -153
- package/assets/mcp/rag.mjs +236 -236
- package/assets/runtime/npm-package-runner.mjs +54 -54
- package/config/hiai-opencode.schema.json +82 -82
- package/config/opencode.json +4 -4
- package/dist/index.js +243 -243
- package/hiai-opencode.json +57 -57
- package/package.json +86 -91
- package/skills/api-and-interface-design/SKILL.md +294 -294
- package/skills/brainstorming/SKILL.md +164 -164
- package/skills/brainstorming/scripts/frame-template.html +214 -214
- package/skills/brainstorming/scripts/helper.js +88 -88
- package/skills/brainstorming/scripts/server.cjs +354 -354
- package/skills/brainstorming/scripts/start-server.sh +148 -148
- package/skills/brainstorming/scripts/stop-server.sh +56 -56
- package/skills/brainstorming/spec-document-reviewer-prompt.md +49 -49
- package/skills/brainstorming/visual-companion.md +287 -287
- package/skills/browser-testing-with-devtools/SKILL.md +302 -302
- package/skills/ci-cd-and-automation/SKILL.md +390 -390
- package/skills/code-review-and-quality/SKILL.md +347 -347
- package/skills/code-simplification/SKILL.md +331 -331
- package/skills/context-engineering/SKILL.md +289 -289
- package/skills/deprecation-and-migration/SKILL.md +206 -206
- package/skills/dispatching-parallel-agents/SKILL.md +182 -182
- package/skills/documentation-and-adrs/SKILL.md +278 -278
- package/skills/executing-plans/SKILL.md +70 -70
- package/skills/finishing-a-development-branch/SKILL.md +200 -200
- package/skills/frontend-ui-engineering/SKILL.md +322 -322
- package/skills/git-workflow-and-versioning/SKILL.md +300 -300
- package/skills/incremental-implementation/SKILL.md +241 -241
- package/skills/performance-optimization/SKILL.md +350 -350
- package/skills/receiving-code-review/SKILL.md +213 -213
- package/skills/requesting-code-review/SKILL.md +105 -105
- package/skills/requesting-code-review/code-reviewer.md +146 -146
- package/skills/security-and-hardening/SKILL.md +349 -349
- package/skills/shipping-and-launch/SKILL.md +309 -309
- package/skills/source-driven-development/SKILL.md +194 -194
- package/skills/spec-driven-development/SKILL.md +200 -200
- package/skills/subagent-driven-development/SKILL.md +277 -277
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -26
- package/skills/subagent-driven-development/implementer-prompt.md +113 -113
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -61
- package/skills/systematic-debugging/CREATION-LOG.md +119 -119
- package/skills/systematic-debugging/SKILL.md +596 -596
- package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
- package/skills/systematic-debugging/condition-based-waiting.md +115 -115
- package/skills/systematic-debugging/defense-in-depth.md +122 -122
- package/skills/systematic-debugging/find-polluter.sh +63 -63
- package/skills/systematic-debugging/root-cause-tracing.md +169 -169
- package/skills/systematic-debugging/test-academic.md +14 -14
- package/skills/systematic-debugging/test-pressure-1.md +58 -58
- package/skills/systematic-debugging/test-pressure-2.md +68 -68
- package/skills/systematic-debugging/test-pressure-3.md +69 -69
- package/skills/test-driven-development/SKILL.md +379 -379
- package/skills/using-agent-skills/SKILL.md +174 -174
- package/skills/using-git-worktrees/SKILL.md +218 -218
- package/skills/using-superpowers/SKILL.md +117 -117
- package/skills/using-superpowers/references/codex-tools.md +100 -100
- package/skills/using-superpowers/references/copilot-tools.md +52 -52
- package/skills/using-superpowers/references/gemini-tools.md +33 -33
- package/skills/verification-before-completion/SKILL.md +139 -139
- package/skills/writing-plans/SKILL.md +152 -152
- package/skills/writing-plans/plan-document-reviewer-prompt.md +49 -49
- package/skills/writing-skills/SKILL.md +655 -655
- package/skills/writing-skills/anthropic-best-practices.md +1150 -1150
- package/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -189
- package/skills/writing-skills/graphviz-conventions.dot +171 -171
- package/skills/writing-skills/persuasion-principles.md +187 -187
- package/skills/writing-skills/render-graphs.js +168 -168
- package/skills/writing-skills/testing-skills-with-subagents.md +384 -384
- package/src/AGENTS.md +41 -41
- package/src/agents/AGENTS.md +74 -74
- package/src/agents/agent-builder.ts +50 -50
- package/src/agents/bob/AGENTS.md +29 -29
- package/src/agents/bob/default.ts +128 -128
- package/src/agents/bob/gemini.ts +237 -237
- package/src/agents/bob/gpt-pro.ts +430 -430
- package/src/agents/bob/index.ts +19 -19
- package/src/agents/bob.ts +528 -528
- package/src/agents/builtin-agents/agent-overrides.ts +75 -75
- package/src/agents/builtin-agents/available-skills.ts +35 -35
- package/src/agents/builtin-agents/bob-agent.ts +96 -96
- package/src/agents/builtin-agents/coder-agent.ts +98 -98
- package/src/agents/builtin-agents/environment-context.ts +16 -16
- package/src/agents/builtin-agents/general-agents.ts +122 -122
- package/src/agents/builtin-agents/guard-agent.ts +66 -66
- package/src/agents/builtin-agents/model-resolution.ts +31 -31
- package/src/agents/builtin-agents/resolve-file-uri.ts +42 -42
- package/src/agents/builtin-agents.ts +194 -194
- package/src/agents/coder/AGENTS.md +34 -34
- package/src/agents/coder/agent.ts +162 -162
- package/src/agents/coder/gpt-codex.ts +404 -404
- package/src/agents/coder/gpt-pro.ts +319 -319
- package/src/agents/coder/gpt.ts +253 -253
- package/src/agents/coder/index.ts +8 -8
- package/src/agents/critic/agent.ts +105 -105
- package/src/agents/custom-agent-summaries.ts +61 -61
- package/src/agents/dynamic-agent-category-skills-guide.ts +138 -138
- package/src/agents/dynamic-agent-core-sections.ts +237 -237
- package/src/agents/dynamic-agent-policy-sections.ts +182 -182
- package/src/agents/dynamic-agent-prompt-builder.ts +31 -31
- package/src/agents/dynamic-agent-prompt-types.ts +24 -24
- package/src/agents/dynamic-agent-tool-categorization.ts +45 -45
- package/src/agents/env-context.ts +16 -16
- package/src/agents/gpt-apply-patch-guard.ts +7 -7
- package/src/agents/guard/agent.ts +146 -146
- package/src/agents/guard/default-prompt-sections.ts +305 -305
- package/src/agents/guard/default.ts +22 -22
- package/src/agents/guard/gemini-prompt-sections.ts +293 -293
- package/src/agents/guard/gemini.ts +22 -22
- package/src/agents/guard/gpt-prompt-sections.ts +296 -296
- package/src/agents/guard/gpt.ts +22 -22
- package/src/agents/guard/index.ts +2 -2
- package/src/agents/guard/prompt-section-builder.ts +104 -104
- package/src/agents/guard/shared-prompt.ts +172 -172
- package/src/agents/index.ts +5 -5
- package/src/agents/platform-adapter.ts +236 -236
- package/src/agents/platform-manager.ts +57 -57
- package/src/agents/prompt-library/identity.ts +14 -14
- package/src/agents/prompt-library/index.ts +7 -7
- package/src/agents/prompt-library/intent-gate.ts +149 -149
- package/src/agents/prompt-library/orchestration.ts +60 -60
- package/src/agents/prompt-library/platform.ts +36 -36
- package/src/agents/prompt-library/specialized.ts +39 -39
- package/src/agents/prompt-library/strategy.ts +80 -80
- package/src/agents/prompt-library/todo-discipline.ts +22 -22
- package/src/agents/quality-guardian.ts +76 -76
- package/src/agents/researcher.ts +73 -73
- package/src/agents/strategist/AGENTS.md +37 -37
- package/src/agents/strategist/behavioral-summary.ts +79 -79
- package/src/agents/strategist/gemini.ts +333 -333
- package/src/agents/strategist/gpt.ts +460 -460
- package/src/agents/strategist/high-accuracy-mode.ts +78 -78
- package/src/agents/strategist/identity-constraints.ts +336 -336
- package/src/agents/strategist/index.ts +6 -6
- package/src/agents/strategist/interview-mode.ts +335 -335
- package/src/agents/strategist/plan-generation.ts +213 -213
- package/src/agents/strategist/plan-template.ts +325 -325
- package/src/agents/strategist/system-prompt.ts +68 -68
- package/src/agents/sub/agent.ts +141 -141
- package/src/agents/sub/default.ts +52 -52
- package/src/agents/sub/gemini.ts +194 -194
- package/src/agents/sub/gpt-codex.ts +156 -156
- package/src/agents/sub/gpt-pro.ts +161 -161
- package/src/agents/sub/gpt.ts +157 -157
- package/src/agents/sub/index.ts +13 -13
- package/src/agents/types.ts +144 -144
- package/src/agents/ui.ts +58 -58
- package/src/config/data/model-capabilities.json +40690 -40690
- package/src/config/defaults.ts +146 -146
- package/src/config/hiai-opencode.schema.json +12 -12
- package/src/config/index.ts +67 -67
- package/src/config/loader.test.ts +65 -65
- package/src/config/loader.ts +183 -183
- package/src/config/models.ts +32 -32
- package/src/config/platform-schema.ts +192 -192
- package/src/config/schema/agent-definitions.ts +5 -5
- package/src/config/schema/agent-names.ts +66 -66
- package/src/config/schema/agent-overrides.ts +95 -95
- package/src/config/schema/babysitting.ts +7 -7
- package/src/config/schema/background-task.ts +29 -29
- package/src/config/schema/bob-agent.ts +11 -11
- package/src/config/schema/bob.ts +17 -17
- package/src/config/schema/browser-automation.ts +24 -24
- package/src/config/schema/categories.ts +45 -45
- package/src/config/schema/claude-code.ts +13 -13
- package/src/config/schema/commands.ts +14 -14
- package/src/config/schema/comment-checker.ts +8 -8
- package/src/config/schema/dynamic-context-pruning.ts +53 -53
- package/src/config/schema/experimental.ts +27 -27
- package/src/config/schema/fallback-models.ts +31 -31
- package/src/config/schema/fast-apply.ts +14 -14
- package/src/config/schema/git-env-prefix.ts +28 -28
- package/src/config/schema/git-master.ts +14 -14
- package/src/config/schema/hooks.ts +61 -61
- package/src/config/schema/index.ts +52 -52
- package/src/config/schema/internal/permission.ts +20 -20
- package/src/config/schema/model-capabilities.ts +10 -10
- package/src/config/schema/notification.ts +8 -8
- package/src/config/schema/oh-my-opencode-config.ts +90 -90
- package/src/config/schema/openclaw.ts +50 -50
- package/src/config/schema/ralph-loop.ts +11 -11
- package/src/config/schema/runtime-fallback.ts +18 -18
- package/src/config/schema/skills.ts +39 -39
- package/src/config/schema/start-work.ts +7 -7
- package/src/config/schema/tmux.ts +28 -28
- package/src/config/schema/websearch.ts +15 -15
- package/src/config/types.ts +174 -174
- package/src/create-hooks.ts +93 -93
- package/src/create-managers.ts +116 -116
- package/src/create-runtime-tmux-config.ts +18 -18
- package/src/create-tools.ts +53 -53
- package/src/features/background-agent/AGENTS.md +56 -56
- package/src/features/background-agent/abort-with-timeout.ts +35 -35
- package/src/features/background-agent/background-task-notification-template.ts +74 -74
- package/src/features/background-agent/compaction-aware-message-resolver.ts +164 -164
- package/src/features/background-agent/concurrency.ts +137 -137
- package/src/features/background-agent/constants.ts +58 -58
- package/src/features/background-agent/duration-formatter.ts +14 -14
- package/src/features/background-agent/error-classifier.ts +83 -83
- package/src/features/background-agent/fallback-retry-handler.ts +134 -134
- package/src/features/background-agent/index.ts +2 -2
- package/src/features/background-agent/loop-detector.ts +102 -102
- package/src/features/background-agent/manager.ts +2220 -2220
- package/src/features/background-agent/opencode-client.ts +3 -3
- package/src/features/background-agent/process-cleanup.ts +98 -98
- package/src/features/background-agent/remove-task-toast-tracking.ts +8 -8
- package/src/features/background-agent/session-existence.ts +57 -57
- package/src/features/background-agent/session-idle-event-handler.ts +93 -93
- package/src/features/background-agent/session-status-classifier.ts +20 -20
- package/src/features/background-agent/spawner/parent-directory-resolver.ts +24 -24
- package/src/features/background-agent/spawner.ts +327 -327
- package/src/features/background-agent/state.ts +199 -199
- package/src/features/background-agent/subagent-spawn-limits.ts +97 -97
- package/src/features/background-agent/task-history.ts +79 -79
- package/src/features/background-agent/task-poller.ts +225 -225
- package/src/features/background-agent/types.ts +100 -100
- package/src/features/boulder-state/constants.ts +13 -13
- package/src/features/boulder-state/index.ts +4 -4
- package/src/features/boulder-state/storage.ts +336 -336
- package/src/features/boulder-state/top-level-task.ts +78 -78
- package/src/features/boulder-state/types.ts +61 -61
- package/src/features/builtin-commands/commands.ts +143 -143
- package/src/features/builtin-commands/index.ts +2 -2
- package/src/features/builtin-commands/templates/handoff.ts +177 -177
- package/src/features/builtin-commands/templates/init-deep.ts +305 -305
- package/src/features/builtin-commands/templates/ralph-loop.ts +66 -66
- package/src/features/builtin-commands/templates/refactor.ts +619 -619
- package/src/features/builtin-commands/templates/remove-ai-slops.ts +96 -96
- package/src/features/builtin-commands/templates/start-work.ts +128 -128
- package/src/features/builtin-commands/templates/stop-continuation.ts +13 -13
- package/src/features/builtin-commands/types.ts +9 -9
- package/src/features/builtin-skills/index.ts +2 -2
- package/src/features/builtin-skills/materialize.ts +338 -338
- package/src/features/builtin-skills/skills/ai-slop-remover.ts +145 -145
- package/src/features/builtin-skills/skills/dev-browser.ts +221 -221
- package/src/features/builtin-skills/skills/frontend-ui-ux.ts +79 -79
- package/src/features/builtin-skills/skills/git-master-sections/commit-workflow.ts +509 -509
- package/src/features/builtin-skills/skills/git-master-sections/history-search-workflow.ts +229 -229
- package/src/features/builtin-skills/skills/git-master-sections/overview.ts +64 -64
- package/src/features/builtin-skills/skills/git-master-sections/quick-reference.ts +86 -86
- package/src/features/builtin-skills/skills/git-master-sections/rebase-workflow.ts +181 -181
- package/src/features/builtin-skills/skills/git-master-skill-metadata.ts +4 -4
- package/src/features/builtin-skills/skills/git-master.ts +28 -28
- package/src/features/builtin-skills/skills/index.ts +7 -7
- package/src/features/builtin-skills/skills/playwright-cli.ts +268 -268
- package/src/features/builtin-skills/skills/playwright.ts +466 -466
- package/src/features/builtin-skills/skills/review-work.ts +536 -536
- package/src/features/builtin-skills/skills.ts +39 -39
- package/src/features/builtin-skills/types.ts +16 -16
- package/src/features/claude-code-agent-loader/agent-definitions-loader.ts +87 -87
- package/src/features/claude-code-agent-loader/claude-model-mapper.ts +53 -53
- package/src/features/claude-code-agent-loader/index.ts +5 -5
- package/src/features/claude-code-agent-loader/json-agent-loader.ts +53 -53
- package/src/features/claude-code-agent-loader/loader.ts +86 -86
- package/src/features/claude-code-agent-loader/opencode-config-agents-reader.ts +125 -125
- package/src/features/claude-code-agent-loader/types.ts +31 -31
- package/src/features/claude-code-command-loader/index.ts +2 -2
- package/src/features/claude-code-command-loader/loader.ts +169 -169
- package/src/features/claude-code-command-loader/types.ts +46 -46
- package/src/features/claude-code-mcp-loader/configure-allowed-env-vars.ts +48 -48
- package/src/features/claude-code-mcp-loader/env-expander.ts +51 -51
- package/src/features/claude-code-mcp-loader/index.ts +12 -12
- package/src/features/claude-code-mcp-loader/loader.ts +156 -156
- package/src/features/claude-code-mcp-loader/scope-filter.ts +17 -17
- package/src/features/claude-code-mcp-loader/transformer.ts +57 -57
- package/src/features/claude-code-mcp-loader/types.ts +51 -51
- package/src/features/claude-code-plugin-loader/agent-loader.ts +59 -59
- package/src/features/claude-code-plugin-loader/command-loader.ts +53 -53
- package/src/features/claude-code-plugin-loader/discovery.ts +251 -251
- package/src/features/claude-code-plugin-loader/hook-loader.ts +26 -26
- package/src/features/claude-code-plugin-loader/index.ts +10 -10
- package/src/features/claude-code-plugin-loader/loader.ts +134 -134
- package/src/features/claude-code-plugin-loader/mcp-server-loader.ts +59 -59
- package/src/features/claude-code-plugin-loader/plugin-path-resolver.ts +23 -23
- package/src/features/claude-code-plugin-loader/scope-filter.ts +29 -29
- package/src/features/claude-code-plugin-loader/skill-loader.ts +62 -62
- package/src/features/claude-code-plugin-loader/types.ts +255 -255
- package/src/features/claude-code-session-state/index.ts +1 -1
- package/src/features/claude-code-session-state/state.ts +154 -154
- package/src/features/claude-tasks/session-storage.ts +52 -52
- package/src/features/claude-tasks/storage.ts +169 -169
- package/src/features/claude-tasks/types.ts +20 -20
- package/src/features/context-injector/collector.ts +91 -91
- package/src/features/context-injector/index.ts +14 -14
- package/src/features/context-injector/injector.ts +167 -167
- package/src/features/context-injector/types.ts +91 -91
- package/src/features/hook-message-injector/constants.ts +1 -1
- package/src/features/hook-message-injector/index.ts +11 -11
- package/src/features/hook-message-injector/injector.ts +437 -437
- package/src/features/hook-message-injector/types.ts +49 -49
- package/src/features/mcp-oauth/AGENTS.md +54 -54
- package/src/features/mcp-oauth/callback-server.ts +106 -106
- package/src/features/mcp-oauth/dcr.ts +98 -98
- package/src/features/mcp-oauth/discovery.ts +134 -134
- package/src/features/mcp-oauth/oauth-authorization-flow.ts +150 -150
- package/src/features/mcp-oauth/provider.ts +215 -215
- package/src/features/mcp-oauth/refresh-mutex.ts +58 -58
- package/src/features/mcp-oauth/resource-indicator.ts +16 -16
- package/src/features/mcp-oauth/schema.ts +8 -8
- package/src/features/mcp-oauth/step-up.ts +79 -79
- package/src/features/mcp-oauth/storage.ts +155 -155
- package/src/features/opencode-skill-loader/AGENTS.md +59 -59
- package/src/features/opencode-skill-loader/allowed-tools-parser.ts +9 -9
- package/src/features/opencode-skill-loader/async-loader.ts +213 -213
- package/src/features/opencode-skill-loader/blocking.ts +62 -62
- package/src/features/opencode-skill-loader/config-source-discovery.ts +114 -114
- package/src/features/opencode-skill-loader/discover-worker.ts +56 -56
- package/src/features/opencode-skill-loader/git-master-template-injection.ts +150 -150
- package/src/features/opencode-skill-loader/index.ts +17 -17
- package/src/features/opencode-skill-loader/loaded-skill-from-path.ts +73 -73
- package/src/features/opencode-skill-loader/loaded-skill-template-extractor.ts +16 -16
- package/src/features/opencode-skill-loader/loader.ts +172 -172
- package/src/features/opencode-skill-loader/merger/builtin-skill-converter.ts +26 -26
- package/src/features/opencode-skill-loader/merger/config-skill-entry-loader.ts +117 -117
- package/src/features/opencode-skill-loader/merger/scope-priority.ts +10 -10
- package/src/features/opencode-skill-loader/merger/skill-definition-merger.ts +31 -31
- package/src/features/opencode-skill-loader/merger/skills-config-normalizer.ts +19 -19
- package/src/features/opencode-skill-loader/merger.ts +96 -96
- package/src/features/opencode-skill-loader/skill-content.ts +11 -11
- package/src/features/opencode-skill-loader/skill-deduplication.ts +13 -13
- package/src/features/opencode-skill-loader/skill-definition-record.ts +11 -11
- package/src/features/opencode-skill-loader/skill-directory-loader.ts +112 -112
- package/src/features/opencode-skill-loader/skill-discovery.ts +76 -76
- package/src/features/opencode-skill-loader/skill-mcp-config.ts +45 -45
- package/src/features/opencode-skill-loader/skill-resolution-options.ts +9 -9
- package/src/features/opencode-skill-loader/skill-template-resolver.ts +97 -97
- package/src/features/opencode-skill-loader/types.ts +38 -38
- package/src/features/run-continuation-state/constants.ts +1 -1
- package/src/features/run-continuation-state/index.ts +3 -3
- package/src/features/run-continuation-state/storage.ts +80 -80
- package/src/features/run-continuation-state/types.ts +15 -15
- package/src/features/skill-mcp-manager/AGENTS.md +111 -111
- package/src/features/skill-mcp-manager/cleanup.ts +153 -153
- package/src/features/skill-mcp-manager/connection-type.ts +26 -26
- package/src/features/skill-mcp-manager/connection.ts +146 -146
- package/src/features/skill-mcp-manager/env-cleaner.ts +59 -59
- package/src/features/skill-mcp-manager/error-redaction.ts +47 -47
- package/src/features/skill-mcp-manager/http-client.ts +126 -126
- package/src/features/skill-mcp-manager/index.ts +2 -2
- package/src/features/skill-mcp-manager/manager.ts +178 -178
- package/src/features/skill-mcp-manager/oauth-handler.ts +160 -160
- package/src/features/skill-mcp-manager/stdio-client.ts +112 -112
- package/src/features/skill-mcp-manager/types.ts +96 -96
- package/src/features/task-toast-manager/index.ts +2 -2
- package/src/features/task-toast-manager/manager.ts +251 -251
- package/src/features/task-toast-manager/types.ts +29 -29
- package/src/features/tmux-subagent/action-executor-core.ts +82 -82
- package/src/features/tmux-subagent/action-executor.ts +137 -137
- package/src/features/tmux-subagent/cleanup.ts +42 -42
- package/src/features/tmux-subagent/decision-engine.ts +22 -22
- package/src/features/tmux-subagent/event-handlers.ts +6 -6
- package/src/features/tmux-subagent/grid-planning.ts +137 -137
- package/src/features/tmux-subagent/index.ts +16 -16
- package/src/features/tmux-subagent/manager.ts +969 -969
- package/src/features/tmux-subagent/oldest-agent-pane.ts +37 -37
- package/src/features/tmux-subagent/pane-split-availability.ts +77 -77
- package/src/features/tmux-subagent/pane-state-parser.ts +135 -135
- package/src/features/tmux-subagent/pane-state-querier.ts +76 -76
- package/src/features/tmux-subagent/polling-constants.ts +6 -6
- package/src/features/tmux-subagent/polling-manager.ts +167 -167
- package/src/features/tmux-subagent/polling.ts +183 -183
- package/src/features/tmux-subagent/session-created-event.ts +44 -44
- package/src/features/tmux-subagent/session-created-handler.ts +175 -175
- package/src/features/tmux-subagent/session-deleted-handler.ts +50 -50
- package/src/features/tmux-subagent/session-message-count.ts +3 -3
- package/src/features/tmux-subagent/session-ready-waiter.ts +44 -44
- package/src/features/tmux-subagent/session-status-parser.ts +17 -17
- package/src/features/tmux-subagent/spawn-action-decider.ts +147 -147
- package/src/features/tmux-subagent/spawn-target-finder.ts +146 -146
- package/src/features/tmux-subagent/tmux-grid-constants.ts +57 -57
- package/src/features/tmux-subagent/tracked-session-state.ts +29 -29
- package/src/features/tmux-subagent/types.ts +54 -54
- package/src/features/tool-metadata-store/index.ts +7 -7
- package/src/features/tool-metadata-store/store.ts +84 -84
- package/src/hooks/agent-usage-reminder/constants.ts +52 -52
- package/src/hooks/agent-usage-reminder/hook.ts +134 -134
- package/src/hooks/agent-usage-reminder/index.ts +1 -1
- package/src/hooks/agent-usage-reminder/storage.ts +42 -42
- package/src/hooks/agent-usage-reminder/types.ts +6 -6
- package/src/hooks/anthropic-context-window-limit-recovery/AGENTS.md +49 -49
- package/src/hooks/anthropic-context-window-limit-recovery/aggressive-truncation-strategy.ts +87 -87
- package/src/hooks/anthropic-context-window-limit-recovery/client.ts +21 -21
- package/src/hooks/anthropic-context-window-limit-recovery/deduplication-recovery.ts +77 -77
- package/src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery-sdk.ts +199 -199
- package/src/hooks/anthropic-context-window-limit-recovery/empty-content-recovery.ts +149 -149
- package/src/hooks/anthropic-context-window-limit-recovery/executor.ts +83 -83
- package/src/hooks/anthropic-context-window-limit-recovery/index.ts +8 -8
- package/src/hooks/anthropic-context-window-limit-recovery/message-builder.ts +190 -190
- package/src/hooks/anthropic-context-window-limit-recovery/message-storage-directory.ts +40 -40
- package/src/hooks/anthropic-context-window-limit-recovery/parser.ts +209 -209
- package/src/hooks/anthropic-context-window-limit-recovery/pruning-deduplication.ts +189 -189
- package/src/hooks/anthropic-context-window-limit-recovery/pruning-tool-output-truncation.ts +142 -142
- package/src/hooks/anthropic-context-window-limit-recovery/pruning-types.ts +44 -44
- package/src/hooks/anthropic-context-window-limit-recovery/recovery-hook.test-support.ts +119 -119
- package/src/hooks/anthropic-context-window-limit-recovery/recovery-hook.ts +193 -193
- package/src/hooks/anthropic-context-window-limit-recovery/recovery-strategy.ts +2 -2
- package/src/hooks/anthropic-context-window-limit-recovery/session-timeout-map.ts +20 -20
- package/src/hooks/anthropic-context-window-limit-recovery/state.ts +78 -78
- package/src/hooks/anthropic-context-window-limit-recovery/storage-paths.ts +6 -6
- package/src/hooks/anthropic-context-window-limit-recovery/storage.ts +18 -18
- package/src/hooks/anthropic-context-window-limit-recovery/summarize-retry-strategy.ts +218 -218
- package/src/hooks/anthropic-context-window-limit-recovery/target-token-truncation.ts +196 -196
- package/src/hooks/anthropic-context-window-limit-recovery/tool-part-types.ts +38 -38
- package/src/hooks/anthropic-context-window-limit-recovery/tool-result-storage-sdk.ts +123 -123
- package/src/hooks/anthropic-context-window-limit-recovery/tool-result-storage.ts +119 -119
- package/src/hooks/anthropic-context-window-limit-recovery/types.ts +44 -44
- package/src/hooks/anthropic-effort/hook.ts +93 -93
- package/src/hooks/anthropic-effort/index.ts +1 -1
- package/src/hooks/auto-slash-command/constants.ts +12 -12
- package/src/hooks/auto-slash-command/detector.ts +88 -88
- package/src/hooks/auto-slash-command/executor.ts +165 -165
- package/src/hooks/auto-slash-command/hook.ts +238 -238
- package/src/hooks/auto-slash-command/index.ts +7 -7
- package/src/hooks/auto-slash-command/processed-command-store.ts +74 -74
- package/src/hooks/auto-slash-command/types.ts +42 -42
- package/src/hooks/background-notification/hook.ts +54 -54
- package/src/hooks/background-notification/index.ts +2 -2
- package/src/hooks/background-notification/types.ts +5 -5
- package/src/hooks/bash-file-read-guard.ts +44 -44
- package/src/hooks/category-skill-reminder/formatter.ts +37 -37
- package/src/hooks/category-skill-reminder/hook.ts +142 -142
- package/src/hooks/category-skill-reminder/index.ts +1 -1
- package/src/hooks/claude-code-hooks/AGENTS.md +41 -41
- package/src/hooks/claude-code-hooks/claude-code-hooks-hook.ts +28 -28
- package/src/hooks/claude-code-hooks/config-loader.ts +151 -151
- package/src/hooks/claude-code-hooks/config.ts +147 -147
- package/src/hooks/claude-code-hooks/dispatch-hook.ts +27 -27
- package/src/hooks/claude-code-hooks/execute-http-hook.ts +116 -116
- package/src/hooks/claude-code-hooks/handlers/chat-message-handler.ts +140 -140
- package/src/hooks/claude-code-hooks/handlers/pre-compact-handler.ts +41 -41
- package/src/hooks/claude-code-hooks/handlers/session-event-handler.ts +137 -137
- package/src/hooks/claude-code-hooks/handlers/tool-execute-after-handler.ts +160 -160
- package/src/hooks/claude-code-hooks/handlers/tool-execute-before-handler.ts +93 -93
- package/src/hooks/claude-code-hooks/index.ts +1 -1
- package/src/hooks/claude-code-hooks/plugin-config.ts +12 -12
- package/src/hooks/claude-code-hooks/post-tool-use.ts +195 -195
- package/src/hooks/claude-code-hooks/pre-compact.ts +105 -105
- package/src/hooks/claude-code-hooks/pre-tool-use.ts +168 -168
- package/src/hooks/claude-code-hooks/session-hook-state.ts +17 -17
- package/src/hooks/claude-code-hooks/stop.ts +118 -118
- package/src/hooks/claude-code-hooks/todo.ts +76 -76
- package/src/hooks/claude-code-hooks/tool-input-cache.ts +82 -82
- package/src/hooks/claude-code-hooks/transcript.ts +248 -248
- package/src/hooks/claude-code-hooks/types.ts +214 -214
- package/src/hooks/claude-code-hooks/user-prompt-submit.ts +121 -121
- package/src/hooks/comment-checker/cli-runner.ts +127 -127
- package/src/hooks/comment-checker/cli.ts +269 -269
- package/src/hooks/comment-checker/downloader.ts +170 -170
- package/src/hooks/comment-checker/hook.ts +192 -192
- package/src/hooks/comment-checker/index.ts +1 -1
- package/src/hooks/comment-checker/pending-calls.ts +45 -45
- package/src/hooks/comment-checker/types.ts +33 -33
- package/src/hooks/compaction-context-injector/compaction-context-prompt.ts +56 -56
- package/src/hooks/compaction-context-injector/constants.ts +5 -5
- package/src/hooks/compaction-context-injector/hook.ts +164 -164
- package/src/hooks/compaction-context-injector/index.ts +1 -1
- package/src/hooks/compaction-context-injector/recovery-prompt-config.ts +77 -77
- package/src/hooks/compaction-context-injector/recovery.ts +163 -163
- package/src/hooks/compaction-context-injector/session-id.ts +8 -8
- package/src/hooks/compaction-context-injector/session-prompt-config-resolver.ts +120 -120
- package/src/hooks/compaction-context-injector/tail-monitor.ts +52 -52
- package/src/hooks/compaction-context-injector/types.ts +25 -25
- package/src/hooks/compaction-context-injector/validated-model.ts +47 -47
- package/src/hooks/compaction-todo-preserver/hook.ts +127 -127
- package/src/hooks/compaction-todo-preserver/index.ts +2 -2
- package/src/hooks/context-window-monitor.ts +113 -113
- package/src/hooks/delegate-task-retry/guidance.ts +45 -45
- package/src/hooks/delegate-task-retry/hook.ts +22 -22
- package/src/hooks/delegate-task-retry/index.ts +4 -4
- package/src/hooks/delegate-task-retry/patterns.ts +77 -77
- package/src/hooks/directory-agents-injector/constants.ts +7 -7
- package/src/hooks/directory-agents-injector/finder.ts +38 -38
- package/src/hooks/directory-agents-injector/hook.ts +80 -80
- package/src/hooks/directory-agents-injector/index.ts +1 -1
- package/src/hooks/directory-agents-injector/injector.ts +59 -59
- package/src/hooks/directory-agents-injector/storage.ts +8 -8
- package/src/hooks/directory-readme-injector/constants.ts +7 -7
- package/src/hooks/directory-readme-injector/finder.ts +33 -33
- package/src/hooks/directory-readme-injector/hook.ts +80 -80
- package/src/hooks/directory-readme-injector/index.ts +1 -1
- package/src/hooks/directory-readme-injector/injector.ts +59 -59
- package/src/hooks/directory-readme-injector/storage.ts +8 -8
- package/src/hooks/edit-error-recovery/hook.ts +58 -58
- package/src/hooks/edit-error-recovery/index.ts +5 -5
- package/src/hooks/empty-task-response-detector.ts +27 -27
- package/src/hooks/fast-apply/hook.ts +11 -11
- package/src/hooks/fast-apply/index.ts +1 -1
- package/src/hooks/fast-apply/ollama-client.ts +53 -53
- package/src/hooks/fast-apply/tool-execute-before-handler.ts +86 -86
- package/src/hooks/guard/AGENTS.md +64 -64
- package/src/hooks/guard/background-launch-session-tracking.ts +97 -97
- package/src/hooks/guard/bob-path.ts +8 -8
- package/src/hooks/guard/boulder-continuation-injector.ts +109 -109
- package/src/hooks/guard/boulder-session-lineage.ts +44 -44
- package/src/hooks/guard/event-handler.ts +104 -104
- package/src/hooks/guard/final-wave-approval-gate.ts +47 -47
- package/src/hooks/guard/final-wave-plan-state.ts +60 -60
- package/src/hooks/guard/guard-hook.ts +27 -27
- package/src/hooks/guard/hook-name.ts +1 -1
- package/src/hooks/guard/idle-event.ts +341 -341
- package/src/hooks/guard/index.ts +3 -3
- package/src/hooks/guard/is-abort-error.ts +20 -20
- package/src/hooks/guard/recent-model-resolver.ts +89 -89
- package/src/hooks/guard/resolve-active-boulder-session.ts +29 -29
- package/src/hooks/guard/session-last-agent.ts +153 -153
- package/src/hooks/guard/subagent-session-id.ts +54 -54
- package/src/hooks/guard/system-reminder-templates.ts +249 -249
- package/src/hooks/guard/task-context.ts +45 -45
- package/src/hooks/guard/tool-execute-after.ts +209 -209
- package/src/hooks/guard/tool-execute-before.ts +102 -102
- package/src/hooks/guard/tsconfig.json +9 -9
- package/src/hooks/guard/types.ts +45 -45
- package/src/hooks/guard/verification-reminders.ts +197 -197
- package/src/hooks/guard/write-edit-tool-policy.ts +5 -5
- package/src/hooks/hashline-edit-diff-enhancer/hook.ts +106 -106
- package/src/hooks/hashline-read-enhancer/hook.ts +193 -193
- package/src/hooks/hashline-read-enhancer/index.ts +1 -1
- package/src/hooks/index.ts +58 -58
- package/src/hooks/interactive-bash-session/constants.ts +13 -13
- package/src/hooks/interactive-bash-session/hook.ts +125 -125
- package/src/hooks/interactive-bash-session/index.ts +3 -3
- package/src/hooks/interactive-bash-session/interactive-bash-session-tracker.ts +119 -119
- package/src/hooks/interactive-bash-session/parser.ts +118 -118
- package/src/hooks/interactive-bash-session/state-manager.ts +35 -35
- package/src/hooks/interactive-bash-session/storage.ts +59 -59
- package/src/hooks/interactive-bash-session/tmux-command-parser.ts +125 -125
- package/src/hooks/interactive-bash-session/types.ts +11 -11
- package/src/hooks/json-error-recovery/hook.ts +58 -58
- package/src/hooks/json-error-recovery/index.ts +6 -6
- package/src/hooks/keyword-detector/AGENTS.md +57 -57
- package/src/hooks/keyword-detector/analyze/default.ts +28 -28
- package/src/hooks/keyword-detector/analyze/index.ts +1 -1
- package/src/hooks/keyword-detector/constants.ts +45 -45
- package/src/hooks/keyword-detector/detector.ts +53 -53
- package/src/hooks/keyword-detector/hook.ts +143 -143
- package/src/hooks/keyword-detector/index.ts +5 -5
- package/src/hooks/keyword-detector/search/default.ts +20 -20
- package/src/hooks/keyword-detector/search/index.ts +1 -1
- package/src/hooks/keyword-detector/types.ts +4 -4
- package/src/hooks/keyword-detector/ultrawork/default.ts +302 -302
- package/src/hooks/keyword-detector/ultrawork/gemini.ts +290 -290
- package/src/hooks/keyword-detector/ultrawork/gpt.ts +173 -173
- package/src/hooks/keyword-detector/ultrawork/index.ts +56 -56
- package/src/hooks/keyword-detector/ultrawork/planner.ts +140 -140
- package/src/hooks/keyword-detector/ultrawork/source-detector.ts +65 -65
- package/src/hooks/legacy-plugin-toast/auto-migrate-runner.ts +2 -2
- package/src/hooks/legacy-plugin-toast/auto-migrate.ts +64 -64
- package/src/hooks/legacy-plugin-toast/hook.ts +68 -68
- package/src/hooks/legacy-plugin-toast/index.ts +1 -1
- package/src/hooks/legacy-plugin-toast/plugin-entry-migrator.ts +1 -1
- package/src/hooks/model-fallback/chat-message-fallback-handler.ts +74 -74
- package/src/hooks/model-fallback/hook.ts +201 -201
- package/src/hooks/model-fallback/next-fallback.ts +84 -84
- package/src/hooks/no-bob-gpt/hook.ts +56 -56
- package/src/hooks/no-bob-gpt/index.ts +1 -1
- package/src/hooks/no-coder-non-gpt/hook.ts +67 -67
- package/src/hooks/no-coder-non-gpt/index.ts +1 -1
- package/src/hooks/non-interactive-env/constants.ts +70 -70
- package/src/hooks/non-interactive-env/detector.ts +19 -19
- package/src/hooks/non-interactive-env/index.ts +5 -5
- package/src/hooks/non-interactive-env/non-interactive-env-hook.ts +73 -73
- package/src/hooks/non-interactive-env/types.ts +3 -3
- package/src/hooks/preemptive-compaction-degradation-monitor.ts +212 -212
- package/src/hooks/preemptive-compaction-no-text-tail.ts +70 -70
- package/src/hooks/preemptive-compaction.ts +218 -218
- package/src/hooks/question-label-truncator/hook.ts +62 -62
- package/src/hooks/question-label-truncator/index.ts +1 -1
- package/src/hooks/ralph-loop/AGENTS.md +62 -62
- package/src/hooks/ralph-loop/command-arguments.ts +30 -30
- package/src/hooks/ralph-loop/completion-handler.ts +65 -65
- package/src/hooks/ralph-loop/completion-promise-detector-test-input.ts +23 -23
- package/src/hooks/ralph-loop/completion-promise-detector.ts +165 -165
- package/src/hooks/ralph-loop/constants.ts +7 -7
- package/src/hooks/ralph-loop/continuation-prompt-builder.ts +77 -77
- package/src/hooks/ralph-loop/continuation-prompt-injector.ts +91 -91
- package/src/hooks/ralph-loop/index.ts +6 -6
- package/src/hooks/ralph-loop/iteration-continuation.ts +64 -64
- package/src/hooks/ralph-loop/logician-verification-detector.ts +88 -88
- package/src/hooks/ralph-loop/loop-session-recovery.ts +33 -33
- package/src/hooks/ralph-loop/loop-state-controller.ts +178 -178
- package/src/hooks/ralph-loop/message-storage-directory.ts +1 -1
- package/src/hooks/ralph-loop/pending-verification-handler.ts +152 -152
- package/src/hooks/ralph-loop/ralph-loop-event-handler.ts +231 -231
- package/src/hooks/ralph-loop/ralph-loop-hook.ts +90 -90
- package/src/hooks/ralph-loop/session-event-handler.ts +56 -56
- package/src/hooks/ralph-loop/session-reset-strategy.ts +69 -69
- package/src/hooks/ralph-loop/storage.ts +164 -164
- package/src/hooks/ralph-loop/types.ts +25 -25
- package/src/hooks/ralph-loop/verification-failure-handler.ts +103 -103
- package/src/hooks/ralph-loop/with-timeout.ts +20 -20
- package/src/hooks/read-image-resizer/hook.ts +209 -209
- package/src/hooks/read-image-resizer/image-dimensions.ts +191 -191
- package/src/hooks/read-image-resizer/image-resizer.ts +191 -191
- package/src/hooks/read-image-resizer/index.ts +1 -1
- package/src/hooks/read-image-resizer/png-fallback-resizer.ts +359 -359
- package/src/hooks/read-image-resizer/types.ts +16 -16
- package/src/hooks/rules-injector/AGENTS.md +53 -53
- package/src/hooks/rules-injector/cache.ts +27 -27
- package/src/hooks/rules-injector/constants.ts +31 -31
- package/src/hooks/rules-injector/finder.ts +3 -3
- package/src/hooks/rules-injector/hook.ts +94 -94
- package/src/hooks/rules-injector/index.ts +2 -2
- package/src/hooks/rules-injector/injector.ts +189 -189
- package/src/hooks/rules-injector/matcher.ts +63 -63
- package/src/hooks/rules-injector/output-path.ts +22 -22
- package/src/hooks/rules-injector/parser.ts +211 -211
- package/src/hooks/rules-injector/project-root-finder.ts +36 -36
- package/src/hooks/rules-injector/rule-distance.ts +53 -53
- package/src/hooks/rules-injector/rule-file-finder.ts +139 -139
- package/src/hooks/rules-injector/rule-file-scanner.ts +55 -55
- package/src/hooks/rules-injector/storage.ts +59 -59
- package/src/hooks/rules-injector/types.ts +57 -57
- package/src/hooks/runtime-fallback/AGENTS.md +102 -102
- package/src/hooks/runtime-fallback/agent-resolver.ts +50 -50
- package/src/hooks/runtime-fallback/auto-retry-signal.ts +32 -32
- package/src/hooks/runtime-fallback/auto-retry.ts +228 -228
- package/src/hooks/runtime-fallback/chat-message-handler.ts +62 -62
- package/src/hooks/runtime-fallback/constants.ts +47 -47
- package/src/hooks/runtime-fallback/error-classifier.ts +183 -183
- package/src/hooks/runtime-fallback/event-handler.ts +213 -213
- package/src/hooks/runtime-fallback/fallback-bootstrap-model.ts +63 -63
- package/src/hooks/runtime-fallback/fallback-models.ts +86 -86
- package/src/hooks/runtime-fallback/fallback-retry-dispatcher.ts +55 -55
- package/src/hooks/runtime-fallback/fallback-state.ts +74 -74
- package/src/hooks/runtime-fallback/hook.ts +87 -87
- package/src/hooks/runtime-fallback/index.ts +2 -2
- package/src/hooks/runtime-fallback/last-user-retry-parts.ts +20 -20
- package/src/hooks/runtime-fallback/message-update-handler.ts +168 -168
- package/src/hooks/runtime-fallback/retry-model-payload.ts +30 -30
- package/src/hooks/runtime-fallback/session-messages.ts +38 -38
- package/src/hooks/runtime-fallback/session-status-handler.ts +126 -126
- package/src/hooks/runtime-fallback/types.ts +77 -77
- package/src/hooks/runtime-fallback/visible-assistant-response.ts +80 -80
- package/src/hooks/session-notification-content.ts +145 -145
- package/src/hooks/session-notification-formatting.ts +25 -25
- package/src/hooks/session-notification-scheduler.ts +188 -188
- package/src/hooks/session-notification-sender.ts +117 -117
- package/src/hooks/session-notification-utils.ts +80 -80
- package/src/hooks/session-notification.ts +219 -219
- package/src/hooks/session-recovery/AGENTS.md +59 -59
- package/src/hooks/session-recovery/constants.ts +5 -5
- package/src/hooks/session-recovery/detect-error-type.ts +102 -102
- package/src/hooks/session-recovery/hook.ts +166 -166
- package/src/hooks/session-recovery/index.ts +7 -7
- package/src/hooks/session-recovery/recover-empty-content-message-sdk.ts +201 -201
- package/src/hooks/session-recovery/recover-thinking-block-order.ts +137 -137
- package/src/hooks/session-recovery/recover-thinking-disabled-violation.ts +75 -75
- package/src/hooks/session-recovery/recover-tool-result-missing.ts +108 -108
- package/src/hooks/session-recovery/recover-unavailable-tool.ts +108 -108
- package/src/hooks/session-recovery/resume.ts +49 -49
- package/src/hooks/session-recovery/storage/empty-messages.ts +47 -47
- package/src/hooks/session-recovery/storage/empty-text.ts +118 -118
- package/src/hooks/session-recovery/storage/message-dir.ts +1 -1
- package/src/hooks/session-recovery/storage/messages-reader.ts +83 -83
- package/src/hooks/session-recovery/storage/orphan-thinking-search.ts +43 -43
- package/src/hooks/session-recovery/storage/part-content.ts +28 -28
- package/src/hooks/session-recovery/storage/part-id.ts +5 -5
- package/src/hooks/session-recovery/storage/parts-reader.ts +56 -56
- package/src/hooks/session-recovery/storage/text-part-injector.ts +63 -63
- package/src/hooks/session-recovery/storage/thinking-block-search.ts +42 -42
- package/src/hooks/session-recovery/storage/thinking-prepend.ts +223 -223
- package/src/hooks/session-recovery/storage/thinking-strip.ts +67 -67
- package/src/hooks/session-recovery/storage.ts +34 -34
- package/src/hooks/session-recovery/types.ts +101 -101
- package/src/hooks/session-todo-status.ts +20 -20
- package/src/hooks/shared/compaction-model-resolver.ts +34 -34
- package/src/hooks/shared/shared/compaction-model-resolver.ts +34 -34
- package/src/hooks/start-work/context-info-builder.ts +319 -319
- package/src/hooks/start-work/index.ts +4 -4
- package/src/hooks/start-work/parse-user-request.ts +32 -32
- package/src/hooks/start-work/start-work-hook.ts +135 -135
- package/src/hooks/start-work/worktree-block.ts +11 -11
- package/src/hooks/start-work/worktree-detector.ts +77 -77
- package/src/hooks/stop-continuation-guard/hook.ts +122 -122
- package/src/hooks/stop-continuation-guard/index.ts +2 -2
- package/src/hooks/strategist-md-only/agent-matcher.ts +5 -5
- package/src/hooks/strategist-md-only/agent-resolution.ts +70 -70
- package/src/hooks/strategist-md-only/constants.ts +78 -78
- package/src/hooks/strategist-md-only/hook.ts +82 -82
- package/src/hooks/strategist-md-only/index.ts +2 -2
- package/src/hooks/strategist-md-only/path-policy.ts +41 -41
- package/src/hooks/sub-notepad/constants.ts +29 -29
- package/src/hooks/sub-notepad/hook.ts +44 -44
- package/src/hooks/sub-notepad/index.ts +3 -3
- package/src/hooks/task-reminder/hook.ts +59 -59
- package/src/hooks/task-reminder/index.ts +1 -1
- package/src/hooks/task-resume-info/hook.ts +39 -39
- package/src/hooks/task-resume-info/index.ts +1 -1
- package/src/hooks/tasks-todowrite-disabler/constants.ts +30 -30
- package/src/hooks/tasks-todowrite-disabler/hook.ts +34 -34
- package/src/hooks/tasks-todowrite-disabler/index.ts +2 -2
- package/src/hooks/think-mode/detector.ts +59 -59
- package/src/hooks/think-mode/hook.ts +76 -76
- package/src/hooks/think-mode/index.ts +5 -5
- package/src/hooks/think-mode/switcher.ts +100 -100
- package/src/hooks/think-mode/types.ts +16 -16
- package/src/hooks/thinking-block-validator/hook.ts +181 -181
- package/src/hooks/thinking-block-validator/index.ts +1 -1
- package/src/hooks/todo-continuation-enforcer/AGENTS.md +65 -65
- package/src/hooks/todo-continuation-enforcer/abort-detection.ts +17 -17
- package/src/hooks/todo-continuation-enforcer/compaction-guard.ts +39 -39
- package/src/hooks/todo-continuation-enforcer/constants.ts +25 -25
- package/src/hooks/todo-continuation-enforcer/continuation-injection.ts +222 -222
- package/src/hooks/todo-continuation-enforcer/countdown.ts +86 -86
- package/src/hooks/todo-continuation-enforcer/handler.ts +99 -99
- package/src/hooks/todo-continuation-enforcer/idle-event.ts +225 -225
- package/src/hooks/todo-continuation-enforcer/index.ts +59 -59
- package/src/hooks/todo-continuation-enforcer/message-directory.ts +1 -1
- package/src/hooks/todo-continuation-enforcer/non-idle-events.ts +107 -107
- package/src/hooks/todo-continuation-enforcer/pending-question-detection.ts +40 -40
- package/src/hooks/todo-continuation-enforcer/resolve-message-info.ts +48 -48
- package/src/hooks/todo-continuation-enforcer/session-state.ts +283 -283
- package/src/hooks/todo-continuation-enforcer/stagnation-detection.ts +36 -36
- package/src/hooks/todo-continuation-enforcer/todo.ts +11 -11
- package/src/hooks/todo-continuation-enforcer/token-limit-detection.ts +38 -38
- package/src/hooks/todo-continuation-enforcer/types.ts +74 -74
- package/src/hooks/todo-description-override/description.ts +28 -28
- package/src/hooks/todo-description-override/hook.ts +14 -14
- package/src/hooks/todo-description-override/index.ts +1 -1
- package/src/hooks/tool-output-truncator.ts +66 -66
- package/src/hooks/tool-pair-validator/hook.ts +184 -184
- package/src/hooks/tool-pair-validator/index.ts +1 -1
- package/src/hooks/unstable-agent-babysitter/index.ts +9 -9
- package/src/hooks/unstable-agent-babysitter/task-message-analyzer.ts +110 -110
- package/src/hooks/unstable-agent-babysitter/unstable-agent-babysitter-hook.ts +238 -238
- package/src/hooks/webfetch-redirect-guard/constants.ts +11 -11
- package/src/hooks/webfetch-redirect-guard/hook.ts +123 -123
- package/src/hooks/webfetch-redirect-guard/index.ts +1 -1
- package/src/hooks/webfetch-redirect-guard/redirect-resolution.ts +89 -89
- package/src/hooks/write-existing-file-guard/hook.ts +108 -108
- package/src/hooks/write-existing-file-guard/index.ts +1 -1
- package/src/hooks/write-existing-file-guard/session-read-permissions.ts +36 -36
- package/src/hooks/write-existing-file-guard/tool-execute-before-handler.ts +176 -176
- package/src/index.ts +284 -284
- package/src/internals/plugins/pty/LICENSE +21 -21
- package/src/internals/plugins/pty/constants.ts +7 -7
- package/src/internals/plugins/pty/plugin.ts +28 -28
- package/src/internals/plugins/pty/pty/buffer.ts +75 -75
- package/src/internals/plugins/pty/pty/formatters.ts +22 -22
- package/src/internals/plugins/pty/pty/manager.ts +175 -175
- package/src/internals/plugins/pty/pty/notification-manager.ts +75 -75
- package/src/internals/plugins/pty/pty/output-manager.ts +29 -29
- package/src/internals/plugins/pty/pty/permissions.ts +115 -115
- package/src/internals/plugins/pty/pty/session-lifecycle.ts +161 -161
- package/src/internals/plugins/pty/pty/tools/kill.ts +41 -41
- package/src/internals/plugins/pty/pty/tools/kill.txt +25 -25
- package/src/internals/plugins/pty/pty/tools/list.ts +25 -25
- package/src/internals/plugins/pty/pty/tools/list.txt +22 -22
- package/src/internals/plugins/pty/pty/tools/read.ts +234 -234
- package/src/internals/plugins/pty/pty/tools/read.txt +39 -39
- package/src/internals/plugins/pty/pty/tools/spawn.ts +71 -71
- package/src/internals/plugins/pty/pty/tools/spawn.txt +47 -47
- package/src/internals/plugins/pty/pty/tools/write.ts +96 -96
- package/src/internals/plugins/pty/pty/tools/write.txt +28 -28
- package/src/internals/plugins/pty/pty/types.ts +67 -67
- package/src/internals/plugins/pty/pty/utils.ts +21 -21
- package/src/internals/plugins/pty/pty/wildcard.ts +62 -62
- package/src/internals/plugins/pty/shared/constants.ts +7 -7
- package/src/internals/plugins/pty/types.ts +7 -7
- package/src/internals/plugins/subtask2/LICENSE +128 -128
- package/src/internals/plugins/subtask2/commands/index.ts +7 -7
- package/src/internals/plugins/subtask2/commands/loader.ts +39 -39
- package/src/internals/plugins/subtask2/commands/manifest.ts +64 -64
- package/src/internals/plugins/subtask2/commands/resolver.ts +28 -28
- package/src/internals/plugins/subtask2/core/plugin.ts +52 -52
- package/src/internals/plugins/subtask2/core/state.ts +764 -764
- package/src/internals/plugins/subtask2/features/auto.ts +57 -57
- package/src/internals/plugins/subtask2/features/index.ts +9 -9
- package/src/internals/plugins/subtask2/features/inline-subtasks.ts +205 -205
- package/src/internals/plugins/subtask2/features/parallel.ts +148 -148
- package/src/internals/plugins/subtask2/features/results.ts +48 -48
- package/src/internals/plugins/subtask2/features/returns.ts +273 -273
- package/src/internals/plugins/subtask2/features/turns.ts +190 -190
- package/src/internals/plugins/subtask2/hooks/command-hooks.ts +283 -283
- package/src/internals/plugins/subtask2/hooks/message-hooks.ts +603 -603
- package/src/internals/plugins/subtask2/hooks/session-idle-hook.ts +358 -358
- package/src/internals/plugins/subtask2/hooks/tool-hooks.ts +309 -309
- package/src/internals/plugins/subtask2/loop.ts +122 -122
- package/src/internals/plugins/subtask2/parsing/auto.ts +33 -33
- package/src/internals/plugins/subtask2/parsing/commands.ts +154 -154
- package/src/internals/plugins/subtask2/parsing/frontmatter.ts +20 -20
- package/src/internals/plugins/subtask2/parsing/index.ts +10 -10
- package/src/internals/plugins/subtask2/parsing/overrides.ts +68 -68
- package/src/internals/plugins/subtask2/parsing/parallel.ts +88 -88
- package/src/internals/plugins/subtask2/parsing/turns.ts +78 -78
- package/src/internals/plugins/subtask2/types.ts +41 -41
- package/src/internals/plugins/subtask2/utils/config.ts +100 -100
- package/src/internals/plugins/subtask2/utils/index.ts +7 -7
- package/src/internals/plugins/subtask2/utils/logger.ts +67 -67
- package/src/internals/plugins/subtask2/utils/prompts.ts +117 -117
- package/src/internals/plugins/websearch-cited/LICENSE +214 -214
- package/src/internals/plugins/websearch-cited/codex_prompt.txt +79 -79
- package/src/internals/plugins/websearch-cited/google.ts +749 -749
- package/src/internals/plugins/websearch-cited/index.ts +301 -301
- package/src/internals/plugins/websearch-cited/openai.ts +407 -407
- package/src/internals/plugins/websearch-cited/openrouter.ts +190 -190
- package/src/internals/plugins/websearch-cited/types.ts +7 -7
- package/src/lsp/index.ts +15 -15
- package/src/mcp/context7.ts +9 -9
- package/src/mcp/grep-app.ts +6 -6
- package/src/mcp/index.ts +87 -87
- package/src/mcp/omo-mcp-index.ts +35 -35
- package/src/mcp/types.ts +9 -9
- package/src/mcp/websearch.ts +44 -44
- package/src/permissions/index.ts +25 -25
- package/src/plugin/AGENTS.md +54 -54
- package/src/plugin/available-categories.ts +24 -24
- package/src/plugin/chat-headers.ts +141 -141
- package/src/plugin/chat-message.ts +309 -309
- package/src/plugin/chat-params.ts +182 -182
- package/src/plugin/command-execute-before.ts +80 -80
- package/src/plugin/event.ts +639 -639
- package/src/plugin/hooks/create-continuation-hooks.ts +128 -128
- package/src/plugin/hooks/create-core-hooks.ts +47 -47
- package/src/plugin/hooks/create-session-hooks.ts +286 -286
- package/src/plugin/hooks/create-skill-hooks.ts +50 -50
- package/src/plugin/hooks/create-tool-guard-hooks.ts +159 -159
- package/src/plugin/hooks/create-transform-hooks.ts +85 -85
- package/src/plugin/messages-transform.ts +28 -28
- package/src/plugin/normalize-tool-arg-schemas.ts +75 -75
- package/src/plugin/recent-synthetic-idles.ts +20 -20
- package/src/plugin/session-agent-resolver.ts +37 -37
- package/src/plugin/session-status-normalizer.ts +22 -22
- package/src/plugin/skill-context.ts +132 -132
- package/src/plugin/system-transform.ts +6 -6
- package/src/plugin/tool-execute-after.ts +178 -178
- package/src/plugin/tool-execute-before.ts +222 -222
- package/src/plugin/tool-registry.ts +282 -282
- package/src/plugin/types.ts +26 -26
- package/src/plugin/ultrawork-db-model-override.ts +142 -142
- package/src/plugin/ultrawork-model-override.ts +196 -196
- package/src/plugin/ultrawork-variant-availability.ts +51 -51
- package/src/plugin/unstable-agent-babysitter.ts +41 -41
- package/src/plugin-config.ts +314 -314
- package/src/plugin-dispose.ts +51 -51
- package/src/plugin-handlers/AGENTS.md +92 -92
- package/src/plugin-handlers/agent-config-handler.ts +502 -502
- package/src/plugin-handlers/agent-key-remapper.ts +39 -39
- package/src/plugin-handlers/agent-override-protection.ts +38 -38
- package/src/plugin-handlers/agent-priority-order.ts +63 -63
- package/src/plugin-handlers/category-config-resolver.ts +9 -9
- package/src/plugin-handlers/command-config-handler.ts +105 -105
- package/src/plugin-handlers/config-handler.ts +61 -61
- package/src/plugin-handlers/index.ts +10 -10
- package/src/plugin-handlers/mcp-config-handler.ts +205 -205
- package/src/plugin-handlers/plan-model-inheritance.ts +27 -27
- package/src/plugin-handlers/plugin-components-loader.ts +70 -70
- package/src/plugin-handlers/provider-config-handler.ts +73 -73
- package/src/plugin-handlers/strategist-agent-config-builder.ts +128 -128
- package/src/plugin-handlers/tool-config-handler.ts +193 -193
- package/src/plugin-interface.ts +83 -83
- package/src/plugin-state.ts +18 -18
- package/src/shared/AGENTS.md +54 -54
- package/src/shared/agent-display-names.ts +182 -182
- package/src/shared/agent-tool-restrictions.ts +80 -80
- package/src/shared/agent-variant.ts +101 -101
- package/src/shared/agents-config-dir.ts +23 -23
- package/src/shared/archive-entry-validator.ts +83 -83
- package/src/shared/background-output-consumption.ts +69 -69
- package/src/shared/binary-downloader.ts +127 -127
- package/src/shared/claude-config-dir.ts +16 -16
- package/src/shared/closure-protocol.ts +53 -53
- package/src/shared/command-executor/embedded-commands.ts +26 -26
- package/src/shared/command-executor/execute-command.ts +28 -28
- package/src/shared/command-executor/execute-hook-command.ts +129 -129
- package/src/shared/command-executor/home-directory.ts +5 -5
- package/src/shared/command-executor/resolve-commands-in-text.ts +49 -49
- package/src/shared/command-executor/shell-path.ts +27 -27
- package/src/shared/command-executor.ts +5 -5
- package/src/shared/compaction-agent-config-checkpoint.ts +42 -42
- package/src/shared/compaction-marker.ts +61 -61
- package/src/shared/config-errors.ts +18 -18
- package/src/shared/connected-providers-cache.ts +215 -215
- package/src/shared/contains-path.ts +50 -50
- package/src/shared/context-limit-resolver.ts +42 -42
- package/src/shared/data-path.ts +64 -64
- package/src/shared/deep-merge.ts +53 -53
- package/src/shared/disabled-tools.ts +19 -19
- package/src/shared/dynamic-truncator.ts +222 -222
- package/src/shared/external-plugin-detector.ts +139 -139
- package/src/shared/fallback-chain-from-models.ts +124 -124
- package/src/shared/fallback-model-availability.ts +102 -102
- package/src/shared/file-reference-resolver.ts +99 -99
- package/src/shared/file-utils.ts +34 -34
- package/src/shared/first-message-variant.ts +28 -28
- package/src/shared/frontmatter.ts +31 -31
- package/src/shared/git-worktree/collect-git-diff-stats.ts +56 -56
- package/src/shared/git-worktree/format-file-changes.ts +46 -46
- package/src/shared/git-worktree/index.ts +7 -7
- package/src/shared/git-worktree/parse-diff-numstat.ts +27 -27
- package/src/shared/git-worktree/parse-status-porcelain-line.ts +27 -27
- package/src/shared/git-worktree/parse-status-porcelain.ts +15 -15
- package/src/shared/git-worktree/types.ts +8 -8
- package/src/shared/hook-disabled.ts +22 -22
- package/src/shared/index.ts +80 -80
- package/src/shared/internal-initiator-marker.ts +18 -18
- package/src/shared/is-abort-error.ts +20 -20
- package/src/shared/json-file-cache-store.ts +98 -98
- package/src/shared/jsonc-parser.ts +98 -98
- package/src/shared/known-variants.ts +16 -16
- package/src/shared/legacy-plugin-warning.ts +68 -68
- package/src/shared/load-opencode-plugins.ts +60 -60
- package/src/shared/log-legacy-plugin-startup-warning.ts +46 -46
- package/src/shared/logger.ts +48 -48
- package/src/shared/merge-categories.ts +18 -18
- package/src/shared/migrate-legacy-config-file.ts +66 -66
- package/src/shared/migrate-legacy-plugin-entry.ts +75 -75
- package/src/shared/migration/agent-category.ts +60 -60
- package/src/shared/migration/agent-names.ts +100 -100
- package/src/shared/migration/config-migration.ts +210 -210
- package/src/shared/migration/hook-names.ts +40 -40
- package/src/shared/migration/migrations-sidecar.ts +92 -92
- package/src/shared/migration/model-versions.ts +50 -50
- package/src/shared/migration.ts +5 -5
- package/src/shared/model-availability.ts +294 -294
- package/src/shared/model-capabilities/bundled-snapshot.ts +15 -15
- package/src/shared/model-capabilities/get-model-capabilities.ts +140 -140
- package/src/shared/model-capabilities/index.ts +9 -9
- package/src/shared/model-capabilities/runtime-model-readers.ts +190 -190
- package/src/shared/model-capabilities/types.ts +80 -80
- package/src/shared/model-capabilities-cache.ts +213 -213
- package/src/shared/model-capability-aliases.ts +108 -108
- package/src/shared/model-capability-guardrails.ts +149 -149
- package/src/shared/model-capability-heuristics.ts +32 -32
- package/src/shared/model-error-classifier.ts +214 -214
- package/src/shared/model-format-normalizer.ts +20 -20
- package/src/shared/model-normalization.ts +8 -8
- package/src/shared/model-requirements.ts +26 -26
- package/src/shared/model-resolution-pipeline.ts +216 -216
- package/src/shared/model-resolution-types.ts +41 -41
- package/src/shared/model-resolver.ts +106 -106
- package/src/shared/model-sanitizer.ts +12 -12
- package/src/shared/model-settings-compatibility.ts +200 -200
- package/src/shared/model-suggestion-retry.ts +182 -182
- package/src/shared/normalize-sdk-response.ts +36 -36
- package/src/shared/opencode-command-dirs.ts +36 -36
- package/src/shared/opencode-config-dir-types.ts +15 -15
- package/src/shared/opencode-config-dir.ts +135 -135
- package/src/shared/opencode-http-api.ts +139 -139
- package/src/shared/opencode-message-dir.ts +29 -29
- package/src/shared/opencode-server-auth.ts +190 -190
- package/src/shared/opencode-storage-detection.ts +33 -33
- package/src/shared/opencode-storage-paths.ts +6 -6
- package/src/shared/opencode-version.ts +80 -80
- package/src/shared/parse-tools-config.ts +25 -25
- package/src/shared/pattern-matcher.ts +46 -46
- package/src/shared/permission-compat.ts +86 -86
- package/src/shared/plugin-command-discovery.ts +28 -28
- package/src/shared/plugin-entry-migrator.ts +21 -21
- package/src/shared/plugin-identity.ts +8 -8
- package/src/shared/port-utils.ts +48 -48
- package/src/shared/project-discovery-dirs.ts +101 -101
- package/src/shared/prompt-timeout-context.ts +49 -49
- package/src/shared/prompt-tools.ts +35 -35
- package/src/shared/provider-model-id-transform.ts +58 -58
- package/src/shared/question-denied-session-permission.ts +9 -9
- package/src/shared/record-type-guard.ts +3 -3
- package/src/shared/resolve-agent-definition-paths.ts +22 -22
- package/src/shared/retry-status-utils.ts +19 -19
- package/src/shared/runtime-plugin-config.ts +98 -98
- package/src/shared/safe-create-hook.ts +24 -24
- package/src/shared/session-category-registry.ts +27 -27
- package/src/shared/session-cursor.ts +108 -108
- package/src/shared/session-directory-resolver.ts +41 -41
- package/src/shared/session-injected-paths.ts +59 -59
- package/src/shared/session-model-state.ts +15 -15
- package/src/shared/session-prompt-params-helpers.ts +31 -31
- package/src/shared/session-prompt-params-state.ts +37 -37
- package/src/shared/session-tools-store.ts +18 -18
- package/src/shared/session-utils.ts +25 -25
- package/src/shared/shell-env.ts +175 -175
- package/src/shared/skill-path-resolver.ts +26 -26
- package/src/shared/snake-case.ts +44 -44
- package/src/shared/spawn-with-windows-hide.ts +84 -84
- package/src/shared/system-directive.ts +67 -67
- package/src/shared/task-system-enabled.ts +9 -9
- package/src/shared/tmux/constants.ts +12 -12
- package/src/shared/tmux/index.ts +3 -3
- package/src/shared/tmux/tmux-utils/environment.ts +13 -13
- package/src/shared/tmux/tmux-utils/layout.ts +96 -96
- package/src/shared/tmux/tmux-utils/pane-close.ts +48 -48
- package/src/shared/tmux/tmux-utils/pane-dimensions.ts +28 -28
- package/src/shared/tmux/tmux-utils/pane-replace.ts +73 -73
- package/src/shared/tmux/tmux-utils/pane-spawn.ts +94 -94
- package/src/shared/tmux/tmux-utils/server-health.ts +62 -62
- package/src/shared/tmux/tmux-utils/session-spawn.ts +145 -145
- package/src/shared/tmux/tmux-utils/window-spawn.ts +93 -93
- package/src/shared/tmux/tmux-utils.ts +15 -15
- package/src/shared/tmux/types.ts +4 -4
- package/src/shared/tool-name.ts +27 -27
- package/src/shared/truncate-description.ts +11 -11
- package/src/shared/vision-capable-models-cache.ts +17 -17
- package/src/shared/write-file-atomically.ts +31 -31
- package/src/shared/zip-entry-listing/powershell-zip-entry-listing.ts +99 -99
- package/src/shared/zip-entry-listing/python-zip-entry-listing.ts +55 -55
- package/src/shared/zip-entry-listing/read-zip-symlink-target.ts +23 -23
- package/src/shared/zip-entry-listing/tar-zip-entry-listing.ts +93 -93
- package/src/shared/zip-entry-listing/zipinfo-zip-entry-listing.ts +72 -72
- package/src/shared/zip-entry-listing.ts +13 -13
- package/src/shared/zip-extractor.ts +118 -118
- package/src/skills/index.ts +56 -56
- package/src/testing/module-mock-lifecycle.ts +143 -143
- package/src/tools/AGENTS.md +108 -108
- package/src/tools/ast-grep/cli-binary-path-resolution.ts +60 -60
- package/src/tools/ast-grep/cli.ts +177 -177
- package/src/tools/ast-grep/constants.ts +5 -5
- package/src/tools/ast-grep/downloader.ts +119 -119
- package/src/tools/ast-grep/environment-check.ts +89 -89
- package/src/tools/ast-grep/index.ts +5 -5
- package/src/tools/ast-grep/language-support.ts +63 -63
- package/src/tools/ast-grep/process-output-timeout.ts +28 -28
- package/src/tools/ast-grep/result-formatter.ts +102 -102
- package/src/tools/ast-grep/sg-cli-path.ts +102 -102
- package/src/tools/ast-grep/sg-compact-json-output.ts +54 -54
- package/src/tools/ast-grep/tools.ts +117 -117
- package/src/tools/ast-grep/types.ts +61 -61
- package/src/tools/background-task/AGENTS.md +53 -53
- package/src/tools/background-task/clients.ts +32 -32
- package/src/tools/background-task/constants.ts +9 -9
- package/src/tools/background-task/create-background-cancel.ts +115 -115
- package/src/tools/background-task/create-background-output.ts +159 -159
- package/src/tools/background-task/create-background-task.ts +126 -126
- package/src/tools/background-task/delay.ts +3 -3
- package/src/tools/background-task/full-session-format.ts +148 -148
- package/src/tools/background-task/index.ts +8 -8
- package/src/tools/background-task/message-dir.ts +1 -1
- package/src/tools/background-task/session-messages.ts +22 -22
- package/src/tools/background-task/task-result-format.ts +113 -113
- package/src/tools/background-task/task-status-format.ts +72 -72
- package/src/tools/background-task/time-format.ts +30 -30
- package/src/tools/background-task/tools.ts +11 -11
- package/src/tools/background-task/truncate-text.ts +4 -4
- package/src/tools/background-task/types.ts +72 -72
- package/src/tools/call-omo-agent/AGENTS.md +51 -51
- package/src/tools/call-omo-agent/agent-resolver.ts +64 -64
- package/src/tools/call-omo-agent/background-agent-executor.ts +91 -91
- package/src/tools/call-omo-agent/background-executor.ts +98 -98
- package/src/tools/call-omo-agent/completion-poller.ts +65 -65
- package/src/tools/call-omo-agent/constants.ts +23 -23
- package/src/tools/call-omo-agent/index.ts +3 -3
- package/src/tools/call-omo-agent/message-dir.ts +1 -1
- package/src/tools/call-omo-agent/message-processor.ts +86 -86
- package/src/tools/call-omo-agent/message-storage-directory.ts +1 -1
- package/src/tools/call-omo-agent/session-creator.ts +70 -70
- package/src/tools/call-omo-agent/subagent-session-creator.ts +74 -74
- package/src/tools/call-omo-agent/sync-executor.ts +148 -148
- package/src/tools/call-omo-agent/tool-context-with-metadata.ts +10 -10
- package/src/tools/call-omo-agent/tools.ts +192 -192
- package/src/tools/call-omo-agent/types.ts +34 -34
- package/src/tools/delegate-task/AGENTS.md +58 -58
- package/src/tools/delegate-task/anthropic-categories.ts +62 -62
- package/src/tools/delegate-task/available-models.ts +64 -64
- package/src/tools/delegate-task/background-continuation.ts +68 -68
- package/src/tools/delegate-task/background-task.ts +165 -165
- package/src/tools/delegate-task/builtin-categories.ts +33 -33
- package/src/tools/delegate-task/builtin-category-definition.ts +8 -8
- package/src/tools/delegate-task/cancel-unstable-agent-task.ts +19 -19
- package/src/tools/delegate-task/categories.ts +77 -77
- package/src/tools/delegate-task/category-resolver.ts +310 -310
- package/src/tools/delegate-task/constants.ts +351 -351
- package/src/tools/delegate-task/delegated-model-config.ts +20 -20
- package/src/tools/delegate-task/error-formatting.ts +51 -51
- package/src/tools/delegate-task/executor-types.ts +39 -39
- package/src/tools/delegate-task/executor.ts +16 -16
- package/src/tools/delegate-task/fallback-entry-resolution.ts +27 -27
- package/src/tools/delegate-task/fallback-entry-settings.ts +20 -20
- package/src/tools/delegate-task/google-categories.ts +130 -130
- package/src/tools/delegate-task/index.ts +4 -4
- package/src/tools/delegate-task/kimi-categories.ts +40 -40
- package/src/tools/delegate-task/model-selection.ts +201 -201
- package/src/tools/delegate-task/model-string-parser.ts +63 -63
- package/src/tools/delegate-task/openai-categories.ts +128 -128
- package/src/tools/delegate-task/parent-context-resolver.ts +47 -47
- package/src/tools/delegate-task/prompt-builder.ts +107 -107
- package/src/tools/delegate-task/resolve-call-id.ts +5 -5
- package/src/tools/delegate-task/skill-resolver.ts +22 -22
- package/src/tools/delegate-task/sub-agent.ts +70 -70
- package/src/tools/delegate-task/subagent-discovery.ts +152 -152
- package/src/tools/delegate-task/subagent-resolver.ts +225 -225
- package/src/tools/delegate-task/sync-continuation-deps.ts +9 -9
- package/src/tools/delegate-task/sync-continuation.ts +149 -149
- package/src/tools/delegate-task/sync-prompt-sender.ts +137 -137
- package/src/tools/delegate-task/sync-result-fetcher.ts +60 -60
- package/src/tools/delegate-task/sync-session-creator.ts +29 -29
- package/src/tools/delegate-task/sync-session-poller.ts +188 -188
- package/src/tools/delegate-task/sync-task-deps.ts +13 -13
- package/src/tools/delegate-task/sync-task-fallback.ts +68 -68
- package/src/tools/delegate-task/sync-task.ts +243 -243
- package/src/tools/delegate-task/time-formatter.ts +13 -13
- package/src/tools/delegate-task/timing.ts +46 -46
- package/src/tools/delegate-task/token-limiter.ts +123 -123
- package/src/tools/delegate-task/tools.ts +259 -259
- package/src/tools/delegate-task/types.ts +89 -89
- package/src/tools/delegate-task/unstable-agent-task.ts +243 -243
- package/src/tools/glob/cli.ts +206 -206
- package/src/tools/glob/constants.ts +12 -12
- package/src/tools/glob/index.ts +1 -1
- package/src/tools/glob/result-formatter.ts +26 -26
- package/src/tools/glob/tools.ts +49 -49
- package/src/tools/glob/types.ts +23 -23
- package/src/tools/grep/cli.ts +279 -279
- package/src/tools/grep/constants.ts +141 -141
- package/src/tools/grep/downloader.ts +128 -128
- package/src/tools/grep/index.ts +1 -1
- package/src/tools/grep/result-formatter.ts +60 -60
- package/src/tools/grep/tools.ts +75 -75
- package/src/tools/grep/types.ts +42 -42
- package/src/tools/hashline-edit/AGENTS.md +92 -92
- package/src/tools/hashline-edit/autocorrect-replacement-lines.ts +179 -179
- package/src/tools/hashline-edit/constants.ts +10 -10
- package/src/tools/hashline-edit/diff-utils.ts +53 -53
- package/src/tools/hashline-edit/edit-deduplication.ts +43 -43
- package/src/tools/hashline-edit/edit-operation-primitives.ts +126 -126
- package/src/tools/hashline-edit/edit-operations.ts +103 -103
- package/src/tools/hashline-edit/edit-ordering.ts +56 -56
- package/src/tools/hashline-edit/edit-text-normalization.ts +111 -111
- package/src/tools/hashline-edit/file-text-canonicalization.ts +44 -44
- package/src/tools/hashline-edit/formatter-trigger.ts +132 -132
- package/src/tools/hashline-edit/hash-computation.ts +154 -154
- package/src/tools/hashline-edit/hashline-chunk-formatter.ts +52 -52
- package/src/tools/hashline-edit/hashline-edit-diff.ts +31 -31
- package/src/tools/hashline-edit/hashline-edit-executor.ts +197 -197
- package/src/tools/hashline-edit/index.ts +20 -20
- package/src/tools/hashline-edit/normalize-edits.ts +95 -95
- package/src/tools/hashline-edit/tool-description.ts +95 -95
- package/src/tools/hashline-edit/tools.ts +42 -42
- package/src/tools/hashline-edit/types.ts +20 -20
- package/src/tools/hashline-edit/validation.ts +181 -181
- package/src/tools/index.ts +64 -64
- package/src/tools/interactive-bash/constants.ts +18 -18
- package/src/tools/interactive-bash/index.ts +4 -4
- package/src/tools/interactive-bash/tmux-path-resolver.ts +71 -71
- package/src/tools/interactive-bash/tools.ts +136 -136
- package/src/tools/look-at/assistant-message-extractor.ts +67 -67
- package/src/tools/look-at/constants.ts +3 -3
- package/src/tools/look-at/image-converter.ts +164 -164
- package/src/tools/look-at/index.ts +3 -3
- package/src/tools/look-at/look-at-arguments.ts +34 -34
- package/src/tools/look-at/mime-type-inference.ts +94 -94
- package/src/tools/look-at/multimodal-agent-metadata.ts +166 -166
- package/src/tools/look-at/multimodal-fallback-chain.ts +66 -66
- package/src/tools/look-at/session-poller.ts +42 -42
- package/src/tools/look-at/tools.ts +245 -245
- package/src/tools/look-at/types.ts +5 -5
- package/src/tools/lsp/AGENTS.md +70 -70
- package/src/tools/lsp/client.ts +3 -3
- package/src/tools/lsp/config.ts +3 -3
- package/src/tools/lsp/constants.ts +7 -7
- package/src/tools/lsp/diagnostics-tool.ts +75 -75
- package/src/tools/lsp/directory-diagnostics.ts +163 -163
- package/src/tools/lsp/find-references-tool.ts +43 -43
- package/src/tools/lsp/goto-definition-tool.ts +42 -42
- package/src/tools/lsp/index.ts +9 -9
- package/src/tools/lsp/infer-extension.ts +65 -65
- package/src/tools/lsp/language-config.ts +5 -5
- package/src/tools/lsp/language-mappings.ts +171 -171
- package/src/tools/lsp/lsp-client-connection.ts +66 -66
- package/src/tools/lsp/lsp-client-transport.ts +210 -210
- package/src/tools/lsp/lsp-client-wrapper.ts +116 -116
- package/src/tools/lsp/lsp-client.ts +129 -129
- package/src/tools/lsp/lsp-formatters.ts +193 -193
- package/src/tools/lsp/lsp-manager-process-cleanup.ts +83 -83
- package/src/tools/lsp/lsp-manager-temp-directory-cleanup.ts +29 -29
- package/src/tools/lsp/lsp-process.ts +158 -158
- package/src/tools/lsp/lsp-server.ts +217 -217
- package/src/tools/lsp/rename-tools.ts +53 -53
- package/src/tools/lsp/server-config-loader.ts +116 -116
- package/src/tools/lsp/server-definitions.ts +91 -91
- package/src/tools/lsp/server-installation.ts +58 -58
- package/src/tools/lsp/server-path-bases.ts +16 -16
- package/src/tools/lsp/server-resolution.ts +109 -109
- package/src/tools/lsp/symbols-tool.ts +76 -76
- package/src/tools/lsp/tools.ts +5 -5
- package/src/tools/lsp/types.ts +124 -124
- package/src/tools/lsp/workspace-edit.ts +121 -121
- package/src/tools/session-manager/constants.ts +93 -93
- package/src/tools/session-manager/file-storage.ts +203 -203
- package/src/tools/session-manager/index.ts +3 -3
- package/src/tools/session-manager/sdk-storage.ts +135 -135
- package/src/tools/session-manager/sdk-unavailable.ts +43 -43
- package/src/tools/session-manager/session-formatter.ts +199 -199
- package/src/tools/session-manager/storage.ts +161 -161
- package/src/tools/session-manager/tools.ts +197 -197
- package/src/tools/session-manager/types.ts +99 -99
- package/src/tools/shared/semaphore.ts +32 -32
- package/src/tools/skill/constants.ts +14 -14
- package/src/tools/skill/description-formatter.ts +61 -61
- package/src/tools/skill/index.ts +3 -3
- package/src/tools/skill/mcp-capability-formatter.ts +97 -97
- package/src/tools/skill/native-skills.ts +62 -62
- package/src/tools/skill/scope-priority.ts +17 -17
- package/src/tools/skill/skill-body.ts +26 -26
- package/src/tools/skill/skill-matcher.ts +40 -40
- package/src/tools/skill/tools.ts +196 -196
- package/src/tools/skill/types.ts +48 -48
- package/src/tools/skill-mcp/constants.ts +9 -9
- package/src/tools/skill-mcp/index.ts +3 -3
- package/src/tools/skill-mcp/tools.ts +204 -204
- package/src/tools/skill-mcp/types.ts +8 -8
- package/src/tools/slashcommand/command-discovery.ts +161 -161
- package/src/tools/slashcommand/command-output-formatter.ts +75 -75
- package/src/tools/slashcommand/index.ts +2 -2
- package/src/tools/slashcommand/types.ts +21 -21
- package/src/tools/task/index.ts +7 -7
- package/src/tools/task/task-create.ts +113 -113
- package/src/tools/task/task-get.ts +47 -47
- package/src/tools/task/task-list.ts +79 -79
- package/src/tools/task/task-update.ts +152 -152
- package/src/tools/task/todo-sync.ts +205 -205
- package/src/tools/task/types.ts +77 -77
- package/scripts/check_docs.ts +0 -129
- package/scripts/doctor.ts +0 -522
- package/scripts/measure_prompts.ts +0 -193
- package/scripts/test_routing.ts +0 -294
|
@@ -1,764 +1,764 @@
|
|
|
1
|
-
import type { CommandConfig, Subtask2Config } from "../types";
|
|
2
|
-
import type { LoopState } from "../loop";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Centralized session state management for subtask2 plugin
|
|
6
|
-
* All plugin state is managed through this module
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
// Command configurations loaded from manifest
|
|
10
|
-
let configs: Record<string, CommandConfig> = {};
|
|
11
|
-
|
|
12
|
-
// Plugin user configuration
|
|
13
|
-
let pluginConfig: Subtask2Config = { replace_generic: true };
|
|
14
|
-
|
|
15
|
-
// OpenCode client instance (v1 SDK with internal HTTP client)
|
|
16
|
-
let client: any = null;
|
|
17
|
-
|
|
18
|
-
// Session state maps
|
|
19
|
-
const callState = new Map<string, string>();
|
|
20
|
-
const returnState = new Map<string, string[]>();
|
|
21
|
-
const returnStack = new Map<string, string[][]>(); // Stack of return chains for nested returns
|
|
22
|
-
const pendingReturns = new Map<string, string>();
|
|
23
|
-
const pendingNonSubtaskReturns = new Map<string, string[]>();
|
|
24
|
-
const pipedArgsQueue = new Map<string, string[]>();
|
|
25
|
-
const returnArgsState = pipedArgsQueue; // alias for backward compat
|
|
26
|
-
const sessionMainCommand = new Map<string, string>();
|
|
27
|
-
const processedS2Messages = new Set<string>();
|
|
28
|
-
const executedReturns = new Set<string>();
|
|
29
|
-
const firstReturnPrompt = new Map<string, string>();
|
|
30
|
-
const subtaskParentSession = new Map<string, string>();
|
|
31
|
-
const pendingModelOverride = new Map<string, string>();
|
|
32
|
-
const pendingAgentOverride = new Map<string, string>();
|
|
33
|
-
const deferredReturnPrompt = new Map<string, string>();
|
|
34
|
-
// Track sessions that just had a stacked return prompt substituted
|
|
35
|
-
// session.idle should skip returnState processing until LLM responds
|
|
36
|
-
const pendingStackedPromptResponse = new Set<string>();
|
|
37
|
-
// Track the type of the last executed return to handle prompt returns correctly
|
|
38
|
-
// after inline subtasks (which don't inject "Summarize..." message)
|
|
39
|
-
const lastReturnType = new Map<
|
|
40
|
-
string,
|
|
41
|
-
"inline_subtask" | "command" | "prompt"
|
|
42
|
-
>();
|
|
43
|
-
|
|
44
|
-
// Pending prompt return to be substituted in message-hooks.ts
|
|
45
|
-
// session.idle sets this, message-hooks consumes it during transform
|
|
46
|
-
const pendingPromptReturn = new Map<string, string>();
|
|
47
|
-
|
|
48
|
-
// Named subtask results storage: parentSessionID -> Map<name, result>
|
|
49
|
-
const subtaskResults = new Map<string, Map<string, string>>();
|
|
50
|
-
|
|
51
|
-
// Pending `as:` names for subtasks: subtaskSessionID -> {parentSessionID, name}
|
|
52
|
-
const pendingResultCapture = new Map<
|
|
53
|
-
string,
|
|
54
|
-
{ parentSessionID: string; name: string }
|
|
55
|
-
>();
|
|
56
|
-
|
|
57
|
-
// Pending `as:` by prompt content (race-safe, like pendingParentForPrompt)
|
|
58
|
-
const pendingResultCaptureByPrompt = new Map<
|
|
59
|
-
string,
|
|
60
|
-
{ parentSessionID: string; name: string }
|
|
61
|
-
>();
|
|
62
|
-
|
|
63
|
-
// Pending main session result capture (for non-subtask commands with as:)
|
|
64
|
-
const pendingMainSessionCapture = new Map<string, string>();
|
|
65
|
-
|
|
66
|
-
// Pending parent sessions keyed by prompt content (for race-safe session mapping)
|
|
67
|
-
const pendingParentByPrompt = new Map<string, string>();
|
|
68
|
-
let hasActiveSubtask = false;
|
|
69
|
-
|
|
70
|
-
// Constants
|
|
71
|
-
export const OPENCODE_GENERIC =
|
|
72
|
-
"Summarize the task tool output above and continue with your task.";
|
|
73
|
-
|
|
74
|
-
// ============================================================================
|
|
75
|
-
// Configs
|
|
76
|
-
// ============================================================================
|
|
77
|
-
|
|
78
|
-
export function getConfigs(): Record<string, CommandConfig> {
|
|
79
|
-
return configs;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export function setConfigs(newConfigs: Record<string, CommandConfig>): void {
|
|
83
|
-
configs = newConfigs;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export function getPluginConfig(): Subtask2Config {
|
|
87
|
-
return pluginConfig;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export function setPluginConfig(newConfig: Subtask2Config): void {
|
|
91
|
-
pluginConfig = newConfig;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// ============================================================================
|
|
95
|
-
// Client
|
|
96
|
-
// ============================================================================
|
|
97
|
-
|
|
98
|
-
export function getClient(): any {
|
|
99
|
-
return client;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export function setClient(newClient: any): void {
|
|
103
|
-
client = newClient;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// ============================================================================
|
|
107
|
-
// Call State
|
|
108
|
-
// ============================================================================
|
|
109
|
-
|
|
110
|
-
export function getCallState(callID: string): string | undefined {
|
|
111
|
-
return callState.get(callID);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export function setCallState(callID: string, cmd: string): void {
|
|
115
|
-
callState.set(callID, cmd);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
export function deleteCallState(callID: string): void {
|
|
119
|
-
callState.delete(callID);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// ============================================================================
|
|
123
|
-
// Return State
|
|
124
|
-
// ============================================================================
|
|
125
|
-
|
|
126
|
-
export function getReturnState(sessionID: string): string[] | undefined {
|
|
127
|
-
return returnState.get(sessionID);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export function setReturnState(sessionID: string, returns: string[]): void {
|
|
131
|
-
returnState.set(sessionID, returns);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
export function hasReturnState(sessionID: string): boolean {
|
|
135
|
-
return returnState.has(sessionID);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
export function deleteReturnState(sessionID: string): void {
|
|
139
|
-
returnState.delete(sessionID);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// ============================================================================
|
|
143
|
-
// Return Stack (for nested returns)
|
|
144
|
-
// ============================================================================
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Push a new return chain onto the stack.
|
|
148
|
-
* Used when an inline subtask has its own returns.
|
|
149
|
-
*/
|
|
150
|
-
export function pushReturnStack(sessionID: string, returns: string[]): void {
|
|
151
|
-
if (!returnStack.has(sessionID)) {
|
|
152
|
-
returnStack.set(sessionID, []);
|
|
153
|
-
}
|
|
154
|
-
returnStack.get(sessionID)!.push(returns);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Get the current (top) return chain from the stack.
|
|
159
|
-
* Returns undefined if stack is empty.
|
|
160
|
-
*/
|
|
161
|
-
export function peekReturnStack(sessionID: string): string[] | undefined {
|
|
162
|
-
const stack = returnStack.get(sessionID);
|
|
163
|
-
if (!stack || stack.length === 0) return undefined;
|
|
164
|
-
return stack[stack.length - 1];
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Pop the current return chain from the stack (when it's exhausted).
|
|
169
|
-
*/
|
|
170
|
-
export function popReturnStack(sessionID: string): void {
|
|
171
|
-
const stack = returnStack.get(sessionID);
|
|
172
|
-
if (stack && stack.length > 0) {
|
|
173
|
-
stack.pop();
|
|
174
|
-
if (stack.length === 0) {
|
|
175
|
-
returnStack.delete(sessionID);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* Check if there are any return chains on the stack.
|
|
182
|
-
*/
|
|
183
|
-
export function hasReturnStack(sessionID: string): boolean {
|
|
184
|
-
const stack = returnStack.get(sessionID);
|
|
185
|
-
return stack !== undefined && stack.length > 0;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Get the entire current return chain from the stack (the top chain).
|
|
190
|
-
* Returns undefined if stack is empty.
|
|
191
|
-
* This is used to transfer stacked returns to returnState.
|
|
192
|
-
*/
|
|
193
|
-
export function getCurrentReturnChain(sessionID: string): string[] | undefined {
|
|
194
|
-
const stack = returnStack.get(sessionID);
|
|
195
|
-
if (!stack || stack.length === 0) return undefined;
|
|
196
|
-
return stack[stack.length - 1];
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Remove the current return chain from the stack (pop it).
|
|
201
|
-
* Call this after transferring the chain to returnState.
|
|
202
|
-
*/
|
|
203
|
-
export function popCurrentReturnChain(sessionID: string): void {
|
|
204
|
-
const stack = returnStack.get(sessionID);
|
|
205
|
-
if (stack && stack.length > 0) {
|
|
206
|
-
stack.pop();
|
|
207
|
-
if (stack.length === 0) {
|
|
208
|
-
returnStack.delete(sessionID);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Shift the next return item from the current chain.
|
|
215
|
-
* If chain becomes empty, pops it from the stack.
|
|
216
|
-
* Returns undefined if no returns left.
|
|
217
|
-
*/
|
|
218
|
-
export function shiftReturnStack(sessionID: string): string | undefined {
|
|
219
|
-
const stack = returnStack.get(sessionID);
|
|
220
|
-
if (!stack || stack.length === 0) return undefined;
|
|
221
|
-
|
|
222
|
-
const currentChain = stack[stack.length - 1];
|
|
223
|
-
if (!currentChain || currentChain.length === 0) {
|
|
224
|
-
stack.pop();
|
|
225
|
-
if (stack.length === 0) {
|
|
226
|
-
returnStack.delete(sessionID);
|
|
227
|
-
}
|
|
228
|
-
return undefined;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const next = currentChain.shift();
|
|
232
|
-
|
|
233
|
-
// If chain is now empty, pop it
|
|
234
|
-
if (currentChain.length === 0) {
|
|
235
|
-
stack.pop();
|
|
236
|
-
if (stack.length === 0) {
|
|
237
|
-
returnStack.delete(sessionID);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
return next;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* Clear all return stacks for a session.
|
|
246
|
-
*/
|
|
247
|
-
export function clearReturnStack(sessionID: string): void {
|
|
248
|
-
returnStack.delete(sessionID);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// ============================================================================
|
|
252
|
-
// Pending Returns
|
|
253
|
-
// ============================================================================
|
|
254
|
-
|
|
255
|
-
export function getPendingReturn(sessionID: string): string | undefined {
|
|
256
|
-
return pendingReturns.get(sessionID);
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
export function setPendingReturn(
|
|
260
|
-
sessionID: string,
|
|
261
|
-
returnPrompt: string
|
|
262
|
-
): void {
|
|
263
|
-
pendingReturns.set(sessionID, returnPrompt);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
export function hasPendingReturn(sessionID: string): boolean {
|
|
267
|
-
return pendingReturns.has(sessionID);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
export function deletePendingReturn(sessionID: string): void {
|
|
271
|
-
pendingReturns.delete(sessionID);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
export function getAllPendingReturns(): IterableIterator<[string, string]> {
|
|
275
|
-
return pendingReturns.entries();
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
// ============================================================================
|
|
279
|
-
// Pending Non-Subtask Returns
|
|
280
|
-
// ============================================================================
|
|
281
|
-
|
|
282
|
-
export function getPendingNonSubtaskReturns(
|
|
283
|
-
sessionID: string
|
|
284
|
-
): string[] | undefined {
|
|
285
|
-
return pendingNonSubtaskReturns.get(sessionID);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
export function setPendingNonSubtaskReturns(
|
|
289
|
-
sessionID: string,
|
|
290
|
-
returns: string[]
|
|
291
|
-
): void {
|
|
292
|
-
pendingNonSubtaskReturns.set(sessionID, returns);
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
export function deletePendingNonSubtaskReturns(sessionID: string): void {
|
|
296
|
-
pendingNonSubtaskReturns.delete(sessionID);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
// ============================================================================
|
|
300
|
-
// Piped Args Queue
|
|
301
|
-
// ============================================================================
|
|
302
|
-
|
|
303
|
-
export function getPipedArgsQueue(sessionID: string): string[] | undefined {
|
|
304
|
-
return pipedArgsQueue.get(sessionID);
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
export function setPipedArgsQueue(sessionID: string, args: string[]): void {
|
|
308
|
-
pipedArgsQueue.set(sessionID, args);
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
export function deletePipedArgsQueue(sessionID: string): void {
|
|
312
|
-
pipedArgsQueue.delete(sessionID);
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
export function getReturnArgsState(sessionID: string): string[] | undefined {
|
|
316
|
-
return returnArgsState.get(sessionID);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
export function deleteReturnArgsState(sessionID: string): void {
|
|
320
|
-
returnArgsState.delete(sessionID);
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
// ============================================================================
|
|
324
|
-
// Session Main Command
|
|
325
|
-
// ============================================================================
|
|
326
|
-
|
|
327
|
-
export function getSessionMainCommand(sessionID: string): string | undefined {
|
|
328
|
-
return sessionMainCommand.get(sessionID);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
export function setSessionMainCommand(sessionID: string, cmd: string): void {
|
|
332
|
-
sessionMainCommand.set(sessionID, cmd);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
// ============================================================================
|
|
336
|
-
// Processed S2 Messages
|
|
337
|
-
// ============================================================================
|
|
338
|
-
|
|
339
|
-
export function hasProcessedS2Message(msgId: string): boolean {
|
|
340
|
-
return processedS2Messages.has(msgId);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
export function addProcessedS2Message(msgId: string): void {
|
|
344
|
-
processedS2Messages.add(msgId);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
// ============================================================================
|
|
348
|
-
// Executed Returns
|
|
349
|
-
// ============================================================================
|
|
350
|
-
|
|
351
|
-
export function hasExecutedReturn(key: string): boolean {
|
|
352
|
-
return executedReturns.has(key);
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
export function addExecutedReturn(key: string): void {
|
|
356
|
-
executedReturns.add(key);
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
export function deleteExecutedReturn(key: string): void {
|
|
360
|
-
executedReturns.delete(key);
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
// ============================================================================
|
|
364
|
-
// First Return Prompt
|
|
365
|
-
// ============================================================================
|
|
366
|
-
|
|
367
|
-
export function getFirstReturnPrompt(sessionID: string): string | undefined {
|
|
368
|
-
return firstReturnPrompt.get(sessionID);
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
export function setFirstReturnPrompt(sessionID: string, prompt: string): void {
|
|
372
|
-
firstReturnPrompt.set(sessionID, prompt);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
// ============================================================================
|
|
376
|
-
// Subtask Parent Session
|
|
377
|
-
// ============================================================================
|
|
378
|
-
|
|
379
|
-
export function getSubtaskParentSession(sessionID: string): string | undefined {
|
|
380
|
-
return subtaskParentSession.get(sessionID);
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
export function setSubtaskParentSession(
|
|
384
|
-
sessionID: string,
|
|
385
|
-
parentID: string
|
|
386
|
-
): void {
|
|
387
|
-
subtaskParentSession.set(sessionID, parentID);
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
export function deleteSubtaskParentSession(sessionID: string): void {
|
|
391
|
-
subtaskParentSession.delete(sessionID);
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
// ============================================================================
|
|
395
|
-
// Pending Model Override
|
|
396
|
-
// ============================================================================
|
|
397
|
-
|
|
398
|
-
export function getPendingModelOverride(sessionID: string): string | undefined {
|
|
399
|
-
return pendingModelOverride.get(sessionID);
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
export function setPendingModelOverride(
|
|
403
|
-
sessionID: string,
|
|
404
|
-
model: string
|
|
405
|
-
): void {
|
|
406
|
-
pendingModelOverride.set(sessionID, model);
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
export function deletePendingModelOverride(sessionID: string): void {
|
|
410
|
-
pendingModelOverride.delete(sessionID);
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
export function getPendingAgentOverride(sessionID: string): string | undefined {
|
|
414
|
-
return pendingAgentOverride.get(sessionID);
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
export function setPendingAgentOverride(
|
|
418
|
-
sessionID: string,
|
|
419
|
-
agent: string
|
|
420
|
-
): void {
|
|
421
|
-
pendingAgentOverride.set(sessionID, agent);
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
export function deletePendingAgentOverride(sessionID: string): void {
|
|
425
|
-
pendingAgentOverride.delete(sessionID);
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
// ============================================================================
|
|
429
|
-
// Deferred Return Prompt (used for loops)
|
|
430
|
-
// ============================================================================
|
|
431
|
-
|
|
432
|
-
export function getDeferredReturnPrompt(sessionID: string): string | undefined {
|
|
433
|
-
return deferredReturnPrompt.get(sessionID);
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
export function setDeferredReturnPrompt(
|
|
437
|
-
sessionID: string,
|
|
438
|
-
prompt: string
|
|
439
|
-
): void {
|
|
440
|
-
if (!deferredReturnPrompt.has(sessionID)) {
|
|
441
|
-
deferredReturnPrompt.set(sessionID, prompt);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
export function consumeDeferredReturnPrompt(
|
|
446
|
-
sessionID: string
|
|
447
|
-
): string | undefined {
|
|
448
|
-
const prompt = deferredReturnPrompt.get(sessionID);
|
|
449
|
-
if (prompt) {
|
|
450
|
-
deferredReturnPrompt.delete(sessionID);
|
|
451
|
-
}
|
|
452
|
-
return prompt;
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
// ============================================================================
|
|
456
|
-
// Last Return Type Tracking
|
|
457
|
-
// ============================================================================
|
|
458
|
-
|
|
459
|
-
/**
|
|
460
|
-
* Set the type of the last executed return for a session.
|
|
461
|
-
* Used to determine if a prompt return should be deferred to message-hooks
|
|
462
|
-
* or executed directly (when following an inline subtask).
|
|
463
|
-
*/
|
|
464
|
-
export function setLastReturnType(
|
|
465
|
-
sessionID: string,
|
|
466
|
-
type: "inline_subtask" | "command" | "prompt"
|
|
467
|
-
): void {
|
|
468
|
-
lastReturnType.set(sessionID, type);
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
/**
|
|
472
|
-
* Get the type of the last executed return for a session.
|
|
473
|
-
*/
|
|
474
|
-
export function getLastReturnType(
|
|
475
|
-
sessionID: string
|
|
476
|
-
): "inline_subtask" | "command" | "prompt" | undefined {
|
|
477
|
-
return lastReturnType.get(sessionID);
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
/**
|
|
481
|
-
* Clear the last return type for a session.
|
|
482
|
-
*/
|
|
483
|
-
export function clearLastReturnType(sessionID: string): void {
|
|
484
|
-
lastReturnType.delete(sessionID);
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
// ============================================================================
|
|
488
|
-
// Pending Stacked Prompt Response
|
|
489
|
-
// ============================================================================
|
|
490
|
-
|
|
491
|
-
/**
|
|
492
|
-
* Mark that a session just had a stacked return PROMPT substituted.
|
|
493
|
-
* session.idle should skip returnState processing until LLM responds.
|
|
494
|
-
*/
|
|
495
|
-
export function setPendingStackedPromptResponse(sessionID: string): void {
|
|
496
|
-
pendingStackedPromptResponse.add(sessionID);
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
/**
|
|
500
|
-
* Check if a session is waiting for LLM response to a stacked prompt.
|
|
501
|
-
*/
|
|
502
|
-
export function hasPendingStackedPromptResponse(sessionID: string): boolean {
|
|
503
|
-
return pendingStackedPromptResponse.has(sessionID);
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
/**
|
|
507
|
-
* Clear the pending stacked prompt response flag.
|
|
508
|
-
* Called when session.idle fires after the LLM has responded.
|
|
509
|
-
*/
|
|
510
|
-
export function clearPendingStackedPromptResponse(sessionID: string): void {
|
|
511
|
-
pendingStackedPromptResponse.delete(sessionID);
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
// ============================================================================
|
|
515
|
-
// Pending Prompt Return (deferred to message-hooks.ts for substitution)
|
|
516
|
-
// ============================================================================
|
|
517
|
-
|
|
518
|
-
/**
|
|
519
|
-
* Set a pending prompt return to be substituted in message-hooks.ts.
|
|
520
|
-
* Called by session.idle when processing a prompt return.
|
|
521
|
-
*/
|
|
522
|
-
export function setPendingPromptReturn(
|
|
523
|
-
sessionID: string,
|
|
524
|
-
prompt: string
|
|
525
|
-
): void {
|
|
526
|
-
pendingPromptReturn.set(sessionID, prompt);
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
/**
|
|
530
|
-
* Get and clear the pending prompt return for a session.
|
|
531
|
-
* Called by message-hooks.ts during transform to substitute the generic message.
|
|
532
|
-
*/
|
|
533
|
-
export function consumePendingPromptReturn(
|
|
534
|
-
sessionID: string
|
|
535
|
-
): string | undefined {
|
|
536
|
-
const prompt = pendingPromptReturn.get(sessionID);
|
|
537
|
-
if (prompt) {
|
|
538
|
-
pendingPromptReturn.delete(sessionID);
|
|
539
|
-
}
|
|
540
|
-
return prompt;
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
export function clearPendingPromptReturn(sessionID: string): void {
|
|
544
|
-
pendingPromptReturn.delete(sessionID);
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
/**
|
|
548
|
-
* Check if there's a pending prompt return for substitution.
|
|
549
|
-
*/
|
|
550
|
-
export function hasPendingPromptReturn(sessionID: string): boolean {
|
|
551
|
-
return pendingPromptReturn.has(sessionID);
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
// ============================================================================
|
|
555
|
-
// Pending Parent Session (keyed by prompt for race safety)
|
|
556
|
-
// ============================================================================
|
|
557
|
-
|
|
558
|
-
/**
|
|
559
|
-
* Register a parent session for a subtask prompt.
|
|
560
|
-
* Called in command.execute.before after all prompt modifications.
|
|
561
|
-
*/
|
|
562
|
-
export function registerPendingParentForPrompt(
|
|
563
|
-
prompt: string,
|
|
564
|
-
parentSessionID: string
|
|
565
|
-
): void {
|
|
566
|
-
pendingParentByPrompt.set(prompt, parentSessionID);
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
/**
|
|
570
|
-
* Look up and consume the parent session for a subtask prompt.
|
|
571
|
-
* Called in tool.execute.before to map subtask -> parent.
|
|
572
|
-
*/
|
|
573
|
-
export function consumePendingParentForPrompt(prompt: string): string | null {
|
|
574
|
-
const parentSession = pendingParentByPrompt.get(prompt);
|
|
575
|
-
if (parentSession) {
|
|
576
|
-
pendingParentByPrompt.delete(prompt);
|
|
577
|
-
}
|
|
578
|
-
return parentSession ?? null;
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
// ============================================================================
|
|
582
|
-
// Has Active Subtask
|
|
583
|
-
// ============================================================================
|
|
584
|
-
|
|
585
|
-
export function getHasActiveSubtask(): boolean {
|
|
586
|
-
return hasActiveSubtask;
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
export function setHasActiveSubtask(value: boolean): void {
|
|
590
|
-
hasActiveSubtask = value;
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
// ============================================================================
|
|
594
|
-
// Named Subtask Results ($RESULT[name])
|
|
595
|
-
// ============================================================================
|
|
596
|
-
|
|
597
|
-
/**
|
|
598
|
-
* Register a pending main session capture.
|
|
599
|
-
* Called when a non-subtask command with `as:` is executed.
|
|
600
|
-
* The next LLM turn will be captured under this name.
|
|
601
|
-
*/
|
|
602
|
-
export function registerPendingMainSessionCapture(
|
|
603
|
-
sessionID: string,
|
|
604
|
-
name: string
|
|
605
|
-
): void {
|
|
606
|
-
pendingMainSessionCapture.set(sessionID, name);
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
/**
|
|
610
|
-
* Consume a pending main session capture.
|
|
611
|
-
* Returns the name to capture under, or undefined if none pending.
|
|
612
|
-
*/
|
|
613
|
-
export function consumePendingMainSessionCapture(
|
|
614
|
-
sessionID: string
|
|
615
|
-
): string | undefined {
|
|
616
|
-
const name = pendingMainSessionCapture.get(sessionID);
|
|
617
|
-
if (name) {
|
|
618
|
-
pendingMainSessionCapture.delete(sessionID);
|
|
619
|
-
}
|
|
620
|
-
return name;
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
/**
|
|
624
|
-
* Register a pending result capture by prompt content.
|
|
625
|
-
* Called when spawning a subtask with `as:` name (before we know the session ID).
|
|
626
|
-
* NOTE: We keep this until session.idle matches the prompt, since tool.after
|
|
627
|
-
* doesn't have access to inline subtask output.
|
|
628
|
-
*/
|
|
629
|
-
export function registerPendingResultCaptureByPrompt(
|
|
630
|
-
prompt: string,
|
|
631
|
-
parentSessionID: string,
|
|
632
|
-
name: string
|
|
633
|
-
): void {
|
|
634
|
-
pendingResultCaptureByPrompt.set(prompt, { parentSessionID, name });
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
/**
|
|
638
|
-
* Consume a pending result capture by prompt content.
|
|
639
|
-
* Called when tool.execute.before fires and we know the subtask session ID.
|
|
640
|
-
*/
|
|
641
|
-
export function consumePendingResultCaptureByPrompt(
|
|
642
|
-
prompt: string
|
|
643
|
-
): { parentSessionID: string; name: string } | undefined {
|
|
644
|
-
const entry = pendingResultCaptureByPrompt.get(prompt);
|
|
645
|
-
if (entry) {
|
|
646
|
-
pendingResultCaptureByPrompt.delete(prompt);
|
|
647
|
-
}
|
|
648
|
-
return entry;
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
/**
|
|
652
|
-
* Check if a prompt has a pending result capture (without consuming).
|
|
653
|
-
* Used in session.idle to match subtask sessions by prompt content.
|
|
654
|
-
*/
|
|
655
|
-
export function getPendingResultCaptureByPrompt(
|
|
656
|
-
prompt: string
|
|
657
|
-
): { parentSessionID: string; name: string } | undefined {
|
|
658
|
-
return pendingResultCaptureByPrompt.get(prompt);
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
/**
|
|
662
|
-
* Delete a pending result capture by prompt (after capturing in session.idle).
|
|
663
|
-
*/
|
|
664
|
-
export function deletePendingResultCaptureByPrompt(prompt: string): void {
|
|
665
|
-
pendingResultCaptureByPrompt.delete(prompt);
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
/**
|
|
669
|
-
* Register a pending result capture by subtask session ID.
|
|
670
|
-
* Called when spawning a subtask with `as:` name.
|
|
671
|
-
*/
|
|
672
|
-
export function registerPendingResultCapture(
|
|
673
|
-
subtaskSessionID: string,
|
|
674
|
-
parentSessionID: string,
|
|
675
|
-
name: string
|
|
676
|
-
): void {
|
|
677
|
-
pendingResultCapture.set(subtaskSessionID, { parentSessionID, name });
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
/**
|
|
681
|
-
* Check if a subtask session has a pending result capture.
|
|
682
|
-
*/
|
|
683
|
-
export function getPendingResultCapture(
|
|
684
|
-
subtaskSessionID: string
|
|
685
|
-
): { parentSessionID: string; name: string } | undefined {
|
|
686
|
-
return pendingResultCapture.get(subtaskSessionID);
|
|
687
|
-
}
|
|
688
|
-
|
|
689
|
-
/**
|
|
690
|
-
* Consume and store a subtask result.
|
|
691
|
-
* Called when subtask completes - stores result and removes pending entry.
|
|
692
|
-
*/
|
|
693
|
-
export function captureSubtaskResult(
|
|
694
|
-
subtaskSessionID: string,
|
|
695
|
-
result: string
|
|
696
|
-
): void {
|
|
697
|
-
const pending = pendingResultCapture.get(subtaskSessionID);
|
|
698
|
-
if (!pending) return;
|
|
699
|
-
|
|
700
|
-
const { parentSessionID, name } = pending;
|
|
701
|
-
|
|
702
|
-
if (!subtaskResults.has(parentSessionID)) {
|
|
703
|
-
subtaskResults.set(parentSessionID, new Map());
|
|
704
|
-
}
|
|
705
|
-
subtaskResults.get(parentSessionID)!.set(name, result);
|
|
706
|
-
|
|
707
|
-
pendingResultCapture.delete(subtaskSessionID);
|
|
708
|
-
}
|
|
709
|
-
|
|
710
|
-
/**
|
|
711
|
-
* Store a named result directly for a session (used for main session captures).
|
|
712
|
-
*/
|
|
713
|
-
export function storeSubtaskResult(
|
|
714
|
-
sessionID: string,
|
|
715
|
-
name: string,
|
|
716
|
-
result: string
|
|
717
|
-
): void {
|
|
718
|
-
if (!subtaskResults.has(sessionID)) {
|
|
719
|
-
subtaskResults.set(sessionID, new Map());
|
|
720
|
-
}
|
|
721
|
-
subtaskResults.get(sessionID)!.set(name, result);
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
/**
|
|
725
|
-
* Get a named result for a session.
|
|
726
|
-
*/
|
|
727
|
-
export function getSubtaskResult(
|
|
728
|
-
sessionID: string,
|
|
729
|
-
name: string
|
|
730
|
-
): string | undefined {
|
|
731
|
-
return subtaskResults.get(sessionID)?.get(name);
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
/**
|
|
735
|
-
* Get all named results for a session.
|
|
736
|
-
*/
|
|
737
|
-
export function getAllSubtaskResults(
|
|
738
|
-
sessionID: string
|
|
739
|
-
): Map<string, string> | undefined {
|
|
740
|
-
return subtaskResults.get(sessionID);
|
|
741
|
-
}
|
|
742
|
-
|
|
743
|
-
/**
|
|
744
|
-
* Resolve $RESULT[name] references in a string.
|
|
745
|
-
*/
|
|
746
|
-
export function resolveResultReferences(
|
|
747
|
-
text: string,
|
|
748
|
-
sessionID: string
|
|
749
|
-
): string {
|
|
750
|
-
const results = subtaskResults.get(sessionID);
|
|
751
|
-
if (!results || results.size === 0) return text;
|
|
752
|
-
|
|
753
|
-
return text.replace(/\$RESULT\[([^\]]+)\]/g, (match, name) => {
|
|
754
|
-
const result = results.get(name);
|
|
755
|
-
return result ?? match; // Keep original if not found
|
|
756
|
-
});
|
|
757
|
-
}
|
|
758
|
-
|
|
759
|
-
/**
|
|
760
|
-
* Clear all results for a session (cleanup).
|
|
761
|
-
*/
|
|
762
|
-
export function clearSubtaskResults(sessionID: string): void {
|
|
763
|
-
subtaskResults.delete(sessionID);
|
|
764
|
-
}
|
|
1
|
+
import type { CommandConfig, Subtask2Config } from "../types";
|
|
2
|
+
import type { LoopState } from "../loop";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Centralized session state management for subtask2 plugin
|
|
6
|
+
* All plugin state is managed through this module
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
// Command configurations loaded from manifest
|
|
10
|
+
let configs: Record<string, CommandConfig> = {};
|
|
11
|
+
|
|
12
|
+
// Plugin user configuration
|
|
13
|
+
let pluginConfig: Subtask2Config = { replace_generic: true };
|
|
14
|
+
|
|
15
|
+
// OpenCode client instance (v1 SDK with internal HTTP client)
|
|
16
|
+
let client: any = null;
|
|
17
|
+
|
|
18
|
+
// Session state maps
|
|
19
|
+
const callState = new Map<string, string>();
|
|
20
|
+
const returnState = new Map<string, string[]>();
|
|
21
|
+
const returnStack = new Map<string, string[][]>(); // Stack of return chains for nested returns
|
|
22
|
+
const pendingReturns = new Map<string, string>();
|
|
23
|
+
const pendingNonSubtaskReturns = new Map<string, string[]>();
|
|
24
|
+
const pipedArgsQueue = new Map<string, string[]>();
|
|
25
|
+
const returnArgsState = pipedArgsQueue; // alias for backward compat
|
|
26
|
+
const sessionMainCommand = new Map<string, string>();
|
|
27
|
+
const processedS2Messages = new Set<string>();
|
|
28
|
+
const executedReturns = new Set<string>();
|
|
29
|
+
const firstReturnPrompt = new Map<string, string>();
|
|
30
|
+
const subtaskParentSession = new Map<string, string>();
|
|
31
|
+
const pendingModelOverride = new Map<string, string>();
|
|
32
|
+
const pendingAgentOverride = new Map<string, string>();
|
|
33
|
+
const deferredReturnPrompt = new Map<string, string>();
|
|
34
|
+
// Track sessions that just had a stacked return prompt substituted
|
|
35
|
+
// session.idle should skip returnState processing until LLM responds
|
|
36
|
+
const pendingStackedPromptResponse = new Set<string>();
|
|
37
|
+
// Track the type of the last executed return to handle prompt returns correctly
|
|
38
|
+
// after inline subtasks (which don't inject "Summarize..." message)
|
|
39
|
+
const lastReturnType = new Map<
|
|
40
|
+
string,
|
|
41
|
+
"inline_subtask" | "command" | "prompt"
|
|
42
|
+
>();
|
|
43
|
+
|
|
44
|
+
// Pending prompt return to be substituted in message-hooks.ts
|
|
45
|
+
// session.idle sets this, message-hooks consumes it during transform
|
|
46
|
+
const pendingPromptReturn = new Map<string, string>();
|
|
47
|
+
|
|
48
|
+
// Named subtask results storage: parentSessionID -> Map<name, result>
|
|
49
|
+
const subtaskResults = new Map<string, Map<string, string>>();
|
|
50
|
+
|
|
51
|
+
// Pending `as:` names for subtasks: subtaskSessionID -> {parentSessionID, name}
|
|
52
|
+
const pendingResultCapture = new Map<
|
|
53
|
+
string,
|
|
54
|
+
{ parentSessionID: string; name: string }
|
|
55
|
+
>();
|
|
56
|
+
|
|
57
|
+
// Pending `as:` by prompt content (race-safe, like pendingParentForPrompt)
|
|
58
|
+
const pendingResultCaptureByPrompt = new Map<
|
|
59
|
+
string,
|
|
60
|
+
{ parentSessionID: string; name: string }
|
|
61
|
+
>();
|
|
62
|
+
|
|
63
|
+
// Pending main session result capture (for non-subtask commands with as:)
|
|
64
|
+
const pendingMainSessionCapture = new Map<string, string>();
|
|
65
|
+
|
|
66
|
+
// Pending parent sessions keyed by prompt content (for race-safe session mapping)
|
|
67
|
+
const pendingParentByPrompt = new Map<string, string>();
|
|
68
|
+
let hasActiveSubtask = false;
|
|
69
|
+
|
|
70
|
+
// Constants
|
|
71
|
+
export const OPENCODE_GENERIC =
|
|
72
|
+
"Summarize the task tool output above and continue with your task.";
|
|
73
|
+
|
|
74
|
+
// ============================================================================
|
|
75
|
+
// Configs
|
|
76
|
+
// ============================================================================
|
|
77
|
+
|
|
78
|
+
export function getConfigs(): Record<string, CommandConfig> {
|
|
79
|
+
return configs;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function setConfigs(newConfigs: Record<string, CommandConfig>): void {
|
|
83
|
+
configs = newConfigs;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function getPluginConfig(): Subtask2Config {
|
|
87
|
+
return pluginConfig;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function setPluginConfig(newConfig: Subtask2Config): void {
|
|
91
|
+
pluginConfig = newConfig;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ============================================================================
|
|
95
|
+
// Client
|
|
96
|
+
// ============================================================================
|
|
97
|
+
|
|
98
|
+
export function getClient(): any {
|
|
99
|
+
return client;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function setClient(newClient: any): void {
|
|
103
|
+
client = newClient;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// ============================================================================
|
|
107
|
+
// Call State
|
|
108
|
+
// ============================================================================
|
|
109
|
+
|
|
110
|
+
export function getCallState(callID: string): string | undefined {
|
|
111
|
+
return callState.get(callID);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function setCallState(callID: string, cmd: string): void {
|
|
115
|
+
callState.set(callID, cmd);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function deleteCallState(callID: string): void {
|
|
119
|
+
callState.delete(callID);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// ============================================================================
|
|
123
|
+
// Return State
|
|
124
|
+
// ============================================================================
|
|
125
|
+
|
|
126
|
+
export function getReturnState(sessionID: string): string[] | undefined {
|
|
127
|
+
return returnState.get(sessionID);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function setReturnState(sessionID: string, returns: string[]): void {
|
|
131
|
+
returnState.set(sessionID, returns);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function hasReturnState(sessionID: string): boolean {
|
|
135
|
+
return returnState.has(sessionID);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function deleteReturnState(sessionID: string): void {
|
|
139
|
+
returnState.delete(sessionID);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// ============================================================================
|
|
143
|
+
// Return Stack (for nested returns)
|
|
144
|
+
// ============================================================================
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Push a new return chain onto the stack.
|
|
148
|
+
* Used when an inline subtask has its own returns.
|
|
149
|
+
*/
|
|
150
|
+
export function pushReturnStack(sessionID: string, returns: string[]): void {
|
|
151
|
+
if (!returnStack.has(sessionID)) {
|
|
152
|
+
returnStack.set(sessionID, []);
|
|
153
|
+
}
|
|
154
|
+
returnStack.get(sessionID)!.push(returns);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Get the current (top) return chain from the stack.
|
|
159
|
+
* Returns undefined if stack is empty.
|
|
160
|
+
*/
|
|
161
|
+
export function peekReturnStack(sessionID: string): string[] | undefined {
|
|
162
|
+
const stack = returnStack.get(sessionID);
|
|
163
|
+
if (!stack || stack.length === 0) return undefined;
|
|
164
|
+
return stack[stack.length - 1];
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Pop the current return chain from the stack (when it's exhausted).
|
|
169
|
+
*/
|
|
170
|
+
export function popReturnStack(sessionID: string): void {
|
|
171
|
+
const stack = returnStack.get(sessionID);
|
|
172
|
+
if (stack && stack.length > 0) {
|
|
173
|
+
stack.pop();
|
|
174
|
+
if (stack.length === 0) {
|
|
175
|
+
returnStack.delete(sessionID);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Check if there are any return chains on the stack.
|
|
182
|
+
*/
|
|
183
|
+
export function hasReturnStack(sessionID: string): boolean {
|
|
184
|
+
const stack = returnStack.get(sessionID);
|
|
185
|
+
return stack !== undefined && stack.length > 0;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Get the entire current return chain from the stack (the top chain).
|
|
190
|
+
* Returns undefined if stack is empty.
|
|
191
|
+
* This is used to transfer stacked returns to returnState.
|
|
192
|
+
*/
|
|
193
|
+
export function getCurrentReturnChain(sessionID: string): string[] | undefined {
|
|
194
|
+
const stack = returnStack.get(sessionID);
|
|
195
|
+
if (!stack || stack.length === 0) return undefined;
|
|
196
|
+
return stack[stack.length - 1];
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Remove the current return chain from the stack (pop it).
|
|
201
|
+
* Call this after transferring the chain to returnState.
|
|
202
|
+
*/
|
|
203
|
+
export function popCurrentReturnChain(sessionID: string): void {
|
|
204
|
+
const stack = returnStack.get(sessionID);
|
|
205
|
+
if (stack && stack.length > 0) {
|
|
206
|
+
stack.pop();
|
|
207
|
+
if (stack.length === 0) {
|
|
208
|
+
returnStack.delete(sessionID);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Shift the next return item from the current chain.
|
|
215
|
+
* If chain becomes empty, pops it from the stack.
|
|
216
|
+
* Returns undefined if no returns left.
|
|
217
|
+
*/
|
|
218
|
+
export function shiftReturnStack(sessionID: string): string | undefined {
|
|
219
|
+
const stack = returnStack.get(sessionID);
|
|
220
|
+
if (!stack || stack.length === 0) return undefined;
|
|
221
|
+
|
|
222
|
+
const currentChain = stack[stack.length - 1];
|
|
223
|
+
if (!currentChain || currentChain.length === 0) {
|
|
224
|
+
stack.pop();
|
|
225
|
+
if (stack.length === 0) {
|
|
226
|
+
returnStack.delete(sessionID);
|
|
227
|
+
}
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const next = currentChain.shift();
|
|
232
|
+
|
|
233
|
+
// If chain is now empty, pop it
|
|
234
|
+
if (currentChain.length === 0) {
|
|
235
|
+
stack.pop();
|
|
236
|
+
if (stack.length === 0) {
|
|
237
|
+
returnStack.delete(sessionID);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return next;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Clear all return stacks for a session.
|
|
246
|
+
*/
|
|
247
|
+
export function clearReturnStack(sessionID: string): void {
|
|
248
|
+
returnStack.delete(sessionID);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// ============================================================================
|
|
252
|
+
// Pending Returns
|
|
253
|
+
// ============================================================================
|
|
254
|
+
|
|
255
|
+
export function getPendingReturn(sessionID: string): string | undefined {
|
|
256
|
+
return pendingReturns.get(sessionID);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export function setPendingReturn(
|
|
260
|
+
sessionID: string,
|
|
261
|
+
returnPrompt: string
|
|
262
|
+
): void {
|
|
263
|
+
pendingReturns.set(sessionID, returnPrompt);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
export function hasPendingReturn(sessionID: string): boolean {
|
|
267
|
+
return pendingReturns.has(sessionID);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export function deletePendingReturn(sessionID: string): void {
|
|
271
|
+
pendingReturns.delete(sessionID);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export function getAllPendingReturns(): IterableIterator<[string, string]> {
|
|
275
|
+
return pendingReturns.entries();
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// ============================================================================
|
|
279
|
+
// Pending Non-Subtask Returns
|
|
280
|
+
// ============================================================================
|
|
281
|
+
|
|
282
|
+
export function getPendingNonSubtaskReturns(
|
|
283
|
+
sessionID: string
|
|
284
|
+
): string[] | undefined {
|
|
285
|
+
return pendingNonSubtaskReturns.get(sessionID);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export function setPendingNonSubtaskReturns(
|
|
289
|
+
sessionID: string,
|
|
290
|
+
returns: string[]
|
|
291
|
+
): void {
|
|
292
|
+
pendingNonSubtaskReturns.set(sessionID, returns);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
export function deletePendingNonSubtaskReturns(sessionID: string): void {
|
|
296
|
+
pendingNonSubtaskReturns.delete(sessionID);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// ============================================================================
|
|
300
|
+
// Piped Args Queue
|
|
301
|
+
// ============================================================================
|
|
302
|
+
|
|
303
|
+
export function getPipedArgsQueue(sessionID: string): string[] | undefined {
|
|
304
|
+
return pipedArgsQueue.get(sessionID);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export function setPipedArgsQueue(sessionID: string, args: string[]): void {
|
|
308
|
+
pipedArgsQueue.set(sessionID, args);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
export function deletePipedArgsQueue(sessionID: string): void {
|
|
312
|
+
pipedArgsQueue.delete(sessionID);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
export function getReturnArgsState(sessionID: string): string[] | undefined {
|
|
316
|
+
return returnArgsState.get(sessionID);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
export function deleteReturnArgsState(sessionID: string): void {
|
|
320
|
+
returnArgsState.delete(sessionID);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// ============================================================================
|
|
324
|
+
// Session Main Command
|
|
325
|
+
// ============================================================================
|
|
326
|
+
|
|
327
|
+
export function getSessionMainCommand(sessionID: string): string | undefined {
|
|
328
|
+
return sessionMainCommand.get(sessionID);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export function setSessionMainCommand(sessionID: string, cmd: string): void {
|
|
332
|
+
sessionMainCommand.set(sessionID, cmd);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// ============================================================================
|
|
336
|
+
// Processed S2 Messages
|
|
337
|
+
// ============================================================================
|
|
338
|
+
|
|
339
|
+
export function hasProcessedS2Message(msgId: string): boolean {
|
|
340
|
+
return processedS2Messages.has(msgId);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
export function addProcessedS2Message(msgId: string): void {
|
|
344
|
+
processedS2Messages.add(msgId);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// ============================================================================
|
|
348
|
+
// Executed Returns
|
|
349
|
+
// ============================================================================
|
|
350
|
+
|
|
351
|
+
export function hasExecutedReturn(key: string): boolean {
|
|
352
|
+
return executedReturns.has(key);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
export function addExecutedReturn(key: string): void {
|
|
356
|
+
executedReturns.add(key);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
export function deleteExecutedReturn(key: string): void {
|
|
360
|
+
executedReturns.delete(key);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// ============================================================================
|
|
364
|
+
// First Return Prompt
|
|
365
|
+
// ============================================================================
|
|
366
|
+
|
|
367
|
+
export function getFirstReturnPrompt(sessionID: string): string | undefined {
|
|
368
|
+
return firstReturnPrompt.get(sessionID);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
export function setFirstReturnPrompt(sessionID: string, prompt: string): void {
|
|
372
|
+
firstReturnPrompt.set(sessionID, prompt);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// ============================================================================
|
|
376
|
+
// Subtask Parent Session
|
|
377
|
+
// ============================================================================
|
|
378
|
+
|
|
379
|
+
export function getSubtaskParentSession(sessionID: string): string | undefined {
|
|
380
|
+
return subtaskParentSession.get(sessionID);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
export function setSubtaskParentSession(
|
|
384
|
+
sessionID: string,
|
|
385
|
+
parentID: string
|
|
386
|
+
): void {
|
|
387
|
+
subtaskParentSession.set(sessionID, parentID);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
export function deleteSubtaskParentSession(sessionID: string): void {
|
|
391
|
+
subtaskParentSession.delete(sessionID);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// ============================================================================
|
|
395
|
+
// Pending Model Override
|
|
396
|
+
// ============================================================================
|
|
397
|
+
|
|
398
|
+
export function getPendingModelOverride(sessionID: string): string | undefined {
|
|
399
|
+
return pendingModelOverride.get(sessionID);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
export function setPendingModelOverride(
|
|
403
|
+
sessionID: string,
|
|
404
|
+
model: string
|
|
405
|
+
): void {
|
|
406
|
+
pendingModelOverride.set(sessionID, model);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
export function deletePendingModelOverride(sessionID: string): void {
|
|
410
|
+
pendingModelOverride.delete(sessionID);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
export function getPendingAgentOverride(sessionID: string): string | undefined {
|
|
414
|
+
return pendingAgentOverride.get(sessionID);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
export function setPendingAgentOverride(
|
|
418
|
+
sessionID: string,
|
|
419
|
+
agent: string
|
|
420
|
+
): void {
|
|
421
|
+
pendingAgentOverride.set(sessionID, agent);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
export function deletePendingAgentOverride(sessionID: string): void {
|
|
425
|
+
pendingAgentOverride.delete(sessionID);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// ============================================================================
|
|
429
|
+
// Deferred Return Prompt (used for loops)
|
|
430
|
+
// ============================================================================
|
|
431
|
+
|
|
432
|
+
export function getDeferredReturnPrompt(sessionID: string): string | undefined {
|
|
433
|
+
return deferredReturnPrompt.get(sessionID);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
export function setDeferredReturnPrompt(
|
|
437
|
+
sessionID: string,
|
|
438
|
+
prompt: string
|
|
439
|
+
): void {
|
|
440
|
+
if (!deferredReturnPrompt.has(sessionID)) {
|
|
441
|
+
deferredReturnPrompt.set(sessionID, prompt);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
export function consumeDeferredReturnPrompt(
|
|
446
|
+
sessionID: string
|
|
447
|
+
): string | undefined {
|
|
448
|
+
const prompt = deferredReturnPrompt.get(sessionID);
|
|
449
|
+
if (prompt) {
|
|
450
|
+
deferredReturnPrompt.delete(sessionID);
|
|
451
|
+
}
|
|
452
|
+
return prompt;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
// ============================================================================
|
|
456
|
+
// Last Return Type Tracking
|
|
457
|
+
// ============================================================================
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Set the type of the last executed return for a session.
|
|
461
|
+
* Used to determine if a prompt return should be deferred to message-hooks
|
|
462
|
+
* or executed directly (when following an inline subtask).
|
|
463
|
+
*/
|
|
464
|
+
export function setLastReturnType(
|
|
465
|
+
sessionID: string,
|
|
466
|
+
type: "inline_subtask" | "command" | "prompt"
|
|
467
|
+
): void {
|
|
468
|
+
lastReturnType.set(sessionID, type);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
/**
|
|
472
|
+
* Get the type of the last executed return for a session.
|
|
473
|
+
*/
|
|
474
|
+
export function getLastReturnType(
|
|
475
|
+
sessionID: string
|
|
476
|
+
): "inline_subtask" | "command" | "prompt" | undefined {
|
|
477
|
+
return lastReturnType.get(sessionID);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* Clear the last return type for a session.
|
|
482
|
+
*/
|
|
483
|
+
export function clearLastReturnType(sessionID: string): void {
|
|
484
|
+
lastReturnType.delete(sessionID);
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// ============================================================================
|
|
488
|
+
// Pending Stacked Prompt Response
|
|
489
|
+
// ============================================================================
|
|
490
|
+
|
|
491
|
+
/**
|
|
492
|
+
* Mark that a session just had a stacked return PROMPT substituted.
|
|
493
|
+
* session.idle should skip returnState processing until LLM responds.
|
|
494
|
+
*/
|
|
495
|
+
export function setPendingStackedPromptResponse(sessionID: string): void {
|
|
496
|
+
pendingStackedPromptResponse.add(sessionID);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Check if a session is waiting for LLM response to a stacked prompt.
|
|
501
|
+
*/
|
|
502
|
+
export function hasPendingStackedPromptResponse(sessionID: string): boolean {
|
|
503
|
+
return pendingStackedPromptResponse.has(sessionID);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* Clear the pending stacked prompt response flag.
|
|
508
|
+
* Called when session.idle fires after the LLM has responded.
|
|
509
|
+
*/
|
|
510
|
+
export function clearPendingStackedPromptResponse(sessionID: string): void {
|
|
511
|
+
pendingStackedPromptResponse.delete(sessionID);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// ============================================================================
|
|
515
|
+
// Pending Prompt Return (deferred to message-hooks.ts for substitution)
|
|
516
|
+
// ============================================================================
|
|
517
|
+
|
|
518
|
+
/**
|
|
519
|
+
* Set a pending prompt return to be substituted in message-hooks.ts.
|
|
520
|
+
* Called by session.idle when processing a prompt return.
|
|
521
|
+
*/
|
|
522
|
+
export function setPendingPromptReturn(
|
|
523
|
+
sessionID: string,
|
|
524
|
+
prompt: string
|
|
525
|
+
): void {
|
|
526
|
+
pendingPromptReturn.set(sessionID, prompt);
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* Get and clear the pending prompt return for a session.
|
|
531
|
+
* Called by message-hooks.ts during transform to substitute the generic message.
|
|
532
|
+
*/
|
|
533
|
+
export function consumePendingPromptReturn(
|
|
534
|
+
sessionID: string
|
|
535
|
+
): string | undefined {
|
|
536
|
+
const prompt = pendingPromptReturn.get(sessionID);
|
|
537
|
+
if (prompt) {
|
|
538
|
+
pendingPromptReturn.delete(sessionID);
|
|
539
|
+
}
|
|
540
|
+
return prompt;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
export function clearPendingPromptReturn(sessionID: string): void {
|
|
544
|
+
pendingPromptReturn.delete(sessionID);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
/**
|
|
548
|
+
* Check if there's a pending prompt return for substitution.
|
|
549
|
+
*/
|
|
550
|
+
export function hasPendingPromptReturn(sessionID: string): boolean {
|
|
551
|
+
return pendingPromptReturn.has(sessionID);
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
// ============================================================================
|
|
555
|
+
// Pending Parent Session (keyed by prompt for race safety)
|
|
556
|
+
// ============================================================================
|
|
557
|
+
|
|
558
|
+
/**
|
|
559
|
+
* Register a parent session for a subtask prompt.
|
|
560
|
+
* Called in command.execute.before after all prompt modifications.
|
|
561
|
+
*/
|
|
562
|
+
export function registerPendingParentForPrompt(
|
|
563
|
+
prompt: string,
|
|
564
|
+
parentSessionID: string
|
|
565
|
+
): void {
|
|
566
|
+
pendingParentByPrompt.set(prompt, parentSessionID);
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
/**
|
|
570
|
+
* Look up and consume the parent session for a subtask prompt.
|
|
571
|
+
* Called in tool.execute.before to map subtask -> parent.
|
|
572
|
+
*/
|
|
573
|
+
export function consumePendingParentForPrompt(prompt: string): string | null {
|
|
574
|
+
const parentSession = pendingParentByPrompt.get(prompt);
|
|
575
|
+
if (parentSession) {
|
|
576
|
+
pendingParentByPrompt.delete(prompt);
|
|
577
|
+
}
|
|
578
|
+
return parentSession ?? null;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
// ============================================================================
|
|
582
|
+
// Has Active Subtask
|
|
583
|
+
// ============================================================================
|
|
584
|
+
|
|
585
|
+
export function getHasActiveSubtask(): boolean {
|
|
586
|
+
return hasActiveSubtask;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
export function setHasActiveSubtask(value: boolean): void {
|
|
590
|
+
hasActiveSubtask = value;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
// ============================================================================
|
|
594
|
+
// Named Subtask Results ($RESULT[name])
|
|
595
|
+
// ============================================================================
|
|
596
|
+
|
|
597
|
+
/**
|
|
598
|
+
* Register a pending main session capture.
|
|
599
|
+
* Called when a non-subtask command with `as:` is executed.
|
|
600
|
+
* The next LLM turn will be captured under this name.
|
|
601
|
+
*/
|
|
602
|
+
export function registerPendingMainSessionCapture(
|
|
603
|
+
sessionID: string,
|
|
604
|
+
name: string
|
|
605
|
+
): void {
|
|
606
|
+
pendingMainSessionCapture.set(sessionID, name);
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/**
|
|
610
|
+
* Consume a pending main session capture.
|
|
611
|
+
* Returns the name to capture under, or undefined if none pending.
|
|
612
|
+
*/
|
|
613
|
+
export function consumePendingMainSessionCapture(
|
|
614
|
+
sessionID: string
|
|
615
|
+
): string | undefined {
|
|
616
|
+
const name = pendingMainSessionCapture.get(sessionID);
|
|
617
|
+
if (name) {
|
|
618
|
+
pendingMainSessionCapture.delete(sessionID);
|
|
619
|
+
}
|
|
620
|
+
return name;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
/**
|
|
624
|
+
* Register a pending result capture by prompt content.
|
|
625
|
+
* Called when spawning a subtask with `as:` name (before we know the session ID).
|
|
626
|
+
* NOTE: We keep this until session.idle matches the prompt, since tool.after
|
|
627
|
+
* doesn't have access to inline subtask output.
|
|
628
|
+
*/
|
|
629
|
+
export function registerPendingResultCaptureByPrompt(
|
|
630
|
+
prompt: string,
|
|
631
|
+
parentSessionID: string,
|
|
632
|
+
name: string
|
|
633
|
+
): void {
|
|
634
|
+
pendingResultCaptureByPrompt.set(prompt, { parentSessionID, name });
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
/**
|
|
638
|
+
* Consume a pending result capture by prompt content.
|
|
639
|
+
* Called when tool.execute.before fires and we know the subtask session ID.
|
|
640
|
+
*/
|
|
641
|
+
export function consumePendingResultCaptureByPrompt(
|
|
642
|
+
prompt: string
|
|
643
|
+
): { parentSessionID: string; name: string } | undefined {
|
|
644
|
+
const entry = pendingResultCaptureByPrompt.get(prompt);
|
|
645
|
+
if (entry) {
|
|
646
|
+
pendingResultCaptureByPrompt.delete(prompt);
|
|
647
|
+
}
|
|
648
|
+
return entry;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
/**
|
|
652
|
+
* Check if a prompt has a pending result capture (without consuming).
|
|
653
|
+
* Used in session.idle to match subtask sessions by prompt content.
|
|
654
|
+
*/
|
|
655
|
+
export function getPendingResultCaptureByPrompt(
|
|
656
|
+
prompt: string
|
|
657
|
+
): { parentSessionID: string; name: string } | undefined {
|
|
658
|
+
return pendingResultCaptureByPrompt.get(prompt);
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
/**
|
|
662
|
+
* Delete a pending result capture by prompt (after capturing in session.idle).
|
|
663
|
+
*/
|
|
664
|
+
export function deletePendingResultCaptureByPrompt(prompt: string): void {
|
|
665
|
+
pendingResultCaptureByPrompt.delete(prompt);
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/**
|
|
669
|
+
* Register a pending result capture by subtask session ID.
|
|
670
|
+
* Called when spawning a subtask with `as:` name.
|
|
671
|
+
*/
|
|
672
|
+
export function registerPendingResultCapture(
|
|
673
|
+
subtaskSessionID: string,
|
|
674
|
+
parentSessionID: string,
|
|
675
|
+
name: string
|
|
676
|
+
): void {
|
|
677
|
+
pendingResultCapture.set(subtaskSessionID, { parentSessionID, name });
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
/**
|
|
681
|
+
* Check if a subtask session has a pending result capture.
|
|
682
|
+
*/
|
|
683
|
+
export function getPendingResultCapture(
|
|
684
|
+
subtaskSessionID: string
|
|
685
|
+
): { parentSessionID: string; name: string } | undefined {
|
|
686
|
+
return pendingResultCapture.get(subtaskSessionID);
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* Consume and store a subtask result.
|
|
691
|
+
* Called when subtask completes - stores result and removes pending entry.
|
|
692
|
+
*/
|
|
693
|
+
export function captureSubtaskResult(
|
|
694
|
+
subtaskSessionID: string,
|
|
695
|
+
result: string
|
|
696
|
+
): void {
|
|
697
|
+
const pending = pendingResultCapture.get(subtaskSessionID);
|
|
698
|
+
if (!pending) return;
|
|
699
|
+
|
|
700
|
+
const { parentSessionID, name } = pending;
|
|
701
|
+
|
|
702
|
+
if (!subtaskResults.has(parentSessionID)) {
|
|
703
|
+
subtaskResults.set(parentSessionID, new Map());
|
|
704
|
+
}
|
|
705
|
+
subtaskResults.get(parentSessionID)!.set(name, result);
|
|
706
|
+
|
|
707
|
+
pendingResultCapture.delete(subtaskSessionID);
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
/**
|
|
711
|
+
* Store a named result directly for a session (used for main session captures).
|
|
712
|
+
*/
|
|
713
|
+
export function storeSubtaskResult(
|
|
714
|
+
sessionID: string,
|
|
715
|
+
name: string,
|
|
716
|
+
result: string
|
|
717
|
+
): void {
|
|
718
|
+
if (!subtaskResults.has(sessionID)) {
|
|
719
|
+
subtaskResults.set(sessionID, new Map());
|
|
720
|
+
}
|
|
721
|
+
subtaskResults.get(sessionID)!.set(name, result);
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
/**
|
|
725
|
+
* Get a named result for a session.
|
|
726
|
+
*/
|
|
727
|
+
export function getSubtaskResult(
|
|
728
|
+
sessionID: string,
|
|
729
|
+
name: string
|
|
730
|
+
): string | undefined {
|
|
731
|
+
return subtaskResults.get(sessionID)?.get(name);
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
/**
|
|
735
|
+
* Get all named results for a session.
|
|
736
|
+
*/
|
|
737
|
+
export function getAllSubtaskResults(
|
|
738
|
+
sessionID: string
|
|
739
|
+
): Map<string, string> | undefined {
|
|
740
|
+
return subtaskResults.get(sessionID);
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
/**
|
|
744
|
+
* Resolve $RESULT[name] references in a string.
|
|
745
|
+
*/
|
|
746
|
+
export function resolveResultReferences(
|
|
747
|
+
text: string,
|
|
748
|
+
sessionID: string
|
|
749
|
+
): string {
|
|
750
|
+
const results = subtaskResults.get(sessionID);
|
|
751
|
+
if (!results || results.size === 0) return text;
|
|
752
|
+
|
|
753
|
+
return text.replace(/\$RESULT\[([^\]]+)\]/g, (match, name) => {
|
|
754
|
+
const result = results.get(name);
|
|
755
|
+
return result ?? match; // Keep original if not found
|
|
756
|
+
});
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
/**
|
|
760
|
+
* Clear all results for a session (cleanup).
|
|
761
|
+
*/
|
|
762
|
+
export function clearSubtaskResults(sessionID: string): void {
|
|
763
|
+
subtaskResults.delete(sessionID);
|
|
764
|
+
}
|