@cjhyy/code-shell-core 0.5.0-rc.1 → 0.6.0-rc.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 +13 -10
- package/dist/agent/agent-definition-registry.d.ts +21 -3
- package/dist/agent/agent-definition-registry.js +49 -18
- package/dist/agent/agent-definition.d.ts +32 -0
- package/dist/agent/agent-definition.js +49 -4
- package/dist/arena/arena.js +11 -12
- package/dist/arena/context/context-tools.js +47 -6
- package/dist/arena/context/within-root.d.ts +7 -0
- package/dist/arena/context/within-root.js +15 -0
- package/dist/arena/iterate/phases/argue.js +8 -2
- package/dist/arena/iterate/phases/revise.js +1 -1
- package/dist/arena/iterate/phases/tournament.js +3 -3
- package/dist/arena/ledger.js +9 -1
- package/dist/arena/phases/adjudication.js +1 -4
- package/dist/arena/phases/build-consensus.js +1 -4
- package/dist/arena/phases/cross-review.js +2 -8
- package/dist/arena/phases/debate-rounds.js +1 -4
- package/dist/arena/phases/participant-research.js +1 -4
- package/dist/arena/phases/planning-detail-expansion.js +8 -10
- package/dist/arena/planner.js +0 -1
- package/dist/arena/providers/docs.d.ts +1 -0
- package/dist/arena/providers/docs.js +5 -2
- package/dist/arena/providers/repo.d.ts +1 -0
- package/dist/arena/providers/repo.js +5 -2
- package/dist/arena/strategies/utils.d.ts +1 -4
- package/dist/arena/strategies/utils.js +7 -51
- package/dist/arena/transitions.d.ts +7 -2
- package/dist/arena/transitions.js +9 -4
- package/dist/arena/types.d.ts +8 -2
- package/dist/automation/cron-expr.d.ts +41 -0
- package/dist/automation/cron-expr.js +169 -0
- package/dist/automation/index.d.ts +41 -0
- package/dist/automation/index.js +39 -0
- package/dist/automation/runner.d.ts +84 -0
- package/dist/automation/runner.js +92 -0
- package/dist/automation/scheduler.d.ts +194 -0
- package/dist/automation/scheduler.js +623 -0
- package/dist/automation/store.d.ts +39 -0
- package/dist/automation/store.js +122 -0
- package/dist/automation/write-policy.d.ts +34 -0
- package/dist/automation/write-policy.js +113 -0
- package/dist/automation/write-run.d.ts +51 -0
- package/dist/automation/write-run.js +38 -0
- package/dist/capability-control/disabled-lists.d.ts +25 -0
- package/dist/capability-control/disabled-lists.js +57 -0
- package/dist/capability-control/index.d.ts +5 -0
- package/dist/capability-control/index.js +3 -0
- package/dist/capability-control/overlay.d.ts +64 -0
- package/dist/capability-control/overlay.js +116 -0
- package/dist/capability-control/project.d.ts +65 -0
- package/dist/capability-control/project.js +147 -0
- package/dist/capability-control/service.d.ts +70 -0
- package/dist/capability-control/service.js +147 -0
- package/dist/capability-control/types.d.ts +62 -0
- package/dist/capability-control/types.js +17 -0
- package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
- package/dist/cc-orchestrator/agent-adapter.js +133 -0
- package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
- package/dist/cc-orchestrator/cc-capability.js +53 -0
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
- package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
- package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
- package/dist/cc-orchestrator/codex-session-history.js +187 -0
- package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
- package/dist/cc-orchestrator/external-agent-changes.js +214 -0
- package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
- package/dist/cc-orchestrator/external-agent-driver.js +69 -0
- package/dist/cc-orchestrator/index.d.ts +8 -0
- package/dist/cc-orchestrator/index.js +8 -0
- package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
- package/dist/cc-orchestrator/relevance-judge.js +29 -0
- package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
- package/dist/cc-orchestrator/session-discovery.js +125 -0
- package/dist/cc-orchestrator/session-history.d.ts +19 -0
- package/dist/cc-orchestrator/session-history.js +67 -0
- package/dist/cli/agent-server-stdio.d.ts +26 -1
- package/dist/cli/agent-server-stdio.js +221 -28
- package/dist/cli/agent-server-tcp.d.ts +20 -0
- package/dist/cli/agent-server-tcp.js +134 -0
- package/dist/cli/graceful-shutdown.d.ts +27 -0
- package/dist/cli/graceful-shutdown.js +30 -0
- package/dist/context/compaction.d.ts +56 -0
- package/dist/context/compaction.js +209 -15
- package/dist/context/manager.d.ts +0 -20
- package/dist/context/manager.js +25 -41
- package/dist/cost-tracker.js +5 -61
- package/dist/credentials/cipher.d.ts +49 -0
- package/dist/credentials/cipher.js +45 -0
- package/dist/credentials/cookie-jar.d.ts +24 -0
- package/dist/credentials/cookie-jar.js +40 -0
- package/dist/credentials/index.d.ts +7 -0
- package/dist/credentials/index.js +5 -0
- package/dist/credentials/inject-credential-tool.d.ts +20 -0
- package/dist/credentials/inject-credential-tool.js +130 -0
- package/dist/credentials/store.d.ts +72 -0
- package/dist/credentials/store.js +184 -0
- package/dist/credentials/types.d.ts +56 -0
- package/dist/credentials/use-credential-tool.d.ts +29 -0
- package/dist/credentials/use-credential-tool.js +205 -0
- package/dist/credentials/use-gate.d.ts +56 -0
- package/dist/credentials/use-gate.js +52 -0
- package/dist/cron/cron-runtime.d.ts +2 -0
- package/dist/cron/cron-runtime.js +2 -0
- package/dist/cron/cron-store.d.ts +2 -0
- package/dist/cron/cron-store.js +2 -0
- package/dist/cron/scheduler.d.ts +5 -32
- package/dist/cron/scheduler.js +5 -113
- package/dist/data/model-metadata.d.ts +77 -0
- package/dist/data/model-metadata.js +56 -0
- package/dist/data/model-metadata.json +216 -0
- package/dist/data/openrouter-models.d.ts +18 -7
- package/dist/data/openrouter-models.js +35 -8
- package/dist/data/openrouter-sync.js +1 -1
- package/dist/engine/aux-key.d.ts +10 -0
- package/dist/engine/aux-key.js +11 -0
- package/dist/engine/dynamic-tool-defs.d.ts +19 -0
- package/dist/engine/dynamic-tool-defs.js +36 -0
- package/dist/engine/engine.d.ts +431 -108
- package/dist/engine/engine.js +1630 -279
- package/dist/engine/friendly-error.d.ts +18 -0
- package/dist/engine/friendly-error.js +63 -0
- package/dist/engine/goal.d.ts +187 -0
- package/dist/engine/goal.js +196 -0
- package/dist/engine/image-compression.d.ts +81 -0
- package/dist/engine/image-compression.js +186 -0
- package/dist/engine/image-policy.d.ts +165 -0
- package/dist/engine/image-policy.js +189 -0
- package/dist/engine/model-connections-pool.d.ts +17 -0
- package/dist/engine/model-connections-pool.js +66 -0
- package/dist/engine/model-facade.d.ts +10 -0
- package/dist/engine/model-facade.js +25 -0
- package/dist/engine/patch-orphaned-tools.js +3 -0
- package/dist/engine/reactive-threshold.d.ts +13 -0
- package/dist/engine/reactive-threshold.js +17 -0
- package/dist/engine/resolve-llm-config.d.ts +16 -0
- package/dist/engine/resolve-llm-config.js +44 -0
- package/dist/engine/runtime.js +9 -1
- package/dist/engine/sandbox-cache-key.d.ts +10 -0
- package/dist/engine/sandbox-cache-key.js +9 -0
- package/dist/engine/sandbox-config.d.ts +31 -0
- package/dist/engine/sandbox-config.js +38 -0
- package/dist/engine/session-title.d.ts +13 -0
- package/dist/engine/session-title.js +34 -0
- package/dist/engine/session-usage.d.ts +19 -0
- package/dist/engine/session-usage.js +25 -0
- package/dist/engine/steer-queue.d.ts +32 -0
- package/dist/engine/steer-queue.js +26 -0
- package/dist/engine/streaming-tool-queue.d.ts +12 -0
- package/dist/engine/streaming-tool-queue.js +50 -10
- package/dist/engine/turn-loop.d.ts +94 -9
- package/dist/engine/turn-loop.js +775 -342
- package/dist/engine/types.d.ts +175 -0
- package/dist/engine/types.js +13 -0
- package/dist/external-agents/config.d.ts +2 -0
- package/dist/external-agents/config.js +15 -0
- package/dist/external-agents/types.d.ts +31 -0
- package/dist/external-agents/types.js +1 -0
- package/dist/git/parse-log.d.ts +13 -0
- package/dist/git/parse-log.js +21 -0
- package/dist/git/utils.d.ts +8 -6
- package/dist/git/utils.js +62 -26
- package/dist/git/worktree.d.ts +48 -0
- package/dist/git/worktree.js +111 -20
- package/dist/hooks/events.d.ts +23 -1
- package/dist/hooks/goal-stop-hook.d.ts +58 -0
- package/dist/hooks/goal-stop-hook.js +279 -0
- package/dist/hooks/hook-output.d.ts +33 -0
- package/dist/hooks/hook-output.js +79 -0
- package/dist/hooks/registry.d.ts +15 -0
- package/dist/hooks/registry.js +57 -1
- package/dist/hooks/shell-runner.d.ts +2 -0
- package/dist/hooks/shell-runner.js +48 -18
- package/dist/index.d.ts +79 -11
- package/dist/index.js +89 -6
- package/dist/llm/capabilities/param-specs.d.ts +14 -0
- package/dist/llm/capabilities/param-specs.js +62 -0
- package/dist/llm/capabilities/reasoning-control.d.ts +24 -0
- package/dist/llm/capabilities/reasoning-control.js +38 -0
- package/dist/llm/capabilities/rules.js +37 -3
- package/dist/llm/capabilities/types.d.ts +32 -2
- package/dist/llm/clamp-max-tokens.d.ts +11 -0
- package/dist/llm/clamp-max-tokens.js +17 -0
- package/dist/llm/client-base.d.ts +69 -5
- package/dist/llm/client-base.js +185 -25
- package/dist/llm/client-factory.d.ts +3 -3
- package/dist/llm/client-factory.js +2 -2
- package/dist/llm/model-cache.js +4 -2
- package/dist/llm/model-pool.d.ts +29 -11
- package/dist/llm/model-pool.js +36 -20
- package/dist/llm/provider-auth.d.ts +41 -0
- package/dist/llm/provider-auth.js +76 -0
- package/dist/llm/provider-catalog.d.ts +6 -2
- package/dist/llm/providers/anthropic.d.ts +32 -2
- package/dist/llm/providers/anthropic.js +207 -18
- package/dist/llm/providers/openai.d.ts +47 -2
- package/dist/llm/providers/openai.js +478 -71
- package/dist/llm/reasoning-setting.d.ts +51 -0
- package/dist/llm/reasoning-setting.js +40 -0
- package/dist/llm/stop-reason.d.ts +13 -0
- package/dist/llm/stop-reason.js +21 -0
- package/dist/llm/stream-watchdog.js +5 -1
- package/dist/llm/strip-vision.d.ts +32 -0
- package/dist/llm/strip-vision.js +94 -0
- package/dist/llm/token-counter.js +9 -2
- package/dist/llm/types.d.ts +9 -6
- package/dist/logging/logger.js +18 -4
- package/dist/logging/sanitize-messages.d.ts +10 -0
- package/dist/logging/sanitize-messages.js +112 -0
- package/dist/lsp/client.js +28 -8
- package/dist/lsp/manager.d.ts +1 -1
- package/dist/lsp/manager.js +42 -11
- package/dist/lsp/root-path.d.ts +9 -0
- package/dist/lsp/root-path.js +12 -0
- package/dist/model-catalog/builtin.d.ts +12 -0
- package/dist/model-catalog/builtin.js +407 -0
- package/dist/model-catalog/gen-connections.d.ts +20 -0
- package/dist/model-catalog/gen-connections.js +28 -0
- package/dist/model-catalog/index.d.ts +41 -0
- package/dist/model-catalog/index.js +90 -0
- package/dist/model-catalog/params.d.ts +20 -0
- package/dist/model-catalog/params.js +45 -0
- package/dist/model-catalog/resolve.d.ts +48 -0
- package/dist/model-catalog/resolve.js +33 -0
- package/dist/model-catalog/save-entry.d.ts +32 -0
- package/dist/model-catalog/save-entry.js +104 -0
- package/dist/model-catalog/types.d.ts +561 -0
- package/dist/model-catalog/types.js +93 -0
- package/dist/model-catalog/upsert.d.ts +9 -0
- package/dist/model-catalog/upsert.js +8 -0
- package/dist/onboarding.d.ts +12 -82
- package/dist/onboarding.js +75 -333
- package/dist/plugins/gitOps.d.ts +53 -0
- package/dist/plugins/gitOps.js +130 -5
- package/dist/plugins/installer/checkUpdate.d.ts +16 -0
- package/dist/plugins/installer/checkUpdate.js +32 -0
- package/dist/plugins/installer/codex/convertAgents.d.ts +7 -0
- package/dist/plugins/installer/codex/convertAgents.js +55 -0
- package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
- package/dist/plugins/installer/codex/convertCommands.js +46 -0
- package/dist/plugins/installer/codex/convertMcp.d.ts +11 -0
- package/dist/plugins/installer/codex/convertMcp.js +85 -0
- package/dist/plugins/installer/codex/convertSkills.d.ts +12 -0
- package/dist/plugins/installer/codex/convertSkills.js +33 -0
- package/dist/plugins/installer/detectFormat.d.ts +2 -0
- package/dist/plugins/installer/detectFormat.js +6 -0
- package/dist/plugins/installer/install.d.ts +7 -0
- package/dist/plugins/installer/install.js +123 -0
- package/dist/plugins/installer/installFromArchive.d.ts +43 -0
- package/dist/plugins/installer/installFromArchive.js +134 -0
- package/dist/plugins/installer/installFromSource.d.ts +13 -0
- package/dist/plugins/installer/installFromSource.js +51 -0
- package/dist/plugins/installer/list.d.ts +9 -0
- package/dist/plugins/installer/list.js +30 -0
- package/dist/plugins/installer/loadPluginAgents.d.ts +3 -0
- package/dist/plugins/installer/loadPluginAgents.js +27 -0
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +107 -0
- package/dist/plugins/installer/parseSource.d.ts +20 -0
- package/dist/plugins/installer/parseSource.js +74 -0
- package/dist/plugins/installer/paths.d.ts +5 -0
- package/dist/plugins/installer/paths.js +25 -0
- package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
- package/dist/plugins/installer/pruneDisabled.js +73 -0
- package/dist/plugins/installer/types.d.ts +52 -0
- package/dist/plugins/installer/types.js +28 -0
- package/dist/plugins/installer/uninstall.d.ts +2 -0
- package/dist/plugins/installer/uninstall.js +18 -0
- package/dist/plugins/installer/unzip.d.ts +14 -0
- package/dist/plugins/installer/unzip.js +82 -0
- package/dist/plugins/installer/update.d.ts +28 -0
- package/dist/plugins/installer/update.js +97 -0
- package/dist/plugins/loadPluginHooks.d.ts +54 -1
- package/dist/plugins/loadPluginHooks.js +83 -1
- package/dist/plugins/marketplaceManager.d.ts +15 -1
- package/dist/plugins/marketplaceManager.js +58 -4
- package/dist/plugins/pluginCommandHook.js +34 -14
- package/dist/plugins/pluginContent.d.ts +30 -0
- package/dist/plugins/pluginContent.js +83 -0
- package/dist/plugins/pluginInstaller.d.ts +34 -0
- package/dist/plugins/pluginInstaller.js +168 -35
- package/dist/plugins/schemas.js +41 -6
- package/dist/plugins/types.d.ts +10 -0
- package/dist/preset/index.d.ts +7 -1
- package/dist/preset/index.js +112 -6
- package/dist/product/types.d.ts +1 -1
- package/dist/prompt/composer.d.ts +31 -0
- package/dist/prompt/composer.js +95 -25
- package/dist/prompt/instruction-scanner.js +5 -3
- package/dist/prompt/section-loader.js +1 -0
- package/dist/prompt/sections/base.md +1 -0
- package/dist/prompt/sections/browser.md +10 -0
- package/dist/prompt/sections/coding.md +4 -0
- package/dist/prompt/sections/orchestration.md +8 -0
- package/dist/protocol/chat-session-manager.d.ts +15 -2
- package/dist/protocol/chat-session-manager.js +46 -0
- package/dist/protocol/chat-session.d.ts +82 -0
- package/dist/protocol/chat-session.js +121 -1
- package/dist/protocol/client.d.ts +27 -0
- package/dist/protocol/client.js +38 -0
- package/dist/protocol/redact.d.ts +50 -0
- package/dist/protocol/redact.js +71 -0
- package/dist/protocol/server.d.ts +153 -2
- package/dist/protocol/server.js +807 -39
- package/dist/protocol/tcp-transport.d.ts +45 -0
- package/dist/protocol/tcp-transport.js +74 -0
- package/dist/protocol/transport.js +3 -2
- package/dist/protocol/types.d.ts +69 -0
- package/dist/protocol/types.js +22 -0
- package/dist/quota/credentials.d.ts +3 -0
- package/dist/quota/credentials.js +80 -0
- package/dist/quota/index.d.ts +36 -0
- package/dist/quota/index.js +155 -0
- package/dist/quota/types.d.ts +48 -0
- package/dist/quota/types.js +13 -0
- package/dist/remote/bridge.d.ts +11 -2
- package/dist/remote/bridge.js +61 -33
- package/dist/review/review-prompt.d.ts +28 -0
- package/dist/review/review-prompt.js +81 -0
- package/dist/run/ArtifactTracker.js +5 -4
- package/dist/run/EngineRunner.d.ts +27 -1
- package/dist/run/EngineRunner.js +46 -8
- package/dist/run/FileRunStore.js +40 -11
- package/dist/run/RunApprovalBackend.js +25 -5
- package/dist/run/RunLock.d.ts +28 -2
- package/dist/run/RunLock.js +49 -7
- package/dist/run/RunManager.d.ts +12 -0
- package/dist/run/RunManager.js +86 -3
- package/dist/run/RunQueue.d.ts +1 -0
- package/dist/run/RunQueue.js +8 -2
- package/dist/run/factory.d.ts +8 -1
- package/dist/run/factory.js +1 -0
- package/dist/run/index.d.ts +2 -2
- package/dist/run/index.js +1 -1
- package/dist/run/redirect-target.d.ts +7 -0
- package/dist/run/redirect-target.js +13 -0
- package/dist/run/types.js +1 -1
- package/dist/runtime/background-shell.d.ts +139 -0
- package/dist/runtime/background-shell.js +495 -0
- package/dist/runtime/output-clean.d.ts +24 -0
- package/dist/runtime/output-clean.js +41 -0
- package/dist/runtime/ring-file.d.ts +64 -0
- package/dist/runtime/ring-file.js +174 -0
- package/dist/runtime/safe-spawn.js +15 -34
- package/dist/runtime/spawn-common.d.ts +148 -0
- package/dist/runtime/spawn-common.js +303 -0
- package/dist/runtime/truncate-output.d.ts +22 -0
- package/dist/runtime/truncate-output.js +49 -0
- package/dist/runtime/utf8-cut.d.ts +11 -0
- package/dist/runtime/utf8-cut.js +23 -0
- package/dist/services/auto-dream.d.ts +4 -0
- package/dist/services/auto-dream.js +26 -26
- package/dist/services/browser-open.d.ts +13 -0
- package/dist/services/browser-open.js +16 -0
- package/dist/services/diagnostics.d.ts +1 -2
- package/dist/services/diagnostics.js +12 -7
- package/dist/services/dream-consolidation.d.ts +57 -0
- package/dist/services/dream-consolidation.js +151 -0
- package/dist/services/extract-memories.d.ts +14 -1
- package/dist/services/extract-memories.js +45 -6
- package/dist/services/memory-orchestrator.d.ts +21 -0
- package/dist/services/memory-orchestrator.js +125 -32
- package/dist/services/notifier.d.ts +8 -0
- package/dist/services/notifier.js +39 -25
- package/dist/services/oauth.js +5 -7
- package/dist/services/session-memory-sort.d.ts +8 -0
- package/dist/services/session-memory-sort.js +9 -0
- package/dist/services/session-memory.js +30 -19
- package/dist/session/file-history.d.ts +124 -1
- package/dist/session/file-history.js +232 -9
- package/dist/session/memory.d.ts +116 -2
- package/dist/session/memory.js +250 -28
- package/dist/session/session-manager.d.ts +63 -1
- package/dist/session/session-manager.js +186 -5
- package/dist/session/simple-diff.d.ts +23 -0
- package/dist/session/simple-diff.js +84 -0
- package/dist/session/transcript.d.ts +25 -1
- package/dist/session/transcript.js +35 -2
- package/dist/session/undo-target.d.ts +67 -0
- package/dist/session/undo-target.js +144 -0
- package/dist/settings/disk-defaults.d.ts +42 -0
- package/dist/settings/disk-defaults.js +33 -0
- package/dist/settings/feature-flags.d.ts +64 -0
- package/dist/settings/feature-flags.js +61 -0
- package/dist/settings/manager.d.ts +101 -1
- package/dist/settings/manager.js +345 -15
- package/dist/settings/migrate-config.d.ts +45 -0
- package/dist/settings/migrate-config.js +125 -0
- package/dist/settings/personalization.d.ts +19 -0
- package/dist/settings/personalization.js +7 -0
- package/dist/settings/schema-export.d.ts +25 -0
- package/dist/settings/schema-export.js +38 -0
- package/dist/settings/schema.d.ts +1827 -396
- package/dist/settings/schema.js +361 -81
- package/dist/skills/scanner.d.ts +9 -0
- package/dist/skills/scanner.js +30 -2
- package/dist/stt/resolve-transcribe.d.ts +31 -0
- package/dist/stt/resolve-transcribe.js +108 -0
- package/dist/stt/transcribe.d.ts +51 -0
- package/dist/stt/transcribe.js +65 -0
- package/dist/tool-system/browser-bridge.d.ts +226 -0
- package/dist/tool-system/browser-bridge.js +163 -0
- package/dist/tool-system/builtin/add-marketplace.d.ts +12 -0
- package/dist/tool-system/builtin/add-marketplace.js +76 -0
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
- package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
- package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
- package/dist/tool-system/builtin/agent-notifications.js +9 -3
- package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
- package/dist/tool-system/builtin/agent-output-file.js +72 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +23 -0
- package/dist/tool-system/builtin/agent-registry.js +16 -4
- package/dist/tool-system/builtin/agent.d.ts +50 -11
- package/dist/tool-system/builtin/agent.js +576 -73
- package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
- package/dist/tool-system/builtin/apply-patch/index.js +7 -3
- package/dist/tool-system/builtin/arena.js +6 -7
- package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
- package/dist/tool-system/builtin/background-jobs.js +124 -0
- package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
- package/dist/tool-system/builtin/background-shell-tools.js +108 -0
- package/dist/tool-system/builtin/background-work.d.ts +67 -0
- package/dist/tool-system/builtin/background-work.js +86 -0
- package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
- package/dist/tool-system/builtin/bash-output-style.js +40 -0
- package/dist/tool-system/builtin/bash.d.ts +5 -2
- package/dist/tool-system/builtin/bash.js +98 -62
- package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
- package/dist/tool-system/builtin/browser-tools.js +312 -0
- package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
- package/dist/tool-system/builtin/cancel-goal.js +64 -0
- package/dist/tool-system/builtin/check-quota.d.ts +15 -0
- package/dist/tool-system/builtin/check-quota.js +34 -0
- package/dist/tool-system/builtin/complete-goal.d.ts +25 -0
- package/dist/tool-system/builtin/complete-goal.js +45 -0
- package/dist/tool-system/builtin/config.js +7 -0
- package/dist/tool-system/builtin/cron.d.ts +7 -0
- package/dist/tool-system/builtin/cron.js +105 -9
- package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
- package/dist/tool-system/builtin/drive-claude-code.js +157 -0
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +94 -0
- package/dist/tool-system/builtin/edit.d.ts +2 -1
- package/dist/tool-system/builtin/edit.js +21 -12
- package/dist/tool-system/builtin/eol.d.ts +29 -0
- package/dist/tool-system/builtin/eol.js +37 -0
- package/dist/tool-system/builtin/file-cache.d.ts +6 -0
- package/dist/tool-system/builtin/file-cache.js +8 -0
- package/dist/tool-system/builtin/generate-image.d.ts +60 -0
- package/dist/tool-system/builtin/generate-image.js +374 -0
- package/dist/tool-system/builtin/generate-video.d.ts +55 -0
- package/dist/tool-system/builtin/generate-video.js +361 -0
- package/dist/tool-system/builtin/grep.js +6 -2
- package/dist/tool-system/builtin/image-providers.d.ts +86 -0
- package/dist/tool-system/builtin/image-providers.js +190 -0
- package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
- package/dist/tool-system/builtin/image-uploader.js +74 -0
- package/dist/tool-system/builtin/index.d.ts +24 -1
- package/dist/tool-system/builtin/index.js +310 -25
- package/dist/tool-system/builtin/mcp-tools.js +23 -3
- package/dist/tool-system/builtin/memory.js +45 -7
- package/dist/tool-system/builtin/notebook-edit.d.ts +2 -1
- package/dist/tool-system/builtin/notebook-edit.js +1 -1
- package/dist/tool-system/builtin/powershell.js +4 -1
- package/dist/tool-system/builtin/read.d.ts +2 -1
- package/dist/tool-system/builtin/read.js +11 -3
- package/dist/tool-system/builtin/repl.js +4 -1
- package/dist/tool-system/builtin/skill.js +9 -0
- package/dist/tool-system/builtin/sleep.js +12 -5
- package/dist/tool-system/builtin/task.js +4 -1
- package/dist/tool-system/builtin/tool-search.js +25 -7
- package/dist/tool-system/builtin/update-automation-memory.d.ts +24 -0
- package/dist/tool-system/builtin/update-automation-memory.js +60 -0
- package/dist/tool-system/builtin/video-providers.d.ts +154 -0
- package/dist/tool-system/builtin/video-providers.js +235 -0
- package/dist/tool-system/builtin/view-image.d.ts +18 -0
- package/dist/tool-system/builtin/view-image.js +96 -0
- package/dist/tool-system/builtin/web-fetch.js +12 -2
- package/dist/tool-system/builtin/web-search.d.ts +4 -1
- package/dist/tool-system/builtin/web-search.js +57 -10
- package/dist/tool-system/builtin/worktree.d.ts +2 -1
- package/dist/tool-system/builtin/worktree.js +31 -4
- package/dist/tool-system/builtin/write.d.ts +2 -1
- package/dist/tool-system/builtin/write.js +1 -1
- package/dist/tool-system/context.d.ts +166 -6
- package/dist/tool-system/executor.d.ts +3 -2
- package/dist/tool-system/executor.js +197 -119
- package/dist/tool-system/investigation-guard.d.ts +4 -1
- package/dist/tool-system/investigation-guard.js +20 -4
- package/dist/tool-system/mcp-manager.d.ts +78 -16
- package/dist/tool-system/mcp-manager.js +357 -28
- package/dist/tool-system/path-policy.d.ts +99 -0
- package/dist/tool-system/path-policy.js +578 -0
- package/dist/tool-system/permission.d.ts +36 -1
- package/dist/tool-system/permission.js +322 -117
- package/dist/tool-system/plan-mode-allowlist.d.ts +32 -0
- package/dist/tool-system/plan-mode-allowlist.js +65 -0
- package/dist/tool-system/registry.d.ts +1 -0
- package/dist/tool-system/registry.js +26 -1
- package/dist/tool-system/sandbox/index.d.ts +8 -0
- package/dist/tool-system/sandbox/index.js +7 -2
- package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
- package/dist/tool-system/validate-tool-metadata.js +63 -0
- package/dist/tool-system/validation.d.ts +10 -0
- package/dist/tool-system/validation.js +16 -3
- package/dist/types.d.ts +301 -15
- package/dist/updater.js +20 -9
- package/dist/utils/envUtils.d.ts +0 -9
- package/dist/utils/envUtils.js +3 -28
- package/dist/utils/exec.d.ts +40 -0
- package/dist/utils/exec.js +144 -0
- package/dist/utils/format.js +4 -2
- package/dist/utils/json.d.ts +12 -0
- package/dist/utils/json.js +92 -0
- package/dist/utils/lockfile.js +9 -2
- package/dist/utils/theme.d.ts +7 -1
- package/dist/utils/theme.js +5 -3
- package/dist/utils/toolDisplay.js +0 -1
- package/package.json +14 -7
- package/dist/agent/coordinator.d.ts +0 -49
- package/dist/agent/coordinator.js +0 -77
- package/dist/settings/manager.test.js +0 -73
- package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
- package/dist/tool-system/builtin/remote-trigger.js +0 -54
- package/dist/tool-system/builtin/send-message.d.ts +0 -6
- package/dist/tool-system/builtin/send-message.js +0 -47
- /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
package/dist/arena/planner.js
CHANGED
|
@@ -99,10 +99,13 @@ function safeReadDoc(filePath) {
|
|
|
99
99
|
return null;
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
|
-
function truncate(content) {
|
|
102
|
+
export function truncate(content) {
|
|
103
103
|
if (content.length <= MAX_DOC_CHARS)
|
|
104
104
|
return content;
|
|
105
105
|
const t = content.slice(0, MAX_DOC_CHARS);
|
|
106
106
|
const lastNl = t.lastIndexOf("\n");
|
|
107
|
-
|
|
107
|
+
// No newline in the window → lastNl is -1 and slice(0,-1) would drop just
|
|
108
|
+
// the last char; cut at MAX_DOC_CHARS instead.
|
|
109
|
+
const body = lastNl > 0 ? t.slice(0, lastNl) : t;
|
|
110
|
+
return body + `\n... (truncated, ${content.length} chars total)`;
|
|
108
111
|
}
|
|
@@ -192,12 +192,15 @@ function safeReadFile(filePath) {
|
|
|
192
192
|
return null;
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
|
-
function truncate(content) {
|
|
195
|
+
export function truncate(content) {
|
|
196
196
|
if (content.length <= MAX_FILE_CHARS)
|
|
197
197
|
return content;
|
|
198
198
|
const t = content.slice(0, MAX_FILE_CHARS);
|
|
199
199
|
const lastNl = t.lastIndexOf("\n");
|
|
200
|
-
|
|
200
|
+
// No newline in the window (e.g. a minified file) → lastNl is -1 and
|
|
201
|
+
// slice(0,-1) would drop just the last char; cut at MAX_FILE_CHARS instead.
|
|
202
|
+
const body = lastNl > 0 ? t.slice(0, lastNl) : t;
|
|
203
|
+
return body + `\n... (truncated, ${content.length} chars total)`;
|
|
201
204
|
}
|
|
202
205
|
async function safeGrep(pattern) {
|
|
203
206
|
try {
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
/** Shared utilities for arena strategy implementations. */
|
|
2
2
|
import type { ArenaBaseContext, FindingReview, ParticipantReport, ArenaConsensus, ArenaRoadmapPhaseDetail, ClaimRecord, ClaimChallenge, ClaimAdjudication, ClaimStatusSummary, DebateTurn, RoundResearchDigest } from "../types.js";
|
|
3
|
-
|
|
4
|
-
export declare function extractJSON(text: string): string;
|
|
5
|
-
/** Extract a JSON array from text */
|
|
6
|
-
export declare function extractJSONArray(text: string): string;
|
|
3
|
+
export { extractJSON, extractJSONArray } from "../../utils/json.js";
|
|
7
4
|
/** Format base context into a readable text block for LLM prompts */
|
|
8
5
|
export declare function formatBaseContext(ctx: ArenaBaseContext): string;
|
|
9
6
|
/** Format participant reports for cross-review or consensus prompts */
|
|
@@ -22,57 +22,13 @@ function sanitizeForPrompt(text) {
|
|
|
22
22
|
.replace(/^(?:IGNORE|DISREGARD|FORGET|OVERRIDE|SYSTEM|INSTRUCTION)[:\s].*/gim, "")
|
|
23
23
|
.slice(0, 3000);
|
|
24
24
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const start = text.indexOf("{");
|
|
33
|
-
if (start !== -1) {
|
|
34
|
-
let depth = 0;
|
|
35
|
-
let inString = false;
|
|
36
|
-
let escape = false;
|
|
37
|
-
for (let i = start; i < text.length; i++) {
|
|
38
|
-
const ch = text[i];
|
|
39
|
-
if (escape) {
|
|
40
|
-
escape = false;
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
if (ch === "\\") {
|
|
44
|
-
escape = true;
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
if (ch === '"') {
|
|
48
|
-
inString = !inString;
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
if (inString)
|
|
52
|
-
continue;
|
|
53
|
-
if (ch === "{")
|
|
54
|
-
depth++;
|
|
55
|
-
else if (ch === "}") {
|
|
56
|
-
depth--;
|
|
57
|
-
if (depth === 0)
|
|
58
|
-
return text.slice(start, i + 1);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
// Unbalanced — return from start to end as best effort
|
|
62
|
-
return text.slice(start);
|
|
63
|
-
}
|
|
64
|
-
return text;
|
|
65
|
-
}
|
|
66
|
-
/** Extract a JSON array from text */
|
|
67
|
-
export function extractJSONArray(text) {
|
|
68
|
-
const fenced = text.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
|
|
69
|
-
if (fenced)
|
|
70
|
-
return fenced[1].trim();
|
|
71
|
-
const arrayMatch = text.match(/\[[\s\S]*\]/);
|
|
72
|
-
if (arrayMatch)
|
|
73
|
-
return arrayMatch[0];
|
|
74
|
-
return text;
|
|
75
|
-
}
|
|
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";
|
|
76
32
|
/** Format base context into a readable text block for LLM prompts */
|
|
77
33
|
export function formatBaseContext(ctx) {
|
|
78
34
|
const sections = [];
|
|
@@ -5,9 +5,14 @@
|
|
|
5
5
|
* consistent state transitions across phases.
|
|
6
6
|
*
|
|
7
7
|
* State machine:
|
|
8
|
-
* proposed → under_review
|
|
9
|
-
* under_review → verified | contested | rejected
|
|
8
|
+
* proposed → under_review | unresolved
|
|
9
|
+
* under_review → verified | contested | rejected | unresolved
|
|
10
10
|
* contested → under_review | unresolved | verified | rejected
|
|
11
|
+
*
|
|
12
|
+
* `unresolved` is reachable from proposed/under_review (not just contested):
|
|
13
|
+
* adjudication sweeps any claims left in those states when the round/budget
|
|
14
|
+
* is exhausted (adjudication.ts) — without these edges markUnresolved() would
|
|
15
|
+
* silently no-op and the claims would be dropped from the consensus summary.
|
|
11
16
|
*/
|
|
12
17
|
import type { ClaimRecord, ClaimStatus, ClaimChallenge } from "./types.js";
|
|
13
18
|
/**
|
|
@@ -5,14 +5,19 @@
|
|
|
5
5
|
* consistent state transitions across phases.
|
|
6
6
|
*
|
|
7
7
|
* State machine:
|
|
8
|
-
* proposed → under_review
|
|
9
|
-
* under_review → verified | contested | rejected
|
|
8
|
+
* proposed → under_review | unresolved
|
|
9
|
+
* under_review → verified | contested | rejected | unresolved
|
|
10
10
|
* contested → under_review | unresolved | verified | rejected
|
|
11
|
+
*
|
|
12
|
+
* `unresolved` is reachable from proposed/under_review (not just contested):
|
|
13
|
+
* adjudication sweeps any claims left in those states when the round/budget
|
|
14
|
+
* is exhausted (adjudication.ts) — without these edges markUnresolved() would
|
|
15
|
+
* silently no-op and the claims would be dropped from the consensus summary.
|
|
11
16
|
*/
|
|
12
17
|
/** Valid transitions from each status */
|
|
13
18
|
const VALID_TRANSITIONS = {
|
|
14
|
-
proposed: ["under_review"],
|
|
15
|
-
under_review: ["verified", "contested", "rejected"],
|
|
19
|
+
proposed: ["under_review", "unresolved"],
|
|
20
|
+
under_review: ["verified", "contested", "rejected", "unresolved"],
|
|
16
21
|
contested: ["under_review", "unresolved", "verified", "rejected"],
|
|
17
22
|
verified: [],
|
|
18
23
|
rejected: [],
|
package/dist/arena/types.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* V2 architecture: shared facts → independent research → findings → cross-review → consensus.
|
|
5
5
|
*/
|
|
6
|
-
import type { LLMConfig } from "../types.js";
|
|
6
|
+
import type { ClientDefaults, LLMConfig } from "../types.js";
|
|
7
7
|
/** Arena operating mode — determines prompts, output format, and default rounds */
|
|
8
8
|
export type ArenaMode = "review" | "discussion" | "planning";
|
|
9
9
|
/** Analysis lens — the perspective from which participants analyze */
|
|
@@ -87,8 +87,14 @@ export declare const ARENA_MODE_DEFAULTS: Record<ArenaMode, {
|
|
|
87
87
|
export interface ArenaParticipant {
|
|
88
88
|
/** Display name, e.g. "Claude Sonnet", "GPT-4o" */
|
|
89
89
|
name: string;
|
|
90
|
-
/** LLM config for this participant */
|
|
90
|
+
/** LLM config for this participant (pure model identity) */
|
|
91
91
|
llm: LLMConfig;
|
|
92
|
+
/**
|
|
93
|
+
* Cross-model client knobs (temperature/timeout/etc.). Arena hardcodes
|
|
94
|
+
* temperature here so debate participants speak with consistent sampling
|
|
95
|
+
* regardless of the user's session preference.
|
|
96
|
+
*/
|
|
97
|
+
clientDefaults?: ClientDefaults;
|
|
92
98
|
}
|
|
93
99
|
export interface ArenaBaseContext {
|
|
94
100
|
/** Evidence-driven plan that drives the session */
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal 5-field cron expression parser + timezone-aware next-trigger
|
|
3
|
+
* calculator. No third-party dependency (core keeps its dep set tight).
|
|
4
|
+
*
|
|
5
|
+
* Fields: minute(0-59) hour(0-23) dayOfMonth(1-31) month(1-12) dayOfWeek(0-6, 0=Sun)
|
|
6
|
+
* Syntax per field: star | star-slash-n | a | a-b | a-b-slash-n | comma-lists of those.
|
|
7
|
+
*
|
|
8
|
+
* Timezone handling uses Intl.DateTimeFormat with a timeZone option to derive
|
|
9
|
+
* the wall-clock parts of a candidate UTC instant in the target zone — correct
|
|
10
|
+
* across DST without a tz library. nextCronTime steps minute-by-minute from the
|
|
11
|
+
* reference and returns the first future instant whose wall-clock parts (in tz)
|
|
12
|
+
* match every field. Bounded to ~2 years so an unsatisfiable expression can't
|
|
13
|
+
* loop forever.
|
|
14
|
+
*/
|
|
15
|
+
export interface ParsedCron {
|
|
16
|
+
minutes: Set<number>;
|
|
17
|
+
hours: Set<number>;
|
|
18
|
+
daysOfMonth: Set<number>;
|
|
19
|
+
months: Set<number>;
|
|
20
|
+
daysOfWeek: Set<number>;
|
|
21
|
+
/**
|
|
22
|
+
* Whether the dayOfMonth / dayOfWeek FIELD was restricted (anything other
|
|
23
|
+
* than a bare "*"). Vixie-cron semantics: when BOTH day fields are
|
|
24
|
+
* restricted, a tick matches if EITHER matches (OR); when only one is
|
|
25
|
+
* restricted, the "*" one is ignored and the restricted one governs. We
|
|
26
|
+
* can't recover this from the value Set alone ("*" and an explicit full
|
|
27
|
+
* range both expand to the full set), so we capture it at parse time.
|
|
28
|
+
*/
|
|
29
|
+
domRestricted: boolean;
|
|
30
|
+
dowRestricted: boolean;
|
|
31
|
+
}
|
|
32
|
+
/** Cheap check: is this string a 5-field cron expression (vs an interval like "5m")? */
|
|
33
|
+
export declare function isCronExpression(s: string): boolean;
|
|
34
|
+
/** Parse a 5-field cron expression into per-field value sets. Throws on invalid input. */
|
|
35
|
+
export declare function parseCronExpression(expr: string): ParsedCron;
|
|
36
|
+
/**
|
|
37
|
+
* Return the next UTC instant (ms) strictly after `fromMs` whose wall-clock
|
|
38
|
+
* time in `timeZone` matches `cron`. Returns null if none within ~2 years
|
|
39
|
+
* (e.g. an impossible expression like Feb 30).
|
|
40
|
+
*/
|
|
41
|
+
export declare function nextCronTime(cron: ParsedCron, timeZone: string, fromMs: number): number | null;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal 5-field cron expression parser + timezone-aware next-trigger
|
|
3
|
+
* calculator. No third-party dependency (core keeps its dep set tight).
|
|
4
|
+
*
|
|
5
|
+
* Fields: minute(0-59) hour(0-23) dayOfMonth(1-31) month(1-12) dayOfWeek(0-6, 0=Sun)
|
|
6
|
+
* Syntax per field: star | star-slash-n | a | a-b | a-b-slash-n | comma-lists of those.
|
|
7
|
+
*
|
|
8
|
+
* Timezone handling uses Intl.DateTimeFormat with a timeZone option to derive
|
|
9
|
+
* the wall-clock parts of a candidate UTC instant in the target zone — correct
|
|
10
|
+
* across DST without a tz library. nextCronTime steps minute-by-minute from the
|
|
11
|
+
* reference and returns the first future instant whose wall-clock parts (in tz)
|
|
12
|
+
* match every field. Bounded to ~2 years so an unsatisfiable expression can't
|
|
13
|
+
* loop forever.
|
|
14
|
+
*/
|
|
15
|
+
const SPECS = [
|
|
16
|
+
{ min: 0, max: 59 }, // minute
|
|
17
|
+
{ min: 0, max: 23 }, // hour
|
|
18
|
+
{ min: 1, max: 31 }, // day of month
|
|
19
|
+
{ min: 1, max: 12 }, // month
|
|
20
|
+
{ min: 0, max: 6 }, // day of week
|
|
21
|
+
];
|
|
22
|
+
/** Cheap check: is this string a 5-field cron expression (vs an interval like "5m")? */
|
|
23
|
+
export function isCronExpression(s) {
|
|
24
|
+
if (typeof s !== "string")
|
|
25
|
+
return false;
|
|
26
|
+
const parts = s.trim().split(/\s+/);
|
|
27
|
+
if (parts.length !== 5)
|
|
28
|
+
return false;
|
|
29
|
+
// Every field must contain only cron field characters.
|
|
30
|
+
return parts.every((p) => /^[\d*/,-]+$/.test(p));
|
|
31
|
+
}
|
|
32
|
+
function parseField(field, spec) {
|
|
33
|
+
const out = new Set();
|
|
34
|
+
for (const part of field.split(",")) {
|
|
35
|
+
// Split optional step: "a-b/n" or "*/n" or "a/n"
|
|
36
|
+
const [rangePart, stepPart] = part.split("/");
|
|
37
|
+
const step = stepPart === undefined ? 1 : parseInt(stepPart, 10);
|
|
38
|
+
if (!Number.isInteger(step) || step <= 0) {
|
|
39
|
+
throw new Error(`Invalid cron step in "${field}"`);
|
|
40
|
+
}
|
|
41
|
+
let lo;
|
|
42
|
+
let hi;
|
|
43
|
+
if (rangePart === "*") {
|
|
44
|
+
lo = spec.min;
|
|
45
|
+
hi = spec.max;
|
|
46
|
+
}
|
|
47
|
+
else if (rangePart.includes("-")) {
|
|
48
|
+
const [a, b] = rangePart.split("-");
|
|
49
|
+
lo = parseInt(a, 10);
|
|
50
|
+
hi = parseInt(b, 10);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
lo = parseInt(rangePart, 10);
|
|
54
|
+
hi = lo;
|
|
55
|
+
}
|
|
56
|
+
if (!Number.isInteger(lo) || !Number.isInteger(hi)) {
|
|
57
|
+
throw new Error(`Invalid cron field "${field}"`);
|
|
58
|
+
}
|
|
59
|
+
if (lo < spec.min || hi > spec.max || lo > hi) {
|
|
60
|
+
throw new Error(`cron field "${field}" out of range [${spec.min}-${spec.max}]`);
|
|
61
|
+
}
|
|
62
|
+
for (let v = lo; v <= hi; v += step)
|
|
63
|
+
out.add(v);
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
/** Parse a 5-field cron expression into per-field value sets. Throws on invalid input. */
|
|
68
|
+
export function parseCronExpression(expr) {
|
|
69
|
+
const parts = expr.trim().split(/\s+/);
|
|
70
|
+
if (parts.length !== 5) {
|
|
71
|
+
throw new Error(`cron expression must have 5 fields, got ${parts.length}: "${expr}"`);
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
minutes: parseField(parts[0], SPECS[0]),
|
|
75
|
+
hours: parseField(parts[1], SPECS[1]),
|
|
76
|
+
daysOfMonth: parseField(parts[2], SPECS[2]),
|
|
77
|
+
months: parseField(parts[3], SPECS[3]),
|
|
78
|
+
daysOfWeek: parseField(parts[4], SPECS[4]),
|
|
79
|
+
// A bare "*" is unrestricted; anything else (a number, range, list, or even
|
|
80
|
+
// "*/n") restricts the field for the OR rule below.
|
|
81
|
+
domRestricted: parts[2].trim() !== "*",
|
|
82
|
+
dowRestricted: parts[4].trim() !== "*",
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// Cache one formatter per timezone — constructing Intl.DateTimeFormat is costly.
|
|
86
|
+
const formatterCache = new Map();
|
|
87
|
+
function getFormatter(timeZone) {
|
|
88
|
+
let fmt = formatterCache.get(timeZone);
|
|
89
|
+
if (!fmt) {
|
|
90
|
+
fmt = new Intl.DateTimeFormat("en-US", {
|
|
91
|
+
timeZone,
|
|
92
|
+
hour12: false,
|
|
93
|
+
year: "numeric",
|
|
94
|
+
month: "2-digit",
|
|
95
|
+
day: "2-digit",
|
|
96
|
+
hour: "2-digit",
|
|
97
|
+
minute: "2-digit",
|
|
98
|
+
weekday: "short",
|
|
99
|
+
});
|
|
100
|
+
formatterCache.set(timeZone, fmt);
|
|
101
|
+
}
|
|
102
|
+
return fmt;
|
|
103
|
+
}
|
|
104
|
+
const WEEKDAY_INDEX = {
|
|
105
|
+
Sun: 0,
|
|
106
|
+
Mon: 1,
|
|
107
|
+
Tue: 2,
|
|
108
|
+
Wed: 3,
|
|
109
|
+
Thu: 4,
|
|
110
|
+
Fri: 5,
|
|
111
|
+
Sat: 6,
|
|
112
|
+
};
|
|
113
|
+
/** Derive the wall-clock parts of a UTC instant `ms` as seen in `timeZone`. */
|
|
114
|
+
function wallClockInZone(ms, timeZone) {
|
|
115
|
+
const parts = getFormatter(timeZone).formatToParts(new Date(ms));
|
|
116
|
+
const get = (type) => parts.find((p) => p.type === type)?.value ?? "";
|
|
117
|
+
// hour can come back as "24" at midnight in some environments; normalize.
|
|
118
|
+
let hour = parseInt(get("hour"), 10);
|
|
119
|
+
if (hour === 24)
|
|
120
|
+
hour = 0;
|
|
121
|
+
return {
|
|
122
|
+
minute: parseInt(get("minute"), 10),
|
|
123
|
+
hour,
|
|
124
|
+
dayOfMonth: parseInt(get("day"), 10),
|
|
125
|
+
month: parseInt(get("month"), 10),
|
|
126
|
+
dayOfWeek: WEEKDAY_INDEX[get("weekday")] ?? 0,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function matches(cron, wc) {
|
|
130
|
+
if (!cron.minutes.has(wc.minute))
|
|
131
|
+
return false;
|
|
132
|
+
if (!cron.hours.has(wc.hour))
|
|
133
|
+
return false;
|
|
134
|
+
if (!cron.months.has(wc.month))
|
|
135
|
+
return false;
|
|
136
|
+
// Day-of-month vs day-of-week per Vixie/POSIX cron:
|
|
137
|
+
// - both restricted → match if EITHER matches (OR)
|
|
138
|
+
// - only one restricted → that one governs (the "*" one is ignored)
|
|
139
|
+
// - neither restricted → matches every day
|
|
140
|
+
const domHit = cron.daysOfMonth.has(wc.dayOfMonth);
|
|
141
|
+
const dowHit = cron.daysOfWeek.has(wc.dayOfWeek);
|
|
142
|
+
if (cron.domRestricted && cron.dowRestricted)
|
|
143
|
+
return domHit || dowHit;
|
|
144
|
+
if (cron.domRestricted)
|
|
145
|
+
return domHit;
|
|
146
|
+
if (cron.dowRestricted)
|
|
147
|
+
return dowHit;
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
const MINUTE_MS = 60_000;
|
|
151
|
+
// ~2 years of minutes — bounds the search for an unsatisfiable expression.
|
|
152
|
+
const MAX_STEPS = 2 * 366 * 24 * 60;
|
|
153
|
+
/**
|
|
154
|
+
* Return the next UTC instant (ms) strictly after `fromMs` whose wall-clock
|
|
155
|
+
* time in `timeZone` matches `cron`. Returns null if none within ~2 years
|
|
156
|
+
* (e.g. an impossible expression like Feb 30).
|
|
157
|
+
*/
|
|
158
|
+
export function nextCronTime(cron, timeZone, fromMs) {
|
|
159
|
+
// Start at the next whole minute strictly after fromMs (cron has minute
|
|
160
|
+
// granularity; we never return the reference instant itself).
|
|
161
|
+
let candidate = Math.floor(fromMs / MINUTE_MS) * MINUTE_MS + MINUTE_MS;
|
|
162
|
+
for (let i = 0; i < MAX_STEPS; i++) {
|
|
163
|
+
const wc = wallClockInZone(candidate, timeZone);
|
|
164
|
+
if (matches(cron, wc))
|
|
165
|
+
return candidate;
|
|
166
|
+
candidate += MINUTE_MS;
|
|
167
|
+
}
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* automation/ — zero-environment-dependency scheduling module.
|
|
3
|
+
*
|
|
4
|
+
* Hosts (Electron main, future CLI server) load this module and inject their
|
|
5
|
+
* own store + runner. The module imports nothing from Electron/Ink and makes
|
|
6
|
+
* no GUI/TTY assumptions, so the same code runs in any host
|
|
7
|
+
* (docs/automation-plan-2026-05-31.md, D1).
|
|
8
|
+
*/
|
|
9
|
+
import { CronScheduler } from "./scheduler.js";
|
|
10
|
+
import { type CronRunner, type RunSubmitter } from "./runner.js";
|
|
11
|
+
import type { CronStore } from "./store.js";
|
|
12
|
+
export interface StartAutomationDeps {
|
|
13
|
+
/** Persistence backend (injected; module never picks a path itself). */
|
|
14
|
+
store: CronStore;
|
|
15
|
+
/**
|
|
16
|
+
* Execution backend. Provide exactly one:
|
|
17
|
+
* - `runner`: a one-shot run callback (Phase 1 direct-Engine path).
|
|
18
|
+
* - `runManager`: a RunManager submitter (Phase 2 — runs land in RunStore
|
|
19
|
+
* with full history/checkpoint/resume).
|
|
20
|
+
*/
|
|
21
|
+
runner?: CronRunner;
|
|
22
|
+
runManager?: RunSubmitter;
|
|
23
|
+
}
|
|
24
|
+
export interface AutomationHandle {
|
|
25
|
+
scheduler: CronScheduler;
|
|
26
|
+
/** Halt all timers and release the scheduler. Idempotent. */
|
|
27
|
+
stop(): void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Wire a scheduler to a host-provided store + execution backend and restore
|
|
31
|
+
* persisted jobs. Returns a handle the host keeps for its lifetime. Prefers
|
|
32
|
+
* `runManager` when both are supplied (it gives run history).
|
|
33
|
+
*/
|
|
34
|
+
export declare function startAutomation(deps: StartAutomationDeps): AutomationHandle;
|
|
35
|
+
export { CronScheduler, cronScheduler, type CronJob } from "./scheduler.js";
|
|
36
|
+
export { CronStore, defaultCronStorePath } from "./store.js";
|
|
37
|
+
export { bindCronToEngine, bindCronToRunManager, type CronRunner, type CronRunRequest, type CronRunResult, type RunSubmitter, } from "./runner.js";
|
|
38
|
+
export { isCronExpression, parseCronExpression, nextCronTime, type ParsedCron, } from "./cron-expr.js";
|
|
39
|
+
export type { CronPermissionLevel, CreateJobOptions, UpdateJobPatch } from "./scheduler.js";
|
|
40
|
+
export { resolveWritePolicy, wrapUntrustedInput, type WritePolicy, } from "./write-policy.js";
|
|
41
|
+
export { runWriteJobInWorktree, type WriteJobGitOps, type RunWriteJobInput, type RunWriteJobResult, } from "./write-run.js";
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* automation/ — zero-environment-dependency scheduling module.
|
|
3
|
+
*
|
|
4
|
+
* Hosts (Electron main, future CLI server) load this module and inject their
|
|
5
|
+
* own store + runner. The module imports nothing from Electron/Ink and makes
|
|
6
|
+
* no GUI/TTY assumptions, so the same code runs in any host
|
|
7
|
+
* (docs/automation-plan-2026-05-31.md, D1).
|
|
8
|
+
*/
|
|
9
|
+
import { CronScheduler } from "./scheduler.js";
|
|
10
|
+
import { bindCronToEngine, bindCronToRunManager, } from "./runner.js";
|
|
11
|
+
/**
|
|
12
|
+
* Wire a scheduler to a host-provided store + execution backend and restore
|
|
13
|
+
* persisted jobs. Returns a handle the host keeps for its lifetime. Prefers
|
|
14
|
+
* `runManager` when both are supplied (it gives run history).
|
|
15
|
+
*/
|
|
16
|
+
export function startAutomation(deps) {
|
|
17
|
+
const scheduler = new CronScheduler(deps.store);
|
|
18
|
+
if (deps.runManager) {
|
|
19
|
+
bindCronToRunManager(scheduler, deps.runManager);
|
|
20
|
+
}
|
|
21
|
+
else if (deps.runner) {
|
|
22
|
+
bindCronToEngine(scheduler, deps.runner);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
throw new Error("startAutomation requires either a runner or a runManager");
|
|
26
|
+
}
|
|
27
|
+
scheduler.loadJobs();
|
|
28
|
+
return {
|
|
29
|
+
scheduler,
|
|
30
|
+
stop: () => scheduler.stopAll(),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// Re-export the building blocks so hosts import everything from one place.
|
|
34
|
+
export { CronScheduler, cronScheduler } from "./scheduler.js";
|
|
35
|
+
export { CronStore, defaultCronStorePath } from "./store.js";
|
|
36
|
+
export { bindCronToEngine, bindCronToRunManager, } from "./runner.js";
|
|
37
|
+
export { isCronExpression, parseCronExpression, nextCronTime, } from "./cron-expr.js";
|
|
38
|
+
export { resolveWritePolicy, wrapUntrustedInput, } from "./write-policy.js";
|
|
39
|
+
export { runWriteJobInWorktree, } from "./write-run.js";
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cron-runtime — wire the CronScheduler's executor to a real run backend.
|
|
3
|
+
*
|
|
4
|
+
* B1 fix: `CronScheduler.setExecutor` was never called in production, so cron
|
|
5
|
+
* jobs were created and ticked but did nothing on fire. `bindCronToEngine`
|
|
6
|
+
* installs an executor that, for each fired job, hands a one-shot headless run
|
|
7
|
+
* request to the caller-supplied `runner`.
|
|
8
|
+
*
|
|
9
|
+
* Security contract: cron runs unattended, so each job's permission tier
|
|
10
|
+
* (`job.permissionLevel`) is resolved through `resolveWritePolicy`, which maps
|
|
11
|
+
* the tier to a permissionMode + approval backend (see write-policy.ts). The
|
|
12
|
+
* mode stays "default" so the classifier doesn't add its own acceptEdits
|
|
13
|
+
* auto-allow rules ahead of the backend — the backend is the single source of
|
|
14
|
+
* truth for what a tier permits. An undefined/unknown tier falls back to the
|
|
15
|
+
* read-only backend.
|
|
16
|
+
*/
|
|
17
|
+
import type { CronJob } from "./scheduler.js";
|
|
18
|
+
import type { CronScheduler } from "./scheduler.js";
|
|
19
|
+
import type { PermissionMode } from "../types.js";
|
|
20
|
+
import type { ApprovalBackend } from "../tool-system/permission.js";
|
|
21
|
+
import type { SandboxMode } from "../tool-system/sandbox/index.js";
|
|
22
|
+
/** What the executor hands to the run backend for one fired job. */
|
|
23
|
+
export interface CronRunRequest {
|
|
24
|
+
job: CronJob;
|
|
25
|
+
/** The prompt to run — `job.prompt`, surfaced for convenience. */
|
|
26
|
+
prompt: string;
|
|
27
|
+
/** Permission mode the run must use (see security contract above). */
|
|
28
|
+
permissionMode: PermissionMode;
|
|
29
|
+
/** Approval backend the run must install (resolved from the job's tier). */
|
|
30
|
+
approvalBackend: ApprovalBackend;
|
|
31
|
+
/** Sandbox mode the run should confine writes/shell to (resolved from the
|
|
32
|
+
* job's tier). The host runner must forward this to `Engine({ sandbox })`
|
|
33
|
+
* so even a `full` tier can't escape the workspace — defense in depth on
|
|
34
|
+
* top of the approval backend. */
|
|
35
|
+
sandboxMode: SandboxMode;
|
|
36
|
+
/** Abort signal for the run — tripped by `CronScheduler.abort(jobId)` when
|
|
37
|
+
* the run must be cancelled mid-flight (e.g. the user deletes its session
|
|
38
|
+
* while it's still executing). Forward to `Engine.run({ signal })`. */
|
|
39
|
+
signal?: AbortSignal;
|
|
40
|
+
}
|
|
41
|
+
export interface CronRunResult {
|
|
42
|
+
text: string;
|
|
43
|
+
reason: string;
|
|
44
|
+
/**
|
|
45
|
+
* When present, this fire hit a PERMANENT failure that will recur every tick
|
|
46
|
+
* (e.g. a `resumeSessionId` whose session was deleted). The scheduler should
|
|
47
|
+
* auto-disable the job with `stop.reason` rather than silently retrying
|
|
48
|
+
* forever. Absent = transient/normal outcome; keep scheduling.
|
|
49
|
+
*/
|
|
50
|
+
stop?: {
|
|
51
|
+
reason: string;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** The pluggable run backend. Production wires this to a headless Engine run;
|
|
55
|
+
* tests pass a stub. Phase 5 will swap this for a RunManager.submit() path. */
|
|
56
|
+
export type CronRunner = (req: CronRunRequest) => Promise<CronRunResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Install the cron executor. After this call, a fired job invokes `runner`
|
|
59
|
+
* with a run request whose permission tier comes from the job. A thrown error
|
|
60
|
+
* is logged (`logCronFailure`) and re-thrown so the scheduler's catch records
|
|
61
|
+
* stats and keeps ticking — one transient bad run never stops future ticks. A
|
|
62
|
+
* PERMANENT failure the runner flags via `result.stop` (e.g. a resume target
|
|
63
|
+
* whose session was deleted) auto-disables the job with that reason, so it
|
|
64
|
+
* stops silently retrying forever.
|
|
65
|
+
*/
|
|
66
|
+
export declare function bindCronToEngine(scheduler: CronScheduler, runner: CronRunner): void;
|
|
67
|
+
/** Minimal structural view of RunManager.submit the executor needs. */
|
|
68
|
+
export interface RunSubmitter {
|
|
69
|
+
submit(input: {
|
|
70
|
+
objective: string;
|
|
71
|
+
cwd?: string;
|
|
72
|
+
metadata?: Record<string, unknown>;
|
|
73
|
+
}): Promise<{
|
|
74
|
+
runId: string;
|
|
75
|
+
}>;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Wire the scheduler to submit each fired job into a RunManager. Records the
|
|
79
|
+
* resulting runId back onto the job (`lastRunId`) so the UI can link a job to
|
|
80
|
+
* its latest run in the RunStore. Read-only is enforced at the RunManager level
|
|
81
|
+
* by the host injecting `approvalBackend: HeadlessApprovalBackend("approve-read-only")`
|
|
82
|
+
* into createRunManager (Phase 2) until sandbox+write tiers land (Phase 4/5).
|
|
83
|
+
*/
|
|
84
|
+
export declare function bindCronToRunManager(scheduler: CronScheduler, runManager: RunSubmitter): void;
|