@cjhyy/code-shell-core 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -23
- package/dist/agent/agent-definition-registry.d.ts +2 -2
- package/dist/agent/agent-definition-registry.js +47 -10
- package/dist/agent/agent-definition.d.ts +5 -0
- package/dist/agent/agent-definition.js +14 -0
- package/dist/automation/index.d.ts +7 -4
- package/dist/automation/index.js +4 -2
- package/dist/automation/runner.js +3 -1
- package/dist/automation/scheduler.d.ts +57 -1
- package/dist/automation/scheduler.js +123 -23
- package/dist/automation/store.d.ts +6 -2
- package/dist/automation/store.js +7 -3
- package/dist/capabilities/index.d.ts +109 -0
- package/dist/capabilities/index.js +80 -0
- package/dist/capability-control/disabled-lists.d.ts +2 -1
- package/dist/capability-control/disabled-lists.js +3 -5
- package/dist/capability-control/overlay.d.ts +14 -1
- package/dist/capability-control/overlay.js +40 -0
- package/dist/capability-control/service.js +6 -4
- package/dist/cli/agent-server-stdio.d.ts +1 -1
- package/dist/cli/agent-server-stdio.js +66 -6
- package/dist/cli/agent-server-tcp.js +7 -3
- package/dist/context/compaction.d.ts +39 -3
- package/dist/context/compaction.js +151 -39
- package/dist/context/manager.d.ts +17 -1
- package/dist/context/manager.js +36 -1
- package/dist/credentials/access.d.ts +3 -1
- package/dist/credentials/access.js +24 -3
- package/dist/credentials/index.d.ts +1 -1
- package/dist/credentials/index.js +1 -1
- package/dist/credentials/oauth.d.ts +4 -1
- package/dist/credentials/oauth.js +14 -0
- package/dist/credentials/store.d.ts +15 -1
- package/dist/credentials/store.js +17 -4
- package/dist/credentials/types.d.ts +24 -0
- package/dist/credentials/use-credential-tool.js +15 -1
- package/dist/engine/auxiliary-pipeline.d.ts +40 -0
- package/dist/engine/auxiliary-pipeline.js +181 -0
- package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
- package/dist/{settings → engine}/disk-defaults.js +5 -2
- package/dist/engine/dynamic-tool-defs.d.ts +4 -0
- package/dist/engine/dynamic-tool-defs.js +4 -0
- package/dist/engine/engine.d.ts +254 -195
- package/dist/engine/engine.js +1812 -2041
- package/dist/engine/file-history-hook.d.ts +11 -0
- package/dist/engine/file-history-hook.js +31 -0
- package/dist/engine/goal-judge-context.d.ts +9 -0
- package/dist/engine/goal-judge-context.js +234 -0
- package/dist/engine/injected-context-cache.d.ts +6 -0
- package/dist/engine/injected-context-cache.js +13 -0
- package/dist/engine/input-attachments.d.ts +1 -1
- package/dist/engine/model-facade.d.ts +3 -3
- package/dist/engine/model-facade.js +15 -14
- package/dist/engine/permission-controller.d.ts +55 -0
- package/dist/engine/permission-controller.js +148 -0
- package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
- package/dist/engine/prompt-cache-diagnostics.js +178 -0
- package/dist/engine/run-accounting.d.ts +41 -0
- package/dist/engine/run-accounting.js +126 -0
- package/dist/engine/run-context.d.ts +44 -0
- package/dist/engine/run-context.js +88 -0
- package/dist/engine/run-environment.d.ts +30 -0
- package/dist/engine/run-environment.js +77 -0
- package/dist/engine/run-finalize.d.ts +58 -0
- package/dist/engine/run-finalize.js +245 -0
- package/dist/engine/run-goal.d.ts +58 -0
- package/dist/engine/run-goal.js +188 -0
- package/dist/engine/run-image-input.d.ts +1 -1
- package/dist/engine/run-image-input.js +5 -3
- package/dist/engine/run-session-open.d.ts +41 -0
- package/dist/engine/run-session-open.js +186 -0
- package/dist/engine/run-setup.d.ts +42 -0
- package/dist/engine/run-setup.js +58 -0
- package/dist/engine/run-tooling.d.ts +125 -0
- package/dist/engine/run-tooling.js +283 -0
- package/dist/engine/run-types.d.ts +139 -0
- package/dist/engine/run-types.js +12 -0
- package/dist/engine/run-workspace.d.ts +50 -0
- package/dist/engine/run-workspace.js +114 -0
- package/dist/engine/steer-queue.d.ts +1 -1
- package/dist/engine/subagent-spawner.d.ts +32 -0
- package/dist/engine/subagent-spawner.js +287 -0
- package/dist/engine/tool-summary.d.ts +2 -2
- package/dist/engine/tool-summary.js +2 -2
- package/dist/engine/turn-loop.d.ts +49 -10
- package/dist/engine/turn-loop.js +370 -104
- package/dist/engine/types.d.ts +30 -3
- package/dist/engine/types.js +1 -1
- package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
- package/dist/goal/lifecycle.js +482 -0
- package/dist/hooks/events.d.ts +24 -10
- package/dist/hooks/goal-stop-hook.d.ts +17 -28
- package/dist/hooks/goal-stop-hook.js +110 -465
- package/dist/hooks/registry.js +1 -1
- package/dist/index.d.ts +48 -108
- package/dist/index.extension.d.ts +51 -0
- package/dist/index.extension.js +39 -0
- package/dist/index.internal.d.ts +86 -0
- package/dist/index.internal.js +92 -0
- package/dist/index.js +34 -123
- package/dist/links/cli.d.ts +48 -0
- package/dist/links/cli.js +617 -0
- package/dist/links/http.d.ts +40 -0
- package/dist/links/http.js +166 -0
- package/dist/links/index.d.ts +4 -0
- package/dist/links/index.js +3 -0
- package/dist/links/link-action-tool.d.ts +5 -0
- package/dist/links/link-action-tool.js +241 -0
- package/dist/links/providers.d.ts +8 -0
- package/dist/links/providers.js +665 -0
- package/dist/links/types.d.ts +44 -0
- package/dist/llm/client-base.d.ts +7 -0
- package/dist/llm/client-base.js +60 -0
- package/dist/llm/model-pool.d.ts +1 -1
- package/dist/llm/model-pool.js +1 -1
- package/dist/llm/providers/anthropic.d.ts +1 -0
- package/dist/llm/providers/anthropic.js +9 -0
- package/dist/llm/providers/openai.d.ts +1 -0
- package/dist/llm/providers/openai.js +17 -0
- package/dist/model-catalog/index.js +15 -2
- package/dist/model-catalog/resolve.d.ts +13 -1
- package/dist/model-catalog/resolve.js +37 -2
- package/dist/model-catalog/types.d.ts +74 -48
- package/dist/model-catalog/types.js +16 -5
- package/dist/model-catalog/upsert.d.ts +3 -1
- package/dist/model-catalog/upsert.js +9 -0
- package/dist/onboarding.d.ts +0 -1
- package/dist/onboarding.js +1 -22
- package/dist/panel-apps/bindings.d.ts +24 -0
- package/dist/panel-apps/bindings.js +69 -0
- package/dist/panel-apps/github-archive.d.ts +21 -0
- package/dist/panel-apps/github-archive.js +98 -0
- package/dist/panel-apps/index.d.ts +4 -0
- package/dist/panel-apps/index.js +4 -0
- package/dist/panel-apps/installer.d.ts +68 -0
- package/dist/panel-apps/installer.js +622 -0
- package/dist/panel-apps/manifest.d.ts +364 -0
- package/dist/panel-apps/manifest.js +189 -0
- package/dist/panel-apps/paths.d.ts +13 -0
- package/dist/panel-apps/paths.js +38 -0
- package/dist/panel-apps/registry.d.ts +51 -0
- package/dist/panel-apps/registry.js +99 -0
- package/dist/panel-apps/runtime.d.ts +80 -0
- package/dist/panel-apps/runtime.js +154 -0
- package/dist/plugins/gitOps.js +8 -1
- package/dist/plugins/installedPlugins.d.ts +2 -1
- package/dist/plugins/installedPlugins.js +146 -8
- package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
- package/dist/plugins/installer/codex/convertAgents.js +62 -8
- package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
- package/dist/plugins/installer/codex/convertCommands.js +35 -12
- package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
- package/dist/plugins/installer/codex/convertHooks.js +82 -0
- package/dist/plugins/installer/codex/convertSkills.js +41 -6
- package/dist/plugins/installer/install.d.ts +7 -1
- package/dist/plugins/installer/install.js +21 -87
- package/dist/plugins/installer/installFromArchive.d.ts +26 -4
- package/dist/plugins/installer/installFromArchive.js +44 -27
- package/dist/plugins/installer/installFromNpm.d.ts +31 -0
- package/dist/plugins/installer/installFromNpm.js +273 -0
- package/dist/plugins/installer/loadPluginAgents.js +17 -4
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +245 -35
- package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
- package/dist/plugins/installer/normalizeManifest.js +306 -0
- package/dist/plugins/installer/npmTar.d.ts +13 -0
- package/dist/plugins/installer/npmTar.js +321 -0
- package/dist/plugins/installer/parseSource.d.ts +11 -0
- package/dist/plugins/installer/parseSource.js +48 -0
- package/dist/plugins/installer/preview.d.ts +101 -0
- package/dist/plugins/installer/preview.js +336 -0
- package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
- package/dist/plugins/installer/projectPluginSource.js +140 -0
- package/dist/plugins/installer/types.d.ts +775 -0
- package/dist/plugins/installer/types.js +100 -0
- package/dist/plugins/installer/unzip.d.ts +11 -0
- package/dist/plugins/installer/unzip.js +123 -9
- package/dist/plugins/installer/update.d.ts +2 -2
- package/dist/plugins/installer/update.js +43 -4
- package/dist/plugins/loadPluginHooks.d.ts +19 -2
- package/dist/plugins/loadPluginHooks.js +97 -86
- package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
- package/dist/plugins/pluginAutomationTemplates.js +50 -0
- package/dist/plugins/pluginCatalog.d.ts +45 -0
- package/dist/plugins/pluginCatalog.js +87 -0
- package/dist/plugins/pluginCommandHook.d.ts +6 -0
- package/dist/plugins/pluginCommandHook.js +25 -8
- package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
- package/dist/plugins/pluginCommandsLoader.js +181 -7
- package/dist/plugins/pluginContent.d.ts +10 -1
- package/dist/plugins/pluginContent.js +87 -30
- package/dist/plugins/pluginHookApproval.d.ts +30 -0
- package/dist/plugins/pluginHookApproval.js +160 -0
- package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
- package/dist/plugins/pluginHookIntegrity.js +361 -0
- package/dist/plugins/pluginInstaller.js +71 -12
- package/dist/plugins/pluginMcpApproval.d.ts +19 -0
- package/dist/plugins/pluginMcpApproval.js +110 -0
- package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
- package/dist/plugins/pluginMcpIntegrity.js +74 -0
- package/dist/plugins/types.d.ts +30 -0
- package/dist/plugins/varRewrite.d.ts +9 -5
- package/dist/plugins/varRewrite.js +26 -17
- package/dist/preset/index.d.ts +11 -8
- package/dist/preset/index.js +62 -203
- package/dist/product/define.js +9 -3
- package/dist/product/types.d.ts +0 -2
- package/dist/profile/activation.d.ts +36 -0
- package/dist/profile/activation.js +57 -0
- package/dist/profile/catalog-store.d.ts +77 -0
- package/dist/profile/catalog-store.js +346 -0
- package/dist/profile/catalog.d.ts +54 -0
- package/dist/profile/catalog.js +152 -0
- package/dist/profile/index.d.ts +7 -0
- package/dist/profile/index.js +7 -0
- package/dist/profile/requirements.d.ts +76 -0
- package/dist/profile/requirements.js +117 -0
- package/dist/profile/resolve.d.ts +11 -0
- package/dist/profile/resolve.js +41 -0
- package/dist/profile/store.d.ts +17 -0
- package/dist/profile/store.js +167 -0
- package/dist/profile/types.d.ts +321 -0
- package/dist/profile/types.js +104 -0
- package/dist/prompt/composer.d.ts +46 -7
- package/dist/prompt/composer.js +78 -48
- package/dist/prompt/instruction-scanner.d.ts +6 -5
- package/dist/prompt/instruction-scanner.js +8 -23
- package/dist/prompt/section-loader.d.ts +2 -2
- package/dist/prompt/section-loader.js +7 -4
- package/dist/prompt/sections/browser.md +10 -9
- package/dist/prompt/sections/harness-base.md +9 -0
- package/dist/protocol/chat-session-manager.d.ts +64 -1
- package/dist/protocol/chat-session-manager.js +104 -0
- package/dist/protocol/chat-session.d.ts +61 -10
- package/dist/protocol/chat-session.js +135 -25
- package/dist/protocol/client.d.ts +33 -3
- package/dist/protocol/client.js +96 -5
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/index.js +2 -2
- package/dist/protocol/mobile-remote-types.d.ts +406 -0
- package/dist/protocol/mobile-remote-types.js +1 -0
- package/dist/protocol/server.d.ts +127 -3
- package/dist/protocol/server.js +1309 -182
- package/dist/protocol/types.d.ts +152 -34
- package/dist/protocol/types.js +16 -0
- package/dist/run/ArtifactTracker.d.ts +6 -1
- package/dist/run/ArtifactTracker.js +29 -21
- package/dist/run/EngineRunner.d.ts +2 -0
- package/dist/run/EngineRunner.js +1 -0
- package/dist/run/RunManager.d.ts +26 -0
- package/dist/run/RunManager.js +82 -11
- package/dist/run/factory.d.ts +3 -0
- package/dist/run/factory.js +2 -0
- package/dist/runtime/safe-spawn.d.ts +6 -0
- package/dist/runtime/safe-spawn.js +8 -13
- package/dist/services/auto-dream.d.ts +13 -1
- package/dist/services/auto-dream.js +56 -8
- package/dist/services/dream-consolidation.js +10 -1
- package/dist/services/memory-orchestrator.js +6 -2
- package/dist/services/oauth.js +4 -1
- package/dist/services/session-memory.d.ts +4 -4
- package/dist/services/session-memory.js +13 -10
- package/dist/session/memory.d.ts +26 -7
- package/dist/session/memory.js +79 -21
- package/dist/session/session-manager.d.ts +182 -28
- package/dist/session/session-manager.js +910 -130
- package/dist/session/session-message.d.ts +22 -0
- package/dist/session/session-message.js +1 -0
- package/dist/session/transcript.d.ts +46 -5
- package/dist/session/transcript.js +159 -3
- package/dist/settings/feature-flags.d.ts +40 -0
- package/dist/settings/feature-flags.js +40 -0
- package/dist/settings/manager.d.ts +39 -1
- package/dist/settings/manager.js +102 -41
- package/dist/settings/migrate-config.js +4 -2
- package/dist/settings/schema.d.ts +511 -177
- package/dist/settings/schema.js +98 -25
- package/dist/skills/scanner.d.ts +6 -2
- package/dist/skills/scanner.js +160 -9
- package/dist/sources/adapter.d.ts +14 -0
- package/dist/sources/adapter.js +7 -0
- package/dist/sources/adapters/local-files.d.ts +10 -0
- package/dist/sources/adapters/local-files.js +127 -0
- package/dist/sources/adapters/mcp-resource.d.ts +17 -0
- package/dist/sources/adapters/mcp-resource.js +41 -0
- package/dist/sources/adapters/mock.d.ts +3 -0
- package/dist/sources/adapters/mock.js +29 -0
- package/dist/sources/binding.d.ts +6 -0
- package/dist/sources/binding.js +24 -0
- package/dist/sources/catalog.d.ts +6 -0
- package/dist/sources/catalog.js +64 -0
- package/dist/sources/context-summary.d.ts +8 -0
- package/dist/sources/context-summary.js +13 -0
- package/dist/sources/credential-status.d.ts +2 -0
- package/dist/sources/credential-status.js +13 -0
- package/dist/sources/index.d.ts +10 -0
- package/dist/sources/index.js +10 -0
- package/dist/sources/resolve.d.ts +28 -0
- package/dist/sources/resolve.js +47 -0
- package/dist/sources/truncate-utf8.d.ts +7 -0
- package/dist/sources/truncate-utf8.js +18 -0
- package/dist/sources/types.d.ts +71 -0
- package/dist/sources/types.js +26 -0
- package/dist/testing/fetch-stub.d.ts +32 -0
- package/dist/testing/fetch-stub.js +24 -0
- package/dist/themes/image.d.ts +18 -0
- package/dist/themes/image.js +117 -0
- package/dist/themes/index.d.ts +4 -0
- package/dist/themes/index.js +4 -0
- package/dist/themes/installer.d.ts +50 -0
- package/dist/themes/installer.js +290 -0
- package/dist/themes/manifest.d.ts +102 -0
- package/dist/themes/manifest.js +86 -0
- package/dist/themes/paths.d.ts +14 -0
- package/dist/themes/paths.js +33 -0
- package/dist/tool-system/browser-bridge.d.ts +53 -11
- package/dist/tool-system/browser-bridge.js +8 -9
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
- package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
- package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
- package/dist/tool-system/builtin/agent-notifications.js +291 -101
- package/dist/tool-system/builtin/agent-output-file.js +1 -3
- package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
- package/dist/tool-system/builtin/agent-progress.js +83 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
- package/dist/tool-system/builtin/agent-registry.js +178 -9
- package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
- package/dist/tool-system/builtin/agent.d.ts +2 -0
- package/dist/tool-system/builtin/agent.js +274 -33
- package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
- package/dist/tool-system/builtin/background-jobs.js +96 -4
- package/dist/tool-system/builtin/background-work.d.ts +6 -0
- package/dist/tool-system/builtin/background-work.js +8 -1
- package/dist/tool-system/builtin/bash.js +5 -2
- package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
- package/dist/tool-system/builtin/browser-tools.js +89 -23
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
- package/dist/tool-system/builtin/edit.js +2 -6
- package/dist/tool-system/builtin/file-cache.d.ts +2 -0
- package/dist/tool-system/builtin/file-cache.js +4 -0
- package/dist/tool-system/builtin/generate-image.js +17 -10
- package/dist/tool-system/builtin/generate-video.js +26 -7
- package/dist/tool-system/builtin/grep.js +2 -2
- package/dist/tool-system/builtin/image-uploader.js +7 -1
- package/dist/tool-system/builtin/index.d.ts +32 -7
- package/dist/tool-system/builtin/index.js +237 -167
- package/dist/tool-system/builtin/memory.d.ts +6 -0
- package/dist/tool-system/builtin/memory.js +36 -15
- package/dist/tool-system/builtin/panel.d.ts +9 -0
- package/dist/tool-system/builtin/panel.js +314 -0
- package/dist/tool-system/builtin/read.js +5 -1
- package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
- package/dist/tool-system/builtin/send-message-to-session.js +67 -0
- package/dist/tool-system/builtin/sources.d.ts +8 -0
- package/dist/tool-system/builtin/sources.js +137 -0
- package/dist/tool-system/builtin/tool-search.js +7 -2
- package/dist/tool-system/builtin/update-automation-memory.js +2 -0
- package/dist/tool-system/builtin/web-fetch.js +17 -13
- package/dist/tool-system/builtin/web-search.js +1 -3
- package/dist/tool-system/capability-module.d.ts +93 -0
- package/dist/tool-system/capability-module.js +53 -0
- package/dist/tool-system/context.d.ts +77 -19
- package/dist/tool-system/executor.js +75 -50
- package/dist/tool-system/external-tool-exposure.d.ts +60 -0
- package/dist/tool-system/external-tool-exposure.js +304 -0
- package/dist/tool-system/mcp-manager.d.ts +11 -1
- package/dist/tool-system/mcp-manager.js +19 -4
- package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
- package/dist/tool-system/mcp-tool-policy.js +34 -0
- package/dist/tool-system/panel-bridge.d.ts +53 -0
- package/dist/tool-system/panel-bridge.js +1 -0
- package/dist/tool-system/permission.d.ts +26 -0
- package/dist/tool-system/permission.js +46 -0
- package/dist/tool-system/registry.d.ts +12 -1
- package/dist/tool-system/registry.js +31 -7
- package/dist/tool-system/sandbox/index.js +3 -8
- package/dist/tool-system/sandbox/seatbelt.js +2 -6
- package/dist/tool-system/session-tool-host.d.ts +139 -0
- package/dist/tool-system/session-tool-host.js +167 -0
- package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
- package/dist/tool-system/testing/tool-registry-harness.js +51 -0
- package/dist/tool-system/validation.d.ts +14 -7
- package/dist/tool-system/validation.js +701 -7
- package/dist/types.d.ts +186 -20
- package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
- package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
- package/dist/utils/file-mutex.d.ts +65 -0
- package/dist/utils/file-mutex.js +145 -0
- package/dist/utils/json.d.ts +2 -4
- package/dist/utils/json.js +2 -4
- package/dist/utils/lockfile.d.ts +30 -1
- package/dist/utils/lockfile.js +2 -2
- package/dist/utils/secret-scrubber.d.ts +8 -0
- package/dist/utils/secret-scrubber.js +227 -0
- package/dist/utils/toolDisplay.js +1 -1
- package/package.json +20 -5
- package/THIRD_PARTY_NOTICES.md +0 -206
- package/dist/arena/arena.d.ts +0 -45
- package/dist/arena/arena.js +0 -362
- package/dist/arena/context/context-tools.d.ts +0 -16
- package/dist/arena/context/context-tools.js +0 -272
- package/dist/arena/context/within-root.d.ts +0 -7
- package/dist/arena/context/within-root.js +0 -15
- package/dist/arena/detect-mode.d.ts +0 -20
- package/dist/arena/detect-mode.js +0 -78
- package/dist/arena/digest-builder.d.ts +0 -25
- package/dist/arena/digest-builder.js +0 -120
- package/dist/arena/index.d.ts +0 -29
- package/dist/arena/index.js +0 -29
- package/dist/arena/iterate/convergence.d.ts +0 -25
- package/dist/arena/iterate/convergence.js +0 -103
- package/dist/arena/iterate/formats/index.d.ts +0 -22
- package/dist/arena/iterate/formats/index.js +0 -283
- package/dist/arena/iterate/index.d.ts +0 -11
- package/dist/arena/iterate/index.js +0 -9
- package/dist/arena/iterate/iterative-arena.d.ts +0 -23
- package/dist/arena/iterate/iterative-arena.js +0 -237
- package/dist/arena/iterate/parse.d.ts +0 -42
- package/dist/arena/iterate/parse.js +0 -123
- package/dist/arena/iterate/phases/argue.d.ts +0 -22
- package/dist/arena/iterate/phases/argue.js +0 -165
- package/dist/arena/iterate/phases/revise.d.ts +0 -16
- package/dist/arena/iterate/phases/revise.js +0 -62
- package/dist/arena/iterate/phases/tournament.d.ts +0 -34
- package/dist/arena/iterate/phases/tournament.js +0 -113
- package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
- package/dist/arena/iterate/tools/web-tools.js +0 -54
- package/dist/arena/iterate/types.d.ts +0 -152
- package/dist/arena/iterate/types.js +0 -8
- package/dist/arena/ledger.d.ts +0 -47
- package/dist/arena/ledger.js +0 -159
- package/dist/arena/lenses/architecture.d.ts +0 -5
- package/dist/arena/lenses/architecture.js +0 -22
- package/dist/arena/lenses/engineering.d.ts +0 -5
- package/dist/arena/lenses/engineering.js +0 -22
- package/dist/arena/lenses/general.d.ts +0 -5
- package/dist/arena/lenses/general.js +0 -20
- package/dist/arena/lenses/index.d.ts +0 -16
- package/dist/arena/lenses/index.js +0 -47
- package/dist/arena/lenses/product.d.ts +0 -5
- package/dist/arena/lenses/product.js +0 -22
- package/dist/arena/model-presets.d.ts +0 -23
- package/dist/arena/model-presets.js +0 -44
- package/dist/arena/phases/adjudication.d.ts +0 -25
- package/dist/arena/phases/adjudication.js +0 -142
- package/dist/arena/phases/build-consensus.d.ts +0 -30
- package/dist/arena/phases/build-consensus.js +0 -85
- package/dist/arena/phases/claim-registry.d.ts +0 -26
- package/dist/arena/phases/claim-registry.js +0 -60
- package/dist/arena/phases/cross-review.d.ts +0 -47
- package/dist/arena/phases/cross-review.js +0 -224
- package/dist/arena/phases/debate-rounds.d.ts +0 -28
- package/dist/arena/phases/debate-rounds.js +0 -161
- package/dist/arena/phases/participant-research.d.ts +0 -39
- package/dist/arena/phases/participant-research.js +0 -316
- package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
- package/dist/arena/phases/planning-detail-expansion.js +0 -120
- package/dist/arena/planner.d.ts +0 -28
- package/dist/arena/planner.js +0 -312
- package/dist/arena/providers/docs.d.ts +0 -7
- package/dist/arena/providers/docs.js +0 -111
- package/dist/arena/providers/git.d.ts +0 -8
- package/dist/arena/providers/git.js +0 -174
- package/dist/arena/providers/index.d.ts +0 -32
- package/dist/arena/providers/index.js +0 -132
- package/dist/arena/providers/none.d.ts +0 -7
- package/dist/arena/providers/none.js +0 -11
- package/dist/arena/providers/repo.d.ts +0 -7
- package/dist/arena/providers/repo.js +0 -258
- package/dist/arena/render/session.d.ts +0 -17
- package/dist/arena/render/session.js +0 -190
- package/dist/arena/render/terminal.d.ts +0 -34
- package/dist/arena/render/terminal.js +0 -286
- package/dist/arena/strategies/discussion.d.ts +0 -25
- package/dist/arena/strategies/discussion.js +0 -143
- package/dist/arena/strategies/index.d.ts +0 -15
- package/dist/arena/strategies/index.js +0 -28
- package/dist/arena/strategies/language-wrapper.d.ts +0 -17
- package/dist/arena/strategies/language-wrapper.js +0 -102
- package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
- package/dist/arena/strategies/lens-wrapper.js +0 -236
- package/dist/arena/strategies/planning.d.ts +0 -30
- package/dist/arena/strategies/planning.js +0 -225
- package/dist/arena/strategies/review.d.ts +0 -26
- package/dist/arena/strategies/review.js +0 -168
- package/dist/arena/strategies/utils.d.ts +0 -36
- package/dist/arena/strategies/utils.js +0 -603
- package/dist/arena/tools/selector.d.ts +0 -17
- package/dist/arena/tools/selector.js +0 -61
- package/dist/arena/transitions.d.ts +0 -53
- package/dist/arena/transitions.js +0 -97
- package/dist/arena/types.d.ts +0 -518
- package/dist/arena/types.js +0 -27
- package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
- package/dist/cc-orchestrator/agent-adapter.js +0 -143
- package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
- package/dist/cc-orchestrator/cc-capability.js +0 -53
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
- package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
- package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
- package/dist/cc-orchestrator/codex-session-history.js +0 -247
- package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
- package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
- package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-changes.js +0 -231
- package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-driver.js +0 -284
- package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
- package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
- package/dist/cc-orchestrator/index.d.ts +0 -8
- package/dist/cc-orchestrator/index.js +0 -8
- package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
- package/dist/cc-orchestrator/relevance-judge.js +0 -29
- package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
- package/dist/cc-orchestrator/session-discovery.js +0 -125
- package/dist/cc-orchestrator/session-history.d.ts +0 -54
- package/dist/cc-orchestrator/session-history.js +0 -150
- package/dist/cron/cron-runtime.d.ts +0 -2
- package/dist/cron/cron-runtime.js +0 -2
- package/dist/cron/cron-store.d.ts +0 -2
- package/dist/cron/cron-store.js +0 -2
- package/dist/cron/scheduler.d.ts +0 -7
- package/dist/cron/scheduler.js +0 -7
- package/dist/engine/goal.js +0 -206
- package/dist/external-agents/config.d.ts +0 -2
- package/dist/external-agents/config.js +0 -15
- package/dist/external-agents/types.d.ts +0 -31
- package/dist/git/parse-log.d.ts +0 -13
- package/dist/git/parse-log.js +0 -21
- package/dist/git/utils.d.ts +0 -49
- package/dist/git/utils.js +0 -161
- package/dist/git/worktree/crud.d.ts +0 -72
- package/dist/git/worktree/crud.js +0 -235
- package/dist/git/worktree/diff.d.ts +0 -14
- package/dist/git/worktree/diff.js +0 -82
- package/dist/git/worktree/git-exec.d.ts +0 -7
- package/dist/git/worktree/git-exec.js +0 -87
- package/dist/git/worktree/index.d.ts +0 -5
- package/dist/git/worktree/index.js +0 -5
- package/dist/git/worktree/query.d.ts +0 -43
- package/dist/git/worktree/query.js +0 -128
- package/dist/git/worktree/slug.d.ts +0 -11
- package/dist/git/worktree/slug.js +0 -58
- package/dist/git/worktree.d.ts +0 -1
- package/dist/git/worktree.js +0 -5
- package/dist/lsp/client.d.ts +0 -41
- package/dist/lsp/client.js +0 -186
- package/dist/lsp/manager.d.ts +0 -40
- package/dist/lsp/manager.js +0 -155
- package/dist/lsp/root-path.d.ts +0 -9
- package/dist/lsp/root-path.js +0 -12
- package/dist/lsp/servers.d.ts +0 -16
- package/dist/lsp/servers.js +0 -60
- package/dist/prompt/sections/coding.md +0 -35
- package/dist/quota/credentials.d.ts +0 -3
- package/dist/quota/credentials.js +0 -80
- package/dist/quota/index.d.ts +0 -36
- package/dist/quota/index.js +0 -155
- package/dist/quota/types.d.ts +0 -48
- package/dist/quota/types.js +0 -13
- package/dist/review/review-prompt.d.ts +0 -28
- package/dist/review/review-prompt.js +0 -81
- package/dist/state.d.ts +0 -160
- package/dist/state.js +0 -267
- package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
- package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
- package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
- package/dist/tool-system/builtin/apply-patch/index.js +0 -105
- package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
- package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
- package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
- package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
- package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
- package/dist/tool-system/builtin/apply-patch/types.js +0 -13
- package/dist/tool-system/builtin/arena.d.ts +0 -31
- package/dist/tool-system/builtin/arena.js +0 -416
- package/dist/tool-system/builtin/brief.d.ts +0 -6
- package/dist/tool-system/builtin/brief.js +0 -41
- package/dist/tool-system/builtin/check-quota.d.ts +0 -15
- package/dist/tool-system/builtin/check-quota.js +0 -34
- package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
- package/dist/tool-system/builtin/drive-claude-code.js +0 -698
- package/dist/tool-system/builtin/lsp.d.ts +0 -7
- package/dist/tool-system/builtin/lsp.js +0 -144
- package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
- package/dist/tool-system/builtin/notebook-edit.js +0 -127
- package/dist/tool-system/builtin/worktree.d.ts +0 -11
- package/dist/tool-system/builtin/worktree.js +0 -363
- /package/dist/{external-agents → links}/types.js +0 -0
- /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
- /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type SessionBundle, type SessionStateFieldPatch } from "../session/session-manager.js";
|
|
2
|
+
import { type CumulativeUsageCounters } from "../session/usage.js";
|
|
3
|
+
import type { GoalTerminationReason } from "../goal/lifecycle.js";
|
|
4
|
+
import type { Message, TokenUsage } from "../types.js";
|
|
5
|
+
import type { LLMUsageTracker } from "../llm/types.js";
|
|
6
|
+
import type { LLMClientBase } from "../llm/client-base.js";
|
|
7
|
+
import type { HookEventName, HookResult } from "../hooks/events.js";
|
|
8
|
+
import type { TurnLoop } from "./turn-loop.js";
|
|
9
|
+
import type { EngineResult } from "./types.js";
|
|
10
|
+
import type { EngineRunOptions, RunBehaviorProfile } from "./run-types.js";
|
|
11
|
+
type TurnLoopRunResult = Awaited<ReturnType<TurnLoop["run"]>>;
|
|
12
|
+
/** engine.ts:headless 一次性 run 的后台子代理排水循环。 */
|
|
13
|
+
export declare function drainHeadlessBackgroundAgents(args: {
|
|
14
|
+
sid: string;
|
|
15
|
+
session: SessionBundle;
|
|
16
|
+
signal: AbortSignal | undefined;
|
|
17
|
+
initialResult: TurnLoopRunResult;
|
|
18
|
+
runTurnLoop: (messages: Message[]) => Promise<TurnLoopRunResult>;
|
|
19
|
+
applyGoalTermination: (termination: GoalTerminationReason | undefined, round: number | undefined) => void;
|
|
20
|
+
waitForBackgroundAgentChange: (sid: string, signal?: AbortSignal) => Promise<boolean>;
|
|
21
|
+
waitForBackgroundAgentChangeOrTimeout: (sid: string, ms: number) => Promise<boolean>;
|
|
22
|
+
getFirstGoalTermination: () => GoalTerminationReason | undefined;
|
|
23
|
+
setFirstGoalTermination: (t: GoalTerminationReason | undefined) => void;
|
|
24
|
+
}): Promise<TurnLoopRunResult>;
|
|
25
|
+
/** engine.ts:成功路径收尾(缓存/日志/钩子/记忆/标题/终态/结果)。 */
|
|
26
|
+
export declare function finalizeRunSuccess(args: {
|
|
27
|
+
session: SessionBundle;
|
|
28
|
+
result: TurnLoopRunResult;
|
|
29
|
+
firstGoalTermination: GoalTerminationReason | undefined;
|
|
30
|
+
turnCount: number;
|
|
31
|
+
getRunUsage: () => LLMUsageTracker;
|
|
32
|
+
usageBaseline: TokenUsage;
|
|
33
|
+
userContextMsg: Message | null;
|
|
34
|
+
dynamicContextMsg: Message | null;
|
|
35
|
+
setCompactedMessages: (sid: string, messages: Message[]) => void;
|
|
36
|
+
setLastMessages: (messages: Message[]) => void;
|
|
37
|
+
options: EngineRunOptions | undefined;
|
|
38
|
+
emitHook: (event: HookEventName, payload: Record<string, unknown>, signal?: AbortSignal) => Promise<HookResult>;
|
|
39
|
+
cwd: string;
|
|
40
|
+
llmClient: LLMClientBase;
|
|
41
|
+
auxSummaryClient: LLMClientBase;
|
|
42
|
+
recordExternalBilledUsage: (usage: TokenUsage) => CumulativeUsageCounters;
|
|
43
|
+
runMemoryPipeline: (transcript: SessionBundle["transcript"], sessionId: string, cwd: string, llmClient: LLMClientBase, recordExternalBilledUsage: (usage: TokenUsage) => CumulativeUsageCounters) => Promise<void> | void;
|
|
44
|
+
updatePersistedSessionState: (sid: string, patch: SessionStateFieldPatch) => void;
|
|
45
|
+
persistFinalRunState: (state: SessionBundle["state"]) => void;
|
|
46
|
+
markRunAccountingFinalized: () => void;
|
|
47
|
+
costStoreSerialize: (() => Record<string, unknown>) | undefined;
|
|
48
|
+
profile: RunBehaviorProfile | undefined;
|
|
49
|
+
getProfileReportedResults: () => Record<string, unknown> | undefined;
|
|
50
|
+
}): Promise<EngineResult>;
|
|
51
|
+
/** engine.ts catch 体:初始化失败 → model_error 终态 + 错误结果。 */
|
|
52
|
+
export declare function buildRunFailureResult(args: {
|
|
53
|
+
err: unknown;
|
|
54
|
+
session: SessionBundle;
|
|
55
|
+
options: EngineRunOptions | undefined;
|
|
56
|
+
persistFinalRunState: (state: SessionBundle["state"]) => void;
|
|
57
|
+
}): EngineResult;
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run finalize — the headless background-agent drain loop, the success-path
|
|
3
|
+
* epilogue (persistence, hooks, memory pipeline trigger, session title,
|
|
4
|
+
* result assembly) and the initialization-failure terminal result.
|
|
5
|
+
*/
|
|
6
|
+
import { asyncAgentRegistry } from "../tool-system/builtin/agent-registry.js";
|
|
7
|
+
import { buildNotificationMessage, notificationQueue, } from "../tool-system/builtin/agent-notifications.js";
|
|
8
|
+
import { logger } from "../logging/logger.js";
|
|
9
|
+
import { recordSessionEnd } from "../logging/session-recorder.js";
|
|
10
|
+
import { isEphemeralSessionState, } from "../session/session-manager.js";
|
|
11
|
+
import { foldRunUsage } from "../session/usage.js";
|
|
12
|
+
import { buildSessionTitle } from "./session-title.js";
|
|
13
|
+
import { formatFriendlyError } from "./friendly-error.js";
|
|
14
|
+
import { stripInjectedContextMessages } from "./injected-context-cache.js";
|
|
15
|
+
/** engine.ts:headless 一次性 run 的后台子代理排水循环。 */
|
|
16
|
+
export async function drainHeadlessBackgroundAgents(args) {
|
|
17
|
+
const { sid, session } = args;
|
|
18
|
+
let result = args.initialResult;
|
|
19
|
+
let aborted = args.signal?.aborted === true;
|
|
20
|
+
// Loop: a summarize turn can spawn a NEW background sub-agent; keep
|
|
21
|
+
// draining + summarizing until none remain. turnCount accumulates, so
|
|
22
|
+
// the turn-loop's maxTurns still bounds runaway re-summarization.
|
|
23
|
+
for (;;) {
|
|
24
|
+
while (!aborted && asyncAgentRegistry.hasRunningForSession(sid)) {
|
|
25
|
+
aborted = await args.waitForBackgroundAgentChange(sid, args.signal);
|
|
26
|
+
}
|
|
27
|
+
let pending = notificationQueue.drainAll(sid);
|
|
28
|
+
if (aborted && pending.length === 0) {
|
|
29
|
+
// Abort race: an agent calls markCompleted (registry notify) and only
|
|
30
|
+
// THEN enqueue (queue notify) as two separate statements. If the abort
|
|
31
|
+
// fired before that agent's completion `.then` ran, the while above
|
|
32
|
+
// exited on `aborted`, this drainAll caught nothing, and a naive
|
|
33
|
+
// `break` here would drop the agent's output. Give still-settling
|
|
34
|
+
// agents a bounded window to finish enqueuing, then drain once more.
|
|
35
|
+
// Each wait is timeout-bounded so a genuinely stuck (never-completing)
|
|
36
|
+
// agent can't hang abort cleanup forever — we'd rather lose nothing in
|
|
37
|
+
// the common case and not hang in the pathological one.
|
|
38
|
+
for (let i = 0; i < 20 && asyncAgentRegistry.hasRunningForSession(sid); i++) {
|
|
39
|
+
const changed = await args.waitForBackgroundAgentChangeOrTimeout(sid, 25);
|
|
40
|
+
if (!changed)
|
|
41
|
+
break; // timed out with no state change → stop waiting
|
|
42
|
+
}
|
|
43
|
+
pending = notificationQueue.drainAll(sid);
|
|
44
|
+
if (pending.length === 0)
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
else if (pending.length === 0) {
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
const injected = {
|
|
51
|
+
role: "user",
|
|
52
|
+
content: `<system-reminder>\n${buildNotificationMessage(pending)}\n</system-reminder>`,
|
|
53
|
+
};
|
|
54
|
+
if (aborted || args.getFirstGoalTermination()) {
|
|
55
|
+
// Mark injected: a synthetic notification, not the user's own input —
|
|
56
|
+
// the disk reader drops it on replay so no phantom user bubble.
|
|
57
|
+
// A goal termination is also a hard boundary: retain the notification
|
|
58
|
+
// for recovery, but never re-enter TurnLoop (which would reset its
|
|
59
|
+
// run-scoped goal budget tracker and could overwrite the first reason).
|
|
60
|
+
session.transcript.appendMessage(injected.role, injected.content, { injected: true });
|
|
61
|
+
result = { ...result, messages: [...result.messages, injected] };
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
result = await args.runTurnLoop([...result.messages, injected]);
|
|
65
|
+
args.setFirstGoalTermination(args.getFirstGoalTermination() ?? result.goalTermination);
|
|
66
|
+
args.applyGoalTermination(result.goalTermination, result.goalTerminationRound);
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
/** engine.ts:成功路径收尾(缓存/日志/钩子/记忆/标题/终态/结果)。 */
|
|
71
|
+
export async function finalizeRunSuccess(args) {
|
|
72
|
+
const { session, result, firstGoalTermination, turnCount, getRunUsage, usageBaseline, userContextMsg, dynamicContextMsg, options, cwd, llmClient, auxSummaryClient, recordExternalBilledUsage, profile, } = args;
|
|
73
|
+
args.setLastMessages(result.messages);
|
|
74
|
+
const cachedMessages = stripInjectedContextMessages(result.messages, userContextMsg, dynamicContextMsg);
|
|
75
|
+
args.setCompactedMessages(session.state.sessionId, cachedMessages);
|
|
76
|
+
logger.info("engine.done", {
|
|
77
|
+
sessionId: session.state.sessionId,
|
|
78
|
+
reason: result.reason,
|
|
79
|
+
turns: turnCount,
|
|
80
|
+
tokens: getRunUsage().totalTokens,
|
|
81
|
+
});
|
|
82
|
+
recordSessionEnd(session.state.sessionId, {
|
|
83
|
+
reason: result.reason,
|
|
84
|
+
turns: turnCount,
|
|
85
|
+
cost: getRunUsage(),
|
|
86
|
+
});
|
|
87
|
+
// Session-level hook: fired symmetrically with on_session_start once
|
|
88
|
+
// the turn loop has resolved (completion, error, or abort). Handlers
|
|
89
|
+
// are notify-only — any returned messages are dropped because the run
|
|
90
|
+
// is already over and there's no next turn to inject into.
|
|
91
|
+
await args.emitHook("on_session_end", {
|
|
92
|
+
sessionId: session.state.sessionId,
|
|
93
|
+
reason: result.reason,
|
|
94
|
+
turnCount,
|
|
95
|
+
}, options?.signal);
|
|
96
|
+
// Ephemeral side chats must never leak into durable memory, even after
|
|
97
|
+
// the user explicitly elevates tool permissions for a turn. Lifecycle
|
|
98
|
+
// isolation is independent of the run-scoped behavior/permission mode.
|
|
99
|
+
if (!isEphemeralSessionState(session.state)) {
|
|
100
|
+
// Fire-and-forget memory pipeline: extract durable memories from the
|
|
101
|
+
// transcript, save a session summary, and conditionally trigger
|
|
102
|
+
// auto-dream consolidation. Doesn't block the Engine result.
|
|
103
|
+
void args.runMemoryPipeline(session.transcript, session.state.sessionId, cwd, llmClient, recordExternalBilledUsage);
|
|
104
|
+
}
|
|
105
|
+
// Fire-and-forget session title generation — only after the FIRST turn.
|
|
106
|
+
// Reuses the already-resolved auxSummaryClient (aux model, cheap). Best-
|
|
107
|
+
// effort: failures never touch the run result. The renderer writes the
|
|
108
|
+
// title into the sidebar on receipt of the session_title stream event.
|
|
109
|
+
{
|
|
110
|
+
const messageEvents = session.transcript.getEvents("message");
|
|
111
|
+
const userMsgEvents = messageEvents.filter((e) => e.data.role === "user");
|
|
112
|
+
const userMsgCount = userMsgEvents.length;
|
|
113
|
+
const onStream = options?.onStream;
|
|
114
|
+
if (userMsgCount === 1 && onStream && result.text) {
|
|
115
|
+
const sessionId = session.state.sessionId;
|
|
116
|
+
const rawContent = userMsgEvents[0]?.data?.content;
|
|
117
|
+
const firstUserText = typeof rawContent === "string" ? rawContent : JSON.stringify(rawContent ?? "");
|
|
118
|
+
void buildSessionTitle(auxSummaryClient, firstUserText, result.text, recordExternalBilledUsage)
|
|
119
|
+
.then((title) => {
|
|
120
|
+
if (title) {
|
|
121
|
+
// Persist the title so it survives a localStorage wipe / disk
|
|
122
|
+
// rebuild — it used to live only in the renderer's localStorage
|
|
123
|
+
// index. Read the latest persisted state at callback time and
|
|
124
|
+
// merge only title; the completed run's session.state snapshot
|
|
125
|
+
// may already be stale after later serial session updates.
|
|
126
|
+
args.updatePersistedSessionState(sessionId, { title });
|
|
127
|
+
onStream({
|
|
128
|
+
type: "session_title",
|
|
129
|
+
sessionId,
|
|
130
|
+
title,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
})
|
|
134
|
+
.catch(() => { });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Update session state. Persist the raw terminal reason as the status so
|
|
138
|
+
// callers can distinguish user-cancelled (aborted_streaming) from real
|
|
139
|
+
// failures (model_error, prompt_too_long, ...) — previously every
|
|
140
|
+
// non-completed outcome collapsed to "errored", which threw away the
|
|
141
|
+
// distinction and misled anyone reading state.json.
|
|
142
|
+
const transcriptFlushFailed = session.transcript.flushFailed();
|
|
143
|
+
if (transcriptFlushFailed) {
|
|
144
|
+
const failure = session.transcript.getFlushFailure();
|
|
145
|
+
logger.error("engine.transcript_persistence_failed", {
|
|
146
|
+
sessionId: session.state.sessionId,
|
|
147
|
+
terminalReason: result.reason,
|
|
148
|
+
degraded: true,
|
|
149
|
+
...failure,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
options?.onAgentProgress?.({ type: "phase", phase: "finalizing" });
|
|
153
|
+
session.state.turnCount = turnCount;
|
|
154
|
+
session.state.status = result.reason;
|
|
155
|
+
if (result.reason === "completed" && result.completionKind) {
|
|
156
|
+
session.state.lastCompletionKind = result.completionKind;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
delete session.state.lastCompletionKind;
|
|
160
|
+
}
|
|
161
|
+
if (result.reason === "completed") {
|
|
162
|
+
session.state.completedSnapshotVersion = 1;
|
|
163
|
+
if (!transcriptFlushFailed) {
|
|
164
|
+
session.state.completedThroughEventId = session.transcript.getEvents().at(-1)?.id;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Session-cumulative (baseline + this run) for persistence...
|
|
168
|
+
const usage = getRunUsage();
|
|
169
|
+
session.state.tokenUsage = foldRunUsage(usageBaseline, usage);
|
|
170
|
+
if (args.costStoreSerialize) {
|
|
171
|
+
session.state.costState = args.costStoreSerialize();
|
|
172
|
+
}
|
|
173
|
+
args.persistFinalRunState(session.state);
|
|
174
|
+
args.markRunAccountingFinalized();
|
|
175
|
+
// Hook: agent end
|
|
176
|
+
await args.emitHook("on_agent_end", {
|
|
177
|
+
sessionId: session.state.sessionId,
|
|
178
|
+
reason: result.reason,
|
|
179
|
+
turnCount,
|
|
180
|
+
}, options?.signal);
|
|
181
|
+
// Emit completion
|
|
182
|
+
options?.onStream?.({
|
|
183
|
+
type: "turn_complete",
|
|
184
|
+
reason: result.reason,
|
|
185
|
+
...(result.completionKind ? { completionKind: result.completionKind } : {}),
|
|
186
|
+
});
|
|
187
|
+
// Structured results the active profile's run services reported, keyed
|
|
188
|
+
// by profile id. petWorkDelegation stays as a compat mirror of
|
|
189
|
+
// extensions.pet?.workDelegation until pet-aware hosts migrate.
|
|
190
|
+
const profileReportedResults = args.getProfileReportedResults();
|
|
191
|
+
const runExtensions = profile && profileReportedResults ? { [profile.id]: profileReportedResults } : undefined;
|
|
192
|
+
const petWorkDelegationMirror = runExtensions?.pet?.workDelegation;
|
|
193
|
+
return {
|
|
194
|
+
text: result.text,
|
|
195
|
+
reason: result.reason,
|
|
196
|
+
goalTermination: firstGoalTermination,
|
|
197
|
+
sessionId: session.state.sessionId,
|
|
198
|
+
turnCount,
|
|
199
|
+
usage: {
|
|
200
|
+
promptTokens: usage.totalPromptTokens,
|
|
201
|
+
completionTokens: usage.totalCompletionTokens,
|
|
202
|
+
totalTokens: usage.totalTokens,
|
|
203
|
+
cacheReadTokens: usage.totalCacheReadTokens,
|
|
204
|
+
cacheCreationTokens: usage.totalCacheCreationTokens,
|
|
205
|
+
},
|
|
206
|
+
...(runExtensions ? { extensions: runExtensions } : {}),
|
|
207
|
+
...(petWorkDelegationMirror ? { petWorkDelegation: petWorkDelegationMirror } : {}),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/** engine.ts catch 体:初始化失败 → model_error 终态 + 错误结果。 */
|
|
211
|
+
export function buildRunFailureResult(args) {
|
|
212
|
+
const { err, session, options } = args;
|
|
213
|
+
// The session is already persisted as active before runWithSid starts.
|
|
214
|
+
// Initialization failures (client creation, MCP connection, prompt/hooks)
|
|
215
|
+
// therefore need the same terminal lifecycle treatment as turn-loop errors.
|
|
216
|
+
const error = formatFriendlyError(err);
|
|
217
|
+
session.state.status = "model_error";
|
|
218
|
+
delete session.state.lastCompletionKind;
|
|
219
|
+
args.persistFinalRunState(session.state);
|
|
220
|
+
session.transcript.appendError(error, { phase: "initialization" });
|
|
221
|
+
logger.error("engine.run_lifecycle_failed", {
|
|
222
|
+
sessionId: session.state.sessionId,
|
|
223
|
+
error: err instanceof Error ? err.message : String(err),
|
|
224
|
+
});
|
|
225
|
+
recordSessionEnd(session.state.sessionId, {
|
|
226
|
+
reason: "model_error",
|
|
227
|
+
turns: session.state.turnCount,
|
|
228
|
+
});
|
|
229
|
+
options?.onStream?.({ type: "error", error });
|
|
230
|
+
options?.onStream?.({ type: "turn_complete", reason: "model_error" });
|
|
231
|
+
const usage = session.state.tokenUsage;
|
|
232
|
+
return {
|
|
233
|
+
text: `ERROR: ${error}`,
|
|
234
|
+
reason: "model_error",
|
|
235
|
+
sessionId: session.state.sessionId,
|
|
236
|
+
turnCount: session.state.turnCount,
|
|
237
|
+
usage: {
|
|
238
|
+
promptTokens: usage.promptTokens ?? 0,
|
|
239
|
+
completionTokens: usage.completionTokens ?? 0,
|
|
240
|
+
totalTokens: usage.totalTokens ?? 0,
|
|
241
|
+
cacheReadTokens: usage.cacheReadTokens ?? 0,
|
|
242
|
+
cacheCreationTokens: usage.cacheCreationTokens ?? 0,
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { StreamCallback, TokenUsage } from "../types.js";
|
|
2
|
+
import { type GoalConfig, type GoalTerminationReason, type PersistedGoalTerminationReason } from "../goal/lifecycle.js";
|
|
3
|
+
import { createGoalStopHook, type GoalJudgeRuntimeContext } from "../hooks/goal-stop-hook.js";
|
|
4
|
+
import type { HookRegistry } from "../hooks/registry.js";
|
|
5
|
+
import type { LLMClientBase } from "../llm/client-base.js";
|
|
6
|
+
import type { GoalTerminalSaveOutcome, SessionBundle, SessionManager } from "../session/session-manager.js";
|
|
7
|
+
import type { TurnLoop } from "./turn-loop.js";
|
|
8
|
+
import type { EngineConfig } from "./types.js";
|
|
9
|
+
import type { EngineRunOptions } from "./run-types.js";
|
|
10
|
+
export type GoalStopHookHandler = ReturnType<typeof createGoalStopHook>;
|
|
11
|
+
export interface GoalRunSlots {
|
|
12
|
+
getActiveRuntimeGoal(): GoalConfig | null;
|
|
13
|
+
setActiveRuntimeGoal(goal: GoalConfig | null): void;
|
|
14
|
+
getActivePersistedRunGoal(): GoalConfig | null;
|
|
15
|
+
setActivePersistedRunGoal(goal: GoalConfig | null): void;
|
|
16
|
+
getActiveGoalHook(): GoalStopHookHandler | null;
|
|
17
|
+
setActiveGoalHook(hook: GoalStopHookHandler | null): void;
|
|
18
|
+
setActiveGoalHookAttached(attached: boolean): void;
|
|
19
|
+
}
|
|
20
|
+
/** engine.ts:explicit/stored/fallback 归一化 + 持久化 + goal_set 事件。 */
|
|
21
|
+
export declare function resolveRunGoal(args: {
|
|
22
|
+
options: EngineRunOptions | undefined;
|
|
23
|
+
session: SessionBundle;
|
|
24
|
+
sessionManager: Pick<SessionManager, "saveActiveGoal">;
|
|
25
|
+
configGoal: EngineConfig["goal"];
|
|
26
|
+
isSubAgent: boolean;
|
|
27
|
+
sid: string;
|
|
28
|
+
onStream: StreamCallback | undefined;
|
|
29
|
+
}): {
|
|
30
|
+
normalizedGoal: GoalConfig | undefined;
|
|
31
|
+
persistedRunGoal: GoalConfig | undefined;
|
|
32
|
+
};
|
|
33
|
+
/** engine.ts:GoalStopHook 创建 + 注册 + 槽位登记。 */
|
|
34
|
+
export declare function armRunGoalHook(args: {
|
|
35
|
+
slots: GoalRunSlots;
|
|
36
|
+
hooks: HookRegistry;
|
|
37
|
+
llmClient: LLMClientBase;
|
|
38
|
+
isSubAgent: boolean;
|
|
39
|
+
normalizedGoal: GoalConfig | undefined;
|
|
40
|
+
persistedRunGoal: GoalConfig | undefined;
|
|
41
|
+
session: SessionBundle;
|
|
42
|
+
sessionManager: Pick<SessionManager, "markGoalWaiting" | "readActiveGoal">;
|
|
43
|
+
persistGoalTerminal: (state: SessionBundle["state"], goal: GoalConfig, reason: PersistedGoalTerminationReason) => boolean;
|
|
44
|
+
getJudgeContext: () => GoalJudgeRuntimeContext | undefined;
|
|
45
|
+
recordCumulativeUsage: (usage: TokenUsage) => unknown;
|
|
46
|
+
recordGoalJudgeUsage: (usage: TokenUsage | undefined) => ReturnType<TurnLoop["recordGoalJudgeUsage"]>;
|
|
47
|
+
}): GoalStopHookHandler | null;
|
|
48
|
+
/** engine.ts:goal 终态落盘 + 事件 + 钩子摘除(闭包工厂)。 */
|
|
49
|
+
export declare function createGoalTerminationApplier(args: {
|
|
50
|
+
slots: GoalRunSlots;
|
|
51
|
+
hooks: HookRegistry;
|
|
52
|
+
session: SessionBundle;
|
|
53
|
+
persistedRunGoal: GoalConfig | undefined;
|
|
54
|
+
goalHookHandler: GoalStopHookHandler | null;
|
|
55
|
+
persistGoalTerminalOutcome: (state: SessionBundle["state"], goal: GoalConfig, termination: PersistedGoalTerminationReason) => GoalTerminalSaveOutcome;
|
|
56
|
+
readActiveGoal: (sid: string) => GoalConfig | undefined | null;
|
|
57
|
+
onStream: StreamCallback | undefined;
|
|
58
|
+
}): (termination: GoalTerminationReason | undefined, round: number | undefined) => void;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run goal — persistent-goal resolution (explicit > stored > config default),
|
|
3
|
+
* arming the GoalStopHook for the run, and the terminal-outcome applier.
|
|
4
|
+
* Engine keeps ownership of its active-goal slots via GoalRunSlots.
|
|
5
|
+
*/
|
|
6
|
+
import { randomUUID } from "node:crypto";
|
|
7
|
+
import { normalizeGoal, resolveGoalSetAt, goalConfigFromLifecycle, isGoalLifecycleCurrent, isSameGoalVersion, } from "../goal/lifecycle.js";
|
|
8
|
+
import { createGoalStopHook } from "../hooks/goal-stop-hook.js";
|
|
9
|
+
import { logger } from "../logging/logger.js";
|
|
10
|
+
/** engine.ts:explicit/stored/fallback 归一化 + 持久化 + goal_set 事件。 */
|
|
11
|
+
export function resolveRunGoal(args) {
|
|
12
|
+
const { options, session, sessionManager, configGoal, isSubAgent, sid, onStream } = args;
|
|
13
|
+
const explicitGoal = normalizeGoal(options?.goal);
|
|
14
|
+
const storedLifecycle = session.state.goalLifecycle;
|
|
15
|
+
const storedGoal = isSubAgent !== true && storedLifecycle && isGoalLifecycleCurrent(storedLifecycle)
|
|
16
|
+
? goalConfigFromLifecycle(storedLifecycle)
|
|
17
|
+
: undefined;
|
|
18
|
+
if (storedGoal &&
|
|
19
|
+
!explicitGoal &&
|
|
20
|
+
session.state.goalLifecycle?.phase === "waiting" &&
|
|
21
|
+
!sessionManager.saveActiveGoal(session.state, storedGoal)) {
|
|
22
|
+
throw new Error(`Failed to arm waiting goal for session ${sid}`);
|
|
23
|
+
}
|
|
24
|
+
if (explicitGoal && isSubAgent !== true) {
|
|
25
|
+
// Supplying a goal on a run is an explicit arm/resume operation.
|
|
26
|
+
delete explicitGoal.paused;
|
|
27
|
+
const replaced = !!storedGoal && storedGoal.objective !== explicitGoal.objective;
|
|
28
|
+
// Stamp WHEN this goal was set so the judge can anchor relative deadlines
|
|
29
|
+
// ("做到3点") to the set time, not "now" — else once the clock passes the
|
|
30
|
+
// deadline the judge could read "3点" as tomorrow's and never stop. A new
|
|
31
|
+
// or changed objective gets a fresh stamp; re-sending the SAME objective
|
|
32
|
+
// keeps the original anchor (the goal continues, the user didn't restate a
|
|
33
|
+
// new deadline). User input never carries setAtMs, so we set it here.
|
|
34
|
+
const resolvedSetAt = resolveGoalSetAt(explicitGoal.objective, storedGoal, Date.now());
|
|
35
|
+
explicitGoal.setAtMs = resolvedSetAt;
|
|
36
|
+
explicitGoal.goalId = randomUUID();
|
|
37
|
+
explicitGoal.revision = 1;
|
|
38
|
+
if (!sessionManager.saveActiveGoal(session.state, explicitGoal, {
|
|
39
|
+
replaceCurrent: storedGoal !== undefined,
|
|
40
|
+
})) {
|
|
41
|
+
throw new Error(`Failed to persist active goal for session ${sid}`);
|
|
42
|
+
}
|
|
43
|
+
onStream?.({
|
|
44
|
+
type: "goal_set",
|
|
45
|
+
goalId: explicitGoal.goalId,
|
|
46
|
+
revision: explicitGoal.revision,
|
|
47
|
+
objective: explicitGoal.objective,
|
|
48
|
+
replaced,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const fallbackGoal = normalizeGoal(configGoal);
|
|
52
|
+
if (fallbackGoal && !fallbackGoal.goalId)
|
|
53
|
+
fallbackGoal.goalId = randomUUID();
|
|
54
|
+
if (fallbackGoal && !fallbackGoal.revision)
|
|
55
|
+
fallbackGoal.revision = 1;
|
|
56
|
+
const normalizedGoal = explicitGoal ??
|
|
57
|
+
(storedGoal?.paused === true ? undefined : storedGoal) ??
|
|
58
|
+
(fallbackGoal?.paused === true ? undefined : fallbackGoal);
|
|
59
|
+
// Snapshot the persisted goal identity owned by THIS run. Terminal
|
|
60
|
+
// cleanup compares against this immutable copy so an old run cannot
|
|
61
|
+
// delete a replacement goal installed while it was finishing.
|
|
62
|
+
const persistedRunGoal = normalizedGoal &&
|
|
63
|
+
session.state.goalLifecycle &&
|
|
64
|
+
isGoalLifecycleCurrent(session.state.goalLifecycle) &&
|
|
65
|
+
isSameGoalVersion(goalConfigFromLifecycle(session.state.goalLifecycle), normalizedGoal)
|
|
66
|
+
? { ...normalizedGoal }
|
|
67
|
+
: undefined;
|
|
68
|
+
return { normalizedGoal, persistedRunGoal };
|
|
69
|
+
}
|
|
70
|
+
/** engine.ts:GoalStopHook 创建 + 注册 + 槽位登记。 */
|
|
71
|
+
export function armRunGoalHook(args) {
|
|
72
|
+
const { slots, hooks, llmClient, isSubAgent, normalizedGoal, persistedRunGoal, session, sessionManager, persistGoalTerminal, getJudgeContext, recordCumulativeUsage, recordGoalJudgeUsage, } = args;
|
|
73
|
+
let goalHookHandler = null;
|
|
74
|
+
if (isSubAgent !== true) {
|
|
75
|
+
// Keep a dormant hook even when this ordinary run inherited a paused
|
|
76
|
+
// persisted goal. A mid-run Resume can then arm Goal mode at the same
|
|
77
|
+
// safe step boundary as Steer instead of waiting for another submit.
|
|
78
|
+
slots.setActiveRuntimeGoal(normalizedGoal ?? null);
|
|
79
|
+
slots.setActivePersistedRunGoal(persistedRunGoal ?? null);
|
|
80
|
+
goalHookHandler = createGoalStopHook({
|
|
81
|
+
goal: normalizedGoal,
|
|
82
|
+
getGoal: () => slots.getActiveRuntimeGoal() ?? undefined,
|
|
83
|
+
llm: llmClient,
|
|
84
|
+
log: logger,
|
|
85
|
+
getJudgeContext: () => getJudgeContext(),
|
|
86
|
+
onJudgeUsage: (usage) => {
|
|
87
|
+
// The provider records this request into llmClient.getUsage() and the
|
|
88
|
+
// process-wide CostTracker. This separate callback feeds the session
|
|
89
|
+
// cumulative cache counters and the live Goal hard-budget tracker.
|
|
90
|
+
if (usage)
|
|
91
|
+
recordCumulativeUsage(usage);
|
|
92
|
+
// Charge the request even if an edit landed while the judge was
|
|
93
|
+
// awaiting its response. Revision fencing suppresses the old
|
|
94
|
+
// verdict, not the provider cost; otherwise repeated edits can
|
|
95
|
+
// bypass the Goal hard budget.
|
|
96
|
+
return recordGoalJudgeUsage(usage);
|
|
97
|
+
},
|
|
98
|
+
// Clear the persisted active goal the moment the judge says it's met,
|
|
99
|
+
// so a later bare send doesn't re-inherit a satisfied goal. The hook
|
|
100
|
+
// calls this from inside its met branch (single source of truth for
|
|
101
|
+
// "goal achieved"); engine owns the persistence side-effect.
|
|
102
|
+
onMet: () => {
|
|
103
|
+
const runGoal = slots.getActivePersistedRunGoal() ?? persistedRunGoal;
|
|
104
|
+
return runGoal ? persistGoalTerminal(session.state, runGoal, "completed") : true;
|
|
105
|
+
},
|
|
106
|
+
onWaiting: () => {
|
|
107
|
+
const runGoal = slots.getActivePersistedRunGoal() ?? persistedRunGoal;
|
|
108
|
+
return runGoal ? sessionManager.markGoalWaiting(session.state, runGoal) : true;
|
|
109
|
+
},
|
|
110
|
+
// Re-read the persisted goal each turn so a mid-run 清除 (clearGoal
|
|
111
|
+
// wrote state.json but this hook's frozen goal copy + the closure's
|
|
112
|
+
// in-RAM session are untouched) actually stops the judge. Reads disk
|
|
113
|
+
// via readActiveGoal — authoritative and independent of which session
|
|
114
|
+
// instance the run closure holds.
|
|
115
|
+
isGoalActive: (sid) => {
|
|
116
|
+
const runtimeGoal = slots.getActiveRuntimeGoal();
|
|
117
|
+
if (!runtimeGoal)
|
|
118
|
+
return false;
|
|
119
|
+
// A config-only Goal has no disk record to re-check.
|
|
120
|
+
if (!slots.getActivePersistedRunGoal())
|
|
121
|
+
return true;
|
|
122
|
+
const liveGoal = sessionManager.readActiveGoal(sid);
|
|
123
|
+
return liveGoal?.paused !== true && isSameGoalVersion(liveGoal, runtimeGoal);
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
if (normalizedGoal) {
|
|
127
|
+
hooks.register("on_stop", goalHookHandler, 0, "goal-stop");
|
|
128
|
+
slots.setActiveGoalHookAttached(true);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
slots.setActiveGoalHookAttached(false);
|
|
132
|
+
}
|
|
133
|
+
// Expose for edit/pause/resume/delete mid-run. Already guarded by
|
|
134
|
+
// isSubAgent above.
|
|
135
|
+
slots.setActiveGoalHook(goalHookHandler);
|
|
136
|
+
}
|
|
137
|
+
return goalHookHandler;
|
|
138
|
+
}
|
|
139
|
+
/** engine.ts:goal 终态落盘 + 事件 + 钩子摘除(闭包工厂)。 */
|
|
140
|
+
export function createGoalTerminationApplier(args) {
|
|
141
|
+
const { slots, hooks, session, persistedRunGoal, goalHookHandler, persistGoalTerminalOutcome, readActiveGoal, onStream, } = args;
|
|
142
|
+
return (termination, round) => {
|
|
143
|
+
const runGoal = slots.getActivePersistedRunGoal() ?? persistedRunGoal;
|
|
144
|
+
if (!termination || !runGoal)
|
|
145
|
+
return;
|
|
146
|
+
// Judge prompt overflow ends only this run. The objective is unfinished
|
|
147
|
+
// and may be resumed after the user reduces fixed judge context, so it
|
|
148
|
+
// must not get a terminal tombstone or be cleared from activeGoal.
|
|
149
|
+
if (termination === "judge_prompt_too_large")
|
|
150
|
+
return;
|
|
151
|
+
const outcome = persistGoalTerminalOutcome(session.state, runGoal, termination);
|
|
152
|
+
if (outcome === "failed") {
|
|
153
|
+
// No terminal event has been published. Re-assert the authoritative
|
|
154
|
+
// active Goal in case another optimistic control changed the client.
|
|
155
|
+
const authoritative = readActiveGoal(session.state.sessionId);
|
|
156
|
+
if (authoritative) {
|
|
157
|
+
onStream?.({
|
|
158
|
+
type: "goal_updated",
|
|
159
|
+
goalId: authoritative.goalId,
|
|
160
|
+
revision: authoritative.revision,
|
|
161
|
+
objective: authoritative.objective,
|
|
162
|
+
paused: authoritative.paused === true,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
if (outcome === "persisted") {
|
|
168
|
+
// The durable terminal transition is the publication barrier: clients
|
|
169
|
+
// must never observe an exhausted Goal that does not exist on disk.
|
|
170
|
+
onStream?.({
|
|
171
|
+
type: "goal_progress",
|
|
172
|
+
goalId: runGoal.goalId,
|
|
173
|
+
revision: runGoal.revision,
|
|
174
|
+
status: "exhausted",
|
|
175
|
+
round: round ?? 0,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
if (goalHookHandler) {
|
|
179
|
+
hooks.unregister("on_stop", goalHookHandler);
|
|
180
|
+
if (slots.getActiveGoalHook() === goalHookHandler) {
|
|
181
|
+
slots.setActiveGoalHook(null);
|
|
182
|
+
slots.setActiveGoalHookAttached(false);
|
|
183
|
+
slots.setActiveRuntimeGoal(null);
|
|
184
|
+
slots.setActivePersistedRunGoal(null);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { InputAttachmentMeta } from "../
|
|
1
|
+
import type { InputAttachmentMeta } from "../types.js";
|
|
2
2
|
import type { ContentBlock, LLMConfig } from "../types.js";
|
|
3
3
|
import { type ParsedTask } from "./parse-task.js";
|
|
4
4
|
import type { EngineResult } from "./types.js";
|
|
@@ -76,9 +76,11 @@ export async function prepareRunImageInput(args) {
|
|
|
76
76
|
parsedTask = {
|
|
77
77
|
text: [parsedTask.text, attachmentContext.text].filter(Boolean).join("\n\n"),
|
|
78
78
|
images: [...parsedTask.images, ...attachmentContext.images],
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
// A structured image attachment can intentionally degrade to textual
|
|
80
|
+
// metadata when the selected model has no vision support. Only actual
|
|
81
|
+
// image bytes require the vision gate below; the on-disk path remains
|
|
82
|
+
// useful to file-oriented tools and delegated Work Sessions.
|
|
83
|
+
hasImages: parsedTask.hasImages || attachmentContext.images.length > 0,
|
|
82
84
|
};
|
|
83
85
|
}
|
|
84
86
|
if (parsedTask.hasImages) {
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Message, SessionKind } from "../types.js";
|
|
2
|
+
import type { SessionBundle, SessionManager } from "../session/session-manager.js";
|
|
3
|
+
import type { ParsedTask } from "./parse-task.js";
|
|
4
|
+
import type { buildRunUserMessageContent } from "./run-image-input.js";
|
|
5
|
+
import type { EngineConfig, EngineResult } from "./types.js";
|
|
6
|
+
import type { EngineRunOptions } from "./run-types.js";
|
|
7
|
+
export interface OpenRunSessionArgs {
|
|
8
|
+
sessionManager: SessionManager;
|
|
9
|
+
options: EngineRunOptions | undefined;
|
|
10
|
+
parsedTask: ParsedTask;
|
|
11
|
+
taskText: string;
|
|
12
|
+
userMessageContent: ReturnType<typeof buildRunUserMessageContent>;
|
|
13
|
+
cwd: string;
|
|
14
|
+
sessionKind: SessionKind;
|
|
15
|
+
sessionWorkspaceProfile: string | undefined;
|
|
16
|
+
/** Standing brief resent by the host each turn until the Session persists it. */
|
|
17
|
+
sessionBrief?: string;
|
|
18
|
+
llmModel: string;
|
|
19
|
+
llmProvider: string;
|
|
20
|
+
isSubAgent: boolean;
|
|
21
|
+
origin: EngineConfig["origin"];
|
|
22
|
+
costStore: EngineConfig["costStore"];
|
|
23
|
+
cachedCompactedMessages: Message[] | undefined;
|
|
24
|
+
onAgentDirectionsDelivered: ((envelopeIds: NonNullable<EngineRunOptions["agentDirection"]>["envelopeIds"]) => void) | undefined;
|
|
25
|
+
}
|
|
26
|
+
export interface OpenedRunSession {
|
|
27
|
+
session: SessionBundle;
|
|
28
|
+
messages: Message[];
|
|
29
|
+
freshImageMessage: Message | undefined;
|
|
30
|
+
resumedFromDisk: boolean;
|
|
31
|
+
claimClientMessageId: (bundle: SessionBundle, clientMessageId: string | undefined, source: "submit" | "steer") => boolean;
|
|
32
|
+
releaseClientMessageId: (clientMessageId: string) => void;
|
|
33
|
+
}
|
|
34
|
+
export type OpenRunSessionResult = {
|
|
35
|
+
ok: true;
|
|
36
|
+
opened: OpenedRunSession;
|
|
37
|
+
} | {
|
|
38
|
+
ok: false;
|
|
39
|
+
result: EngineResult;
|
|
40
|
+
};
|
|
41
|
+
export declare function openRunSession(args: OpenRunSessionArgs): OpenRunSessionResult;
|