@north-light/crouter 0.3.312 → 0.3.314
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 +757 -746
- package/dist/clients/inbox/__tests__/integration/inbox-controller.test.js +56 -56
- package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.js +45 -32
- package/dist/clients/inbox/controller.d.ts +42 -14
- package/dist/clients/inbox/controller.js +240 -124
- package/dist/clients/inbox/dto-adapt.d.ts +28 -0
- package/dist/clients/inbox/dto-adapt.js +93 -0
- package/dist/clients/inbox/page-adapter.d.ts +5 -4
- package/dist/clients/inbox/page-adapter.js +12 -12
- package/dist/clients/inbox/resolve.d.ts +10 -5
- package/dist/clients/inbox/resolve.js +13 -12
- package/dist/clients/inbox/review/review-client.d.ts +0 -1
- package/dist/clients/inbox/review/review-client.js +0 -4
- package/dist/clients/inbox/review-adapter.d.ts +2 -1
- package/dist/clients/inbox/review-adapter.js +3 -5
- package/dist/clients/inbox/surface.d.ts +2 -2
- package/dist/clients/inbox/surface.js +19 -8
- package/dist/clients/inbox/tui.d.ts +3 -3
- package/dist/commands/__tests__/human.test.js +31 -15
- package/dist/commands/__tests__/integration/dashboard-snapshot.test.js +36 -11
- package/dist/commands/{sys/__tests__ → __tests__/integration}/migrate.test.js +142 -36
- package/dist/commands/__tests__/revive-now-gate.test.js +2 -0
- package/dist/commands/api-client.d.ts +5 -4
- package/dist/commands/api-client.js +13 -7
- package/dist/commands/canvas-history/shared.js +1 -1
- package/dist/commands/canvas-history.js +1 -1
- package/dist/commands/canvas-roster.js +1 -1
- package/dist/commands/canvas.js +1 -2
- package/dist/commands/human/feedback.js +20 -17
- package/dist/commands/human/prompts.js +45 -36
- package/dist/commands/human/queue.js +73 -123
- package/dist/commands/human/review.js +6 -16
- package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.js +2 -0
- package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.js +2 -0
- package/dist/commands/memory/__tests__/repository-root-lint.test.js +2 -0
- package/dist/commands/node-inspect-artifacts.js +1 -1
- package/dist/commands/node-lifecycle-revive.d.ts +2 -2
- package/dist/commands/node-lifecycle-revive.js +9 -19
- package/dist/commands/pkg/plugin-manage.js +0 -1
- package/dist/commands/profile/show.js +4 -12
- package/dist/commands/surface-tmux-spread.js +1 -5
- package/dist/commands/sys/__tests__/config-model-ladders.test.js +23 -30
- package/dist/commands/sys/__tests__/sync-project-guidance.test.js +37 -11
- package/dist/commands/sys/branch.d.ts +2 -0
- package/dist/commands/sys/branch.js +19 -0
- package/dist/commands/sys/config.js +106 -33
- package/dist/commands/sys/daemon.d.ts +2 -0
- package/dist/commands/sys/daemon.js +130 -7
- package/dist/commands/sys/doctor.js +5 -15
- package/dist/commands/sys/migrate.js +21 -92
- package/dist/commands/sys/setup-settings-runner.js +4 -2
- package/dist/commands/sys.js +2 -15
- package/dist/core/__tests__/boot-fault-attempt.test.js +23 -1
- package/dist/core/__tests__/boot.test.js +32 -25
- package/dist/core/__tests__/broker-launch-candidates.test.js +49 -0
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +149 -176
- package/dist/core/__tests__/canvas-inbox-watcher-naming.test.js +59 -10
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +76 -20
- package/dist/core/__tests__/canvas.test.js +18 -47
- package/dist/core/__tests__/child-death-wake.test.js +29 -7
- package/dist/core/__tests__/cli-help-contract.test.js +2 -0
- package/dist/core/__tests__/close.test.js +29 -10
- package/dist/core/__tests__/collectible.test.js +2 -1
- package/dist/core/__tests__/config-change-delta.test.js +2 -0
- package/dist/core/__tests__/context-intro.test.js +13 -1
- package/dist/core/__tests__/cron-armed-context-failure.test.js +17 -12
- package/dist/core/__tests__/cron-held-settlement.test.js +21 -3
- package/dist/core/__tests__/cron-node-sink-parked-root.test.js +29 -10
- package/dist/core/__tests__/cron-self-cancel-delivery.test.js +14 -2
- package/dist/core/__tests__/cron-timeout-descendants.test.js +13 -1
- package/dist/core/__tests__/daemon-boot.test.js +51 -14
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
- package/dist/core/__tests__/fixtures/fake-engine.js +8 -3
- package/dist/core/__tests__/focuses.test.js +10 -5
- package/dist/core/__tests__/helpers/harness.js +50 -18
- package/dist/core/__tests__/history-inbox.test.js +12 -16
- package/dist/core/__tests__/human-action-delivery.test.js +48 -28
- package/dist/core/__tests__/human-actions.test.js +7 -3
- package/dist/core/__tests__/inline-memory-refs.test.js +7 -2
- package/dist/core/__tests__/integration/broker-fork-seam.test.js +37 -10
- package/dist/core/__tests__/integration/broker-sdk-wiring.test.js +42 -0
- package/dist/core/__tests__/integration/broker-snapshot-history.test.js +42 -29
- package/dist/core/__tests__/integration/broker-wedge-supervision.test.js +36 -35
- package/dist/core/__tests__/integration/command-plugins.test.js +15 -6
- package/dist/core/__tests__/integration/deferred-no-wake.test.js +113 -92
- package/dist/core/__tests__/integration/fresh-home-commands.test.js +49 -0
- package/dist/core/__tests__/integration/host-teardown-process-group.test.js +9 -5
- package/dist/core/__tests__/integration/lifecycle-hooks.test.js +16 -3
- package/dist/core/__tests__/integration/plugin-revalidate.test.js +4 -0
- package/dist/core/__tests__/integration/profile-pause.test.js +4 -4
- package/dist/core/__tests__/integration/refresh-stall-recycle.test.js +9 -12
- package/dist/core/__tests__/integration/revive.test.js +67 -21
- package/dist/core/__tests__/integration/spawn-root.test.js +51 -8
- package/dist/core/__tests__/integration/subscription-delivery.test.js +33 -21
- package/dist/core/__tests__/integration/worktree-land.test.js +5 -2
- package/dist/core/__tests__/integration/worktree-reap.test.js +15 -1
- package/dist/core/__tests__/kickoff.test.js +36 -39
- package/dist/core/__tests__/lifecycle-terminal-reasons.test.js +2 -1
- package/dist/core/__tests__/lifecycle.test.js +2 -1
- package/dist/core/__tests__/live-lifecycle-prompt.test.js +13 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +2 -0
- package/dist/core/__tests__/migration.test.js +145 -31
- package/dist/core/__tests__/model-pin-durability.test.js +4 -1
- package/dist/core/__tests__/model-routes-config.test.js +13 -5
- package/dist/core/__tests__/node-outcome.test.js +93 -26
- package/dist/core/__tests__/on-read-crouter-home-fence.test.js +2 -1
- package/dist/core/__tests__/on-read-dedup-resume.test.js +2 -1
- package/dist/core/__tests__/on-read-nested-store.test.js +2 -1
- package/dist/core/__tests__/passive-subscription.test.js +50 -157
- package/dist/core/__tests__/plugin-kinds.test.js +6 -4
- package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.js +6 -1
- package/dist/core/__tests__/plugin-page-components.test.js +6 -4
- package/dist/core/__tests__/preview-registry-sync.test.js +2 -0
- package/dist/core/__tests__/profile-project-memory-delivery.test.js +4 -1
- package/dist/core/__tests__/prune.test.js +11 -5
- package/dist/core/__tests__/push-final-guard.test.js +14 -7
- package/dist/core/__tests__/relaunch-root.test.js +30 -2
- package/dist/core/__tests__/remote-canvas-target.test.js +7 -1
- package/dist/core/__tests__/repository-root-identity.test.js +4 -0
- package/dist/core/__tests__/review-model-floor.test.js +6 -3
- package/dist/core/__tests__/revive-all.test.js +13 -3
- package/dist/core/__tests__/revive-capacity.test.js +26 -4
- package/dist/core/__tests__/revive-parked-fresh.test.js +31 -8
- package/dist/core/__tests__/seam/broker-attach-stream.test.js +1 -1
- package/dist/core/__tests__/seam/broker-cap-freeze.test.js +4 -3
- package/dist/core/__tests__/seam/broker-crash-teardown.test.js +11 -14
- package/dist/core/__tests__/seam/broker-provider-retry.test.js +85 -71
- package/dist/core/__tests__/seam/dormancy-release.test.js +33 -19
- package/dist/core/__tests__/seam/held-deferred-human-prompt.test.js +7 -5
- package/dist/core/__tests__/seam/inbox-reference-guidance.test.js +20 -6
- package/dist/core/__tests__/seam/node-outcome-delivery.test.js +27 -3
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +2 -1
- package/dist/core/__tests__/stop-guard.test.js +2 -1
- package/dist/core/__tests__/subscription-pool-credential-guard.test.js +4 -3
- package/dist/core/__tests__/warm-claim-preference-snapshot.test.js +18 -4
- package/dist/core/__tests__/yield-ensures-daemon.test.js +2 -1
- package/dist/core/bootstrap.js +2 -0
- package/dist/core/broker-client/__tests__/transport-socket.test.js +51 -6
- package/dist/core/broker-client/transport-socket.d.ts +1 -0
- package/dist/core/broker-client/transport-socket.js +13 -5
- package/dist/core/canvas/__tests__/attention.test.js +29 -35
- package/dist/core/canvas/__tests__/history-transcript.test.js +6 -6
- package/dist/core/canvas/__tests__/render-remote.test.js +25 -9
- package/dist/core/canvas/attention.d.ts +2 -5
- package/dist/core/canvas/attention.js +15 -64
- package/dist/core/canvas/boot.d.ts +6 -7
- package/dist/core/canvas/boot.js +5 -9
- package/dist/core/canvas/canvas.d.ts +13 -109
- package/dist/core/canvas/canvas.js +140 -401
- package/dist/core/canvas/crons.d.ts +2 -0
- package/dist/core/canvas/crons.js +16 -15
- package/dist/core/canvas/daemon-owner.js +10 -0
- package/dist/core/canvas/db.d.ts +2 -2
- package/dist/core/canvas/db.js +2 -18
- package/dist/core/canvas/deliveries.d.ts +104 -0
- package/dist/core/canvas/deliveries.js +354 -0
- package/dist/core/canvas/executions.d.ts +29 -0
- package/dist/core/canvas/executions.js +68 -0
- package/dist/core/canvas/history.js +35 -35
- package/dist/core/canvas/index.d.ts +3 -1
- package/dist/core/canvas/index.js +3 -1
- package/dist/core/canvas/migrations.js +20 -12
- package/dist/core/canvas/nav-model.js +1 -3
- package/dist/core/canvas/nav-render.d.ts +4 -4
- package/dist/core/canvas/nav-render.js +11 -21
- package/dist/core/canvas/node-sql-migration.d.ts +3 -0
- package/dist/core/canvas/node-sql-migration.js +261 -0
- package/dist/core/canvas/paths.d.ts +2 -16
- package/dist/core/canvas/paths.js +2 -31
- package/dist/core/canvas/recovery.d.ts +76 -0
- package/dist/core/canvas/recovery.js +588 -0
- package/dist/core/canvas/remote-canvas-source.js +4 -0
- package/dist/core/canvas/render-source.d.ts +16 -27
- package/dist/core/canvas/render-source.js +16 -45
- package/dist/core/canvas/sessions.d.ts +33 -0
- package/dist/core/canvas/sessions.js +78 -0
- package/dist/core/canvas/types.d.ts +33 -33
- package/dist/core/canvas/types.js +2 -5
- package/dist/core/canvas/waits.d.ts +18 -0
- package/dist/core/canvas/waits.js +70 -0
- package/dist/core/canvas/worktrees.d.ts +40 -0
- package/dist/core/canvas/worktrees.js +93 -0
- package/dist/core/command.js +11 -0
- package/dist/core/config.d.ts +17 -12
- package/dist/core/config.js +106 -155
- package/dist/core/feed/__tests__/inbox-migrate.test.js +27 -31
- package/dist/core/feed/feed.d.ts +0 -6
- package/dist/core/feed/feed.js +68 -56
- package/dist/core/feed/inbox.d.ts +7 -81
- package/dist/core/feed/inbox.js +46 -378
- package/dist/core/feed/messages.d.ts +58 -0
- package/dist/core/feed/messages.js +217 -0
- package/dist/core/fs-utils.d.ts +4 -0
- package/dist/core/fs-utils.js +21 -1
- package/dist/core/human/answer.d.ts +1 -1
- package/dist/core/human/answer.js +1 -1
- package/dist/core/human/claim.d.ts +1 -1
- package/dist/core/human/claim.js +2 -4
- package/dist/core/human/component-docs.js +1 -1
- package/dist/core/human/feedback-companion.js +3 -2
- package/dist/core/human/feedback.d.ts +5 -8
- package/dist/core/human/feedback.js +57 -85
- package/dist/core/human/page-authoring.d.ts +30 -0
- package/dist/core/human/page-authoring.js +19 -0
- package/dist/core/human/requests.d.ts +136 -0
- package/dist/core/human/requests.js +515 -0
- package/dist/core/human/root.d.ts +0 -7
- package/dist/core/human/root.js +0 -17
- package/dist/core/human/scan.d.ts +2 -7
- package/dist/core/human/scan.js +48 -132
- package/dist/core/human/summary.d.ts +1 -1
- package/dist/core/human/summary.js +1 -1
- package/dist/core/human/tickets.d.ts +23 -83
- package/dist/core/human/tickets.js +92 -243
- package/dist/core/human/types.d.ts +5 -1
- package/dist/core/installed-plugins.js +8 -3
- package/dist/core/keybindings/__tests__/resolve.test.js +19 -17
- package/dist/core/locked-file.d.ts +6 -3
- package/dist/core/locked-file.js +36 -9
- package/dist/core/memory/extensions.js +2 -0
- package/dist/core/preview-registry.js +0 -1
- package/dist/core/profiles/__tests__/env-store.test.js +2 -0
- package/dist/core/profiles/default-binding.d.ts +0 -4
- package/dist/core/profiles/default-binding.js +12 -58
- package/dist/core/profiles/env-store.js +8 -3
- package/dist/core/profiles/manifest.d.ts +2 -37
- package/dist/core/profiles/manifest.js +35 -161
- package/dist/core/profiles/select.js +3 -0
- package/dist/core/review/__tests__/capture-origin.test.js +13 -2
- package/dist/core/review/__tests__/comments.test.js +28 -10
- package/dist/core/review/__tests__/remap.test.js +28 -10
- package/dist/core/review/__tests__/stage-identity.test.js +17 -7
- package/dist/core/review/birth.d.ts +1 -1
- package/dist/core/review/birth.js +34 -5
- package/dist/core/review/comments.js +1 -1
- package/dist/core/review/document.js +1 -1
- package/dist/core/review/project.d.ts +5 -1
- package/dist/core/review/project.js +14 -36
- package/dist/core/review/realize.d.ts +3 -6
- package/dist/core/review/realize.js +51 -168
- package/dist/core/review/remap.js +1 -1
- package/dist/core/review/stage.d.ts +3 -2
- package/dist/core/review/stage.js +2 -3
- package/dist/core/review/store.d.ts +3 -21
- package/dist/core/review/store.js +140 -186
- package/dist/core/review/types.d.ts +0 -1
- package/dist/core/runtime/__tests__/install-id-cache-scoping.test.js +9 -5
- package/dist/core/runtime/__tests__/spawn-env.test.js +8 -9
- package/dist/core/runtime/broker/auth-reload.js +9 -10
- package/dist/core/runtime/broker/daemon-ops.d.ts +25 -8
- package/dist/core/runtime/broker/daemon-ops.js +42 -9
- package/dist/core/runtime/broker/extension-abort.d.ts +3 -0
- package/dist/core/runtime/broker/extension-abort.js +11 -0
- package/dist/core/runtime/broker/fault-retry.d.ts +15 -6
- package/dist/core/runtime/broker/fault-retry.js +142 -95
- package/dist/core/runtime/broker/inbox.d.ts +4 -32
- package/dist/core/runtime/broker/inbox.js +4 -92
- package/dist/core/runtime/broker/rebind.d.ts +1 -0
- package/dist/core/runtime/broker/rebind.js +21 -12
- package/dist/core/runtime/broker-persona-guidance.d.ts +1 -1
- package/dist/core/runtime/broker-persona-guidance.js +2 -13
- package/dist/core/runtime/broker.js +28 -22
- package/dist/core/runtime/close.d.ts +3 -9
- package/dist/core/runtime/close.js +16 -27
- package/dist/core/runtime/fault.d.ts +3 -93
- package/dist/core/runtime/fault.js +9 -419
- package/dist/core/runtime/kickoff.d.ts +3 -6
- package/dist/core/runtime/kickoff.js +12 -18
- package/dist/core/runtime/launch.js +1 -1
- package/dist/core/runtime/lifecycle.js +40 -7
- package/dist/core/runtime/placement.js +2 -2
- package/dist/core/runtime/recycle.js +8 -2
- package/dist/core/runtime/reset.js +22 -6
- package/dist/core/runtime/revive.js +226 -218
- package/dist/core/runtime/spawn.js +14 -3
- package/dist/core/scoped-state/db.d.ts +18 -0
- package/dist/core/scoped-state/db.js +135 -0
- package/dist/core/scoped-state/migrate.d.ts +8 -0
- package/dist/core/scoped-state/migrate.js +181 -0
- package/dist/core/scoped-state/paths.d.ts +9 -0
- package/dist/core/scoped-state/paths.js +27 -0
- package/dist/core/scoped-state/profiles.d.ts +12 -0
- package/dist/core/scoped-state/profiles.js +62 -0
- package/dist/core/scoped-state/providers.d.ts +16 -0
- package/dist/core/scoped-state/providers.js +8 -0
- package/dist/core/scoped-state/schema.d.ts +3 -0
- package/dist/core/scoped-state/schema.js +26 -0
- package/dist/core/scoped-state/settings.d.ts +28 -0
- package/dist/core/scoped-state/settings.js +82 -0
- package/dist/core/subscription-state.d.ts +29 -48
- package/dist/core/subscription-state.js +176 -712
- package/dist/core/worktree-close.js +4 -4
- package/dist/core/worktree-mutation-async.js +2 -2
- package/dist/core/worktree-sweep.js +11 -16
- package/dist/core/worktree.js +6 -12
- package/dist/daemon/__tests__/autostart-storm.test.js +1 -39
- package/dist/daemon/__tests__/helpers/source-daemon.d.ts +2 -2
- package/dist/daemon/__tests__/helpers/source-daemon.js +7 -6
- package/dist/daemon/__tests__/integration/migration-startup.test.js +59 -26
- package/dist/daemon/__tests__/node-deadline-lane.test.js +2 -1
- package/dist/daemon/__tests__/node-outcome-birth-invariants.test.js +39 -15
- package/dist/daemon/__tests__/node-outcome-delivery.test.js +39 -10
- package/dist/daemon/__tests__/reconciler-signature.test.js +2 -2
- package/dist/daemon/__tests__/subtree-filter-freshness.test.js +2 -2
- package/dist/daemon/api/__tests__/broker-settle-park.test.js +17 -12
- package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.js +27 -5
- package/dist/daemon/api/__tests__/model-config.test.js +8 -8
- package/dist/daemon/api/__tests__/node-create-description.test.js +22 -5
- package/dist/daemon/api/__tests__/node-model-validation.test.js +21 -1
- package/dist/daemon/api/__tests__/nodes-activity-query.test.js +10 -12
- package/dist/daemon/api/__tests__/profile-launch-gates.test.js +4 -1
- package/dist/daemon/api/__tests__/profile-metadata-route.test.js +4 -1
- package/dist/daemon/api/__tests__/reopen-delivery.test.js +26 -8
- package/dist/daemon/api/__tests__/seam/api-server.test.js +24 -32
- package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.js +4 -1
- package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.js +5 -4
- package/dist/daemon/api/__tests__/seam/profile-delete.test.js +27 -41
- package/dist/daemon/api/__tests__/submit-result.test.js +3 -2
- package/dist/daemon/api/bridge.js +1 -1
- package/dist/daemon/api/handlers/bash-jobs.js +6 -7
- package/dist/daemon/api/handlers/broker-ops.js +47 -84
- package/dist/daemon/api/handlers/broker-recovery.d.ts +4 -0
- package/dist/daemon/api/handlers/broker-recovery.js +251 -0
- package/dist/daemon/api/handlers/canvas.js +2 -44
- package/dist/daemon/api/handlers/daemon.js +41 -0
- package/dist/daemon/api/handlers/feedback-comments.js +2 -2
- package/dist/daemon/api/handlers/health.js +10 -5
- package/dist/daemon/api/handlers/human-requests.js +168 -188
- package/dist/daemon/api/handlers/human.js +3 -151
- package/dist/daemon/api/handlers/inbox-page.d.ts +4 -0
- package/dist/daemon/api/handlers/inbox-page.js +89 -0
- package/dist/daemon/api/handlers/inbox.js +21 -120
- package/dist/daemon/api/handlers/messages.d.ts +1 -0
- package/dist/daemon/api/handlers/messages.js +73 -15
- package/dist/daemon/api/handlers/node-outcomes.js +58 -13
- package/dist/daemon/api/handlers/nodes.js +7 -13
- package/dist/daemon/api/handlers/reviews.js +4 -29
- package/dist/daemon/api/map.d.ts +25 -3
- package/dist/daemon/api/map.js +84 -14
- package/dist/daemon/api/server.js +68 -9
- package/dist/daemon/control.d.ts +18 -0
- package/dist/daemon/cron/disposition.d.ts +2 -0
- package/dist/daemon/cron/disposition.js +8 -5
- package/dist/daemon/cron/settle.js +37 -13
- package/dist/daemon/cron/sinks.d.ts +18 -1
- package/dist/daemon/cron/sinks.js +47 -93
- package/dist/daemon/crtrd-cli.js +4 -19
- package/dist/daemon/crtrd.d.ts +2 -0
- package/dist/daemon/crtrd.js +206 -81
- package/dist/daemon/fleet.js +5 -6
- package/dist/daemon/human/finish.d.ts +12 -24
- package/dist/daemon/human/finish.js +88 -285
- package/dist/daemon/human/settle.d.ts +40 -0
- package/dist/daemon/human/settle.js +89 -0
- package/dist/daemon/human/sweep.d.ts +20 -5
- package/dist/daemon/human/sweep.js +56 -60
- package/dist/daemon/manage.d.ts +21 -16
- package/dist/daemon/manage.js +85 -51
- package/dist/daemon/messaging/node-message.d.ts +1 -1
- package/dist/daemon/messaging/node-message.js +9 -12
- package/dist/daemon/park-activity.js +3 -3
- package/dist/daemon/reconcilers/bash-deadline.js +6 -7
- package/dist/daemon/reconcilers/broker-supervision.d.ts +1 -1
- package/dist/daemon/reconcilers/broker-supervision.js +41 -19
- package/dist/daemon/reconcilers/controller-death.js +6 -18
- package/dist/daemon/reconcilers/delivery-lane.d.ts +9 -0
- package/dist/daemon/reconcilers/delivery-lane.js +130 -0
- package/dist/daemon/reconcilers/live-obligation.js +3 -3
- package/dist/daemon/reconcilers/node-deadline.js +1 -1
- package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.d.ts +1 -1
- package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +10 -12
- package/dist/daemon/reconcilers/node-lifecycle/tick.js +5 -5
- package/dist/daemon/reconcilers/node-lifecycle/wants-execution.js +1 -1
- package/dist/daemon/reconcilers/pending-review-submit.js +3 -3
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +2 -8
- package/dist/daemon/reconcilers/storage-maintenance.js +13 -43
- package/dist/daemon/review/companion.js +5 -11
- package/dist/daemon/review/deliver.d.ts +1 -5
- package/dist/daemon/review/deliver.js +3 -52
- package/dist/daemon/review/finish.d.ts +2 -27
- package/dist/daemon/review/finish.js +79 -263
- package/dist/daemon/review/sweep.d.ts +3 -10
- package/dist/daemon/review/sweep.js +13 -131
- package/dist/daemon/startup-policy.d.ts +0 -5
- package/dist/daemon/startup-policy.js +0 -5
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -1
- package/dist/migrations/__tests__/activation-concurrency.test.js +3 -2
- package/dist/migrations/__tests__/activation.test.js +9 -6
- package/dist/migrations/activation.d.ts +3 -2
- package/dist/migrations/activation.js +2 -4
- package/dist/migrations/corpus.d.ts +2 -5
- package/dist/migrations/corpus.js +9 -20
- package/dist/migrations/runner.d.ts +3 -1
- package/dist/migrations/runner.js +6 -2
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +21 -89
- package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.js +4 -2
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +51 -33
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +16 -2
- package/dist/pi-extensions/__tests__/pre-command-gate.test.js +13 -1
- package/dist/pi-extensions/canvas-inbox-watcher.js +98 -244
- package/dist/pi-extensions/canvas-passive-context.d.ts +4 -8
- package/dist/pi-extensions/canvas-passive-context.js +85 -37
- package/dist/pi-extensions/canvas-stophook.js +47 -31
- package/dist/shared/env.d.ts +1 -0
- package/dist/shared/env.js +3 -0
- package/package.json +1 -1
- package/runtime.lock.json +5 -5
- package/dist/clients/attach/__tests__/page-block.test.js +0 -54
- package/dist/clients/inbox/review-visibility.d.ts +0 -5
- package/dist/clients/inbox/review-visibility.js +0 -19
- package/dist/commands/canvas-rebuild-index.d.ts +0 -2
- package/dist/commands/canvas-rebuild-index.js +0 -46
- package/dist/core/__tests__/human-cancel-guard.test.js +0 -110
- package/dist/core/__tests__/human-deliver.test.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/__tests__/{human-deliver.test.d.ts → integration/fresh-home-commands.test.d.ts} +0 -0
|
@@ -1,214 +1,168 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { withCanvasWrite } from '../canvas/db.js';
|
|
3
|
+
import { getRequest, getRequestByCompanion, getRequestByIdempotencyKey, listBindingRequests, listRequests, listSubmitRequestedRequests, listUnprojectedReviews, markProjected as markRequestProjected, markProjectionError as markRequestProjectionError, openRequest, readAnchorBase as readRequestAnchorBase, replaceAnchorBaseLocked as replaceRequestAnchorBaseLocked, requestSubmit, } from '../human/requests.js';
|
|
4
4
|
import { ReviewOperationError, } from './types.js';
|
|
5
|
-
function
|
|
5
|
+
function specification(request) {
|
|
6
|
+
try {
|
|
7
|
+
const value = JSON.parse(request.specification_json);
|
|
8
|
+
if (typeof value !== 'object' || value === null)
|
|
9
|
+
throw new Error('not an object');
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
throw new Error(`corrupt review specification: ${request.request_id}`, { cause: error });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function state(request) {
|
|
17
|
+
if (request.state !== 'settled')
|
|
18
|
+
return request.state;
|
|
19
|
+
return request.outcome === 'approved' ? 'approved' : 'canceled';
|
|
20
|
+
}
|
|
21
|
+
function record(request) {
|
|
22
|
+
if (request.kind !== 'review')
|
|
23
|
+
throw new Error(`human request is not a review: ${request.request_id}`);
|
|
24
|
+
const spec = specification(request);
|
|
25
|
+
const reviewState = state(request);
|
|
26
|
+
const settledAt = request.settled_at;
|
|
6
27
|
return {
|
|
7
|
-
review_id:
|
|
8
|
-
idempotency_key:
|
|
9
|
-
origin_kind:
|
|
10
|
-
origin_node_id:
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
28
|
+
review_id: request.request_id,
|
|
29
|
+
idempotency_key: request.idempotency_key ?? '',
|
|
30
|
+
origin_kind: spec.origin_kind ?? (request.inbox_listed ? 'ticket' : 'inline'),
|
|
31
|
+
origin_node_id: request.requester_node_id ?? '',
|
|
32
|
+
companion_node_id: request.companion_node_id ?? '',
|
|
33
|
+
review_dir: request.request_dir,
|
|
34
|
+
file: request.file ?? '',
|
|
35
|
+
origin_session_file: spec.origin_session_file,
|
|
36
|
+
origin_session_id: spec.origin_session_id,
|
|
37
|
+
origin_leaf_id: spec.origin_leaf_id,
|
|
38
|
+
model_spec: spec.model_spec,
|
|
39
|
+
branch_file: spec.branch_file,
|
|
40
|
+
baseline_sha256: spec.baseline_sha256,
|
|
41
|
+
baseline_bytes: spec.baseline_bytes,
|
|
42
|
+
anchor_base_sha256: request.anchor_base_sha256 ?? '',
|
|
43
|
+
state: reviewState,
|
|
44
|
+
created: request.created_at,
|
|
45
|
+
captured_at: spec.captured_at,
|
|
46
|
+
opened_at: request.opened_at,
|
|
47
|
+
submit_requested_at: request.submit_requested_at,
|
|
48
|
+
output_path: spec.output_path ?? null,
|
|
49
|
+
subtitle: request.subtitle,
|
|
50
|
+
approved_at: reviewState === 'approved' ? settledAt : null,
|
|
51
|
+
approved_sha256: reviewState === 'approved' ? (() => {
|
|
52
|
+
try {
|
|
53
|
+
return JSON.parse(request.result_json ?? '{}').approved_sha256 ?? null;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
})() : null,
|
|
59
|
+
changed: reviewState === 'approved' ? (() => {
|
|
60
|
+
try {
|
|
61
|
+
return JSON.parse(request.result_json ?? '{}').changed ?? null;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
})() : null,
|
|
67
|
+
comments_total: reviewState === 'approved' ? (() => {
|
|
68
|
+
try {
|
|
69
|
+
return JSON.parse(request.result_json ?? '{}').comments_total ?? null;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
})() : null,
|
|
75
|
+
comments_unresolved: reviewState === 'approved' ? (() => {
|
|
76
|
+
try {
|
|
77
|
+
return JSON.parse(request.result_json ?? '{}').comments_unresolved ?? null;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
})() : null,
|
|
83
|
+
result_json: request.result_json,
|
|
84
|
+
canceled_at: reviewState === 'canceled' ? settledAt : null,
|
|
85
|
+
cancel_reason: reviewState === 'canceled' ? (() => {
|
|
86
|
+
try {
|
|
87
|
+
return JSON.parse(request.result_json ?? '{}').reason ?? null;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
})() : null,
|
|
93
|
+
cancel_actor: reviewState === 'canceled' ? (() => {
|
|
94
|
+
try {
|
|
95
|
+
return JSON.parse(request.result_json ?? '{}').actor ?? null;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
})() : null,
|
|
101
|
+
delivery_entry_id: request.settlement_delivery_id,
|
|
102
|
+
delivered_at: request.settlement_delivery_id === null ? null : settledAt,
|
|
103
|
+
delivery_error: null,
|
|
104
|
+
projected_at: request.projected_at,
|
|
105
|
+
projection_error: request.projection_error,
|
|
106
|
+
source_missing: !existsSync(request.file ?? ''),
|
|
45
107
|
};
|
|
46
108
|
}
|
|
47
|
-
function
|
|
48
|
-
const
|
|
49
|
-
return
|
|
50
|
-
}
|
|
51
|
-
function readRecords(db, where, ...params) {
|
|
52
|
-
const rows = db.prepare(`SELECT * FROM reviews WHERE ${where} ORDER BY created ASC, review_id ASC`).all(...params);
|
|
53
|
-
return rows.map(recordFromRow);
|
|
54
|
-
}
|
|
55
|
-
export function mintReviewId() {
|
|
56
|
-
return newNodeId();
|
|
57
|
-
}
|
|
58
|
-
/** Atomically claim the idempotency key, without publishing any non-SQLite state. */
|
|
59
|
-
export function commitBindingReview(row) {
|
|
60
|
-
return withCanvasWrite((db) => {
|
|
61
|
-
const inserted = db.prepare(`
|
|
62
|
-
INSERT INTO reviews (
|
|
63
|
-
review_id, idempotency_key, origin_kind, origin_node_id, bridge_node_id,
|
|
64
|
-
companion_node_id, review_dir, file, origin_session_file, origin_session_id,
|
|
65
|
-
origin_leaf_id, model_spec, branch_file, baseline_sha256, baseline_bytes,
|
|
66
|
-
anchor_base_sha256, anchor_base_bytes, state, created, captured_at, opened_at,
|
|
67
|
-
output_path, subtitle, approved_at, approved_sha256, changed, comments_total,
|
|
68
|
-
comments_unresolved, result_json, canceled_at, cancel_reason, cancel_actor,
|
|
69
|
-
delivery_entry_id, delivered_at, delivery_error, projected_at, projection_error
|
|
70
|
-
) VALUES (
|
|
71
|
-
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
|
|
72
|
-
?, ?, ?, ?, ?, ?, ?, ?, ?, ?
|
|
73
|
-
) ON CONFLICT(idempotency_key) DO NOTHING
|
|
74
|
-
`).run(row.review_id, row.idempotency_key, row.origin_kind, row.origin_node_id, row.bridge_node_id, row.companion_node_id, row.review_dir, row.file, row.origin_session_file, row.origin_session_id, row.origin_leaf_id, row.model_spec, row.branch_file, row.baseline_sha256, row.baseline_bytes, row.anchor_base_sha256, row.anchor_base_bytes, 'binding', row.created, row.captured_at, row.opened_at, row.output_path, row.subtitle, row.approved_at, row.approved_sha256, row.changed === null ? null : row.changed ? 1 : 0, row.comments_total, row.comments_unresolved, row.result_json, row.canceled_at, row.cancel_reason, row.cancel_actor, row.delivery_entry_id, row.delivered_at, row.delivery_error, row.projected_at, row.projection_error);
|
|
75
|
-
const winner = db.prepare('SELECT review_id FROM reviews WHERE idempotency_key = ?').get(row.idempotency_key);
|
|
76
|
-
if (winner === undefined)
|
|
77
|
-
throw new Error(`review binding insert did not produce a row: ${row.idempotency_key}`);
|
|
78
|
-
return { review_id: winner.review_id, won: inserted.changes > 0 };
|
|
79
|
-
});
|
|
109
|
+
function requestForReview(reviewId) {
|
|
110
|
+
const request = getRequest(reviewId);
|
|
111
|
+
return request?.kind === 'review' ? request : null;
|
|
80
112
|
}
|
|
81
113
|
export function getReview(reviewId) {
|
|
82
|
-
|
|
114
|
+
const request = requestForReview(reviewId);
|
|
115
|
+
return request === null ? null : record(request);
|
|
83
116
|
}
|
|
84
|
-
/** The review `reviewId` names, for a caller that cannot proceed without one.
|
|
85
|
-
* A `binding` row is still mid-creation and reads as absent. */
|
|
86
117
|
export function requireVisibleReview(reviewId) {
|
|
87
118
|
const review = getReview(reviewId);
|
|
88
|
-
if (review === null || review.state === 'binding')
|
|
119
|
+
if (review === null || review.state === 'binding')
|
|
89
120
|
throw new ReviewOperationError('unknown_review', 'review was not found', { received: reviewId });
|
|
90
|
-
}
|
|
91
121
|
return review;
|
|
92
122
|
}
|
|
93
123
|
export function getReviewByIdempotencyKey(key) {
|
|
94
|
-
|
|
124
|
+
const request = getRequestByIdempotencyKey(key);
|
|
125
|
+
return request?.kind === 'review' ? record(request) : null;
|
|
95
126
|
}
|
|
96
127
|
export function getReviewByCompanion(nodeId) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
export function getReviewByBridge(nodeId) {
|
|
100
|
-
return readRecord(openDb(), "bridge_node_id = ? AND state <> 'binding'", nodeId);
|
|
128
|
+
const request = getRequestByCompanion(nodeId);
|
|
129
|
+
return request?.kind === 'review' ? record(request) : null;
|
|
101
130
|
}
|
|
102
131
|
export function listReviews(filter) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
clauses.push('state = ?');
|
|
107
|
-
params.push(filter.state);
|
|
108
|
-
}
|
|
109
|
-
if (filter.origin_node_id !== undefined) {
|
|
110
|
-
clauses.push('origin_node_id = ?');
|
|
111
|
-
params.push(filter.origin_node_id);
|
|
112
|
-
}
|
|
113
|
-
if (filter.file !== undefined) {
|
|
114
|
-
clauses.push('file = ?');
|
|
115
|
-
params.push(filter.file);
|
|
116
|
-
}
|
|
117
|
-
return readRecords(openDb(), clauses.join(' AND '), ...params);
|
|
132
|
+
return listRequests({ kind: 'review', ...(filter.origin_node_id === undefined ? {} : { requester_node_id: filter.origin_node_id }), ...(filter.file === undefined ? {} : { file: filter.file }) })
|
|
133
|
+
.map(record)
|
|
134
|
+
.filter((review) => review.state !== 'binding' && (filter.state === undefined || review.state === filter.state));
|
|
118
135
|
}
|
|
119
|
-
/** Review ids whose immutable origin is one of `nodeIds`, including binding
|
|
120
|
-
* rows that normal user-facing review listings intentionally hide. */
|
|
121
136
|
export function reviewIdsByOriginNodes(nodeIds) {
|
|
122
|
-
const ids =
|
|
123
|
-
|
|
124
|
-
return [];
|
|
125
|
-
const placeholders = ids.map(() => '?').join(',');
|
|
126
|
-
return openDb()
|
|
127
|
-
.prepare(`SELECT review_id FROM reviews WHERE origin_node_id IN (${placeholders}) ORDER BY created, review_id`)
|
|
128
|
-
.all(...ids).map(({ review_id }) => review_id);
|
|
137
|
+
const ids = new Set(nodeIds);
|
|
138
|
+
return listRequests({ kind: 'review' }).filter((request) => request.requester_node_id !== null && ids.has(request.requester_node_id)).map((request) => request.request_id);
|
|
129
139
|
}
|
|
130
|
-
/** Delete review audit state for the selected origins in dependency order.
|
|
131
|
-
* Filesystem cleanup is deliberately left to the daemon lifecycle owner. */
|
|
132
140
|
export function deleteReviewsByOriginNodes(nodeIds) {
|
|
133
|
-
const
|
|
134
|
-
if (
|
|
141
|
+
const reviewIds = reviewIdsByOriginNodes(nodeIds);
|
|
142
|
+
if (reviewIds.length === 0)
|
|
135
143
|
return [];
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if (reviewIds.length === 0)
|
|
142
|
-
return [];
|
|
143
|
-
const reviewPlaceholders = reviewIds.map(() => '?').join(',');
|
|
144
|
-
db.prepare(`DELETE FROM review_comment_events WHERE review_id IN (${reviewPlaceholders})`).run(...reviewIds);
|
|
145
|
-
db.prepare(`DELETE FROM review_comments WHERE review_id IN (${reviewPlaceholders})`).run(...reviewIds);
|
|
146
|
-
db.prepare(`DELETE FROM reviews WHERE review_id IN (${reviewPlaceholders})`).run(...reviewIds);
|
|
147
|
-
return reviewIds;
|
|
144
|
+
withCanvasWrite((db) => {
|
|
145
|
+
const placeholders = reviewIds.map(() => '?').join(',');
|
|
146
|
+
db.prepare(`DELETE FROM review_comment_events WHERE review_id IN (${placeholders})`).run(...reviewIds);
|
|
147
|
+
db.prepare(`DELETE FROM review_comments WHERE review_id IN (${placeholders})`).run(...reviewIds);
|
|
148
|
+
db.prepare(`DELETE FROM human_requests WHERE request_id IN (${placeholders})`).run(...reviewIds);
|
|
148
149
|
});
|
|
150
|
+
return reviewIds;
|
|
149
151
|
}
|
|
150
|
-
export function listBindingReviews() {
|
|
151
|
-
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export function
|
|
155
|
-
return readRecords(openDb(), "state = 'open' AND submit_requested_at IS NOT NULL");
|
|
156
|
-
}
|
|
157
|
-
export function listUnprojectedTerminalReviews() {
|
|
158
|
-
return readRecords(openDb(), "state IN ('approved', 'canceled') AND projected_at IS NULL");
|
|
159
|
-
}
|
|
160
|
-
export function bindBridgeNode(reviewId, bridgeNodeId) {
|
|
161
|
-
return withCanvasWrite((db) => db.prepare('UPDATE reviews SET bridge_node_id = ? WHERE review_id = ? AND bridge_node_id IS NULL').run(bridgeNodeId, reviewId).changes > 0);
|
|
162
|
-
}
|
|
163
|
-
export function openReviewRow(reviewId, openedAt) {
|
|
164
|
-
return withCanvasWrite((db) => db.prepare("UPDATE reviews SET state = 'open', opened_at = ? WHERE review_id = ? AND state = 'binding'").run(openedAt, reviewId).changes > 0);
|
|
165
|
-
}
|
|
166
|
-
/** Record the human's submit intent on a review that stays open meanwhile.
|
|
167
|
-
* False when the review already left `open` or already carries an intent. */
|
|
168
|
-
export function requestReviewSubmit(reviewId, at) {
|
|
169
|
-
return withCanvasWrite((db) => db.prepare("UPDATE reviews SET submit_requested_at = ? WHERE review_id = ? AND state = 'open' AND submit_requested_at IS NULL").run(at, reviewId).changes > 0);
|
|
170
|
-
}
|
|
152
|
+
export function listBindingReviews() { return listBindingRequests().map(record); }
|
|
153
|
+
export function listSubmitRequestedReviews() { return listSubmitRequestedRequests().map(record); }
|
|
154
|
+
export function listUnprojectedTerminalReviews() { return listUnprojectedReviews().map(record); }
|
|
155
|
+
export function openReviewRow(reviewId, openedAt) { return openRequest(reviewId, openedAt); }
|
|
156
|
+
export function requestReviewSubmit(reviewId, at) { return requestSubmit(reviewId, at); }
|
|
171
157
|
export function approveReviewLocked(db, args) {
|
|
172
|
-
return db.prepare(`
|
|
173
|
-
UPDATE reviews SET
|
|
174
|
-
state = 'approved', approved_at = ?, approved_sha256 = ?, changed = ?,
|
|
175
|
-
comments_total = ?, comments_unresolved = ?, result_json = ?
|
|
176
|
-
WHERE review_id = ? AND state = 'open'
|
|
177
|
-
`).run(args.approved_at, args.approved_sha256, args.changed ? 1 : 0, args.comments_total, args.comments_unresolved, args.result_json, args.review_id).changes > 0;
|
|
158
|
+
return db.prepare(`UPDATE human_requests SET state = 'settled', outcome = 'approved', result_json = ?, settled_at = ?, progress_json = NULL, updated_at = ? WHERE request_id = ? AND kind = 'review' AND state = 'open'`).run(args.result_json, args.approved_at, args.approved_at, args.review_id).changes > 0;
|
|
178
159
|
}
|
|
179
160
|
export function cancelReviewRow(reviewId, args) {
|
|
180
|
-
return withCanvasWrite((db) => db.prepare(`
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
}
|
|
186
|
-
export function
|
|
187
|
-
|
|
188
|
-
db.prepare('UPDATE reviews SET projected_at = ?, projection_error = NULL WHERE review_id = ?').run(at, reviewId);
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
export function markProjectionError(reviewId, error) {
|
|
192
|
-
withCanvasWrite((db) => {
|
|
193
|
-
db.prepare('UPDATE reviews SET projection_error = ? WHERE review_id = ? AND projected_at IS NULL').run(error, reviewId);
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
export function markDelivered(reviewId, receipt, at) {
|
|
197
|
-
withCanvasWrite((db) => {
|
|
198
|
-
db.prepare('UPDATE reviews SET delivery_entry_id = ?, delivered_at = ?, delivery_error = NULL WHERE review_id = ?').run(receipt, at, reviewId);
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
export function markDeliveryError(reviewId, error) {
|
|
202
|
-
withCanvasWrite((db) => {
|
|
203
|
-
db.prepare('UPDATE reviews SET delivery_error = ? WHERE review_id = ? AND delivered_at IS NULL').run(error, reviewId);
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
export function readAnchorBase(reviewId) {
|
|
207
|
-
const raw = openDb().prepare('SELECT anchor_base_bytes, anchor_base_sha256 FROM reviews WHERE review_id = ?').get(reviewId);
|
|
208
|
-
if (raw === undefined)
|
|
209
|
-
return null;
|
|
210
|
-
return { bytes: Buffer.from(raw.anchor_base_bytes), sha256: raw.anchor_base_sha256 };
|
|
211
|
-
}
|
|
212
|
-
export function replaceAnchorBaseLocked(db, reviewId, bytes, sha256) {
|
|
213
|
-
db.prepare('UPDATE reviews SET anchor_base_bytes = ?, anchor_base_sha256 = ? WHERE review_id = ?').run(bytes, sha256, reviewId);
|
|
214
|
-
}
|
|
161
|
+
return withCanvasWrite((db) => db.prepare(`UPDATE human_requests SET state = 'settled', outcome = 'canceled', result_json = ?, settled_at = ?, progress_json = NULL, updated_at = ? WHERE request_id = ? AND kind = 'review' AND state = 'open'`).run(JSON.stringify({ schema: 'humanloop.cancel/v1', kind: 'canceled', canceledAt: args.at, ...(args.reason === '' ? {} : { reason: args.reason }), ...(args.actor === null ? {} : { actor: args.actor }) }), args.at, args.at, reviewId).changes > 0);
|
|
162
|
+
}
|
|
163
|
+
export function markProjected(reviewId, at) { markRequestProjected(reviewId, at); }
|
|
164
|
+
export function markProjectionError(reviewId, error) { markRequestProjectionError(reviewId, error); }
|
|
165
|
+
export function markDelivered(_reviewId, _receipt, _at) { }
|
|
166
|
+
export function markDeliveryError(_reviewId, _error) { }
|
|
167
|
+
export function readAnchorBase(reviewId) { return readRequestAnchorBase(reviewId); }
|
|
168
|
+
export function replaceAnchorBaseLocked(db, reviewId, bytes, sha256) { replaceRequestAnchorBaseLocked(db, reviewId, bytes, sha256); }
|
|
@@ -6,33 +6,37 @@
|
|
|
6
6
|
// switching CRTR_HOME to a fresh home B, used to keep stamping A's install id
|
|
7
7
|
// onto B's nodes. The lazy cache must be keyed by canvas-db identity so a
|
|
8
8
|
// home switch can never leak one canvas's install id onto another's.
|
|
9
|
-
import { test, before, after
|
|
9
|
+
import { test, before, after } from 'node:test';
|
|
10
10
|
import assert from 'node:assert/strict';
|
|
11
11
|
import { mkdtempSync, rmSync } from 'node:fs';
|
|
12
|
-
import { closeDb } from '../../canvas/db.js';
|
|
12
|
+
import { closeDb, migrate, openDb } from '../../canvas/db.js';
|
|
13
13
|
import { resolveInstallId } from '../../canvas/install-id.js';
|
|
14
14
|
import { newNodeId } from '../nodes.js';
|
|
15
15
|
let homeA;
|
|
16
16
|
let homeB;
|
|
17
|
+
const previousCrtrHome = process.env['CRTR_HOME'];
|
|
17
18
|
before(() => {
|
|
18
19
|
homeA = mkdtempSync('/tmp/crtr-install-id-home-a-');
|
|
19
20
|
homeB = mkdtempSync('/tmp/crtr-install-id-home-b-');
|
|
20
21
|
});
|
|
21
|
-
beforeEach(() => {
|
|
22
|
-
closeDb();
|
|
23
|
-
});
|
|
24
22
|
after(() => {
|
|
25
23
|
closeDb();
|
|
26
24
|
rmSync(homeA, { recursive: true, force: true });
|
|
27
25
|
rmSync(homeB, { recursive: true, force: true });
|
|
26
|
+
if (previousCrtrHome === undefined)
|
|
27
|
+
delete process.env['CRTR_HOME'];
|
|
28
|
+
else
|
|
29
|
+
process.env['CRTR_HOME'] = previousCrtrHome;
|
|
28
30
|
});
|
|
29
31
|
test('newNodeId does not leak one CRTR_HOME\'s install id onto another after a home switch', () => {
|
|
30
32
|
process.env['CRTR_HOME'] = homeA;
|
|
33
|
+
migrate(openDb());
|
|
31
34
|
const idFromA = newNodeId();
|
|
32
35
|
const installA = resolveInstallId();
|
|
33
36
|
assert.ok(idFromA.startsWith(`${installA}-`), 'a node minted in home A must be stamped with home A\'s install id');
|
|
34
37
|
closeDb();
|
|
35
38
|
process.env['CRTR_HOME'] = homeB;
|
|
39
|
+
migrate(openDb());
|
|
36
40
|
const installB = resolveInstallId();
|
|
37
41
|
assert.notEqual(installB, installA, 'home A and home B must self-mint distinct install ids for this test to be meaningful');
|
|
38
42
|
const idFromB = newNodeId();
|
|
@@ -12,7 +12,9 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync, realpathSync } from 'nod
|
|
|
12
12
|
import { tmpdir } from 'node:os';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
14
|
import { resetScopeCache } from '../../scope.js';
|
|
15
|
-
import { readMergedLaunchConfig } from '../../config.js';
|
|
15
|
+
import { readMergedLaunchConfig, writeRawConfig, updateConfigAtRoot } from '../../config.js';
|
|
16
|
+
import { createProfile, profileRoot } from '../../profiles/manifest.js';
|
|
17
|
+
import { initializeFreshScopedStore } from '../../scoped-state/migrate.js';
|
|
16
18
|
import { buildOperationalEnvBase, buildBrokerEnv } from '../spawn-env.js';
|
|
17
19
|
const LEAK_CLASS_HOST_ENV = {
|
|
18
20
|
HOME: '/Users/tester',
|
|
@@ -61,6 +63,7 @@ beforeEach(() => {
|
|
|
61
63
|
isolatedCwd = realpathSync(mkdtempSync(join(tmpdir(), 'crtr-spawn-env-cwd-')));
|
|
62
64
|
process.env.HOME = isolatedHome;
|
|
63
65
|
process.chdir(isolatedCwd);
|
|
66
|
+
initializeFreshScopedStore({ kind: 'user', root: join(isolatedHome, '.crouter') });
|
|
64
67
|
resetScopeCache();
|
|
65
68
|
});
|
|
66
69
|
afterEach(() => {
|
|
@@ -168,8 +171,7 @@ test('buildBrokerEnv overlays inv.env + FRONT_DOOR_ENV on top of the sanitized b
|
|
|
168
171
|
});
|
|
169
172
|
// C — explicit spawnEnv.allow escape hatch: literal names + globs.
|
|
170
173
|
test('C: an explicit spawnEnv.allow literal name admits a var that would otherwise be dropped', () => {
|
|
171
|
-
|
|
172
|
-
writeFileSync(join(isolatedHome, '.crouter', 'config.json'), JSON.stringify({ spawnEnv: { allow: ['GOOGLE_GENERATIVE_AI_API_KEY'] } }));
|
|
174
|
+
writeRawConfig('user', { spawnEnv: { allow: ['GOOGLE_GENERATIVE_AI_API_KEY'] } });
|
|
173
175
|
resetScopeCache();
|
|
174
176
|
const env = base(LEAK_CLASS_HOST_ENV);
|
|
175
177
|
assert.equal(env.GOOGLE_GENERATIVE_AI_API_KEY, 'fake-g', 'explicitly allowlisted name now crosses');
|
|
@@ -177,8 +179,7 @@ test('C: an explicit spawnEnv.allow literal name admits a var that would otherwi
|
|
|
177
179
|
assert.equal(env.GIT_ASKPASS, undefined);
|
|
178
180
|
});
|
|
179
181
|
test('C (glob, Minor fix): AWS_* admits only AWS_-prefixed names, nothing else', () => {
|
|
180
|
-
|
|
181
|
-
writeFileSync(join(isolatedHome, '.crouter', 'config.json'), JSON.stringify({ spawnEnv: { allow: ['AWS_*'] } }));
|
|
182
|
+
writeRawConfig('user', { spawnEnv: { allow: ['AWS_*'] } });
|
|
182
183
|
resetScopeCache();
|
|
183
184
|
const env = base(LEAK_CLASS_HOST_ENV);
|
|
184
185
|
assert.equal(env.AWS_ACCESS_KEY_ID, 'fake-aws-id', 'AWS_-prefixed name admitted by the glob');
|
|
@@ -248,10 +249,8 @@ test('target-scope: buildBrokerEnv resolves spawnEnv.allow from inv.env.CRTR_NOD
|
|
|
248
249
|
}
|
|
249
250
|
});
|
|
250
251
|
test('target-scope: spawnEnv.allow is read from the TARGET profile id, not this process\'s ambient CRTR_PROFILE_ID', () => {
|
|
251
|
-
const profileId = '
|
|
252
|
-
|
|
253
|
-
mkdirSync(profileDir, { recursive: true });
|
|
254
|
-
writeFileSync(join(profileDir, 'config.json'), JSON.stringify({ spawnEnv: { allow: ['AWS_ACCESS_KEY_ID'] } }));
|
|
252
|
+
const { profileId } = createProfile('test profile');
|
|
253
|
+
updateConfigAtRoot(profileRoot(profileId), (config) => { config.spawnEnv = { allow: ['AWS_ACCESS_KEY_ID'] }; });
|
|
255
254
|
resetScopeCache();
|
|
256
255
|
const withoutTargetProfile = buildOperationalEnvBase({ targetCwd: isolatedCwd, targetProfileId: null, host: LEAK_CLASS_HOST_ENV });
|
|
257
256
|
assert.equal(withoutTargetProfile.AWS_ACCESS_KEY_ID, undefined, 'no profile passed — the profile-scoped allow must not apply');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AUTH_FAULT_RECOVERY_BODY, formatCard, } from '../../../shared/generated-context.js';
|
|
2
2
|
import { envModelIntent } from '../../../shared/env.js';
|
|
3
3
|
import { emitEvent } from '../../events/emit.js';
|
|
4
|
-
import {
|
|
4
|
+
import { brokerRecovery, mutateBrokerFault } from './daemon-ops.js';
|
|
5
5
|
import { isUnknownModel } from '../model-selection.js';
|
|
6
6
|
import { announceMessageOrigin } from '../stamp/channel.js';
|
|
7
7
|
export function createAuthReloadGate(deps) {
|
|
@@ -74,22 +74,21 @@ export function createAuthReloadGate(deps) {
|
|
|
74
74
|
/** Rewind to the entry the recorded auth fault killed and re-drive the turn
|
|
75
75
|
* with the recovery prompt — once, after the reconcile it depends on. */
|
|
76
76
|
const redriveAuthFault = (reload) => {
|
|
77
|
-
const authFault = readFault(nodeId);
|
|
78
77
|
const generation = rebind.installedGeneration();
|
|
79
78
|
const faultSession = session();
|
|
80
|
-
if (
|
|
81
|
-
authFault.kind !== 'auth' ||
|
|
82
|
-
faultSession.isStreaming ||
|
|
83
|
-
faultRedriveInFlight)
|
|
79
|
+
if (faultSession.isStreaming || faultRedriveInFlight)
|
|
84
80
|
return;
|
|
85
81
|
faultRedriveInFlight = true;
|
|
86
82
|
void (async () => {
|
|
87
83
|
try {
|
|
84
|
+
const authFault = (await brokerRecovery(nodeId)).fault;
|
|
85
|
+
if (authFault?.link !== 'pi→provider' || authFault.kind !== 'auth')
|
|
86
|
+
return;
|
|
88
87
|
if (reload !== undefined)
|
|
89
88
|
await reload;
|
|
90
89
|
if (supersededBy(generation, faultSession))
|
|
91
90
|
return;
|
|
92
|
-
const anchorEntryId = authFault.
|
|
91
|
+
const anchorEntryId = authFault.anchor_entry_id;
|
|
93
92
|
if (anchorEntryId !== undefined) {
|
|
94
93
|
try {
|
|
95
94
|
const leafId = faultSession.sessionManager.getLeafId?.() ?? null;
|
|
@@ -106,19 +105,19 @@ export function createAuthReloadGate(deps) {
|
|
|
106
105
|
});
|
|
107
106
|
}
|
|
108
107
|
}
|
|
109
|
-
const fresh =
|
|
108
|
+
const fresh = (await brokerRecovery(nodeId)).fault;
|
|
110
109
|
if (supersededBy(generation, faultSession) ||
|
|
111
110
|
faultSession.isStreaming ||
|
|
112
111
|
fresh?.link !== 'pi→provider' ||
|
|
113
112
|
fresh.kind !== 'auth' ||
|
|
114
113
|
fresh.since !== authFault.since)
|
|
115
114
|
return;
|
|
116
|
-
await turnAdmission.admit((release) => {
|
|
115
|
+
await turnAdmission.admit(async (release) => {
|
|
117
116
|
if (supersededBy(generation, faultSession) || faultSession.isStreaming) {
|
|
118
117
|
release();
|
|
119
118
|
return Promise.resolve();
|
|
120
119
|
}
|
|
121
|
-
|
|
120
|
+
await mutateBrokerFault(nodeId, { op: 'clear', link: 'pi→provider' });
|
|
122
121
|
const card = formatCard('recovery', {}, AUTH_FAULT_RECOVERY_BODY);
|
|
123
122
|
announceMessageOrigin(card, { type: 'runtime', kind: 'recovery' });
|
|
124
123
|
return faultSession.prompt(card, { preflightResult: release });
|
|
@@ -1,17 +1,33 @@
|
|
|
1
|
-
import type { BrokerExtensionStateDTO, BrokerGeneratedNameRequest, BrokerGeneratedNameResultDTO,
|
|
1
|
+
import type { BrokerExtensionStateDTO, BrokerGeneratedNameRequest, BrokerGeneratedNameResultDTO, BrokerModelCommitRequest, BrokerModelCommitResultDTO, BrokerParkActivityResultDTO, BrokerParkCompleteRequest, BrokerPersonaAckRequest, BrokerPersonaAckResultDTO, BrokerSessionBoundRequest, BrokerSessionBoundResultDTO, BrokerSettleDirective, BrokerSettleRequest } from '../../../api/dto/broker-ops.js';
|
|
2
|
+
import type { AcknowledgeMailResultDTO, ClaimMailResultDTO, MailReceiptDTO } from '../../../api/dto/mail.js';
|
|
3
|
+
import type { BrokerFaultInputDTO, BrokerFaultRequest, BrokerFaultResultDTO, BrokerProviderRetryRequest, BrokerProviderRetryResultDTO, BrokerTurnRequest, BrokerTurnResultDTO, RecoveryStateDTO } from '../../../api/dto/recovery.js';
|
|
2
4
|
import type { RelaunchRootResultDTO } from '../../../api/dto/lifecycle.js';
|
|
3
5
|
import type { PushReportRequest } from '../../../api/dto/reports.js';
|
|
4
|
-
export declare function
|
|
5
|
-
export declare function
|
|
6
|
-
|
|
6
|
+
export declare function brokerExecutionId(): string;
|
|
7
|
+
export declare function bindBrokerSession(nodeId: string, request: Omit<BrokerSessionBoundRequest, 'executionId'>): Promise<BrokerSessionBoundResultDTO>;
|
|
8
|
+
type BrokerInput<T> = T extends unknown ? Omit<T, 'expected_execution_id'> : never;
|
|
9
|
+
export declare function settleBroker(nodeId: string, request: BrokerInput<BrokerSettleRequest>): Promise<BrokerSettleDirective>;
|
|
10
|
+
export declare function completeBrokerPark(nodeId: string, request: BrokerInput<BrokerParkCompleteRequest>): Promise<BrokerSettleDirective>;
|
|
7
11
|
export declare function recordBrokerParkActivity(nodeId: string): Promise<BrokerParkActivityResultDTO>;
|
|
8
|
-
export declare function
|
|
12
|
+
export declare function claimBrokerMail(nodeId: string, channel: 'wake' | 'passive'): Promise<ClaimMailResultDTO>;
|
|
13
|
+
export declare function acknowledgeBrokerMail(nodeId: string, deliveries: MailReceiptDTO[]): Promise<AcknowledgeMailResultDTO>;
|
|
14
|
+
export declare function recordBrokerTurn(nodeId: string, request: Omit<BrokerTurnRequest, 'expected_execution_id'>): Promise<BrokerTurnResultDTO>;
|
|
15
|
+
export declare function mutateBrokerProviderRetry(nodeId: string, request: Omit<BrokerProviderRetryRequest, 'expected_execution_id'>): Promise<BrokerProviderRetryResultDTO>;
|
|
16
|
+
export declare function mutateBrokerFault(nodeId: string, request: Omit<BrokerFaultRequest, 'expected_execution_id'>): Promise<BrokerFaultResultDTO>;
|
|
17
|
+
export declare function brokerRecovery(nodeId: string): Promise<RecoveryStateDTO>;
|
|
18
|
+
/** Node-scoped fault writes are for non-broker clients such as attach transport.
|
|
19
|
+
* Broker-owned recovery mutations use the execution-fenced wrappers above. */
|
|
20
|
+
export declare function recordNodeFault(nodeId: string, input: BrokerFaultInputDTO): Promise<BrokerFaultResultDTO>;
|
|
21
|
+
export declare function clearNodeFault(nodeId: string, opts?: {
|
|
22
|
+
link?: BrokerFaultInputDTO['link'];
|
|
23
|
+
preserveEpisode?: boolean;
|
|
24
|
+
}): Promise<boolean>;
|
|
9
25
|
/** Fixed canvas projection for broker extension rendering. It deliberately
|
|
10
26
|
* exposes no generic node/database facade. */
|
|
11
|
-
export declare function commitBrokerModel(nodeId: string, request: BrokerModelCommitRequest): Promise<BrokerModelCommitResultDTO>;
|
|
27
|
+
export declare function commitBrokerModel(nodeId: string, request: BrokerInput<BrokerModelCommitRequest>): Promise<BrokerModelCommitResultDTO>;
|
|
12
28
|
export declare function brokerExtensionState(nodeId: string): Promise<BrokerExtensionStateDTO>;
|
|
13
|
-
export declare function commitBrokerGeneratedName(nodeId: string, request: BrokerGeneratedNameRequest): Promise<BrokerGeneratedNameResultDTO>;
|
|
14
|
-
export declare function commitBrokerPersonaAck(nodeId: string, request: BrokerPersonaAckRequest): Promise<BrokerPersonaAckResultDTO>;
|
|
29
|
+
export declare function commitBrokerGeneratedName(nodeId: string, request: BrokerInput<BrokerGeneratedNameRequest>): Promise<BrokerGeneratedNameResultDTO>;
|
|
30
|
+
export declare function commitBrokerPersonaAck(nodeId: string, request: BrokerInput<BrokerPersonaAckRequest>): Promise<BrokerPersonaAckResultDTO>;
|
|
15
31
|
/** Reports still use the canonical daemon report handler; this broker adapter
|
|
16
32
|
* only preserves terminal structured output's idempotent finalization result. */
|
|
17
33
|
export declare function publishBrokerReport(nodeId: string, request: PushReportRequest): Promise<void>;
|
|
@@ -19,3 +35,4 @@ export declare function publishBrokerReport(nodeId: string, request: PushReportR
|
|
|
19
35
|
* a replacement broker and tears down this broker. Callers must not await it
|
|
20
36
|
* from Pi's session-start dispatch. */
|
|
21
37
|
export declare function relaunchBrokerRoot(nodeId: string): Promise<RelaunchRootResultDTO>;
|
|
38
|
+
export {};
|