@adhdev/daemon-core 0.9.82-rc.49 → 0.9.82-rc.490
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/dist/boot/daemon-lifecycle.d.ts +9 -0
- package/dist/boot/process-hardening.d.ts +50 -0
- package/dist/build-info.d.ts +37 -0
- package/dist/chat/source-machine.d.ts +166 -0
- package/dist/chat/source-resolver.d.ts +104 -0
- package/dist/chat/subscription-updates.d.ts +1 -0
- package/dist/cli-adapter-types.d.ts +68 -2
- package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
- package/dist/cli-adapters/cli-state-engine.d.ts +220 -0
- package/dist/cli-adapters/provider-cli-adapter.d.ts +137 -64
- package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
- package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
- package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
- package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
- package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
- package/dist/cli-adapters/resolve-executable.d.ts +69 -0
- package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
- package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
- package/dist/cli-adapters/terminal-screen.d.ts +4 -11
- package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
- package/dist/commands/chat-commands-read.d.ts +23 -0
- package/dist/commands/chat-commands-scope.d.ts +39 -0
- package/dist/commands/chat-commands-shared.d.ts +33 -0
- package/dist/commands/chat-commands-write.d.ts +14 -0
- package/dist/commands/chat-commands.d.ts +10 -23
- package/dist/commands/cli-manager.d.ts +71 -1
- package/dist/commands/handler.d.ts +125 -0
- package/dist/commands/high-family/index.d.ts +3 -0
- package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
- package/dist/commands/high-family/mesh-events.d.ts +2 -0
- package/dist/commands/high-family/mesh-status.d.ts +2 -0
- package/dist/commands/high-family/types.d.ts +64 -0
- package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
- package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
- package/dist/commands/low-family/diagnostics.d.ts +2 -0
- package/dist/commands/low-family/index.d.ts +3 -0
- package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
- package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
- package/dist/commands/low-family/notification.d.ts +2 -0
- package/dist/commands/low-family/refine-config.d.ts +2 -0
- package/dist/commands/low-family/session-host.d.ts +2 -0
- package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
- package/dist/commands/low-family/status-meta.d.ts +2 -0
- package/dist/commands/low-family/types.d.ts +33 -0
- package/dist/commands/med-family/cli-agent.d.ts +2 -0
- package/dist/commands/med-family/fast-forward.d.ts +2 -0
- package/dist/commands/med-family/ide.d.ts +10 -0
- package/dist/commands/med-family/index.d.ts +3 -0
- package/dist/commands/med-family/mesh-crud.d.ts +48 -0
- package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
- package/dist/commands/med-family/mesh-queue.d.ts +2 -0
- package/dist/commands/med-family/mesh-restart.d.ts +2 -0
- package/dist/commands/med-family/types.d.ts +152 -0
- package/dist/commands/mesh-coordinator.d.ts +85 -1
- package/dist/commands/router-aggregate-status.d.ts +24 -0
- package/dist/commands/router-mesh-session-owner.d.ts +59 -0
- package/dist/commands/router-refine.d.ts +151 -0
- package/dist/commands/router-worktree-cleanup.d.ts +133 -0
- package/dist/commands/router.d.ts +203 -15
- package/dist/commands/upgrade-helper.d.ts +41 -1
- package/dist/config/chat-history.d.ts +11 -0
- package/dist/config/config.d.ts +19 -0
- package/dist/config/mesh-config.d.ts +65 -0
- package/dist/config/mesh-json-config.d.ts +199 -0
- package/dist/config/registry-resolver.d.ts +54 -0
- package/dist/config/repo-settings.d.ts +77 -0
- package/dist/config/state-store.d.ts +30 -0
- package/dist/daemon/dev-server.d.ts +0 -2
- package/dist/detection/cli-detector.d.ts +17 -0
- package/dist/detection/ide-detector.d.ts +13 -0
- package/dist/detection/win32-ide-version.d.ts +37 -0
- package/dist/git/change-impact-config.d.ts +159 -0
- package/dist/git/git-commands.d.ts +26 -2
- package/dist/git/git-diff.d.ts +6 -0
- package/dist/git/git-executor.d.ts +11 -0
- package/dist/git/git-status.d.ts +80 -0
- package/dist/git/git-types.d.ts +2 -50
- package/dist/git/git-worktree.d.ts +71 -1
- package/dist/git/index.d.ts +3 -1
- package/dist/index.d.ts +70 -17
- package/dist/index.js +53532 -19073
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +53283 -18989
- package/dist/index.mjs.map +1 -1
- package/dist/installer.d.ts +1 -4
- package/dist/ipc/local-ipc-server.d.ts +91 -0
- package/dist/launch.d.ts +1 -1
- package/dist/logging/async-batch-writer.d.ts +10 -0
- package/dist/logging/debug-config.d.ts +16 -0
- package/dist/logging/log-redactor.d.ts +24 -0
- package/dist/logging/log-tail-reader.d.ts +81 -0
- package/dist/logging/logger.d.ts +1 -1
- package/dist/mesh/contracts.d.ts +256 -0
- package/dist/mesh/coordinator-prompt.d.ts +76 -0
- package/dist/mesh/coordinator-registry.d.ts +59 -0
- package/dist/mesh/mesh-active-work.d.ts +203 -0
- package/dist/mesh/mesh-clone-grace.d.ts +8 -0
- package/dist/mesh/mesh-completion-synthesis.d.ts +4 -0
- package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
- package/dist/mesh/mesh-delivery-policy.d.ts +104 -0
- package/dist/mesh/mesh-event-classify.d.ts +7 -0
- package/dist/mesh/mesh-event-forwarding.d.ts +58 -0
- package/dist/mesh/mesh-event-trace.d.ts +21 -0
- package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
- package/dist/mesh/mesh-events-pending.d.ts +258 -0
- package/dist/mesh/mesh-events-stale.d.ts +61 -0
- package/dist/mesh/mesh-events-utils.d.ts +75 -0
- package/dist/mesh/mesh-events.d.ts +6 -49
- package/dist/mesh/mesh-fast-forward.d.ts +81 -0
- package/dist/mesh/mesh-host-ownership.d.ts +21 -1
- package/dist/mesh/mesh-init.d.ts +128 -0
- package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
- package/dist/mesh/mesh-ledger.d.ts +139 -1
- package/dist/mesh/mesh-magi-status.d.ts +63 -0
- package/dist/mesh/mesh-missions.d.ts +281 -0
- package/dist/mesh/mesh-node-identity.d.ts +310 -0
- package/dist/mesh/mesh-queue-assignment.d.ts +162 -0
- package/dist/mesh/mesh-reconcile-acked-hold.d.ts +17 -0
- package/dist/mesh/mesh-reconcile-config.d.ts +6 -0
- package/dist/mesh/mesh-reconcile-identity.d.ts +6 -0
- package/dist/mesh/mesh-reconcile-loop.d.ts +84 -0
- package/dist/mesh/mesh-reconcile-v2-backstop.d.ts +16 -0
- package/dist/mesh/mesh-refine-batch.d.ts +68 -0
- package/dist/mesh/mesh-refine-gates.d.ts +457 -0
- package/dist/mesh/mesh-refine-status.d.ts +62 -0
- package/dist/mesh/mesh-remote-event-pull.d.ts +15 -0
- package/dist/mesh/mesh-review-inbox.d.ts +90 -0
- package/dist/mesh/mesh-routing.d.ts +70 -0
- package/dist/mesh/mesh-runtime-store.d.ts +567 -0
- package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
- package/dist/mesh/mesh-task-inflight.d.ts +46 -0
- package/dist/mesh/mesh-task-stats.d.ts +49 -0
- package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +34 -0
- package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
- package/dist/mesh/mesh-work-queue.d.ts +392 -1
- package/dist/mesh/preview-freshness.d.ts +28 -0
- package/dist/mesh/refine-config.d.ts +97 -0
- package/dist/mesh/worktree-bootstrap-config.d.ts +219 -0
- package/dist/providers/acp-provider-instance.d.ts +5 -0
- package/dist/providers/approval-utils.d.ts +46 -0
- package/dist/providers/chat-message-normalization.d.ts +58 -1
- package/dist/providers/cli-provider-effect-format.d.ts +30 -0
- package/dist/providers/cli-provider-history-dedup.d.ts +17 -0
- package/dist/providers/cli-provider-input-prompt.d.ts +12 -0
- package/dist/providers/cli-provider-instance-types.d.ts +45 -0
- package/dist/providers/cli-provider-instance.d.ts +426 -30
- package/dist/providers/cli-provider-status-helpers.d.ts +46 -0
- package/dist/providers/cli-provider-transcript-merge.d.ts +7 -0
- package/dist/providers/contracts.d.ts +196 -6
- package/dist/providers/external-sources.d.ts +71 -0
- package/dist/providers/manual-attendance.d.ts +79 -0
- package/dist/providers/native-history/antigravity-claim-registry.d.ts +39 -0
- package/dist/providers/native-history/antigravity-cli-transcript.d.ts +137 -0
- package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
- package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
- package/dist/providers/native-history/constants.d.ts +12 -0
- package/dist/providers/native-history/dispatcher.d.ts +44 -0
- package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
- package/dist/providers/native-history/index.d.ts +13 -0
- package/dist/providers/provider-instance-manager.d.ts +30 -0
- package/dist/providers/provider-instance.d.ts +31 -1
- package/dist/providers/provider-loader.d.ts +42 -5
- package/dist/providers/provider-trust.d.ts +31 -0
- package/dist/providers/read-chat-contract.d.ts +29 -0
- package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
- package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
- package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
- package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
- package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
- package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
- package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
- package/dist/providers/sdk/v1/index.d.ts +30 -0
- package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
- package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
- package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
- package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
- package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
- package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
- package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
- package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
- package/dist/providers/spec/adapter.d.ts +98 -0
- package/dist/providers/spec/cli-adapter.d.ts +223 -0
- package/dist/providers/spec/evaluator.d.ts +45 -0
- package/dist/providers/spec/fsm-driver.d.ts +449 -0
- package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
- package/dist/providers/spec/fsm-loader.d.ts +14 -0
- package/dist/providers/spec/fsm-types.d.ts +202 -0
- package/dist/providers/spec/native-history-executor.d.ts +41 -0
- package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
- package/dist/providers/spec/route.d.ts +4 -0
- package/dist/providers/spec/types.d.ts +244 -0
- package/dist/providers/status-monitor.d.ts +7 -7
- package/dist/providers/transcript-v2.d.ts +176 -0
- package/dist/providers/types/interactive-prompt.d.ts +84 -0
- package/dist/providers/working-dir.d.ts +17 -0
- package/dist/repo-mesh-types.d.ts +616 -12
- package/dist/runtime-defaults.d.ts +2 -0
- package/dist/session-host/managed-host.d.ts +64 -0
- package/dist/session-host/runtime-surface.d.ts +10 -16
- package/dist/sessions/registry.d.ts +26 -0
- package/dist/shared-types-extra.d.ts +2 -4
- package/dist/shared-types.d.ts +110 -55
- package/dist/status/chat-tail-hot-sessions.d.ts +40 -0
- package/dist/status/normalize.d.ts +1 -1
- package/dist/status/normalize.js +1 -0
- package/dist/status/normalize.js.map +1 -1
- package/dist/status/normalize.mjs +1 -0
- package/dist/status/normalize.mjs.map +1 -1
- package/dist/status/reporter.d.ts +2 -0
- package/dist/status/snapshot.d.ts +27 -0
- package/dist/system/hash.d.ts +8 -0
- package/dist/system/load-better-sqlite3.d.ts +21 -0
- package/dist/types.d.ts +20 -6
- package/package.json +11 -4
- package/src/agent-stream/poller.ts +2 -3
- package/src/agent-stream/provider-adapter.ts +1 -1
- package/src/boot/daemon-lifecycle.ts +80 -14
- package/src/boot/process-hardening.ts +89 -0
- package/src/build-info.ts +73 -0
- package/src/chat/source-machine.ts +534 -0
- package/src/chat/source-resolver.ts +0 -0
- package/src/chat/subscription-updates.ts +20 -1
- package/src/cli-adapter-types.d.ts +3 -1
- package/src/cli-adapter-types.ts +68 -2
- package/src/cli-adapters/cli-script-runner.ts +421 -0
- package/src/cli-adapters/cli-state-engine.ts +1282 -0
- package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
- package/src/cli-adapters/provider-cli-adapter.ts +1048 -1143
- package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
- package/src/cli-adapters/provider-cli-parse.ts +19 -0
- package/src/cli-adapters/provider-cli-runtime.ts +56 -7
- package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
- package/src/cli-adapters/provider-cli-shared.ts +121 -11
- package/src/cli-adapters/pty-transport.ts +2 -1
- package/src/cli-adapters/pty-write-chunking.ts +106 -0
- package/src/cli-adapters/raw-terminal-io.ts +252 -0
- package/src/cli-adapters/resolve-executable.ts +204 -0
- package/src/cli-adapters/session-host-transport.ts +2 -1
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
- package/src/cli-adapters/terminal-backends/types.ts +10 -3
- package/src/cli-adapters/terminal-screen.ts +16 -81
- package/src/commands/chat-commands-debug-bundle.ts +398 -0
- package/src/commands/chat-commands-read.ts +2788 -0
- package/src/commands/chat-commands-scope.ts +54 -0
- package/src/commands/chat-commands-shared.ts +114 -0
- package/src/commands/chat-commands-write.ts +891 -0
- package/src/commands/chat-commands.ts +19 -1841
- package/src/commands/cli-manager.d.ts +2 -0
- package/src/commands/cli-manager.ts +724 -27
- package/src/commands/handler.ts +865 -2
- package/src/commands/high-family/index.ts +28 -0
- package/src/commands/high-family/mesh-coordinator-launch.ts +696 -0
- package/src/commands/high-family/mesh-events.ts +102 -0
- package/src/commands/high-family/mesh-status.ts +857 -0
- package/src/commands/high-family/types.ts +80 -0
- package/src/commands/low-family/coordinator-prompt.ts +125 -0
- package/src/commands/low-family/daemon-lifecycle.ts +120 -0
- package/src/commands/low-family/diagnostics.ts +57 -0
- package/src/commands/low-family/index.ts +37 -0
- package/src/commands/low-family/mesh-ledger.ts +62 -0
- package/src/commands/low-family/mesh-node-logs.ts +87 -0
- package/src/commands/low-family/notification.ts +116 -0
- package/src/commands/low-family/refine-config.ts +106 -0
- package/src/commands/low-family/session-host.ts +282 -0
- package/src/commands/low-family/spec-providerdev.ts +217 -0
- package/src/commands/low-family/status-meta.ts +112 -0
- package/src/commands/low-family/types.ts +39 -0
- package/src/commands/med-family/cli-agent.ts +270 -0
- package/src/commands/med-family/fast-forward.ts +230 -0
- package/src/commands/med-family/ide.ts +163 -0
- package/src/commands/med-family/index.ts +37 -0
- package/src/commands/med-family/mesh-crud.ts +1268 -0
- package/src/commands/med-family/mesh-host-pairing.ts +234 -0
- package/src/commands/med-family/mesh-queue.ts +167 -0
- package/src/commands/med-family/mesh-restart.ts +92 -0
- package/src/commands/med-family/types.ts +153 -0
- package/src/commands/mesh-coordinator.ts +334 -124
- package/src/commands/router-aggregate-status.ts +209 -0
- package/src/commands/router-mesh-session-owner.ts +114 -0
- package/src/commands/router-refine.ts +1794 -0
- package/src/commands/router-worktree-cleanup.ts +870 -0
- package/src/commands/router.ts +567 -4149
- package/src/commands/stream-commands.ts +8 -0
- package/src/commands/upgrade-helper.ts +310 -45
- package/src/config/chat-history.ts +517 -24
- package/src/config/config.ts +30 -0
- package/src/config/mesh-config.ts +300 -24
- package/src/config/mesh-json-config.ts +376 -0
- package/src/config/recent-activity.ts +8 -2
- package/src/config/registry-resolver.ts +100 -0
- package/src/config/repo-settings.ts +111 -0
- package/src/config/state-store.ts +55 -0
- package/src/daemon/dev-auto-implement.ts +3 -2
- package/src/daemon/dev-cli-debug.ts +10 -1
- package/src/daemon/dev-server.ts +0 -541
- package/src/detection/cli-detector.ts +94 -9
- package/src/detection/ide-detector.ts +55 -16
- package/src/detection/win32-ide-version.ts +106 -0
- package/src/git/change-impact-config.ts +354 -0
- package/src/git/git-commands.ts +112 -16
- package/src/git/git-diff.ts +81 -11
- package/src/git/git-executor.ts +12 -0
- package/src/git/git-status.ts +822 -48
- package/src/git/git-types.ts +14 -62
- package/src/git/git-worktree.ts +261 -4
- package/src/git/index.ts +17 -0
- package/src/index.ts +190 -13
- package/src/installer.d.ts +1 -1
- package/src/installer.ts +8 -6
- package/src/ipc/local-ipc-server.ts +278 -0
- package/src/launch.d.ts +1 -1
- package/src/launch.ts +37 -28
- package/src/logging/async-batch-writer.ts +55 -0
- package/src/logging/command-log.ts +7 -5
- package/src/logging/debug-config.ts +25 -0
- package/src/logging/debug-trace.ts +7 -2
- package/src/logging/log-redactor.ts +100 -0
- package/src/logging/log-tail-reader.ts +341 -0
- package/src/logging/logger.ts +14 -7
- package/src/mesh/contracts.ts +510 -0
- package/src/mesh/coordinator-prompt.ts +627 -34
- package/src/mesh/coordinator-registry.ts +121 -0
- package/src/mesh/mesh-active-work.ts +706 -0
- package/src/mesh/mesh-clone-grace.ts +68 -0
- package/src/mesh/mesh-completion-synthesis.ts +416 -0
- package/src/mesh/mesh-coordinator-config.ts +97 -0
- package/src/mesh/mesh-delivery-policy.ts +284 -0
- package/src/mesh/mesh-event-classify.ts +78 -0
- package/src/mesh/mesh-event-forwarding.ts +2030 -0
- package/src/mesh/mesh-event-trace.ts +67 -0
- package/src/mesh/mesh-events-coordinator.ts +32 -0
- package/src/mesh/mesh-events-pending.ts +1548 -0
- package/src/mesh/mesh-events-stale.ts +452 -0
- package/src/mesh/mesh-events-utils.ts +443 -0
- package/src/mesh/mesh-events.ts +43 -1035
- package/src/mesh/mesh-fast-forward.ts +856 -0
- package/src/mesh/mesh-host-ownership.ts +41 -3
- package/src/mesh/mesh-init.ts +350 -0
- package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
- package/src/mesh/mesh-ledger.ts +897 -102
- package/src/mesh/mesh-magi-status.ts +223 -0
- package/src/mesh/mesh-missions.ts +695 -0
- package/src/mesh/mesh-node-identity.ts +2065 -0
- package/src/mesh/mesh-queue-assignment.ts +2498 -0
- package/src/mesh/mesh-reconcile-acked-hold.ts +230 -0
- package/src/mesh/mesh-reconcile-config.ts +66 -0
- package/src/mesh/mesh-reconcile-identity.ts +103 -0
- package/src/mesh/mesh-reconcile-loop.ts +1696 -0
- package/src/mesh/mesh-reconcile-v2-backstop.ts +62 -0
- package/src/mesh/mesh-refine-batch.ts +205 -0
- package/src/mesh/mesh-refine-gates.ts +1792 -0
- package/src/mesh/mesh-refine-status.ts +231 -0
- package/src/mesh/mesh-remote-event-pull.ts +279 -0
- package/src/mesh/mesh-review-inbox.ts +308 -0
- package/src/mesh/mesh-routing.ts +291 -0
- package/src/mesh/mesh-runtime-store.ts +2292 -0
- package/src/mesh/mesh-scheduling-runtime.ts +198 -0
- package/src/mesh/mesh-task-inflight.ts +70 -0
- package/src/mesh/mesh-task-stats.ts +161 -0
- package/src/mesh/mesh-unresolved-forward-outbox.ts +215 -0
- package/src/mesh/mesh-warmup-deadline.ts +152 -0
- package/src/mesh/mesh-work-queue.ts +1489 -145
- package/src/mesh/preview-freshness.ts +163 -0
- package/src/mesh/refine-config.ts +129 -12
- package/src/mesh/worktree-bootstrap-config.ts +599 -0
- package/src/providers/acp-provider-instance.ts +43 -10
- package/src/providers/approval-utils.d.ts +5 -0
- package/src/providers/approval-utils.ts +100 -6
- package/src/providers/chat-message-normalization.ts +126 -4
- package/src/providers/cli-provider-effect-format.ts +53 -0
- package/src/providers/cli-provider-history-dedup.ts +75 -0
- package/src/providers/cli-provider-input-prompt.ts +133 -0
- package/src/providers/cli-provider-instance-types.ts +131 -0
- package/src/providers/cli-provider-instance.ts +2771 -499
- package/src/providers/cli-provider-status-helpers.ts +123 -0
- package/src/providers/cli-provider-transcript-merge.ts +114 -0
- package/src/providers/contracts.d.ts +55 -0
- package/src/providers/contracts.ts +207 -6
- package/src/providers/extension-provider-instance.ts +12 -7
- package/src/providers/external-sources.ts +218 -0
- package/src/providers/ide-provider-instance.ts +35 -12
- package/src/providers/manual-attendance.ts +105 -0
- package/src/providers/native-history/antigravity-claim-registry.ts +138 -0
- package/src/providers/native-history/antigravity-cli-transcript.ts +1275 -0
- package/src/providers/native-history/claude-cli-transcript.ts +396 -0
- package/src/providers/native-history/codex-cli-transcript.ts +479 -0
- package/src/providers/native-history/constants.ts +19 -0
- package/src/providers/native-history/dispatcher.ts +617 -0
- package/src/providers/native-history/hermes-cli-transcript.ts +312 -0
- package/src/providers/native-history/index.ts +30 -0
- package/src/providers/provider-instance-manager.ts +71 -0
- package/src/providers/provider-instance.ts +24 -1
- package/src/providers/provider-loader.ts +700 -55
- package/src/providers/provider-schema.ts +93 -14
- package/src/providers/provider-trust.ts +114 -0
- package/src/providers/read-chat-contract.ts +76 -16
- package/src/providers/sdk/README.md +49 -0
- package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
- package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval.ts +261 -0
- package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
- package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
- package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
- package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
- package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
- package/src/providers/sdk/v1/index.ts +152 -0
- package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
- package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
- package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
- package/src/providers/sdk/v1/schemas/cli/provider.schema.json +538 -0
- package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
- package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
- package/src/providers/sdk/v1/types/cli/index.ts +365 -0
- package/src/providers/sdk/v1/types/common/index.ts +229 -0
- package/src/providers/sdk/v1/validators/index.ts +19 -0
- package/src/providers/sdk/v1/validators/manifest.ts +110 -0
- package/src/providers/sdk/v1/validators/taint.ts +309 -0
- package/src/providers/spec/adapter.ts +246 -0
- package/src/providers/spec/cli-adapter.ts +1064 -0
- package/src/providers/spec/evaluator.ts +407 -0
- package/src/providers/spec/fsm-driver.ts +1528 -0
- package/src/providers/spec/fsm-evaluator.ts +290 -0
- package/src/providers/spec/fsm-loader.ts +128 -0
- package/src/providers/spec/fsm-types.ts +301 -0
- package/src/providers/spec/native-history-executor.ts +1241 -0
- package/src/providers/spec/pre-launch-trust.ts +104 -0
- package/src/providers/spec/route.ts +51 -0
- package/src/providers/spec/types.ts +284 -0
- package/src/providers/status-monitor.d.ts +7 -7
- package/src/providers/status-monitor.ts +37 -22
- package/src/providers/transcript-v2.ts +567 -0
- package/src/providers/types/interactive-prompt.ts +536 -0
- package/src/providers/version-archive.ts +64 -24
- package/src/providers/working-dir.ts +23 -0
- package/src/repo-mesh-types.ts +861 -14
- package/src/runtime-defaults.ts +39 -0
- package/src/session-host/managed-host.ts +218 -0
- package/src/session-host/runtime-surface.ts +20 -80
- package/src/sessions/registry.ts +44 -0
- package/src/shared-types-extra.ts +2 -4
- package/src/shared-types.d.ts +8 -0
- package/src/shared-types.ts +148 -55
- package/src/status/builders.ts +69 -6
- package/src/status/chat-tail-hot-sessions.ts +117 -2
- package/src/status/normalize.ts +2 -0
- package/src/status/reporter.ts +19 -1
- package/src/status/snapshot.ts +100 -27
- package/src/system/hash.ts +23 -0
- package/src/system/host-memory.ts +29 -12
- package/src/system/load-better-sqlite3.ts +68 -0
- package/src/types.ts +26 -6
- package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
- package/dist/mesh/mesh-sync.d.ts +0 -53
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
- package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
- package/src/mesh/mesh-sync.ts +0 -111
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
|
|
5
|
+
export type PreviewFreshnessStatus = 'fresh' | 'stale' | 'unknown' | 'not_configured';
|
|
6
|
+
|
|
7
|
+
export interface PreviewFreshness {
|
|
8
|
+
status: PreviewFreshnessStatus;
|
|
9
|
+
lastPreviewCommit: string | null;
|
|
10
|
+
currentMainCommit: string | null;
|
|
11
|
+
currentMainCommitSource: 'origin/main' | 'HEAD' | 'unknown';
|
|
12
|
+
recordPath: string;
|
|
13
|
+
lastDeployedAt?: string;
|
|
14
|
+
lastTarget?: string;
|
|
15
|
+
previewVersion?: string;
|
|
16
|
+
targets: Record<'npm' | 'server' | 'web', {
|
|
17
|
+
commit: string | null;
|
|
18
|
+
deployedAt?: string;
|
|
19
|
+
status: PreviewFreshnessStatus;
|
|
20
|
+
}>;
|
|
21
|
+
nextAction: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const PREVIEW_DEPLOY_RECORD = '.adhdev/preview-deploy.json';
|
|
25
|
+
|
|
26
|
+
// Repo-relative driver scripts that indicate this repository actually ships the
|
|
27
|
+
// preview-deploy pipeline. Presence of any one of these (or the deploy record,
|
|
28
|
+
// or a `deploy:preview` npm script) means the private release-pipeline guidance
|
|
29
|
+
// carried by buildPreviewFreshness is relevant here. In every other repo the
|
|
30
|
+
// pipeline is not configured and the guidance must NOT leak (F15).
|
|
31
|
+
const PREVIEW_PIPELINE_SCRIPTS = [
|
|
32
|
+
'scripts/preview-freshness.mjs',
|
|
33
|
+
'scripts/smoke-preview-web.mjs',
|
|
34
|
+
'scripts/deploy-preview-local.mjs',
|
|
35
|
+
] as const;
|
|
36
|
+
|
|
37
|
+
function hasDeployPreviewNpmScript(repoRoot: string): boolean {
|
|
38
|
+
const pkgPath = resolve(repoRoot, 'package.json');
|
|
39
|
+
if (!existsSync(pkgPath)) return false;
|
|
40
|
+
try {
|
|
41
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as { scripts?: Record<string, unknown> };
|
|
42
|
+
return typeof pkg?.scripts?.['deploy:preview'] === 'string';
|
|
43
|
+
} catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Gate: does this repository actually configure the preview-deploy pipeline?
|
|
50
|
+
*
|
|
51
|
+
* The preview-freshness surface embeds this project's private release-pipeline
|
|
52
|
+
* instructions (`npm run deploy:preview`, smoke preview, …). Those are only
|
|
53
|
+
* meaningful in a repo that ships the pipeline. An external repo joined to a
|
|
54
|
+
* mesh must not have that guidance leak into its coordinator prompt, so this
|
|
55
|
+
* gate keeps the surface off unless a concrete pipeline artifact is present.
|
|
56
|
+
*/
|
|
57
|
+
export function isPreviewPipelineConfigured(repoRoot: string): boolean {
|
|
58
|
+
// Strongest signal: the repo has produced a preview-deploy record before.
|
|
59
|
+
if (existsSync(resolve(repoRoot, PREVIEW_DEPLOY_RECORD))) return true;
|
|
60
|
+
// Otherwise the pipeline's own driver scripts are enough.
|
|
61
|
+
if (PREVIEW_PIPELINE_SCRIPTS.some((rel) => existsSync(resolve(repoRoot, rel)))) return true;
|
|
62
|
+
// Or the `deploy:preview` npm script that fronts the pipeline.
|
|
63
|
+
return hasDeployPreviewNpmScript(repoRoot);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function runGit(repoRoot: string, args: readonly string[]): string {
|
|
67
|
+
try {
|
|
68
|
+
return execFileSync('git', args, {
|
|
69
|
+
cwd: repoRoot,
|
|
70
|
+
encoding: 'utf8',
|
|
71
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
72
|
+
timeout: 5000,
|
|
73
|
+
}).trim();
|
|
74
|
+
} catch {
|
|
75
|
+
return '';
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function readRecord(repoRoot: string): Record<string, unknown> | null {
|
|
80
|
+
const path = resolve(repoRoot, PREVIEW_DEPLOY_RECORD);
|
|
81
|
+
if (!existsSync(path)) return null;
|
|
82
|
+
try {
|
|
83
|
+
const parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
84
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
85
|
+
? parsed as Record<string, unknown>
|
|
86
|
+
: null;
|
|
87
|
+
} catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function normalizeCommit(value: unknown): string | null {
|
|
93
|
+
return typeof value === 'string' && /^[0-9a-f]{7,40}$/i.test(value.trim())
|
|
94
|
+
? value.trim()
|
|
95
|
+
: null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function readTargetFreshness(record: Record<string, unknown> | null, currentCommit: string | null): PreviewFreshness['targets'] {
|
|
99
|
+
const targets = record?.targets && typeof record.targets === 'object' && !Array.isArray(record.targets)
|
|
100
|
+
? record.targets as Record<string, unknown>
|
|
101
|
+
: {};
|
|
102
|
+
const result = {} as PreviewFreshness['targets'];
|
|
103
|
+
for (const targetName of ['npm', 'server', 'web'] as const) {
|
|
104
|
+
const targetRecord = targets[targetName] && typeof targets[targetName] === 'object' && !Array.isArray(targets[targetName])
|
|
105
|
+
? targets[targetName] as Record<string, unknown>
|
|
106
|
+
: {};
|
|
107
|
+
const commit = normalizeCommit(targetRecord.commit);
|
|
108
|
+
result[targetName] = {
|
|
109
|
+
commit,
|
|
110
|
+
deployedAt: typeof targetRecord.deployedAt === 'string' ? targetRecord.deployedAt : undefined,
|
|
111
|
+
status: commit && currentCommit ? (commit === currentCommit ? 'fresh' : 'stale') : 'unknown',
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function readCurrentMainCommit(repoRoot: string): Pick<PreviewFreshness, 'currentMainCommit' | 'currentMainCommitSource'> {
|
|
118
|
+
const originMain = runGit(repoRoot, ['rev-parse', '--verify', 'origin/main^{commit}']);
|
|
119
|
+
if (originMain) {
|
|
120
|
+
return { currentMainCommit: originMain, currentMainCommitSource: 'origin/main' };
|
|
121
|
+
}
|
|
122
|
+
const head = runGit(repoRoot, ['rev-parse', '--verify', 'HEAD']);
|
|
123
|
+
if (head) {
|
|
124
|
+
return { currentMainCommit: head, currentMainCommitSource: 'HEAD' };
|
|
125
|
+
}
|
|
126
|
+
return { currentMainCommit: null, currentMainCommitSource: 'unknown' };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export function buildPreviewFreshness(repoRoot: string): PreviewFreshness | null {
|
|
130
|
+
// F15 gate: only surface preview-freshness (and its private pipeline
|
|
131
|
+
// guidance) in repos that actually configure the preview-deploy pipeline.
|
|
132
|
+
// Unconfigured repos return null so the caller omits the field entirely.
|
|
133
|
+
if (!isPreviewPipelineConfigured(repoRoot)) return null;
|
|
134
|
+
|
|
135
|
+
const current = readCurrentMainCommit(repoRoot);
|
|
136
|
+
const record = readRecord(repoRoot);
|
|
137
|
+
const lastPreviewCommit = normalizeCommit(record?.lastPreviewCommit);
|
|
138
|
+
const targets = readTargetFreshness(record, current.currentMainCommit);
|
|
139
|
+
let status: PreviewFreshnessStatus = 'unknown';
|
|
140
|
+
let nextAction = 'Run npm run deploy:preview from the current main commit, then smoke preview.';
|
|
141
|
+
|
|
142
|
+
if (lastPreviewCommit && current.currentMainCommit) {
|
|
143
|
+
status = lastPreviewCommit === current.currentMainCommit ? 'fresh' : 'stale';
|
|
144
|
+
nextAction = status === 'fresh'
|
|
145
|
+
? 'No preview deploy action needed.'
|
|
146
|
+
: 'Run npm run deploy:preview from origin/main, then smoke preview.';
|
|
147
|
+
} else if (!current.currentMainCommit) {
|
|
148
|
+
nextAction = 'Resolve the current main commit before judging preview freshness.';
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
status,
|
|
153
|
+
lastPreviewCommit,
|
|
154
|
+
currentMainCommit: current.currentMainCommit,
|
|
155
|
+
currentMainCommitSource: current.currentMainCommitSource,
|
|
156
|
+
recordPath: PREVIEW_DEPLOY_RECORD,
|
|
157
|
+
lastDeployedAt: typeof record?.updatedAt === 'string' ? record.updatedAt : undefined,
|
|
158
|
+
lastTarget: typeof record?.target === 'string' ? record.target : undefined,
|
|
159
|
+
previewVersion: typeof record?.previewVersion === 'string' ? record.previewVersion : undefined,
|
|
160
|
+
targets,
|
|
161
|
+
nextAction,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
@@ -13,13 +13,36 @@ export interface RepoMeshRefineValidationCommandConfig {
|
|
|
13
13
|
category?: MeshRefineValidationCategory;
|
|
14
14
|
cwd?: string;
|
|
15
15
|
timeoutMs?: number;
|
|
16
|
+
outputLimitBytes?: number;
|
|
16
17
|
env?: Record<string, string>;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
export interface RepoMeshRefineConfig {
|
|
20
21
|
version: 1;
|
|
22
|
+
/**
|
|
23
|
+
* Narrow Refinery opt-in for monorepos with submodule gitlinks.
|
|
24
|
+
* When true, Refinery may non-force publish unreachable submodule gitlink
|
|
25
|
+
* commits to the submodule remote main branch after validation and
|
|
26
|
+
* patch-equivalence pass, then verify remote-main reachability.
|
|
27
|
+
*/
|
|
28
|
+
allowAutoPublishSubmoduleMainCommits?: boolean;
|
|
21
29
|
validation?: {
|
|
22
30
|
required?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* M2-2 (v2): how Refinery sources its bootstrap stage.
|
|
33
|
+
* 'inherit' (default) — consume the worktree_bootstrap config/state:
|
|
34
|
+
* skip when the node's bootstrap is 'ready' (staleInputs unchanged),
|
|
35
|
+
* run the worktree_bootstrap definition when stale/never-ran.
|
|
36
|
+
* 'skip' — no bootstrap stage at all (validation commands run as-is).
|
|
37
|
+
*/
|
|
38
|
+
bootstrap?: 'inherit' | 'skip';
|
|
39
|
+
/**
|
|
40
|
+
* DEPRECATED (M2-2): define bootstrap once in
|
|
41
|
+
* .adhdev/worktree_bootstrap.json instead. Still honored when no
|
|
42
|
+
* worktree_bootstrap config exists, with a deprecation warning; when
|
|
43
|
+
* both exist the worktree_bootstrap config wins.
|
|
44
|
+
*/
|
|
45
|
+
bootstrapCommands?: RepoMeshRefineValidationCommandConfig[];
|
|
23
46
|
commands?: RepoMeshRefineValidationCommandConfig[];
|
|
24
47
|
};
|
|
25
48
|
}
|
|
@@ -32,6 +55,7 @@ export interface MeshRefineValidationCommandPlan {
|
|
|
32
55
|
source: string;
|
|
33
56
|
cwd?: string;
|
|
34
57
|
timeoutMs?: number;
|
|
58
|
+
outputLimitBytes?: number;
|
|
35
59
|
env?: Record<string, string>;
|
|
36
60
|
}
|
|
37
61
|
|
|
@@ -46,8 +70,13 @@ export interface MeshRefineConfigLoadResult {
|
|
|
46
70
|
export interface MeshRefineValidationPlan {
|
|
47
71
|
source: string;
|
|
48
72
|
sourceType: MeshRefineConfigLoadResult['sourceType'];
|
|
73
|
+
/** M2-2: how the bootstrap stage is sourced ('inherit' consumes worktree_bootstrap; 'skip' disables it). */
|
|
74
|
+
bootstrapMode: 'inherit' | 'skip';
|
|
75
|
+
bootstrapCommands: MeshRefineValidationCommandPlan[];
|
|
49
76
|
commands: MeshRefineValidationCommandPlan[];
|
|
50
77
|
rejectedCommands: Array<Record<string, unknown>>;
|
|
78
|
+
/** M2-2: deprecation notices (e.g. validation.bootstrapCommands present). */
|
|
79
|
+
deprecationWarnings: string[];
|
|
51
80
|
suggestions: RepoMeshRefineValidationCommandConfig[];
|
|
52
81
|
suggestedConfig?: RepoMeshRefineConfig;
|
|
53
82
|
unavailableReason?: string;
|
|
@@ -73,11 +102,21 @@ export const MESH_REFINE_CONFIG_SCHEMA = {
|
|
|
73
102
|
required: ['version'],
|
|
74
103
|
properties: {
|
|
75
104
|
version: { const: 1 },
|
|
105
|
+
allowAutoPublishSubmoduleMainCommits: {
|
|
106
|
+
type: 'boolean',
|
|
107
|
+
default: false,
|
|
108
|
+
description: 'When true, Refinery may non-force publish submodule gitlink commits referenced by the refined root tree to each submodule origin/main after validation and patch-equivalence pass, then verify reachability.',
|
|
109
|
+
},
|
|
76
110
|
validation: {
|
|
77
111
|
type: 'object',
|
|
78
112
|
additionalProperties: false,
|
|
79
113
|
properties: {
|
|
80
114
|
required: { type: 'boolean', default: true },
|
|
115
|
+
bootstrap: {
|
|
116
|
+
enum: ['inherit', 'skip'],
|
|
117
|
+
default: 'inherit',
|
|
118
|
+
description: "M2-2 (v2): 'inherit' consumes the worktree_bootstrap config/state (skip when ready, rerun when stale); 'skip' disables the bootstrap stage entirely.",
|
|
119
|
+
},
|
|
81
120
|
commands: {
|
|
82
121
|
type: 'array',
|
|
83
122
|
minItems: 1,
|
|
@@ -92,6 +131,26 @@ export const MESH_REFINE_CONFIG_SCHEMA = {
|
|
|
92
131
|
category: { enum: [...MESH_REFINE_VALIDATION_CATEGORIES, 'custom'] },
|
|
93
132
|
cwd: { type: 'string' },
|
|
94
133
|
timeoutMs: { type: 'number', minimum: 1000, maximum: 600000 },
|
|
134
|
+
outputLimitBytes: { type: 'number', minimum: 1024, maximum: 1048576 },
|
|
135
|
+
env: { type: 'object', additionalProperties: { type: 'string' } },
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
bootstrapCommands: {
|
|
140
|
+
type: 'array',
|
|
141
|
+
maxItems: 4,
|
|
142
|
+
description: 'DEPRECATED: define bootstrap once in .adhdev/worktree_bootstrap.json. Honored only when no worktree_bootstrap config exists (with a deprecation warning); worktree_bootstrap wins when both exist.',
|
|
143
|
+
items: {
|
|
144
|
+
type: 'object',
|
|
145
|
+
additionalProperties: false,
|
|
146
|
+
required: ['command'],
|
|
147
|
+
properties: {
|
|
148
|
+
command: { type: 'string', minLength: 1 },
|
|
149
|
+
args: { type: 'array', items: { type: 'string' } },
|
|
150
|
+
category: { enum: [...MESH_REFINE_VALIDATION_CATEGORIES, 'custom'] },
|
|
151
|
+
cwd: { type: 'string' },
|
|
152
|
+
timeoutMs: { type: 'number', minimum: 1000, maximum: 600000 },
|
|
153
|
+
outputLimitBytes: { type: 'number', minimum: 1024, maximum: 1048576 },
|
|
95
154
|
env: { type: 'object', additionalProperties: { type: 'string' } },
|
|
96
155
|
},
|
|
97
156
|
},
|
|
@@ -101,19 +160,39 @@ export const MESH_REFINE_CONFIG_SCHEMA = {
|
|
|
101
160
|
},
|
|
102
161
|
} as const;
|
|
103
162
|
|
|
104
|
-
function
|
|
163
|
+
export function isMeshConfigRecord(value: unknown): value is Record<string, unknown> {
|
|
105
164
|
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
106
165
|
}
|
|
107
166
|
|
|
108
|
-
|
|
167
|
+
// True shell metacharacters — never allowed anywhere in a config command, on
|
|
168
|
+
// any platform. Note: backslash is deliberately NOT in this set; it is handled
|
|
169
|
+
// separately (allowed only in the win32 executable token).
|
|
170
|
+
const SHELL_METACHAR_RE = /[;&|<>`$\n\r'"]/;
|
|
171
|
+
// Per-token allowlist for argument tokens and non-win32 executable tokens.
|
|
172
|
+
const SAFE_TOKEN_RE = /^[A-Za-z0-9_@./:=+-]+$/;
|
|
173
|
+
// Executable token on win32: same as SAFE_TOKEN_RE but also permits backslash so
|
|
174
|
+
// an absolute path like C:\Users\me\AppData\Roaming\npm\npm.cmd is accepted.
|
|
175
|
+
const SAFE_WIN32_EXEC_TOKEN_RE = /^[A-Za-z0-9_@./:=+\\-]+$/;
|
|
176
|
+
|
|
177
|
+
export function tokenizeCommandString(command: string): string[] | null {
|
|
109
178
|
const trimmed = command.trim();
|
|
110
179
|
if (!trimmed) return null;
|
|
111
180
|
// Explicit config may name any executable, but the Refinery never invokes a shell.
|
|
112
181
|
// Reject shell syntax, quotes and substitutions so config cannot smuggle a compound command.
|
|
113
|
-
|
|
182
|
+
// Backslash is the one exception (handled per-token below): rejecting it here
|
|
183
|
+
// would block legitimate win32 absolute .cmd paths, but it is never a shell
|
|
184
|
+
// metacharacter in the no-shell execFile boundary we run under.
|
|
185
|
+
if (SHELL_METACHAR_RE.test(trimmed)) return null;
|
|
114
186
|
const tokens = trimmed.split(/\s+/).filter(Boolean);
|
|
115
187
|
if (!tokens.length) return null;
|
|
116
|
-
|
|
188
|
+
const isWin32 = process.platform === 'win32';
|
|
189
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
190
|
+
// Backslash is permitted ONLY in the executable (first) token, ONLY on
|
|
191
|
+
// win32. Every other token (and all tokens off win32) uses the strict
|
|
192
|
+
// allowlist with no backslash.
|
|
193
|
+
const re = (isWin32 && i === 0) ? SAFE_WIN32_EXEC_TOKEN_RE : SAFE_TOKEN_RE;
|
|
194
|
+
if (!re.test(tokens[i])) return null;
|
|
195
|
+
}
|
|
117
196
|
return tokens;
|
|
118
197
|
}
|
|
119
198
|
|
|
@@ -123,8 +202,8 @@ function validateCategory(value: unknown): MeshRefineValidationCategory | 'custo
|
|
|
123
202
|
: 'custom';
|
|
124
203
|
}
|
|
125
204
|
|
|
126
|
-
function
|
|
127
|
-
if (!
|
|
205
|
+
export function normalizeMeshCommandConfig(entry: unknown, source: string): { command?: MeshRefineValidationCommandPlan; rejected?: Record<string, unknown> } {
|
|
206
|
+
if (!isMeshConfigRecord(entry) || typeof entry.command !== 'string') {
|
|
128
207
|
return { rejected: { source, reason: 'validation command must be an object with a command string' } };
|
|
129
208
|
}
|
|
130
209
|
|
|
@@ -154,7 +233,10 @@ function normalizeCommandConfig(entry: unknown, source: string): { command?: Mes
|
|
|
154
233
|
if (entry.timeoutMs !== undefined && (typeof entry.timeoutMs !== 'number' || !Number.isFinite(entry.timeoutMs) || entry.timeoutMs < 1000 || entry.timeoutMs > 600000)) {
|
|
155
234
|
return { rejected: { source, command: commandText, reason: 'timeoutMs must be between 1000 and 600000' } };
|
|
156
235
|
}
|
|
157
|
-
if (entry.
|
|
236
|
+
if (entry.outputLimitBytes !== undefined && (typeof entry.outputLimitBytes !== 'number' || !Number.isFinite(entry.outputLimitBytes) || entry.outputLimitBytes < 1024 || entry.outputLimitBytes > 1048576)) {
|
|
237
|
+
return { rejected: { source, command: commandText, reason: 'outputLimitBytes must be between 1024 and 1048576' } };
|
|
238
|
+
}
|
|
239
|
+
if (entry.env !== undefined && (!isMeshConfigRecord(entry.env) || !Object.values(entry.env).every(value => typeof value === 'string'))) {
|
|
158
240
|
return { rejected: { source, command: commandText, reason: 'env must be an object of string values' } };
|
|
159
241
|
}
|
|
160
242
|
|
|
@@ -167,31 +249,60 @@ function normalizeCommandConfig(entry: unknown, source: string): { command?: Mes
|
|
|
167
249
|
source,
|
|
168
250
|
...(typeof entry.cwd === 'string' && entry.cwd.trim() ? { cwd: entry.cwd.trim() } : {}),
|
|
169
251
|
...(typeof entry.timeoutMs === 'number' ? { timeoutMs: entry.timeoutMs } : {}),
|
|
170
|
-
...(
|
|
252
|
+
...(typeof entry.outputLimitBytes === 'number' ? { outputLimitBytes: entry.outputLimitBytes } : {}),
|
|
253
|
+
...(isMeshConfigRecord(entry.env) ? { env: entry.env as Record<string, string> } : {}),
|
|
171
254
|
},
|
|
172
255
|
};
|
|
173
256
|
}
|
|
174
257
|
|
|
175
|
-
|
|
258
|
+
const isRecord = isMeshConfigRecord;
|
|
259
|
+
|
|
260
|
+
export function validateMeshRefineConfig(config: unknown, source = 'inline'): { valid: boolean; errors: string[]; bootstrapCommands: MeshRefineValidationCommandPlan[]; commands: MeshRefineValidationCommandPlan[]; rejectedCommands: Array<Record<string, unknown>>; bootstrapMode: 'inherit' | 'skip'; deprecationWarnings: string[] } {
|
|
176
261
|
const errors: string[] = [];
|
|
262
|
+
const bootstrapCommands: MeshRefineValidationCommandPlan[] = [];
|
|
177
263
|
const commands: MeshRefineValidationCommandPlan[] = [];
|
|
178
264
|
const rejectedCommands: Array<Record<string, unknown>> = [];
|
|
265
|
+
const deprecationWarnings: string[] = [];
|
|
266
|
+
let bootstrapMode: 'inherit' | 'skip' = 'inherit';
|
|
179
267
|
|
|
180
|
-
if (!isRecord(config)) return { valid: false, errors: ['config must be an object'], commands, rejectedCommands };
|
|
268
|
+
if (!isRecord(config)) return { valid: false, errors: ['config must be an object'], bootstrapCommands, commands, rejectedCommands, bootstrapMode, deprecationWarnings };
|
|
181
269
|
if (config.version !== 1) errors.push('version must be 1');
|
|
270
|
+
if (config.allowAutoPublishSubmoduleMainCommits !== undefined && typeof config.allowAutoPublishSubmoduleMainCommits !== 'boolean') {
|
|
271
|
+
errors.push('allowAutoPublishSubmoduleMainCommits must be a boolean when provided');
|
|
272
|
+
}
|
|
182
273
|
const validation = config.validation;
|
|
183
274
|
if (validation !== undefined && !isRecord(validation)) errors.push('validation must be an object');
|
|
275
|
+
const rawBootstrapMode = isRecord(validation) ? validation.bootstrap : undefined;
|
|
276
|
+
if (rawBootstrapMode !== undefined) {
|
|
277
|
+
if (rawBootstrapMode === 'inherit' || rawBootstrapMode === 'skip') {
|
|
278
|
+
bootstrapMode = rawBootstrapMode;
|
|
279
|
+
} else {
|
|
280
|
+
errors.push("validation.bootstrap must be 'inherit' or 'skip' when provided");
|
|
281
|
+
}
|
|
282
|
+
}
|
|
184
283
|
const rawCommands = isRecord(validation) ? validation.commands : undefined;
|
|
284
|
+
const rawBootstrapCommands = isRecord(validation) ? validation.bootstrapCommands : undefined;
|
|
185
285
|
if (rawCommands !== undefined && !Array.isArray(rawCommands)) errors.push('validation.commands must be an array');
|
|
286
|
+
if (rawBootstrapCommands !== undefined && !Array.isArray(rawBootstrapCommands)) errors.push('validation.bootstrapCommands must be an array');
|
|
287
|
+
if (Array.isArray(rawBootstrapCommands) && rawBootstrapCommands.length > 0) {
|
|
288
|
+
deprecationWarnings.push('validation.bootstrapCommands is deprecated: define bootstrap once in .adhdev/worktree_bootstrap.json. It still runs when no worktree_bootstrap config exists; when both exist the worktree_bootstrap config wins.');
|
|
289
|
+
}
|
|
290
|
+
if (Array.isArray(rawBootstrapCommands)) {
|
|
291
|
+
rawBootstrapCommands.forEach((entry, index) => {
|
|
292
|
+
const normalized = normalizeMeshCommandConfig(entry, `${source}:validation.bootstrapCommands[${index}]`);
|
|
293
|
+
if (normalized.command) bootstrapCommands.push(normalized.command);
|
|
294
|
+
if (normalized.rejected) rejectedCommands.push(normalized.rejected);
|
|
295
|
+
});
|
|
296
|
+
}
|
|
186
297
|
if (Array.isArray(rawCommands)) {
|
|
187
298
|
rawCommands.forEach((entry, index) => {
|
|
188
|
-
const normalized =
|
|
299
|
+
const normalized = normalizeMeshCommandConfig(entry, `${source}:validation.commands[${index}]`);
|
|
189
300
|
if (normalized.command) commands.push(normalized.command);
|
|
190
301
|
if (normalized.rejected) rejectedCommands.push(normalized.rejected);
|
|
191
302
|
});
|
|
192
303
|
}
|
|
193
304
|
if (rejectedCommands.length) errors.push('one or more validation commands are invalid');
|
|
194
|
-
return { valid: errors.length === 0, errors, commands, rejectedCommands };
|
|
305
|
+
return { valid: errors.length === 0, errors, bootstrapCommands, commands, rejectedCommands, bootstrapMode, deprecationWarnings };
|
|
195
306
|
}
|
|
196
307
|
|
|
197
308
|
function parseConfigText(path: string, text: string): unknown {
|
|
@@ -285,8 +396,11 @@ export function resolveMeshRefineValidationPlan(mesh: any, workspace: string): M
|
|
|
285
396
|
return {
|
|
286
397
|
source: loaded.source,
|
|
287
398
|
sourceType: loaded.sourceType,
|
|
399
|
+
bootstrapMode: 'inherit',
|
|
400
|
+
bootstrapCommands: [],
|
|
288
401
|
commands: [],
|
|
289
402
|
rejectedCommands: loaded.error ? [{ source: loaded.source, reason: loaded.error }] : [],
|
|
403
|
+
deprecationWarnings: [],
|
|
290
404
|
suggestions: suggestion.suggestions,
|
|
291
405
|
suggestedConfig: suggestion.suggestedConfig,
|
|
292
406
|
unavailableReason: loaded.error || 'validation_unavailable: repo mesh/refine config missing',
|
|
@@ -297,8 +411,11 @@ export function resolveMeshRefineValidationPlan(mesh: any, workspace: string): M
|
|
|
297
411
|
return {
|
|
298
412
|
source: loaded.path || loaded.source,
|
|
299
413
|
sourceType: loaded.sourceType,
|
|
414
|
+
bootstrapMode: validation.bootstrapMode,
|
|
415
|
+
bootstrapCommands: validation.bootstrapCommands,
|
|
300
416
|
commands: validation.commands,
|
|
301
417
|
rejectedCommands: validation.rejectedCommands,
|
|
418
|
+
deprecationWarnings: validation.deprecationWarnings,
|
|
302
419
|
suggestions: suggestion.suggestions,
|
|
303
420
|
suggestedConfig: suggestion.suggestedConfig,
|
|
304
421
|
unavailableReason: validation.commands.length ? undefined : 'validation_unavailable: repo mesh/refine config has no validation.commands',
|