@north-light/crouter 0.3.311 → 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 +17 -5
- 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 +312 -1
- 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 +62 -19
- 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 +4 -3
- package/dist/core/__tests__/on-read-dedup-resume.test.js +8 -7
- package/dist/core/__tests__/on-read-nested-store.test.js +8 -7
- 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 +35 -32
- 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 +5 -4
- 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 +19 -5
- 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/command-hooks/artifact.d.ts +6 -0
- package/dist/core/command-hooks/artifact.js +22 -6
- package/dist/core/command-hooks/discovery.d.ts +2 -0
- package/dist/core/command-hooks/discovery.js +2 -0
- package/dist/core/command-hooks/lifecycle-catalog.d.ts +20 -2
- package/dist/core/command-hooks/lifecycle-catalog.js +7 -2
- package/dist/core/command-hooks/lifecycle-create.d.ts +4 -0
- package/dist/core/command-hooks/lifecycle-create.js +51 -0
- package/dist/core/command-hooks/schema.d.ts +2 -2
- package/dist/core/command-hooks/schema.js +5 -4
- package/dist/core/command-hooks/transport/exec-invoke.js +3 -1
- package/dist/core/command-hooks/transport/exec-lifecycle.d.ts +18 -8
- package/dist/core/command-hooks/transport/exec-lifecycle.js +89 -30
- package/dist/core/config.d.ts +17 -12
- package/dist/core/config.js +106 -155
- package/dist/core/errors.d.ts +1 -0
- package/dist/core/errors.js +4 -0
- 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 +4 -3
- 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/companion.d.ts +1 -1
- package/dist/core/review/companion.js +2 -2
- 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/nodes.d.ts +5 -1
- package/dist/core/runtime/nodes.js +26 -11
- package/dist/core/runtime/placement.js +2 -2
- package/dist/core/runtime/recycle.js +24 -14
- package/dist/core/runtime/reset.js +26 -7
- package/dist/core/runtime/revive.js +226 -217
- package/dist/core/runtime/spawn.d.ts +4 -1
- package/dist/core/runtime/spawn.js +43 -5
- package/dist/core/runtime/warm-pool.d.ts +2 -2
- package/dist/core/runtime/warm-pool.js +23 -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 +41 -17
- 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 +6 -3
- 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 +29 -43
- 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 -148
- 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.d.ts +1 -0
- package/dist/daemon/api/handlers/nodes.js +41 -42
- 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/hook-authoring.d.ts +28 -2
- package/dist/hook-authoring.js +53 -1
- package/dist/index.d.ts +3 -2
- 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
|
@@ -12,7 +12,7 @@ import { BrokerSupervisionReconciler } from '../reconcilers/broker-supervision.j
|
|
|
12
12
|
import { ControllerDeathReconciler } from '../reconcilers/controller-death.js';
|
|
13
13
|
import { NodeLifecycleReconciler } from '../reconcilers/node-lifecycle/tick.js';
|
|
14
14
|
import { CronLaneReconciler } from '../reconcilers/cron-lane.js';
|
|
15
|
-
import {
|
|
15
|
+
import { DeliveryLaneReconciler } from '../reconcilers/delivery-lane.js';
|
|
16
16
|
import { PendingReviewSubmitReconciler } from '../reconcilers/pending-review-submit.js';
|
|
17
17
|
import { StorageMaintenanceReconciler } from '../reconcilers/storage-maintenance.js';
|
|
18
18
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -21,7 +21,7 @@ const RECONCILERS = [
|
|
|
21
21
|
['ControllerDeathReconciler', ControllerDeathReconciler],
|
|
22
22
|
['NodeLifecycleReconciler', NodeLifecycleReconciler],
|
|
23
23
|
['CronLaneReconciler', CronLaneReconciler],
|
|
24
|
-
['
|
|
24
|
+
['DeliveryLaneReconciler', DeliveryLaneReconciler],
|
|
25
25
|
['PendingReviewSubmitReconciler', PendingReviewSubmitReconciler],
|
|
26
26
|
['StorageMaintenanceReconciler', StorageMaintenanceReconciler],
|
|
27
27
|
];
|
|
@@ -19,7 +19,7 @@ import { mkdtempSync, rmSync } from 'node:fs';
|
|
|
19
19
|
import { tmpdir } from 'node:os';
|
|
20
20
|
import { join } from 'node:path';
|
|
21
21
|
import { createNode, subscribe } from '../../core/canvas/canvas.js';
|
|
22
|
-
import { closeDb } from '../../core/canvas/db.js';
|
|
22
|
+
import { closeDb, migrate, openDb } from '../../core/canvas/db.js';
|
|
23
23
|
import { nodeRoutes } from '../api/handlers/nodes.js';
|
|
24
24
|
let home;
|
|
25
25
|
function node(id, parent) {
|
|
@@ -41,7 +41,7 @@ async function listUnder(id) {
|
|
|
41
41
|
return res.body.map((r) => r.node_id);
|
|
42
42
|
}
|
|
43
43
|
before(() => { home = mkdtempSync(join(tmpdir(), 'crtr-subtree-')); process.env['CRTR_HOME'] = home; });
|
|
44
|
-
beforeEach(() => { closeDb(); rmSync(home, { recursive: true, force: true }); });
|
|
44
|
+
beforeEach(() => { closeDb(); rmSync(home, { recursive: true, force: true }); migrate(openDb()); });
|
|
45
45
|
after(() => { closeDb(); rmSync(home, { recursive: true, force: true }); delete process.env['CRTR_HOME']; });
|
|
46
46
|
test('a subtree query answered before any child exists does not poison later queries on the same daemon process', async () => {
|
|
47
47
|
const coordinator = 'coordinator';
|
|
@@ -8,10 +8,12 @@ import { after, before, beforeEach, test } from 'node:test';
|
|
|
8
8
|
import assert from 'node:assert/strict';
|
|
9
9
|
import { mkdtempSync, rmSync, writeFileSync, utimesSync } from 'node:fs';
|
|
10
10
|
import { join } from 'node:path';
|
|
11
|
-
import { createNode, getNode
|
|
12
|
-
import { closeDb } from '../../../core/canvas/db.js';
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
11
|
+
import { createNode, getNode } from '../../../core/canvas/canvas.js';
|
|
12
|
+
import { closeDb, migrate, openDb } from '../../../core/canvas/db.js';
|
|
13
|
+
import { resetSession } from '../../../core/canvas/sessions.js';
|
|
14
|
+
import { beginExecution, liveExecutionForNode } from '../../../core/canvas/executions.js';
|
|
15
|
+
import { enqueueNodeMail } from '../../../core/feed/messages.js';
|
|
16
|
+
import { openTurn } from '../../../core/canvas/recovery.js';
|
|
15
17
|
import { beginPendingPark, isPendingPark } from '../../park-pending.js';
|
|
16
18
|
import { brokerOperationRoutes } from '../handlers/broker-ops.js';
|
|
17
19
|
let home = '';
|
|
@@ -27,6 +29,7 @@ before(() => {
|
|
|
27
29
|
beforeEach(() => {
|
|
28
30
|
closeDb();
|
|
29
31
|
rmSync(home, { recursive: true, force: true });
|
|
32
|
+
migrate(openDb());
|
|
30
33
|
});
|
|
31
34
|
after(() => {
|
|
32
35
|
closeDb();
|
|
@@ -49,6 +52,7 @@ function residentMidParkingTurn(id) {
|
|
|
49
52
|
status: 'active',
|
|
50
53
|
};
|
|
51
54
|
createNode(meta);
|
|
55
|
+
beginExecution(id, { daemonEpoch: 'test' });
|
|
52
56
|
beginPendingPark(id, Date.now());
|
|
53
57
|
}
|
|
54
58
|
async function settle(id, over = {}) {
|
|
@@ -58,6 +62,7 @@ async function settle(id, over = {}) {
|
|
|
58
62
|
params: { id },
|
|
59
63
|
query: new URLSearchParams(),
|
|
60
64
|
body: {
|
|
65
|
+
expected_execution_id: liveExecutionForNode(id).executionId,
|
|
61
66
|
stopReason: 'stop',
|
|
62
67
|
backgroundJobsRunning: false,
|
|
63
68
|
pushedFinal: false,
|
|
@@ -73,7 +78,7 @@ async function completePark(id) {
|
|
|
73
78
|
path: `/v1/nodes/${id}/broker/park-complete`,
|
|
74
79
|
params: { id },
|
|
75
80
|
query: new URLSearchParams(),
|
|
76
|
-
body: { outcome: 'completed' },
|
|
81
|
+
body: { expected_execution_id: liveExecutionForNode(id).executionId, outcome: 'completed' },
|
|
77
82
|
};
|
|
78
83
|
return (await parkCompleteRoute.handler(ctx)).body;
|
|
79
84
|
}
|
|
@@ -83,7 +88,7 @@ async function recordParkActivity(id) {
|
|
|
83
88
|
path: `/v1/nodes/${id}/broker/park-activity`,
|
|
84
89
|
params: { id },
|
|
85
90
|
query: new URLSearchParams(),
|
|
86
|
-
body: {},
|
|
91
|
+
body: { expected_execution_id: liveExecutionForNode(id).executionId },
|
|
87
92
|
};
|
|
88
93
|
return (await parkActivityRoute.handler(ctx)).body;
|
|
89
94
|
}
|
|
@@ -107,7 +112,8 @@ test('a human ask raised during the parking turn does not consume the pending ma
|
|
|
107
112
|
});
|
|
108
113
|
test('a main turn racing shadow completion keeps the broker live', async () => {
|
|
109
114
|
residentMidParkingTurn('busy-main');
|
|
110
|
-
|
|
115
|
+
const executionId = beginExecution('busy-main', { daemonEpoch: 'test' });
|
|
116
|
+
openTurn(executionId, { reason: 'agent-start' });
|
|
111
117
|
const directive = await completePark('busy-main');
|
|
112
118
|
assert.deepEqual(directive, { action: 'stay_dormant' });
|
|
113
119
|
assert.equal(getNode('busy-main').status, 'active');
|
|
@@ -116,7 +122,7 @@ test('a main turn racing shadow completion keeps the broker live', async () => {
|
|
|
116
122
|
});
|
|
117
123
|
test('wake-worthy mail arriving during the parking turn flips the verdict back to release', async () => {
|
|
118
124
|
residentMidParkingTurn('mailed');
|
|
119
|
-
|
|
125
|
+
enqueueNodeMail('mailed', { kind: 'message', label: 'x', bodyJson: { body: 'work' }, urgency: 'normal', wake: 1 });
|
|
120
126
|
const directive = await completePark('mailed');
|
|
121
127
|
assert.equal(directive.action, 'stay_dormant');
|
|
122
128
|
assert.equal(getNode('mailed').status, 'active', 're-evaluation saw the new obligation and did not park');
|
|
@@ -125,8 +131,7 @@ test('wake-worthy mail arriving during the parking turn flips the verdict back t
|
|
|
125
131
|
});
|
|
126
132
|
test('a message already consumed by the main turn still releases the parking completion', async () => {
|
|
127
133
|
residentMidParkingTurn('consumed-mail');
|
|
128
|
-
|
|
129
|
-
writeCursor('consumed-mail', entry.entry_id);
|
|
134
|
+
enqueueNodeMail('consumed-mail', { kind: 'message', label: 'work', bodyJson: { body: 'work' }, urgency: 'normal', wake: 1 });
|
|
130
135
|
const directive = await completePark('consumed-mail');
|
|
131
136
|
assert.deepEqual(directive, { action: 'stay_dormant' });
|
|
132
137
|
assert.equal(getNode('consumed-mail').status, 'active');
|
|
@@ -135,7 +140,7 @@ test('a message already consumed by the main turn still releases the parking com
|
|
|
135
140
|
});
|
|
136
141
|
test('a bound but absent main-session file is not activity', async () => {
|
|
137
142
|
residentMidParkingTurn('empty-session');
|
|
138
|
-
|
|
143
|
+
resetSession('empty-session', { sessionId: 'empty-session', transcriptPath: join(home, 'not-created-yet.jsonl') });
|
|
139
144
|
const directive = await completePark('empty-session');
|
|
140
145
|
assert.deepEqual(directive, { action: 'shutdown' });
|
|
141
146
|
assert.equal(getNode('empty-session').status, 'done');
|
|
@@ -154,7 +159,7 @@ test('main-session activity already settled before completion releases parking',
|
|
|
154
159
|
writeFileSync(sessionFile, 'main turn');
|
|
155
160
|
const afterParkStart = new Date(Date.now() + 1000);
|
|
156
161
|
utimesSync(sessionFile, afterParkStart, afterParkStart);
|
|
157
|
-
|
|
162
|
+
resetSession('interactive-mail', { sessionId: 'interactive-mail', transcriptPath: sessionFile });
|
|
158
163
|
const directive = await completePark('interactive-mail');
|
|
159
164
|
assert.deepEqual(directive, { action: 'stay_dormant' });
|
|
160
165
|
assert.equal(getNode('interactive-mail').status, 'active');
|
|
@@ -3,10 +3,14 @@ import assert from 'node:assert/strict';
|
|
|
3
3
|
import { createServer } from 'node:net';
|
|
4
4
|
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
|
-
import { closeDb } from '../../../core/canvas/db.js';
|
|
6
|
+
import { closeDb, migrate, openDb } from '../../../core/canvas/db.js';
|
|
7
|
+
import { closeScopedStores } from '../../../core/scoped-state/db.js';
|
|
8
|
+
import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
|
|
9
|
+
import { userScopeRoot } from '../../../core/scope.js';
|
|
7
10
|
import { createNode, getNode } from '../../../core/canvas/canvas.js';
|
|
8
|
-
import { contextDir,
|
|
9
|
-
import {
|
|
11
|
+
import { contextDir, viewSocketPath } from '../../../core/canvas/paths.js';
|
|
12
|
+
import { beginExecution, recordExecutionPid } from '../../../core/canvas/executions.js';
|
|
13
|
+
import { openTurn, recordFault } from '../../../core/canvas/recovery.js';
|
|
10
14
|
import { headlessBrokerHost } from '../../../core/runtime/host.js';
|
|
11
15
|
import { resetFleetForTests } from '../../../core/runtime/fleet.js';
|
|
12
16
|
import { bindTestFleet } from '../../../core/__tests__/helpers/fleet.js';
|
|
@@ -14,12 +18,21 @@ import { handleCreate } from '../handlers/nodes.js';
|
|
|
14
18
|
import { canvasRoutes } from '../handlers/canvas.js';
|
|
15
19
|
let home = '';
|
|
16
20
|
const previousHome = process.env['CRTR_HOME'];
|
|
21
|
+
const previousUserHome = process.env['HOME'];
|
|
17
22
|
const brokers = [];
|
|
18
23
|
const launchedBrokers = new Map();
|
|
19
24
|
let originalLaunch;
|
|
20
25
|
before(() => {
|
|
26
|
+
// macOS Unix-domain sockets have a short path limit; keep the canvas home short.
|
|
21
27
|
home = mkdtempSync('/tmp/crtr-snapshot-fields-');
|
|
22
28
|
process.env['CRTR_HOME'] = home;
|
|
29
|
+
// The launch-config worker resolves the user scope from HOME, so it must point
|
|
30
|
+
// at this fixture's throwaway home and that store must exist. Do NOT chdir:
|
|
31
|
+
// the worker is forked with the parent's cwd, and outside the repo it cannot
|
|
32
|
+
// resolve the tsx loader the source test lane runs under.
|
|
33
|
+
process.env['HOME'] = home;
|
|
34
|
+
initializeFreshScopedStore({ kind: 'user', root: userScopeRoot() });
|
|
35
|
+
migrate(openDb());
|
|
23
36
|
// Every launcher claims a slot from the ledger before it reaches the host, so
|
|
24
37
|
// a spawn in-process needs a bound fleet (D-2).
|
|
25
38
|
bindTestFleet();
|
|
@@ -42,11 +55,16 @@ after(async () => {
|
|
|
42
55
|
resolve();
|
|
43
56
|
})));
|
|
44
57
|
closeDb();
|
|
58
|
+
closeScopedStores();
|
|
45
59
|
rmSync(home, { recursive: true, force: true });
|
|
46
60
|
if (previousHome === undefined)
|
|
47
61
|
delete process.env['CRTR_HOME'];
|
|
48
62
|
else
|
|
49
63
|
process.env['CRTR_HOME'] = previousHome;
|
|
64
|
+
if (previousUserHome === undefined)
|
|
65
|
+
delete process.env['HOME'];
|
|
66
|
+
else
|
|
67
|
+
process.env['HOME'] = previousUserHome;
|
|
50
68
|
});
|
|
51
69
|
function meta(nodeId, overrides = {}) {
|
|
52
70
|
return {
|
|
@@ -114,9 +132,13 @@ test('one canvas snapshot carries title, brief, jobs, busy, latch, fault, and co
|
|
|
114
132
|
name: 'Busy outcome',
|
|
115
133
|
parent: liveJobId,
|
|
116
134
|
host_kind: 'broker',
|
|
117
|
-
pi_pid: process.pid,
|
|
118
135
|
}));
|
|
119
|
-
|
|
136
|
+
// The mid-turn cue is an open turn on the node's live execution, which the
|
|
137
|
+
// node row projects as `streaming` once its recorded pid is alive. pi_pid is a
|
|
138
|
+
// projection of the running execution, so the pid is stamped there.
|
|
139
|
+
const busyExecution = beginExecution(busyId, { daemonEpoch: null });
|
|
140
|
+
recordExecutionPid(busyExecution, busyId, process.pid);
|
|
141
|
+
openTurn(busyExecution, { reason: 'agent-start' });
|
|
120
142
|
const finalId = 'snapshot-final';
|
|
121
143
|
const finalizedAt = new Date().toISOString();
|
|
122
144
|
createNode(meta(finalId, {
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { after, afterEach, beforeEach, test } from 'node:test';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
|
-
import { mkdirSync, mkdtempSync,
|
|
3
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { ApiError } from '../../../api/errors.js';
|
|
7
|
+
import { readRawScopeConfig, updateRawConfigAtomically } from '../../../core/config.js';
|
|
7
8
|
import { resetScopeCache } from '../../../core/scope.js';
|
|
9
|
+
import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
|
|
8
10
|
import { modelConfigRoutes } from '../handlers/model-config.js';
|
|
9
11
|
const previousHome = process.env.HOME;
|
|
10
12
|
const previousAgentDir = process.env['PI_CODING_AGENT_DIR'];
|
|
@@ -29,6 +31,7 @@ beforeEach(() => {
|
|
|
29
31
|
writeFileSync(join(agentDir, 'models.json'), JSON.stringify({
|
|
30
32
|
providers: { northlight: { baseUrl: 'http://127.0.0.1:1', api: 'openai-completions', apiKey: 'test', models: ['u', 's', 'm', 'l'].map((id) => ({ id, name: id })) } },
|
|
31
33
|
}));
|
|
34
|
+
initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
|
|
32
35
|
resetScopeCache();
|
|
33
36
|
});
|
|
34
37
|
afterEach(() => {
|
|
@@ -55,19 +58,16 @@ function context(body) {
|
|
|
55
58
|
return { method: 'PUT', path: '/v1/model-config', params: {}, query: new URLSearchParams(), body };
|
|
56
59
|
}
|
|
57
60
|
test('PUT atomically replaces Core-owned blocks without touching unrelated config', async () => {
|
|
58
|
-
|
|
59
|
-
mkdirSync(join(home, '.crouter'));
|
|
60
|
-
writeFileSync(configPath, JSON.stringify({ completion_bell: false, kinds: { developer: { tools: ['bash'], model: 'old/strong', orchestratorModel: 'old/ultra' } } }));
|
|
61
|
+
updateRawConfigAtomically('user', () => ({ completion_bell: false, kinds: { developer: { tools: ['bash'], model: 'old/strong', orchestratorModel: 'old/ultra' } } }));
|
|
61
62
|
const result = await putRoute().handler(context(payload));
|
|
62
63
|
assert.deepEqual(result, { status: 200, body: { config_version: 'core-doc-digest', delivered: true } });
|
|
63
|
-
const written =
|
|
64
|
+
const written = readRawScopeConfig('user');
|
|
64
65
|
assert.equal(written.completion_bell, false);
|
|
65
|
-
assert.deepEqual(written.kinds
|
|
66
|
+
assert.deepEqual(written.kinds?.['developer'], { tools: ['bash'], model: 'cloud/medium', orchestratorModel: 'cloud/medium' });
|
|
66
67
|
assert.deepEqual(written.modelRoutes, payload.modelRoutes);
|
|
67
68
|
});
|
|
68
69
|
test('PUT rejects invalid payloads and absent baked refs before writing', async () => {
|
|
69
|
-
const configPath = join(home, '.crouter', 'config.json');
|
|
70
70
|
await assert.rejects(async () => putRoute().handler(context({ ...payload, modelRoutes: { ...payload.modelRoutes, northlight: { ...payload.modelRoutes.northlight, models: { strong: 'northlight/s' } } } })), (error) => error instanceof ApiError && error.status === 400 && error.code === 'invalid_request');
|
|
71
71
|
await assert.rejects(async () => putRoute().handler(context({ ...payload, modelRoutes: { ...payload.modelRoutes, northlight: { ...payload.modelRoutes.northlight, models: { ...payload.modelRoutes.northlight.models, ultra: 'northlight/missing' } } } })), (error) => error instanceof ApiError && error.status === 422 && error.code === 'unprocessable');
|
|
72
|
-
assert.
|
|
72
|
+
assert.equal(readRawScopeConfig('user'), null);
|
|
73
73
|
});
|
|
@@ -3,8 +3,12 @@ import assert from 'node:assert/strict';
|
|
|
3
3
|
import { createServer } from 'node:net';
|
|
4
4
|
import { mkdtempSync, rmSync } from 'node:fs';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
|
-
import { closeDb } from '../../../core/canvas/db.js';
|
|
6
|
+
import { closeDb, migrate, openDb } from '../../../core/canvas/db.js';
|
|
7
|
+
import { closeScopedStores } from '../../../core/scoped-state/db.js';
|
|
8
|
+
import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
|
|
9
|
+
import { userScopeRoot } from '../../../core/scope.js';
|
|
7
10
|
import { getNode } from '../../../core/canvas/canvas.js';
|
|
11
|
+
import { liveExecutionForNode } from '../../../core/canvas/executions.js';
|
|
8
12
|
import { nodeDir } from '../../../core/canvas/paths.js';
|
|
9
13
|
import { headlessBrokerHost } from '../../../core/runtime/host.js';
|
|
10
14
|
import { resetFleetForTests } from '../../../core/runtime/fleet.js';
|
|
@@ -12,14 +16,19 @@ import { bindTestFleet } from '../../../core/__tests__/helpers/fleet.js';
|
|
|
12
16
|
import { handleCreate, nodeRoutes } from '../handlers/nodes.js';
|
|
13
17
|
import { brokerOperationRoutes } from '../handlers/broker-ops.js';
|
|
14
18
|
let home = '';
|
|
15
|
-
let
|
|
19
|
+
let originalCanvasHome;
|
|
20
|
+
let originalUserHome;
|
|
16
21
|
let originalLaunch;
|
|
17
22
|
const brokers = [];
|
|
18
23
|
before(() => {
|
|
19
|
-
|
|
24
|
+
originalCanvasHome = process.env['CRTR_HOME'];
|
|
25
|
+
originalUserHome = process.env['HOME'];
|
|
20
26
|
// macOS Unix-domain sockets have a short path limit; keep the canvas home short.
|
|
21
27
|
home = mkdtempSync('/tmp/crtr-node-description-');
|
|
22
28
|
process.env['CRTR_HOME'] = home;
|
|
29
|
+
process.env['HOME'] = home;
|
|
30
|
+
initializeFreshScopedStore({ kind: 'user', root: userScopeRoot() });
|
|
31
|
+
migrate(openDb());
|
|
23
32
|
// Every launcher claims a slot from the ledger before it reaches the host, so
|
|
24
33
|
// a spawn in-process needs a bound fleet (D-2).
|
|
25
34
|
bindTestFleet();
|
|
@@ -41,11 +50,16 @@ after(async () => {
|
|
|
41
50
|
resolve();
|
|
42
51
|
})));
|
|
43
52
|
closeDb();
|
|
53
|
+
closeScopedStores();
|
|
44
54
|
rmSync(home, { recursive: true, force: true });
|
|
45
|
-
if (
|
|
55
|
+
if (originalCanvasHome === undefined)
|
|
46
56
|
delete process.env['CRTR_HOME'];
|
|
47
57
|
else
|
|
48
|
-
process.env['CRTR_HOME'] =
|
|
58
|
+
process.env['CRTR_HOME'] = originalCanvasHome;
|
|
59
|
+
if (originalUserHome === undefined)
|
|
60
|
+
delete process.env['HOME'];
|
|
61
|
+
else
|
|
62
|
+
process.env['HOME'] = originalUserHome;
|
|
49
63
|
});
|
|
50
64
|
function context(method, path, id, body) {
|
|
51
65
|
return {
|
|
@@ -75,7 +89,10 @@ test('node create stores caller description and automatic naming leaves it and n
|
|
|
75
89
|
assert.equal(detail.body.description, 'Review the worker conversation');
|
|
76
90
|
const generatedNameRoute = brokerOperationRoutes.find((route) => route.method === 'POST' && route.pattern === '/v1/nodes/:id/broker/generated-name');
|
|
77
91
|
assert.ok(generatedNameRoute);
|
|
92
|
+
const execution = liveExecutionForNode(nodeId);
|
|
93
|
+
assert.ok(execution);
|
|
78
94
|
const generated = await generatedNameRoute.handler(context('POST', `/v1/nodes/${nodeId}/broker/generated-name`, nodeId, {
|
|
95
|
+
expected_execution_id: execution.executionId,
|
|
79
96
|
kind: 'initial',
|
|
80
97
|
description: 'Generated replacement',
|
|
81
98
|
title: 'Generated replacement',
|
|
@@ -4,20 +4,31 @@ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { createNode, getNode, listNodes } from '../../../core/canvas/canvas.js';
|
|
7
|
-
import { closeDb } from '../../../core/canvas/db.js';
|
|
7
|
+
import { closeDb, migrate, openDb } from '../../../core/canvas/db.js';
|
|
8
8
|
import { CrtrError } from '../../../core/errors.js';
|
|
9
|
+
import { resetScopeCache } from '../../../core/scope.js';
|
|
10
|
+
import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
|
|
9
11
|
import { handleConfig, handleCreate, handlePromote, handleYield } from '../handlers/nodes.js';
|
|
10
12
|
const previousCrtrHome = process.env['CRTR_HOME'];
|
|
13
|
+
const previousHome = process.env.HOME;
|
|
14
|
+
const previousAgentDir = process.env['PI_CODING_AGENT_DIR'];
|
|
11
15
|
let home = '';
|
|
12
16
|
before(() => {
|
|
13
17
|
closeDb();
|
|
14
18
|
home = mkdtempSync(join(tmpdir(), 'crtr-node-model-validation-'));
|
|
19
|
+
process.env.HOME = home;
|
|
15
20
|
process.env['CRTR_HOME'] = home;
|
|
21
|
+
process.env['PI_CODING_AGENT_DIR'] = join(home, 'agent');
|
|
22
|
+
resetScopeCache();
|
|
16
23
|
});
|
|
17
24
|
beforeEach(() => {
|
|
18
25
|
closeDb();
|
|
19
26
|
rmSync(home, { recursive: true, force: true });
|
|
20
27
|
mkdirSync(home, { recursive: true });
|
|
28
|
+
resetScopeCache();
|
|
29
|
+
initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
|
|
30
|
+
initializeFreshScopedStore({ kind: 'provider', root: process.env['PI_CODING_AGENT_DIR'] });
|
|
31
|
+
migrate(openDb());
|
|
21
32
|
});
|
|
22
33
|
after(() => {
|
|
23
34
|
closeDb();
|
|
@@ -26,6 +37,15 @@ after(() => {
|
|
|
26
37
|
delete process.env['CRTR_HOME'];
|
|
27
38
|
else
|
|
28
39
|
process.env['CRTR_HOME'] = previousCrtrHome;
|
|
40
|
+
if (previousHome === undefined)
|
|
41
|
+
delete process.env.HOME;
|
|
42
|
+
else
|
|
43
|
+
process.env.HOME = previousHome;
|
|
44
|
+
if (previousAgentDir === undefined)
|
|
45
|
+
delete process.env['PI_CODING_AGENT_DIR'];
|
|
46
|
+
else
|
|
47
|
+
process.env['PI_CODING_AGENT_DIR'] = previousAgentDir;
|
|
48
|
+
resetScopeCache();
|
|
29
49
|
});
|
|
30
50
|
function node(id, cwd = home) {
|
|
31
51
|
return {
|
|
@@ -4,12 +4,11 @@ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { createNode } from '../../../core/canvas/canvas.js';
|
|
7
|
-
import { closeDb } from '../../../core/canvas/db.js';
|
|
7
|
+
import { closeDb, migrate, openDb } from '../../../core/canvas/db.js';
|
|
8
8
|
import { reportsDir } from '../../../core/canvas/paths.js';
|
|
9
9
|
import { invalidateTicketCounts } from '../../../core/canvas/attention.js';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import { submitPage } from '../../../core/human/tickets.js';
|
|
10
|
+
import { preparePage } from '../../../core/human/page-authoring.js';
|
|
11
|
+
import { createPageRequest } from '../../../core/human/requests.js';
|
|
13
12
|
import { handleList } from '../handlers/nodes.js';
|
|
14
13
|
const previousCrtrHome = process.env['CRTR_HOME'];
|
|
15
14
|
let home = '';
|
|
@@ -23,6 +22,7 @@ beforeEach(() => {
|
|
|
23
22
|
invalidateTicketCounts();
|
|
24
23
|
rmSync(home, { recursive: true, force: true });
|
|
25
24
|
mkdirSync(home, { recursive: true });
|
|
25
|
+
migrate(openDb());
|
|
26
26
|
});
|
|
27
27
|
after(() => {
|
|
28
28
|
closeDb();
|
|
@@ -74,18 +74,16 @@ test('list activity query composes profile, lifecycle, topology filters and repo
|
|
|
74
74
|
report('root', '20260817T090000', 'update', 'Started the task');
|
|
75
75
|
report('root', '20260817T100000', 'final', 'Finished the task');
|
|
76
76
|
report('root', '20260817T110000', 'update', 'Still monitoring the task');
|
|
77
|
-
createNode(node('bridge', { kind: 'human', parent: 'root' }));
|
|
78
77
|
const page = join(home, 'pending-page.tsx');
|
|
79
78
|
writeFileSync(page, `export default function PendingPage() {
|
|
80
79
|
return <Page title="Need a decision"><UserText id="answer" initialText="" /></Page>;
|
|
81
80
|
}
|
|
82
81
|
`);
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
sourceFile: page,
|
|
86
|
-
|
|
82
|
+
createPageRequest({
|
|
83
|
+
request_id: 'pending-page',
|
|
84
|
+
prepared: preparePage({ sourceFile: page, source: { nodeId: 'root' }, delivery: { placement: 'inline', inbox: true, reply: true } }),
|
|
85
|
+
requester_node_id: 'root',
|
|
87
86
|
});
|
|
88
|
-
bindTicketReplyRoute(ticket.dir, 'bridge');
|
|
89
87
|
invalidateTicketCounts();
|
|
90
88
|
createNode(node('child', { parent: 'root' }));
|
|
91
89
|
createNode(node('resident', { lifecycle: 'resident' }));
|
|
@@ -96,6 +94,6 @@ test('list activity query composes profile, lifecycle, topology filters and repo
|
|
|
96
94
|
assert.equal(roots[0].activity?.latest_report?.body, 'Still monitoring the task');
|
|
97
95
|
assert.equal(roots[0].activity?.pending_human_count, 1);
|
|
98
96
|
const children = list('profile_id=activity-profile-7f3a9c01&parent=root');
|
|
99
|
-
assert.deepEqual(children.map((row) => row.node_id), ['
|
|
100
|
-
assert.equal(children[
|
|
97
|
+
assert.deepEqual(children.map((row) => row.node_id), ['child']);
|
|
98
|
+
assert.equal(children[0].activity, undefined);
|
|
101
99
|
});
|
|
@@ -4,10 +4,11 @@ import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:
|
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { createNode, getNode, listNodes } from '../../../core/canvas/canvas.js';
|
|
7
|
-
import { closeDb } from '../../../core/canvas/db.js';
|
|
7
|
+
import { closeDb, migrate, openDb } from '../../../core/canvas/db.js';
|
|
8
8
|
import { CrtrError } from '../../../core/errors.js';
|
|
9
9
|
import { createProfile, loadProfileManifest, pauseProfile, profileManifestPath, ROOT_PROFILE_ID, setProfileDefaultKind } from '../../../core/profiles/manifest.js';
|
|
10
10
|
import { resetScopeCache } from '../../../core/scope.js';
|
|
11
|
+
import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
|
|
11
12
|
import { reviveNode } from '../../../core/runtime/revive.js';
|
|
12
13
|
import { resolveLaunchTarget } from '../../../core/runtime/launch-target.js';
|
|
13
14
|
import { spawnNode } from '../../../core/runtime/nodes.js';
|
|
@@ -25,6 +26,8 @@ beforeEach(() => {
|
|
|
25
26
|
process.env['CRTR_HOME'] = join(home, 'canvas');
|
|
26
27
|
mkdirSync(process.env['CRTR_HOME'], { recursive: true });
|
|
27
28
|
resetScopeCache();
|
|
29
|
+
initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
|
|
30
|
+
migrate(openDb());
|
|
28
31
|
});
|
|
29
32
|
afterEach(() => {
|
|
30
33
|
closeDb();
|
|
@@ -99,11 +102,11 @@ test('revive refuses a paused profile before launching a broker', async () => {
|
|
|
99
102
|
// (fork, cron spawn, warm-pool mint, `/new` relaunch, recycle) actually hits,
|
|
100
103
|
// because they all reach the canvas through spawnNode and none of them call
|
|
101
104
|
// handleCreate.
|
|
102
|
-
test('the birth gate refuses a paused profile for a daemon-side spawn', () => {
|
|
105
|
+
test('the birth gate refuses a paused profile for a daemon-side spawn', async () => {
|
|
103
106
|
const profile = createProfile('paused spawn', [{ path: cwd, memory: 'content' }]);
|
|
104
107
|
pauseProfile(profile.profileId);
|
|
105
108
|
const beforeRows = listNodes().length;
|
|
106
|
-
assert.
|
|
109
|
+
await assert.rejects(() => spawnNode({ kind: 'general', cwd, parent: null, profile_id: profile.profileId }), (error) => {
|
|
107
110
|
assert.ok(error instanceof CrtrError);
|
|
108
111
|
assert.equal(error.code, 'usage');
|
|
109
112
|
assert.match(error.details?.['next'], new RegExp(`crtr profile resume ${profile.profileId}`));
|
|
@@ -5,9 +5,10 @@ import { tmpdir } from 'node:os';
|
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { routes } from '../../../api/index.js';
|
|
7
7
|
import { CrtrError } from '../../../core/errors.js';
|
|
8
|
-
import { closeDb } from '../../../core/canvas/db.js';
|
|
8
|
+
import { closeDb, migrate, openDb } from '../../../core/canvas/db.js';
|
|
9
9
|
import { createProfile, loadProfileManifest } from '../../../core/profiles/manifest.js';
|
|
10
10
|
import { resetScopeCache } from '../../../core/scope.js';
|
|
11
|
+
import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
|
|
11
12
|
import { profileRoutes } from '../handlers/profiles.js';
|
|
12
13
|
const previousCrtrHome = process.env['CRTR_HOME'];
|
|
13
14
|
const previousHome = process.env.HOME;
|
|
@@ -17,6 +18,8 @@ beforeEach(() => {
|
|
|
17
18
|
home = mkdtempSync(join(tmpdir(), 'crtr-profile-metadata-home-'));
|
|
18
19
|
process.env.HOME = home;
|
|
19
20
|
process.env['CRTR_HOME'] = join(home, 'canvas');
|
|
21
|
+
initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
|
|
22
|
+
migrate(openDb());
|
|
20
23
|
resetScopeCache();
|
|
21
24
|
});
|
|
22
25
|
afterEach(() => {
|
|
@@ -2,27 +2,38 @@ import { after, before, beforeEach, test } from 'node:test';
|
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { mkdtempSync, rmSync } from 'node:fs';
|
|
4
4
|
import { createServer } from 'node:net';
|
|
5
|
-
import { createNode, getNode
|
|
5
|
+
import { createNode, getNode } from '../../../core/canvas/index.js';
|
|
6
6
|
import { armCron, getCron } from '../../../core/canvas/crons.js';
|
|
7
|
-
import { closeDb } from '../../../core/canvas/db.js';
|
|
7
|
+
import { closeDb, openDb, migrate } from '../../../core/canvas/db.js';
|
|
8
|
+
import { beginExecution, recordExecutionPid } from '../../../core/canvas/executions.js';
|
|
8
9
|
import { viewSocketPath } from '../../../core/canvas/paths.js';
|
|
9
|
-
|
|
10
|
+
function nodeMailCount(nodeId) {
|
|
11
|
+
return Number(openDb().prepare(`SELECT COUNT(*) AS count FROM deliveries
|
|
12
|
+
WHERE destination_kind = 'node_inbox' AND destination_id = ?`).get(nodeId).count);
|
|
13
|
+
}
|
|
10
14
|
import { headlessBrokerHost } from '../../../core/runtime/host.js';
|
|
11
15
|
import { bindTestFleet } from '../../../core/__tests__/helpers/fleet.js';
|
|
16
|
+
import { resetScopeCache } from '../../../core/scope.js';
|
|
17
|
+
import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
|
|
12
18
|
import { messageRoutes } from '../handlers/messages.js';
|
|
13
19
|
import { nodeRoutes } from '../handlers/nodes.js';
|
|
14
20
|
let home;
|
|
15
21
|
const priorHome = process.env['CRTR_HOME'];
|
|
22
|
+
const priorUserHome = process.env.HOME;
|
|
16
23
|
before(() => {
|
|
17
24
|
// macOS limits Unix-socket paths to 104 bytes; the system temp directory's
|
|
18
25
|
// per-user prefix is already most of that budget.
|
|
19
26
|
home = mkdtempSync('/tmp/crtr-reopen-');
|
|
27
|
+
process.env.HOME = home;
|
|
20
28
|
process.env['CRTR_HOME'] = home;
|
|
29
|
+
resetScopeCache();
|
|
21
30
|
});
|
|
22
31
|
beforeEach(() => {
|
|
23
32
|
closeDb();
|
|
24
33
|
rmSync(home, { recursive: true, force: true });
|
|
25
34
|
bindTestFleet();
|
|
35
|
+
initializeFreshScopedStore({ kind: 'user', root: `${home}/.crouter` });
|
|
36
|
+
migrate(openDb());
|
|
26
37
|
});
|
|
27
38
|
after(() => {
|
|
28
39
|
closeDb();
|
|
@@ -31,6 +42,11 @@ after(() => {
|
|
|
31
42
|
delete process.env['CRTR_HOME'];
|
|
32
43
|
else
|
|
33
44
|
process.env['CRTR_HOME'] = priorHome;
|
|
45
|
+
if (priorUserHome === undefined)
|
|
46
|
+
delete process.env.HOME;
|
|
47
|
+
else
|
|
48
|
+
process.env.HOME = priorUserHome;
|
|
49
|
+
resetScopeCache();
|
|
34
50
|
});
|
|
35
51
|
function node(id, lifecycle, status, piPid) {
|
|
36
52
|
return {
|
|
@@ -74,6 +90,8 @@ async function revive(id, body) {
|
|
|
74
90
|
return route.handler(ctx);
|
|
75
91
|
}
|
|
76
92
|
async function startLiveBroker(id, failDelivery = false) {
|
|
93
|
+
const executionId = beginExecution(id, { daemonEpoch: null });
|
|
94
|
+
recordExecutionPid(executionId, id, process.pid);
|
|
77
95
|
let observed = null;
|
|
78
96
|
const server = createServer((socket) => {
|
|
79
97
|
let pending = '';
|
|
@@ -162,7 +180,7 @@ test('reopen makes live terminal, finalized terminal, and parked targets residen
|
|
|
162
180
|
assertReopened(liveId);
|
|
163
181
|
assert.equal(liveBroker.deliveryState()?.lifecycle, 'resident', 'engine delivery sees resident lifecycle');
|
|
164
182
|
assert.equal(liveBroker.deliveryState()?.final_report, null, 'engine delivery sees no final latch');
|
|
165
|
-
assert.equal(
|
|
183
|
+
assert.equal(nodeMailCount(liveId), 0, 'live delivery does not create a durable delivery');
|
|
166
184
|
}
|
|
167
185
|
finally {
|
|
168
186
|
await liveBroker.close();
|
|
@@ -175,12 +193,12 @@ test('reopen makes live terminal, finalized terminal, and parked targets residen
|
|
|
175
193
|
finalize(finalizedId);
|
|
176
194
|
await sendMessage(finalizedId, { body: 'new mandate', reopen: true });
|
|
177
195
|
assertReopened(finalizedId);
|
|
178
|
-
assert.equal(
|
|
196
|
+
assert.equal(nodeMailCount(finalizedId), 1, 'finalized target receives one durable delivery after reopening');
|
|
179
197
|
const parkedId = 'parked-resident';
|
|
180
198
|
createNode(node(parkedId, 'resident', 'done'));
|
|
181
199
|
await sendMessage(parkedId, { body: 'resume the parked session', reopen: true });
|
|
182
200
|
assertReopened(parkedId);
|
|
183
|
-
assert.equal(
|
|
201
|
+
assert.equal(nodeMailCount(parkedId), 1, 'parked target receives one durable delivery after reopening');
|
|
184
202
|
}
|
|
185
203
|
finally {
|
|
186
204
|
headlessBrokerHost.launch = originalLaunch;
|
|
@@ -222,7 +240,7 @@ test('a reopen commit failure delivers nothing', async () => {
|
|
|
222
240
|
}
|
|
223
241
|
assert.equal(getNode(id)?.lifecycle, 'resident', 'lifecycle commit precedes the failed latch CAS');
|
|
224
242
|
assert.equal(getNode(id)?.final_report, finalReport, 'a failed CAS preserves the canonical-final pointer');
|
|
225
|
-
assert.equal(
|
|
243
|
+
assert.equal(nodeMailCount(id), 0, 'no durable delivery precedes a failed reopen commit');
|
|
226
244
|
});
|
|
227
245
|
test('a delivery failure after reopen leaves the target resident, unlatched, and without a message', async () => {
|
|
228
246
|
const id = 'delivery-failure';
|
|
@@ -234,7 +252,7 @@ test('a delivery failure after reopen leaves the target resident, unlatched, and
|
|
|
234
252
|
assertReopened(id);
|
|
235
253
|
assert.equal(broker.deliveryState()?.lifecycle, 'resident', 'failed engine delivery happened after reopen committed');
|
|
236
254
|
assert.equal(broker.deliveryState()?.final_report, null, 'failed engine delivery saw the cleared latch');
|
|
237
|
-
assert.equal(
|
|
255
|
+
assert.equal(nodeMailCount(id), 0, 'failed engine delivery creates no durable fallback delivery');
|
|
238
256
|
}
|
|
239
257
|
finally {
|
|
240
258
|
await broker.close();
|