@adhdev/daemon-core 0.9.82-rc.49 → 0.9.82-rc.491
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 +66 -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 +53556 -19074
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +53380 -19063
- 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 +1309 -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,354 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import * as yaml from 'js-yaml';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* "Change Impact" — config-driven classification of which git changes between the
|
|
7
|
+
* live daemon's build commit and the workspace HEAD actually require a daemon
|
|
8
|
+
* rebuild/restart (vs. a web-only redeploy, vs. nothing).
|
|
9
|
+
*
|
|
10
|
+
* The daemon-core git surface only knows the FACTS (which files / packages changed
|
|
11
|
+
* between buildCommit..HEAD). The POLICY — which packages are daemon-runtime, which
|
|
12
|
+
* are web-only, which root files are non-runtime, and what command to recommend —
|
|
13
|
+
* is declarative config injected from outside. This keeps git-status.ts repo-agnostic
|
|
14
|
+
* while preserving ADHDev's exact built-in behavior when no config is present.
|
|
15
|
+
*
|
|
16
|
+
* SECURITY: config is declarative only. JSON/YAML are parsed; arbitrary JS config
|
|
17
|
+
* (.js) is intentionally NOT supported, so loading a config can never execute code.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/** A change-impact classification bucket. */
|
|
21
|
+
export type ChangeImpactKind = 'daemon' | 'web' | 'none';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Recommended action for a given impact classification. `recommendedAction` is the
|
|
25
|
+
* stable classification key (always one of daemon|web|none, NOT config-overridable);
|
|
26
|
+
* config customizes only the human-facing `recommendedCommand` recipe.
|
|
27
|
+
*/
|
|
28
|
+
export interface ChangeImpactTarget {
|
|
29
|
+
/** Human-facing command/recipe to act on the impact (e.g. deploy + restart). */
|
|
30
|
+
recommendedCommand: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface ChangeImpactConfig {
|
|
34
|
+
/**
|
|
35
|
+
* Package names (the `<name>` in `packages/<name>/`) whose change means the
|
|
36
|
+
* daemon runtime is stale and must be rebuilt/redeployed + restarted. When
|
|
37
|
+
* provided, this REPLACES the built-in daemon-runtime set.
|
|
38
|
+
*/
|
|
39
|
+
daemonRuntimePackages?: string[];
|
|
40
|
+
/**
|
|
41
|
+
* Package names that are web-only — a change to one does not require a daemon
|
|
42
|
+
* restart, only a web redeploy. When provided, this REPLACES the built-in
|
|
43
|
+
* web-only set.
|
|
44
|
+
*/
|
|
45
|
+
webOnlyPackages?: string[];
|
|
46
|
+
/**
|
|
47
|
+
* Glob patterns for root-level (non-package) files that demonstrably cannot
|
|
48
|
+
* change what the daemon runtime executes (markers, docs, license text). These
|
|
49
|
+
* are added on top of the built-in non-runtime root-file detection.
|
|
50
|
+
*/
|
|
51
|
+
nonRuntimeRootFilePatterns?: string[];
|
|
52
|
+
/** Recommended action/command per impact classification. Missing keys fall back to built-in defaults. */
|
|
53
|
+
impactTargets?: Partial<Record<ChangeImpactKind, ChangeImpactTarget>>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface ChangeImpactConfigLoadResult {
|
|
57
|
+
config?: ChangeImpactConfig;
|
|
58
|
+
source: string;
|
|
59
|
+
sourceType: 'repo_file' | 'unavailable' | 'invalid';
|
|
60
|
+
path?: string;
|
|
61
|
+
error?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Stable identity of the config SOURCE, used as part of a cache key so a config
|
|
64
|
+
* edit invalidates any cached impact evaluation. Combines the resolved path and
|
|
65
|
+
* its mtime (or the path for the unavailable/invalid case).
|
|
66
|
+
*/
|
|
67
|
+
sourceKey: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export const CHANGE_IMPACT_CONFIG_LOCATIONS = [
|
|
71
|
+
'.adhdev/change-impact.json',
|
|
72
|
+
'.adhdev/change-impact.yaml',
|
|
73
|
+
'.adhdev/change-impact.yml',
|
|
74
|
+
'.adhdev/repo-mesh-change-impact.json',
|
|
75
|
+
'.adhdev/repo-mesh-change-impact.yaml',
|
|
76
|
+
'.adhdev/repo-mesh-change-impact.yml',
|
|
77
|
+
];
|
|
78
|
+
|
|
79
|
+
export const CHANGE_IMPACT_CONFIG_SCHEMA = {
|
|
80
|
+
$schema: 'https://json-schema.org/draft/2020-12/schema',
|
|
81
|
+
title: 'ADHDev Change Impact Config',
|
|
82
|
+
type: 'object',
|
|
83
|
+
additionalProperties: false,
|
|
84
|
+
properties: {
|
|
85
|
+
daemonRuntimePackages: { type: 'array', items: { type: 'string', minLength: 1 } },
|
|
86
|
+
webOnlyPackages: { type: 'array', items: { type: 'string', minLength: 1 } },
|
|
87
|
+
nonRuntimeRootFilePatterns: { type: 'array', items: { type: 'string', minLength: 1 } },
|
|
88
|
+
impactTargets: {
|
|
89
|
+
type: 'object',
|
|
90
|
+
additionalProperties: false,
|
|
91
|
+
properties: {
|
|
92
|
+
daemon: { $ref: '#/$defs/target' },
|
|
93
|
+
web: { $ref: '#/$defs/target' },
|
|
94
|
+
none: { $ref: '#/$defs/target' },
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
$defs: {
|
|
99
|
+
target: {
|
|
100
|
+
type: 'object',
|
|
101
|
+
additionalProperties: false,
|
|
102
|
+
required: ['recommendedCommand'],
|
|
103
|
+
properties: {
|
|
104
|
+
recommendedCommand: { type: 'string', minLength: 1 },
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
} as const;
|
|
109
|
+
|
|
110
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
111
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function isStringArray(value: unknown): value is string[] {
|
|
115
|
+
return Array.isArray(value) && value.every(v => typeof v === 'string' && v.length > 0);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function validateTarget(value: unknown, key: string, errors: string[]): ChangeImpactTarget | undefined {
|
|
119
|
+
if (!isRecord(value)) {
|
|
120
|
+
errors.push(`impactTargets.${key} must be an object`);
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
const { recommendedCommand } = value;
|
|
124
|
+
if (typeof recommendedCommand !== 'string' || !recommendedCommand.length) {
|
|
125
|
+
errors.push(`impactTargets.${key}.recommendedCommand must be a non-empty string`);
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
// recommendedAction is the fixed classification key; config supplies only the command.
|
|
129
|
+
for (const k of Object.keys(value)) {
|
|
130
|
+
if (k !== 'recommendedCommand') errors.push(`impactTargets.${key}.${k} is not a recognized field (only recommendedCommand)`);
|
|
131
|
+
}
|
|
132
|
+
return { recommendedCommand };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export function validateChangeImpactConfig(raw: unknown, source = 'inline'): { valid: boolean; errors: string[]; config?: ChangeImpactConfig } {
|
|
136
|
+
const errors: string[] = [];
|
|
137
|
+
if (!isRecord(raw)) {
|
|
138
|
+
return { valid: false, errors: [`${source}: config must be an object`] };
|
|
139
|
+
}
|
|
140
|
+
const config: ChangeImpactConfig = {};
|
|
141
|
+
|
|
142
|
+
if (raw.daemonRuntimePackages !== undefined) {
|
|
143
|
+
if (isStringArray(raw.daemonRuntimePackages)) config.daemonRuntimePackages = [...raw.daemonRuntimePackages];
|
|
144
|
+
else errors.push('daemonRuntimePackages must be an array of non-empty strings');
|
|
145
|
+
}
|
|
146
|
+
if (raw.webOnlyPackages !== undefined) {
|
|
147
|
+
if (isStringArray(raw.webOnlyPackages)) config.webOnlyPackages = [...raw.webOnlyPackages];
|
|
148
|
+
else errors.push('webOnlyPackages must be an array of non-empty strings');
|
|
149
|
+
}
|
|
150
|
+
if (raw.nonRuntimeRootFilePatterns !== undefined) {
|
|
151
|
+
if (isStringArray(raw.nonRuntimeRootFilePatterns)) config.nonRuntimeRootFilePatterns = [...raw.nonRuntimeRootFilePatterns];
|
|
152
|
+
else errors.push('nonRuntimeRootFilePatterns must be an array of non-empty strings');
|
|
153
|
+
}
|
|
154
|
+
if (raw.impactTargets !== undefined) {
|
|
155
|
+
if (!isRecord(raw.impactTargets)) {
|
|
156
|
+
errors.push('impactTargets must be an object');
|
|
157
|
+
} else {
|
|
158
|
+
const targets: Partial<Record<ChangeImpactKind, ChangeImpactTarget>> = {};
|
|
159
|
+
for (const key of Object.keys(raw.impactTargets)) {
|
|
160
|
+
if (key !== 'daemon' && key !== 'web' && key !== 'none') {
|
|
161
|
+
errors.push(`impactTargets.${key} is not a recognized impact kind (daemon|web|none)`);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const target = validateTarget(raw.impactTargets[key], key, errors);
|
|
165
|
+
if (target) targets[key as ChangeImpactKind] = target;
|
|
166
|
+
}
|
|
167
|
+
if (Object.keys(targets).length) config.impactTargets = targets;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Reject unknown top-level keys to catch typos early (mirrors additionalProperties:false).
|
|
171
|
+
for (const key of Object.keys(raw)) {
|
|
172
|
+
if (!['daemonRuntimePackages', 'webOnlyPackages', 'nonRuntimeRootFilePatterns', 'impactTargets'].includes(key)) {
|
|
173
|
+
errors.push(`unknown config key '${key}'`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return { valid: errors.length === 0, errors, config: errors.length === 0 ? config : undefined };
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function parseConfigText(path: string, text: string): unknown {
|
|
181
|
+
if (/\.json$/i.test(path)) return JSON.parse(text);
|
|
182
|
+
return yaml.load(text);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Locate and load the Change Impact config for a repo root. Declarative only —
|
|
187
|
+
* never executes config. Returns a sourceKey suitable for cache invalidation:
|
|
188
|
+
* config path + mtime, or the sentinel for the missing/invalid case.
|
|
189
|
+
*/
|
|
190
|
+
export function loadChangeImpactConfig(repoRoot: string): ChangeImpactConfigLoadResult {
|
|
191
|
+
for (const relative of CHANGE_IMPACT_CONFIG_LOCATIONS) {
|
|
192
|
+
const configPath = join(repoRoot, relative);
|
|
193
|
+
if (!existsSync(configPath)) continue;
|
|
194
|
+
try {
|
|
195
|
+
const text = readFileSync(configPath, 'utf-8');
|
|
196
|
+
let mtimeMs = 0;
|
|
197
|
+
try {
|
|
198
|
+
mtimeMs = statSync(configPath).mtimeMs;
|
|
199
|
+
} catch {
|
|
200
|
+
// Best-effort; fall back to content length so edits still perturb the key.
|
|
201
|
+
mtimeMs = text.length;
|
|
202
|
+
}
|
|
203
|
+
const parsed = parseConfigText(configPath, text);
|
|
204
|
+
const validation = validateChangeImpactConfig(parsed, relative);
|
|
205
|
+
if (!validation.valid) {
|
|
206
|
+
return {
|
|
207
|
+
source: relative,
|
|
208
|
+
sourceType: 'invalid',
|
|
209
|
+
path: configPath,
|
|
210
|
+
error: validation.errors.join('; '),
|
|
211
|
+
sourceKey: `invalid:${configPath}:${mtimeMs}`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
config: validation.config,
|
|
216
|
+
source: relative,
|
|
217
|
+
sourceType: 'repo_file',
|
|
218
|
+
path: configPath,
|
|
219
|
+
sourceKey: `file:${configPath}:${mtimeMs}`,
|
|
220
|
+
};
|
|
221
|
+
} catch (error: any) {
|
|
222
|
+
return {
|
|
223
|
+
source: relative,
|
|
224
|
+
sourceType: 'invalid',
|
|
225
|
+
path: configPath,
|
|
226
|
+
error: error?.message || String(error),
|
|
227
|
+
sourceKey: `error:${configPath}`,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
source: 'unavailable',
|
|
233
|
+
sourceType: 'unavailable',
|
|
234
|
+
error: `No change-impact config found. Checked: ${CHANGE_IMPACT_CONFIG_LOCATIONS.join(', ')}`,
|
|
235
|
+
sourceKey: 'unavailable',
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Translate a config glob pattern into a RegExp matched against a forward-slash
|
|
241
|
+
* file path. Supports `**` (any path segments), `*` (any chars except `/`), and
|
|
242
|
+
* `?` (single non-slash char). No brace/character-class expansion — declarative,
|
|
243
|
+
* minimal, predictable. All other characters are matched literally.
|
|
244
|
+
*/
|
|
245
|
+
export function globToRegExp(pattern: string): RegExp {
|
|
246
|
+
let out = '';
|
|
247
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
248
|
+
const ch = pattern[i];
|
|
249
|
+
if (ch === '*') {
|
|
250
|
+
if (pattern[i + 1] === '*') {
|
|
251
|
+
// `**` → any sequence of characters including path separators.
|
|
252
|
+
out += '.*';
|
|
253
|
+
i++;
|
|
254
|
+
// Swallow a trailing slash after `**/` so `**/x` also matches `x`.
|
|
255
|
+
if (pattern[i + 1] === '/') i++;
|
|
256
|
+
} else {
|
|
257
|
+
out += '[^/]*';
|
|
258
|
+
}
|
|
259
|
+
} else if (ch === '?') {
|
|
260
|
+
out += '[^/]';
|
|
261
|
+
} else if ('.+^${}()|[]\\'.includes(ch)) {
|
|
262
|
+
out += '\\' + ch;
|
|
263
|
+
} else {
|
|
264
|
+
out += ch;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return new RegExp(`^${out}$`);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export interface ChangeImpactConfigSuggestion {
|
|
271
|
+
/** A non-executable, declarative config draft a human can save verbatim. */
|
|
272
|
+
suggestedConfig: ChangeImpactConfig;
|
|
273
|
+
/** Per-field human-facing rationale for the proposed classification. */
|
|
274
|
+
notes: string[];
|
|
275
|
+
/** Package directories discovered under `packages/` (and `oss/packages/`). */
|
|
276
|
+
discoveredPackages: { daemon: string[]; web: string[]; unclassified: string[] };
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function listPackageDirs(packagesRoot: string): string[] {
|
|
280
|
+
try {
|
|
281
|
+
return readdirSync(packagesRoot, { withFileTypes: true })
|
|
282
|
+
.filter(entry => entry.isDirectory() && !entry.name.startsWith('.'))
|
|
283
|
+
.map(entry => entry.name);
|
|
284
|
+
} catch {
|
|
285
|
+
return [];
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Inspect a repo's package layout and propose a reasonable, declarative Change
|
|
291
|
+
* Impact config draft. This is heuristic scaffold ONLY — it never executes
|
|
292
|
+
* anything and the draft must be reviewed/saved by a human before it takes
|
|
293
|
+
* effect. The heuristic mirrors ADHDev's own conventions:
|
|
294
|
+
* - `web-*` / `*-web` packages → web-only (web redeploy, no daemon restart)
|
|
295
|
+
* - everything else under packages/ → daemon-runtime (rebuild + restart)
|
|
296
|
+
* - docs/license/marker root files → non-runtime
|
|
297
|
+
* Callers are expected to prune the draft to their actual runtime topology.
|
|
298
|
+
*/
|
|
299
|
+
export function suggestChangeImpactConfig(repoRoot: string): ChangeImpactConfigSuggestion {
|
|
300
|
+
const notes: string[] = [];
|
|
301
|
+
const daemon = new Set<string>();
|
|
302
|
+
const web = new Set<string>();
|
|
303
|
+
const unclassified: string[] = [];
|
|
304
|
+
|
|
305
|
+
const roots = ['packages', join('oss', 'packages')];
|
|
306
|
+
for (const rel of roots) {
|
|
307
|
+
const packagesRoot = join(repoRoot, rel);
|
|
308
|
+
if (!existsSync(packagesRoot)) continue;
|
|
309
|
+
for (const name of listPackageDirs(packagesRoot)) {
|
|
310
|
+
if (/(^web[-.]|[-.]web$)/i.test(name) || /dashboard|frontend|ui$/i.test(name)) {
|
|
311
|
+
web.add(name);
|
|
312
|
+
} else {
|
|
313
|
+
daemon.add(name);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const daemonRuntimePackages = [...daemon].sort();
|
|
319
|
+
const webOnlyPackages = [...web].sort();
|
|
320
|
+
|
|
321
|
+
if (!daemonRuntimePackages.length && !webOnlyPackages.length) {
|
|
322
|
+
notes.push('No packages/ or oss/packages/ directories found — defaulting to an empty draft you should fill in by hand.');
|
|
323
|
+
} else {
|
|
324
|
+
if (daemonRuntimePackages.length) notes.push(`Classified ${daemonRuntimePackages.length} package(s) as daemon-runtime (change → rebuild/redeploy + restart).`);
|
|
325
|
+
if (webOnlyPackages.length) notes.push(`Classified ${webOnlyPackages.length} web-* package(s) as web-only (change → web redeploy, no daemon restart).`);
|
|
326
|
+
notes.push('Heuristic only: confirm each package actually matches its bucket before saving.');
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
const nonRuntimeRootFilePatterns = [
|
|
330
|
+
'*.md',
|
|
331
|
+
'docs/**',
|
|
332
|
+
'LICENSE',
|
|
333
|
+
'LICENSE.*',
|
|
334
|
+
'.gitignore',
|
|
335
|
+
];
|
|
336
|
+
notes.push('nonRuntimeRootFilePatterns lists root files that demonstrably cannot change daemon runtime behavior; extend with your repo markers.');
|
|
337
|
+
|
|
338
|
+
const suggestedConfig: ChangeImpactConfig = {
|
|
339
|
+
...(daemonRuntimePackages.length ? { daemonRuntimePackages } : {}),
|
|
340
|
+
...(webOnlyPackages.length ? { webOnlyPackages } : {}),
|
|
341
|
+
nonRuntimeRootFilePatterns,
|
|
342
|
+
impactTargets: {
|
|
343
|
+
daemon: { recommendedCommand: 'rebuild + redeploy the daemon, then restart it' },
|
|
344
|
+
web: { recommendedCommand: 'redeploy the web app (no daemon restart required)' },
|
|
345
|
+
none: { recommendedCommand: 'no action required' },
|
|
346
|
+
},
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
return {
|
|
350
|
+
suggestedConfig,
|
|
351
|
+
notes,
|
|
352
|
+
discoveredPackages: { daemon: daemonRuntimePackages, web: webOnlyPackages, unclassified },
|
|
353
|
+
};
|
|
354
|
+
}
|
package/src/git/git-commands.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { getGitDiffSummary, getGitFileDiff } from './git-diff.js';
|
|
|
4
4
|
import { GitCommandError, isPathInside, resolveGitRepository, runGit } from './git-executor.js';
|
|
5
5
|
import { createGitSnapshotStore } from './git-snapshot-store.js';
|
|
6
6
|
import { getGitRepoStatus } from './git-status.js';
|
|
7
|
+
import { loadConfig } from '../config/config.js';
|
|
7
8
|
import type {
|
|
8
9
|
GitCommandName,
|
|
9
10
|
GitDiffSummary,
|
|
@@ -42,8 +43,12 @@ export interface GitLogResult extends GitRepoIdentity {
|
|
|
42
43
|
}
|
|
43
44
|
|
|
44
45
|
export interface GitCheckpointResult extends GitRepoIdentity {
|
|
45
|
-
commit
|
|
46
|
+
commit?: string;
|
|
46
47
|
message: string;
|
|
48
|
+
status?: 'created' | 'skipped';
|
|
49
|
+
skipped?: boolean;
|
|
50
|
+
noop?: boolean;
|
|
51
|
+
reason?: 'nothing_to_commit';
|
|
47
52
|
lastCheckedAt: number;
|
|
48
53
|
}
|
|
49
54
|
|
|
@@ -62,9 +67,9 @@ export interface GitPushResult extends GitRepoIdentity {
|
|
|
62
67
|
}
|
|
63
68
|
|
|
64
69
|
export interface GitCommandServices {
|
|
65
|
-
getStatus?: (params: { workspace: string; refreshUpstream?: boolean }) => Promise<GitRepoStatus> | GitRepoStatus;
|
|
66
|
-
getDiffSummary?: (params: { workspace: string; staged?: boolean }) => Promise<GitDiffSummary> | GitDiffSummary;
|
|
67
|
-
getDiffFile?: (params: { workspace: string; path: string; staged?: boolean }) => Promise<GitFileDiff> | GitFileDiff;
|
|
70
|
+
getStatus?: (params: { workspace: string; refreshUpstream?: boolean; includeSubmodules?: boolean; submoduleIgnorePaths?: string[] }) => Promise<GitRepoStatus> | GitRepoStatus;
|
|
71
|
+
getDiffSummary?: (params: { workspace: string; staged?: boolean; base?: string }) => Promise<GitDiffSummary> | GitDiffSummary;
|
|
72
|
+
getDiffFile?: (params: { workspace: string; path: string; staged?: boolean; base?: string }) => Promise<GitFileDiff> | GitFileDiff;
|
|
68
73
|
createSnapshot?: (params: {
|
|
69
74
|
workspace: string;
|
|
70
75
|
reason: GitSnapshotReason;
|
|
@@ -97,6 +102,14 @@ export interface GitCommandServices {
|
|
|
97
102
|
checkoutFiles?: (params: { workspace: string; paths: string[] }) => Promise<{ checkedOut: string[] }>;
|
|
98
103
|
getRemoteUrl?: (params: { workspace: string; remote?: string }) => Promise<{ remoteUrl: string; remote: string }>;
|
|
99
104
|
push?: (params: { workspace: string; remote?: string; branch?: string; setUpstream?: boolean }) => Promise<GitPushResult>;
|
|
105
|
+
/**
|
|
106
|
+
* Best-effort, non-blocking source of this daemon's detected provider CLI/ACP
|
|
107
|
+
* versions (keyed by provider id) + its build version, folded onto the git_status
|
|
108
|
+
* envelope so a mesh coordinator can self-heal each node's providerVersions the
|
|
109
|
+
* same way it does platform/arch. Wired at daemon boot from the cached CLI
|
|
110
|
+
* detection snapshot; omitted (⇒ versions not reported) when unavailable.
|
|
111
|
+
*/
|
|
112
|
+
getReporterProviderVersions?: () => { providerVersions?: Record<string, string>; daemonBuildVersion?: string };
|
|
100
113
|
}
|
|
101
114
|
|
|
102
115
|
type GitCommandFailure = {
|
|
@@ -106,7 +119,12 @@ type GitCommandFailure = {
|
|
|
106
119
|
};
|
|
107
120
|
|
|
108
121
|
type GitCommandSuccess =
|
|
109
|
-
|
|
122
|
+
// reporterPlatform/reporterArch carry the responding daemon's process.platform/
|
|
123
|
+
// process.arch so a mesh coordinator probing this node over P2P can self-heal the
|
|
124
|
+
// node's userOverrides.platform/arch (the fields capability-tag routing reads).
|
|
125
|
+
// reporterMachineNickname carries the responding daemon's config.machineNickname
|
|
126
|
+
// so the coordinator can populate node.machineNickname → the friendly display label.
|
|
127
|
+
| { success: true; status: GitRepoStatus; reporterPlatform?: string; reporterArch?: string; reporterMachineNickname?: string; reporterProviderVersions?: Record<string, string>; reporterDaemonBuildVersion?: string }
|
|
110
128
|
| { success: true; diffSummary: GitDiffSummary }
|
|
111
129
|
| { success: true; diff: GitFileDiff }
|
|
112
130
|
| { success: true; snapshot: GitSnapshot }
|
|
@@ -169,11 +187,13 @@ const defaultSnapshotStore = createGitSnapshotStore({
|
|
|
169
187
|
getDiffSummary: (workspace) => getGitDiffSummary(workspace),
|
|
170
188
|
});
|
|
171
189
|
|
|
172
|
-
export function createDefaultGitCommandServices(
|
|
190
|
+
export function createDefaultGitCommandServices(
|
|
191
|
+
overrides?: Pick<GitCommandServices, 'getReporterProviderVersions'>,
|
|
192
|
+
): GitCommandServices {
|
|
173
193
|
return {
|
|
174
194
|
getStatus: ({ workspace, refreshUpstream }) => getGitRepoStatus(workspace, { refreshUpstream }),
|
|
175
|
-
getDiffSummary: ({ workspace }) => getGitDiffSummary(workspace),
|
|
176
|
-
getDiffFile: ({ workspace, path: filePath }) => getGitFileDiff(workspace, filePath),
|
|
195
|
+
getDiffSummary: ({ workspace, base }) => getGitDiffSummary(workspace, base ? { baseRef: base } : {}),
|
|
196
|
+
getDiffFile: ({ workspace, path: filePath, base }) => getGitFileDiff(workspace, filePath, base ? { baseRef: base } : {}),
|
|
177
197
|
createSnapshot: ({ workspace, reason, sessionId, turnId }) => defaultSnapshotStore.create({
|
|
178
198
|
workspace,
|
|
179
199
|
reason,
|
|
@@ -189,6 +209,9 @@ export function createDefaultGitCommandServices(): GitCommandServices {
|
|
|
189
209
|
getRemoteUrl: async ({ workspace, remote = 'origin' }) => gitGetRemoteUrl(workspace, remote),
|
|
190
210
|
push: async ({ workspace, remote = 'origin', branch, setUpstream = false }) =>
|
|
191
211
|
gitPush(workspace, remote, branch, setUpstream),
|
|
212
|
+
...(overrides?.getReporterProviderVersions
|
|
213
|
+
? { getReporterProviderVersions: overrides.getReporterProviderVersions }
|
|
214
|
+
: {}),
|
|
192
215
|
};
|
|
193
216
|
}
|
|
194
217
|
|
|
@@ -290,13 +313,66 @@ export async function handleGitCommand(
|
|
|
290
313
|
switch (command) {
|
|
291
314
|
case 'git_status': {
|
|
292
315
|
if (!services.getStatus) return serviceNotImplemented(command);
|
|
293
|
-
const
|
|
294
|
-
|
|
316
|
+
const submoduleIgnorePaths = Array.isArray(args?.submoduleIgnorePaths)
|
|
317
|
+
? args.submoduleIgnorePaths.filter((value: unknown): value is string => typeof value === 'string' && value.trim().length > 0)
|
|
318
|
+
: undefined;
|
|
319
|
+
const statusParams: { workspace: string; refreshUpstream?: boolean; includeSubmodules?: boolean; submoduleIgnorePaths?: string[] } = { workspace };
|
|
320
|
+
const refreshUpstream = optionalBoolean(args?.refreshUpstream);
|
|
321
|
+
const includeSubmodules = optionalBoolean(args?.includeSubmodules);
|
|
322
|
+
if (refreshUpstream !== undefined) statusParams.refreshUpstream = refreshUpstream;
|
|
323
|
+
if (includeSubmodules !== undefined) statusParams.includeSubmodules = includeSubmodules;
|
|
324
|
+
if (submoduleIgnorePaths && submoduleIgnorePaths.length > 0) statusParams.submoduleIgnorePaths = submoduleIgnorePaths;
|
|
325
|
+
const status = await runService(() => services.getStatus!(statusParams));
|
|
326
|
+
if ('success' in status) return status;
|
|
327
|
+
// Carry the responding daemon's real platform/arch alongside the git
|
|
328
|
+
// status. A mesh coordinator dispatches `git_status` to each member over
|
|
329
|
+
// P2P on every explicit graph refresh, so this is the recurring live
|
|
330
|
+
// channel that lets a member self-report its OS to the coordinator — which
|
|
331
|
+
// stamps it onto the node's userOverrides.platform/arch (the fields
|
|
332
|
+
// buildMeshNodeCapabilityTags reads). These are siblings of `status`, not
|
|
333
|
+
// part of GitRepoStatus, so the git payload shape is untouched.
|
|
334
|
+
// The machine nickname rides the same channel so the coordinator can render
|
|
335
|
+
// this node's friendly label instead of a raw daemonId/nodeId.
|
|
336
|
+
const reporterMachineNickname = (() => {
|
|
337
|
+
try {
|
|
338
|
+
const nick = loadConfig().machineNickname;
|
|
339
|
+
return typeof nick === 'string' && nick.trim() ? nick.trim() : undefined;
|
|
340
|
+
} catch {
|
|
341
|
+
return undefined;
|
|
342
|
+
}
|
|
343
|
+
})();
|
|
344
|
+
// Provider versions + build version ride the same self-report channel (T7
|
|
345
|
+
// visibility). Best-effort and non-blocking: the service reads a cached
|
|
346
|
+
// snapshot, so a cold cache simply omits the fields on this probe.
|
|
347
|
+
const reporterVersions = (() => {
|
|
348
|
+
try {
|
|
349
|
+
return services.getReporterProviderVersions?.() ?? {};
|
|
350
|
+
} catch {
|
|
351
|
+
return {};
|
|
352
|
+
}
|
|
353
|
+
})();
|
|
354
|
+
const reporterProviderVersions =
|
|
355
|
+
reporterVersions.providerVersions && Object.keys(reporterVersions.providerVersions).length > 0
|
|
356
|
+
? reporterVersions.providerVersions
|
|
357
|
+
: undefined;
|
|
358
|
+
const reporterDaemonBuildVersion =
|
|
359
|
+
typeof reporterVersions.daemonBuildVersion === 'string' && reporterVersions.daemonBuildVersion.trim()
|
|
360
|
+
? reporterVersions.daemonBuildVersion.trim()
|
|
361
|
+
: undefined;
|
|
362
|
+
return {
|
|
363
|
+
success: true,
|
|
364
|
+
status,
|
|
365
|
+
reporterPlatform: process.platform,
|
|
366
|
+
reporterArch: process.arch,
|
|
367
|
+
...(reporterMachineNickname ? { reporterMachineNickname } : {}),
|
|
368
|
+
...(reporterProviderVersions ? { reporterProviderVersions } : {}),
|
|
369
|
+
...(reporterDaemonBuildVersion ? { reporterDaemonBuildVersion } : {}),
|
|
370
|
+
};
|
|
295
371
|
}
|
|
296
372
|
|
|
297
373
|
case 'git_diff_summary': {
|
|
298
374
|
if (!services.getDiffSummary) return serviceNotImplemented(command);
|
|
299
|
-
const diffSummary = await runService(() => services.getDiffSummary!({ workspace, staged: optionalBoolean(args?.staged) }));
|
|
375
|
+
const diffSummary = await runService(() => services.getDiffSummary!({ workspace, staged: optionalBoolean(args?.staged), base: optionalString(args?.base) }));
|
|
300
376
|
return 'success' in diffSummary ? diffSummary : { success: true, diffSummary };
|
|
301
377
|
}
|
|
302
378
|
|
|
@@ -438,10 +514,22 @@ async function gitCheckpoint(
|
|
|
438
514
|
const repo = await resolveGitRepository(workspace);
|
|
439
515
|
const repoRoot = repo.repoRoot!;
|
|
440
516
|
|
|
441
|
-
|
|
517
|
+
// Decision-then-mutate path: this conflict / dirty-submodule precheck gates a real
|
|
518
|
+
// `git add` + `git commit`. Bypass the C1 TTL cache so the checkpoint never proceeds
|
|
519
|
+
// on a stale "clean" verdict.
|
|
520
|
+
const statusResult = await getGitRepoStatus(workspace, { forceFresh: true });
|
|
442
521
|
if (statusResult.hasConflicts) {
|
|
443
522
|
throw new GitCommandError('conflict', 'Repository has conflicts — resolve before checkpointing');
|
|
444
523
|
}
|
|
524
|
+
const dirtySubmodules = (statusResult.submodules || []).filter(submodule => submodule.dirty);
|
|
525
|
+
if (dirtySubmodules.length > 0) {
|
|
526
|
+
const paths = dirtySubmodules.map(submodule => submodule.path).join(', ');
|
|
527
|
+
throw new GitCommandError(
|
|
528
|
+
'dirty_index_required',
|
|
529
|
+
`Repository has dirty submodules that must be checkpointed first: ${paths}. ` +
|
|
530
|
+
'Checkpoint or commit each dirty submodule, then checkpoint this repository to record gitlink changes.',
|
|
531
|
+
);
|
|
532
|
+
}
|
|
445
533
|
|
|
446
534
|
const addArgs = includeUntracked ? ['-A'] : ['-u'];
|
|
447
535
|
await runGit(repo, ['add', ...addArgs], { cwd: repoRoot });
|
|
@@ -455,10 +543,17 @@ async function gitCheckpoint(
|
|
|
455
543
|
} catch (err: any) {
|
|
456
544
|
const output = (err?.stdout || '') + (err?.stderr || '');
|
|
457
545
|
if (/nothing to commit/i.test(output)) {
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
546
|
+
return {
|
|
547
|
+
workspace: repo.workspace,
|
|
548
|
+
repoRoot,
|
|
549
|
+
isGitRepo: true,
|
|
550
|
+
message: fullMsg,
|
|
551
|
+
status: 'skipped',
|
|
552
|
+
skipped: true,
|
|
553
|
+
noop: true,
|
|
554
|
+
reason: 'nothing_to_commit',
|
|
555
|
+
lastCheckedAt: Date.now(),
|
|
556
|
+
};
|
|
462
557
|
}
|
|
463
558
|
throw err;
|
|
464
559
|
}
|
|
@@ -469,6 +564,7 @@ async function gitCheckpoint(
|
|
|
469
564
|
isGitRepo: true,
|
|
470
565
|
commit: commitSha,
|
|
471
566
|
message: fullMsg,
|
|
567
|
+
status: 'created',
|
|
472
568
|
lastCheckedAt: Date.now(),
|
|
473
569
|
};
|
|
474
570
|
}
|