@cjhyy/code-shell-core 0.7.1 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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/path-policy.js +99 -2
- 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
|
@@ -1,603 +0,0 @@
|
|
|
1
|
-
/** Shared utilities for arena strategy implementations. */
|
|
2
|
-
import { logger } from "../../logging/logger.js";
|
|
3
|
-
/** Coerce a value to string — handles cases where LLM returns number/object instead of string */
|
|
4
|
-
function asString(v) {
|
|
5
|
-
if (typeof v === "string")
|
|
6
|
-
return v;
|
|
7
|
-
if (v == null)
|
|
8
|
-
return "";
|
|
9
|
-
if (typeof v === "number" || typeof v === "boolean")
|
|
10
|
-
return String(v);
|
|
11
|
-
return "";
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Sanitize LLM-originated text before re-injecting into a prompt.
|
|
15
|
-
* Strips patterns that could be interpreted as prompt-level instructions.
|
|
16
|
-
*/
|
|
17
|
-
function sanitizeForPrompt(text) {
|
|
18
|
-
if (!text)
|
|
19
|
-
return "";
|
|
20
|
-
return text
|
|
21
|
-
.replace(/<\/?(?:system|assistant|user|system-reminder)[^>]*>/gi, "")
|
|
22
|
-
.replace(/^(?:IGNORE|DISREGARD|FORGET|OVERRIDE|SYSTEM|INSTRUCTION)[:\s].*/gim, "")
|
|
23
|
-
.slice(0, 3000);
|
|
24
|
-
}
|
|
25
|
-
// extractJSON / extractJSONArray are generic JSON extractors with no Arena
|
|
26
|
-
// dependency. They moved to utils/json.ts so non-Arena consumers (e.g.
|
|
27
|
-
// services/memory-orchestrator) can use them without importing this Arena
|
|
28
|
-
// module — that import made Arena a dependency of a core service. Re-exported
|
|
29
|
-
// here for back-compat with Arena's own callers and the existing test.
|
|
30
|
-
export { extractJSON, extractJSONArray } from "../../utils/json.js";
|
|
31
|
-
import { extractJSON, extractJSONArray } from "../../utils/json.js";
|
|
32
|
-
/** Format base context into a readable text block for LLM prompts */
|
|
33
|
-
export function formatBaseContext(ctx) {
|
|
34
|
-
const sections = [];
|
|
35
|
-
// Quick facts
|
|
36
|
-
if (ctx.quickFacts.length > 0) {
|
|
37
|
-
sections.push(`## Quick Facts\n${ctx.quickFacts.map((f) => `- ${f.label}: ${f.value}`).join("\n")}`);
|
|
38
|
-
}
|
|
39
|
-
// Artifacts
|
|
40
|
-
for (const artifact of ctx.artifacts) {
|
|
41
|
-
const header = artifact.ref ? `${artifact.title} (${artifact.ref})` : artifact.title;
|
|
42
|
-
sections.push(`## ${artifact.kind.toUpperCase()}: ${header}\n\`\`\`\n${artifact.preview}\n\`\`\``);
|
|
43
|
-
}
|
|
44
|
-
return sections.join("\n\n");
|
|
45
|
-
}
|
|
46
|
-
/** Format participant reports for cross-review or consensus prompts */
|
|
47
|
-
export function formatReports(reports) {
|
|
48
|
-
return reports.map((r) => {
|
|
49
|
-
const findingsList = r.findings.map((f) => ` - [${f.id}] (${f.kind}${f.severity ? `, ${f.severity}` : ""}) ${f.title}\n` +
|
|
50
|
-
` ${f.summary}\n` +
|
|
51
|
-
` Evidence: ${f.evidence.map((e) => `${e.type}:${e.ref}`).join(", ")}\n` +
|
|
52
|
-
` Confidence: ${f.confidence}` +
|
|
53
|
-
(f.suggestedChange ? `\n Suggested: ${f.suggestedChange}` : "")).join("\n");
|
|
54
|
-
return `### ${r.participant}\n${r.contextSummary}\n\nFindings:\n${findingsList}`;
|
|
55
|
-
}).join("\n\n");
|
|
56
|
-
}
|
|
57
|
-
/** Format finding reviews for consensus prompts */
|
|
58
|
-
export function formatFindingReviews(reviews) {
|
|
59
|
-
if (reviews.length === 0)
|
|
60
|
-
return "No peer reviews.";
|
|
61
|
-
return reviews.map((r) => `[${r.reviewer}] on ${r.findingId}: ${r.verdict}${r.reason ? ` — ${r.reason}` : ""}`).join("\n");
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Parse a ParticipantReport. The research prompt now asks for an
|
|
65
|
-
* XML <report> element because thinking-mode models (DeepSeek V4)
|
|
66
|
-
* produced malformed JSON often enough to derail the loop. We try
|
|
67
|
-
* XML first, then JSON, then a free-text salvage.
|
|
68
|
-
*/
|
|
69
|
-
export function parseReport(participant, text) {
|
|
70
|
-
if (!text || text.trim().length === 0) {
|
|
71
|
-
logger.warn("arena.parse_report_empty", { participant });
|
|
72
|
-
return {
|
|
73
|
-
participant,
|
|
74
|
-
contextSummary: "(no response)",
|
|
75
|
-
findings: [],
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
// (1) XML — preferred output format.
|
|
79
|
-
const xmlReport = tryParseReportXml(participant, text);
|
|
80
|
-
if (xmlReport && xmlReport.findings.length > 0)
|
|
81
|
-
return xmlReport;
|
|
82
|
-
// (2) JSON — older prompts, or models that still default to JSON.
|
|
83
|
-
try {
|
|
84
|
-
const json = extractJSON(text);
|
|
85
|
-
const parsed = JSON.parse(json);
|
|
86
|
-
let findings = parsed.findings;
|
|
87
|
-
if (!Array.isArray(findings) && parsed.contextSummary === undefined) {
|
|
88
|
-
if (parsed.kind && parsed.title) {
|
|
89
|
-
findings = [parsed];
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
const report = {
|
|
93
|
-
participant,
|
|
94
|
-
contextSummary: parsed.contextSummary ?? parsed.context_summary ?? "",
|
|
95
|
-
findings: Array.isArray(findings) ? findings.map(parseFinding) : [],
|
|
96
|
-
};
|
|
97
|
-
if (report.findings.length > 0)
|
|
98
|
-
return report;
|
|
99
|
-
}
|
|
100
|
-
catch (err) {
|
|
101
|
-
logger.warn("arena.parse_report_json_fail", {
|
|
102
|
-
participant,
|
|
103
|
-
error: err.message,
|
|
104
|
-
textLength: text.length,
|
|
105
|
-
text: text.slice(0, 500),
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
// (3) If XML had a contextSummary but zero findings, prefer that
|
|
109
|
-
// skeleton over a free-text salvage — the model committed to the
|
|
110
|
-
// schema but came up empty.
|
|
111
|
-
if (xmlReport) {
|
|
112
|
-
logger.warn("arena.parse_report_no_findings", {
|
|
113
|
-
participant,
|
|
114
|
-
textPreview: text.slice(0, 200),
|
|
115
|
-
});
|
|
116
|
-
return xmlReport;
|
|
117
|
-
}
|
|
118
|
-
// (4) Last resort.
|
|
119
|
-
return extractFindingsFromFreeText(participant, text);
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Tolerant XML parser scoped to <report>…</report>. Built by hand
|
|
123
|
-
* (no full XML library) because the LLM output we accept is
|
|
124
|
-
* shallow and well-known: <report><contextSummary/><findings>
|
|
125
|
-
* <finding attrs…><title/><summary/><evidence/>* <affectedFiles/>?
|
|
126
|
-
* <suggestedChange/>?</finding>*</findings></report>. Returns
|
|
127
|
-
* undefined if no <report> root is present.
|
|
128
|
-
*/
|
|
129
|
-
function tryParseReportXml(participant, text) {
|
|
130
|
-
const reportMatch = text.match(/<report\b[^>]*>([\s\S]*?)<\/report>/i);
|
|
131
|
-
if (!reportMatch)
|
|
132
|
-
return undefined;
|
|
133
|
-
const body = reportMatch[1];
|
|
134
|
-
const contextSummary = decodeXmlText(extractTag(body, "contextSummary") ?? "");
|
|
135
|
-
const findingsBlock = extractTag(body, "findings") ?? "";
|
|
136
|
-
const findings = [];
|
|
137
|
-
let i = 0;
|
|
138
|
-
for (const match of findingsBlock.matchAll(/<finding\b([^>]*)>([\s\S]*?)<\/finding>/gi)) {
|
|
139
|
-
const attrs = parseAttrs(match[1]);
|
|
140
|
-
const inner = match[2];
|
|
141
|
-
const title = decodeXmlText(extractTag(inner, "title") ?? "");
|
|
142
|
-
const summary = decodeXmlText(extractTag(inner, "summary") ?? "");
|
|
143
|
-
const evidence = [];
|
|
144
|
-
for (const ev of inner.matchAll(/<evidence\b([^>]*)>([\s\S]*?)<\/evidence>/gi)) {
|
|
145
|
-
const evAttrs = parseAttrs(ev[1]);
|
|
146
|
-
evidence.push({
|
|
147
|
-
type: (evAttrs.type ?? "doc"),
|
|
148
|
-
ref: evAttrs.ref ?? "",
|
|
149
|
-
note: decodeXmlText(ev[2].trim()),
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
const affectedFilesBlock = extractTag(inner, "affectedFiles") ?? "";
|
|
153
|
-
const affectedFiles = [];
|
|
154
|
-
for (const f of affectedFilesBlock.matchAll(/<file>([\s\S]*?)<\/file>/gi)) {
|
|
155
|
-
affectedFiles.push(decodeXmlText(f[1].trim()));
|
|
156
|
-
}
|
|
157
|
-
const suggestedChange = decodeXmlText(extractTag(inner, "suggestedChange") ?? "").trim();
|
|
158
|
-
const confidence = Number(attrs.confidence);
|
|
159
|
-
findings.push({
|
|
160
|
-
id: attrs.id || `f${i + 1}`,
|
|
161
|
-
kind: validateFindingKind(attrs.kind),
|
|
162
|
-
title: title || "Untitled",
|
|
163
|
-
summary,
|
|
164
|
-
severity: attrs.severity || undefined,
|
|
165
|
-
confidence: Number.isFinite(confidence) ? confidence : 0.5,
|
|
166
|
-
evidence,
|
|
167
|
-
affectedFiles,
|
|
168
|
-
suggestedChange: suggestedChange || undefined,
|
|
169
|
-
});
|
|
170
|
-
i++;
|
|
171
|
-
}
|
|
172
|
-
return { participant, contextSummary, findings };
|
|
173
|
-
}
|
|
174
|
-
function extractTag(xml, tag) {
|
|
175
|
-
const re = new RegExp(`<${tag}\\b[^>]*>([\\s\\S]*?)<\\/${tag}>`, "i");
|
|
176
|
-
const m = xml.match(re);
|
|
177
|
-
return m?.[1];
|
|
178
|
-
}
|
|
179
|
-
function parseAttrs(attrString) {
|
|
180
|
-
const out = {};
|
|
181
|
-
for (const m of attrString.matchAll(/(\w+)\s*=\s*"([^"]*)"/g)) {
|
|
182
|
-
out[m[1]] = m[2];
|
|
183
|
-
}
|
|
184
|
-
return out;
|
|
185
|
-
}
|
|
186
|
-
function decodeXmlText(s) {
|
|
187
|
-
return s
|
|
188
|
-
.replace(/<!\[CDATA\[([\s\S]*?)\]\]>/g, "$1")
|
|
189
|
-
.replace(/</g, "<")
|
|
190
|
-
.replace(/>/g, ">")
|
|
191
|
-
.replace(/"/g, '"')
|
|
192
|
-
.replace(/'/g, "'")
|
|
193
|
-
.replace(/&/g, "&")
|
|
194
|
-
.trim();
|
|
195
|
-
}
|
|
196
|
-
function parseFinding(raw, index) {
|
|
197
|
-
return {
|
|
198
|
-
id: asString(raw.id) || `f${index + 1}`,
|
|
199
|
-
kind: validateFindingKind(raw.kind),
|
|
200
|
-
title: asString(raw.title) || "Untitled",
|
|
201
|
-
summary: asString(raw.summary),
|
|
202
|
-
severity: raw.severity || undefined,
|
|
203
|
-
confidence: typeof raw.confidence === "number" ? raw.confidence : 0.5,
|
|
204
|
-
evidence: Array.isArray(raw.evidence)
|
|
205
|
-
? raw.evidence.map((e) => ({
|
|
206
|
-
type: e.type ?? "doc",
|
|
207
|
-
ref: e.ref ?? "",
|
|
208
|
-
note: e.note ?? "",
|
|
209
|
-
}))
|
|
210
|
-
: [],
|
|
211
|
-
affectedFiles: Array.isArray(raw.affectedFiles) ? raw.affectedFiles : [],
|
|
212
|
-
suggestedChange: raw.suggestedChange || undefined,
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
function validateFindingKind(v) {
|
|
216
|
-
if (v === "strength" || v === "improvement" || v === "risk" || v === "question")
|
|
217
|
-
return v;
|
|
218
|
-
return "improvement";
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* When JSON parsing fails, extract findings from free-text response.
|
|
222
|
-
* Splits by paragraphs/sections and classifies each by keyword heuristics.
|
|
223
|
-
*/
|
|
224
|
-
function extractFindingsFromFreeText(participant, text) {
|
|
225
|
-
// Split into meaningful sections (by headers, numbered lists, or double newlines)
|
|
226
|
-
const sections = text
|
|
227
|
-
.split(/(?:^|\n)(?:#{1,3}\s+|\d+\.\s+|\*\*[^*]+\*\*\s*\n|---+\s*\n)/m)
|
|
228
|
-
.map((s) => s.trim())
|
|
229
|
-
.filter((s) => s.length > 20);
|
|
230
|
-
if (sections.length === 0) {
|
|
231
|
-
// No structure found — use full text as one finding
|
|
232
|
-
return {
|
|
233
|
-
participant,
|
|
234
|
-
contextSummary: text.slice(0, 200),
|
|
235
|
-
findings: [{
|
|
236
|
-
id: `${participant}-f1`,
|
|
237
|
-
kind: "improvement",
|
|
238
|
-
title: "Analysis",
|
|
239
|
-
summary: text.slice(0, 3000),
|
|
240
|
-
confidence: 0.5,
|
|
241
|
-
evidence: [],
|
|
242
|
-
affectedFiles: [],
|
|
243
|
-
}],
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
const findings = sections.slice(0, 10).map((section, i) => {
|
|
247
|
-
// Extract a title from the first line
|
|
248
|
-
const firstLine = section.split("\n")[0].slice(0, 100);
|
|
249
|
-
const body = section.length > firstLine.length
|
|
250
|
-
? section.slice(firstLine.length).trim()
|
|
251
|
-
: section;
|
|
252
|
-
return {
|
|
253
|
-
id: `${participant}-f${i + 1}`,
|
|
254
|
-
kind: classifyFindingKind(section),
|
|
255
|
-
title: firstLine.replace(/^[-*•]\s*/, "").replace(/\*\*/g, ""),
|
|
256
|
-
summary: body.slice(0, 1000),
|
|
257
|
-
confidence: 0.5,
|
|
258
|
-
evidence: [],
|
|
259
|
-
affectedFiles: extractFilePaths(section),
|
|
260
|
-
};
|
|
261
|
-
});
|
|
262
|
-
return {
|
|
263
|
-
participant,
|
|
264
|
-
contextSummary: text.slice(0, 200),
|
|
265
|
-
findings,
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
/** Classify a free-text paragraph into a finding kind by keywords */
|
|
269
|
-
function classifyFindingKind(text) {
|
|
270
|
-
const lower = text.toLowerCase();
|
|
271
|
-
if (/\b(risk|danger|vulnerab|security|breaking|regression|critical)\b/.test(lower))
|
|
272
|
-
return "risk";
|
|
273
|
-
if (/\b(good|well|strength|clean|solid|nice|excellent|properly)\b/.test(lower))
|
|
274
|
-
return "strength";
|
|
275
|
-
if (/\b(question|unclear|confirm|clarif|why|how come|wonder)\b/.test(lower))
|
|
276
|
-
return "question";
|
|
277
|
-
return "improvement";
|
|
278
|
-
}
|
|
279
|
-
/** Extract file paths from text (e.g. src/foo/bar.ts) */
|
|
280
|
-
function extractFilePaths(text) {
|
|
281
|
-
const matches = text.match(/(?:^|\s)((?:src|lib|packages|app)\/[\w\-/.]+\.\w+)/gm);
|
|
282
|
-
return matches ? [...new Set(matches.map((m) => m.trim()))] : [];
|
|
283
|
-
}
|
|
284
|
-
/** Parse FindingReview[] from LLM JSON output */
|
|
285
|
-
export function parseReviews(reviewer, text) {
|
|
286
|
-
try {
|
|
287
|
-
const json = extractJSONArray(text);
|
|
288
|
-
const parsed = JSON.parse(json);
|
|
289
|
-
if (!Array.isArray(parsed)) {
|
|
290
|
-
// Maybe it's wrapped in an object
|
|
291
|
-
const objJson = extractJSON(text);
|
|
292
|
-
const obj = JSON.parse(objJson);
|
|
293
|
-
if (Array.isArray(obj.reviews)) {
|
|
294
|
-
return obj.reviews.map((r) => parseReview(reviewer, r));
|
|
295
|
-
}
|
|
296
|
-
return [];
|
|
297
|
-
}
|
|
298
|
-
return parsed.map((r) => parseReview(reviewer, r));
|
|
299
|
-
}
|
|
300
|
-
catch {
|
|
301
|
-
return [];
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
function parseReview(reviewer, raw) {
|
|
305
|
-
return {
|
|
306
|
-
reviewer,
|
|
307
|
-
findingId: raw.findingId ?? raw.finding_id ?? "",
|
|
308
|
-
verdict: validateVerdict(raw.verdict),
|
|
309
|
-
reason: raw.reason ?? "",
|
|
310
|
-
extraEvidence: Array.isArray(raw.extraEvidence) ? raw.extraEvidence : undefined,
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
function validateVerdict(v) {
|
|
314
|
-
if (v === "agree" || v === "refine" || v === "disagree" || v === "needs_evidence")
|
|
315
|
-
return v;
|
|
316
|
-
return "agree";
|
|
317
|
-
}
|
|
318
|
-
/** Parse ArenaConsensus from LLM JSON output */
|
|
319
|
-
export function parseConsensus(text) {
|
|
320
|
-
try {
|
|
321
|
-
const json = extractJSON(text);
|
|
322
|
-
const parsed = JSON.parse(json);
|
|
323
|
-
if (typeof parsed !== "object" || parsed === null) {
|
|
324
|
-
throw new Error("parsed JSON is not an object");
|
|
325
|
-
}
|
|
326
|
-
return {
|
|
327
|
-
summary: asString(parsed.summary),
|
|
328
|
-
subjectSummary: asString(parsed.subjectSummary || parsed.changeSummary) || undefined,
|
|
329
|
-
strengths: parseConsensusItems(parsed.strengths),
|
|
330
|
-
improvements: parseConsensusItems(parsed.improvements),
|
|
331
|
-
risks: parseConsensusItems(parsed.risks),
|
|
332
|
-
openQuestions: parseConsensusItems(parsed.openQuestions),
|
|
333
|
-
roadmap: parseRoadmapPhases(parsed.roadmap),
|
|
334
|
-
nextActions: Array.isArray(parsed.nextActions)
|
|
335
|
-
? parsed.nextActions.map((a) => ({
|
|
336
|
-
title: a.title ?? "",
|
|
337
|
-
priority: validatePriority(a.priority),
|
|
338
|
-
rationale: a.rationale ?? "",
|
|
339
|
-
relatedFindings: Array.isArray(a.relatedFindings) ? a.relatedFindings : [],
|
|
340
|
-
}))
|
|
341
|
-
: [],
|
|
342
|
-
};
|
|
343
|
-
}
|
|
344
|
-
catch {
|
|
345
|
-
return {
|
|
346
|
-
summary: text,
|
|
347
|
-
strengths: [],
|
|
348
|
-
improvements: [],
|
|
349
|
-
risks: [],
|
|
350
|
-
openQuestions: [],
|
|
351
|
-
roadmap: [],
|
|
352
|
-
nextActions: [],
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
function parseConsensusItems(arr) {
|
|
357
|
-
if (!Array.isArray(arr))
|
|
358
|
-
return [];
|
|
359
|
-
return arr.map((item) => ({
|
|
360
|
-
title: asString(item.title),
|
|
361
|
-
summary: item.summary ?? "",
|
|
362
|
-
support: Array.isArray(item.support) ? item.support : [],
|
|
363
|
-
challenge: Array.isArray(item.challenge) ? item.challenge : [],
|
|
364
|
-
confidence: typeof item.confidence === "number" ? item.confidence : 0.5,
|
|
365
|
-
evidenceRefs: Array.isArray(item.evidenceRefs) ? item.evidenceRefs : [],
|
|
366
|
-
}));
|
|
367
|
-
}
|
|
368
|
-
function parseRoadmapPhases(arr) {
|
|
369
|
-
if (!Array.isArray(arr))
|
|
370
|
-
return [];
|
|
371
|
-
return arr.map((phase) => ({
|
|
372
|
-
title: phase.title ?? "",
|
|
373
|
-
priority: validatePriority(phase.priority),
|
|
374
|
-
goal: phase.goal ?? phase.description ?? "",
|
|
375
|
-
scope: toStringArray(phase.scope),
|
|
376
|
-
deliverables: toStringArray(phase.deliverables),
|
|
377
|
-
dependencies: toStringArray(phase.dependencies),
|
|
378
|
-
risks: toStringArray(phase.risks),
|
|
379
|
-
successCriteria: toStringArray(phase.successCriteria),
|
|
380
|
-
relatedFindings: toStringArray(phase.relatedFindings),
|
|
381
|
-
}));
|
|
382
|
-
}
|
|
383
|
-
function validatePriority(value) {
|
|
384
|
-
if (value === "high" || value === "medium" || value === "low")
|
|
385
|
-
return value;
|
|
386
|
-
return "medium";
|
|
387
|
-
}
|
|
388
|
-
function toStringArray(value) {
|
|
389
|
-
return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
|
|
390
|
-
}
|
|
391
|
-
// ─── V2: Claim-Aware Formatters ─────────────────────────────────
|
|
392
|
-
/** Format claims for verification-review prompts */
|
|
393
|
-
export function formatClaimsForReview(claims) {
|
|
394
|
-
if (claims.length === 0)
|
|
395
|
-
return "No claims to review.";
|
|
396
|
-
return claims.map((c) => {
|
|
397
|
-
const f = c.finding;
|
|
398
|
-
const evidence = c.evidenceRefs.length > 0
|
|
399
|
-
? `\n Evidence: ${c.evidenceRefs.join(", ")}`
|
|
400
|
-
: "";
|
|
401
|
-
const packets = c.evidencePacketIds.length > 0
|
|
402
|
-
? `\n Evidence packets: ${c.evidencePacketIds.join(", ")}`
|
|
403
|
-
: "";
|
|
404
|
-
return (`- [${c.claimId}] (${f.kind}${f.severity ? `, ${f.severity}` : ""}, status: ${c.status})\n` +
|
|
405
|
-
` ${sanitizeForPrompt(f.title)}\n` +
|
|
406
|
-
` ${sanitizeForPrompt(f.summary)}` +
|
|
407
|
-
evidence +
|
|
408
|
-
packets +
|
|
409
|
-
`\n Confidence: ${f.confidence}`);
|
|
410
|
-
}).join("\n\n");
|
|
411
|
-
}
|
|
412
|
-
/** Format debate history for debate turn prompts */
|
|
413
|
-
export function formatDebateHistory(turns) {
|
|
414
|
-
if (turns.length === 0)
|
|
415
|
-
return "No prior debate turns.";
|
|
416
|
-
return turns.map((t) => `[${t.participant}] stance: ${t.stance}\n ${t.summary}` +
|
|
417
|
-
(t.newEvidenceRefs?.length ? `\n New evidence: ${t.newEvidenceRefs.join(", ")}` : "")).join("\n");
|
|
418
|
-
}
|
|
419
|
-
/** Format claim status summary for consensus prompts */
|
|
420
|
-
export function formatClaimSummaryForConsensus(summary) {
|
|
421
|
-
const sections = [];
|
|
422
|
-
if (summary.verified.length > 0) {
|
|
423
|
-
sections.push(`### Verified Claims (${summary.verified.length})\n` +
|
|
424
|
-
summary.verified.map((c) => `- [${c.claimId}] ${sanitizeForPrompt(c.finding.title)} (${c.finding.kind}, confidence: ${c.finding.confidence})`).join("\n"));
|
|
425
|
-
}
|
|
426
|
-
if (summary.unresolved.length > 0) {
|
|
427
|
-
sections.push(`### Unresolved Claims (${summary.unresolved.length})\n` +
|
|
428
|
-
summary.unresolved.map((c) => `- [${c.claimId}] ${sanitizeForPrompt(c.finding.title)} — ${c.challenges.length} challenge(s), no consensus reached`).join("\n"));
|
|
429
|
-
}
|
|
430
|
-
if (summary.contested.length > 0) {
|
|
431
|
-
sections.push(`### Still Contested (${summary.contested.length})\n` +
|
|
432
|
-
summary.contested.map((c) => `- [${c.claimId}] ${sanitizeForPrompt(c.finding.title)} — ${c.challenges.length} challenge(s)`).join("\n"));
|
|
433
|
-
}
|
|
434
|
-
if (summary.rejected.length > 0) {
|
|
435
|
-
sections.push(`### Rejected Claims (${summary.rejected.length})\n` +
|
|
436
|
-
summary.rejected.map((c) => `- [${c.claimId}] ${sanitizeForPrompt(c.finding.title)} — rejected: ${sanitizeForPrompt(c.adjudication?.rationale ?? "no rationale")}`).join("\n"));
|
|
437
|
-
}
|
|
438
|
-
return sections.length > 0 ? sections.join("\n\n") : "No claims processed.";
|
|
439
|
-
}
|
|
440
|
-
/** Format a digest text block for inclusion in prompts */
|
|
441
|
-
export function formatDigestForPrompt(digest) {
|
|
442
|
-
const sections = [];
|
|
443
|
-
sections.push(`Claims under review: ${digest.relevantClaimIds.join(", ")}`);
|
|
444
|
-
if (digest.evidencePackets.length > 0) {
|
|
445
|
-
sections.push("\nEvidence:");
|
|
446
|
-
for (const p of digest.evidencePackets) {
|
|
447
|
-
sections.push(` [${p.packetId}] ${sanitizeForPrompt(p.title)} (${p.source}): ${sanitizeForPrompt(p.summary)}`);
|
|
448
|
-
for (const e of p.excerpts.slice(0, 2)) {
|
|
449
|
-
sections.push(` > ${e.ref}: ${sanitizeForPrompt(e.snippet)}`);
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
if (digest.recentChallenges.length > 0) {
|
|
454
|
-
sections.push("\nPrior challenges:");
|
|
455
|
-
for (const c of digest.recentChallenges) {
|
|
456
|
-
sections.push(` [${c.reviewer}] on ${c.claimId}: ${c.verdict} — ${sanitizeForPrompt(c.reason)}`);
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
return sections.join("\n");
|
|
460
|
-
}
|
|
461
|
-
// ─── V2: Claim-Aware Parsers ────────────────────────────────────
|
|
462
|
-
/** Parse ClaimChallenge[] from LLM JSON output */
|
|
463
|
-
export function parseChallenges(reviewer, text) {
|
|
464
|
-
try {
|
|
465
|
-
const json = extractJSONArray(text);
|
|
466
|
-
const parsed = JSON.parse(json);
|
|
467
|
-
if (!Array.isArray(parsed)) {
|
|
468
|
-
const objJson = extractJSON(text);
|
|
469
|
-
const obj = JSON.parse(objJson);
|
|
470
|
-
if (Array.isArray(obj.challenges)) {
|
|
471
|
-
return obj.challenges.map((r) => parseChallenge(reviewer, r));
|
|
472
|
-
}
|
|
473
|
-
return [];
|
|
474
|
-
}
|
|
475
|
-
return parsed.map((r) => parseChallenge(reviewer, r));
|
|
476
|
-
}
|
|
477
|
-
catch {
|
|
478
|
-
return [];
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
function parseChallenge(reviewer, raw) {
|
|
482
|
-
return {
|
|
483
|
-
reviewer,
|
|
484
|
-
claimId: asString(raw.claimId ?? raw.claim_id),
|
|
485
|
-
verdict: validateVerdict(raw.verdict),
|
|
486
|
-
reason: asString(raw.reason),
|
|
487
|
-
supportingEvidenceRefs: Array.isArray(raw.supportingEvidenceRefs)
|
|
488
|
-
? raw.supportingEvidenceRefs
|
|
489
|
-
: undefined,
|
|
490
|
-
requestedChecks: Array.isArray(raw.requestedChecks)
|
|
491
|
-
? raw.requestedChecks.map((rc) => ({
|
|
492
|
-
requestId: rc.requestId ?? `req-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,
|
|
493
|
-
claimId: raw.claimId ?? raw.claim_id ?? "",
|
|
494
|
-
requester: reviewer,
|
|
495
|
-
description: rc.description ?? "",
|
|
496
|
-
refs: Array.isArray(rc.refs) ? rc.refs : undefined,
|
|
497
|
-
priority: validateCheckPriority(rc.priority),
|
|
498
|
-
}))
|
|
499
|
-
: undefined,
|
|
500
|
-
};
|
|
501
|
-
}
|
|
502
|
-
function validateCheckPriority(v) {
|
|
503
|
-
if (v === "high" || v === "medium" || v === "low")
|
|
504
|
-
return v;
|
|
505
|
-
return undefined;
|
|
506
|
-
}
|
|
507
|
-
/** Parse a DebateTurn from LLM JSON output */
|
|
508
|
-
export function parseDebateTurn(participant, text) {
|
|
509
|
-
try {
|
|
510
|
-
const json = extractJSON(text);
|
|
511
|
-
const parsed = JSON.parse(json);
|
|
512
|
-
return {
|
|
513
|
-
participant,
|
|
514
|
-
stance: validateStance(parsed.stance),
|
|
515
|
-
summary: parsed.summary ?? parsed.argument ?? "",
|
|
516
|
-
newEvidenceRefs: Array.isArray(parsed.newEvidenceRefs) ? parsed.newEvidenceRefs : undefined,
|
|
517
|
-
};
|
|
518
|
-
}
|
|
519
|
-
catch {
|
|
520
|
-
return {
|
|
521
|
-
participant,
|
|
522
|
-
stance: "uncertain",
|
|
523
|
-
summary: text.slice(0, 1000),
|
|
524
|
-
};
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
function validateStance(v) {
|
|
528
|
-
if (v === "support" || v === "oppose" || v === "narrow" || v === "uncertain")
|
|
529
|
-
return v;
|
|
530
|
-
return "uncertain";
|
|
531
|
-
}
|
|
532
|
-
/** Parse a ClaimAdjudication from LLM JSON output */
|
|
533
|
-
export function parseAdjudication(claimId, text) {
|
|
534
|
-
try {
|
|
535
|
-
const json = extractJSON(text);
|
|
536
|
-
const parsed = JSON.parse(json);
|
|
537
|
-
return {
|
|
538
|
-
claimId,
|
|
539
|
-
outcome: validateAdjudicationOutcome(parsed.outcome),
|
|
540
|
-
rationale: asString(parsed.rationale),
|
|
541
|
-
finalSummary: asString(parsed.finalSummary ?? parsed.summary),
|
|
542
|
-
supportingEvidenceRefs: Array.isArray(parsed.supportingEvidenceRefs)
|
|
543
|
-
? parsed.supportingEvidenceRefs
|
|
544
|
-
: [],
|
|
545
|
-
};
|
|
546
|
-
}
|
|
547
|
-
catch {
|
|
548
|
-
return {
|
|
549
|
-
claimId,
|
|
550
|
-
outcome: "unresolved",
|
|
551
|
-
rationale: "Failed to parse adjudication response",
|
|
552
|
-
finalSummary: text.slice(0, 500),
|
|
553
|
-
supportingEvidenceRefs: [],
|
|
554
|
-
};
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
function validateAdjudicationOutcome(v) {
|
|
558
|
-
if (v === "accepted" || v === "accepted_with_revision" || v === "rejected" || v === "unresolved")
|
|
559
|
-
return v;
|
|
560
|
-
return "unresolved";
|
|
561
|
-
}
|
|
562
|
-
// ─── Planning: Detail Expansion Parser ────────────────────────────
|
|
563
|
-
/** Parse an ArenaRoadmapPhaseDetail from LLM JSON output */
|
|
564
|
-
export function parseDetailExpansion(text) {
|
|
565
|
-
try {
|
|
566
|
-
const json = extractJSON(text);
|
|
567
|
-
const parsed = JSON.parse(json);
|
|
568
|
-
if (typeof parsed !== "object" || parsed === null) {
|
|
569
|
-
throw new Error("parsed JSON is not an object");
|
|
570
|
-
}
|
|
571
|
-
return {
|
|
572
|
-
phaseTitle: asString(parsed.phaseTitle),
|
|
573
|
-
objective: asString(parsed.objective),
|
|
574
|
-
targetFiles: toStringArray(parsed.targetFiles),
|
|
575
|
-
codeChanges: toStringArray(parsed.codeChanges),
|
|
576
|
-
interfaces: toStringArray(parsed.interfaces),
|
|
577
|
-
migrationSteps: toStringArray(parsed.migrationSteps),
|
|
578
|
-
validation: toStringArray(parsed.validation),
|
|
579
|
-
effort: validateEffort(parsed.effort),
|
|
580
|
-
blockers: toStringArray(parsed.blockers),
|
|
581
|
-
evidenceRefs: toStringArray(parsed.evidenceRefs),
|
|
582
|
-
};
|
|
583
|
-
}
|
|
584
|
-
catch {
|
|
585
|
-
return {
|
|
586
|
-
phaseTitle: "",
|
|
587
|
-
objective: text.slice(0, 500),
|
|
588
|
-
targetFiles: [],
|
|
589
|
-
codeChanges: [],
|
|
590
|
-
interfaces: [],
|
|
591
|
-
migrationSteps: [],
|
|
592
|
-
validation: [],
|
|
593
|
-
effort: "medium",
|
|
594
|
-
blockers: [],
|
|
595
|
-
evidenceRefs: [],
|
|
596
|
-
};
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
function validateEffort(v) {
|
|
600
|
-
if (v === "small" || v === "medium" || v === "large")
|
|
601
|
-
return v;
|
|
602
|
-
return "medium";
|
|
603
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ArenaToolSelector — selects tool packs based on ArenaPlan sources.
|
|
3
|
-
*
|
|
4
|
-
* Maps evidence sources to subsets of the existing context tools.
|
|
5
|
-
* This replaces the hard-coded "always give all tools" approach.
|
|
6
|
-
*/
|
|
7
|
-
import type { ArenaPlan } from "../types.js";
|
|
8
|
-
import type { ToolDefinition } from "../../types.js";
|
|
9
|
-
/**
|
|
10
|
-
* Select the appropriate tools for a given plan.
|
|
11
|
-
* Merges tool packs from all active sources, deduplicating by name.
|
|
12
|
-
*/
|
|
13
|
-
export declare function selectTools(plan: ArenaPlan): ToolDefinition[];
|
|
14
|
-
/**
|
|
15
|
-
* Check whether any tools are available for the plan.
|
|
16
|
-
*/
|
|
17
|
-
export declare function hasTools(plan: ArenaPlan): boolean;
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ArenaToolSelector — selects tool packs based on ArenaPlan sources.
|
|
3
|
-
*
|
|
4
|
-
* Maps evidence sources to subsets of the existing context tools.
|
|
5
|
-
* This replaces the hard-coded "always give all tools" approach.
|
|
6
|
-
*/
|
|
7
|
-
import { CONTEXT_TOOLS } from "../context/context-tools.js";
|
|
8
|
-
/** Predefined tool packs by source kind */
|
|
9
|
-
const TOOL_PACKS = {
|
|
10
|
-
repo_readonly: {
|
|
11
|
-
name: "repo_readonly",
|
|
12
|
-
toolNames: ["read_file", "grep_code", "list_files"],
|
|
13
|
-
},
|
|
14
|
-
git: {
|
|
15
|
-
name: "git",
|
|
16
|
-
toolNames: ["read_file", "grep_code", "list_files", "git_show", "git_blame"],
|
|
17
|
-
},
|
|
18
|
-
docs: {
|
|
19
|
-
name: "docs",
|
|
20
|
-
toolNames: ["read_file", "list_files"],
|
|
21
|
-
},
|
|
22
|
-
no_tools: {
|
|
23
|
-
name: "no_tools",
|
|
24
|
-
toolNames: [],
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
/** Map source kind to default tool pack */
|
|
28
|
-
const SOURCE_TO_PACK = {
|
|
29
|
-
git: "git",
|
|
30
|
-
repo: "repo_readonly",
|
|
31
|
-
docs: "docs",
|
|
32
|
-
web: "no_tools", // web tools not yet available in arena context
|
|
33
|
-
none: "no_tools",
|
|
34
|
-
};
|
|
35
|
-
/**
|
|
36
|
-
* Select the appropriate tools for a given plan.
|
|
37
|
-
* Merges tool packs from all active sources, deduplicating by name.
|
|
38
|
-
*/
|
|
39
|
-
export function selectTools(plan) {
|
|
40
|
-
const toolNames = new Set();
|
|
41
|
-
for (const source of plan.sources) {
|
|
42
|
-
const packName = source.toolPack ?? SOURCE_TO_PACK[source.kind] ?? "no_tools";
|
|
43
|
-
const pack = TOOL_PACKS[packName] ?? TOOL_PACKS.no_tools;
|
|
44
|
-
for (const name of pack.toolNames) {
|
|
45
|
-
toolNames.add(name);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
if (toolNames.size === 0)
|
|
49
|
-
return [];
|
|
50
|
-
return CONTEXT_TOOLS.filter((t) => toolNames.has(t.name));
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Check whether any tools are available for the plan.
|
|
54
|
-
*/
|
|
55
|
-
export function hasTools(plan) {
|
|
56
|
-
return plan.sources.some((s) => {
|
|
57
|
-
const packName = SOURCE_TO_PACK[s.kind];
|
|
58
|
-
const pack = TOOL_PACKS[packName];
|
|
59
|
-
return pack && pack.toolNames.length > 0;
|
|
60
|
-
});
|
|
61
|
-
}
|