@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
package/dist/core/feed/feed.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
// Push engine for the canvas report spine.
|
|
2
2
|
import { existsSync, linkSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
|
-
import { join } from 'node:path';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
4
|
import { randomUUID } from 'node:crypto';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
5
|
+
import { reportsDir, cancelCronsOnWake, getNode } from '../canvas/index.js';
|
|
6
|
+
import { openDb, withCanvasWrite } from '../canvas/db.js';
|
|
7
|
+
import { activateArmedExternalActionDelivery, readExternalActionDelivery } from '../canvas/deliveries.js';
|
|
8
|
+
import { composeNodeOutcomeDocument } from '../runtime/outcome-document.js';
|
|
9
|
+
import { syncDirectory, syncFile } from '../fs-utils.js';
|
|
10
|
+
import { enqueueSubscriberMail } from './messages.js';
|
|
8
11
|
import { operationIdContext } from '../events/operation-id.js';
|
|
9
12
|
export class FinalizationError extends Error {
|
|
10
13
|
code;
|
|
@@ -15,17 +18,6 @@ export class FinalizationError extends Error {
|
|
|
15
18
|
this.reportPath = reportPath;
|
|
16
19
|
}
|
|
17
20
|
}
|
|
18
|
-
export class FinalDeliveryError extends Error {
|
|
19
|
-
reportPath;
|
|
20
|
-
deliveredTo;
|
|
21
|
-
failedTo;
|
|
22
|
-
constructor(reportPath, deliveredTo, failedTo) {
|
|
23
|
-
super(`canonical final committed at ${reportPath}; delivery failed for ${failedTo.join(', ')}`);
|
|
24
|
-
this.reportPath = reportPath;
|
|
25
|
-
this.deliveredTo = deliveredTo;
|
|
26
|
-
this.failedTo = failedTo;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
21
|
function compactTs(d) {
|
|
30
22
|
const pad = (n, w = 2) => String(n).padStart(w, '0');
|
|
31
23
|
return `${d.getUTCFullYear()}${pad(d.getUTCMonth() + 1)}${pad(d.getUTCDate())}T${pad(d.getUTCHours())}${pad(d.getUTCMinutes())}${pad(d.getUTCSeconds())}${pad(d.getUTCMilliseconds(), 3)}`;
|
|
@@ -40,12 +32,23 @@ function stageReport(nodeId, kind, body) {
|
|
|
40
32
|
const stagedPath = join(dir, `.${basename}.${randomUUID()}.tmp`);
|
|
41
33
|
const ts = now.toISOString();
|
|
42
34
|
writeFileSync(stagedPath, `---\nnode: ${nodeId}\nkind: ${kind}\nts: ${ts}\n---\n${body}`, 'utf8');
|
|
35
|
+
syncFile(stagedPath);
|
|
43
36
|
return { finalPath, stagedPath, basename, ts };
|
|
44
37
|
}
|
|
45
38
|
/** Install without replacement. link(2) fails if another writer already owns the name. */
|
|
46
39
|
function install(staged) {
|
|
47
|
-
|
|
48
|
-
|
|
40
|
+
let linked = false;
|
|
41
|
+
try {
|
|
42
|
+
linkSync(staged.stagedPath, staged.finalPath);
|
|
43
|
+
linked = true;
|
|
44
|
+
rmSync(staged.stagedPath, { force: true });
|
|
45
|
+
syncDirectory(dirname(staged.finalPath));
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (linked)
|
|
49
|
+
rmSync(staged.finalPath, { force: true });
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
49
52
|
}
|
|
50
53
|
function firstLine(text, maxLen = 80) {
|
|
51
54
|
const line = text.split('\n')[0] ?? '';
|
|
@@ -55,29 +58,29 @@ function firstLine(text, maxLen = 80) {
|
|
|
55
58
|
function tierFor(kind, requestedTier) {
|
|
56
59
|
return requestedTier ?? (kind === 'urgent' ? 'urgent' : 'normal');
|
|
57
60
|
}
|
|
58
|
-
function
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if (sub.active) {
|
|
66
|
-
appendInbox(sub.node_id, entry);
|
|
67
|
-
cancelCronsOnWake(sub.node_id);
|
|
68
|
-
}
|
|
69
|
-
else
|
|
70
|
-
appendPassive(sub.node_id, entry);
|
|
71
|
-
deliveredTo.push(sub.node_id);
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
failedTo.push(sub.node_id);
|
|
75
|
-
}
|
|
61
|
+
function outcomeAction(nodeId) {
|
|
62
|
+
const delivery = readExternalActionDelivery(`node-outcome:${nodeId}`);
|
|
63
|
+
if (delivery === null)
|
|
64
|
+
return null;
|
|
65
|
+
const adapter = delivery.adapter;
|
|
66
|
+
if (adapter?.adapter !== 'subprocess' || !Array.isArray(adapter.argv) || !adapter.argv.every((entry) => typeof entry === 'string') || typeof adapter.cwd !== 'string') {
|
|
67
|
+
throw new Error(`outcome delivery ${delivery.deliveryId} has an invalid subprocess adapter`);
|
|
76
68
|
}
|
|
77
|
-
return {
|
|
69
|
+
return { name: delivery.destinationId, payload: adapter.payload ?? null };
|
|
70
|
+
}
|
|
71
|
+
function enqueueReport(subscribers, from, fromName, kind, requestedTier, reportRef, body, disposition) {
|
|
72
|
+
return enqueueSubscriberMail(subscribers, {
|
|
73
|
+
kind,
|
|
74
|
+
label: firstLine(body),
|
|
75
|
+
senderNodeId: from,
|
|
76
|
+
senderName: fromName,
|
|
77
|
+
bodyRef: reportRef,
|
|
78
|
+
urgency: tierFor(kind, requestedTier),
|
|
79
|
+
...(disposition === undefined ? {} : { disposition }),
|
|
80
|
+
}).map((delivery) => delivery.destinationNodeId);
|
|
78
81
|
}
|
|
79
82
|
/** Claim the one canonical final while holding SQLite's write lock. */
|
|
80
|
-
function commitCanonicalFinal(nodeId, staged, outcome) {
|
|
83
|
+
function commitCanonicalFinal(nodeId, staged, body, from, fromName, disposition, outcome) {
|
|
81
84
|
const db = openDb();
|
|
82
85
|
let installed = false;
|
|
83
86
|
db.exec('BEGIN IMMEDIATE');
|
|
@@ -92,30 +95,37 @@ function commitCanonicalFinal(nodeId, staged, outcome) {
|
|
|
92
95
|
if (row.status !== 'active' && row.status !== 'idle' && row.status !== 'done')
|
|
93
96
|
throw new FinalizationError('finalization_forbidden');
|
|
94
97
|
const subscribers = db.prepare(`SELECT from_id AS node_id, active, created FROM edges WHERE type = 'subscribes_to' AND to_id = ? ORDER BY created`).all(nodeId).map((row) => ({ node_id: row['node_id'], active: row['active'] === 1, created: row['created'] }));
|
|
95
|
-
const delivery = readOutcomeDelivery(nodeId);
|
|
96
98
|
const node = getNode(nodeId);
|
|
97
99
|
const recordsOutcome = node?.kind !== 'human';
|
|
98
100
|
const revision = (node?.outcome_revision ?? 0) + 1;
|
|
99
101
|
const outcomeKind = outcome?.kind ?? 'result';
|
|
100
102
|
const outcomeReason = outcome?.reason ?? 'finalized';
|
|
101
103
|
const outcomeDetailJson = outcome?.detailJson ?? null;
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
+
const action = node === null ? null : outcomeAction(nodeId);
|
|
105
|
+
const documentJson = !recordsOutcome || action === null || node === null ? null : JSON.stringify(composeNodeOutcomeDocument({
|
|
106
|
+
node: { ...node, status: 'done', intent: 'done', terminal_reason: outcomeReason },
|
|
104
107
|
outcome: { kind: outcomeKind, reason: outcomeReason, at: staged.ts, revision, detailJson: outcomeDetailJson },
|
|
105
|
-
action
|
|
108
|
+
action,
|
|
106
109
|
finalReport: staged.basename,
|
|
107
|
-
});
|
|
110
|
+
}));
|
|
108
111
|
install(staged);
|
|
109
112
|
installed = true;
|
|
110
113
|
if (recordsOutcome) {
|
|
111
114
|
db.prepare("UPDATE nodes SET status = 'done', intent = 'done', terminal_reason = ?, final_report = ?, finalized_at = ?, outcome_kind = ?, outcome_reason = ?, outcome_at = ?, outcome_revision = outcome_revision + 1, outcome_detail_json = ? WHERE node_id = ? AND final_report IS NULL").run(outcomeReason, staged.basename, staged.ts, outcomeKind, outcomeReason, staged.ts, outcomeDetailJson, nodeId);
|
|
112
|
-
|
|
115
|
+
if (documentJson !== null)
|
|
116
|
+
activateArmedExternalActionDelivery(db, {
|
|
117
|
+
idempotencyKey: `node-outcome:${nodeId}`,
|
|
118
|
+
label: nodeId,
|
|
119
|
+
bodyJson: documentJson,
|
|
120
|
+
supersede: true,
|
|
121
|
+
}, Date.now());
|
|
113
122
|
}
|
|
114
123
|
else {
|
|
115
124
|
db.prepare("UPDATE nodes SET status = 'done', intent = 'done', terminal_reason = 'finalized', final_report = ?, finalized_at = ? WHERE node_id = ? AND final_report IS NULL").run(staged.basename, staged.ts, nodeId);
|
|
116
125
|
}
|
|
126
|
+
const deliveredTo = enqueueReport(subscribers, from, fromName, 'final', undefined, `${nodeId}:reports/${staged.basename}`, body, disposition);
|
|
117
127
|
db.exec('COMMIT');
|
|
118
|
-
return {
|
|
128
|
+
return { deliveredTo };
|
|
119
129
|
}
|
|
120
130
|
catch (err) {
|
|
121
131
|
db.exec('ROLLBACK');
|
|
@@ -138,7 +148,7 @@ async function pushWithContext(nodeId, opts) {
|
|
|
138
148
|
const from = opts.from ?? nodeId;
|
|
139
149
|
const fromName = getNode(from)?.name;
|
|
140
150
|
if (opts.kind === 'final') {
|
|
141
|
-
const {
|
|
151
|
+
const { deliveredTo } = commitCanonicalFinal(nodeId, staged, opts.body, from, fromName, opts.disposition, opts.outcome);
|
|
142
152
|
// The finalization latch ends every wait this node was holding. It flips the
|
|
143
153
|
// row to done DIRECTLY (not through lifecycle's `finish` event), so the
|
|
144
154
|
// deadline cleanup must ride here too: an armed deadline outliving the final
|
|
@@ -147,18 +157,23 @@ async function pushWithContext(nodeId, opts) {
|
|
|
147
157
|
// cancel-on-wake rows anchored here go; standing crons survive. Outside
|
|
148
158
|
// commitCanonicalFinal's transaction — it takes its own write boundary.
|
|
149
159
|
cancelCronsOnWake(nodeId);
|
|
150
|
-
const { deliveredTo, failedTo } = deliver(subscribers, from, fromName, opts.kind, undefined, `${nodeId}:reports/${staged.basename}`, opts.body, opts.disposition);
|
|
151
|
-
if (failedTo.length > 0)
|
|
152
|
-
throw new FinalDeliveryError(staged.finalPath, deliveredTo, failedTo);
|
|
153
160
|
return { reportPath: staged.finalPath, deliveredTo };
|
|
154
161
|
}
|
|
162
|
+
let installed = false;
|
|
155
163
|
try {
|
|
156
164
|
install(staged);
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
165
|
+
installed = true;
|
|
166
|
+
const deliveredTo = withCanvasWrite((db) => {
|
|
167
|
+
const subscribers = db.prepare(`SELECT from_id AS node_id, active, created FROM edges WHERE type = 'subscribes_to' AND to_id = ? ORDER BY created`).all(nodeId).map((row) => ({ node_id: row['node_id'], active: row['active'] === 1, created: row['created'] }));
|
|
168
|
+
return enqueueReport(subscribers, from, fromName, opts.kind, opts.deliveryTier, `${nodeId}:reports/${staged.basename}`, opts.body, opts.disposition);
|
|
169
|
+
});
|
|
160
170
|
return { reportPath: staged.finalPath, deliveredTo };
|
|
161
171
|
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
if (installed)
|
|
174
|
+
rmSync(staged.finalPath, { force: true });
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
162
177
|
finally {
|
|
163
178
|
rmSync(staged.stagedPath, { force: true });
|
|
164
179
|
}
|
|
@@ -182,9 +197,6 @@ export function redeliverFinalReport(nodeId, originNodeId, reportBasename, body,
|
|
|
182
197
|
if (reportBasename === '' || reportBasename.includes('/') || reportBasename.includes('\\')) {
|
|
183
198
|
throw new Error(`invalid canonical final report basename: ${reportBasename}`);
|
|
184
199
|
}
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
if (failedTo.length > 0)
|
|
188
|
-
throw new FinalDeliveryError(reportPath, deliveredTo, failedTo);
|
|
189
|
-
return { reportPath, deliveredTo };
|
|
200
|
+
const deliveredTo = enqueueReport([{ node_id: originNodeId, active: true, created: '' }], nodeId, getNode(nodeId)?.name, 'final', undefined, `${nodeId}:reports/${reportBasename}`, body, opts?.disposition);
|
|
201
|
+
return { reportPath: join(reportsDir(nodeId), reportBasename), deliveredTo };
|
|
190
202
|
}
|
|
@@ -1,110 +1,36 @@
|
|
|
1
1
|
import type { OperationId } from '../events/types.js';
|
|
2
|
+
import type { ClaimedNodeMail } from '../canvas/deliveries.js';
|
|
2
3
|
export type InboxTier = 'critical' | 'urgent' | 'normal' | 'deferred';
|
|
3
4
|
export type InboxKind = 'update' | 'urgent' | 'final' | 'message' | 'completed';
|
|
4
5
|
export type InboxDisposition = 'human-answer' | 'human-canceled';
|
|
5
6
|
export type InboxEntryId = string & {
|
|
6
7
|
readonly __inboxEntryId: unique symbol;
|
|
7
8
|
};
|
|
8
|
-
/**
|
|
9
|
-
* `<node-id>:reports/<basename>` history handle, no inline body), or a direct
|
|
10
|
-
* message/system notice (short bodies inline via `data.body`; bodies too long
|
|
11
|
-
* to inline spill to `messages/` and carry an absolute filesystem `ref` plus
|
|
12
|
-
* a bounded inline preview). */
|
|
9
|
+
/** The rendering projection of one immutable SQL message and its delivery. */
|
|
13
10
|
export interface InboxEntry {
|
|
14
|
-
/** Unique physical-entry identity. It is opaque and never sortable. */
|
|
15
11
|
entry_id: InboxEntryId;
|
|
16
|
-
/** Correlation identity inherited from the producing operation. */
|
|
17
12
|
operation_id: OperationId;
|
|
18
|
-
/** ISO 8601 timestamp of delivery (display only). */
|
|
19
13
|
ts: string;
|
|
20
|
-
/** Node id of the sender, or null for system-generated entries. */
|
|
21
14
|
from: string | null;
|
|
22
|
-
/** Display-name snapshot captured when a node created the entry. */
|
|
23
15
|
from_name?: string;
|
|
24
|
-
/** Priority band for the receiver's attention. */
|
|
25
16
|
tier: InboxTier;
|
|
26
|
-
/** Semantic kind of the push event. */
|
|
27
17
|
kind: InboxKind;
|
|
28
|
-
/** Canonical `<node-id>:reports/<basename>` history ref for a push, or an
|
|
29
|
-
* absolute path to the spilled body file under `messages/` for an oversized
|
|
30
|
-
* direct message/system notice. */
|
|
31
18
|
ref?: string;
|
|
32
|
-
/** First ~80 chars of the body's first line — enough to decide if it matters. */
|
|
33
19
|
label: string;
|
|
34
|
-
/** Arbitrary structured payload for non-push message entries. */
|
|
35
20
|
data?: Record<string, unknown>;
|
|
36
|
-
/** Set only by the human-ticket settlement paths; absent means an ordinary report. */
|
|
37
21
|
disposition?: InboxDisposition;
|
|
38
22
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
/** Complete an entry exactly once before any spill or append work. */
|
|
43
|
-
export declare function finalizeInboxEntry(input: InboxEntryInput): InboxEntry;
|
|
44
|
-
/** Atomically append one finalized inbox entry to `nodes/<nodeId>/inbox.jsonl`,
|
|
45
|
-
* at the tier `effectiveTier` resolves for this target. */
|
|
46
|
-
export declare function appendInbox(nodeId: string, entry: InboxEntryInput): InboxEntry;
|
|
47
|
-
/** Deliver the one system notice for a controller that can no longer satisfy a
|
|
48
|
-
* wait. Returns null when another durable operation already settled or re-armed
|
|
49
|
-
* that wait. */
|
|
50
|
-
export declare function appendControllerDeathNotice(nodeId: string, controller: string): InboxEntry | null;
|
|
51
|
-
/** Return the physical suffix strictly after the exact cursor identity. */
|
|
52
|
-
export declare function readInboxSince(nodeId: string, cursorEntryId?: string): InboxEntry[];
|
|
53
|
-
/** Read one exact contiguous physical range after an exclusive boundary through an inclusive boundary. */
|
|
54
|
-
export declare function readInboxRange(nodeId: string, afterEntryId: string | undefined, throughEntryId: string): InboxEntry[];
|
|
55
|
-
/** Entry ids a human interrupt canceled before delivery. Append-only sidecar
|
|
56
|
-
* (the inbox itself is append-only — never mutated in place): one entry_id
|
|
57
|
-
* per line. The watcher skips canceled entries at plan time; a missing file
|
|
58
|
-
* is an empty set. */
|
|
59
|
-
export declare function readCanceledEntryIds(nodeId: string): Set<InboxEntryId>;
|
|
60
|
-
/** Mark every not-yet-settled HUMAN message entry canceled — the boot-window
|
|
61
|
-
* half of a first-class interrupt (`POST /v1/nodes/{id}/interrupt`): a send
|
|
62
|
-
* that rode the durable inbox (dormant target, or the mid-revive fallback)
|
|
63
|
-
* must not be injected after the human pressed Esc. Scope: `from === 'human'`
|
|
64
|
-
* `kind: 'message'` entries ONLY — a human Esc never cancels spine/agent
|
|
65
|
-
* messages or system notices. Entries past the durable cursor that a live
|
|
66
|
-
* watcher already handed to the engine may be over-canceled; that is safe —
|
|
67
|
-
* the interrupt's abort lands right behind, and covered handoffs are never
|
|
68
|
-
* re-delivered anyway. Returns the newly canceled entry ids. */
|
|
69
|
-
export declare function cancelPendingHumanMessages(nodeId: string): InboxEntryId[];
|
|
70
|
-
/** Cancel every not-yet-settled entry the predicate selects. Retraction, not
|
|
71
|
-
* deletion: the append-only inbox is untouched and the sidecar grows. Safe to
|
|
72
|
-
* call late — an entry already past the cursor is not pending, and the watcher
|
|
73
|
-
* re-reads the set at plan time so a cancel racing a buffered entry still
|
|
74
|
-
* lands. */
|
|
75
|
-
export declare function cancelPendingEntries(nodeId: string, select: (entry: InboxEntry) => boolean): InboxEntryId[];
|
|
76
|
-
/** Read and validate the persisted exact cursor identity. */
|
|
77
|
-
export declare function readCursor(nodeId: string): InboxEntryId | undefined;
|
|
78
|
-
/** Persist one validated exact cursor identity (atomic tmp+rename). */
|
|
79
|
-
export declare function writeCursor(nodeId: string, entryId: string): void;
|
|
80
|
-
/** Is there mail this node has not seen that would drive a turn? The one
|
|
81
|
-
* authority for "wake-worthy inbox state", read by the park clock, the
|
|
82
|
-
* settlement policy, the review-companion guard, and reviveNode's parked
|
|
83
|
-
* re-entry rule. Deferred entries are excluded everywhere for the same
|
|
84
|
-
* reason: a deferred entry rides the next natural cycle and never starts one.
|
|
85
|
-
* A cursor that no longer resolves against the physical inbox is a fault, not
|
|
86
|
-
* an answer — every caller's conservative reading of this predicate is `true`
|
|
87
|
-
* (do not park, do not shut down, do not resume quietly), so report it and
|
|
88
|
-
* return that. */
|
|
89
|
-
export declare function hasUnseenWakeMail(nodeId: string): boolean;
|
|
90
|
-
/** Whether wake-capable mail arrived at or after a parking turn began. Unlike
|
|
91
|
-
* `hasUnseenWakeMail`, this deliberately includes mail the main engine already
|
|
92
|
-
* consumed: a shadow completion must not undo activity that occurred while it
|
|
93
|
-
* ran. A failed scan conservatively keeps the node live. */
|
|
94
|
-
export declare function hasWakeMailSince(nodeId: string, sinceMs: number): boolean;
|
|
95
|
-
/** Clip a body to a bounded preview, reporting whether anything was dropped. */
|
|
23
|
+
/** Project the immutable message body and destination-specific urgency into the canonical inbox rendering shape. */
|
|
24
|
+
export declare function nodeMailEntry(delivery: ClaimedNodeMail): InboxEntry;
|
|
25
|
+
/** Clip a body to the bounded preview stored beside a spilled message body. */
|
|
96
26
|
export declare function clipBody(body: string): {
|
|
97
27
|
text: string;
|
|
98
28
|
clipped: boolean;
|
|
99
29
|
};
|
|
100
|
-
/** One deliverable user message: either a person's verbatim words or the whole
|
|
101
|
-
* `<runtime kind="inbox">` envelope. Never both — a reader parses an envelope
|
|
102
|
-
* only as a whole message, so mixing them attributes the card to the person. */
|
|
103
30
|
export interface InboxDelivery {
|
|
104
31
|
kind: 'human' | 'card';
|
|
105
32
|
text: string;
|
|
106
33
|
entries: readonly InboxEntry[];
|
|
107
34
|
}
|
|
108
|
-
/** Split
|
|
109
|
-
|
|
110
|
-
export declare function coalesce(entries: InboxEntry[]): readonly InboxDelivery[];
|
|
35
|
+
/** Split delivered entries into verbatim human messages and sender-grouped inbox cards. */
|
|
36
|
+
export declare function coalesce(entries: readonly InboxEntry[]): readonly InboxDelivery[];
|