create-walle 0.10.2 → 0.10.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/lib/release-schema.json +2 -2
- package/lib/runtime-closure-policy.json +8 -7
- package/package.json +1 -1
- package/template/coding-task-manager/api-prompts.js +45 -7
- package/template/coding-task-manager/bin/claude-hook.js +55 -1
- package/template/coding-task-manager/bin/ctm-relay-client.js +35 -12
- package/template/coding-task-manager/bin/land.js +2069 -0
- package/template/coding-task-manager/bin/memory-census.js +4 -2
- package/template/coding-task-manager/bin/memory-sync-verify.js +151 -0
- package/template/coding-task-manager/bin/probe-refusal-scope.js +530 -0
- package/template/coding-task-manager/db.js +156 -32
- package/template/coding-task-manager/lib/acp/acp-client.js +383 -0
- package/template/coding-task-manager/lib/acp/dsh-context-truth.js +176 -0
- package/template/coding-task-manager/lib/acp/dsh-launch-model.js +302 -0
- package/template/coding-task-manager/lib/acp/dsh-mcp-servers.js +194 -0
- package/template/coding-task-manager/lib/acp/dsh-prompt-lane.js +616 -0
- package/template/coding-task-manager/lib/acp/dsh-route-patch.js +308 -0
- package/template/coding-task-manager/lib/acp/dsh-session-runtime.js +522 -0
- package/template/coding-task-manager/lib/acp/dsh-transcript.js +395 -0
- package/template/coding-task-manager/lib/acp/dsh-usage-log.js +162 -0
- package/template/coding-task-manager/lib/acp/ndjson-stdio-transport.js +225 -0
- package/template/coding-task-manager/lib/adopted-host-redial.js +47 -11
- package/template/coding-task-manager/lib/adopted-launch-environment.js +123 -0
- package/template/coding-task-manager/lib/agent-auto-update-runtime.js +0 -3
- package/template/coding-task-manager/lib/agent-auto-update.js +26 -10
- package/template/coding-task-manager/lib/agent-bundle/build.js +657 -0
- package/template/coding-task-manager/lib/agent-bundle/codex-install.js +558 -0
- package/template/coding-task-manager/lib/agent-bundle/drift.js +120 -0
- package/template/coding-task-manager/lib/agent-bundle/gc.js +522 -0
- package/template/coding-task-manager/lib/agent-bundle/inventory.js +346 -0
- package/template/coding-task-manager/lib/agent-bundle/push.js +717 -0
- package/template/coding-task-manager/lib/agent-bundle/skill-transfer.js +724 -0
- package/template/coding-task-manager/lib/agent-bundle/spawn.js +119 -0
- package/template/coding-task-manager/lib/agent-bundle/store.js +568 -0
- package/template/coding-task-manager/lib/agent-capabilities.js +142 -12
- package/template/coding-task-manager/lib/agent-cli-cache.js +30 -5
- package/template/coding-task-manager/lib/agent-definitions.js +19 -0
- package/template/coding-task-manager/lib/agent-hooks-codex-toml.js +28 -16
- package/template/coding-task-manager/lib/agent-hooks-codex-workspace.js +9 -1
- package/template/coding-task-manager/lib/agent-hooks-installer.js +23 -8
- package/template/coding-task-manager/lib/agent-hooks-prune.js +37 -11
- package/template/coding-task-manager/lib/agent-hooks-shim.js +105 -0
- package/template/coding-task-manager/lib/agent-presets.js +84 -1
- package/template/coding-task-manager/lib/agent-upgrade-jobs.js +12 -1
- package/template/coding-task-manager/lib/agent-version-service.js +74 -11
- package/template/coding-task-manager/lib/all-sessions-query.js +6 -2
- package/template/coding-task-manager/lib/api/agent-bundles.js +436 -0
- package/template/coding-task-manager/lib/api/backup-retention.js +83 -0
- package/template/coding-task-manager/lib/api/conversation-sync-routes.js +124 -0
- package/template/coding-task-manager/lib/api/diagnostics.js +549 -69
- package/template/coding-task-manager/lib/api/fleet.js +118 -0
- package/template/coding-task-manager/lib/api/hub-bridge.js +243 -0
- package/template/coding-task-manager/lib/api/ingress.js +9 -1
- package/template/coding-task-manager/lib/api/landing.js +403 -0
- package/template/coding-task-manager/lib/api/machines.js +691 -2
- package/template/coding-task-manager/lib/api/memory-sync-routes.js +335 -0
- package/template/coding-task-manager/lib/api/misc-ops.js +8 -3
- package/template/coding-task-manager/lib/api/remote-sessions.js +1326 -0
- package/template/coding-task-manager/lib/api/session-attach.js +623 -0
- package/template/coding-task-manager/lib/api/session-messages.js +1384 -0
- package/template/coding-task-manager/lib/api/sessions.js +77 -51
- package/template/coding-task-manager/lib/api/setup-network.js +544 -16
- package/template/coding-task-manager/lib/api/setup-wizard-handlers.js +884 -0
- package/template/coding-task-manager/lib/api/setup.js +829 -10
- package/template/coding-task-manager/lib/api/walle-bridge.js +9 -1
- package/template/coding-task-manager/lib/attachment-reconciler-wiring.js +5 -2
- package/template/coding-task-manager/lib/auth-rate-limit.js +23 -0
- package/template/coding-task-manager/lib/auth-rules.js +292 -21
- package/template/coding-task-manager/lib/background-stop.js +369 -0
- package/template/coding-task-manager/lib/best-of-attempts.js +4 -1
- package/template/coding-task-manager/lib/best-of-launch-plan.js +52 -0
- package/template/coding-task-manager/lib/box-keep-awake.js +89 -0
- package/template/coding-task-manager/lib/broadcast-reason-stats.js +152 -0
- package/template/coding-task-manager/lib/broadcast-serialize.js +5 -0
- package/template/coding-task-manager/lib/build-info.js +4 -2
- package/template/coding-task-manager/lib/claude-model-truth.js +13 -2
- package/template/coding-task-manager/lib/claude-transcript-terminal-renderer.js +17 -13
- package/template/coding-task-manager/lib/client-diag-handler.js +64 -2
- package/template/coding-task-manager/lib/codex-app-server-client.js +14 -16
- package/template/coding-task-manager/lib/codex-configuration-history.js +55 -0
- package/template/coding-task-manager/lib/codex-harness-qualification.js +43 -20
- package/template/coding-task-manager/lib/codex-rollout-history.js +743 -0
- package/template/coding-task-manager/lib/coding-agent-models.js +27 -12
- package/template/coding-task-manager/lib/coding-cli-skill-installer.js +44 -14
- package/template/coding-task-manager/lib/coding-session-model-adapters.js +43 -2
- package/template/coding-task-manager/lib/coding-session-model-owner.js +1 -1
- package/template/coding-task-manager/lib/coding-session-model-public.js +7 -1
- package/template/coding-task-manager/lib/coding-session-model-runtime.js +23 -4
- package/template/coding-task-manager/lib/coding-session-model-scan.js +31 -0
- package/template/coding-task-manager/lib/coding-session-model-state.js +7 -0
- package/template/coding-task-manager/lib/conversation-freshness-diagnostics.js +280 -0
- package/template/coding-task-manager/lib/conversation-item-clock.js +261 -0
- package/template/coding-task-manager/lib/conversation-source-registry.js +5 -0
- package/template/coding-task-manager/lib/conversation-store-v2.js +44 -0
- package/template/coding-task-manager/lib/conversation-sync.js +355 -0
- package/template/coding-task-manager/lib/create/resolve-launch-params.js +96 -12
- package/template/coding-task-manager/lib/create/worker-role-profile.js +4 -4
- package/template/coding-task-manager/lib/create-intent-lease.js +51 -0
- package/template/coding-task-manager/lib/ctm-session-context-api.js +97 -6
- package/template/coding-task-manager/lib/db-domain-tables.js +1 -0
- package/template/coding-task-manager/lib/db-domains.js +1 -0
- package/template/coding-task-manager/lib/db-owner-dispatch-probe.js +32 -0
- package/template/coding-task-manager/lib/db-owner-request-counts.js +178 -0
- package/template/coding-task-manager/lib/db-owner-worker-client.js +68 -14
- package/template/coding-task-manager/lib/db-schema-source-files.js +5 -0
- package/template/coding-task-manager/lib/deferred-restore-attempt.js +6 -2
- package/template/coding-task-manager/lib/feature-manifest.js +4 -0
- package/template/coding-task-manager/lib/fleet-conversation-route.js +97 -0
- package/template/coding-task-manager/lib/fleet-fanout.js +78 -0
- package/template/coding-task-manager/lib/fleet-hub.js +762 -0
- package/template/coding-task-manager/lib/fleet-origin-follower.js +252 -0
- package/template/coding-task-manager/lib/fleet-resolver-effects.js +147 -0
- package/template/coding-task-manager/lib/fleet-resolver-tick.js +148 -0
- package/template/coding-task-manager/lib/fleet-resolver.js +454 -0
- package/template/coding-task-manager/lib/fleet-session-list-routes.js +114 -0
- package/template/coding-task-manager/lib/fleet-session-lists.js +672 -0
- package/template/coding-task-manager/lib/fleet-update.js +798 -0
- package/template/coding-task-manager/lib/fs-watcher-root-watch.js +141 -0
- package/template/coding-task-manager/lib/fs-watcher.js +58 -42
- package/template/coding-task-manager/lib/harness-history-transition.js +50 -9
- package/template/coding-task-manager/lib/headless-term-service.js +84 -8
- package/template/coding-task-manager/lib/hermetic-agent-launch-guard.js +10 -0
- package/template/coding-task-manager/lib/history-transition-read-op.js +175 -8
- package/template/coding-task-manager/lib/host-cpu-categories.js +310 -0
- package/template/coding-task-manager/lib/host-fseventsd-sampler.js +399 -0
- package/template/coding-task-manager/lib/host-handoff.js +16 -19
- package/template/coding-task-manager/lib/host-stats.js +150 -3
- package/template/coding-task-manager/lib/hosted-sync-worker.js +43 -320
- package/template/coding-task-manager/lib/hub-bridge-access.js +798 -0
- package/template/coding-task-manager/lib/hub-bridge-box.js +409 -0
- package/template/coding-task-manager/lib/hub-bridge-mcp.js +380 -0
- package/template/coding-task-manager/lib/hub-bridge-mesh.js +313 -0
- package/template/coding-task-manager/lib/hub-bridge-ops.js +721 -0
- package/template/coding-task-manager/lib/hub-bridge.js +398 -0
- package/template/coding-task-manager/lib/idle-notify.js +491 -0
- package/template/coding-task-manager/lib/instance-id-ownership-manifest.js +8 -0
- package/template/coding-task-manager/lib/instance-manifest.js +5 -1
- package/template/coding-task-manager/lib/instance-sync-status.js +18 -8
- package/template/coding-task-manager/lib/landing/agent-rule.txt +1 -0
- package/template/coding-task-manager/lib/landing/batch-runner.js +366 -0
- package/template/coding-task-manager/lib/landing/config.js +536 -0
- package/template/coding-task-manager/lib/landing/ctm-view.js +256 -0
- package/template/coding-task-manager/lib/landing/gate.js +360 -0
- package/template/coding-task-manager/lib/landing/git.js +344 -0
- package/template/coding-task-manager/lib/landing/lease.js +247 -0
- package/template/coding-task-manager/lib/landing/merge-delta.js +380 -0
- package/template/coding-task-manager/lib/landing/proof.js +223 -0
- package/template/coding-task-manager/lib/landing/queue.js +998 -0
- package/template/coding-task-manager/lib/landing/radar.js +489 -0
- package/template/coding-task-manager/lib/landing/resolve-cli.js +424 -0
- package/template/coding-task-manager/lib/landing/state.js +263 -0
- package/template/coding-task-manager/lib/landing/stop.js +49 -0
- package/template/coding-task-manager/lib/landing/sync-cli.js +475 -0
- package/template/coding-task-manager/lib/landing/sync.js +456 -0
- package/template/coding-task-manager/lib/landing/train.js +885 -0
- package/template/coding-task-manager/lib/landing/window.js +57 -0
- package/template/coding-task-manager/lib/launch-environment.js +121 -0
- package/template/coding-task-manager/lib/launch-model-override.js +36 -10
- package/template/coding-task-manager/lib/launch-plan-pool.js +2 -1
- package/template/coding-task-manager/lib/launch-plan-warm-cache.js +6 -0
- package/template/coding-task-manager/lib/lead-model-observer.js +57 -1
- package/template/coding-task-manager/lib/lead-model-options.js +160 -3
- package/template/coding-task-manager/lib/lead-model-restore-reconciliation.js +106 -24
- package/template/coding-task-manager/lib/lead-model-switch-runtime.js +352 -68
- package/template/coding-task-manager/lib/lead-model-switch.js +114 -10
- package/template/coding-task-manager/lib/lead-model-transition-runtime.js +14 -2
- package/template/coding-task-manager/lib/lead-model-transition-store.js +24 -6
- package/template/coding-task-manager/lib/lead-route-preflight.js +179 -0
- package/template/coding-task-manager/lib/lead-switch-history-mode.js +110 -0
- package/template/coding-task-manager/lib/lead-wire-agent.js +7 -0
- package/template/coding-task-manager/lib/lifecycle-wake-experiment.js +9 -2
- package/template/coding-task-manager/lib/live-defer-announce.js +45 -0
- package/template/coding-task-manager/lib/machine-registry.js +750 -5
- package/template/coding-task-manager/lib/macos-capabilities.js +32 -15
- package/template/coding-task-manager/lib/main-thread-lint-exemptions.json +433 -53
- package/template/coding-task-manager/lib/mainloop-observability.js +14 -9
- package/template/coding-task-manager/lib/media-draft-owner.js +16 -3
- package/template/coding-task-manager/lib/memory-join.js +337 -0
- package/template/coding-task-manager/lib/memory-sync-verify.js +393 -0
- package/template/coding-task-manager/lib/memory-sync.js +565 -0
- package/template/coding-task-manager/lib/migrations/v57-delegate-pref-mirror-opencode.js +68 -0
- package/template/coding-task-manager/lib/migrations/v58-subagent-launch-native-subagents.js +42 -0
- package/template/coding-task-manager/lib/migrations/v59-coding-session-model-state-dsh.js +73 -0
- package/template/coding-task-manager/lib/migrations/v60-delegate-pref-mirror-dsh.js +78 -0
- package/template/coding-task-manager/lib/migrations/v61-conversation-item-clock.js +71 -0
- package/template/coding-task-manager/lib/model-availability.js +727 -0
- package/template/coding-task-manager/lib/model-execution-recipe-metadata.js +4 -6
- package/template/coding-task-manager/lib/model-host-receipt.js +6 -3
- package/template/coding-task-manager/lib/model-id-rule.js +19 -0
- package/template/coding-task-manager/lib/model-proxy/anthropic-face.js +4 -0
- package/template/coding-task-manager/lib/model-proxy/auto-mode-review.js +110 -23
- package/template/coding-task-manager/lib/model-proxy/chat-response-translators.js +3 -0
- package/template/coding-task-manager/lib/model-proxy/generation-probe.js +60 -17
- package/template/coding-task-manager/lib/model-proxy/historical-tool-declarations.js +37 -0
- package/template/coding-task-manager/lib/model-proxy/lead-request-validation.js +1 -0
- package/template/coding-task-manager/lib/model-proxy/lead-token-admin.js +130 -0
- package/template/coding-task-manager/lib/model-proxy/refusal-scope.js +151 -0
- package/template/coding-task-manager/lib/model-proxy/request-budget-store.js +11 -2
- package/template/coding-task-manager/lib/model-proxy/tokens.js +69 -5
- package/template/coding-task-manager/lib/model-proxy/upstream-outcome.js +9 -0
- package/template/coding-task-manager/lib/native-agent-model-args.js +25 -22
- package/template/coding-task-manager/lib/native-history-control.js +6 -4
- package/template/coding-task-manager/lib/native-lead-settings-client.js +44 -4
- package/template/coding-task-manager/lib/oauth-proxy-supervisor.js +173 -36
- package/template/coding-task-manager/lib/online-backup-worker-client.js +2 -0
- package/template/coding-task-manager/lib/opencode-cli.js +480 -0
- package/template/coding-task-manager/lib/opencode-launch-model.js +471 -0
- package/template/coding-task-manager/lib/opencode-v1-plugin/model-carrier.mjs +35 -0
- package/template/coding-task-manager/lib/opencode-v2-plugin/server.js +118 -0
- package/template/coding-task-manager/lib/owner-action-manifest-data.json +1 -1
- package/template/coding-task-manager/lib/park-composer-draft.js +54 -0
- package/template/coding-task-manager/lib/park-fresh-relaunch.js +41 -10
- package/template/coding-task-manager/lib/perf-phase-trace.js +72 -0
- package/template/coding-task-manager/lib/perf-summary.js +7 -0
- package/template/coding-task-manager/lib/perf-tracker.js +63 -2
- package/template/coding-task-manager/lib/project-config.js +7 -0
- package/template/coding-task-manager/lib/prompt-purge-v2.js +52 -1
- package/template/coding-task-manager/lib/provider-login-broker.js +72 -15
- package/template/coding-task-manager/lib/provider-login-tab.js +10 -2
- package/template/coding-task-manager/lib/read-pool-client.js +89 -2
- package/template/coding-task-manager/lib/read-pool-worker-handle.js +29 -4
- package/template/coding-task-manager/lib/recent-catalog-query.js +15 -0
- package/template/coding-task-manager/lib/recent-session-catalog-response.js +67 -10
- package/template/coding-task-manager/lib/recovery-evidence.js +26 -11
- package/template/coding-task-manager/lib/relay-client.js +57 -3
- package/template/coding-task-manager/lib/relink-audit.js +34 -5
- package/template/coding-task-manager/lib/remote-machine-catalog.js +321 -26
- package/template/coding-task-manager/lib/remote-machine-create.js +576 -36
- package/template/coding-task-manager/lib/remote-machine-link.js +546 -59
- package/template/coding-task-manager/lib/remote-machine-proxy.js +143 -9
- package/template/coding-task-manager/lib/remote-session-forward.js +65 -7
- package/template/coding-task-manager/lib/remote-terminal-target.js +9 -2
- package/template/coding-task-manager/lib/restart-guard.js +18 -6
- package/template/coding-task-manager/lib/restore-seed-modes.js +87 -0
- package/template/coding-task-manager/lib/restored-scrollback-hydration-runtime.js +22 -2
- package/template/coding-task-manager/lib/resume-admission.js +17 -3
- package/template/coding-task-manager/lib/review-repo-registry.js +58 -19
- package/template/coding-task-manager/lib/root-delivery-runtime.js +2 -2
- package/template/coding-task-manager/lib/root-prompt-flow.js +1 -1
- package/template/coding-task-manager/lib/runtime-contract.js +3 -1
- package/template/coding-task-manager/lib/schema-indexes.js +1 -0
- package/template/coding-task-manager/lib/session-context-locator.js +742 -0
- package/template/coding-task-manager/lib/session-create/attachment.js +2 -2
- package/template/coding-task-manager/lib/session-create/create-phases.js +118 -0
- package/template/coding-task-manager/lib/session-create/delegate-worker.js +86 -16
- package/template/coding-task-manager/lib/session-create/dsh-session.js +930 -0
- package/template/coding-task-manager/lib/session-create/lead-route-launch.js +186 -13
- package/template/coding-task-manager/lib/session-create/native-lead-lifetime.js +55 -3
- package/template/coding-task-manager/lib/session-create/opencode-lead-provider.js +50 -0
- package/template/coding-task-manager/lib/session-create/prepared.js +162 -38
- package/template/coding-task-manager/lib/session-create/provider-process.js +160 -28
- package/template/coding-task-manager/lib/session-create/response.js +7 -7
- package/template/coding-task-manager/lib/session-create/structured-session.js +27 -0
- package/template/coding-task-manager/lib/session-create/subagent-pick-table.js +3 -1
- package/template/coding-task-manager/lib/session-create/subagent-pick.js +458 -9
- package/template/coding-task-manager/lib/session-create/transcript.js +1 -1
- package/template/coding-task-manager/lib/session-create/worker-budget-setup.js +21 -2
- package/template/coding-task-manager/lib/session-create/worker-continuation.js +7 -1
- package/template/coding-task-manager/lib/session-create/worker-launch-sandbox.js +39 -10
- package/template/coding-task-manager/lib/session-create/worker-observability.js +2 -2
- package/template/coding-task-manager/lib/session-empty.js +13 -10
- package/template/coding-task-manager/lib/session-host-manager.js +60 -0
- package/template/coding-task-manager/lib/session-jobs.js +3 -1
- package/template/coding-task-manager/lib/session-lifecycle.js +10 -4
- package/template/coding-task-manager/lib/session-model-action-preconditions.js +6 -2
- package/template/coding-task-manager/lib/session-model-intent-contract.js +11 -8
- package/template/coding-task-manager/lib/session-park.js +738 -0
- package/template/coding-task-manager/lib/session-path-grant.js +13 -4
- package/template/coding-task-manager/lib/session-status-ledger.js +106 -4
- package/template/coding-task-manager/lib/session-transport.js +17 -0
- package/template/coding-task-manager/lib/session-workspace-projection.js +54 -5
- package/template/coding-task-manager/lib/session-workspace-tracking-runtime.js +213 -1
- package/template/coding-task-manager/lib/skill-autocomplete-query.js +120 -3
- package/template/coding-task-manager/lib/skill-autocomplete.js +15 -1
- package/template/coding-task-manager/lib/sqlite-file-set.js +39 -0
- package/template/coding-task-manager/lib/standup-search-adapter.js +16 -2
- package/template/coding-task-manager/lib/state-sync/client-ledger.js +12 -0
- package/template/coding-task-manager/lib/state-sync/frame-emitter.js +319 -100
- package/template/coding-task-manager/lib/storage/coding-session-model-store.js +4 -1
- package/template/coding-task-manager/lib/storage/delegate-pref-mirror-store.js +32 -9
- package/template/coding-task-manager/lib/structured-session-boot-sweep.js +235 -0
- package/template/coding-task-manager/lib/submission-ack.js +90 -2
- package/template/coding-task-manager/lib/systemd-scope.js +115 -0
- package/template/coding-task-manager/lib/telemetry-receiver.js +39 -0
- package/template/coding-task-manager/lib/terminal-attach-geometry.js +985 -0
- package/template/coding-task-manager/lib/terminal-bootstrap.js +30 -0
- package/template/coding-task-manager/lib/terminal-draft-operation.js +357 -0
- package/template/coding-task-manager/lib/terminal-input-admission.js +17 -1
- package/template/coding-task-manager/lib/terminal-input-prepared.js +563 -0
- package/template/coding-task-manager/lib/transcript-cache-temps.js +171 -0
- package/template/coding-task-manager/lib/transcript-frame-cache.js +8 -3
- package/template/coding-task-manager/lib/transcript-source.js +36 -4
- package/template/coding-task-manager/lib/transcript-store.js +9 -0
- package/template/coding-task-manager/lib/typing-interaction-trace.js +106 -3
- package/template/coding-task-manager/lib/usage-ledger/backfill.js +40 -5
- package/template/coding-task-manager/lib/usage-ledger/client.js +4 -1
- package/template/coding-task-manager/lib/usage-ledger/dsh-parse.js +152 -0
- package/template/coding-task-manager/lib/usage-ledger/dsh-read.js +73 -0
- package/template/coding-task-manager/lib/usage-ledger/ingest.js +34 -6
- package/template/coding-task-manager/lib/usage-ledger/live.js +35 -8
- package/template/coding-task-manager/lib/usage-ledger/read.js +29 -20
- package/template/coding-task-manager/lib/usage-ledger/schema.js +61 -1
- package/template/coding-task-manager/lib/usage-ledger/task-coordinator.js +4 -2
- package/template/coding-task-manager/lib/wake-skip-reasons.js +1 -0
- package/template/coding-task-manager/lib/walle/turn.js +1 -1
- package/template/coding-task-manager/lib/walle-history-serve.js +838 -0
- package/template/coding-task-manager/lib/walle-kill-authority.js +2 -2
- package/template/coding-task-manager/lib/walle-log-rotation.js +164 -1
- package/template/coding-task-manager/lib/walle-mcp-auto-config.js +56 -2
- package/template/coding-task-manager/lib/walle-row-history.js +495 -0
- package/template/coding-task-manager/lib/walle-supervisor.js +33 -14
- package/template/coding-task-manager/lib/watch-worker-client.js +203 -0
- package/template/coding-task-manager/lib/worker-terminal-output.js +5 -2
- package/template/coding-task-manager/lib/ws/hub-bridge.js +35 -0
- package/template/coding-task-manager/lib/ws/lifecycle.js +6 -11
- package/template/coding-task-manager/lib/ws/misc.js +1 -1
- package/template/coding-task-manager/lib/ws/state-sync.js +106 -4
- package/template/coding-task-manager/lib/ws/terminal-attach.js +91 -0
- package/template/coding-task-manager/oauth-proxy.js +112 -115
- package/template/coding-task-manager/package-lock.json +10 -94
- package/template/coding-task-manager/package.json +4 -3
- package/template/coding-task-manager/protocol/message-table.json +10 -0
- package/template/coding-task-manager/protocol/messages.js +10 -0
- package/template/coding-task-manager/protocol/ws-schema.json +20 -0
- package/template/coding-task-manager/protocol/ws-schema.md +2 -0
- package/template/coding-task-manager/public/css/app.css +170 -0
- package/template/coding-task-manager/public/css/walle-session.css +4 -0
- package/template/coding-task-manager/public/index.html +473 -243
- package/template/coding-task-manager/public/js/agent-command.js +86 -0
- package/template/coding-task-manager/public/js/app/backups-panel.js +111 -5
- package/template/coding-task-manager/public/js/app/coding-agent-upgrade.js +103 -4
- package/template/coding-task-manager/public/js/app/machines-page.js +1328 -8
- package/template/coding-task-manager/public/js/app/models-tab.js +113 -38
- package/template/coding-task-manager/public/js/app/restart-banner.js +53 -0
- package/template/coding-task-manager/public/js/app/worktrees-panel.js +184 -2
- package/template/coding-task-manager/public/js/background-work.js +196 -27
- package/template/coding-task-manager/public/js/coding-session-model-presentation.js +138 -10
- package/template/coding-task-manager/public/js/core/active-session-groups.js +179 -0
- package/template/coding-task-manager/public/js/core/pending-create.js +238 -0
- package/template/coding-task-manager/public/js/core/recent-machine-source.js +228 -0
- package/template/coding-task-manager/public/js/core/session-commands.js +180 -14
- package/template/coding-task-manager/public/js/dashboard-client-function-order.json +8 -0
- package/template/coding-task-manager/public/js/document-review-links.js +9 -1
- package/template/coding-task-manager/public/js/file-resolution-client.js +52 -1
- package/template/coding-task-manager/public/js/history-app-seam.js +22 -2
- package/template/coding-task-manager/public/js/machine-pool-shared.js +558 -3
- package/template/coding-task-manager/public/js/message-renderer.js +4 -3
- package/template/coding-task-manager/public/js/model-picker.js +3 -1
- package/template/coding-task-manager/public/js/native-subagent-review.js +15 -2
- package/template/coding-task-manager/public/js/new-session-agent-grid.js +346 -0
- package/template/coding-task-manager/public/js/pasted-content.js +236 -0
- package/template/coding-task-manager/public/js/pe-private-content-lifetime.js +39 -7
- package/template/coding-task-manager/public/js/private-model-lifetime.js +6 -2
- package/template/coding-task-manager/public/js/prompts.js +11 -10
- package/template/coding-task-manager/public/js/protocol.js +10 -0
- package/template/coding-task-manager/public/js/restart-banner-policy.js +29 -1
- package/template/coding-task-manager/public/js/session-model-picker.js +447 -57
- package/template/coding-task-manager/public/js/session-search-utils.js +18 -2
- package/template/coding-task-manager/public/js/session-usage-view.js +2 -1
- package/template/coding-task-manager/public/js/session-workspace-tracking.js +51 -1
- package/template/coding-task-manager/public/js/state-sync-client.js +10 -1
- package/template/coding-task-manager/public/js/stream-view.js +6 -5
- package/template/coding-task-manager/public/js/terminal/conv-only-session.js +287 -0
- package/template/coding-task-manager/public/js/terminal/runtime-09.js +2 -0
- package/template/coding-task-manager/public/js/terminal/runtime-10.js +5 -5
- package/template/coding-task-manager/public/js/terminal/runtime-12.js +8 -1
- package/template/coding-task-manager/public/js/terminal/runtime-16.js +4 -0
- package/template/coding-task-manager/public/js/terminal/runtime-20.js +1 -1
- package/template/coding-task-manager/public/js/terminal-attachment-draft.js +67 -13
- package/template/coding-task-manager/public/js/terminal-image-orchestration.js +52 -6
- package/template/coding-task-manager/public/js/terminal-wheel.js +23 -3
- package/template/coding-task-manager/public/js/walle/chat-conversation.js +4 -4
- package/template/coding-task-manager/public/js/walle.js +6 -0
- package/template/coding-task-manager/public/js/ws/live-dispatch.js +10 -0
- package/template/coding-task-manager/public/m/app.css +140 -0
- package/template/coding-task-manager/public/m/app.js +507 -68
- package/template/coding-task-manager/public/m/index.html +17 -0
- package/template/coding-task-manager/public/m/machines.js +838 -4
- package/template/coding-task-manager/public/m/private-api.js +31 -1
- package/template/coding-task-manager/public/usage.html +1 -0
- package/template/coding-task-manager/scripts/dev-route-fixture/synthetic-route-upstream.js +104 -0
- package/template/coding-task-manager/scripts/dev-route-fixture.js +339 -0
- package/template/coding-task-manager/scripts/opencode-lead-route-probe.js +195 -0
- package/template/coding-task-manager/scripts/opencode-v2-contract-probe/fake-anthropic.js +168 -0
- package/template/coding-task-manager/scripts/opencode-v2-contract-probe/probe-plugin/server.js +95 -0
- package/template/coding-task-manager/scripts/opencode-v2-contract-probe.js +673 -0
- package/template/coding-task-manager/server.js +1950 -11679
- package/template/coding-task-manager/session-integrity.js +64 -4
- package/template/coding-task-manager/workers/db-owner-worker.js +19 -2
- package/template/coding-task-manager/workers/online-backup-worker.js +1 -0
- package/template/coding-task-manager/workers/read-pool-model-collector.js +51 -3
- package/template/coding-task-manager/workers/read-pool-worker.js +76 -6
- package/template/coding-task-manager/workers/session-host-pool-process.js +6 -6
- package/template/coding-task-manager/workers/session-host-process.js +5 -5
- package/template/coding-task-manager/workers/watch-worker.js +105 -0
- package/template/coding-task-manager/workers/worktree-worker.js +168 -33
- package/template/ctm-relay/lib/protocol.js +14 -1
- package/template/package-lock.json +2 -2
- package/template/package.json +1 -1
- package/template/shared/backup-retention.js +82 -0
- package/template/shared/conversation-admission.js +2 -0
- package/template/shared/conversation-provenance.js +3 -7
- package/template/shared/conversation-storage-v2-contract.js +5 -0
- package/template/shared/linked-worktree.js +51 -0
- package/template/shared/macos-fda-target.js +57 -0
- package/template/shared/orphan-parents.js +55 -0
- package/template/shared/release-schema.json +2 -2
- package/template/shared/storage/contract.js +3 -0
- package/template/wall-e/adapters/imessage.js +12 -0
- package/template/wall-e/agent.js +71 -4
- package/template/wall-e/api-walle.js +21 -1
- package/template/wall-e/bin/train-gemma-e4b-tooluse.js +2 -2
- package/template/wall-e/bin/walle-mcp-stdio.js +5 -5
- package/template/wall-e/brain/brain-join.js +859 -0
- package/template/wall-e/brain/brain-sync-membership.js +20 -0
- package/template/wall-e/brain/brain-sync-store.js +131 -77
- package/template/wall-e/brain/brain-sync-v2-schema.js +203 -0
- package/template/wall-e/brain/brain-sync-v2.js +578 -0
- package/template/wall-e/brain/delegate-model-prefs-store.js +13 -4
- package/template/wall-e/brain/deterministic-id.js +51 -0
- package/template/wall-e/brain/memories.js +2 -2
- package/template/wall-e/brain/migrations.js +40 -6
- package/template/wall-e/brain/model-identity-migration.js +1 -1
- package/template/wall-e/brain/owner-call-whitelist.js +23 -7
- package/template/wall-e/brain/schema.js +45 -85
- package/template/wall-e/brain.js +171 -35
- package/template/wall-e/chat.js +3 -3
- package/template/wall-e/coding/agent-shell-env.js +7 -2
- package/template/wall-e/coding/prompt-bundle.js +66 -21
- package/template/wall-e/config/main-loop-exemptions.json +2 -2
- package/template/wall-e/http/admin-api.js +37 -0
- package/template/wall-e/http/gws-api.js +4 -0
- package/template/wall-e/http/helper-rules-api.js +7 -1
- package/template/wall-e/http/model-admin.js +8 -1
- package/template/wall-e/http/model-delegate-pref-admin.js +3 -3
- package/template/wall-e/http/model-proxy-providers.js +174 -1
- package/template/wall-e/http/model-route-health.js +157 -0
- package/template/wall-e/http/sync-api.js +278 -464
- package/template/wall-e/jobs/job-runner.js +28 -1
- package/template/wall-e/lib/brain-owner-op-priority.js +9 -1
- package/template/wall-e/lib/ctm-data-dir.js +26 -0
- package/template/wall-e/lib/derivation-home.js +147 -0
- package/template/wall-e/lib/helper-rules/evaluate.js +50 -9
- package/template/wall-e/lib/helper-rules/grade.js +51 -8
- package/template/wall-e/lib/helper-rules/lead-call-hook.js +38 -5
- package/template/wall-e/lib/helper-rules/store.js +4 -2
- package/template/wall-e/lib/landing-mcp-tools.js +170 -0
- package/template/wall-e/lib/mcp-client-config.js +133 -14
- package/template/wall-e/lib/mcp-gateway-migrate.js +28 -64
- package/template/wall-e/lib/mcp-integration.js +58 -13
- package/template/wall-e/lib/parent-death.js +7 -1
- package/template/wall-e/lib/scheduler-worker-jobs.js +6 -4
- package/template/wall-e/llm/delegate-lead-prefs.js +16 -1
- package/template/wall-e/llm/delegate-vendor-default.js +12 -5
- package/template/wall-e/llm/model-roles.js +1 -1
- package/template/wall-e/llm/native-delegate-selection.js +56 -8
- package/template/wall-e/llm/worker-delegate-args.js +72 -7
- package/template/wall-e/llm/worker-mcp-routing.js +66 -17
- package/template/wall-e/loops/brain-custom-writes.js +19 -0
- package/template/wall-e/loops/ingest.js +17 -1
- package/template/wall-e/loops/think.js +19 -4
- package/template/wall-e/mcp-contract.js +222 -6
- package/template/wall-e/mcp-protocol-contract.js +40 -5
- package/template/wall-e/mcp-server.js +128 -29
- package/template/wall-e/mcp-worker-schemas.js +5 -5
- package/template/wall-e/memory/ctm-context-client.js +85 -0
- package/template/wall-e/memory/ctm-session-context.js +9 -3
- package/template/wall-e/memory/hub-bridge-client.js +388 -0
- package/template/wall-e/memory/replica-origin.js +56 -0
- package/template/wall-e/memory/session-pool.js +135 -0
- package/template/wall-e/runtime/live-capabilities.js +8 -3
- package/template/wall-e/server.js +4 -2
- package/template/wall-e/shared/release-schema.json +2 -2
- package/template/wall-e/shared/sqlite-file-set.js +39 -0
- package/template/wall-e/shared/storage/contract.js +3 -0
- package/template/wall-e/skills/_templates/delegate-worker/VERSION +1 -1
- package/template/wall-e/skills/_templates/delegate-worker/released-sha256.json +7 -1
- package/template/wall-e/skills/_templates/delegate-worker/templates/claude/SKILL.md +4 -4
- package/template/wall-e/skills/_templates/delegate-worker/templates/codex/SKILL.md +6 -6
- package/template/wall-e/skills/_templates/fleet-sync/VERSION +1 -0
- package/template/wall-e/skills/_templates/fleet-sync/released-sha256.json +16 -0
- package/template/wall-e/skills/_templates/fleet-sync/templates/claude/SKILL.md +64 -0
- package/template/wall-e/skills/_templates/fleet-sync/templates/codex/SKILL.md +64 -0
- package/template/wall-e/tools/chrome-automation.js +6 -0
- package/template/wall-e/training/setup-cuda-train-env.sh +2 -2
- package/template/wall-e/workers/brain-owner-worker.js +18 -4
- package/template/wall-e/workers/mcp-gateway-process.js +5 -5
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* WP-7 (docs/remote-agent-skills-bundles-2026-10-25.html §5 D-11, the D-11 decision + cadence rows,
|
|
5
|
+
* §6.2 `GET /api/agent-skills/inventory`, §6.5, the WP-7 row AC-7a..AC-7d): THE RETURN PATH — the box
|
|
6
|
+
* reports the skills it already holds, and the hub classifies each one against its own copy and the
|
|
7
|
+
* base (the tree that box last received).
|
|
8
|
+
*
|
|
9
|
+
* Two halves in one module, because they are two views of one question ("what does the box have that
|
|
10
|
+
* we do not?"):
|
|
11
|
+
*
|
|
12
|
+
* BOX `readBoxInventory({ homeDir, env, dataDir, peerInstanceId })` — enumerate the box's own
|
|
13
|
+
* Claude/Codex skill roots (the SAME enumeration build.js ships: its listers, its walk, its
|
|
14
|
+
* item hash), say which copies CTM owns, and hand back the base for the AUTHENTICATED caller.
|
|
15
|
+
* HUB `classifyBoxSkills({ hubItems, baseItems, boxSkills })` — pure, five rules, first match wins.
|
|
16
|
+
*
|
|
17
|
+
* BASE, not the hub's push record (the lead's superseding adjustment): the hub's push bookkeeping is
|
|
18
|
+
* in-process (`lib/machine-registry.js`'s `_agentBundlePush`) and dies with a restart, so the box —
|
|
19
|
+
* which still holds the tree it was given — carries the base back with its inventory. Classification
|
|
20
|
+
* therefore survives a hub restart.
|
|
21
|
+
*
|
|
22
|
+
* D-11 is "inventory + classification, NEVER auto-copy": nothing here writes to either side, and
|
|
23
|
+
* nothing is ever copied. A box-local skill SHADOWS the hub's added-dir copy of the same name on
|
|
24
|
+
* Claude 2.1.310 (observed: exactly one `zz-collide-*` loaded, the box-local one) — hence
|
|
25
|
+
* `shadows_hub` is a first-class state rather than an assumption that both copies load.
|
|
26
|
+
*
|
|
27
|
+
* AC-7d: a copy CTM itself put there is never classified — `delegate` (the managed-skill installer's
|
|
28
|
+
* own skill) and a pristine WP-6 Codex install both read `managed` and drop out of the matrix. An
|
|
29
|
+
* EDITED agent-bundle copy is the box's own work now, so it reads `managed: null` and IS classified.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
const os = require('os');
|
|
33
|
+
const path = require('path');
|
|
34
|
+
const fsp = require('fs/promises');
|
|
35
|
+
|
|
36
|
+
const { computeTreeHash, itemHashOfDir, listClaudeSkillItems, listCodexSkillItems } = require('./build');
|
|
37
|
+
const store = require('./store');
|
|
38
|
+
// WP-6's directory hash: the hash a WP-6 marker`sha256` is written from. Deliberately NOT
|
|
39
|
+
// `itemHashOfDir` — a bundle copy is "pristine" when ITS OWN hash still matches what the installer
|
|
40
|
+
// recorded, and those two hashes are different functions of the same bytes (D-14).
|
|
41
|
+
const { dirHash } = require('./codex-install');
|
|
42
|
+
const installer = require('../coding-cli-skill-installer');
|
|
43
|
+
|
|
44
|
+
const { MANAGED_SKILLS } = installer;
|
|
45
|
+
const { readMarker } = installer._internals;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* `source` strings on disk. Both live in modules this one does not own, and both are ON-DISK
|
|
49
|
+
* contract values (a marker is read back by a different process and a different release), so they
|
|
50
|
+
* are restated here as data rather than reached for across module boundaries.
|
|
51
|
+
*/
|
|
52
|
+
const INSTALLER_SOURCE = 'ctm-coding-cli-skill-installer'; // lib/coding-cli-skill-installer.js SOURCE
|
|
53
|
+
const AGENT_BUNDLE_SOURCE = 'agent-bundle'; // lib/agent-bundle/codex-install.js SOURCE
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The three manifest entry roots (store.js PATH_PREFIXES, build.js entryPrefix) read BACKWARDS:
|
|
57
|
+
* an entry path is `<prefix><item folder>/<rel file path>`, and the folder segment is what names
|
|
58
|
+
* the item. Order is irrelevant — the three are disjoint.
|
|
59
|
+
*/
|
|
60
|
+
const ITEM_PREFIXES = Object.freeze([
|
|
61
|
+
Object.freeze({ prefix: 'claude/.claude/skills/', agent: 'claude', kind: 'skill' }),
|
|
62
|
+
Object.freeze({ prefix: 'plugins/', agent: 'claude', kind: 'plugin' }),
|
|
63
|
+
Object.freeze({ prefix: 'codex/', agent: 'codex', kind: 'skill' }),
|
|
64
|
+
]);
|
|
65
|
+
|
|
66
|
+
/** The five classification states (§6.5), in rule order. Exported so a test can pin "nothing else". */
|
|
67
|
+
const BOX_SKILL_STATES = Object.freeze([
|
|
68
|
+
'new_on_box', 'same', 'shadows_hub', 'changed_on_box', 'conflict',
|
|
69
|
+
]);
|
|
70
|
+
|
|
71
|
+
function _compareStrings(a, b) {
|
|
72
|
+
if (a < b) return -1;
|
|
73
|
+
if (a > b) return 1;
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async function _statOrNull(target) {
|
|
78
|
+
try {
|
|
79
|
+
return await fsp.stat(target);
|
|
80
|
+
} catch (err) {
|
|
81
|
+
if (err && (err.code === 'ENOENT' || err.code === 'ENOTDIR')) return null;
|
|
82
|
+
throw err; // RETHROW: a real stat fault is the caller's to REPORT
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function _realOrPlain(target) {
|
|
87
|
+
try {
|
|
88
|
+
return await fsp.realpath(target);
|
|
89
|
+
} catch (err) {
|
|
90
|
+
if (err && (err.code === 'ENOENT' || err.code === 'ENOTDIR')) return target;
|
|
91
|
+
throw err; // RETHROW: a real resolution fault is the caller's to REPORT
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function _readJsonOrNull(target) {
|
|
96
|
+
let text;
|
|
97
|
+
try {
|
|
98
|
+
text = await fsp.readFile(target, 'utf8');
|
|
99
|
+
} catch (err) {
|
|
100
|
+
if (err && (err.code === 'ENOENT' || err.code === 'ENOTDIR')) return null;
|
|
101
|
+
throw err; // RETHROW: a real read fault must not read as "no manifest"
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const parsed = JSON.parse(text);
|
|
105
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : null;
|
|
106
|
+
} catch {
|
|
107
|
+
// expected: a torn/garbled manifest copy is missing information about the base, never a reason to
|
|
108
|
+
// fail the inventory — the base is a hint for classification, not a fact the box must prove.
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** The box's Claude config dir, by the same rule build.js uses for the hub's own. */
|
|
114
|
+
function claudeConfigDir(homeDir, env) {
|
|
115
|
+
const configured = env && typeof env.CLAUDE_CONFIG_DIR === 'string' ? env.CLAUDE_CONFIG_DIR.trim() : '';
|
|
116
|
+
return configured || path.join(homeDir, '.claude');
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** The box's Codex home, by the same rule build.js uses (`$CODEX_HOME`, else `<home>/.codex`). */
|
|
120
|
+
function codexHomeDir(homeDir, env) {
|
|
121
|
+
const configured = env && typeof env.CODEX_HOME === 'string' ? env.CODEX_HOME.trim() : '';
|
|
122
|
+
return configured || path.join(homeDir, '.codex');
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* The skill roots this inventory enumerates, in build.js's order, realpath'd when they exist (a
|
|
127
|
+
* Dropbox-symlinked `.claude` is the observed real shape). The Codex `.agents` root and a
|
|
128
|
+
* `$CODEX_HOME` that resolves to the same directory are one root, never two rows.
|
|
129
|
+
*/
|
|
130
|
+
async function _rootsFor(homeDir, env) {
|
|
131
|
+
const claudeRoot = await _realOrPlain(path.join(claudeConfigDir(homeDir, env), 'skills'));
|
|
132
|
+
const agentsRoot = path.join(homeDir, '.agents', 'skills');
|
|
133
|
+
const codexRoots = [agentsRoot];
|
|
134
|
+
const configuredRoot = path.join(codexHomeDir(homeDir, env), 'skills');
|
|
135
|
+
if (configuredRoot !== agentsRoot) codexRoots.push(configuredRoot);
|
|
136
|
+
const roots = [{ agent: 'claude', root: claudeRoot }];
|
|
137
|
+
for (const root of codexRoots) roots.push({ agent: 'codex', root: await _realOrPlain(root) });
|
|
138
|
+
return roots;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* AC-7d + §6.2: who owns this copy on the box.
|
|
143
|
+
*
|
|
144
|
+
* 'ctm-managed' a `MANAGED_SKILLS` name (the managed-skill installer's `delegate`), or a marker
|
|
145
|
+
* the installer itself wrote — CTM's own release, never the hub's bundle.
|
|
146
|
+
* 'agent-bundle' a WP-6 Codex install of THIS hub's tree whose bytes still hash to the marker's
|
|
147
|
+
* `sha256` — it IS the hub's bundle, not the box's own work.
|
|
148
|
+
* null anything else: a user-authored skill, another installer's copy, or an
|
|
149
|
+
* agent-bundle copy the box has EDITED since (that is box work now, and D-11
|
|
150
|
+
* exists precisely to surface it).
|
|
151
|
+
*/
|
|
152
|
+
async function _managedFor(item) {
|
|
153
|
+
if (Object.hasOwn(MANAGED_SKILLS, item.name)) return 'ctm-managed';
|
|
154
|
+
const marker = await readMarker(item.rootDir, item.name);
|
|
155
|
+
if (!marker) return null;
|
|
156
|
+
if (marker.source === INSTALLER_SOURCE) return 'ctm-managed';
|
|
157
|
+
if (marker.source !== AGENT_BUNDLE_SOURCE) return null;
|
|
158
|
+
const current = await dirHash(item.rootDir);
|
|
159
|
+
return typeof marker.sha256 === 'string' && marker.sha256 === current ? 'agent-bundle' : null;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* §6.2 base: the item list of the tree the box currently holds for the CALLING hub, derived from the
|
|
164
|
+
* manifest copy the store keeps beside the materialized tree (`trees/<hex>.manifest.json`).
|
|
165
|
+
*
|
|
166
|
+
* The derivation is the inverse of build.js's `entryPrefix`: strip the item prefix, take the first
|
|
167
|
+
* segment as the item folder, keep the rest as the item-relative path — then hash exactly the entry
|
|
168
|
+
* shape build.js hashes, so `baseItems[i].itemHash` IS `buildAgentBundle(...).items[i].itemHash` for
|
|
169
|
+
* the same tree (`tests/agent-bundle-inventory.test.js` proves it against a fixture bundle).
|
|
170
|
+
*
|
|
171
|
+
* @returns {Array<{agent: string, kind: string, name: string, itemHash: string}>}
|
|
172
|
+
*/
|
|
173
|
+
function baseItemsFromManifest(manifest) {
|
|
174
|
+
const entries = manifest && Array.isArray(manifest.entries) ? manifest.entries : [];
|
|
175
|
+
const groups = new Map();
|
|
176
|
+
for (const entry of entries) {
|
|
177
|
+
if (!entry || typeof entry.path !== 'string') continue;
|
|
178
|
+
const matched = ITEM_PREFIXES.find((candidate) => entry.path.startsWith(candidate.prefix));
|
|
179
|
+
if (!matched) continue;
|
|
180
|
+
const rest = entry.path.slice(matched.prefix.length);
|
|
181
|
+
const slash = rest.indexOf('/');
|
|
182
|
+
if (slash <= 0) continue; // no folder segment: not an item
|
|
183
|
+
const name = rest.slice(0, slash);
|
|
184
|
+
const rel = rest.slice(slash + 1);
|
|
185
|
+
if (!rel) continue;
|
|
186
|
+
const key = `${matched.agent}\0${matched.kind}\0${name}`;
|
|
187
|
+
if (!groups.has(key)) {
|
|
188
|
+
groups.set(key, { agent: matched.agent, kind: matched.kind, name, files: [] });
|
|
189
|
+
}
|
|
190
|
+
groups.get(key).files.push({ path: rel, mode: entry.mode, sha256: entry.sha256, size: entry.size });
|
|
191
|
+
}
|
|
192
|
+
return [...groups.values()]
|
|
193
|
+
.map((group) => ({
|
|
194
|
+
agent: group.agent,
|
|
195
|
+
kind: group.kind,
|
|
196
|
+
name: group.name,
|
|
197
|
+
itemHash: computeTreeHash(group.files),
|
|
198
|
+
}))
|
|
199
|
+
.sort((a, b) => _compareStrings(a.agent, b.agent)
|
|
200
|
+
|| _compareStrings(a.kind, b.kind)
|
|
201
|
+
|| _compareStrings(a.name, b.name));
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** The base block for one authenticated hub: `{treeHash, items}`, or the empty base when it has none. */
|
|
205
|
+
async function _baseFor(dataDir, peerInstanceId) {
|
|
206
|
+
const empty = { treeHash: null, items: [] };
|
|
207
|
+
if (!dataDir || !peerInstanceId) return empty;
|
|
208
|
+
const treeHash = await store.currentHubTree(dataDir, peerInstanceId);
|
|
209
|
+
if (!treeHash) return empty;
|
|
210
|
+
const manifest = await _readJsonOrNull(
|
|
211
|
+
path.join(store.storeRoot(dataDir), 'trees', `${treeHash.replace(/^sha256:/, '')}.manifest.json`),
|
|
212
|
+
);
|
|
213
|
+
if (!manifest) return { treeHash, items: [] };
|
|
214
|
+
return { treeHash, items: baseItemsFromManifest(manifest) };
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* §6.2 `GET /api/agent-skills/inventory`: the box's own skill truth, plus the base for the
|
|
219
|
+
* AUTHENTICATED caller (never a body/query field — lib/api/agent-bundles.js reads
|
|
220
|
+
* `req.ctmAuth.peerInstanceId`).
|
|
221
|
+
*
|
|
222
|
+
* Read-only, and never a write to the box user's `~/.claude` (D-1): the box's roots are ENUMERATED
|
|
223
|
+
* here exactly as build.js enumerates the hub's (`synced/` and `.system` excluded by the shared
|
|
224
|
+
* listers), and each item is hashed with build.js's own `itemHashOfDir`.
|
|
225
|
+
*
|
|
226
|
+
* @param {object} opts
|
|
227
|
+
* @param {string} [opts.homeDir=os.homedir()] the box user's home
|
|
228
|
+
* @param {NodeJS.ProcessEnv} [opts.env=process.env]
|
|
229
|
+
* @param {string|null} [opts.dataDir] the box's CTM data dir (null ⇒ no base to report)
|
|
230
|
+
* @param {string} [opts.peerInstanceId] the AUTHENTICATED hub
|
|
231
|
+
* @param {() => number} [opts.now=Date.now] injected clock, so no test needs a sleep
|
|
232
|
+
* @returns {Promise<{platform: string, checkedAt: number, roots: object[], skills: object[],
|
|
233
|
+
* base: {treeHash: string|null, items: object[]}}>}
|
|
234
|
+
*/
|
|
235
|
+
async function readBoxInventory({
|
|
236
|
+
homeDir = os.homedir(),
|
|
237
|
+
env = process.env,
|
|
238
|
+
dataDir = null,
|
|
239
|
+
peerInstanceId = '',
|
|
240
|
+
now = Date.now,
|
|
241
|
+
} = {}) {
|
|
242
|
+
const resolvedHome = String(homeDir == null ? '' : homeDir).replace(/\/+$/, '') || '/';
|
|
243
|
+
const configDir = claudeConfigDir(resolvedHome, env);
|
|
244
|
+
const [roots, claudeItems, codexItems, base] = await Promise.all([
|
|
245
|
+
_rootsFor(resolvedHome, env),
|
|
246
|
+
listClaudeSkillItems(configDir),
|
|
247
|
+
listCodexSkillItems(resolvedHome, env),
|
|
248
|
+
_baseFor(dataDir, String(peerInstanceId == null ? '' : peerInstanceId).trim()),
|
|
249
|
+
]);
|
|
250
|
+
|
|
251
|
+
const skills = [];
|
|
252
|
+
for (const item of [...claudeItems, ...codexItems]) {
|
|
253
|
+
const stat = await _statOrNull(item.rootDir);
|
|
254
|
+
if (!stat || !stat.isDirectory()) continue; // vanished between enumeration and hashing
|
|
255
|
+
const itemHash = await itemHashOfDir(item.rootDir);
|
|
256
|
+
if (itemHash === null) continue; // vanished mid-walk: not an item this time
|
|
257
|
+
skills.push({
|
|
258
|
+
agent: item.agent,
|
|
259
|
+
name: item.name,
|
|
260
|
+
itemHash,
|
|
261
|
+
managed: await _managedFor(item),
|
|
262
|
+
mtimeMs: stat.mtimeMs,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
skills.sort((a, b) => _compareStrings(a.agent, b.agent) || _compareStrings(a.name, b.name));
|
|
266
|
+
|
|
267
|
+
return {
|
|
268
|
+
platform: process.platform,
|
|
269
|
+
checkedAt: Number(typeof now === 'function' ? now() : Date.now()) || 0,
|
|
270
|
+
roots,
|
|
271
|
+
skills,
|
|
272
|
+
base,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function _skillKey(agent, name) {
|
|
277
|
+
return `${agent}\0${name}`;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function _skillItems(items) {
|
|
281
|
+
const map = new Map();
|
|
282
|
+
for (const item of Array.isArray(items) ? items : []) {
|
|
283
|
+
// §6.5: Claude PLUGINS are never box inventory — the box reports skills only, so a plugin item
|
|
284
|
+
// can never be the hub-side counterpart of a box row. Filtered here rather than at each call.
|
|
285
|
+
if (!item || item.kind !== 'skill' || typeof item.name !== 'string') continue;
|
|
286
|
+
map.set(_skillKey(item.agent, item.name), item.itemHash);
|
|
287
|
+
}
|
|
288
|
+
return map;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* §6.5/AC-7a: classify every UNMANAGED box skill against the hub's copy and the base. Pure — no I/O,
|
|
293
|
+
* no clock, no state — so the five rules are provable from a fixture matrix alone.
|
|
294
|
+
*
|
|
295
|
+
* Rules, IN ORDER (first match wins; `(agent, name)` is the matching key):
|
|
296
|
+
* 1. no hub item -> `new_on_box` the hub has nothing here; Import would add it
|
|
297
|
+
* 2. box == hub -> `same` the box copy is redundant; Retire is offered
|
|
298
|
+
* 3. box == base && hub != base -> `shadows_hub` the box copy HIDES the hub's newer one
|
|
299
|
+
* 4. hub == base && box != base -> `changed_on_box` the box edited its copy; Import fast-forwards
|
|
300
|
+
* 5. otherwise -> `conflict` both moved: the user picks
|
|
301
|
+
*
|
|
302
|
+
* AC-7d: a managed copy (`managed: 'ctm-managed' | 'agent-bundle'`) is never classified — CTM put it
|
|
303
|
+
* there, so it is not a proposal the user is being asked to review.
|
|
304
|
+
*
|
|
305
|
+
* @returns {Array<{agent: string, name: string, state: string, boxHash: string, hubHash: string|null,
|
|
306
|
+
* baseHash: string|null}>} sorted by (agent, name)
|
|
307
|
+
*/
|
|
308
|
+
function classifyBoxSkills({ hubItems = [], baseItems = [], boxSkills = [] } = {}) {
|
|
309
|
+
const hub = _skillItems(hubItems);
|
|
310
|
+
const base = _skillItems(baseItems);
|
|
311
|
+
const rows = [];
|
|
312
|
+
for (const box of Array.isArray(boxSkills) ? boxSkills : []) {
|
|
313
|
+
if (!box || typeof box.name !== 'string') continue;
|
|
314
|
+
if (box.managed !== null && box.managed !== undefined) continue; // AC-7d
|
|
315
|
+
const key = _skillKey(box.agent, box.name);
|
|
316
|
+
const boxHash = box.itemHash;
|
|
317
|
+
const hubHash = hub.has(key) ? hub.get(key) : null;
|
|
318
|
+
const baseHash = base.has(key) ? base.get(key) : null;
|
|
319
|
+
let state;
|
|
320
|
+
if (hubHash === null) state = 'new_on_box';
|
|
321
|
+
else if (boxHash === hubHash) state = 'same';
|
|
322
|
+
else if (boxHash === baseHash && hubHash !== baseHash) state = 'shadows_hub';
|
|
323
|
+
else if (hubHash === baseHash && boxHash !== baseHash) state = 'changed_on_box';
|
|
324
|
+
else state = 'conflict';
|
|
325
|
+
rows.push({ agent: box.agent, name: box.name, state, boxHash, hubHash, baseHash });
|
|
326
|
+
}
|
|
327
|
+
rows.sort((a, b) => _compareStrings(a.agent, b.agent) || _compareStrings(a.name, b.name));
|
|
328
|
+
return rows;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
module.exports = {
|
|
332
|
+
BOX_SKILL_STATES,
|
|
333
|
+
ITEM_PREFIXES,
|
|
334
|
+
// The box half. `itemHashOfDir` is build.js's own (re-exported, never re-implemented) so a box
|
|
335
|
+
// item hash and a hub item hash of identical bytes are the same number by construction.
|
|
336
|
+
itemHashOfDir,
|
|
337
|
+
// WP-8: the export/retire legs resolve the SAME roots and apply the SAME ownership rules as this
|
|
338
|
+
// inventory, so "the same skill" and "is it exportable" cannot drift between the rows the hub
|
|
339
|
+
// renders and the folder the box moves aside.
|
|
340
|
+
claudeConfigDir,
|
|
341
|
+
managedStateOf: _managedFor,
|
|
342
|
+
baseItemsFromManifest,
|
|
343
|
+
readBoxInventory,
|
|
344
|
+
// The hub half.
|
|
345
|
+
classifyBoxSkills,
|
|
346
|
+
};
|