@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
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
import { execFile, spawn } from "node:child_process";
|
|
2
|
-
import { createInterface } from "node:readline";
|
|
3
|
-
import { pathWithCommonBins } from "./cc-capability.js";
|
|
4
|
-
import { killProcessGroup } from "../runtime/spawn-common.js";
|
|
5
|
-
/** Pure: reduce collected output lines + exit code to a result. Unit-testable. */
|
|
6
|
-
export function runWithLines(adapter, lines, exitCode) {
|
|
7
|
-
const parsed = adapter.parseResult(lines);
|
|
8
|
-
return { ...parsed, exitCode, lines };
|
|
9
|
-
}
|
|
10
|
-
const codexImageFlagCache = new Map();
|
|
11
|
-
const CODEX_IMAGE_PROBE_TIMEOUT_MS = 5_000;
|
|
12
|
-
const AGENT_TERMINATE_GRACE_MS = 500;
|
|
13
|
-
function listPosixProcessTree(rootPid) {
|
|
14
|
-
return new Promise((resolve) => {
|
|
15
|
-
execFile("ps", ["-axo", "pid=,ppid="], { encoding: "utf8" }, (err, stdout) => {
|
|
16
|
-
if (err) {
|
|
17
|
-
resolve([rootPid]);
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
const childrenByParent = new Map();
|
|
21
|
-
for (const line of stdout.split("\n")) {
|
|
22
|
-
const [pidText, parentText] = line.trim().split(/\s+/, 2);
|
|
23
|
-
const pid = Number(pidText);
|
|
24
|
-
const parentPid = Number(parentText);
|
|
25
|
-
if (!Number.isInteger(pid) || !Number.isInteger(parentPid))
|
|
26
|
-
continue;
|
|
27
|
-
const children = childrenByParent.get(parentPid) ?? [];
|
|
28
|
-
children.push(pid);
|
|
29
|
-
childrenByParent.set(parentPid, children);
|
|
30
|
-
}
|
|
31
|
-
const pids = [];
|
|
32
|
-
const visit = (pid) => {
|
|
33
|
-
if (pids.includes(pid))
|
|
34
|
-
return;
|
|
35
|
-
pids.push(pid);
|
|
36
|
-
for (const childPid of childrenByParent.get(pid) ?? [])
|
|
37
|
-
visit(childPid);
|
|
38
|
-
};
|
|
39
|
-
visit(rootPid);
|
|
40
|
-
resolve(pids);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
function isPidAlive(pid) {
|
|
45
|
-
try {
|
|
46
|
-
process.kill(pid, 0);
|
|
47
|
-
return true;
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
function delay(ms) {
|
|
54
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
55
|
-
}
|
|
56
|
-
async function waitForPidsToExit(pids, timeoutMs) {
|
|
57
|
-
const deadline = Date.now() + timeoutMs;
|
|
58
|
-
while ([...pids].some(isPidAlive)) {
|
|
59
|
-
if (Date.now() >= deadline)
|
|
60
|
-
return false;
|
|
61
|
-
await delay(25);
|
|
62
|
-
}
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
function signalPids(pids, killSignal) {
|
|
66
|
-
for (const pid of pids) {
|
|
67
|
-
try {
|
|
68
|
-
process.kill(pid, killSignal);
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
// already gone
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
async function terminateAttachedProcessTree(child) {
|
|
76
|
-
const pid = child.pid;
|
|
77
|
-
if (!pid) {
|
|
78
|
-
try {
|
|
79
|
-
child.kill("SIGKILL");
|
|
80
|
-
}
|
|
81
|
-
catch {
|
|
82
|
-
// already gone
|
|
83
|
-
}
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
if (process.platform === "win32") {
|
|
87
|
-
// Windows has no POSIX SIGTERM semantics or negative-pid groups. Reap the
|
|
88
|
-
// tree via taskkill, then use positive-pid process.kill as the fallback the
|
|
89
|
-
// platform supports when taskkill is unavailable/races.
|
|
90
|
-
await killProcessGroup(pid, { graceMs: AGENT_TERMINATE_GRACE_MS });
|
|
91
|
-
if (isPidAlive(pid)) {
|
|
92
|
-
try {
|
|
93
|
-
process.kill(pid);
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
// already gone
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
const trackedPids = new Set(await listPosixProcessTree(pid));
|
|
102
|
-
signalPids(trackedPids, "SIGTERM");
|
|
103
|
-
if (await waitForPidsToExit(trackedPids, AGENT_TERMINATE_GRACE_MS))
|
|
104
|
-
return;
|
|
105
|
-
// Capture descendants created during the grace window while the leader is
|
|
106
|
-
// still addressable, but retain the first snapshot so reparented stubborn
|
|
107
|
-
// descendants cannot disappear from the escalation set.
|
|
108
|
-
for (const treePid of await listPosixProcessTree(pid))
|
|
109
|
-
trackedPids.add(treePid);
|
|
110
|
-
signalPids(trackedPids, "SIGKILL");
|
|
111
|
-
await waitForPidsToExit(trackedPids, 1_000);
|
|
112
|
-
}
|
|
113
|
-
function abortError() {
|
|
114
|
-
const err = new Error("Agent run aborted");
|
|
115
|
-
err.name = "AbortError";
|
|
116
|
-
return err;
|
|
117
|
-
}
|
|
118
|
-
function throwIfAborted(signal) {
|
|
119
|
-
if (signal?.aborted)
|
|
120
|
-
throw abortError();
|
|
121
|
-
}
|
|
122
|
-
function createCodexImageProbe(command, cwd, signal) {
|
|
123
|
-
return new Promise((resolve, reject) => {
|
|
124
|
-
if (signal?.aborted) {
|
|
125
|
-
reject(abortError());
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
const child = spawn(command, ["exec", "--help"], {
|
|
129
|
-
cwd,
|
|
130
|
-
env: { ...process.env, PATH: pathWithCommonBins() },
|
|
131
|
-
windowsHide: true,
|
|
132
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
133
|
-
});
|
|
134
|
-
let out = "";
|
|
135
|
-
let settled = false;
|
|
136
|
-
let terminating = false;
|
|
137
|
-
const cleanup = () => {
|
|
138
|
-
clearTimeout(timer);
|
|
139
|
-
signal?.removeEventListener("abort", onAbort);
|
|
140
|
-
};
|
|
141
|
-
const done = (value) => {
|
|
142
|
-
if (settled)
|
|
143
|
-
return;
|
|
144
|
-
settled = true;
|
|
145
|
-
cleanup();
|
|
146
|
-
resolve(value);
|
|
147
|
-
};
|
|
148
|
-
const fail = (err) => {
|
|
149
|
-
if (settled)
|
|
150
|
-
return;
|
|
151
|
-
settled = true;
|
|
152
|
-
cleanup();
|
|
153
|
-
reject(err);
|
|
154
|
-
};
|
|
155
|
-
const onAbort = () => {
|
|
156
|
-
if (settled || terminating)
|
|
157
|
-
return;
|
|
158
|
-
terminating = true;
|
|
159
|
-
cleanup();
|
|
160
|
-
void terminateAttachedProcessTree(child).then(() => fail(abortError()));
|
|
161
|
-
};
|
|
162
|
-
const timer = setTimeout(() => {
|
|
163
|
-
if (settled || terminating)
|
|
164
|
-
return;
|
|
165
|
-
terminating = true;
|
|
166
|
-
cleanup();
|
|
167
|
-
void terminateAttachedProcessTree(child).then(() => done(false));
|
|
168
|
-
}, CODEX_IMAGE_PROBE_TIMEOUT_MS);
|
|
169
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
170
|
-
if (signal?.aborted)
|
|
171
|
-
onAbort();
|
|
172
|
-
child.stdout?.on("data", (chunk) => {
|
|
173
|
-
out += chunk.toString("utf8");
|
|
174
|
-
});
|
|
175
|
-
child.stderr?.on("data", (chunk) => {
|
|
176
|
-
out += chunk.toString("utf8");
|
|
177
|
-
});
|
|
178
|
-
child.on("error", () => {
|
|
179
|
-
if (!terminating)
|
|
180
|
-
done(false);
|
|
181
|
-
});
|
|
182
|
-
child.on("exit", () => {
|
|
183
|
-
if (!terminating)
|
|
184
|
-
done(/(?:^|\s)-i(?:,|\s)|--image\b/.test(out));
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
export function detectCodexImageInput(command, cwd, signal) {
|
|
189
|
-
if (signal)
|
|
190
|
-
return createCodexImageProbe(command, cwd, signal);
|
|
191
|
-
const cached = codexImageFlagCache.get(command);
|
|
192
|
-
if (cached)
|
|
193
|
-
return cached;
|
|
194
|
-
const probe = createCodexImageProbe(command, cwd);
|
|
195
|
-
codexImageFlagCache.set(command, probe);
|
|
196
|
-
return probe;
|
|
197
|
-
}
|
|
198
|
-
/** Spawn ONE headless agent run, collect stream-json to exit, return result.
|
|
199
|
-
* No time concept — a single turn. Honors AbortSignal (kills the child). */
|
|
200
|
-
export function runAgentOnce(adapter, opts, signal) {
|
|
201
|
-
return new Promise((resolve, reject) => {
|
|
202
|
-
void (async () => {
|
|
203
|
-
throwIfAborted(signal);
|
|
204
|
-
const codexImageInputSupported = adapter.kind === "codex" && (opts.imagePaths?.length ?? 0) > 0
|
|
205
|
-
? await detectCodexImageInput(opts.command, opts.cwd, signal).catch((err) => {
|
|
206
|
-
if (signal?.aborted || err?.name === "AbortError")
|
|
207
|
-
throw err;
|
|
208
|
-
return false;
|
|
209
|
-
})
|
|
210
|
-
: false;
|
|
211
|
-
throwIfAborted(signal);
|
|
212
|
-
const args = adapter.buildArgs({
|
|
213
|
-
prompt: opts.prompt,
|
|
214
|
-
resumeSessionId: opts.resumeSessionId,
|
|
215
|
-
model: opts.model,
|
|
216
|
-
permissionMode: opts.permissionMode ?? "default",
|
|
217
|
-
cwd: opts.cwd,
|
|
218
|
-
imagePaths: opts.imagePaths,
|
|
219
|
-
codexImageInputSupported,
|
|
220
|
-
});
|
|
221
|
-
throwIfAborted(signal);
|
|
222
|
-
// claude takes the prompt in argv (`-p <prompt>`) and wants stdin closed
|
|
223
|
-
// (verified: avoids a 3s wait). codex `exec` reads the prompt from stdin
|
|
224
|
-
// (argv ends with `-`), so adapters that set promptViaStdin get a piped
|
|
225
|
-
// stdin we write the prompt to.
|
|
226
|
-
const viaStdin = adapter.promptViaStdin === true;
|
|
227
|
-
const child = spawn(opts.command, args, {
|
|
228
|
-
cwd: opts.cwd,
|
|
229
|
-
env: { ...process.env, PATH: pathWithCommonBins() },
|
|
230
|
-
// Keep the agent in the owning worker/app process group. If that owner
|
|
231
|
-
// is force-terminated, the CLI and its descendants must not escape into
|
|
232
|
-
// a detached group that can keep editing the workspace unseen.
|
|
233
|
-
detached: false,
|
|
234
|
-
stdio: [viaStdin ? "pipe" : "ignore", "pipe", "pipe"],
|
|
235
|
-
});
|
|
236
|
-
let settled = false;
|
|
237
|
-
let abortRequested = false;
|
|
238
|
-
let termination;
|
|
239
|
-
const cleanup = () => {
|
|
240
|
-
signal?.removeEventListener("abort", onAbort);
|
|
241
|
-
};
|
|
242
|
-
const onAbort = () => {
|
|
243
|
-
if (abortRequested)
|
|
244
|
-
return;
|
|
245
|
-
abortRequested = true;
|
|
246
|
-
termination = terminateAttachedProcessTree(child);
|
|
247
|
-
};
|
|
248
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
249
|
-
if (signal?.aborted)
|
|
250
|
-
onAbort();
|
|
251
|
-
if (viaStdin && child.stdin) {
|
|
252
|
-
child.stdin.end(opts.prompt);
|
|
253
|
-
}
|
|
254
|
-
const lines = [];
|
|
255
|
-
if (child.stdout) {
|
|
256
|
-
const rl = createInterface({ input: child.stdout });
|
|
257
|
-
rl.on("line", (line) => lines.push(line));
|
|
258
|
-
}
|
|
259
|
-
child.on("error", (err) => {
|
|
260
|
-
if (settled)
|
|
261
|
-
return;
|
|
262
|
-
settled = true;
|
|
263
|
-
cleanup();
|
|
264
|
-
// A missing binary is the most common failure (user hasn't installed the
|
|
265
|
-
// CLI, or GUI-launched Electron's PATH misses it). Turn the cryptic
|
|
266
|
-
// "spawn codex ENOENT" into something actionable that names the command.
|
|
267
|
-
if (err.code === "ENOENT") {
|
|
268
|
-
reject(new Error(`未找到命令 "${opts.command}"。请先安装该 CLI 并确保它在 PATH 中(${adapter.kind === "codex" ? "Codex CLI" : "Claude Code CLI"})。`));
|
|
269
|
-
return;
|
|
270
|
-
}
|
|
271
|
-
reject(err);
|
|
272
|
-
});
|
|
273
|
-
child.on("exit", (code) => {
|
|
274
|
-
if (settled)
|
|
275
|
-
return;
|
|
276
|
-
settled = true;
|
|
277
|
-
cleanup();
|
|
278
|
-
void (termination ?? Promise.resolve()).then(() => {
|
|
279
|
-
resolve(runWithLines(adapter, lines, code));
|
|
280
|
-
});
|
|
281
|
-
});
|
|
282
|
-
})().catch(reject);
|
|
283
|
-
});
|
|
284
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export type ExternalAgentCli = "claude" | "codex";
|
|
2
|
-
export interface ExternalAgentSessionBinding {
|
|
3
|
-
cli: ExternalAgentCli;
|
|
4
|
-
sessionId: string;
|
|
5
|
-
cwd: string;
|
|
6
|
-
worktreePath?: string;
|
|
7
|
-
worktreeBranch?: string;
|
|
8
|
-
updatedAt: number;
|
|
9
|
-
}
|
|
10
|
-
export type ExternalAgentSessionRecord = Omit<ExternalAgentSessionBinding, "updatedAt"> & {
|
|
11
|
-
updatedAt?: number;
|
|
12
|
-
};
|
|
13
|
-
export declare function defaultExternalAgentSessionStorePath(): string;
|
|
14
|
-
export declare class ExternalAgentSessionStore {
|
|
15
|
-
private readonly file;
|
|
16
|
-
constructor(file?: string);
|
|
17
|
-
get(cli: ExternalAgentCli, sessionId: string): ExternalAgentSessionBinding | undefined;
|
|
18
|
-
record(binding: ExternalAgentSessionRecord): void;
|
|
19
|
-
private load;
|
|
20
|
-
private save;
|
|
21
|
-
private withLock;
|
|
22
|
-
}
|
|
23
|
-
export declare const externalAgentSessionStore: ExternalAgentSessionStore;
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
2
|
-
import { dirname, join } from "node:path";
|
|
3
|
-
import { codeShellHome } from "../session/session-manager.js";
|
|
4
|
-
import { logger } from "../logging/logger.js";
|
|
5
|
-
import { normalizeCwdPath } from "./cwd-normalize.js";
|
|
6
|
-
const LOCK_WAIT_MS = 5_000;
|
|
7
|
-
const LOCK_STALE_MS = 30_000;
|
|
8
|
-
const LOCK_POLL_MS = 10;
|
|
9
|
-
export function defaultExternalAgentSessionStorePath() {
|
|
10
|
-
return join(codeShellHome(), "external-agent-sessions.json");
|
|
11
|
-
}
|
|
12
|
-
export class ExternalAgentSessionStore {
|
|
13
|
-
file;
|
|
14
|
-
constructor(file = defaultExternalAgentSessionStorePath()) {
|
|
15
|
-
this.file = file;
|
|
16
|
-
}
|
|
17
|
-
get(cli, sessionId) {
|
|
18
|
-
if (!sessionId)
|
|
19
|
-
return undefined;
|
|
20
|
-
return this.load().find((s) => s.cli === cli && s.sessionId === sessionId);
|
|
21
|
-
}
|
|
22
|
-
record(binding) {
|
|
23
|
-
if (!binding.sessionId || !binding.cwd)
|
|
24
|
-
return;
|
|
25
|
-
const next = {
|
|
26
|
-
cli: binding.cli,
|
|
27
|
-
sessionId: binding.sessionId,
|
|
28
|
-
cwd: normalizeCwdPath(binding.cwd),
|
|
29
|
-
...(binding.worktreePath ? { worktreePath: binding.worktreePath } : {}),
|
|
30
|
-
...(binding.worktreeBranch ? { worktreeBranch: binding.worktreeBranch } : {}),
|
|
31
|
-
updatedAt: binding.updatedAt ?? Date.now(),
|
|
32
|
-
};
|
|
33
|
-
this.withLock(() => {
|
|
34
|
-
const sessions = this.load().filter((s) => !(s.cli === binding.cli && s.sessionId === binding.sessionId));
|
|
35
|
-
sessions.push(next);
|
|
36
|
-
this.save(sessions);
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
load() {
|
|
40
|
-
if (!existsSync(this.file))
|
|
41
|
-
return [];
|
|
42
|
-
try {
|
|
43
|
-
const raw = readFileSync(this.file, "utf-8");
|
|
44
|
-
const parsed = JSON.parse(raw);
|
|
45
|
-
if (!parsed || !Array.isArray(parsed.sessions))
|
|
46
|
-
return [];
|
|
47
|
-
return parsed.sessions.filter(isBinding).map(normalizeBinding);
|
|
48
|
-
}
|
|
49
|
-
catch (err) {
|
|
50
|
-
logger.warn("external_agent_session_store.load_failed", {
|
|
51
|
-
cat: "cc",
|
|
52
|
-
file: this.file,
|
|
53
|
-
error: err instanceof Error ? err.message : String(err),
|
|
54
|
-
});
|
|
55
|
-
return [];
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
save(sessions) {
|
|
59
|
-
const dir = dirname(this.file);
|
|
60
|
-
if (!existsSync(dir))
|
|
61
|
-
mkdirSync(dir, { recursive: true });
|
|
62
|
-
const snapshot = { version: 1, sessions };
|
|
63
|
-
const tmp = `${this.file}.${process.pid}.${Date.now()}.tmp`;
|
|
64
|
-
try {
|
|
65
|
-
writeFileSync(tmp, JSON.stringify(snapshot, null, 2) + "\n", "utf-8");
|
|
66
|
-
renameSync(tmp, this.file);
|
|
67
|
-
}
|
|
68
|
-
catch (err) {
|
|
69
|
-
rmSync(tmp, { force: true });
|
|
70
|
-
throw err;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
withLock(fn) {
|
|
74
|
-
const dir = dirname(this.file);
|
|
75
|
-
if (!existsSync(dir))
|
|
76
|
-
mkdirSync(dir, { recursive: true });
|
|
77
|
-
// TODO: move this sync polling lock to an async write queue; callers can
|
|
78
|
-
// otherwise block the event loop for up to LOCK_WAIT_MS under contention.
|
|
79
|
-
const lockDir = `${this.file}.lock`;
|
|
80
|
-
const deadline = Date.now() + LOCK_WAIT_MS;
|
|
81
|
-
while (true) {
|
|
82
|
-
try {
|
|
83
|
-
mkdirSync(lockDir);
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
catch (err) {
|
|
87
|
-
const code = err.code;
|
|
88
|
-
if (code !== "EEXIST")
|
|
89
|
-
throw err;
|
|
90
|
-
if (removeStaleLock(lockDir))
|
|
91
|
-
continue;
|
|
92
|
-
if (Date.now() >= deadline) {
|
|
93
|
-
throw new Error(`timed out waiting for external agent session store lock: ${lockDir}`, {
|
|
94
|
-
cause: err,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
sleepSync(LOCK_POLL_MS);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
try {
|
|
101
|
-
return fn();
|
|
102
|
-
}
|
|
103
|
-
finally {
|
|
104
|
-
rmSync(lockDir, { recursive: true, force: true });
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
function normalizeBinding(binding) {
|
|
109
|
-
return { ...binding, cwd: normalizeCwdPath(binding.cwd) };
|
|
110
|
-
}
|
|
111
|
-
function removeStaleLock(lockDir) {
|
|
112
|
-
try {
|
|
113
|
-
if (Date.now() - statSync(lockDir).mtimeMs <= LOCK_STALE_MS)
|
|
114
|
-
return false;
|
|
115
|
-
rmSync(lockDir, { recursive: true, force: true });
|
|
116
|
-
return true;
|
|
117
|
-
}
|
|
118
|
-
catch (err) {
|
|
119
|
-
if (err.code === "ENOENT")
|
|
120
|
-
return true;
|
|
121
|
-
return false;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
function sleepSync(ms) {
|
|
125
|
-
try {
|
|
126
|
-
const view = new Int32Array(new SharedArrayBuffer(4));
|
|
127
|
-
Atomics.wait(view, 0, 0, ms);
|
|
128
|
-
}
|
|
129
|
-
catch {
|
|
130
|
-
const until = Date.now() + ms;
|
|
131
|
-
while (Date.now() < until) {
|
|
132
|
-
// fallback for runtimes where Atomics.wait is unavailable
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
function isBinding(value) {
|
|
137
|
-
if (!value || typeof value !== "object")
|
|
138
|
-
return false;
|
|
139
|
-
const v = value;
|
|
140
|
-
return ((v.cli === "claude" || v.cli === "codex") &&
|
|
141
|
-
typeof v.sessionId === "string" &&
|
|
142
|
-
v.sessionId.length > 0 &&
|
|
143
|
-
typeof v.cwd === "string" &&
|
|
144
|
-
v.cwd.length > 0);
|
|
145
|
-
}
|
|
146
|
-
export const externalAgentSessionStore = new ExternalAgentSessionStore();
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export * from "./cc-capability.js";
|
|
2
|
-
export * from "./agent-adapter.js";
|
|
3
|
-
export * from "./external-agent-driver.js";
|
|
4
|
-
export * from "./session-discovery.js";
|
|
5
|
-
export * from "./codex-session-discovery.js";
|
|
6
|
-
export * from "./relevance-judge.js";
|
|
7
|
-
export * from "./session-history.js";
|
|
8
|
-
export * from "./codex-session-history.js";
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export * from "./cc-capability.js";
|
|
2
|
-
export * from "./agent-adapter.js";
|
|
3
|
-
export * from "./external-agent-driver.js";
|
|
4
|
-
export * from "./session-discovery.js";
|
|
5
|
-
export * from "./codex-session-discovery.js";
|
|
6
|
-
export * from "./relevance-judge.js";
|
|
7
|
-
export * from "./session-history.js";
|
|
8
|
-
export * from "./codex-session-history.js";
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export interface JudgeDecision {
|
|
2
|
-
action: "continue-same" | "continue-fresh" | "stop";
|
|
3
|
-
handoffSummary?: string;
|
|
4
|
-
reason: string;
|
|
5
|
-
}
|
|
6
|
-
export interface JudgeInput {
|
|
7
|
-
goal?: string;
|
|
8
|
-
lastResult: string;
|
|
9
|
-
nextPrompt: string;
|
|
10
|
-
}
|
|
11
|
-
/** Injected aux-model call: takes a prompt, returns raw text. */
|
|
12
|
-
export type AuxLlm = (prompt: string) => Promise<string>;
|
|
13
|
-
export declare function buildJudgePrompt(input: JudgeInput): string;
|
|
14
|
-
export declare function parseJudgeResponse(raw: string): JudgeDecision;
|
|
15
|
-
export declare function judgeContinuation(input: JudgeInput, llm: AuxLlm): Promise<JudgeDecision>;
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
const SYSTEM = `You decide how a scheduled task loop should continue after one run.
|
|
2
|
-
Reply with ONLY a JSON object: {"action": "continue-same"|"continue-fresh"|"stop", "handoffSummary"?: string, "reason": string}.
|
|
3
|
-
- "stop": the goal is met; no more runs needed.
|
|
4
|
-
- "continue-same": next run should resume the SAME session (work is related, keep context).
|
|
5
|
-
- "continue-fresh": next run should start a FRESH session because the next step is unrelated to what was just done; put a short context summary in handoffSummary.`;
|
|
6
|
-
export function buildJudgePrompt(input) {
|
|
7
|
-
return [
|
|
8
|
-
SYSTEM,
|
|
9
|
-
input.goal ? `\nOverall goal: ${input.goal}` : "",
|
|
10
|
-
`\nWhat the last run produced:\n${input.lastResult.slice(0, 4000)}`,
|
|
11
|
-
`\nThe next scheduled prompt:\n${input.nextPrompt}`,
|
|
12
|
-
`\nDecision JSON:`,
|
|
13
|
-
].join("\n");
|
|
14
|
-
}
|
|
15
|
-
export function parseJudgeResponse(raw) {
|
|
16
|
-
try {
|
|
17
|
-
const m = raw.match(/\{[\s\S]*\}/);
|
|
18
|
-
const d = JSON.parse(m ? m[0] : raw);
|
|
19
|
-
if (d.action === "stop" || d.action === "continue-fresh" || d.action === "continue-same") {
|
|
20
|
-
return { action: d.action, handoffSummary: typeof d.handoffSummary === "string" ? d.handoffSummary : undefined, reason: typeof d.reason === "string" ? d.reason : "" };
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
catch { /* fall through */ }
|
|
24
|
-
return { action: "continue-same", reason: "unparseable judge output; defaulting to continue-same" };
|
|
25
|
-
}
|
|
26
|
-
export async function judgeContinuation(input, llm) {
|
|
27
|
-
const raw = await llm(buildJudgePrompt(input));
|
|
28
|
-
return parseJudgeResponse(raw);
|
|
29
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/** Encode a cwd to claude's project dir name: every non-[A-Za-z0-9] char → '-'.
|
|
2
|
-
* Mirrors `~/.claude/projects/<encoded>` (verified against real layout). */
|
|
3
|
-
export declare function encodeCwd(cwd: string): string;
|
|
4
|
-
export interface DiscoveredSession {
|
|
5
|
-
sessionId: string;
|
|
6
|
-
firstMessage: string;
|
|
7
|
-
lastModified: number;
|
|
8
|
-
messageCount: number;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Bound how many sessions a discovery scan deep-reads + returns. Without this,
|
|
12
|
-
* `discoverSessions` read EVERY `.jsonl` file fully (title + message count) on
|
|
13
|
-
* every list open — O(all history) work that makes the CC/Codex room list slow
|
|
14
|
-
* and unwieldy once a project accumulates sessions. The default surfaces only
|
|
15
|
-
* the recent, useful slice; the UI fetches older ones on demand by passing a
|
|
16
|
-
* larger `limit` (or `sinceMs: 0`).
|
|
17
|
-
*/
|
|
18
|
-
export interface DiscoverOptions {
|
|
19
|
-
/** Max sessions to return (after the recency filter), newest first.
|
|
20
|
-
* undefined or <= 0 = no cap. */
|
|
21
|
-
limit?: number;
|
|
22
|
-
/** Only include sessions modified within this many ms of `now`.
|
|
23
|
-
* undefined or <= 0 = no window. */
|
|
24
|
-
sinceMs?: number;
|
|
25
|
-
/** Injectable clock for tests. Defaults to Date.now(). */
|
|
26
|
-
now?: number;
|
|
27
|
-
}
|
|
28
|
-
/** Default room-list window: last 2 weeks AND at most 20 — the intersection. */
|
|
29
|
-
export declare const DEFAULT_DISCOVER_LIMIT = 20;
|
|
30
|
-
export declare const DEFAULT_DISCOVER_SINCE_MS: number;
|
|
31
|
-
/**
|
|
32
|
-
* Apply the recency window + limit to mtime-sorted stats, returning the slice to
|
|
33
|
-
* deep-read. Shared by the claude + codex discovery paths so they bound work
|
|
34
|
-
* identically. `total` (caller-side) lets the UI show a "load more" affordance.
|
|
35
|
-
*/
|
|
36
|
-
export declare function selectRecentStats<T extends {
|
|
37
|
-
mtimeMs: number;
|
|
38
|
-
}>(stats: T[], opts?: DiscoverOptions): T[];
|
|
39
|
-
/** List claude sessions for `cwd`. `claudeHome` defaults to ~/.claude (override
|
|
40
|
-
* for tests). Read-only, on-demand scan; no index. Stats every file cheaply,
|
|
41
|
-
* then deep-reads (title + count) ONLY the recent slice (opts) so an old,
|
|
42
|
-
* large history doesn't get fully read on every list open. */
|
|
43
|
-
export declare function discoverSessions(cwd: string, claudeHome?: string, opts?: DiscoverOptions): DiscoveredSession[];
|
|
44
|
-
/** Count of all session files for `cwd`, cheaply (stat only). Lets the UI know
|
|
45
|
-
* whether a bounded `discoverSessions` left older sessions unshown. */
|
|
46
|
-
export declare function countSessions(cwd: string, claudeHome?: string): number;
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { readdirSync, readFileSync, statSync, existsSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
import { homedir } from "node:os";
|
|
4
|
-
/** Encode a cwd to claude's project dir name: every non-[A-Za-z0-9] char → '-'.
|
|
5
|
-
* Mirrors `~/.claude/projects/<encoded>` (verified against real layout). */
|
|
6
|
-
export function encodeCwd(cwd) {
|
|
7
|
-
return cwd.replace(/[^A-Za-z0-9]/g, "-");
|
|
8
|
-
}
|
|
9
|
-
/** Default room-list window: last 2 weeks AND at most 20 — the intersection. */
|
|
10
|
-
export const DEFAULT_DISCOVER_LIMIT = 20;
|
|
11
|
-
export const DEFAULT_DISCOVER_SINCE_MS = 14 * 24 * 60 * 60 * 1000;
|
|
12
|
-
function claudeProjectsDir(claudeHome) {
|
|
13
|
-
return join(claudeHome, "projects");
|
|
14
|
-
}
|
|
15
|
-
/** Extract first *real* user message text, skipping caveat/command noise. */
|
|
16
|
-
function firstUserMessage(lines) {
|
|
17
|
-
for (const line of lines) {
|
|
18
|
-
if (!line.trim())
|
|
19
|
-
continue;
|
|
20
|
-
let d;
|
|
21
|
-
try {
|
|
22
|
-
d = JSON.parse(line);
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
if (d.type !== "user")
|
|
28
|
-
continue;
|
|
29
|
-
const c = d.message?.content;
|
|
30
|
-
const text = typeof c === "string"
|
|
31
|
-
? c
|
|
32
|
-
: Array.isArray(c)
|
|
33
|
-
? c.map((p) => (typeof p?.text === "string" ? p.text : "")).join("")
|
|
34
|
-
: "";
|
|
35
|
-
const t = text.trim();
|
|
36
|
-
if (!t)
|
|
37
|
-
continue;
|
|
38
|
-
if (t.startsWith("<local-command-caveat>") || t.startsWith("<command-name>"))
|
|
39
|
-
continue;
|
|
40
|
-
return t.slice(0, 200);
|
|
41
|
-
}
|
|
42
|
-
return "";
|
|
43
|
-
}
|
|
44
|
-
function countUserMessages(lines) {
|
|
45
|
-
let n = 0;
|
|
46
|
-
for (const line of lines) {
|
|
47
|
-
if (!line.trim())
|
|
48
|
-
continue;
|
|
49
|
-
try {
|
|
50
|
-
if (JSON.parse(line).type === "user")
|
|
51
|
-
n++;
|
|
52
|
-
}
|
|
53
|
-
catch { /* skip */ }
|
|
54
|
-
}
|
|
55
|
-
return n;
|
|
56
|
-
}
|
|
57
|
-
/** Cheap (sessionId, mtime) pairs for every session file — stat only, no read. */
|
|
58
|
-
function listSessionStats(dir) {
|
|
59
|
-
const stats = [];
|
|
60
|
-
for (const name of readdirSync(dir)) {
|
|
61
|
-
if (!name.endsWith(".jsonl"))
|
|
62
|
-
continue;
|
|
63
|
-
const file = join(dir, name);
|
|
64
|
-
let st;
|
|
65
|
-
try {
|
|
66
|
-
st = statSync(file);
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
stats.push({ sessionId: name.replace(/\.jsonl$/, ""), file, mtimeMs: st.mtimeMs });
|
|
72
|
-
}
|
|
73
|
-
return stats;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Apply the recency window + limit to mtime-sorted stats, returning the slice to
|
|
77
|
-
* deep-read. Shared by the claude + codex discovery paths so they bound work
|
|
78
|
-
* identically. `total` (caller-side) lets the UI show a "load more" affordance.
|
|
79
|
-
*/
|
|
80
|
-
export function selectRecentStats(stats, opts = {}) {
|
|
81
|
-
const now = opts.now ?? Date.now();
|
|
82
|
-
let sel = stats.slice().sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
83
|
-
if (opts.sinceMs && opts.sinceMs > 0) {
|
|
84
|
-
const cutoff = now - opts.sinceMs;
|
|
85
|
-
sel = sel.filter((s) => s.mtimeMs >= cutoff);
|
|
86
|
-
}
|
|
87
|
-
if (opts.limit && opts.limit > 0)
|
|
88
|
-
sel = sel.slice(0, opts.limit);
|
|
89
|
-
return sel;
|
|
90
|
-
}
|
|
91
|
-
/** List claude sessions for `cwd`. `claudeHome` defaults to ~/.claude (override
|
|
92
|
-
* for tests). Read-only, on-demand scan; no index. Stats every file cheaply,
|
|
93
|
-
* then deep-reads (title + count) ONLY the recent slice (opts) so an old,
|
|
94
|
-
* large history doesn't get fully read on every list open. */
|
|
95
|
-
export function discoverSessions(cwd, claudeHome = join(homedir(), ".claude"), opts = {}) {
|
|
96
|
-
const dir = join(claudeProjectsDir(claudeHome), encodeCwd(cwd));
|
|
97
|
-
if (!existsSync(dir))
|
|
98
|
-
return [];
|
|
99
|
-
const selected = selectRecentStats(listSessionStats(dir), opts);
|
|
100
|
-
const out = [];
|
|
101
|
-
for (const s of selected) {
|
|
102
|
-
let lines;
|
|
103
|
-
try {
|
|
104
|
-
lines = readFileSync(s.file, "utf-8").split("\n");
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
continue;
|
|
108
|
-
}
|
|
109
|
-
out.push({
|
|
110
|
-
sessionId: s.sessionId,
|
|
111
|
-
firstMessage: firstUserMessage(lines),
|
|
112
|
-
lastModified: s.mtimeMs,
|
|
113
|
-
messageCount: countUserMessages(lines),
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
return out;
|
|
117
|
-
}
|
|
118
|
-
/** Count of all session files for `cwd`, cheaply (stat only). Lets the UI know
|
|
119
|
-
* whether a bounded `discoverSessions` left older sessions unshown. */
|
|
120
|
-
export function countSessions(cwd, claudeHome = join(homedir(), ".claude")) {
|
|
121
|
-
const dir = join(claudeProjectsDir(claudeHome), encodeCwd(cwd));
|
|
122
|
-
if (!existsSync(dir))
|
|
123
|
-
return 0;
|
|
124
|
-
return listSessionStats(dir).length;
|
|
125
|
-
}
|