@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
|
@@ -32,7 +32,9 @@ import { join } from 'node:path';
|
|
|
32
32
|
import { spawnSync } from 'node:child_process';
|
|
33
33
|
import { isDisconnected, TERMINAL_BY_CHOICE, listDisconnected } from '../runtime/revive-all.js';
|
|
34
34
|
import { createNode } from '../canvas/canvas.js';
|
|
35
|
-
import { closeDb } from '../canvas/db.js';
|
|
35
|
+
import { closeDb, migrate, openDb } from '../canvas/db.js';
|
|
36
|
+
import { beginExecution, recordExecutionPid } from '../canvas/executions.js';
|
|
37
|
+
import { bindSession } from '../canvas/sessions.js';
|
|
36
38
|
const ALIVE = () => true;
|
|
37
39
|
const DEAD = () => false;
|
|
38
40
|
function meta(over = {}) {
|
|
@@ -105,6 +107,7 @@ function deadPid() {
|
|
|
105
107
|
return r.pid ?? 0x7ffffffe;
|
|
106
108
|
}
|
|
107
109
|
function fabricate(id, over) {
|
|
110
|
+
const { pi_pid, pi_session_id = `uuid-${id}`, pi_session_file = null, ...node } = over;
|
|
108
111
|
createNode({
|
|
109
112
|
node_id: id,
|
|
110
113
|
name: id,
|
|
@@ -115,9 +118,15 @@ function fabricate(id, over) {
|
|
|
115
118
|
mode: 'base',
|
|
116
119
|
lifecycle: 'terminal',
|
|
117
120
|
status: 'active',
|
|
118
|
-
|
|
119
|
-
...over,
|
|
121
|
+
...node,
|
|
120
122
|
});
|
|
123
|
+
const executionId = beginExecution(id, { daemonEpoch: 'test' });
|
|
124
|
+
if (pi_session_id !== null || pi_session_file !== null) {
|
|
125
|
+
assert.equal(bindSession(id, { executionId, sessionId: pi_session_id, transcriptPath: pi_session_file }), 'bound');
|
|
126
|
+
}
|
|
127
|
+
if (pi_pid !== null && pi_pid !== undefined) {
|
|
128
|
+
assert.equal(recordExecutionPid(executionId, id, pi_pid), 'recorded');
|
|
129
|
+
}
|
|
121
130
|
closeDb();
|
|
122
131
|
}
|
|
123
132
|
before(() => {
|
|
@@ -127,6 +136,7 @@ before(() => {
|
|
|
127
136
|
beforeEach(() => {
|
|
128
137
|
closeDb();
|
|
129
138
|
rmSync(home, { recursive: true, force: true });
|
|
139
|
+
migrate(openDb());
|
|
130
140
|
});
|
|
131
141
|
after(() => {
|
|
132
142
|
closeDb();
|
|
@@ -15,7 +15,11 @@ import { tmpdir } from 'node:os';
|
|
|
15
15
|
import { join } from 'node:path';
|
|
16
16
|
import { createNode, getNode } from '../canvas/canvas.js';
|
|
17
17
|
import { jobDir } from '../canvas/paths.js';
|
|
18
|
-
import { closeDb } from '../canvas/db.js';
|
|
18
|
+
import { closeDb, migrate, openDb } from '../canvas/db.js';
|
|
19
|
+
import { resetSession } from '../canvas/sessions.js';
|
|
20
|
+
import { resetScopeCache } from '../scope.js';
|
|
21
|
+
import { closeScopedStores } from '../scoped-state/db.js';
|
|
22
|
+
import { initializeFreshScopedStore } from '../scoped-state/migrate.js';
|
|
19
23
|
import { bindDaemonEventSource, resetEventSourceForTests } from '../events/source.js';
|
|
20
24
|
import { resetFleetForTests } from '../runtime/fleet.js';
|
|
21
25
|
import { CANVAS_EXTENSIONS } from '../runtime/canvas-extensions.js';
|
|
@@ -25,6 +29,7 @@ import { deliverNodeMessage } from '../../daemon/messaging/node-message.js';
|
|
|
25
29
|
import { bindTestFleet } from './helpers/fleet.js';
|
|
26
30
|
let home;
|
|
27
31
|
let tf;
|
|
32
|
+
const previousHome = process.env['HOME'];
|
|
28
33
|
let seq = 0;
|
|
29
34
|
const originalLaunch = headlessBrokerHost.launch;
|
|
30
35
|
/** The real host contract, minus the process: register at the launch seam, so
|
|
@@ -37,7 +42,7 @@ function stubLaunch() {
|
|
|
37
42
|
};
|
|
38
43
|
}
|
|
39
44
|
function node(id, over = {}) {
|
|
40
|
-
|
|
45
|
+
const meta = {
|
|
41
46
|
node_id: id,
|
|
42
47
|
name: id,
|
|
43
48
|
created: new Date().toISOString(),
|
|
@@ -48,7 +53,11 @@ function node(id, over = {}) {
|
|
|
48
53
|
status: 'active',
|
|
49
54
|
host_kind: 'broker',
|
|
50
55
|
...over,
|
|
51
|
-
}
|
|
56
|
+
};
|
|
57
|
+
createNode(meta);
|
|
58
|
+
if (meta.pi_session_id != null) {
|
|
59
|
+
resetSession(id, { sessionId: meta.pi_session_id, transcriptPath: meta.pi_session_file ?? null });
|
|
60
|
+
}
|
|
52
61
|
return id;
|
|
53
62
|
}
|
|
54
63
|
/** Fill the ledger to the cap with live brokers. */
|
|
@@ -59,12 +68,19 @@ async function saturate() {
|
|
|
59
68
|
}
|
|
60
69
|
before(() => {
|
|
61
70
|
home = mkdtempSync(join(tmpdir(), 'crtr-revive-capacity-'));
|
|
62
|
-
process.env['
|
|
71
|
+
process.env['HOME'] = home;
|
|
72
|
+
process.env['CRTR_HOME'] = join(home, 'canvas');
|
|
63
73
|
process.env['CRTR_MAX_LIVE_BROKERS'] = '2';
|
|
64
74
|
resetEventSourceForTests();
|
|
65
75
|
bindDaemonEventSource();
|
|
66
76
|
});
|
|
67
77
|
beforeEach(() => {
|
|
78
|
+
closeDb();
|
|
79
|
+
closeScopedStores();
|
|
80
|
+
rmSync(home, { recursive: true, force: true });
|
|
81
|
+
resetScopeCache();
|
|
82
|
+
initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
|
|
83
|
+
migrate(openDb());
|
|
68
84
|
tf = bindTestFleet();
|
|
69
85
|
stubLaunch();
|
|
70
86
|
});
|
|
@@ -74,9 +90,15 @@ after(() => {
|
|
|
74
90
|
resetFleetForTests();
|
|
75
91
|
resetEventSourceForTests();
|
|
76
92
|
closeDb();
|
|
93
|
+
closeScopedStores();
|
|
77
94
|
delete process.env['CRTR_MAX_LIVE_BROKERS'];
|
|
78
95
|
delete process.env['CRTR_HOME'];
|
|
96
|
+
if (previousHome === undefined)
|
|
97
|
+
delete process.env['HOME'];
|
|
98
|
+
else
|
|
99
|
+
process.env['HOME'] = previousHome;
|
|
79
100
|
rmSync(home, { recursive: true, force: true });
|
|
101
|
+
resetScopeCache();
|
|
80
102
|
});
|
|
81
103
|
test('a refusing caller gets an error naming the cap and the live count, never a silent no-op', async () => {
|
|
82
104
|
await saturate();
|
|
@@ -11,9 +11,14 @@ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
|
11
11
|
import { tmpdir } from 'node:os';
|
|
12
12
|
import { join } from 'node:path';
|
|
13
13
|
import { createNode, getNode } from '../canvas/canvas.js';
|
|
14
|
+
import { ensureScopeInitialized } from '../config.js';
|
|
15
|
+
import { closeScopedStores } from '../scoped-state/db.js';
|
|
14
16
|
import { contextDir } from '../canvas/paths.js';
|
|
15
|
-
import { closeDb } from '../canvas/db.js';
|
|
16
|
-
import {
|
|
17
|
+
import { closeDb, migrate, openDb } from '../canvas/db.js';
|
|
18
|
+
import { enqueueNodeMail } from '../feed/messages.js';
|
|
19
|
+
import { acknowledgeNodeMail, acknowledgedNodeMailCount, claimNodeMail } from '../canvas/deliveries.js';
|
|
20
|
+
import { beginExecution, endExecution } from '../canvas/executions.js';
|
|
21
|
+
import { bindSession } from '../canvas/sessions.js';
|
|
17
22
|
import { transition } from '../runtime/lifecycle.js';
|
|
18
23
|
import { reviveNode } from '../runtime/revive.js';
|
|
19
24
|
import { headlessBrokerHost } from '../runtime/host.js';
|
|
@@ -21,6 +26,7 @@ import { resetFleetForTests } from '../runtime/fleet.js';
|
|
|
21
26
|
import { bindTestFleet } from './helpers/fleet.js';
|
|
22
27
|
let home;
|
|
23
28
|
let priorHome;
|
|
29
|
+
let priorUserHome;
|
|
24
30
|
let fleet;
|
|
25
31
|
let launches;
|
|
26
32
|
let originalLaunch;
|
|
@@ -42,6 +48,9 @@ function parkResident(id, ground = {}) {
|
|
|
42
48
|
pi_session_file: sessionFile,
|
|
43
49
|
};
|
|
44
50
|
createNode(meta);
|
|
51
|
+
const executionId = beginExecution(id, { daemonEpoch: 'test' });
|
|
52
|
+
assert.equal(bindSession(id, { executionId, sessionId: meta.pi_session_id, transcriptPath: sessionFile }), 'bound');
|
|
53
|
+
endExecution(executionId, { reason: 'parked test setup' });
|
|
45
54
|
mkdirSync(contextDir(id), { recursive: true });
|
|
46
55
|
if (ground.roadmap !== undefined)
|
|
47
56
|
writeFileSync(join(contextDir(id), 'roadmap.md'), ground.roadmap);
|
|
@@ -52,7 +61,7 @@ function parkResident(id, ground = {}) {
|
|
|
52
61
|
/** Durable wake-worthy mail, appended exactly as every message doorway appends
|
|
53
62
|
* it before calling reviveNode. */
|
|
54
63
|
function deliverMail(id, tier = 'normal') {
|
|
55
|
-
return
|
|
64
|
+
return enqueueNodeMail(id, { kind: 'message', label: 'work', bodyJson: { body: 'work' }, urgency: tier, wake: 1 });
|
|
56
65
|
}
|
|
57
66
|
/** Did this launch carry the fresh-revive kickoff? `buildReviveKickoff` always
|
|
58
67
|
* opens its card body with this sentence (src/core/runtime/kickoff.ts:325). */
|
|
@@ -67,12 +76,16 @@ function placements() {
|
|
|
67
76
|
before(() => {
|
|
68
77
|
home = mkdtempSync(join(tmpdir(), 'crtr-revive-parked-'));
|
|
69
78
|
priorHome = process.env['CRTR_HOME'];
|
|
79
|
+
priorUserHome = process.env['HOME'];
|
|
70
80
|
process.env['CRTR_HOME'] = home;
|
|
81
|
+
process.env['HOME'] = home;
|
|
71
82
|
});
|
|
72
83
|
beforeEach(() => {
|
|
73
84
|
closeDb();
|
|
74
85
|
rmSync(home, { recursive: true, force: true });
|
|
75
86
|
mkdirSync(home, { recursive: true });
|
|
87
|
+
ensureScopeInitialized('user', join(home, '.crouter'));
|
|
88
|
+
migrate(openDb());
|
|
76
89
|
resetFleetForTests();
|
|
77
90
|
fleet = bindTestFleet();
|
|
78
91
|
launches = [];
|
|
@@ -87,6 +100,7 @@ beforeEach(() => {
|
|
|
87
100
|
afterEach(() => {
|
|
88
101
|
headlessBrokerHost.launch = originalLaunch;
|
|
89
102
|
closeDb();
|
|
103
|
+
closeScopedStores();
|
|
90
104
|
resetFleetForTests();
|
|
91
105
|
});
|
|
92
106
|
after(() => {
|
|
@@ -95,6 +109,10 @@ after(() => {
|
|
|
95
109
|
delete process.env['CRTR_HOME'];
|
|
96
110
|
else
|
|
97
111
|
process.env['CRTR_HOME'] = priorHome;
|
|
112
|
+
if (priorUserHome === undefined)
|
|
113
|
+
delete process.env['HOME'];
|
|
114
|
+
else
|
|
115
|
+
process.env['HOME'] = priorUserHome;
|
|
98
116
|
});
|
|
99
117
|
test('a parked node with mail waiting resumes its main transcript and clears the marker', async () => {
|
|
100
118
|
parkResident('parked', { roadmap: '# Roadmap\n\n- one open item\n' });
|
|
@@ -120,7 +138,7 @@ test('an input-less revival of a parked node quietly resumes and injects no kick
|
|
|
120
138
|
assert.equal(result.resumed, true, 'nothing arrived, so there is nothing a fresh window would answer');
|
|
121
139
|
assert.deepEqual(placements(), [{ nodeId: 'quiet', resuming: true }]);
|
|
122
140
|
assert.equal(kickedOff(launches[0]), false, 'a quiet resume generates nothing');
|
|
123
|
-
assert.equal(
|
|
141
|
+
assert.equal(acknowledgedNodeMailCount('quiet'), 0, 'a quiet resume does not acknowledge mail');
|
|
124
142
|
const reopened = getNode('quiet');
|
|
125
143
|
assert.equal(reopened.status, 'active');
|
|
126
144
|
assert.equal(reopened.intent ?? null, null, 'the park marker clears on a quiet resume too');
|
|
@@ -130,12 +148,17 @@ test('deferred mail alone is not input, so the revival still resumes quietly', a
|
|
|
130
148
|
deliverMail('deferred', 'deferred');
|
|
131
149
|
assert.equal((await reviveNode('deferred', { resume: true, capacity: 'freeze' })).resumed, true);
|
|
132
150
|
assert.equal(kickedOff(launches[0]), false);
|
|
133
|
-
assert.equal(
|
|
151
|
+
assert.equal(acknowledgedNodeMailCount('deferred'), 0, 'the deferred delivery rides the next natural cycle, unacknowledged');
|
|
134
152
|
});
|
|
135
|
-
test('mail already
|
|
153
|
+
test('mail already acknowledged by an earlier execution is not input, so the revival still resumes quietly', async () => {
|
|
136
154
|
parkResident('stale', { roadmap: '# Roadmap\n\n- one open item\n' });
|
|
137
|
-
|
|
138
|
-
|
|
155
|
+
const delivery = deliverMail('stale');
|
|
156
|
+
const executionId = beginExecution('stale', { daemonEpoch: 'test' });
|
|
157
|
+
const claim = claimNodeMail('stale', executionId, 'wake');
|
|
158
|
+
assert.equal(claim.deliveries.length, 1, 'the earlier execution claims the delivery');
|
|
159
|
+
assert.deepEqual(acknowledgeNodeMail('stale', executionId, [{ deliveryId: delivery.deliveryId, attempts: claim.deliveries[0].attempts, disposition: 'acknowledged' }]).results, [{ deliveryId: delivery.deliveryId, outcome: 'acknowledged' }], 'the prior handoff has an explicit SQL acknowledgement');
|
|
160
|
+
endExecution(executionId, { reason: 'test complete' });
|
|
161
|
+
assert.equal((await reviveNode('stale', { resume: true, capacity: 'freeze' })).resumed, true, 'only pending wake deliveries count as input');
|
|
139
162
|
assert.equal(kickedOff(launches[0]), false);
|
|
140
163
|
});
|
|
141
164
|
test('a parked node with no goal and no roadmap resumes its transcript rather than waking amnesiac', async () => {
|
|
@@ -65,7 +65,7 @@ const brokerPid = () => h.node(id).pi_pid;
|
|
|
65
65
|
// engine AND the streaming AgentSessionEvents are fanned out to the client
|
|
66
66
|
// VERBATIM. Failure mode: a broken relay/fan-out (viewer sees nothing).
|
|
67
67
|
test('G1 — controller prompt runs the engine and the streamed AgentSessionEvents relay to the client', async () => {
|
|
68
|
-
const c = await
|
|
68
|
+
const c = await attachUntil(id, 'controller', 'g1-ctrl', (a) => a.welcome.role === 'controller' && a.welcome.snapshot.state.isStreaming === false, 'G1 controller admitted while the engine is idle');
|
|
69
69
|
assert.equal(c.welcome.role, 'controller', 'first controller is admitted as controller');
|
|
70
70
|
const token = tok('G1-PROMPT');
|
|
71
71
|
c.send({ type: 'prompt', text: token });
|
|
@@ -14,8 +14,9 @@ import { after, before, test } from 'node:test';
|
|
|
14
14
|
import assert from 'node:assert/strict';
|
|
15
15
|
import { createNode } from '../../canvas/canvas.js';
|
|
16
16
|
import { closeDb } from '../../canvas/db.js';
|
|
17
|
+
import { resetSession } from '../../canvas/sessions.js';
|
|
17
18
|
import { isPidAlive } from '../../canvas/pid.js';
|
|
18
|
-
import {
|
|
19
|
+
import { enqueueNodeMail } from '../../feed/messages.js';
|
|
19
20
|
import { closeNode } from '../../runtime/close.js';
|
|
20
21
|
import { headlessBrokerHost } from '../../runtime/host.js';
|
|
21
22
|
import { transition } from '../../runtime/lifecycle.js';
|
|
@@ -116,7 +117,7 @@ test('a birth at the cap freezes instead of booting, survives saturated ticks, a
|
|
|
116
117
|
await h.awaitFleetExit(second);
|
|
117
118
|
const filler = await h.spawnHeadlessChild(root, 'terminal thaw filler');
|
|
118
119
|
assert.equal(h.fleet.size(), 2, 'the parked target is non-live while the cap remains full');
|
|
119
|
-
|
|
120
|
+
enqueueNodeMail(second, { senderNodeId: root, kind: 'message', label: 'durable wake', urgency: 'normal', wake: 1 });
|
|
120
121
|
assert.equal((await reviveNode(second, { resume: true, capacity: 'freeze' })).outcome, 'frozen');
|
|
121
122
|
closeDb();
|
|
122
123
|
const frozenTerminal = h.node(second);
|
|
@@ -142,8 +143,8 @@ test('a birth at the cap freezes instead of booting, survives saturated ticks, a
|
|
|
142
143
|
host_kind: 'broker',
|
|
143
144
|
parent: root,
|
|
144
145
|
created: new Date().toISOString(),
|
|
145
|
-
pi_session_id: 'resident-drain-session',
|
|
146
146
|
});
|
|
147
|
+
resetSession('resident-drain', { sessionId: 'resident-drain-session', transcriptPath: null });
|
|
147
148
|
assert.equal((await reviveNode('resident-drain', { resume: true, capacity: 'freeze' })).outcome, 'frozen');
|
|
148
149
|
await h.tick();
|
|
149
150
|
closeDb();
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Daemon-epoch broker ownership, real-process crash and teardown. The broker's
|
|
4
4
|
// supervision tick is the death authority after the broker exit is observed: a SIGTERM of a streaming broker
|
|
5
|
-
// aborts cleanly and resumes the saved session
|
|
6
|
-
// SIGKILL mid-turn —
|
|
5
|
+
// aborts cleanly and resumes the saved session, and a
|
|
6
|
+
// SIGKILL mid-turn — with the durable open-turn record — resumes
|
|
7
7
|
// that same saved session in place and re-drives the stopped turn with the
|
|
8
8
|
// same continuation (both policy row 5). Each replacement starts only after the
|
|
9
9
|
// prior process has exited, preserving one writer per session. A clean `node
|
|
@@ -23,9 +23,8 @@ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
|
23
23
|
import { join } from 'node:path';
|
|
24
24
|
import { createHarness } from '../helpers/harness.js';
|
|
25
25
|
import { isPidAlive } from '../../canvas/pid.js';
|
|
26
|
-
import {
|
|
26
|
+
import { readLiveTurn } from '../../canvas/recovery.js';
|
|
27
27
|
import { RUNTIME_RESTART_CONTINUATION } from '../../runtime/kickoff.js';
|
|
28
|
-
import { jobDir } from '../../canvas/paths.js';
|
|
29
28
|
let h;
|
|
30
29
|
let root;
|
|
31
30
|
let priorHoldTurn;
|
|
@@ -44,24 +43,23 @@ after(async () => {
|
|
|
44
43
|
process.env['PI_FAKE_ENGINE_HOLD_TURN'] = priorHoldTurn;
|
|
45
44
|
});
|
|
46
45
|
// Items 4 + 5 + 6 — two independent real-process journeys:
|
|
47
|
-
// graceful busy teardown → strict resume
|
|
46
|
+
// graceful busy teardown → strict resume;
|
|
48
47
|
// dirty interrupted-turn crash → recovery cycle → close.
|
|
49
|
-
test('SIGTERM of a busy broker aborts cleanly and resumes
|
|
48
|
+
test('SIGTERM of a busy broker aborts cleanly and resumes the saved session', { timeout: 30_000 }, async () => {
|
|
50
49
|
const id = await h.spawnHeadlessChild(root, 'headless worker — graceful crash recovery');
|
|
51
50
|
const boot1 = await h.awaitBoot(id);
|
|
52
51
|
const oldPid = h.node(id).pi_pid;
|
|
53
52
|
assert.equal(oldPid, boot1.pid, 'canvas pid identifies the broker that booted the session');
|
|
54
53
|
assert.equal(isPidAlive(oldPid), true, 'busy broker alive before graceful teardown');
|
|
55
54
|
await h.waitFor(() => existsSync(h.brokerSock(id)), { label: 'broker socket bound' });
|
|
56
|
-
await h.waitFor(() =>
|
|
55
|
+
await h.waitFor(() => readLiveTurn(id)?.busy === true, { label: 'fixture turn is active before SIGTERM' });
|
|
57
56
|
assert.equal(h.node(id).intent ?? null, null, 'fresh broker has a null intent (not refresh/idle-release)');
|
|
58
57
|
const boots = h.bootCount(id);
|
|
59
58
|
// SIGTERM exercises broker.ts's bounded session.abort() path. Its REAL child
|
|
60
|
-
// exit
|
|
59
|
+
// exit closes the broker's durable turn as teardown-aborted; the supervision tick
|
|
61
60
|
// classifies it and persists the first-failure backoff.
|
|
62
61
|
process.kill(oldPid, 'SIGTERM');
|
|
63
62
|
await h.waitFor(() => !isPidAlive(oldPid), { label: 'gracefully torn-down broker pid is dead' });
|
|
64
|
-
assert.equal(existsSync(join(jobDir(id), 'clean-abort')), true, 'settled abort leaves durable clean-abort evidence before supervision classifies it');
|
|
65
63
|
await h.awaitFleetExit(id);
|
|
66
64
|
await h.tick();
|
|
67
65
|
const gracefulBackoff = h.node(id);
|
|
@@ -73,7 +71,6 @@ test('SIGTERM of a busy broker aborts cleanly and resumes with a continuation',
|
|
|
73
71
|
// matures on a supervision tick.
|
|
74
72
|
const boot2 = await h.awaitBoot(id, { minCount: boots + 1, timeoutMs: 25_000 });
|
|
75
73
|
assert.equal(boot2.resuming, true, 'clean-abort tick-driven recovery RESUMES the saved .jsonl');
|
|
76
|
-
assert.equal(boot2.prompt, RUNTIME_RESTART_CONTINUATION, 'the strict resume injects the runtime-restart continuation');
|
|
77
74
|
assert.ok(!boot2.rawArgv.includes('--crtr-new-cycle'), 'clean abort never starts a recovery cycle');
|
|
78
75
|
const revivedPid = h.node(id).pi_pid;
|
|
79
76
|
assert.ok(revivedPid != null && isPidAlive(revivedPid), 'the revived broker pid is alive');
|
|
@@ -87,12 +84,12 @@ test('SIGKILL of a busy broker resumes the interrupted turn in place; close tear
|
|
|
87
84
|
const busyPid = h.node(id).pi_pid;
|
|
88
85
|
assert.equal(busyPid, boot1.pid, 'canvas pid identifies the broker that owns the dirty-crash session');
|
|
89
86
|
assert.equal(isPidAlive(busyPid), true, 'busy broker is alive before SIGKILL');
|
|
90
|
-
// This broker has
|
|
91
|
-
//
|
|
87
|
+
// This broker has an open durable turn — SIGKILL cannot run the abort handler
|
|
88
|
+
// to close it. The saved transcript is still
|
|
92
89
|
// resumable (pi persists whole entries), so policy resumes it strictly and
|
|
93
90
|
// the respawn continuation re-drives the stopped turn, after this journey's
|
|
94
91
|
// first 5s backoff. A dirty death is not a reason to throw the branch away.
|
|
95
|
-
|
|
92
|
+
await h.waitFor(() => readLiveTurn(id)?.busy === true, { label: 'fixture turn is active before SIGKILL' });
|
|
96
93
|
process.kill(busyPid, 'SIGKILL');
|
|
97
94
|
await h.waitFor(() => !isPidAlive(busyPid), { label: 'mid-turn crashed broker pid is dead' });
|
|
98
95
|
await h.awaitFleetExit(id);
|
|
@@ -107,7 +104,7 @@ test('SIGKILL of a busy broker resumes the interrupted turn in place; close tear
|
|
|
107
104
|
// path, including a cycle; production distinguishes cycling with the argv
|
|
108
105
|
// token and non-null kickoff. Assert those load-bearing inputs directly.
|
|
109
106
|
const recoveryArgv = boot2.rawArgv;
|
|
110
|
-
assert.ok(!recoveryArgv.includes('--crtr-new-cycle'), 'a surviving
|
|
107
|
+
assert.ok(!recoveryArgv.includes('--crtr-new-cycle'), 'a surviving open turn resumes the saved session — it never opens a fresh cycle');
|
|
111
108
|
assert.equal(boot2.prompt, RUNTIME_RESTART_CONTINUATION, 'the strict resume injects the runtime-restart continuation that re-drives the interrupted turn');
|
|
112
109
|
const recoveryPid = h.node(id).pi_pid;
|
|
113
110
|
assert.ok(recoveryPid != null && isPidAlive(recoveryPid), 'the recovered broker pid is alive');
|