@north-light/crouter 0.3.312 → 0.3.313
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/api/client.d.ts +27 -30
- package/dist/api/client.js +80 -67
- package/dist/api/dto/broker-ops.d.ts +10 -20
- package/dist/api/dto/canvas.d.ts +1 -10
- package/dist/api/dto/health.d.ts +113 -0
- package/dist/api/dto/human-requests.d.ts +14 -3
- package/dist/api/dto/human.d.ts +2 -48
- package/dist/api/dto/human.js +3 -2
- package/dist/api/dto/inbox.d.ts +14 -0
- package/dist/api/dto/mail.d.ts +43 -0
- package/dist/api/dto/nodes.d.ts +11 -8
- package/dist/api/dto/recovery.d.ts +96 -0
- package/dist/api/dto/reviews.d.ts +2 -2
- package/dist/api/routes.d.ts +9 -6
- package/dist/api/routes.js +11 -11
- package/dist/build-root.d.ts +4 -0
- package/dist/build-root.js +11 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/integration/provider-rotation.test.ts +35 -47
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +1 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +12 -5
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +12 -5
- package/dist/cli.js +10 -1
- package/dist/clients/__tests__/helpers/human-daemon.d.ts +11 -0
- package/dist/clients/__tests__/helpers/human-daemon.js +60 -0
- package/dist/clients/attach/chrome/canvas-panels.js +1 -1
- package/dist/clients/attach/chrome/inbox-strip.d.ts +3 -3
- package/dist/clients/attach/chrome/inbox-strip.js +17 -9
- package/dist/clients/attach/chrome/ticket-panel.d.ts +2 -2
- package/dist/clients/attach/chrome/ticket-panel.js +77 -46
- package/dist/clients/attach/overlays/graph.js +6 -9
- package/dist/clients/attach/render/chat-view.d.ts +5 -4
- package/dist/clients/attach/render/chat-view.js +22 -13
- package/dist/clients/attach/render/page-block.d.ts +11 -7
- package/dist/clients/attach/render/page-block.js +64 -55
- package/dist/clients/attach/viewer.js +746 -735
- package/dist/clients/inbox/__tests__/integration/inbox-controller.test.js +56 -56
- package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.js +45 -32
- package/dist/clients/inbox/controller.d.ts +42 -14
- package/dist/clients/inbox/controller.js +240 -124
- package/dist/clients/inbox/dto-adapt.d.ts +28 -0
- package/dist/clients/inbox/dto-adapt.js +93 -0
- package/dist/clients/inbox/page-adapter.d.ts +5 -4
- package/dist/clients/inbox/page-adapter.js +12 -12
- package/dist/clients/inbox/resolve.d.ts +10 -5
- package/dist/clients/inbox/resolve.js +13 -12
- package/dist/clients/inbox/review/review-client.d.ts +0 -1
- package/dist/clients/inbox/review/review-client.js +0 -4
- package/dist/clients/inbox/review-adapter.d.ts +2 -1
- package/dist/clients/inbox/review-adapter.js +3 -5
- package/dist/clients/inbox/surface.d.ts +2 -2
- package/dist/clients/inbox/surface.js +19 -8
- package/dist/clients/inbox/tui.d.ts +3 -3
- package/dist/commands/__tests__/human.test.js +31 -15
- package/dist/commands/__tests__/integration/dashboard-snapshot.test.js +36 -11
- package/dist/commands/{sys/__tests__ → __tests__/integration}/migrate.test.js +142 -36
- package/dist/commands/__tests__/revive-now-gate.test.js +2 -0
- package/dist/commands/api-client.d.ts +5 -4
- package/dist/commands/api-client.js +13 -7
- package/dist/commands/canvas-history/shared.js +1 -1
- package/dist/commands/canvas-history.js +1 -1
- package/dist/commands/canvas-roster.js +1 -1
- package/dist/commands/canvas.js +1 -2
- package/dist/commands/human/feedback.js +20 -17
- package/dist/commands/human/prompts.js +45 -36
- package/dist/commands/human/queue.js +73 -123
- package/dist/commands/human/review.js +6 -16
- package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.js +2 -0
- package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.js +2 -0
- package/dist/commands/memory/__tests__/repository-root-lint.test.js +2 -0
- package/dist/commands/node-inspect-artifacts.js +1 -1
- package/dist/commands/node-lifecycle-revive.d.ts +2 -2
- package/dist/commands/node-lifecycle-revive.js +9 -19
- package/dist/commands/pkg/plugin-manage.js +0 -1
- package/dist/commands/profile/show.js +4 -12
- package/dist/commands/surface-tmux-spread.js +1 -5
- package/dist/commands/sys/__tests__/config-model-ladders.test.js +23 -30
- package/dist/commands/sys/__tests__/sync-project-guidance.test.js +37 -11
- package/dist/commands/sys/branch.d.ts +2 -0
- package/dist/commands/sys/branch.js +19 -0
- package/dist/commands/sys/config.js +106 -33
- package/dist/commands/sys/daemon.d.ts +2 -0
- package/dist/commands/sys/daemon.js +130 -7
- package/dist/commands/sys/doctor.js +5 -15
- package/dist/commands/sys/migrate.js +21 -92
- package/dist/commands/sys/setup-settings-runner.js +4 -2
- package/dist/commands/sys.js +2 -15
- package/dist/core/__tests__/boot-fault-attempt.test.js +23 -1
- package/dist/core/__tests__/boot.test.js +32 -25
- package/dist/core/__tests__/broker-launch-candidates.test.js +49 -0
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +149 -176
- package/dist/core/__tests__/canvas-inbox-watcher-naming.test.js +59 -10
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +76 -20
- package/dist/core/__tests__/canvas.test.js +18 -47
- package/dist/core/__tests__/child-death-wake.test.js +29 -7
- package/dist/core/__tests__/cli-help-contract.test.js +2 -0
- package/dist/core/__tests__/close.test.js +29 -10
- package/dist/core/__tests__/collectible.test.js +2 -1
- package/dist/core/__tests__/config-change-delta.test.js +2 -0
- package/dist/core/__tests__/context-intro.test.js +13 -1
- package/dist/core/__tests__/cron-armed-context-failure.test.js +17 -12
- package/dist/core/__tests__/cron-held-settlement.test.js +21 -3
- package/dist/core/__tests__/cron-node-sink-parked-root.test.js +29 -10
- package/dist/core/__tests__/cron-self-cancel-delivery.test.js +14 -2
- package/dist/core/__tests__/cron-timeout-descendants.test.js +13 -1
- package/dist/core/__tests__/daemon-boot.test.js +51 -14
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
- package/dist/core/__tests__/fixtures/fake-engine.js +8 -3
- package/dist/core/__tests__/focuses.test.js +10 -5
- package/dist/core/__tests__/helpers/harness.js +50 -18
- package/dist/core/__tests__/history-inbox.test.js +12 -16
- package/dist/core/__tests__/human-action-delivery.test.js +48 -28
- package/dist/core/__tests__/human-actions.test.js +7 -3
- package/dist/core/__tests__/inline-memory-refs.test.js +7 -2
- package/dist/core/__tests__/integration/broker-fork-seam.test.js +37 -10
- package/dist/core/__tests__/integration/broker-sdk-wiring.test.js +42 -0
- package/dist/core/__tests__/integration/broker-snapshot-history.test.js +42 -29
- package/dist/core/__tests__/integration/broker-wedge-supervision.test.js +36 -35
- package/dist/core/__tests__/integration/command-plugins.test.js +15 -6
- package/dist/core/__tests__/integration/deferred-no-wake.test.js +113 -92
- package/dist/core/__tests__/integration/host-teardown-process-group.test.js +9 -5
- package/dist/core/__tests__/integration/lifecycle-hooks.test.js +16 -3
- package/dist/core/__tests__/integration/plugin-revalidate.test.js +4 -0
- package/dist/core/__tests__/integration/profile-pause.test.js +4 -4
- package/dist/core/__tests__/integration/refresh-stall-recycle.test.js +9 -12
- package/dist/core/__tests__/integration/revive.test.js +67 -21
- package/dist/core/__tests__/integration/spawn-root.test.js +51 -8
- package/dist/core/__tests__/integration/subscription-delivery.test.js +33 -21
- package/dist/core/__tests__/integration/worktree-land.test.js +5 -2
- package/dist/core/__tests__/integration/worktree-reap.test.js +15 -1
- package/dist/core/__tests__/kickoff.test.js +36 -39
- package/dist/core/__tests__/lifecycle-terminal-reasons.test.js +2 -1
- package/dist/core/__tests__/lifecycle.test.js +2 -1
- package/dist/core/__tests__/live-lifecycle-prompt.test.js +13 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +2 -0
- package/dist/core/__tests__/migration.test.js +145 -31
- package/dist/core/__tests__/model-pin-durability.test.js +4 -1
- package/dist/core/__tests__/model-routes-config.test.js +13 -5
- package/dist/core/__tests__/node-outcome.test.js +93 -26
- package/dist/core/__tests__/on-read-crouter-home-fence.test.js +2 -1
- package/dist/core/__tests__/on-read-dedup-resume.test.js +2 -1
- package/dist/core/__tests__/on-read-nested-store.test.js +2 -1
- package/dist/core/__tests__/passive-subscription.test.js +50 -157
- package/dist/core/__tests__/plugin-kinds.test.js +6 -4
- package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.js +6 -1
- package/dist/core/__tests__/plugin-page-components.test.js +6 -4
- package/dist/core/__tests__/preview-registry-sync.test.js +2 -0
- package/dist/core/__tests__/profile-project-memory-delivery.test.js +4 -1
- package/dist/core/__tests__/prune.test.js +11 -5
- package/dist/core/__tests__/push-final-guard.test.js +14 -7
- package/dist/core/__tests__/relaunch-root.test.js +30 -2
- package/dist/core/__tests__/remote-canvas-target.test.js +7 -1
- package/dist/core/__tests__/repository-root-identity.test.js +4 -0
- package/dist/core/__tests__/review-model-floor.test.js +6 -3
- package/dist/core/__tests__/revive-all.test.js +13 -3
- package/dist/core/__tests__/revive-capacity.test.js +26 -4
- package/dist/core/__tests__/revive-parked-fresh.test.js +31 -8
- package/dist/core/__tests__/seam/broker-attach-stream.test.js +1 -1
- package/dist/core/__tests__/seam/broker-cap-freeze.test.js +4 -3
- package/dist/core/__tests__/seam/broker-crash-teardown.test.js +11 -14
- package/dist/core/__tests__/seam/broker-provider-retry.test.js +85 -71
- package/dist/core/__tests__/seam/dormancy-release.test.js +33 -19
- package/dist/core/__tests__/seam/held-deferred-human-prompt.test.js +7 -5
- package/dist/core/__tests__/seam/inbox-reference-guidance.test.js +20 -6
- package/dist/core/__tests__/seam/node-outcome-delivery.test.js +27 -3
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +2 -1
- package/dist/core/__tests__/stop-guard.test.js +2 -1
- package/dist/core/__tests__/subscription-pool-credential-guard.test.js +4 -3
- package/dist/core/__tests__/warm-claim-preference-snapshot.test.js +18 -4
- package/dist/core/__tests__/yield-ensures-daemon.test.js +2 -1
- package/dist/core/bootstrap.js +2 -0
- package/dist/core/broker-client/__tests__/transport-socket.test.js +51 -6
- package/dist/core/broker-client/transport-socket.d.ts +1 -0
- package/dist/core/broker-client/transport-socket.js +13 -5
- package/dist/core/canvas/__tests__/attention.test.js +29 -35
- package/dist/core/canvas/__tests__/history-transcript.test.js +6 -6
- package/dist/core/canvas/__tests__/render-remote.test.js +25 -9
- package/dist/core/canvas/attention.d.ts +2 -5
- package/dist/core/canvas/attention.js +15 -64
- package/dist/core/canvas/boot.d.ts +6 -7
- package/dist/core/canvas/boot.js +5 -9
- package/dist/core/canvas/canvas.d.ts +13 -109
- package/dist/core/canvas/canvas.js +140 -401
- package/dist/core/canvas/crons.d.ts +2 -0
- package/dist/core/canvas/crons.js +16 -15
- package/dist/core/canvas/daemon-owner.js +10 -0
- package/dist/core/canvas/db.d.ts +2 -2
- package/dist/core/canvas/db.js +2 -18
- package/dist/core/canvas/deliveries.d.ts +104 -0
- package/dist/core/canvas/deliveries.js +354 -0
- package/dist/core/canvas/executions.d.ts +29 -0
- package/dist/core/canvas/executions.js +68 -0
- package/dist/core/canvas/history.js +35 -35
- package/dist/core/canvas/index.d.ts +3 -1
- package/dist/core/canvas/index.js +3 -1
- package/dist/core/canvas/migrations.js +20 -12
- package/dist/core/canvas/nav-model.js +1 -3
- package/dist/core/canvas/nav-render.d.ts +4 -4
- package/dist/core/canvas/nav-render.js +11 -21
- package/dist/core/canvas/node-sql-migration.d.ts +3 -0
- package/dist/core/canvas/node-sql-migration.js +261 -0
- package/dist/core/canvas/paths.d.ts +2 -16
- package/dist/core/canvas/paths.js +2 -31
- package/dist/core/canvas/recovery.d.ts +76 -0
- package/dist/core/canvas/recovery.js +588 -0
- package/dist/core/canvas/remote-canvas-source.js +4 -0
- package/dist/core/canvas/render-source.d.ts +16 -27
- package/dist/core/canvas/render-source.js +16 -45
- package/dist/core/canvas/sessions.d.ts +33 -0
- package/dist/core/canvas/sessions.js +78 -0
- package/dist/core/canvas/types.d.ts +33 -33
- package/dist/core/canvas/types.js +2 -5
- package/dist/core/canvas/waits.d.ts +18 -0
- package/dist/core/canvas/waits.js +70 -0
- package/dist/core/canvas/worktrees.d.ts +40 -0
- package/dist/core/canvas/worktrees.js +93 -0
- package/dist/core/config.d.ts +17 -12
- package/dist/core/config.js +106 -155
- package/dist/core/feed/__tests__/inbox-migrate.test.js +27 -31
- package/dist/core/feed/feed.d.ts +0 -6
- package/dist/core/feed/feed.js +68 -56
- package/dist/core/feed/inbox.d.ts +7 -81
- package/dist/core/feed/inbox.js +46 -378
- package/dist/core/feed/messages.d.ts +58 -0
- package/dist/core/feed/messages.js +217 -0
- package/dist/core/fs-utils.d.ts +4 -0
- package/dist/core/fs-utils.js +21 -1
- package/dist/core/human/answer.d.ts +1 -1
- package/dist/core/human/answer.js +1 -1
- package/dist/core/human/claim.d.ts +1 -1
- package/dist/core/human/claim.js +2 -4
- package/dist/core/human/component-docs.js +1 -1
- package/dist/core/human/feedback-companion.js +3 -2
- package/dist/core/human/feedback.d.ts +5 -8
- package/dist/core/human/feedback.js +57 -85
- package/dist/core/human/page-authoring.d.ts +30 -0
- package/dist/core/human/page-authoring.js +19 -0
- package/dist/core/human/requests.d.ts +136 -0
- package/dist/core/human/requests.js +515 -0
- package/dist/core/human/root.d.ts +0 -7
- package/dist/core/human/root.js +0 -17
- package/dist/core/human/scan.d.ts +2 -7
- package/dist/core/human/scan.js +48 -132
- package/dist/core/human/summary.d.ts +1 -1
- package/dist/core/human/summary.js +1 -1
- package/dist/core/human/tickets.d.ts +23 -83
- package/dist/core/human/tickets.js +92 -243
- package/dist/core/human/types.d.ts +5 -1
- package/dist/core/installed-plugins.js +8 -3
- package/dist/core/keybindings/__tests__/resolve.test.js +19 -17
- package/dist/core/locked-file.d.ts +6 -3
- package/dist/core/locked-file.js +36 -9
- package/dist/core/memory/extensions.js +2 -0
- package/dist/core/preview-registry.js +0 -1
- package/dist/core/profiles/__tests__/env-store.test.js +2 -0
- package/dist/core/profiles/default-binding.d.ts +0 -4
- package/dist/core/profiles/default-binding.js +12 -58
- package/dist/core/profiles/env-store.js +8 -3
- package/dist/core/profiles/manifest.d.ts +2 -37
- package/dist/core/profiles/manifest.js +35 -161
- package/dist/core/profiles/select.js +3 -0
- package/dist/core/review/__tests__/capture-origin.test.js +13 -2
- package/dist/core/review/__tests__/comments.test.js +28 -10
- package/dist/core/review/__tests__/remap.test.js +28 -10
- package/dist/core/review/__tests__/stage-identity.test.js +17 -7
- package/dist/core/review/birth.d.ts +1 -1
- package/dist/core/review/birth.js +34 -5
- package/dist/core/review/comments.js +1 -1
- package/dist/core/review/document.js +1 -1
- package/dist/core/review/project.d.ts +5 -1
- package/dist/core/review/project.js +14 -36
- package/dist/core/review/realize.d.ts +3 -6
- package/dist/core/review/realize.js +51 -168
- package/dist/core/review/remap.js +1 -1
- package/dist/core/review/stage.d.ts +3 -2
- package/dist/core/review/stage.js +2 -3
- package/dist/core/review/store.d.ts +3 -21
- package/dist/core/review/store.js +140 -186
- package/dist/core/review/types.d.ts +0 -1
- package/dist/core/runtime/__tests__/install-id-cache-scoping.test.js +9 -5
- package/dist/core/runtime/__tests__/spawn-env.test.js +8 -9
- package/dist/core/runtime/broker/auth-reload.js +9 -10
- package/dist/core/runtime/broker/daemon-ops.d.ts +25 -8
- package/dist/core/runtime/broker/daemon-ops.js +42 -9
- package/dist/core/runtime/broker/extension-abort.d.ts +3 -0
- package/dist/core/runtime/broker/extension-abort.js +11 -0
- package/dist/core/runtime/broker/fault-retry.d.ts +15 -6
- package/dist/core/runtime/broker/fault-retry.js +142 -95
- package/dist/core/runtime/broker/inbox.d.ts +4 -32
- package/dist/core/runtime/broker/inbox.js +4 -92
- package/dist/core/runtime/broker/rebind.d.ts +1 -0
- package/dist/core/runtime/broker/rebind.js +21 -12
- package/dist/core/runtime/broker-persona-guidance.d.ts +1 -1
- package/dist/core/runtime/broker-persona-guidance.js +2 -13
- package/dist/core/runtime/broker.js +28 -22
- package/dist/core/runtime/close.d.ts +3 -9
- package/dist/core/runtime/close.js +16 -27
- package/dist/core/runtime/fault.d.ts +3 -93
- package/dist/core/runtime/fault.js +9 -419
- package/dist/core/runtime/kickoff.d.ts +3 -6
- package/dist/core/runtime/kickoff.js +12 -18
- package/dist/core/runtime/launch.js +1 -1
- package/dist/core/runtime/lifecycle.js +40 -7
- package/dist/core/runtime/placement.js +2 -2
- package/dist/core/runtime/recycle.js +8 -2
- package/dist/core/runtime/reset.js +22 -6
- package/dist/core/runtime/revive.js +226 -218
- package/dist/core/runtime/spawn.js +14 -3
- package/dist/core/scoped-state/db.d.ts +7 -0
- package/dist/core/scoped-state/db.js +92 -0
- package/dist/core/scoped-state/migrate.d.ts +11 -0
- package/dist/core/scoped-state/migrate.js +198 -0
- package/dist/core/scoped-state/paths.d.ts +9 -0
- package/dist/core/scoped-state/paths.js +27 -0
- package/dist/core/scoped-state/profiles.d.ts +12 -0
- package/dist/core/scoped-state/profiles.js +62 -0
- package/dist/core/scoped-state/providers.d.ts +16 -0
- package/dist/core/scoped-state/providers.js +8 -0
- package/dist/core/scoped-state/schema.d.ts +3 -0
- package/dist/core/scoped-state/schema.js +26 -0
- package/dist/core/scoped-state/settings.d.ts +28 -0
- package/dist/core/scoped-state/settings.js +82 -0
- package/dist/core/subscription-state.d.ts +29 -48
- package/dist/core/subscription-state.js +176 -712
- package/dist/core/worktree-close.js +4 -4
- package/dist/core/worktree-mutation-async.js +2 -2
- package/dist/core/worktree-sweep.js +11 -16
- package/dist/core/worktree.js +6 -12
- package/dist/daemon/__tests__/autostart-storm.test.js +1 -39
- package/dist/daemon/__tests__/helpers/source-daemon.d.ts +2 -2
- package/dist/daemon/__tests__/helpers/source-daemon.js +7 -6
- package/dist/daemon/__tests__/integration/migration-startup.test.js +59 -26
- package/dist/daemon/__tests__/node-deadline-lane.test.js +2 -1
- package/dist/daemon/__tests__/node-outcome-birth-invariants.test.js +39 -15
- package/dist/daemon/__tests__/node-outcome-delivery.test.js +39 -10
- package/dist/daemon/__tests__/reconciler-signature.test.js +2 -2
- package/dist/daemon/__tests__/subtree-filter-freshness.test.js +2 -2
- package/dist/daemon/api/__tests__/broker-settle-park.test.js +17 -12
- package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.js +27 -5
- package/dist/daemon/api/__tests__/model-config.test.js +8 -8
- package/dist/daemon/api/__tests__/node-create-description.test.js +22 -5
- package/dist/daemon/api/__tests__/node-model-validation.test.js +21 -1
- package/dist/daemon/api/__tests__/nodes-activity-query.test.js +10 -12
- package/dist/daemon/api/__tests__/profile-launch-gates.test.js +4 -1
- package/dist/daemon/api/__tests__/profile-metadata-route.test.js +4 -1
- package/dist/daemon/api/__tests__/reopen-delivery.test.js +26 -8
- package/dist/daemon/api/__tests__/seam/api-server.test.js +24 -32
- package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.js +4 -1
- package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.js +5 -4
- package/dist/daemon/api/__tests__/seam/profile-delete.test.js +27 -41
- package/dist/daemon/api/__tests__/submit-result.test.js +3 -2
- package/dist/daemon/api/bridge.js +1 -1
- package/dist/daemon/api/handlers/bash-jobs.js +6 -7
- package/dist/daemon/api/handlers/broker-ops.js +47 -84
- package/dist/daemon/api/handlers/broker-recovery.d.ts +4 -0
- package/dist/daemon/api/handlers/broker-recovery.js +251 -0
- package/dist/daemon/api/handlers/canvas.js +2 -44
- package/dist/daemon/api/handlers/daemon.js +41 -0
- package/dist/daemon/api/handlers/feedback-comments.js +2 -2
- package/dist/daemon/api/handlers/health.js +10 -5
- package/dist/daemon/api/handlers/human-requests.js +168 -188
- package/dist/daemon/api/handlers/human.js +3 -151
- package/dist/daemon/api/handlers/inbox-page.d.ts +4 -0
- package/dist/daemon/api/handlers/inbox-page.js +89 -0
- package/dist/daemon/api/handlers/inbox.js +21 -120
- package/dist/daemon/api/handlers/messages.d.ts +1 -0
- package/dist/daemon/api/handlers/messages.js +73 -15
- package/dist/daemon/api/handlers/node-outcomes.js +58 -13
- package/dist/daemon/api/handlers/nodes.js +7 -13
- package/dist/daemon/api/handlers/reviews.js +4 -29
- package/dist/daemon/api/map.d.ts +25 -3
- package/dist/daemon/api/map.js +84 -14
- package/dist/daemon/api/server.js +68 -9
- package/dist/daemon/control.d.ts +18 -0
- package/dist/daemon/cron/disposition.d.ts +2 -0
- package/dist/daemon/cron/disposition.js +8 -5
- package/dist/daemon/cron/settle.js +37 -13
- package/dist/daemon/cron/sinks.d.ts +18 -1
- package/dist/daemon/cron/sinks.js +47 -93
- package/dist/daemon/crtrd-cli.js +4 -19
- package/dist/daemon/crtrd.d.ts +2 -0
- package/dist/daemon/crtrd.js +206 -81
- package/dist/daemon/fleet.js +5 -6
- package/dist/daemon/human/finish.d.ts +12 -24
- package/dist/daemon/human/finish.js +88 -285
- package/dist/daemon/human/settle.d.ts +40 -0
- package/dist/daemon/human/settle.js +89 -0
- package/dist/daemon/human/sweep.d.ts +20 -5
- package/dist/daemon/human/sweep.js +56 -60
- package/dist/daemon/manage.d.ts +21 -16
- package/dist/daemon/manage.js +85 -51
- package/dist/daemon/messaging/node-message.d.ts +1 -1
- package/dist/daemon/messaging/node-message.js +9 -12
- package/dist/daemon/park-activity.js +3 -3
- package/dist/daemon/reconcilers/bash-deadline.js +6 -7
- package/dist/daemon/reconcilers/broker-supervision.d.ts +1 -1
- package/dist/daemon/reconcilers/broker-supervision.js +41 -19
- package/dist/daemon/reconcilers/controller-death.js +6 -18
- package/dist/daemon/reconcilers/delivery-lane.d.ts +9 -0
- package/dist/daemon/reconcilers/delivery-lane.js +130 -0
- package/dist/daemon/reconcilers/live-obligation.js +3 -3
- package/dist/daemon/reconcilers/node-deadline.js +1 -1
- package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.d.ts +1 -1
- package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +10 -12
- package/dist/daemon/reconcilers/node-lifecycle/tick.js +5 -5
- package/dist/daemon/reconcilers/node-lifecycle/wants-execution.js +1 -1
- package/dist/daemon/reconcilers/pending-review-submit.js +3 -3
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +2 -8
- package/dist/daemon/reconcilers/storage-maintenance.js +13 -43
- package/dist/daemon/review/companion.js +5 -11
- package/dist/daemon/review/deliver.d.ts +1 -5
- package/dist/daemon/review/deliver.js +3 -52
- package/dist/daemon/review/finish.d.ts +2 -27
- package/dist/daemon/review/finish.js +79 -263
- package/dist/daemon/review/sweep.d.ts +3 -10
- package/dist/daemon/review/sweep.js +13 -131
- package/dist/daemon/startup-policy.d.ts +0 -5
- package/dist/daemon/startup-policy.js +0 -5
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -1
- package/dist/migrations/__tests__/activation-concurrency.test.js +3 -2
- package/dist/migrations/__tests__/activation.test.js +9 -6
- package/dist/migrations/activation.d.ts +3 -2
- package/dist/migrations/activation.js +2 -4
- package/dist/migrations/corpus.d.ts +2 -5
- package/dist/migrations/corpus.js +9 -20
- package/dist/migrations/runner.d.ts +3 -1
- package/dist/migrations/runner.js +6 -2
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +21 -89
- package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.js +4 -2
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +51 -33
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +16 -2
- package/dist/pi-extensions/__tests__/pre-command-gate.test.js +13 -1
- package/dist/pi-extensions/canvas-inbox-watcher.js +98 -244
- package/dist/pi-extensions/canvas-passive-context.d.ts +4 -8
- package/dist/pi-extensions/canvas-passive-context.js +85 -37
- package/dist/pi-extensions/canvas-stophook.js +47 -31
- package/dist/shared/env.d.ts +1 -0
- package/dist/shared/env.js +3 -0
- package/package.json +1 -1
- package/runtime.lock.json +5 -5
- package/dist/clients/attach/__tests__/page-block.test.js +0 -54
- package/dist/clients/inbox/review-visibility.d.ts +0 -5
- package/dist/clients/inbox/review-visibility.js +0 -19
- package/dist/commands/canvas-rebuild-index.d.ts +0 -2
- package/dist/commands/canvas-rebuild-index.js +0 -46
- package/dist/core/__tests__/human-cancel-guard.test.js +0 -110
- package/dist/core/__tests__/human-deliver.test.d.ts +0 -1
- package/dist/core/__tests__/human-deliver.test.js +0 -256
- package/dist/core/__tests__/human-node-not-supervised.test.d.ts +0 -1
- package/dist/core/__tests__/human-node-not-supervised.test.js +0 -89
- package/dist/core/__tests__/integration/human-deliver-e2e.test.d.ts +0 -1
- package/dist/core/__tests__/integration/human-deliver-e2e.test.js +0 -131
- package/dist/core/__tests__/phase4-review-store.test.d.ts +0 -1
- package/dist/core/__tests__/phase4-review-store.test.js +0 -144
- package/dist/core/__tests__/watchdog-abort-arms-retry.test.d.ts +0 -1
- package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +0 -110
- package/dist/core/canvas/human-deliveries.d.ts +0 -39
- package/dist/core/canvas/human-deliveries.js +0 -75
- package/dist/core/canvas/node-outcome-deliveries.d.ts +0 -64
- package/dist/core/canvas/node-outcome-deliveries.js +0 -159
- package/dist/core/feed/passive.d.ts +0 -3
- package/dist/core/feed/passive.js +0 -53
- package/dist/core/human/__tests__/inbox-cancel-worker.d.ts +0 -1
- package/dist/core/human/__tests__/inbox-cancel-worker.js +0 -7
- package/dist/core/human/__tests__/inbox-claim-worker.d.ts +0 -1
- package/dist/core/human/__tests__/inbox-claim-worker.js +0 -17
- package/dist/core/human/__tests__/inbox-stale-claim-worker.d.ts +0 -1
- package/dist/core/human/__tests__/inbox-stale-claim-worker.js +0 -8
- package/dist/core/human/__tests__/integration/inbox-core.test.d.ts +0 -1
- package/dist/core/human/__tests__/integration/inbox-core.test.js +0 -145
- package/dist/core/human/__tests__/page-tickets.test.d.ts +0 -1
- package/dist/core/human/__tests__/page-tickets.test.js +0 -161
- package/dist/core/review/ticket-filter.d.ts +0 -17
- package/dist/core/review/ticket-filter.js +0 -21
- package/dist/core/runtime/broker/passive.d.ts +0 -17
- package/dist/core/runtime/broker/passive.js +0 -44
- package/dist/core/runtime/busy.d.ts +0 -46
- package/dist/core/runtime/busy.js +0 -150
- package/dist/daemon/__tests__/startup-block-marker.test.d.ts +0 -1
- package/dist/daemon/__tests__/startup-block-marker.test.js +0 -86
- package/dist/daemon/api/__tests__/review-terminal-conflict.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +0 -98
- package/dist/daemon/human/deliver-action.d.ts +0 -3
- package/dist/daemon/human/deliver-action.js +0 -9
- package/dist/daemon/node-outcome/deliver-outcome.d.ts +0 -3
- package/dist/daemon/node-outcome/deliver-outcome.js +0 -9
- package/dist/daemon/reconcilers/human-delivery-lane.d.ts +0 -10
- package/dist/daemon/reconcilers/human-delivery-lane.js +0 -41
- package/dist/daemon/reconcilers/node-outcome-delivery-lane.d.ts +0 -10
- package/dist/daemon/reconcilers/node-outcome-delivery-lane.js +0 -41
- package/dist/daemon/startup-block-marker.d.ts +0 -25
- package/dist/daemon/startup-block-marker.js +0 -99
- /package/dist/{clients/attach/__tests__/page-block.test.d.ts → api/dto/mail.js} +0 -0
- /package/dist/{commands/sys/__tests__/migrate.test.d.ts → api/dto/recovery.js} +0 -0
- /package/dist/{core/__tests__/human-cancel-guard.test.d.ts → commands/__tests__/integration/migrate.test.d.ts} +0 -0
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { envNodeId } from '../../shared/env.js';
|
|
2
2
|
import { randomUUID } from 'node:crypto';
|
|
3
|
-
import {
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
4
|
import { defineBranch, defineLeaf } from '../../core/command.js';
|
|
5
5
|
import { InputError } from '../../core/io.js';
|
|
6
|
-
import { ticketDir } from '../../core/human/root.js';
|
|
7
6
|
import { cliClient } from '../api-client.js';
|
|
8
7
|
function nodeActor() {
|
|
9
8
|
const nodeId = envNodeId();
|
|
@@ -85,42 +84,33 @@ const humanReviewNew = defineLeaf({
|
|
|
85
84
|
params: [
|
|
86
85
|
{ kind: 'positional', name: 'file', type: 'path', required: true, constraint: 'Document or source file to review. Resolved to an absolute path; the daemon validates that it is readable reviewable text.' },
|
|
87
86
|
{ kind: 'flag', name: 'subtitle', type: 'string', required: true, constraint: 'One plain-English sentence stating the review needed and why it matters.' },
|
|
88
|
-
{ kind: 'flag', name: 'output', type: 'path', required: false, constraint: 'Where the immutable approval result JSON is projected. Default: <dir>/feedback.json.' },
|
|
89
87
|
],
|
|
90
88
|
output: [
|
|
91
|
-
{ name: 'job_id', type: 'string', required: true, constraint: 'Ticket bridge node id. The approval is pushed to its origin when the person submits.' },
|
|
92
|
-
{ name: 'dir', type: 'string', required: true, constraint: 'Interaction directory holding the ticket projection and default approval result.' },
|
|
93
|
-
{ name: 'output', type: 'string', required: true, constraint: 'Path where the immutable approval result JSON is projected.' },
|
|
94
89
|
{ name: 'review_id', type: 'string', required: true, constraint: 'Daemon-owned review id for the document, comments, and companion.' },
|
|
90
|
+
{ name: 'review_dir', type: 'string', required: true, constraint: 'Directory containing the staged review and immutable result.json.' },
|
|
91
|
+
{ name: 'result_path', type: 'string', required: true, constraint: 'The immutable terminal result path: <review_dir>/result.json.' },
|
|
95
92
|
{ name: 'follow_up', type: 'string', required: true, constraint: 'The review remains live for the person and companion; approval is delivered to the origin inbox.' },
|
|
96
93
|
],
|
|
97
94
|
outputKind: 'object',
|
|
98
95
|
effects: [
|
|
99
|
-
'The daemon creates the
|
|
96
|
+
'The daemon creates the durable review and companion session fork.',
|
|
100
97
|
'The reviewed file remains live in the attach viewer; this command does not submit an approval.',
|
|
101
98
|
],
|
|
102
99
|
},
|
|
103
100
|
run: async (input) => {
|
|
104
101
|
const file = resolve(input['file']);
|
|
105
102
|
const subtitle = requireSubtitle(input['subtitle']);
|
|
106
|
-
const outputArg = input['output'];
|
|
107
|
-
const output = typeof outputArg === 'string' ? resolve(outputArg) : undefined;
|
|
108
103
|
const review = await cliClient().createReview({
|
|
109
104
|
origin_kind: 'ticket',
|
|
110
105
|
origin_node_id: requireOriginNode(),
|
|
111
106
|
file,
|
|
112
107
|
idempotency_key: randomUUID(),
|
|
113
108
|
subtitle,
|
|
114
|
-
...(output === undefined ? {} : { output_path: output }),
|
|
115
109
|
});
|
|
116
|
-
if (review.bridge_node_id === null)
|
|
117
|
-
throw new Error('ticket review was created without a bridge node');
|
|
118
|
-
const dir = ticketDir(review.bridge_node_id);
|
|
119
110
|
return {
|
|
120
|
-
job_id: review.bridge_node_id,
|
|
121
|
-
dir,
|
|
122
|
-
output: output ?? join(dir, 'feedback.json'),
|
|
123
111
|
review_id: review.review_id,
|
|
112
|
+
review_dir: review.review_dir,
|
|
113
|
+
result_path: `${review.review_dir}/result.json`,
|
|
124
114
|
follow_up: 'The review is live for the person in the attach viewer with its companion agent. Approval is pushed to the origin inbox when submitted.',
|
|
125
115
|
};
|
|
126
116
|
},
|
|
@@ -20,6 +20,7 @@ import { join } from 'node:path';
|
|
|
20
20
|
import { resetScopeCache } from '../../../core/scope.js';
|
|
21
21
|
import { closeDb } from '../../../core/canvas/db.js';
|
|
22
22
|
import { createProfile, profileMemoryDir } from '../../../core/profiles/manifest.js';
|
|
23
|
+
import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
|
|
23
24
|
import { openProjectMemoryStore } from '../../../core/memory-resolver.js';
|
|
24
25
|
import { appendHistoryRecord, buildHistoryRecord, readHistoryRecords } from '../../../core/memory/history.js';
|
|
25
26
|
import { CrtrError } from '../../../core/errors.js';
|
|
@@ -74,6 +75,7 @@ beforeEach(() => {
|
|
|
74
75
|
process.env['CRTR_HOME'] = canvasHome;
|
|
75
76
|
delete process.env['CRTR_NODE_ID'];
|
|
76
77
|
mkdirSync(join(home, '.crouter', 'memory'), { recursive: true });
|
|
78
|
+
initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
|
|
77
79
|
root = join(base, 'root');
|
|
78
80
|
child = join(root, 'child');
|
|
79
81
|
nestedWrite = join(root, 'nested-write');
|
|
@@ -6,6 +6,7 @@ import { join } from 'node:path';
|
|
|
6
6
|
import { parseFrontmatterGeneric } from '../../../core/frontmatter.js';
|
|
7
7
|
import { resetScopeCache } from '../../../core/scope.js';
|
|
8
8
|
import { CrtrError } from '../../../core/errors.js';
|
|
9
|
+
import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
|
|
9
10
|
import { editLeaf } from '../edit.js';
|
|
10
11
|
import { listLeaf } from '../list.js';
|
|
11
12
|
import { writeLeaf } from '../write.js';
|
|
@@ -16,6 +17,7 @@ const canvasHome = mkdtempSync(join(tmpdir(), 'crtr-memory-list-canvas-'));
|
|
|
16
17
|
mkdirSync(join(home, '.crouter', 'memory'), { recursive: true });
|
|
17
18
|
process.env['HOME'] = home;
|
|
18
19
|
process.env['CRTR_HOME'] = canvasHome;
|
|
20
|
+
initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
|
|
19
21
|
function writeMemory(name, frontmatter = 'kind: knowledge') {
|
|
20
22
|
writeFileSync(join(home, '.crouter', 'memory', name), `---\n${frontmatter}\n---\n\nBODY\n`, 'utf8');
|
|
21
23
|
}
|
|
@@ -12,6 +12,7 @@ import { closeDb } from '../../../core/canvas/db.js';
|
|
|
12
12
|
import { lintMemoryStore, lintMemoryTarget } from '../../../core/memory/lint.js';
|
|
13
13
|
import { openProjectMemoryStore } from '../../../core/memory-resolver.js';
|
|
14
14
|
import { createProfile } from '../../../core/profiles/manifest.js';
|
|
15
|
+
import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
|
|
15
16
|
import { resetScopeCache } from '../../../core/scope.js';
|
|
16
17
|
let home;
|
|
17
18
|
let canvasHome;
|
|
@@ -54,6 +55,7 @@ beforeEach(() => {
|
|
|
54
55
|
delete process.env['CRTR_PROFILE_ID'];
|
|
55
56
|
delete process.env['CRTR_NODE_ID'];
|
|
56
57
|
mkdirSync(join(home, '.crouter', 'memory'), { recursive: true });
|
|
58
|
+
initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
|
|
57
59
|
resetScopeCache();
|
|
58
60
|
});
|
|
59
61
|
after(() => {
|
|
@@ -39,7 +39,7 @@ export const nodeArtifactsLeaf = defineLeaf({
|
|
|
39
39
|
summary: 'list one node\'s artifacts (reports + context docs) as refs ready for `canvas history read`',
|
|
40
40
|
params: [
|
|
41
41
|
{ kind: 'positional', name: 'node-id', required: true, constraint: 'The node whose artifacts to list.' },
|
|
42
|
-
{ kind: 'flag', name: 'type', type: 'enum', choices: [...TYPES], required: false, constraint: 'Narrow to one corpus: report | doc | roadmap | inbox. Default: report, doc, roadmap (inbox is opt-in only — the node\'s
|
|
42
|
+
{ kind: 'flag', name: 'type', type: 'enum', choices: [...TYPES], required: false, constraint: 'Narrow to one corpus: report | doc | roadmap | inbox. Default: report, doc, roadmap (inbox is opt-in only — the node\'s inbox history including full un-clipped direct-message bodies; a diagnostic surface, not curated past work).' },
|
|
43
43
|
{ kind: 'flag', name: 'sort', type: 'enum', choices: ['recency', 'oldest'], required: false, constraint: 'Order by artifact timestamp. Default recency.' },
|
|
44
44
|
],
|
|
45
45
|
output: [
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { LeafDef } from '../core/command.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { NodeFaultDTO } from '../api/dto/nodes.js';
|
|
3
3
|
/** --now eligibility for a live, non-busy fault: a daemon-owned AUTO retry
|
|
4
4
|
* (kick it early instead of waiting out the schedule), or any fault the
|
|
5
5
|
* canvas dashboard flags "needs you" (`faultNeedsYou`, status-glyph.ts) — the
|
|
@@ -8,5 +8,5 @@ import type { Fault } from '../core/runtime/fault.js';
|
|
|
8
8
|
* (redialing) already in flight, and refuses any OTHER link — notably a
|
|
9
9
|
* `daemon→node` wedge fault, which --now can't clear (SIGTERM doesn't touch
|
|
10
10
|
* the runaway subprocess; see `wedged-child-on-runaway-bash`). */
|
|
11
|
-
export declare function isNowEligibleFault(fault:
|
|
11
|
+
export declare function isNowEligibleFault(fault: NodeFaultDTO | null): boolean;
|
|
12
12
|
export declare const nodeReviveLeaf: LeafDef;
|
|
@@ -15,8 +15,6 @@
|
|
|
15
15
|
// The mass-recovery form — reconnect EVERY disconnected node at once after a
|
|
16
16
|
// reboot/crash — is genuinely graph-wide and stays at `canvas revive --all`
|
|
17
17
|
// (src/commands/revive.ts).
|
|
18
|
-
import { existsSync } from 'node:fs';
|
|
19
|
-
import { join } from 'node:path';
|
|
20
18
|
import { defineLeaf } from '../core/command.js';
|
|
21
19
|
import { InputError } from '../core/io.js';
|
|
22
20
|
import { cliClient, rethrowAsCliError } from './api-client.js';
|
|
@@ -25,17 +23,16 @@ import { cliClient, rethrowAsCliError } from './api-client.js';
|
|
|
25
23
|
// accessors — a `crtr` CLI process never opens canvas.db. So the revive itself
|
|
26
24
|
// goes through the daemon (`cliClient().reviveNode`), and every helper below is
|
|
27
25
|
// imported from a db-free module: `recordedPidLiveness` (pid.js → fs/ps only),
|
|
28
|
-
// `
|
|
29
|
-
// (
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
// direct
|
|
26
|
+
// `faultNeedsYou` (status-glyph.js → fault.js), and `fullName` from labels.js
|
|
27
|
+
// DIRECTLY (NOT the canvas barrel `index.js`, which re-exports `openDb`).
|
|
28
|
+
// View-socket readiness comes from the db-free probe owner. The node's active
|
|
29
|
+
// fault and mid-turn state are projected fields on the detail DTO this leaf
|
|
30
|
+
// already fetches. The former direct
|
|
31
|
+
// `reviveNode`/`getNode`/`assertReopenGate`/`waitForBrokerViewSocket`/`isBusy`
|
|
33
32
|
// imports all reached the db barrel and are replaced by the client call + helpers below.
|
|
34
33
|
import { recordedPidLiveness } from '../core/canvas/pid.js';
|
|
35
|
-
import { readFault } from '../core/runtime/fault.js';
|
|
36
34
|
import { fullName } from '../core/canvas/labels.js';
|
|
37
35
|
import { faultNeedsYou } from '../core/canvas/status-glyph.js';
|
|
38
|
-
import { jobDir } from '../core/canvas/paths.js';
|
|
39
36
|
import { waitForViewSocketReady } from '../core/runtime/view-socket.js';
|
|
40
37
|
/** --now eligibility for a live, non-busy fault: a daemon-owned AUTO retry
|
|
41
38
|
* (kick it early instead of waiting out the schedule), or any fault the
|
|
@@ -52,13 +49,6 @@ export function isNowEligibleFault(fault) {
|
|
|
52
49
|
return true;
|
|
53
50
|
return fault.retry.by === 'daemon';
|
|
54
51
|
}
|
|
55
|
-
// Local, db-free helpers (inlined so the leaf never imports the canvas barrel)
|
|
56
|
-
/** Inlined from `runtime/busy.ts` (which reaches the canvas barrel via `jobDir`):
|
|
57
|
-
* is the node mid-turn right now? `<jobDir>/busy` exists for the span pi is
|
|
58
|
-
* inside a run. `jobDir` here is the pure path helper from paths.js. */
|
|
59
|
-
function nodeIsBusy(nodeId) {
|
|
60
|
-
return existsSync(join(jobDir(nodeId), 'busy'));
|
|
61
|
-
}
|
|
62
52
|
export const nodeReviveLeaf = defineLeaf({
|
|
63
53
|
name: 'revive',
|
|
64
54
|
description: 'reopen a window for a done/idle/dead/canceled node',
|
|
@@ -157,7 +147,7 @@ export const nodeReviveLeaf = defineLeaf({
|
|
|
157
147
|
rethrowAsCliError(e);
|
|
158
148
|
}
|
|
159
149
|
const pid = detail.pi_pid;
|
|
160
|
-
const stall =
|
|
150
|
+
const stall = detail.fault ?? null;
|
|
161
151
|
if (pid == null || recordedPidLiveness(pid, detail.pi_pid_identity ?? null) !== 'alive') {
|
|
162
152
|
throw new InputError({
|
|
163
153
|
error: 'not_hanging',
|
|
@@ -173,9 +163,9 @@ export const nodeReviveLeaf = defineLeaf({
|
|
|
173
163
|
});
|
|
174
164
|
}
|
|
175
165
|
// The daemon never kills a BUSY engine (its verdict paths all return 'leave'
|
|
176
|
-
// on
|
|
166
|
+
// on an open turn): a node mid-turn is making progress, not wedged —
|
|
177
167
|
// refuse rather than SIGTERM it mid-flight.
|
|
178
|
-
if (
|
|
168
|
+
if (detail.streaming === true) {
|
|
179
169
|
throw new InputError({
|
|
180
170
|
error: 'busy',
|
|
181
171
|
message: `${nodeId} is mid-turn right now (busy) — --now refuses to SIGTERM a working engine; it has recovered on its own.`,
|
|
@@ -199,7 +199,6 @@ function migratePluginMemory(manifest, root, scope, where, ownership) {
|
|
|
199
199
|
}],
|
|
200
200
|
targets: [],
|
|
201
201
|
blockers: [],
|
|
202
|
-
nodeMetadata: { available: true, nodes: 0 },
|
|
203
202
|
};
|
|
204
203
|
const load = () => {
|
|
205
204
|
const { snapshots, skipped } = loadCorpusSnapshots(discovery);
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
1
|
import { defineLeaf } from '../../core/command.js';
|
|
4
2
|
import { resolveProfileOperand, profileRoot, sanitizeProfileMetadata } from '../../core/profiles/manifest.js';
|
|
5
|
-
import { CONFIG_FILE } from '../../types.js';
|
|
6
3
|
export const showLeaf = defineLeaf({
|
|
7
4
|
name: 'show',
|
|
8
5
|
description: "one profile's manifest in full",
|
|
9
6
|
whenToUse: "you need a profile's full project list, home directory, id, and timestamps — after `profile list` narrows to a name, to find where its nodes will run, or to inspect what a node's bearings named as its profile.",
|
|
10
7
|
help: {
|
|
11
8
|
name: 'profile show',
|
|
12
|
-
summary: "print one profile's manifest
|
|
9
|
+
summary: "print one profile's manifest and on-disk path",
|
|
13
10
|
params: [
|
|
14
11
|
{
|
|
15
12
|
kind: 'positional',
|
|
@@ -29,16 +26,13 @@ export const showLeaf = defineLeaf({
|
|
|
29
26
|
{ name: 'created_at', type: 'string', required: true, constraint: 'ISO 8601 creation timestamp.' },
|
|
30
27
|
{ name: 'last_used_at', type: 'string | null', required: true, constraint: 'ISO 8601 timestamp of the most recent selection, or null if never selected.' },
|
|
31
28
|
{ name: 'path', type: 'string', required: true, constraint: 'Absolute path to the profile directory.' },
|
|
32
|
-
{ name: '
|
|
33
|
-
{ name: 'config_exists', type: 'boolean', required: true, constraint: 'Whether config.json exists at that path yet.' },
|
|
34
|
-
{ name: 'follow_up', type: 'string', required: true, constraint: 'Concrete next commands.' },
|
|
29
|
+
{ name: 'follow_up', type: 'string', required: true, constraint: 'Concrete next commands, including the SQL-backed raw settings surface.' },
|
|
35
30
|
],
|
|
36
31
|
outputKind: 'object',
|
|
37
32
|
effects: ['None. Read-only.'],
|
|
38
33
|
},
|
|
39
34
|
run: async (input) => {
|
|
40
35
|
const { profileId, manifest } = resolveProfileOperand(input['profile']);
|
|
41
|
-
const configPath = join(profileRoot(profileId), CONFIG_FILE);
|
|
42
36
|
return {
|
|
43
37
|
profile_id: profileId,
|
|
44
38
|
name: manifest.name,
|
|
@@ -50,11 +44,9 @@ export const showLeaf = defineLeaf({
|
|
|
50
44
|
created_at: manifest.created_at,
|
|
51
45
|
last_used_at: manifest.last_used_at,
|
|
52
46
|
path: profileRoot(profileId),
|
|
53
|
-
config_path: configPath,
|
|
54
|
-
config_exists: existsSync(configPath),
|
|
55
47
|
follow_up: manifest.paused_at === null
|
|
56
|
-
? `
|
|
57
|
-
: `
|
|
48
|
+
? `Inspect its SQL-backed settings with \`crtr sys config get-raw --scope profile --profile ${profileId}\`; manage its purview with \`crtr profile project add ${profileId} --dir <path> --memory <none|name|preview|content>\`, pause it with \`crtr profile pause ${profileId}\`, or set its default kind with \`crtr profile kind ${profileId} <kind>\`.`
|
|
49
|
+
: `Inspect its SQL-backed settings with \`crtr sys config get-raw --scope profile --profile ${profileId}\`; manage its purview with \`crtr profile project add ${profileId} --dir <path> --memory <none|name|preview|content>\`, or resume it with \`crtr profile resume ${profileId}\`.`,
|
|
58
50
|
};
|
|
59
51
|
},
|
|
60
52
|
});
|
|
@@ -49,11 +49,7 @@ async function climbRootViaSource(source, self) {
|
|
|
49
49
|
}
|
|
50
50
|
/** Hard ceiling on panes in the spread window (self + up to 7 siblings). */
|
|
51
51
|
const PANE_CAP = 8;
|
|
52
|
-
/**
|
|
53
|
-
* on every turn_end at a DETERMINISTIC node-id-derived path (unlike pi_session_file,
|
|
54
|
-
* whose path lives in meta.json and is NOT projected by the API's NodeMeta). This
|
|
55
|
-
* is the same last-activity proxy the dashboard recency sort uses; a node that
|
|
56
|
-
* never ran a turn (no telemetry) sorts last (0). Local statSync, openDb-free. */
|
|
52
|
+
/** Telemetry mtime approximates last activity; nodes without telemetry sort last. */
|
|
57
53
|
function sessionMtime(nodeId) {
|
|
58
54
|
try {
|
|
59
55
|
const st = statSync(join(jobDir(nodeId), 'telemetry.json'), { throwIfNoEntry: false });
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// config-model-ladders.test.ts — regression coverage for the live Hearth
|
|
2
|
-
// incident where a home's config
|
|
2
|
+
// incident where a home's stored config had `openai-codex/gpt-5.6-*` baked into
|
|
3
3
|
// `modelLadders` while the guest's own installed model registry only had
|
|
4
4
|
// `gpt-5.5`. Root cause: both `ensureScopeInitialized` (fresh scope) and
|
|
5
|
-
// `sys config set modelLadders...` (a targeted edit) persisted the
|
|
5
|
+
// `sys config set modelLadders...` (a targeted edit) persisted the fully
|
|
6
6
|
// materialized ladder (all 4 strengths x 2 providers) rather than only the
|
|
7
7
|
// genuine override, freezing whatever concrete model ids happened to be
|
|
8
8
|
// compiled into the crouter build that ran at that moment. A later
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
// reach the frozen rungs again.
|
|
11
11
|
import { test, before, after, beforeEach, afterEach } from 'node:test';
|
|
12
12
|
import assert from 'node:assert/strict';
|
|
13
|
-
import { mkdtempSync, rmSync
|
|
13
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
14
14
|
import { tmpdir } from 'node:os';
|
|
15
15
|
import { join } from 'node:path';
|
|
16
|
-
import { ensureScopeInitialized, readConfig, updateConfig } from '../../../core/config.js';
|
|
16
|
+
import { ensureScopeInitialized, readConfig, readRawScopeConfig, updateConfig } from '../../../core/config.js';
|
|
17
17
|
import { configBranch } from '../config.js';
|
|
18
18
|
function leaf(name) {
|
|
19
19
|
const found = (configBranch.children ?? []).find((c) => c.name === name);
|
|
@@ -41,16 +41,13 @@ after(() => {
|
|
|
41
41
|
else
|
|
42
42
|
delete process.env['HOME'];
|
|
43
43
|
});
|
|
44
|
-
test('ensureScopeInitialized does NOT bake concrete modelLadders model ids into a fresh
|
|
44
|
+
test('ensureScopeInitialized does NOT bake concrete modelLadders model ids into a fresh scoped store', () => {
|
|
45
45
|
const root = join(home, '.crouter');
|
|
46
46
|
ensureScopeInitialized('user', root);
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
// must NOT freeze a modelLadders snapshot -- that key should be absent so
|
|
52
|
-
// `readConfig` always re-derives it live from whichever build is running.
|
|
53
|
-
assert.equal(raw.modelLadders, undefined);
|
|
47
|
+
const raw = readRawScopeConfig('user');
|
|
48
|
+
// A fresh store has no settings row until a caller writes an override, so
|
|
49
|
+
// `readConfig` always re-derives the ladder from the running build.
|
|
50
|
+
assert.equal(raw?.modelLadders, undefined);
|
|
54
51
|
// readConfig must still default-fill a full, usable ladder despite the
|
|
55
52
|
// omission -- a config-less scope is never worse off.
|
|
56
53
|
const cfg = readConfig('user');
|
|
@@ -61,17 +58,16 @@ test('sys config set modelLadders.<provider>.<strength> persists ONLY the touche
|
|
|
61
58
|
const root = join(home, '.crouter');
|
|
62
59
|
ensureScopeInitialized('user', root);
|
|
63
60
|
await leaf('set').run({ key: 'modelLadders.openai.strong', value: 'openai-codex/gpt-5.5:high' });
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
assert.equal(raw.modelLadders.openai.strong, 'openai-codex/gpt-5.5:high');
|
|
61
|
+
const raw = readRawScopeConfig('user');
|
|
62
|
+
assert.equal(raw.modelLadders?.openai?.strong, 'openai-codex/gpt-5.5:high');
|
|
67
63
|
// The other three openai rungs, and the entire anthropic ladder, must stay
|
|
68
64
|
// UNSET on disk -- baking them in would freeze this scope to today's
|
|
69
65
|
// compiled defaults for rungs the user never touched, the exact staleness
|
|
70
66
|
// bug that produced the live `gpt-5.6` vs. installed-`gpt-5.5` mismatch.
|
|
71
|
-
assert.equal(raw.modelLadders
|
|
72
|
-
assert.equal(raw.modelLadders
|
|
73
|
-
assert.equal(raw.modelLadders
|
|
74
|
-
assert.equal(raw.modelLadders
|
|
67
|
+
assert.equal(raw.modelLadders?.openai?.ultra, undefined);
|
|
68
|
+
assert.equal(raw.modelLadders?.openai?.medium, undefined);
|
|
69
|
+
assert.equal(raw.modelLadders?.openai?.light, undefined);
|
|
70
|
+
assert.equal(raw.modelLadders?.anthropic, undefined);
|
|
75
71
|
// readConfig still resolves a full ladder: the one override layered over
|
|
76
72
|
// live compiled defaults for everything else.
|
|
77
73
|
const cfg = readConfig('user');
|
|
@@ -91,17 +87,15 @@ test('an unrelated updateConfig mutation (as fresh bootstrap does) does NOT free
|
|
|
91
87
|
installed_at: '2026-01-01T00:00:00.000Z',
|
|
92
88
|
};
|
|
93
89
|
});
|
|
94
|
-
const
|
|
95
|
-
const raw = JSON.parse(readFileSync(cfgPath, 'utf8'));
|
|
90
|
+
const raw = readRawScopeConfig('user');
|
|
96
91
|
assert.equal(raw.modelLadders, undefined);
|
|
97
|
-
assert.ok(raw.marketplaces['crouter-official-marketplace']);
|
|
92
|
+
assert.ok(raw.marketplaces?.['crouter-official-marketplace']);
|
|
98
93
|
});
|
|
99
94
|
test('a non-ladder sys config set does NOT freeze modelLadders to disk', async () => {
|
|
100
95
|
const root = join(home, '.crouter');
|
|
101
96
|
ensureScopeInitialized('user', root);
|
|
102
97
|
await leaf('set').run({ key: 'max_panes_per_window', value: '5' });
|
|
103
|
-
const
|
|
104
|
-
const raw = JSON.parse(readFileSync(cfgPath, 'utf8'));
|
|
98
|
+
const raw = readRawScopeConfig('user');
|
|
105
99
|
// The touched key persists; modelLadders stays absent so a later build's
|
|
106
100
|
// registry change still reaches every rung.
|
|
107
101
|
assert.equal(raw.max_panes_per_window, 5);
|
|
@@ -112,10 +106,9 @@ test('a second sys config set for a different rung does not clobber an earlier o
|
|
|
112
106
|
ensureScopeInitialized('user', root);
|
|
113
107
|
await leaf('set').run({ key: 'modelLadders.openai.strong', value: 'openai-codex/gpt-5.5:high' });
|
|
114
108
|
await leaf('set').run({ key: 'modelLadders.anthropic.light', value: 'anthropic/claude-haiku-4-5:high' });
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
assert.equal(raw.modelLadders
|
|
118
|
-
assert.equal(raw.modelLadders
|
|
119
|
-
assert.equal(raw.modelLadders
|
|
120
|
-
assert.equal(raw.modelLadders.anthropic.strong, undefined);
|
|
109
|
+
const raw = readRawScopeConfig('user');
|
|
110
|
+
assert.equal(raw.modelLadders?.openai?.strong, 'openai-codex/gpt-5.5:high');
|
|
111
|
+
assert.equal(raw.modelLadders?.anthropic?.light, 'anthropic/claude-haiku-4-5:high');
|
|
112
|
+
assert.equal(raw.modelLadders?.openai?.ultra, undefined);
|
|
113
|
+
assert.equal(raw.modelLadders?.anthropic?.strong, undefined);
|
|
121
114
|
});
|
|
@@ -7,6 +7,10 @@ import { fileURLToPath } from 'node:url';
|
|
|
7
7
|
import test from 'node:test';
|
|
8
8
|
import { lintMemoryStore } from '../../../core/memory/lint.js';
|
|
9
9
|
import { openProjectMemoryStore } from '../../../core/memory-resolver.js';
|
|
10
|
+
import { insertStoredProfile } from '../../../core/scoped-state/profiles.js';
|
|
11
|
+
import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
|
|
12
|
+
import { closeScopedStores } from '../../../core/scoped-state/db.js';
|
|
13
|
+
import { resetScopeCache } from '../../../core/scope.js';
|
|
10
14
|
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
11
15
|
const CLI = join(HERE, '../../../cli.ts');
|
|
12
16
|
const TSX_LOADER = import.meta.resolve('tsx/esm');
|
|
@@ -17,7 +21,9 @@ function write(path, content) {
|
|
|
17
21
|
/** Store keys and target ids are realpaths, so the fixture must be one too:
|
|
18
22
|
* macOS hands `mkdtemp` a `/var/folders` path whose realpath is `/private/...`. */
|
|
19
23
|
function fixtureHome(prefix) {
|
|
20
|
-
|
|
24
|
+
const home = realpathSync(mkdtempSync(join(tmpdir(), prefix)));
|
|
25
|
+
initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
|
|
26
|
+
return home;
|
|
21
27
|
}
|
|
22
28
|
/** A home the ambient node's own CRTR_* environment cannot leak into. */
|
|
23
29
|
function syncEnv(home) {
|
|
@@ -58,15 +64,35 @@ function initializeRepository(path) {
|
|
|
58
64
|
assert.equal(result.status, 0, result.stderr);
|
|
59
65
|
}
|
|
60
66
|
function writeProfile(home, profileId, project) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
67
|
+
insertStoredProfile(join(home, '.crouter'), {
|
|
68
|
+
profileId,
|
|
69
|
+
manifest: {
|
|
70
|
+
schema_version: 1,
|
|
71
|
+
name: 'sync fixture',
|
|
72
|
+
projects: [{ path: realpathSync(project), memory: 'content' }],
|
|
73
|
+
home: realpathSync(project),
|
|
74
|
+
paused_at: null,
|
|
75
|
+
created_at: '2026-01-01T00:00:00.000Z',
|
|
76
|
+
last_used_at: null,
|
|
77
|
+
},
|
|
78
|
+
}, join(home, '.crouter', 'profiles', profileId));
|
|
79
|
+
resetScopeCache();
|
|
80
|
+
}
|
|
81
|
+
function lintFixtureStore(home, project) {
|
|
82
|
+
const previousHome = process.env['HOME'];
|
|
83
|
+
process.env['HOME'] = home;
|
|
84
|
+
resetScopeCache();
|
|
85
|
+
try {
|
|
86
|
+
return lintMemoryStore(openProjectMemoryStore(project));
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
closeScopedStores();
|
|
90
|
+
resetScopeCache();
|
|
91
|
+
if (previousHome === undefined)
|
|
92
|
+
delete process.env['HOME'];
|
|
93
|
+
else
|
|
94
|
+
process.env['HOME'] = previousHome;
|
|
95
|
+
}
|
|
70
96
|
}
|
|
71
97
|
test('sync project-guidance --overwrite preserves an authored root and still imports rules', () => {
|
|
72
98
|
const home = fixtureHome('crtr-sync-project-guidance-');
|
|
@@ -158,7 +184,7 @@ Nested operating guidance.
|
|
|
158
184
|
assert.match(nestedIndex, /on: read/);
|
|
159
185
|
assert.match(nestedIndex, /packages\/tool\/\*\*\/\*\.ts/);
|
|
160
186
|
assert.match(nestedIndex, /Nested operating guidance\./);
|
|
161
|
-
const lint =
|
|
187
|
+
const lint = lintFixtureStore(home, nested);
|
|
162
188
|
assert.equal(lint.ok, true, JSON.stringify(lint.findings));
|
|
163
189
|
});
|
|
164
190
|
test('sync project-guidance imports nested rules as leaves without a synthetic nested index', () => {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { defineBranch } from '../../core/command.js';
|
|
2
|
+
const SYS_ROOT_ENTRY = {
|
|
3
|
+
concept: 'crtr configuration, diagnostics, and self-management',
|
|
4
|
+
desc: 'settings, config, setup, doctor, context, sync, migrate, update, version, feedback, logs, support, daemon',
|
|
5
|
+
useWhen: 'managing the crtr installation, inspecting diagnostics, or operating the crtrd supervisor process',
|
|
6
|
+
};
|
|
7
|
+
const SYS_HELP = {
|
|
8
|
+
name: 'sys',
|
|
9
|
+
summary: 'crtr system configuration, settings, diagnostics, and self-management',
|
|
10
|
+
model: 'Configuration and settings own durable behavior; diagnostics and support observe it. Setup, migration, sync, and update change installed or generated state, while daemon control owns the supervisor lifecycle.',
|
|
11
|
+
};
|
|
12
|
+
export function defineSysBranch(children) {
|
|
13
|
+
return defineBranch({
|
|
14
|
+
name: 'sys',
|
|
15
|
+
rootEntry: SYS_ROOT_ENTRY,
|
|
16
|
+
help: { ...SYS_HELP },
|
|
17
|
+
children,
|
|
18
|
+
});
|
|
19
|
+
}
|