@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,11 @@
|
|
|
1
|
+
import type { HookRegistry } from "../hooks/registry.js";
|
|
2
|
+
import type { RunScopedDisposer } from "./run-types.js";
|
|
3
|
+
import type { CapabilityFileHistoryContribution } from "../capabilities/index.js";
|
|
4
|
+
export interface RegisterFileHistoryHookOptions {
|
|
5
|
+
hooks: Pick<HookRegistry, "register" | "unregister">;
|
|
6
|
+
sessionDir: string;
|
|
7
|
+
cwd: string;
|
|
8
|
+
getTurnSeq: () => number | undefined;
|
|
9
|
+
contributions?: readonly CapabilityFileHistoryContribution[];
|
|
10
|
+
}
|
|
11
|
+
export declare function registerFileHistoryHook(options: RegisterFileHistoryHookOptions): RunScopedDisposer;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { FileHistory } from "../session/file-history.js";
|
|
2
|
+
export function registerFileHistoryHook(options) {
|
|
3
|
+
const history = FileHistory.loadFromDir(options.sessionDir);
|
|
4
|
+
const handler = async (context) => {
|
|
5
|
+
const toolName = context.data?.toolName;
|
|
6
|
+
const args = context.data?.args;
|
|
7
|
+
const turnSeq = options.getTurnSeq();
|
|
8
|
+
if ((toolName === "Write" || toolName === "Edit") && typeof args?.file_path === "string") {
|
|
9
|
+
if (history.saveSnapshot(args.file_path, turnSeq) === null && turnSeq !== undefined) {
|
|
10
|
+
history.recordCreated(args.file_path, turnSeq);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
else if (args) {
|
|
14
|
+
const contribution = options.contributions?.find((item) => item.toolName === toolName);
|
|
15
|
+
for (const target of contribution?.resolveTargets(args, options.cwd) ?? []) {
|
|
16
|
+
history.saveSnapshot(target, turnSeq);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return {};
|
|
20
|
+
};
|
|
21
|
+
options.hooks.register("on_tool_start", handler, 100, "file_history_backup");
|
|
22
|
+
let disposed = false;
|
|
23
|
+
return {
|
|
24
|
+
dispose() {
|
|
25
|
+
if (disposed)
|
|
26
|
+
return;
|
|
27
|
+
disposed = true;
|
|
28
|
+
options.hooks.unregister("on_tool_start", handler);
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { GoalJudgeRuntimeContext } from "../hooks/goal-stop-hook.js";
|
|
2
|
+
import type { Message } from "../types.js";
|
|
3
|
+
export interface BuildGoalJudgeContextOptions {
|
|
4
|
+
maxRounds?: number;
|
|
5
|
+
maxEstimatedTokens?: number;
|
|
6
|
+
maxChars?: number;
|
|
7
|
+
sensitiveToolResultRedactions?: ReadonlyMap<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export declare function buildGoalJudgeRuntimeContext(messages: readonly Message[], options?: BuildGoalJudgeContextOptions): GoalJudgeRuntimeContext;
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { estimateTokens, groupMessagesByApiRound } from "../context/compaction.js";
|
|
3
|
+
import { sanitizeMessages } from "../logging/sanitize-messages.js";
|
|
4
|
+
import { scrubSecrets, scrubSecretValue } from "../utils/secret-scrubber.js";
|
|
5
|
+
const DEFAULT_MAX_ROUNDS = 6;
|
|
6
|
+
const DEFAULT_MAX_ESTIMATED_TOKENS = 3_000;
|
|
7
|
+
const DEFAULT_MAX_CHARS = 12_000;
|
|
8
|
+
function sanitizeNestedBlocks(blocks) {
|
|
9
|
+
return blocks.map((block) => {
|
|
10
|
+
if (block.type === "reasoning") {
|
|
11
|
+
return { type: "reasoning", text: "[reasoning omitted]" };
|
|
12
|
+
}
|
|
13
|
+
if (block.type === "image" && block.source?.type === "base64") {
|
|
14
|
+
return {
|
|
15
|
+
type: "image",
|
|
16
|
+
source: {
|
|
17
|
+
type: "base64",
|
|
18
|
+
media_type: block.source.media_type,
|
|
19
|
+
bytes: block.source.data?.length ?? 0,
|
|
20
|
+
omitted: true,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (block.type === "tool_result" && Array.isArray(block.content)) {
|
|
25
|
+
return scrubSecretValue({
|
|
26
|
+
...block,
|
|
27
|
+
content: sanitizeNestedBlocks(block.content),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return scrubSecretValue({ ...block });
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function sanitizeConversation(messages, sensitiveToolResultRedactions) {
|
|
34
|
+
return sanitizeMessages(messages, { sensitiveToolResultRedactions }).map((message) => ({
|
|
35
|
+
...message,
|
|
36
|
+
content: typeof message.content === "string"
|
|
37
|
+
? scrubSecrets(message.content)
|
|
38
|
+
: sanitizeNestedBlocks(message.content),
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
function stableJson(value) {
|
|
42
|
+
if (Array.isArray(value))
|
|
43
|
+
return `[${value.map(stableJson).join(",")}]`;
|
|
44
|
+
if (value && typeof value === "object") {
|
|
45
|
+
return `{${Object.entries(value)
|
|
46
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
47
|
+
.map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)
|
|
48
|
+
.join(",")}}`;
|
|
49
|
+
}
|
|
50
|
+
const serialized = JSON.stringify(value);
|
|
51
|
+
return serialized === undefined ? "null" : serialized;
|
|
52
|
+
}
|
|
53
|
+
function renderBlock(block, role) {
|
|
54
|
+
const roleLabel = role.toUpperCase();
|
|
55
|
+
if (block.type === "text")
|
|
56
|
+
return `${roleLabel}:\n${block.text ?? ""}`;
|
|
57
|
+
if (block.type === "reasoning")
|
|
58
|
+
return `${roleLabel}:\n[reasoning omitted]`;
|
|
59
|
+
if (block.type === "tool_use") {
|
|
60
|
+
return `${roleLabel} TOOL_USE id=${block.id ?? "(missing)"} name=${block.name ?? "(missing)"} input=${stableJson(block.input ?? {})}`;
|
|
61
|
+
}
|
|
62
|
+
if (block.type === "tool_result") {
|
|
63
|
+
const content = Array.isArray(block.content)
|
|
64
|
+
? block.content.map((entry) => renderBlock(entry, role)).join("\n")
|
|
65
|
+
: (block.content ?? "");
|
|
66
|
+
return `TOOL_RESULT tool_use_id=${block.tool_use_id ?? "(missing)"} error=${block.is_error === true}:\n${content}`;
|
|
67
|
+
}
|
|
68
|
+
if (block.type === "image") {
|
|
69
|
+
const source = block.source;
|
|
70
|
+
return `${roleLabel} IMAGE media_type=${source?.media_type ?? "unknown"} bytes=${source?.bytes ?? 0} omitted=true`;
|
|
71
|
+
}
|
|
72
|
+
return `${roleLabel}:\n[unsupported content omitted]`;
|
|
73
|
+
}
|
|
74
|
+
function renderConversation(rounds) {
|
|
75
|
+
if (rounds.length === 0)
|
|
76
|
+
return "(无最近对话)";
|
|
77
|
+
return rounds
|
|
78
|
+
.map((round, index) => {
|
|
79
|
+
const renderedMessages = round.map((message) => {
|
|
80
|
+
if (typeof message.content === "string") {
|
|
81
|
+
return `${message.role.toUpperCase()}:\n${message.content}`;
|
|
82
|
+
}
|
|
83
|
+
return message.content.map((block) => renderBlock(block, message.role)).join("\n");
|
|
84
|
+
});
|
|
85
|
+
return `[round ${index + 1}]\n${renderedMessages.join("\n")}`;
|
|
86
|
+
})
|
|
87
|
+
.join("\n\n");
|
|
88
|
+
}
|
|
89
|
+
function truncationMarker(originalChars) {
|
|
90
|
+
return `[truncated for goal judge; originalChars=${originalChars}]`;
|
|
91
|
+
}
|
|
92
|
+
function truncateString(value, maxChars) {
|
|
93
|
+
if (value.length <= maxChars)
|
|
94
|
+
return value;
|
|
95
|
+
const marker = truncationMarker(value.length);
|
|
96
|
+
if (maxChars <= marker.length)
|
|
97
|
+
return marker;
|
|
98
|
+
return `${value.slice(0, maxChars - marker.length)}${marker}`;
|
|
99
|
+
}
|
|
100
|
+
function truncateUnknown(value, maxChars) {
|
|
101
|
+
if (typeof value === "string")
|
|
102
|
+
return truncateString(value, maxChars);
|
|
103
|
+
if (Array.isArray(value))
|
|
104
|
+
return value.map((entry) => truncateUnknown(entry, maxChars));
|
|
105
|
+
if (value && typeof value === "object") {
|
|
106
|
+
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
|
|
107
|
+
key,
|
|
108
|
+
truncateUnknown(entry, maxChars),
|
|
109
|
+
]));
|
|
110
|
+
}
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
113
|
+
function truncateBlock(block, maxChars) {
|
|
114
|
+
if (block.type === "text")
|
|
115
|
+
return { ...block, text: truncateString(block.text ?? "", maxChars) };
|
|
116
|
+
if (block.type === "tool_use") {
|
|
117
|
+
return {
|
|
118
|
+
...block,
|
|
119
|
+
input: truncateUnknown(block.input ?? {}, maxChars),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (block.type === "tool_result") {
|
|
123
|
+
return {
|
|
124
|
+
...block,
|
|
125
|
+
content: Array.isArray(block.content)
|
|
126
|
+
? block.content.map((entry) => truncateBlock(entry, maxChars))
|
|
127
|
+
: truncateString(block.content ?? "", maxChars),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return { ...block };
|
|
131
|
+
}
|
|
132
|
+
function emergencyTruncate(round, maxChars, maxTokens) {
|
|
133
|
+
let fieldBudget = Math.max(48, Math.floor(maxChars / 3));
|
|
134
|
+
let candidate = round;
|
|
135
|
+
for (let attempt = 0; attempt < 16; attempt++) {
|
|
136
|
+
candidate = round.map((message) => ({
|
|
137
|
+
...message,
|
|
138
|
+
content: typeof message.content === "string"
|
|
139
|
+
? truncateString(message.content, fieldBudget)
|
|
140
|
+
: message.content.map((block) => truncateBlock(block, fieldBudget)),
|
|
141
|
+
}));
|
|
142
|
+
if (renderConversation([candidate]).length <= maxChars &&
|
|
143
|
+
estimateTokens(candidate) <= maxTokens) {
|
|
144
|
+
return candidate;
|
|
145
|
+
}
|
|
146
|
+
fieldBudget = Math.max(0, Math.floor(fieldBudget / 2));
|
|
147
|
+
}
|
|
148
|
+
return candidate;
|
|
149
|
+
}
|
|
150
|
+
function structuralFallback(round, maxChars, maxTokens) {
|
|
151
|
+
const perMessageBudget = Math.max(0, Math.floor(maxChars / Math.max(1, round.length)) - 32);
|
|
152
|
+
const candidate = round.map((message) => {
|
|
153
|
+
if (typeof message.content === "string") {
|
|
154
|
+
return { ...message, content: truncateString(message.content, perMessageBudget) };
|
|
155
|
+
}
|
|
156
|
+
const text = message.content
|
|
157
|
+
.filter((block) => block.type === "text")
|
|
158
|
+
.map((block) => block.text ?? "")
|
|
159
|
+
.join("\n");
|
|
160
|
+
const blocks = [];
|
|
161
|
+
if (text)
|
|
162
|
+
blocks.push({ type: "text", text: truncateString(text, perMessageBudget) });
|
|
163
|
+
for (const block of message.content) {
|
|
164
|
+
if (block.type === "text")
|
|
165
|
+
continue;
|
|
166
|
+
if (block.type === "tool_use") {
|
|
167
|
+
blocks.push({ ...block, input: {} });
|
|
168
|
+
}
|
|
169
|
+
else if (block.type === "tool_result") {
|
|
170
|
+
blocks.push({ ...block, content: "" });
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
blocks.push({ ...block });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return { ...message, content: blocks };
|
|
177
|
+
});
|
|
178
|
+
return renderConversation([candidate]).length <= maxChars && estimateTokens(candidate) <= maxTokens
|
|
179
|
+
? candidate
|
|
180
|
+
: [];
|
|
181
|
+
}
|
|
182
|
+
export function buildGoalJudgeRuntimeContext(messages, options = {}) {
|
|
183
|
+
const maxRounds = Math.max(1, options.maxRounds ?? DEFAULT_MAX_ROUNDS);
|
|
184
|
+
const maxEstimatedTokens = Math.max(1, options.maxEstimatedTokens ?? DEFAULT_MAX_ESTIMATED_TOKENS);
|
|
185
|
+
const maxChars = Math.max(1, options.maxChars ?? DEFAULT_MAX_CHARS);
|
|
186
|
+
const sanitized = sanitizeConversation(messages, options.sensitiveToolResultRedactions);
|
|
187
|
+
const allRounds = groupMessagesByApiRound(sanitized);
|
|
188
|
+
let selected = allRounds.slice(-maxRounds);
|
|
189
|
+
let truncated = selected.length !== allRounds.length;
|
|
190
|
+
while (selected.length > 1) {
|
|
191
|
+
const conversation = selected.flat();
|
|
192
|
+
if (estimateTokens(conversation) <= maxEstimatedTokens &&
|
|
193
|
+
renderConversation(selected).length <= maxChars) {
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
selected = selected.slice(1);
|
|
197
|
+
truncated = true;
|
|
198
|
+
}
|
|
199
|
+
if (selected.length === 1) {
|
|
200
|
+
const conversation = selected[0];
|
|
201
|
+
if (estimateTokens(conversation) > maxEstimatedTokens ||
|
|
202
|
+
renderConversation(selected).length > maxChars) {
|
|
203
|
+
selected = [emergencyTruncate(conversation, maxChars, maxEstimatedTokens)];
|
|
204
|
+
truncated = true;
|
|
205
|
+
if (estimateTokens(selected[0]) > maxEstimatedTokens ||
|
|
206
|
+
renderConversation(selected).length > maxChars) {
|
|
207
|
+
const fallback = structuralFallback(conversation, maxChars, maxEstimatedTokens);
|
|
208
|
+
selected = fallback.length > 0 ? [fallback] : [];
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
let conversation = selected.flat();
|
|
213
|
+
let renderedConversation = renderConversation(selected);
|
|
214
|
+
// Absolute postcondition: even pathological structural overhead must not
|
|
215
|
+
// escape the advertised hard limits. The ellipsis is deterministic and the
|
|
216
|
+
// empty conversation has zero estimated tokens.
|
|
217
|
+
if (renderedConversation.length > maxChars ||
|
|
218
|
+
estimateTokens(conversation) > maxEstimatedTokens) {
|
|
219
|
+
selected = [];
|
|
220
|
+
conversation = [];
|
|
221
|
+
renderedConversation = "…".slice(0, maxChars);
|
|
222
|
+
truncated = true;
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
conversation,
|
|
226
|
+
renderedConversation,
|
|
227
|
+
digest: createHash("sha256").update(renderedConversation).digest("hex").slice(0, 16),
|
|
228
|
+
selectedRoundCount: selected.length,
|
|
229
|
+
sourceRoundCount: allRounds.length,
|
|
230
|
+
estimatedTokens: estimateTokens(conversation),
|
|
231
|
+
chars: renderedConversation.length,
|
|
232
|
+
truncated,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Message } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Remove run-scoped context messages before caching the durable conversation.
|
|
4
|
+
* Identity checks are intentional: equal user-authored content must survive.
|
|
5
|
+
*/
|
|
6
|
+
export declare function stripInjectedContextMessages(messages: Message[], userContextMsg: Message | null, dynamicContextMsg: Message | null): Message[];
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remove run-scoped context messages before caching the durable conversation.
|
|
3
|
+
* Identity checks are intentional: equal user-authored content must survive.
|
|
4
|
+
*/
|
|
5
|
+
export function stripInjectedContextMessages(messages, userContextMsg, dynamicContextMsg) {
|
|
6
|
+
const withoutDynamicContext = dynamicContextMsg
|
|
7
|
+
? messages.filter((message) => message !== dynamicContextMsg)
|
|
8
|
+
: [...messages];
|
|
9
|
+
if (!userContextMsg || messages[0] !== userContextMsg) {
|
|
10
|
+
return withoutDynamicContext;
|
|
11
|
+
}
|
|
12
|
+
return withoutDynamicContext.slice(1);
|
|
13
|
+
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import type { LLMClientBase } from "../llm/client-base.js";
|
|
5
5
|
import type { Message, ToolDefinition, LLMResponse, StreamCallback } from "../types.js";
|
|
6
6
|
import { Transcript } from "../session/transcript.js";
|
|
7
|
+
import { type PromptPrefixFingerprint } from "./prompt-cache-diagnostics.js";
|
|
7
8
|
export interface ModelCallRecordingOptions {
|
|
8
9
|
sensitiveToolResultRedactions?: ReadonlyMap<string, string>;
|
|
9
10
|
}
|
|
@@ -21,15 +22,14 @@ export declare class ModelFacade {
|
|
|
21
22
|
private readonly client;
|
|
22
23
|
private readonly transcript;
|
|
23
24
|
constructor(client: LLMClientBase, transcript: Transcript);
|
|
25
|
+
getPromptPrefixFingerprint(systemPrompt: string, tools: readonly ToolDefinition[]): PromptPrefixFingerprint;
|
|
24
26
|
call(systemPrompt: string, messages: Message[], tools: ToolDefinition[], onStream?: StreamCallback, signal?: AbortSignal, recordingOptions?: ModelCallRecordingOptions): Promise<LLMResponse>;
|
|
25
27
|
/**
|
|
26
28
|
* Call without streaming — used as fallback when streaming fails.
|
|
27
29
|
*/
|
|
28
30
|
callWithoutStreaming(systemPrompt: string, messages: Message[], tools: ToolDefinition[], signal?: AbortSignal, recordingOptions?: ModelCallRecordingOptions): Promise<LLMResponse>;
|
|
29
|
-
/** Record API timing and token usage to bootstrap state. */
|
|
30
|
-
private recordUsage;
|
|
31
31
|
/** Optional summarize function for tool use summaries. */
|
|
32
|
-
summarize?: (systemPrompt: string, userMessage: string) => Promise<string>;
|
|
32
|
+
summarize?: (systemPrompt: string, userMessage: string, signal?: AbortSignal) => Promise<string>;
|
|
33
33
|
/** Get cumulative output tokens (for token budget). */
|
|
34
34
|
getOutputTokens?(): number;
|
|
35
35
|
private recordResponse;
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
import { logger, getCurrentSid } from "../logging/logger.js";
|
|
5
5
|
import { recordLLMError, recordLLMRequest, recordLLMResponse, } from "../logging/session-recorder.js";
|
|
6
6
|
import { sanitizeMessages } from "../logging/sanitize-messages.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { cacheHitRateFromUsage } from "../session/usage.js";
|
|
8
|
+
import { createPromptPrefixFingerprint, } from "./prompt-cache-diagnostics.js";
|
|
9
9
|
let _reqSeq = 0;
|
|
10
10
|
function nextReqId() {
|
|
11
11
|
_reqSeq += 1;
|
|
@@ -30,6 +30,15 @@ export class ModelFacade {
|
|
|
30
30
|
this.client = client;
|
|
31
31
|
this.transcript = transcript;
|
|
32
32
|
}
|
|
33
|
+
getPromptPrefixFingerprint(systemPrompt, tools) {
|
|
34
|
+
const client = this.client;
|
|
35
|
+
const fallbackIdentity = {
|
|
36
|
+
provider: client.provider ?? "unknown",
|
|
37
|
+
model: client.model ?? "unknown",
|
|
38
|
+
identityVersion: "legacy-client-v1",
|
|
39
|
+
};
|
|
40
|
+
return createPromptPrefixFingerprint(systemPrompt, tools, client.getPromptCacheConfigIdentity?.() ?? fallbackIdentity, client.getPromptCacheScopeIdentity?.() ?? fallbackIdentity);
|
|
41
|
+
}
|
|
33
42
|
async call(systemPrompt, messages, tools, onStream, signal, recordingOptions) {
|
|
34
43
|
const startMs = Date.now();
|
|
35
44
|
const msgCount = messages.length;
|
|
@@ -87,6 +96,7 @@ export class ModelFacade {
|
|
|
87
96
|
throw err;
|
|
88
97
|
}
|
|
89
98
|
const latencyMs = Date.now() - startMs;
|
|
99
|
+
const promptPrefix = this.getPromptPrefixFingerprint(systemPrompt, tools);
|
|
90
100
|
logger.info("llm.request", {
|
|
91
101
|
stream: true,
|
|
92
102
|
latencyMs,
|
|
@@ -96,6 +106,7 @@ export class ModelFacade {
|
|
|
96
106
|
textLen: response.text?.length ?? 0,
|
|
97
107
|
usage: response.usage,
|
|
98
108
|
cacheHitRate: cacheHitRate(response.usage),
|
|
109
|
+
promptPrefix,
|
|
99
110
|
});
|
|
100
111
|
recordLLMResponse(sid, {
|
|
101
112
|
text: response.text,
|
|
@@ -104,7 +115,6 @@ export class ModelFacade {
|
|
|
104
115
|
usage: response.usage,
|
|
105
116
|
durationMs: latencyMs,
|
|
106
117
|
}, reqId);
|
|
107
|
-
this.recordUsage(response, latencyMs);
|
|
108
118
|
this.recordResponse(response);
|
|
109
119
|
return response;
|
|
110
120
|
}
|
|
@@ -141,6 +151,7 @@ export class ModelFacade {
|
|
|
141
151
|
throw err;
|
|
142
152
|
}
|
|
143
153
|
const latencyMs = Date.now() - startMs;
|
|
154
|
+
const promptPrefix = this.getPromptPrefixFingerprint(systemPrompt, tools);
|
|
144
155
|
logger.info("llm.request", {
|
|
145
156
|
stream: false,
|
|
146
157
|
latencyMs,
|
|
@@ -150,6 +161,7 @@ export class ModelFacade {
|
|
|
150
161
|
textLen: response.text?.length ?? 0,
|
|
151
162
|
usage: response.usage,
|
|
152
163
|
cacheHitRate: cacheHitRate(response.usage),
|
|
164
|
+
promptPrefix,
|
|
153
165
|
});
|
|
154
166
|
recordLLMResponse(sid, {
|
|
155
167
|
text: response.text,
|
|
@@ -158,20 +170,9 @@ export class ModelFacade {
|
|
|
158
170
|
usage: response.usage,
|
|
159
171
|
durationMs: latencyMs,
|
|
160
172
|
}, reqId);
|
|
161
|
-
this.recordUsage(response, latencyMs);
|
|
162
173
|
this.recordResponse(response);
|
|
163
174
|
return response;
|
|
164
175
|
}
|
|
165
|
-
/** Record API timing and token usage to bootstrap state. */
|
|
166
|
-
recordUsage(response, latencyMs) {
|
|
167
|
-
addAPIDuration(latencyMs);
|
|
168
|
-
const u = response.usage;
|
|
169
|
-
if (u) {
|
|
170
|
-
addInputTokens(u.promptTokens ?? 0);
|
|
171
|
-
addOutputTokens(u.completionTokens ?? 0);
|
|
172
|
-
addToModelUsage(this.client.model ?? "unknown", u.promptTokens ?? 0, u.completionTokens ?? 0, u.cacheReadTokens ?? 0, u.cacheCreationTokens ?? 0);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
176
|
/** Optional summarize function for tool use summaries. */
|
|
176
177
|
summarize;
|
|
177
178
|
recordResponse(response) {
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { PermissionRule } from "../types.js";
|
|
2
|
+
import { type ApprovalBackend, type ApprovalRouter, type PermissionClassifier } from "../tool-system/permission.js";
|
|
3
|
+
import type { EngineConfig } from "./types.js";
|
|
4
|
+
type PermissionMode = NonNullable<EngineConfig["permissionMode"]>;
|
|
5
|
+
export interface ComposePermissionRulesOptions {
|
|
6
|
+
mode: PermissionMode;
|
|
7
|
+
cwd: string;
|
|
8
|
+
presetRules: readonly PermissionRule[];
|
|
9
|
+
settingsScope?: EngineConfig["settingsScope"];
|
|
10
|
+
projectTrusted?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Compose the permission rule list for a session: preset rules, the standing
|
|
14
|
+
* memory-scope carve-outs, mode-derived rules, and finally the user's own
|
|
15
|
+
* `settings.permissions.rules` at highest precedence.
|
|
16
|
+
*
|
|
17
|
+
* Extracted from {@link PermissionController.build} so that a non-Engine caller
|
|
18
|
+
* — notably `SessionToolHost`, which exposes tools to an external Agent Runtime
|
|
19
|
+
* — composes rules the SAME way instead of being handed the obligation and
|
|
20
|
+
* silently getting it wrong. That mattered concretely: a user rule denying a
|
|
21
|
+
* tool lives only in settings, so a path that skips this leaves the user's
|
|
22
|
+
* explicit "no" unenforced for the external runtime while the Native Engine
|
|
23
|
+
* honors it.
|
|
24
|
+
*/
|
|
25
|
+
export declare function composePermissionRules(options: ComposePermissionRulesOptions): PermissionRule[];
|
|
26
|
+
export declare class PermissionController {
|
|
27
|
+
private readonly deps;
|
|
28
|
+
private mode;
|
|
29
|
+
private inPlanMode;
|
|
30
|
+
private pendingMode;
|
|
31
|
+
private pendingPlanMode;
|
|
32
|
+
private activePermission;
|
|
33
|
+
private activeApprovalRouter;
|
|
34
|
+
private readonly interactiveBackends;
|
|
35
|
+
constructor(deps: {
|
|
36
|
+
config: () => EngineConfig;
|
|
37
|
+
updateConfig: (next: EngineConfig) => void;
|
|
38
|
+
presetRules: () => PermissionRule[];
|
|
39
|
+
runInProgress: () => boolean;
|
|
40
|
+
});
|
|
41
|
+
get permissionMode(): PermissionMode;
|
|
42
|
+
get planMode(): boolean;
|
|
43
|
+
attach(permission: PermissionClassifier, approvalRouter?: ApprovalRouter): void;
|
|
44
|
+
build(mode: PermissionMode, cwd: string, approvalRouter?: ApprovalRouter): {
|
|
45
|
+
rules: PermissionRule[];
|
|
46
|
+
backend: ApprovalBackend;
|
|
47
|
+
};
|
|
48
|
+
setPermissionMode(mode: PermissionMode): void;
|
|
49
|
+
applyPending(): void;
|
|
50
|
+
getPermissionMode(): PermissionMode;
|
|
51
|
+
getPermissionRules(): PermissionRule[];
|
|
52
|
+
setPlanMode(value: boolean): void;
|
|
53
|
+
private apply;
|
|
54
|
+
}
|
|
55
|
+
export {};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { SettingsManager } from "../settings/manager.js";
|
|
2
|
+
import { AutoApprovalBackend, HeadlessApprovalBackend, InteractiveApprovalBackend, getInteractiveApprovalBackend, } from "../tool-system/permission.js";
|
|
3
|
+
/**
|
|
4
|
+
* Compose the permission rule list for a session: preset rules, the standing
|
|
5
|
+
* memory-scope carve-outs, mode-derived rules, and finally the user's own
|
|
6
|
+
* `settings.permissions.rules` at highest precedence.
|
|
7
|
+
*
|
|
8
|
+
* Extracted from {@link PermissionController.build} so that a non-Engine caller
|
|
9
|
+
* — notably `SessionToolHost`, which exposes tools to an external Agent Runtime
|
|
10
|
+
* — composes rules the SAME way instead of being handed the obligation and
|
|
11
|
+
* silently getting it wrong. That mattered concretely: a user rule denying a
|
|
12
|
+
* tool lives only in settings, so a path that skips this leaves the user's
|
|
13
|
+
* explicit "no" unenforced for the external runtime while the Native Engine
|
|
14
|
+
* honors it.
|
|
15
|
+
*/
|
|
16
|
+
export function composePermissionRules(options) {
|
|
17
|
+
const { mode, cwd } = options;
|
|
18
|
+
const rules = [...options.presetRules];
|
|
19
|
+
rules.push({
|
|
20
|
+
tool: "MemorySave",
|
|
21
|
+
argsPattern: { scope: "^dream$" },
|
|
22
|
+
decision: "allow",
|
|
23
|
+
reason: "Dream scope is the LLM's auto-consolidation workspace",
|
|
24
|
+
});
|
|
25
|
+
rules.push({
|
|
26
|
+
tool: "MemoryDelete",
|
|
27
|
+
argsPattern: { scope: "^dream$" },
|
|
28
|
+
decision: "allow",
|
|
29
|
+
reason: "Dream scope is the LLM's auto-consolidation workspace",
|
|
30
|
+
});
|
|
31
|
+
if (mode === "acceptEdits" || mode === "bypassPermissions") {
|
|
32
|
+
rules.push({ tool: "Write", decision: "allow" });
|
|
33
|
+
rules.push({ tool: "Edit", decision: "allow" });
|
|
34
|
+
}
|
|
35
|
+
if (mode === "bypassPermissions")
|
|
36
|
+
rules.push({ tool: "Bash", decision: "allow" });
|
|
37
|
+
try {
|
|
38
|
+
const settings = new SettingsManager(cwd, options.settingsScope ?? "project", options.projectTrusted !== false).get();
|
|
39
|
+
// unshift: the user's own rules outrank every default.
|
|
40
|
+
if (settings.permissions?.rules?.length)
|
|
41
|
+
rules.unshift(...settings.permissions.rules);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Settings are optional; preset and mode defaults remain usable.
|
|
45
|
+
}
|
|
46
|
+
return rules;
|
|
47
|
+
}
|
|
48
|
+
export class PermissionController {
|
|
49
|
+
deps;
|
|
50
|
+
mode;
|
|
51
|
+
inPlanMode;
|
|
52
|
+
pendingMode = null;
|
|
53
|
+
pendingPlanMode = null;
|
|
54
|
+
activePermission;
|
|
55
|
+
activeApprovalRouter;
|
|
56
|
+
interactiveBackends = new WeakMap();
|
|
57
|
+
constructor(deps) {
|
|
58
|
+
this.deps = deps;
|
|
59
|
+
this.mode = deps.config().permissionMode ?? "acceptEdits";
|
|
60
|
+
this.inPlanMode = this.mode === "plan";
|
|
61
|
+
}
|
|
62
|
+
get permissionMode() {
|
|
63
|
+
return this.mode;
|
|
64
|
+
}
|
|
65
|
+
get planMode() {
|
|
66
|
+
return this.inPlanMode;
|
|
67
|
+
}
|
|
68
|
+
attach(permission, approvalRouter) {
|
|
69
|
+
this.activePermission = permission;
|
|
70
|
+
this.activeApprovalRouter = approvalRouter;
|
|
71
|
+
}
|
|
72
|
+
build(mode, cwd, approvalRouter) {
|
|
73
|
+
const config = this.deps.config();
|
|
74
|
+
const rules = composePermissionRules({
|
|
75
|
+
mode,
|
|
76
|
+
cwd,
|
|
77
|
+
presetRules: this.deps.presetRules(),
|
|
78
|
+
settingsScope: config.settingsScope,
|
|
79
|
+
projectTrusted: config.projectTrusted,
|
|
80
|
+
});
|
|
81
|
+
if (config.approvalBackend) {
|
|
82
|
+
return {
|
|
83
|
+
rules,
|
|
84
|
+
backend: mode === "auto"
|
|
85
|
+
? new AutoApprovalBackend(config.approvalBackend)
|
|
86
|
+
: config.approvalBackend,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (mode === "auto")
|
|
90
|
+
return { rules, backend: new AutoApprovalBackend() };
|
|
91
|
+
let interactive;
|
|
92
|
+
if (approvalRouter) {
|
|
93
|
+
interactive =
|
|
94
|
+
this.interactiveBackends.get(approvalRouter) ??
|
|
95
|
+
new InteractiveApprovalBackend(approvalRouter);
|
|
96
|
+
this.interactiveBackends.set(approvalRouter, interactive);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
interactive = getInteractiveApprovalBackend();
|
|
100
|
+
}
|
|
101
|
+
const backend = interactive.hasPromptFn()
|
|
102
|
+
? interactive
|
|
103
|
+
: new HeadlessApprovalBackend(mode === "bypassPermissions" ? "approve-all" : "deny-all");
|
|
104
|
+
return { rules, backend };
|
|
105
|
+
}
|
|
106
|
+
setPermissionMode(mode) {
|
|
107
|
+
if (this.deps.runInProgress()) {
|
|
108
|
+
this.pendingMode = mode;
|
|
109
|
+
this.pendingPlanMode = mode === "plan";
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
this.apply(mode, mode === "plan");
|
|
113
|
+
}
|
|
114
|
+
applyPending() {
|
|
115
|
+
if (this.pendingMode === null)
|
|
116
|
+
return;
|
|
117
|
+
const mode = this.pendingMode;
|
|
118
|
+
const planMode = this.pendingPlanMode ?? mode === "plan";
|
|
119
|
+
this.pendingMode = null;
|
|
120
|
+
this.pendingPlanMode = null;
|
|
121
|
+
this.apply(mode, planMode);
|
|
122
|
+
}
|
|
123
|
+
getPermissionMode() {
|
|
124
|
+
return this.deps.config().permissionMode ?? "acceptEdits";
|
|
125
|
+
}
|
|
126
|
+
getPermissionRules() {
|
|
127
|
+
const config = this.deps.config();
|
|
128
|
+
return this.build(this.getPermissionMode(), config.cwd ?? process.cwd(), this.activeApprovalRouter).rules;
|
|
129
|
+
}
|
|
130
|
+
setPlanMode(value) {
|
|
131
|
+
if (value) {
|
|
132
|
+
this.setPermissionMode("plan");
|
|
133
|
+
}
|
|
134
|
+
else if ((this.pendingMode ?? this.mode) === "plan") {
|
|
135
|
+
this.setPermissionMode("acceptEdits");
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
apply(mode, planMode) {
|
|
139
|
+
const config = { ...this.deps.config(), permissionMode: mode };
|
|
140
|
+
this.deps.updateConfig(config);
|
|
141
|
+
this.mode = mode;
|
|
142
|
+
this.inPlanMode = planMode;
|
|
143
|
+
if (!this.activePermission)
|
|
144
|
+
return;
|
|
145
|
+
const { rules, backend } = this.build(mode, config.cwd ?? process.cwd(), this.activeApprovalRouter);
|
|
146
|
+
this.activePermission.reconfigure(mode, backend, rules);
|
|
147
|
+
}
|
|
148
|
+
}
|