@north-light/cli 0.3.530 → 0.3.532
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/clients/attach/session/connection.js +1 -1
- package/dist/clients/attach/session/reconnect.js +1 -1
- package/dist/clients/attach/viewer.js +508 -508
- package/dist/core/async-array.d.ts +7 -0
- package/dist/core/async-array.js +1 -0
- package/dist/core/audit.d.ts +1 -1
- package/dist/core/audit.js +2 -2
- package/dist/core/canvas/attention.d.ts +4 -4
- package/dist/core/canvas/attention.js +1 -1
- package/dist/core/canvas/boot.d.ts +4 -4
- package/dist/core/canvas/boot.js +1 -1
- package/dist/core/canvas/canvas.d.ts +59 -59
- package/dist/core/canvas/canvas.js +19 -19
- package/dist/core/canvas/context-strip.js +2 -2
- package/dist/core/canvas/crons.d.ts +27 -27
- package/dist/core/canvas/crons.js +11 -11
- package/dist/core/canvas/daemon-actions.d.ts +10 -10
- package/dist/core/canvas/daemon-actions.js +8 -8
- package/dist/core/canvas/daemon-owner.d.ts +3 -3
- package/dist/core/canvas/daemon-owner.js +2 -2
- package/dist/core/canvas/db.d.ts +19 -30
- package/dist/core/canvas/db.js +3 -2
- package/dist/core/canvas/deliveries.d.ts +16 -16
- package/dist/core/canvas/deliveries.js +24 -24
- package/dist/core/canvas/executions.d.ts +8 -8
- package/dist/core/canvas/executions.js +1 -1
- package/dist/core/canvas/focuses.d.ts +8 -8
- package/dist/core/canvas/focuses.js +1 -1
- package/dist/core/canvas/history.d.ts +3 -3
- package/dist/core/canvas/history.js +9 -9
- package/dist/core/canvas/install-id.d.ts +1 -1
- package/dist/core/canvas/install-id.js +1 -1
- package/dist/core/canvas/managed-worktree-sweep-candidates.d.ts +1 -1
- package/dist/core/canvas/managed-worktree-sweep-candidates.js +2 -2
- package/dist/core/canvas/memory-reads.d.ts +6 -6
- package/dist/core/canvas/memory-reads.js +1 -1
- package/dist/core/canvas/nav-model.d.ts +13 -13
- package/dist/core/canvas/nav-model.js +1 -1
- package/dist/core/canvas/node-agent-paths.d.ts +6 -6
- package/dist/core/canvas/node-agent-paths.js +1 -1
- package/dist/core/canvas/node-tokens.d.ts +7 -7
- package/dist/core/canvas/node-tokens.js +3 -3
- package/dist/core/canvas/outcome-actions.d.ts +5 -5
- package/dist/core/canvas/outcome-actions.js +3 -3
- package/dist/core/canvas/recovery.d.ts +26 -26
- package/dist/core/canvas/recovery.js +2 -2
- package/dist/core/canvas/render-source.d.ts +1 -1
- package/dist/core/canvas/render-source.js +1 -1
- package/dist/core/canvas/sessions.d.ts +10 -10
- package/dist/core/canvas/sessions.js +4 -4
- package/dist/core/canvas/source.js +1 -1
- package/dist/core/canvas/structured-requests.d.ts +15 -15
- package/dist/core/canvas/structured-requests.js +5 -5
- package/dist/core/canvas/tree.d.ts +9 -9
- package/dist/core/canvas/tree.js +5 -5
- package/dist/core/canvas/waits.d.ts +13 -13
- package/dist/core/canvas/waits.js +6 -6
- package/dist/core/canvas/worktrees.d.ts +15 -15
- package/dist/core/canvas/worktrees.js +1 -1
- package/dist/core/command-hooks/transport/exec-lifecycle.js +1 -1
- package/dist/core/conversation-store/file-store.d.ts +7 -7
- package/dist/core/conversation-store/file-store.js +9 -9
- package/dist/core/conversation-store/index.d.ts +16 -14
- package/dist/core/conversation-store/index.js +1 -1
- package/dist/core/conversation-store/listener.js +5 -5
- package/dist/core/conversation-store/patch.d.ts +3 -1
- package/dist/core/conversation-store/patch.js +1 -1
- package/dist/core/feed/feed.js +3 -3
- package/dist/core/feed/inbox.d.ts +2 -2
- package/dist/core/feed/inbox.js +1 -1
- package/dist/core/feed/messages.d.ts +11 -12
- package/dist/core/feed/messages.js +5 -5
- package/dist/core/feed/reports.d.ts +4 -4
- package/dist/core/feed/reports.js +2 -2
- package/dist/core/grants/cover.d.ts +1 -1
- package/dist/core/grants/cover.js +1 -1
- package/dist/core/grants/local.d.ts +1 -1
- package/dist/core/grants/local.js +1 -1
- package/dist/core/grants/mirror.d.ts +19 -19
- package/dist/core/grants/mirror.js +2 -2
- package/dist/core/grants/on-sync.d.ts +1 -1
- package/dist/core/grants/on-sync.js +1 -1
- package/dist/core/grants/remove.js +1 -1
- package/dist/core/grants/sync.js +1 -1
- package/dist/core/graph/access.d.ts +17 -17
- package/dist/core/graph/access.js +3 -3
- package/dist/core/graph/custom.d.ts +16 -16
- package/dist/core/graph/custom.js +9 -9
- package/dist/core/graph/deletion.d.ts +3 -7
- package/dist/core/graph/deletion.js +4 -4
- package/dist/core/graph/documents.d.ts +24 -27
- package/dist/core/graph/documents.js +7 -7
- package/dist/core/graph/edges.d.ts +13 -13
- package/dist/core/graph/edges.js +1 -1
- package/dist/core/graph/events.d.ts +7 -9
- package/dist/core/graph/events.js +8 -8
- package/dist/core/graph/exposures.d.ts +6 -6
- package/dist/core/graph/exposures.js +4 -4
- package/dist/core/graph/jobs.d.ts +6 -8
- package/dist/core/graph/jobs.js +2 -2
- package/dist/core/graph/kinds/action.js +1 -1
- package/dist/core/graph/kinds/custom.js +2 -2
- package/dist/core/graph/kinds/document.d.ts +1 -0
- package/dist/core/graph/kinds/document.js +4 -4
- package/dist/core/graph/kinds/dto.d.ts +2 -2
- package/dist/core/graph/kinds/dto.js +1 -1
- package/dist/core/graph/kinds/job.js +2 -2
- package/dist/core/graph/kinds/kind.d.ts +6 -8
- package/dist/core/graph/kinds/kind.js +1 -1
- package/dist/core/graph/kinds/node.js +5 -5
- package/dist/core/graph/kinds/owner.js +2 -2
- package/dist/core/graph/kinds/registry.d.ts +6 -9
- package/dist/core/graph/kinds/registry.js +1 -1
- package/dist/core/graph/names.d.ts +6 -6
- package/dist/core/graph/names.js +3 -3
- package/dist/core/graph/object-waits.d.ts +4 -7
- package/dist/core/graph/object-waits.js +1 -1
- package/dist/core/graph/objects.d.ts +14 -14
- package/dist/core/graph/objects.js +9 -9
- package/dist/core/graph/package-docs.d.ts +2 -7
- package/dist/core/graph/package-docs.js +5 -5
- package/dist/core/graph/package-kinds.d.ts +2 -5
- package/dist/core/graph/package-kinds.js +1 -1
- package/dist/core/graph/package-reconcile.d.ts +2 -5
- package/dist/core/graph/package-reconcile.js +1 -1
- package/dist/core/graph/reader.d.ts +18 -18
- package/dist/core/graph/reader.js +3 -3
- package/dist/core/graph/receivers.d.ts +4 -4
- package/dist/core/graph/receivers.js +5 -5
- package/dist/core/graph/repo-sync/exchange.d.ts +3 -7
- package/dist/core/graph/repo-sync/exchange.js +2 -2
- package/dist/core/graph/repo-sync/repos.d.ts +7 -5
- package/dist/core/graph/repo-sync/repos.js +3 -3
- package/dist/core/graph/repo-sync/sync.d.ts +3 -6
- package/dist/core/graph/repo-sync/sync.js +2 -2
- package/dist/core/graph/rules.d.ts +5 -5
- package/dist/core/graph/rules.js +3 -3
- package/dist/core/graph/spaces/app.js +1 -1
- package/dist/core/graph/spaces/index.d.ts +4 -5
- package/dist/core/graph/spaces/index.js +1 -1
- package/dist/core/graph/spaces/own-memory.d.ts +4 -4
- package/dist/core/graph/spaces/own-memory.js +1 -1
- package/dist/core/graph/spaces/person.js +3 -3
- package/dist/core/graph/spaces/repo.d.ts +1 -1
- package/dist/core/graph/spaces/repo.js +1 -1
- package/dist/core/graph/watches.d.ts +15 -15
- package/dist/core/graph/watches.js +10 -10
- package/dist/core/human/feedback-companion.d.ts +2 -2
- package/dist/core/human/feedback-companion.js +1 -1
- package/dist/core/human/feedback.d.ts +3 -3
- package/dist/core/human/feedback.js +1 -1
- package/dist/core/human/requests.d.ts +34 -33
- package/dist/core/human/requests.js +20 -20
- package/dist/core/human/scan.d.ts +2 -2
- package/dist/core/human/scan.js +1 -1
- package/dist/core/human/tickets.d.ts +9 -9
- package/dist/core/human/tickets.js +1 -1
- package/dist/core/llm/app-rungs.d.ts +1 -1
- package/dist/core/llm/app-rungs.js +1 -1
- package/dist/core/llm/run.js +2 -2
- package/dist/core/peer/directory.d.ts +1 -1
- package/dist/core/peer/directory.js +1 -1
- package/dist/core/peer/envelope.d.ts +3 -3
- package/dist/core/peer/envelope.js +1 -1
- package/dist/core/peer/home.d.ts +13 -7
- package/dist/core/peer/home.js +2 -2
- package/dist/core/peer/ingest.d.ts +6 -6
- package/dist/core/peer/ingest.js +1 -1
- package/dist/core/peer/outbox-store.d.ts +14 -14
- package/dist/core/peer/outbox-store.js +5 -5
- package/dist/core/peer/receiver.d.ts +2 -2
- package/dist/core/peer/receiver.js +1 -1
- package/dist/core/peer/stubs.d.ts +10 -10
- package/dist/core/peer/stubs.js +1 -1
- package/dist/core/providers/approval.d.ts +2 -2
- package/dist/core/providers/approval.js +2 -2
- package/dist/core/providers/audit.d.ts +3 -3
- package/dist/core/providers/audit.js +2 -2
- package/dist/core/providers/bundles.js +2 -2
- package/dist/core/providers/call.d.ts +2 -2
- package/dist/core/providers/call.js +1 -1
- package/dist/core/providers/files.d.ts +1 -1
- package/dist/core/providers/files.js +1 -1
- package/dist/core/providers/mint.js +1 -1
- package/dist/core/providers/receipts.d.ts +1 -1
- package/dist/core/providers/receipts.js +2 -2
- package/dist/core/review/birth.js +1 -1
- package/dist/core/review/comments.d.ts +19 -19
- package/dist/core/review/comments.js +5 -5
- package/dist/core/review/companion.d.ts +1 -1
- package/dist/core/review/companion.js +1 -1
- package/dist/core/review/document.d.ts +3 -3
- package/dist/core/review/document.js +2 -2
- package/dist/core/review/fork.js +2 -2
- package/dist/core/review/realize.js +1 -1
- package/dist/core/review/remap.d.ts +2 -2
- package/dist/core/review/remap.js +4 -4
- package/dist/core/review/stage.d.ts +1 -1
- package/dist/core/review/stage.js +1 -1
- package/dist/core/review/store.d.ts +21 -21
- package/dist/core/review/store.js +1 -1
- package/dist/core/runs/activity.d.ts +1 -1
- package/dist/core/runs/activity.js +5 -5
- package/dist/core/runs/confinement.d.ts +7 -7
- package/dist/core/runs/confinement.js +2 -2
- package/dist/core/runs/events.d.ts +12 -12
- package/dist/core/runs/events.js +4 -4
- package/dist/core/runs/operations.d.ts +11 -11
- package/dist/core/runs/operations.js +5 -5
- package/dist/core/runs/questions.d.ts +10 -10
- package/dist/core/runs/questions.js +3 -3
- package/dist/core/runtime/auth-reload.js +1 -1
- package/dist/core/runtime/bearings.d.ts +5 -5
- package/dist/core/runtime/bearings.js +6 -6
- package/dist/core/runtime/broker-inventory.js +1 -1
- package/dist/core/runtime/broker-request.js +1 -1
- package/dist/core/runtime/broker.js +1 -1
- package/dist/core/runtime/close.d.ts +3 -3
- package/dist/core/runtime/close.js +1 -1
- package/dist/core/runtime/deliver-live.js +1 -1
- package/dist/core/runtime/fleet.d.ts +2 -2
- package/dist/core/runtime/host.d.ts +3 -3
- package/dist/core/runtime/host.js +3 -3
- package/dist/core/runtime/kickoff.d.ts +12 -12
- package/dist/core/runtime/kickoff.js +17 -17
- package/dist/core/runtime/launch-target.d.ts +1 -1
- package/dist/core/runtime/launch-target.js +1 -1
- package/dist/core/runtime/ledger.d.ts +3 -3
- package/dist/core/runtime/ledger.js +3 -3
- package/dist/core/runtime/lifecycle.d.ts +1 -1
- package/dist/core/runtime/lifecycle.js +2 -2
- package/dist/core/runtime/memory-admission.js +1 -1
- package/dist/core/runtime/model-swap.d.ts +2 -2
- package/dist/core/runtime/model-swap.js +1 -1
- package/dist/core/runtime/node-read.d.ts +1 -1
- package/dist/core/runtime/node-read.js +2 -2
- package/dist/core/runtime/nodes.d.ts +6 -6
- package/dist/core/runtime/nodes.js +1 -1
- package/dist/core/runtime/outcome-document.d.ts +1 -1
- package/dist/core/runtime/outcome-document.js +1 -1
- package/dist/core/runtime/persona.d.ts +3 -3
- package/dist/core/runtime/persona.js +2 -2
- package/dist/core/runtime/placement.d.ts +11 -11
- package/dist/core/runtime/placement.js +1 -1
- package/dist/core/runtime/promote.d.ts +3 -3
- package/dist/core/runtime/promote.js +1 -1
- package/dist/core/runtime/recycle.js +1 -1
- package/dist/core/runtime/reopen.d.ts +5 -5
- package/dist/core/runtime/reopen.js +1 -1
- package/dist/core/runtime/reset.d.ts +4 -4
- package/dist/core/runtime/reset.js +1 -1
- package/dist/core/runtime/revive-all.d.ts +2 -2
- package/dist/core/runtime/revive-all.js +1 -1
- package/dist/core/runtime/revive.d.ts +4 -4
- package/dist/core/runtime/revive.js +2 -2
- package/dist/core/runtime/roadmap.d.ts +6 -6
- package/dist/core/runtime/roadmap.js +5 -5
- package/dist/core/runtime/session-branch.d.ts +1 -1
- package/dist/core/runtime/session-branch.js +1 -1
- package/dist/core/runtime/session-list-cache.js +1 -1
- package/dist/core/runtime/situational-live.js +1 -1
- package/dist/core/runtime/spawn.d.ts +2 -2
- package/dist/core/runtime/spawn.js +2 -2
- package/dist/core/runtime/stop-guard.d.ts +2 -2
- package/dist/core/runtime/stop-guard.js +3 -3
- package/dist/core/runtime/warm-pool.d.ts +2 -2
- package/dist/core/runtime/warm-pool.js +1 -1
- package/dist/core/spaces/mounts.d.ts +2 -2
- package/dist/core/spaces/mounts.js +1 -1
- package/dist/core/spaces/permissions.d.ts +1 -1
- package/dist/core/spaces/permissions.js +1 -1
- package/dist/core/spaces/process.d.ts +1 -1
- package/dist/core/spaces/process.js +1 -1
- package/dist/core/spaces/space.js +1 -1
- package/dist/core/spaces/stop.d.ts +3 -3
- package/dist/core/spaces/stop.js +2 -2
- package/dist/core/spaces/users.d.ts +6 -6
- package/dist/core/spaces/users.js +1 -1
- package/dist/core/storage/attachments.d.ts +2 -2
- package/dist/core/storage/attachments.js +1 -1
- package/dist/core/storage/shares.d.ts +2 -2
- package/dist/core/storage/shares.js +1 -1
- package/dist/core/storage/tables.d.ts +21 -21
- package/dist/core/storage/tables.js +3 -3
- package/dist/core/substrate/delivery/corpus.d.ts +5 -8
- package/dist/core/substrate/delivery/corpus.js +3 -3
- package/dist/core/substrate/delivery/deliver.d.ts +10 -15
- package/dist/core/substrate/delivery/deliver.js +3 -3
- package/dist/core/substrate/delivery/plan.d.ts +2 -12
- package/dist/core/substrate/delivery/plan.js +3 -3
- package/dist/core/substrate/delivery/render-boot.d.ts +4 -4
- package/dist/core/substrate/delivery/render-boot.js +18 -18
- package/dist/core/substrate/delivery/render-event.d.ts +7 -14
- package/dist/core/substrate/delivery/render-event.js +4 -4
- package/dist/core/substrate/subject.d.ts +2 -2
- package/dist/core/substrate/subject.js +1 -1
- package/dist/core/usage/ledger.d.ts +6 -6
- package/dist/core/usage/ledger.js +4 -4
- package/dist/core/worktree-close.js +4 -4
- package/dist/core/worktree-mutation-async.js +7 -7
- package/dist/core/worktree-quarantine.js +1 -1
- package/dist/core/worktree-sweep.d.ts +1 -1
- package/dist/core/worktree-sweep.js +6 -6
- package/dist/core/worktree.d.ts +5 -5
- package/dist/core/worktree.js +13 -13
- package/dist/daemon/analytics/compute.d.ts +2 -2
- package/dist/daemon/analytics/compute.js +1 -1
- package/dist/daemon/api/app-listener.d.ts +4 -4
- package/dist/daemon/api/app-listener.js +13 -13
- package/dist/daemon/api/bridge.js +5 -5
- package/dist/daemon/api/document-listener.js +6 -6
- package/dist/daemon/api/handlers/analytics.js +1 -1
- package/dist/daemon/api/handlers/attach.js +1 -1
- package/dist/daemon/api/handlers/bash-jobs.js +1 -1
- package/dist/daemon/api/handlers/bash.js +1 -1
- package/dist/daemon/api/handlers/broker-ops.d.ts +1 -1
- package/dist/daemon/api/handlers/broker-ops.js +1 -1
- package/dist/daemon/api/handlers/broker-recovery.d.ts +1 -1
- package/dist/daemon/api/handlers/broker-recovery.js +1 -1
- package/dist/daemon/api/handlers/broker-signals.d.ts +2 -2
- package/dist/daemon/api/handlers/broker-signals.js +2 -2
- package/dist/daemon/api/handlers/canvas.d.ts +1 -1
- package/dist/daemon/api/handlers/canvas.js +4 -4
- package/dist/daemon/api/handlers/chat-inventory.js +1 -1
- package/dist/daemon/api/handlers/crons.js +1 -1
- package/dist/daemon/api/handlers/custom-objects.d.ts +4 -4
- package/dist/daemon/api/handlers/custom-objects.js +3 -3
- package/dist/daemon/api/handlers/delivery-retry.js +1 -1
- package/dist/daemon/api/handlers/delivery.js +1 -1
- package/dist/daemon/api/handlers/docs.d.ts +4 -4
- package/dist/daemon/api/handlers/docs.js +1 -1
- package/dist/daemon/api/handlers/feedback-comments.js +3 -3
- package/dist/daemon/api/handlers/files.js +1 -1
- package/dist/daemon/api/handlers/focus.js +1 -1
- package/dist/daemon/api/handlers/health.js +3 -3
- package/dist/daemon/api/handlers/hook-exec.js +1 -1
- package/dist/daemon/api/handlers/human-requests.js +1 -1
- package/dist/daemon/api/handlers/inbox-page.d.ts +1 -1
- package/dist/daemon/api/handlers/inbox-page.js +1 -1
- package/dist/daemon/api/handlers/inbox.d.ts +1 -1
- package/dist/daemon/api/handlers/inbox.js +1 -1
- package/dist/daemon/api/handlers/llm.d.ts +1 -1
- package/dist/daemon/api/handlers/llm.js +3 -3
- package/dist/daemon/api/handlers/memory-reads.js +1 -1
- package/dist/daemon/api/handlers/memory.d.ts +5 -5
- package/dist/daemon/api/handlers/memory.js +5 -5
- package/dist/daemon/api/handlers/messages.js +2 -2
- package/dist/daemon/api/handlers/node-events.d.ts +2 -2
- package/dist/daemon/api/handlers/node-events.js +3 -3
- package/dist/daemon/api/handlers/node-outcomes.js +1 -1
- package/dist/daemon/api/handlers/node-records.js +2 -2
- package/dist/daemon/api/handlers/nodes.d.ts +1 -1
- package/dist/daemon/api/handlers/nodes.js +1 -1
- package/dist/daemon/api/handlers/objects.js +3 -3
- package/dist/daemon/api/handlers/package-docs.js +1 -1
- package/dist/daemon/api/handlers/plugin-app-token.d.ts +1 -1
- package/dist/daemon/api/handlers/plugin-app-token.js +1 -1
- package/dist/daemon/api/handlers/profiles.d.ts +3 -3
- package/dist/daemon/api/handlers/profiles.js +1 -1
- package/dist/daemon/api/handlers/providers.d.ts +1 -1
- package/dist/daemon/api/handlers/providers.js +1 -1
- package/dist/daemon/api/handlers/questions.js +1 -1
- package/dist/daemon/api/handlers/reports.d.ts +1 -1
- package/dist/daemon/api/handlers/reports.js +5 -5
- package/dist/daemon/api/handlers/review-comments.js +1 -1
- package/dist/daemon/api/handlers/reviews.js +1 -1
- package/dist/daemon/api/handlers/runs.js +1 -1
- package/dist/daemon/api/handlers/structured-requests.js +1 -1
- package/dist/daemon/api/handlers/subscriptions.js +1 -1
- package/dist/daemon/api/handlers/transfer.js +1 -1
- package/dist/daemon/api/map.d.ts +3 -3
- package/dist/daemon/api/map.js +1 -1
- package/dist/daemon/api/principal.d.ts +1 -1
- package/dist/daemon/api/principal.js +1 -1
- package/dist/daemon/api/reader.d.ts +5 -5
- package/dist/daemon/api/reader.js +1 -1
- package/dist/daemon/api/router.d.ts +5 -5
- package/dist/daemon/api/router.js +1 -1
- package/dist/daemon/api/server.js +1 -1
- package/dist/daemon/broker-signals/bus.d.ts +1 -1
- package/dist/daemon/broker-signals/bus.js +1 -1
- package/dist/daemon/companion-retire.js +1 -1
- package/dist/daemon/cron/armed-context.d.ts +2 -2
- package/dist/daemon/cron/armed-context.js +1 -1
- package/dist/daemon/cron/authority.d.ts +2 -2
- package/dist/daemon/cron/authority.js +1 -1
- package/dist/daemon/cron/disposition.js +1 -1
- package/dist/daemon/cron/ended.d.ts +1 -1
- package/dist/daemon/cron/ended.js +2 -2
- package/dist/daemon/cron/escalation.js +3 -3
- package/dist/daemon/cron/folders.d.ts +1 -1
- package/dist/daemon/cron/folders.js +1 -1
- package/dist/daemon/cron/held.d.ts +1 -1
- package/dist/daemon/cron/held.js +1 -1
- package/dist/daemon/cron/lease-recovery.d.ts +1 -1
- package/dist/daemon/cron/lease-recovery.js +1 -1
- package/dist/daemon/cron/passes.d.ts +2 -2
- package/dist/daemon/cron/passes.js +1 -1
- package/dist/daemon/cron/run-socket.d.ts +1 -1
- package/dist/daemon/cron/run-socket.js +1 -1
- package/dist/daemon/cron/settle.js +1 -1
- package/dist/daemon/cron/sinks.d.ts +1 -1
- package/dist/daemon/cron/sinks.js +2 -2
- package/dist/daemon/cron-run.d.ts +12 -3
- package/dist/daemon/cron-run.js +2 -2
- package/dist/daemon/crtrd.js +6 -6
- package/dist/daemon/delivery/run-delivery.js +1 -1
- package/dist/daemon/due-sources.d.ts +3 -3
- package/dist/daemon/due-sources.js +1 -1
- package/dist/daemon/due.d.ts +3 -3
- package/dist/daemon/due.js +7 -7
- package/dist/daemon/fleet.d.ts +2 -2
- package/dist/daemon/fleet.js +11 -11
- package/dist/daemon/human/finish.js +3 -3
- package/dist/daemon/human/settle.d.ts +1 -1
- package/dist/daemon/human/settle.js +1 -1
- package/dist/daemon/human/sweep.js +1 -1
- package/dist/daemon/joined-owner.d.ts +2 -2
- package/dist/daemon/joined-owner.js +1 -1
- package/dist/daemon/messaging/node-message.js +1 -1
- package/dist/daemon/park-activity.d.ts +2 -2
- package/dist/daemon/park-activity.js +1 -1
- package/dist/daemon/peer/authority.js +1 -1
- package/dist/daemon/peer/forward.d.ts +13 -6
- package/dist/daemon/peer/forward.js +1 -1
- package/dist/daemon/peer/handlers.js +1 -1
- package/dist/daemon/peer/ingress.d.ts +4 -4
- package/dist/daemon/peer/ingress.js +1 -1
- package/dist/daemon/peer/outbox.d.ts +2 -2
- package/dist/daemon/peer/outbox.js +1 -1
- package/dist/daemon/peer/relay-service.js +1 -1
- package/dist/daemon/plugin-objects/read-leaf.d.ts +2 -2
- package/dist/daemon/plugin-objects/read-leaf.js +2 -2
- package/dist/daemon/profile-delete.js +1 -1
- package/dist/daemon/readiness.d.ts +2 -2
- package/dist/daemon/readiness.js +1 -1
- package/dist/daemon/reconcilers/action-lane.d.ts +1 -1
- package/dist/daemon/reconcilers/action-lane.js +1 -1
- package/dist/daemon/reconcilers/bash-deadline.js +2 -2
- package/dist/daemon/reconcilers/broker-supervision.d.ts +1 -1
- package/dist/daemon/reconcilers/broker-supervision.js +4 -4
- package/dist/daemon/reconcilers/controller-death.d.ts +1 -1
- package/dist/daemon/reconcilers/controller-death.js +1 -1
- package/dist/daemon/reconcilers/cron-lane.d.ts +1 -1
- package/dist/daemon/reconcilers/cron-lane.js +1 -1
- package/dist/daemon/reconcilers/delivery-lane.d.ts +1 -1
- package/dist/daemon/reconcilers/delivery-lane.js +2 -2
- package/dist/daemon/reconcilers/fault-retry-backstop.d.ts +3 -3
- package/dist/daemon/reconcilers/fault-retry-backstop.js +1 -1
- package/dist/daemon/reconcilers/grove-instance-sweep.d.ts +2 -2
- package/dist/daemon/reconcilers/grove-instance-sweep.js +1 -1
- package/dist/daemon/reconcilers/live-obligation.d.ts +6 -6
- package/dist/daemon/reconcilers/live-obligation.js +1 -1
- package/dist/daemon/reconcilers/managed-worktree-sweep.js +1 -1
- package/dist/daemon/reconcilers/node-deadline.d.ts +1 -1
- package/dist/daemon/reconcilers/node-deadline.js +1 -1
- package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -1
- package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.d.ts +3 -3
- package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.js +1 -1
- package/dist/daemon/reconcilers/node-lifecycle/terminating.js +1 -1
- package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -1
- package/dist/daemon/reconcilers/node-lifecycle/wants-execution.d.ts +1 -1
- package/dist/daemon/reconcilers/node-lifecycle/wants-execution.js +1 -1
- package/dist/daemon/reconcilers/pending-review-submit.d.ts +1 -1
- package/dist/daemon/reconcilers/pending-review-submit.js +1 -1
- package/dist/daemon/reconcilers/storage-due-work.js +1 -1
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +1 -1
- package/dist/daemon/reconcilers/storage-maintenance.js +2 -2
- package/dist/daemon/reconcilers/structured-request-lane.d.ts +1 -1
- package/dist/daemon/reconcilers/structured-request-lane.js +1 -1
- package/dist/daemon/review/comment-notify.js +2 -2
- package/dist/daemon/review/companion.d.ts +3 -3
- package/dist/daemon/review/companion.js +1 -1
- package/dist/daemon/review/finish.js +1 -1
- package/dist/daemon/review/sweep.js +1 -1
- package/dist/daemon/run-notices.d.ts +4 -4
- package/dist/daemon/run-notices.js +1 -1
- package/dist/daemon/runs/append-section.d.ts +2 -2
- package/dist/daemon/runs/append-section.js +2 -2
- package/dist/daemon/runs/observer.d.ts +2 -2
- package/dist/daemon/runs/observer.js +2 -2
- package/dist/daemon/structured-requests/boot.d.ts +1 -1
- package/dist/daemon/structured-requests/boot.js +1 -1
- package/dist/daemon/structured-requests/effects.js +1 -1
- package/dist/daemon/structured-requests/sidecar.d.ts +1 -1
- package/dist/daemon/structured-requests/sidecar.js +1 -1
- package/dist/migrations/004-canvas-documents/apply.d.ts +3 -3
- package/dist/migrations/004-canvas-documents/apply.js +1 -1
- package/dist/migrations/004-canvas-documents/index.d.ts +2 -2
- package/dist/migrations/004-canvas-documents/index.js +2 -2
- package/dist/migrations/activation.js +2 -2
- package/docs/public-api.md +11 -0
- package/package.json +3 -2
- package/packages/crouter-identity/package.json +1 -1
- package/runtime.lock.json +12 -12
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var se=Object.defineProperty;var o=(e,t)=>se(e,"name",{value:t,configurable:!0});import{prepared as _}from"../sqlite-statements.js";import{randomUUID as I}from"node:crypto";import{existsSync as f,readdirSync as ae,readFileSync as de,realpathSync as ue,statSync as ce}from"node:fs";import{join as N,resolve as _e}from"node:path";import{withCanvasWrite as l,openDb as p}from"./db.js";import{jobDir as pe,nodesRoot as F}from"./paths.js";import{errorClassFromFault as X}from"../fault-classifier.js";import{parseProviderRateLimit as le}from"../provider-failure.js";import{emitEvent as $}from"../events/emit.js";import{operationIdContext as j,validateOperationId as B}from"../events/operation-id.js";const Me=5*6e4,Ee=500,J=["pi\u2192provider","viewer\u2194broker","relay\u2194broker","viewer\u2194crtrd","daemon\u2192node","crtr\u2192pi"],fe=[...J,"broker\u2194crtrd"],ye=["rate-limit","overloaded","connection","auth","protocol","context-overflow","other","wedged","model-not-found"],Te=["auto","manual","fatal"],Ne=["sdk","daemon","client"],ge=["pending","admitted","invalidated"];function u(){return new Date().toISOString()}o(u,"now");function C(e,t){return new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(({name:n})=>n))}o(C,"tableColumns");function Le(e){const t=C(e,"executions"),n=[["turn_open_at","TEXT"],["turn_progress_at","TEXT"],["turn_closed_at","TEXT"],["turn_end_reason","TEXT CHECK (turn_end_reason IS NULL OR turn_end_reason IN ('settled', 'teardown-aborted'))"],["exit_diagnostic_json","TEXT"]];for(const[r,i]of n)t.has(r)||e.exec(`ALTER TABLE executions ADD COLUMN ${r} ${i}`)}o(Le,"addExecutionColumns");function me(e){e.exec(`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS node_faults (
|
|
3
3
|
fault_id TEXT PRIMARY KEY,
|
|
4
4
|
node_id TEXT NOT NULL REFERENCES nodes(node_id) ON DELETE CASCADE,
|
|
@@ -23,4 +23,4 @@ CREATE TABLE IF NOT EXISTS node_faults (
|
|
|
23
23
|
);
|
|
24
24
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_node_faults_active ON node_faults(node_id) WHERE active = 1;
|
|
25
25
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_node_faults_episode ON node_faults(node_id) WHERE episode_state IS NOT NULL;
|
|
26
|
-
`)}o(Le,"createFaultTable");function g(e,n){return typeof n=="string"&&e.includes(n)}o(g,"contains");function H(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(H,"isRecord");function Y(e){if(!H(e)||typeof e.provider!="string"||e.provider===""||typeof e.model!="string"||e.model==="")return;const n=typeof e.status=="number"&&Number.isFinite(e.status)?e.status:void 0,t=typeof e.code=="string"||typeof e.code=="number"?e.code:void 0,r=typeof e.errno=="string"?e.errno:void 0,i=typeof e.body=="string"?e.body:void 0,d=le(e.ratelimit),a=Array.isArray(e.causes)?e.causes.flatMap(u=>{if(!H(u))return[];const p={...typeof u.message=="string"?{message:u.message}:{},...typeof u.status=="number"&&Number.isFinite(u.status)?{status:u.status}:{},...typeof u.code=="string"||typeof u.code=="number"?{code:u.code}:{},...typeof u.errno=="string"?{errno:u.errno}:{},...typeof u.body=="string"?{body:u.body}:{}};return Object.keys(p).length===0?[]:[p]}):void 0;return{provider:e.provider,model:e.model,...n===void 0?{}:{status:n},...t===void 0?{}:{code:t},...r===void 0?{}:{errno:r},...i===void 0?{}:{body:i},...a===void 0||a.length===0?{}:{causes:a},...d===void 0?{}:{ratelimit:d}}}o(Y,"parseProviderError");function G(e){try{const n=JSON.parse(e);if(!g(Ee,n.link)||typeof n.op!="string"||n.op===""||!g(fe,n.kind)||typeof n.message!="string"||typeof n.since!="string")return null;const t=J(n.operation_id);if(!H(n.retry)||!g(ye,n.retry.disposition)||n.retry.by!==void 0&&!g(Te,n.retry.by)||n.retry.attempt!==void 0&&typeof n.retry.attempt!="number"||n.retry.max!==void 0&&typeof n.retry.max!="number"||n.retry.nextAt!==void 0&&typeof n.retry.nextAt!="string"||n.anchorEntryId!==void 0&&(typeof n.anchorEntryId!="string"||n.anchorEntryId===""))return null;const r=n.providerError===void 0?void 0:Y(n.providerError);return n.providerError!==void 0&&r===void 0?null:{link:n.link,op:n.op,kind:n.kind,retry:{disposition:n.retry.disposition,...n.retry.by===void 0?{}:{by:n.retry.by},...n.retry.attempt===void 0?{}:{attempt:n.retry.attempt},...n.retry.max===void 0?{}:{max:n.retry.max},...n.retry.nextAt===void 0?{}:{nextAt:n.retry.nextAt}},message:n.message,since:n.since,operation_id:t,...n.anchorEntryId===void 0?{}:{anchorEntryId:n.anchorEntryId},...r===void 0?{}:{providerError:r}}}catch{return null}}o(G,"parseLegacyFault");function me(e){const n=ue(e);try{return de(n)}catch{return n}}o(me,"canonicalPath");function Ae(e){try{const n=JSON.parse(e);if(!g(Ne,n.state)||typeof n.sessionFile!="string"||n.sessionFile==="")return null;const t=JSON.stringify(n.fault),r=G(t);if(r===null||r.link!=="pi\u2192provider"||r.retry.disposition!=="auto"||r.retry.by!=="daemon")return null;const i=n.anchorEntryId;return i!==null&&typeof i!="string"||(r.anchorEntryId??null)!==i?null:{state:n.state,sessionFile:me(n.sessionFile),fault:r}}catch{return null}}o(Ae,"parseLegacyEpisode");function V(e){return e!==void 0?J(e):B.current()??B.fresh(t=>t)}o(V,"resolveOperationId");function Se(e){return e.slice(0,pe)}o(Se,"clampMessage");function I(e){return e.link==="pi\u2192provider"&&e.retry.disposition==="auto"&&e.retry.by==="daemon"?3:e.retry.disposition==="fatal"?2:1}o(I,"faultPriority");function Q(e){return{link:e.link,op:e.op,kind:e.kind,message:e.message,since:e.since,operationId:e.operation_id,anchorEntryId:e.anchorEntryId??null,retryDisposition:e.retry.disposition,retryBy:e.retry.by??null,retryAttempt:e.retry.attempt??null,retryMax:e.retry.max??null,retryNextAt:e.retry.nextAt??null,providerError:e.providerError===void 0?null:JSON.stringify(e.providerError)}}o(Q,"encodeFault");function W(e){const n=e.provider_error_json,t=typeof n=="string"?Y(JSON.parse(n)):void 0;if(typeof n=="string"&&t===void 0)throw new Error(`invalid provider error on stored fault ${e.fault_id}`);const r={disposition:e.retry_disposition,...e.retry_by===null?{}:{by:e.retry_by},...e.retry_attempt===null?{}:{attempt:e.retry_attempt},...e.retry_max===null?{}:{max:e.retry_max},...e.retry_next_at===null?{}:{nextAt:e.retry_next_at}};return{faultId:e.fault_id,link:e.link,op:e.op,kind:e.kind,message:e.message,since:e.since,operation_id:e.operation_id,retry:r,...e.anchor_entry_id===null?{}:{anchorEntryId:e.anchor_entry_id},...t===void 0?{}:{providerError:t},...typeof e.notified_since=="string"?{notifiedSince:e.notified_since}:{}}}o(W,"hydrateFault");function L(e,n){const t=ce(e,"SELECT * FROM node_faults WHERE node_id = ? AND active = 1").get(n);return t===void 0?null:W(t)}o(L,"activeFault");function q(e){if(!g(K,e.link))throw new Error(`fault link is not durable: ${e.link}`);return{link:e.link,op:e.op,kind:e.kind,retry:e.retry,message:Se(e.message),since:e.since??c(),operation_id:V(e.operation_id),...typeof e.anchorEntryId=="string"&&e.anchorEntryId!==""?{anchorEntryId:e.anchorEntryId}:{},...e.providerError===void 0?{}:{providerError:e.providerError}}}o(q,"storedFault");function z(e,n){j({level:n.retry.disposition==="fatal"?"error":"warn",event:"fault.recorded",operation_id:n.operation_id,node_id:e,error_class:$(n),fields:{link:n.link,op:n.op,kind:n.kind,retry:n.retry,message:n.message,...n.anchorEntryId===void 0?{}:{anchor_entry_id:n.anchorEntryId},...n.providerError===void 0?{}:{provider_error:n.providerError}}})}o(z,"emitRecordedFault");function P(e,n,t,r,i){const d=F(),a=Q(t),u=c();return s(e,"INSERT INTO node_faults (fault_id, node_id, link, op, kind, message, since, operation_id, anchor_entry_id, retry_disposition, retry_by, retry_attempt, retry_max, retry_next_at, provider_error_json, active, episode_state, episode_binding_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)").run(d,n,a.link,a.op,a.kind,a.message,a.since,a.operationId,a.anchorEntryId,a.retryDisposition,a.retryBy,a.retryAttempt,a.retryMax,a.retryNextAt,a.providerError,r?1:0,i?.state??null,i?.bindingId??null,u,u),{...t,faultId:d}}o(P,"insertFault");function Z(e,n,t,r){const i=Q(t);return s(e,"UPDATE node_faults SET link = ?, op = ?, kind = ?, message = ?, since = ?, operation_id = ?, anchor_entry_id = ?, retry_disposition = ?, retry_by = ?, retry_attempt = ?, retry_max = ?, retry_next_at = ?, provider_error_json = ?, episode_state = COALESCE(?, episode_state), episode_binding_id = COALESCE(?, episode_binding_id), updated_at = ? WHERE fault_id = ?").run(i.link,i.op,i.kind,i.message,i.since,i.operationId,i.anchorEntryId,i.retryDisposition,i.retryBy,i.retryAttempt,i.retryMax,i.retryNextAt,i.providerError,r?.state??null,r?.bindingId??null,c(),n),{...t,faultId:n}}o(Z,"updateFault");function D(e,n){s(e,"DELETE FROM node_faults WHERE fault_id = ? AND active = 0 AND episode_state IS NULL").run(n)}o(D,"deleteIfUnretained");function ee(e,n,t,r){const i=L(e,n);if(i===null){const d=s(e,"SELECT fault_id, link, kind, since, operation_id FROM node_faults WHERE node_id = ? AND active = 0 AND episode_state IS NOT NULL").get(n);return d!==void 0&&d.link===t.link&&d.kind===t.kind&&d.since===t.since&&d.operation_id===t.operation_id?(s(e,"UPDATE node_faults SET active = 1, updated_at = ? WHERE fault_id = ?").run(c(),d.fault_id),Z(e,d.fault_id,t)):P(e,n,t,!0,r)}if(i.link===t.link&&i.kind===t.kind){const d=t.retry.disposition==="auto"?{...i.retry,...t.retry}:t.retry,a=i.retry.disposition===t.retry.disposition&&(t.retry.disposition!=="fatal"||i.message===t.message),u=a?i.since:t.since,p=Z(e,i.faultId,{...t,since:u,anchorEntryId:i.anchorEntryId??t.anchorEntryId,retry:d},r);return a||s(e,"UPDATE node_faults SET notified_since = NULL WHERE fault_id = ?").run(i.faultId),p}return i.link!==t.link&&I(i)>I(t)?null:(s(e,"UPDATE node_faults SET active = 0, updated_at = ? WHERE fault_id = ?").run(c(),i.faultId),D(e,i.faultId),P(e,n,t,!0,r))}o(ee,"replaceActiveFault");function m(e,n,t){return s(e,"SELECT binding_id FROM sessions WHERE node_id = ? AND session_id = ? AND unbound_at IS NULL").get(n,t)?.binding_id??null}o(m,"liveBinding");function we(e,n){return l(t=>{const r=c();return s(t,"UPDATE executions SET turn_progress_at = ? WHERE execution_id = ? AND state != 'exited' AND turn_open_at IS NOT NULL AND turn_closed_at IS NULL").run(r,e).changes>0?!0:s(t,"UPDATE executions SET turn_open_at = ?, turn_progress_at = ?, turn_closed_at = NULL, turn_end_reason = NULL WHERE execution_id = ? AND state != 'exited'").run(r,r,e).changes>0})}o(we,"openTurn");function Xe(e){return l(n=>s(n,"UPDATE executions SET turn_progress_at = ? WHERE execution_id = ? AND state != 'exited' AND turn_open_at IS NOT NULL AND turn_closed_at IS NULL").run(c(),e).changes>0)}o(Xe,"recordTurnProgress");function $e(e,n){return l(t=>{const r=c(),i=s(t,"UPDATE executions SET turn_closed_at = ?, turn_end_reason = ? WHERE execution_id = ? AND state != 'exited' AND turn_open_at IS NOT NULL AND turn_closed_at IS NULL").run(r,n.endReason,e).changes>0;if(i&&n.endReason==="settled"){const d="(SELECT node_id FROM executions WHERE execution_id = ?)";n.viewerPresent===!0?s(t,`UPDATE nodes SET reply_at = ?, read_at = ? WHERE node_id = ${d}`).run(r,r,e):s(t,`UPDATE nodes SET reply_at = ? WHERE node_id = ${d}`).run(r,e)}return i})}o($e,"closeTurn");function je(e){return l(n=>s(n,"UPDATE nodes SET read_at = ? WHERE node_id = ?").run(c(),e).changes>0)}o(je,"markNodeRead");function Be(e,n){if(!Number.isInteger(n.consecutivePasses)||n.consecutivePasses<1||n.routes.length===0||!n.routes.every(t=>t!==""))throw new Error("invalid transport-poison verdict");return l(t=>s(t,"UPDATE executions SET exit_diagnostic_json = ? WHERE execution_id = ? AND state != 'exited'").run(JSON.stringify({schema:"crtr.execution-exit-diagnostic/v1",transport_poison:{consecutive_passes:n.consecutivePasses,routes:n.routes}}),e).changes>0)}o(Be,"recordTransportPoisonVerdict");function Je(e){const n=s(E(),"SELECT exit_diagnostic_json FROM executions WHERE node_id = ? ORDER BY rowid DESC LIMIT 1").get(e);if(n===void 0||n.exit_diagnostic_json===null)return null;try{const t=JSON.parse(n.exit_diagnostic_json),r=t.transport_poison;return t.schema!=="crtr.execution-exit-diagnostic/v1"||r===void 0||!Number.isInteger(r.consecutive_passes)||r.consecutive_passes<1||!Array.isArray(r.routes)||r.routes.length===0||!r.routes.every(i=>typeof i=="string"&&i!=="")?null:{consecutivePasses:r.consecutive_passes,routes:r.routes}}catch{return null}}o(Je,"readTransportPoisonVerdict");function Ke(e){const n=s(E(),"SELECT turn_open_at, turn_closed_at, turn_progress_at FROM executions WHERE node_id = ? AND state != 'exited'").get(e);return n===void 0?null:{busy:n.turn_open_at!==null&&n.turn_closed_at===null,progressAt:n.turn_progress_at}}o(Ke,"readLiveTurn");function Ye(e){const n=E(),t=s(n,"SELECT turn_closed_at, turn_progress_at FROM executions WHERE node_id = ? AND turn_open_at IS NOT NULL ORDER BY rowid DESC LIMIT 1").get(e);if(t===void 0)return null;const r=s(n,"SELECT turn_end_reason FROM executions WHERE node_id = ? ORDER BY rowid DESC LIMIT 1").get(e);return{interrupted:t.turn_closed_at===null||r?.turn_end_reason==="teardown-aborted",progressAt:t.turn_progress_at}}o(Ye,"readInterruptedTurn");function Ge(e){return s(E(),"SELECT 1 FROM executions WHERE node_id = ? AND turn_open_at IS NOT NULL LIMIT 1").get(e)!==void 0}o(Ge,"hasAdmittedTurn");function Ve(e,n){const t=q(n);return z(e,t),l(r=>ee(r,e,t))}o(Ve,"recordFault");function Qe(e){return l(n=>s(n,"UPDATE node_faults SET notified_since = since, updated_at = ? WHERE fault_id = ?").run(c(),e).changes>0)}o(Qe,"markFaultNotified");function xe(e){return e.link==="pi\u2192provider"&&e.retry.disposition==="fatal"&&e.notifiedSince!==e.since}o(xe,"isUnnotifiedFatalProviderFault");function qe(){return s(E(),"SELECT f.node_id FROM node_faults f JOIN nodes n ON n.node_id = f.node_id WHERE f.active = 1 AND f.link = 'pi\u2192provider' AND f.retry_disposition = 'fatal' AND (f.notified_since IS NULL OR f.notified_since != f.since) AND n.status IN ('active', 'idle')").all().map(e=>e.node_id)}o(qe,"listUnnotifiedFatalFaultNodes");let M=null;function ze(e){M=e}o(ze,"setFatalFaultAnnouncer");function Ze(e,n){const t=L(E(),e);return t===null||n?.link!==void 0&&t.link!==n.link?!1:l(r=>{const i=L(r,e);if(i===null||n?.link!==void 0&&i.link!==n.link)return!1;M!==null&&xe(i)&&M(e);const d=s(r,"SELECT episode_state FROM node_faults WHERE fault_id = ?").get(i.faultId);s(r,"UPDATE node_faults SET active = 0, updated_at = ? WHERE fault_id = ?").run(c(),i.faultId),d.episode_state==="pending"&&n?.preserveEpisode!==!0&&s(r,"UPDATE node_faults SET episode_state = NULL, episode_binding_id = NULL, updated_at = ? WHERE fault_id = ?").run(c(),i.faultId),D(r,i.faultId);const a=V();return j({level:"info",event:"fault.cleared",operation_id:a,node_id:e,error_class:$(i),fields:{cleared_fault_operation_id:i.operation_id,link:i.link,op:i.op,kind:i.kind,retry:i.retry,message:i.message,since:i.since,...i.anchorEntryId===void 0?{}:{anchor_entry_id:i.anchorEntryId}}}),!0})}o(Ze,"clearFault");function ne(e){return L(E(),e)}o(ne,"readFault");function en(e,n){const t=q(n.input);if(t.link!=="pi\u2192provider"||t.retry.disposition!=="auto"||t.retry.by!=="daemon")throw new Error("provider retry episode requires an automatic daemon provider fault");return z(e,t),l(r=>{const i=m(r,e,n.sessionId);if(i===null)return null;const d=L(r,e);if(d!==null&&(d.link!==t.link||d.kind!==t.kind)&&I(d)>I(t))return null;const a=s(r,"SELECT fault_id FROM node_faults WHERE node_id = ? AND episode_state IS NOT NULL").all(e);s(r,"UPDATE node_faults SET episode_state = NULL, episode_binding_id = NULL, updated_at = ? WHERE node_id = ? AND episode_state IS NOT NULL").run(c(),e);for(const p of a)D(r,p.fault_id);const u=ee(r,e,t,{state:"pending",bindingId:i});return u===null?null:(s(r,"UPDATE node_faults SET episode_state = ?, episode_binding_id = ?, updated_at = ? WHERE fault_id = ?").run("pending",i,c(),u.faultId),u)})}o(en,"recordPendingEpisode");function nn(e,n){return l(t=>{if(s(t,"SELECT 1 FROM nodes WHERE node_id = ? AND intent IS 'refresh'").get(e)!==void 0)return!1;const r=m(t,e,n.sessionId);return r===null?!1:s(t,"UPDATE node_faults SET episode_state = 'admitted', retry_disposition = ?, retry_by = ?, retry_attempt = ?, retry_max = ?, retry_next_at = ?, updated_at = ? WHERE node_id = ? AND fault_id = ? AND episode_state = 'pending' AND episode_binding_id = ?").run(n.retry.disposition,n.retry.by??null,n.retry.attempt??null,n.retry.max??null,n.retry.nextAt??null,c(),e,n.faultId,r).changes>0})}o(nn,"admitEpisode");function tn(e,n){return l(t=>{const r=m(t,e,n.sessionId);return r===null?!1:s(t,"UPDATE node_faults SET episode_state = 'pending', updated_at = ? WHERE node_id = ? AND episode_state = 'admitted' AND episode_binding_id = ?").run(c(),e,r).changes>0})}o(tn,"reopenEpisode");function rn(e,n){return l(t=>{const r=m(t,e,n.sessionId);return r===null?!1:s(t,"UPDATE node_faults SET episode_state = 'invalidated', updated_at = ? WHERE node_id = ? AND episode_state != 'invalidated' AND episode_state IS NOT NULL AND episode_binding_id = ?").run(c(),e,r).changes>0})}o(rn,"invalidateEpisode");function on(e,n){return l(t=>{const r=m(t,e,n.sessionId);if(r===null)return!1;const i=s(t,"SELECT fault_id FROM node_faults WHERE node_id = ? AND episode_binding_id = ? AND episode_state IS NOT NULL").all(e,r);if(i.length===0)return!1;s(t,"UPDATE node_faults SET episode_state = NULL, episode_binding_id = NULL, updated_at = ? WHERE node_id = ? AND episode_binding_id = ? AND episode_state IS NOT NULL").run(c(),e,r);for(const d of i)D(t,d.fault_id);return!0})}o(on,"clearEpisode");function sn(e){const n=s(E(),"SELECT f.*, s.session_id FROM node_faults f JOIN sessions s ON s.binding_id = f.episode_binding_id WHERE f.node_id = ? AND f.episode_state IS NOT NULL").get(e);return n===void 0?null:{state:n.episode_state,sessionId:n.session_id,fault:W(n)}}o(sn,"readEpisode");function dn(){return s(E(),"SELECT f.*, s.session_id AS bound_session_id FROM node_faults f JOIN sessions s ON s.binding_id = f.episode_binding_id WHERE f.active = 1 AND f.episode_state = 'pending' AND s.unbound_at IS NULL AND s.session_id IS NOT NULL AND f.link = 'pi\u2192provider' AND f.retry_disposition = 'auto' AND f.retry_by = 'daemon' AND f.kind IN ('connection', 'rate-limit', 'overloaded')").all().map(n=>({nodeId:n.node_id,sessionId:n.bound_session_id,fault:W(n),updatedAt:n.updated_at}))}o(dn,"listPendingProviderRetries");function an(e){const n=ne(e)===null;return{explanation(){if(!n)return null;const t=ne(e);if(t===null||t.link!=="crtr\u2192pi"||t.retry.disposition!=="fatal")return null;const r=t.op.trim(),i=t.message.trim();return r===""||i===""?null:`${r}: ${i}`}}}o(an,"beginBootFaultAttempt");function te(e,n){try{return ae(e).mtime.toISOString()}catch{return n}}o(te,"markerMtime");function w(e,n){if(!f(e))return null;try{return se(e,"utf8")}catch(t){if(!n)return null;throw new Error(`cannot import recovery input ${e}: ${t.message}`)}}o(w,"legacyFile");function Re(e,n){return s(e,"SELECT execution_id, started_at FROM executions WHERE node_id = ? ORDER BY rowid DESC LIMIT 1").get(n)??null}o(Re,"latestExecution");function Ie(e,n){const r=b(e,"nodes").has("launched_at")?s(e,"SELECT COALESCE(launched_at, created) AS started_at FROM nodes WHERE node_id = ?").get(n):s(e,"SELECT created AS started_at FROM nodes WHERE node_id = ?").get(n);if(r===void 0)throw new Error(`cannot import recovery witness for unknown node ${n}`);const i=F();return s(e,"INSERT INTO executions (execution_id, node_id, daemon_epoch, pid, process_identity, state, started_at, ended_at, exit_reason) VALUES (?, ?, NULL, NULL, NULL, 'exited', ?, ?, 'pre-consolidation')").run(i,n,r.started_at,r.started_at),{execution_id:i,started_at:r.started_at}}o(Ie,"syntheticExecution");function re(e,n,t,r,i){return P(e,n,t,r,i)}o(re,"insertMigratedFault");function De(e,n,t,r){const i=s(e,"SELECT binding_id, node_id FROM sessions WHERE transcript_path = ? AND unbound_at IS NULL").get(t);if(i!==void 0){if(i.node_id!==n)throw new Error(`cannot import provider retry ${r}: transcript is live-owned by ${i.node_id}`);return i.binding_id}const d=s(e,"SELECT binding_id FROM sessions WHERE node_id = ? AND transcript_path = ? ORDER BY rowid DESC LIMIT 1").get(n,t);if(d!==void 0)return d.binding_id;const a=s(e,"SELECT created FROM nodes WHERE node_id = ?").get(n);if(a===void 0)throw new Error(`cannot import provider retry ${r}: unknown node ${n}`);const u=F();return s(e,"INSERT INTO sessions (binding_id, session_id, node_id, transcript_path, source_session_id, fork_entry_id, created_at, bound_at, unbound_at) VALUES (?, NULL, ?, ?, NULL, NULL, ?, ?, ?)").run(u,n,t,a.created,a.created,c()),u}o(De,"migrationBinding");function un(e){e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'node_faults'").get()!==void 0&&(b(e,"node_faults").has("notified_since")||e.exec("ALTER TABLE node_faults ADD COLUMN notified_since TEXT"))}o(un,"addFaultNotifiedSince");function cn(e){if(ge(e),Le(e),!f(C()))return;const n=oe(C(),{withFileTypes:!0}).filter(r=>r.isDirectory()).sort((r,i)=>r.name.localeCompare(i.name)),t=s(e,"SELECT 1 FROM nodes WHERE node_id = ?");for(const r of n){const i=r.name,d=_e(i),a=N(d,"busy"),u=N(d,"clean-abort"),p=N(d,"transport-poison.json"),U=N(d,"fault"),A=N(d,"provider-retry"),O=f(a),h=f(u);if(!O&&!h&&!f(p)&&!f(U)&&!f(A)||!f(N(C(),i,"meta.json"))&&t.get(i)===void 0)continue;const k=w(p,!1),S=w(U,!0),x=w(A,!0);if(!O&&!h&&k===null&&S===null&&x===null)continue;let y=Re(e,i);if(y===null&&(y=Ie(e,i)),O){const _=te(a,y.started_at);s(e,"UPDATE executions SET turn_open_at = ?, turn_progress_at = ?, turn_closed_at = NULL, turn_end_reason = NULL WHERE execution_id = ?").run(_,_,y.execution_id)}else if(h){const _=te(u,y.started_at);s(e,"UPDATE executions SET turn_open_at = ?, turn_progress_at = ?, turn_closed_at = ?, turn_end_reason = 'teardown-aborted' WHERE execution_id = ?").run(_,_,_,y.execution_id)}if(k!==null)try{const _=JSON.parse(k);Number.isInteger(_.consecutivePasses)&&_.consecutivePasses>=1&&Array.isArray(_.routes)&&_.routes.length>0&&_.routes.every(X=>typeof X=="string"&&X!=="")&&s(e,"UPDATE executions SET exit_diagnostic_json = ? WHERE execution_id = ?").run(JSON.stringify({schema:"crtr.execution-exit-diagnostic/v1",transport_poison:{consecutive_passes:_.consecutivePasses,routes:_.routes}}),y.execution_id)}catch{}const R=S===null?null:G(S);if(S!==null&&R===null)throw new Error(`cannot import recovery fault ${U}`);const T=x===null?null:Ae(x);if(x!==null&&T===null)throw new Error(`cannot import provider retry ${A}`);let v=R===null||R.link==="broker\u2194crtrd"?null:re(e,i,R,!0);if(T!==null){const _=De(e,i,T.sessionFile,A);v!==null&&v.since===T.fault.since?s(e,"UPDATE node_faults SET episode_state = ?, episode_binding_id = ?, updated_at = ? WHERE fault_id = ?").run(T.state,_,c(),v.faultId):re(e,i,T.fault,!1,{state:T.state,bindingId:_})}}}o(cn,"migrateRecoveryWitnesses");export{Me as FAULT_QUIET_MS,un as addFaultNotifiedSince,nn as admitEpisode,an as beginBootFaultAttempt,on as clearEpisode,Ze as clearFault,$e as closeTurn,Ge as hasAdmittedTurn,W as hydrateFault,rn as invalidateEpisode,dn as listPendingProviderRetries,qe as listUnnotifiedFatalFaultNodes,Qe as markFaultNotified,je as markNodeRead,cn as migrateRecoveryWitnesses,we as openTurn,Y as parseProviderError,sn as readEpisode,ne as readFault,Ye as readInterruptedTurn,Ke as readLiveTurn,Je as readTransportPoisonVerdict,Ve as recordFault,en as recordPendingEpisode,Be as recordTransportPoisonVerdict,Xe as recordTurnProgress,tn as reopenEpisode,ze as setFatalFaultAnnouncer};
|
|
26
|
+
`)}o(me,"createFaultTable");function g(e,t){return typeof t=="string"&&e.includes(t)}o(g,"contains");function b(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(b,"isRecord");function K(e){if(!b(e)||typeof e.provider!="string"||e.provider===""||typeof e.model!="string"||e.model==="")return;const t=typeof e.status=="number"&&Number.isFinite(e.status)?e.status:void 0,n=typeof e.code=="string"||typeof e.code=="number"?e.code:void 0,r=typeof e.errno=="string"?e.errno:void 0,i=typeof e.body=="string"?e.body:void 0,s=le(e.ratelimit),d=Array.isArray(e.causes)?e.causes.flatMap(a=>{if(!b(a))return[];const E={...typeof a.message=="string"?{message:a.message}:{},...typeof a.status=="number"&&Number.isFinite(a.status)?{status:a.status}:{},...typeof a.code=="string"||typeof a.code=="number"?{code:a.code}:{},...typeof a.errno=="string"?{errno:a.errno}:{},...typeof a.body=="string"?{body:a.body}:{}};return Object.keys(E).length===0?[]:[E]}):void 0;return{provider:e.provider,model:e.model,...t===void 0?{}:{status:t},...n===void 0?{}:{code:n},...r===void 0?{}:{errno:r},...i===void 0?{}:{body:i},...d===void 0||d.length===0?{}:{causes:d},...s===void 0?{}:{ratelimit:s}}}o(K,"parseProviderError");function Y(e){try{const t=JSON.parse(e);if(!g(fe,t.link)||typeof t.op!="string"||t.op===""||!g(ye,t.kind)||typeof t.message!="string"||typeof t.since!="string")return null;const n=B(t.operation_id);if(!b(t.retry)||!g(Te,t.retry.disposition)||t.retry.by!==void 0&&!g(Ne,t.retry.by)||t.retry.attempt!==void 0&&typeof t.retry.attempt!="number"||t.retry.max!==void 0&&typeof t.retry.max!="number"||t.retry.nextAt!==void 0&&typeof t.retry.nextAt!="string"||t.anchorEntryId!==void 0&&(typeof t.anchorEntryId!="string"||t.anchorEntryId===""))return null;const r=t.providerError===void 0?void 0:K(t.providerError);return t.providerError!==void 0&&r===void 0?null:{link:t.link,op:t.op,kind:t.kind,retry:{disposition:t.retry.disposition,...t.retry.by===void 0?{}:{by:t.retry.by},...t.retry.attempt===void 0?{}:{attempt:t.retry.attempt},...t.retry.max===void 0?{}:{max:t.retry.max},...t.retry.nextAt===void 0?{}:{nextAt:t.retry.nextAt}},message:t.message,since:t.since,operation_id:n,...t.anchorEntryId===void 0?{}:{anchorEntryId:t.anchorEntryId},...r===void 0?{}:{providerError:r}}}catch{return null}}o(Y,"parseLegacyFault");function Ae(e){const t=_e(e);try{return ue(t)}catch{return t}}o(Ae,"canonicalPath");function Se(e){try{const t=JSON.parse(e);if(!g(ge,t.state)||typeof t.sessionFile!="string"||t.sessionFile==="")return null;const n=JSON.stringify(t.fault),r=Y(n);if(r===null||r.link!=="pi\u2192provider"||r.retry.disposition!=="auto"||r.retry.by!=="daemon")return null;const i=t.anchorEntryId;return i!==null&&typeof i!="string"||(r.anchorEntryId??null)!==i?null:{state:t.state,sessionFile:Ae(t.sessionFile),fault:r}}catch{return null}}o(Se,"parseLegacyEpisode");function G(e){return e!==void 0?B(e):j.current()??j.fresh(n=>n)}o(G,"resolveOperationId");function xe(e){return e.slice(0,Ee)}o(xe,"clampMessage");function w(e){return e.link==="pi\u2192provider"&&e.retry.disposition==="auto"&&e.retry.by==="daemon"?3:e.retry.disposition==="fatal"?2:1}o(w,"faultPriority");function V(e){return{link:e.link,op:e.op,kind:e.kind,message:e.message,since:e.since,operationId:e.operation_id,anchorEntryId:e.anchorEntryId??null,retryDisposition:e.retry.disposition,retryBy:e.retry.by??null,retryAttempt:e.retry.attempt??null,retryMax:e.retry.max??null,retryNextAt:e.retry.nextAt??null,providerError:e.providerError===void 0?null:JSON.stringify(e.providerError)}}o(V,"encodeFault");function H(e){const t=e.provider_error_json,n=typeof t=="string"?K(JSON.parse(t)):void 0;if(typeof t=="string"&&n===void 0)throw new Error(`invalid provider error on stored fault ${e.fault_id}`);const r={disposition:e.retry_disposition,...e.retry_by===null?{}:{by:e.retry_by},...e.retry_attempt===null?{}:{attempt:e.retry_attempt},...e.retry_max===null?{}:{max:e.retry_max},...e.retry_next_at===null?{}:{nextAt:e.retry_next_at}};return{faultId:e.fault_id,link:e.link,op:e.op,kind:e.kind,message:e.message,since:e.since,operation_id:e.operation_id,retry:r,...e.anchor_entry_id===null?{}:{anchorEntryId:e.anchor_entry_id},...n===void 0?{}:{providerError:n},...typeof e.notified_since=="string"?{notifiedSince:e.notified_since}:{}}}o(H,"hydrateFault");async function L(e,t){const n=await e.prepare("SELECT * FROM node_faults WHERE node_id = ? AND active = 1").get(t);return n===void 0?null:H(n)}o(L,"activeFault");function Q(e){if(!g(J,e.link))throw new Error(`fault link is not durable: ${e.link}`);return{link:e.link,op:e.op,kind:e.kind,retry:e.retry,message:xe(e.message),since:e.since??u(),operation_id:G(e.operation_id),...typeof e.anchorEntryId=="string"&&e.anchorEntryId!==""?{anchorEntryId:e.anchorEntryId}:{},...e.providerError===void 0?{}:{providerError:e.providerError}}}o(Q,"storedFault");function q(e,t){$({level:t.retry.disposition==="fatal"?"error":"warn",event:"fault.recorded",operation_id:t.operation_id,node_id:e,error_class:X(t),fields:{link:t.link,op:t.op,kind:t.kind,retry:t.retry,message:t.message,...t.anchorEntryId===void 0?{}:{anchor_entry_id:t.anchorEntryId},...t.providerError===void 0?{}:{provider_error:t.providerError}}})}o(q,"emitRecordedFault");const z="INSERT INTO node_faults (fault_id, node_id, link, op, kind, message, since, operation_id, anchor_entry_id, retry_disposition, retry_by, retry_attempt, retry_max, retry_next_at, provider_error_json, active, episode_state, episode_binding_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";function Z(e,t,n,r,i){const s=V(n),d=u();return[e,t,s.link,s.op,s.kind,s.message,s.since,s.operationId,s.anchorEntryId,s.retryDisposition,s.retryBy,s.retryAttempt,s.retryMax,s.retryNextAt,s.providerError,r?1:0,i?.state??null,i?.bindingId??null,d,d]}o(Z,"faultInsertParams");async function ee(e,t,n,r,i){const s=I();return await e.prepare(z).run(...Z(s,t,n,r,i)),{...n,faultId:s}}o(ee,"insertFault");async function te(e,t,n,r){const i=V(n);return await e.prepare("UPDATE node_faults SET link = ?, op = ?, kind = ?, message = ?, since = ?, operation_id = ?, anchor_entry_id = ?, retry_disposition = ?, retry_by = ?, retry_attempt = ?, retry_max = ?, retry_next_at = ?, provider_error_json = ?, episode_state = COALESCE(?, episode_state), episode_binding_id = COALESCE(?, episode_binding_id), updated_at = ? WHERE fault_id = ?").run(i.link,i.op,i.kind,i.message,i.since,i.operationId,i.anchorEntryId,i.retryDisposition,i.retryBy,i.retryAttempt,i.retryMax,i.retryNextAt,i.providerError,r?.state??null,r?.bindingId??null,u(),t),{...n,faultId:t}}o(te,"updateFault");async function D(e,t){await e.prepare("DELETE FROM node_faults WHERE fault_id = ? AND active = 0 AND episode_state IS NULL").run(t)}o(D,"deleteIfUnretained");async function ne(e,t,n,r){const i=await L(e,t);if(i===null){const s=await e.prepare("SELECT fault_id, link, kind, since, operation_id FROM node_faults WHERE node_id = ? AND active = 0 AND episode_state IS NOT NULL").get(t);return s!==void 0&&s.link===n.link&&s.kind===n.kind&&s.since===n.since&&s.operation_id===n.operation_id?(await e.prepare("UPDATE node_faults SET active = 1, updated_at = ? WHERE fault_id = ?").run(u(),s.fault_id),await te(e,s.fault_id,n)):await ee(e,t,n,!0,r)}if(i.link===n.link&&i.kind===n.kind){const s=n.retry.disposition==="auto"?{...i.retry,...n.retry}:n.retry,d=i.retry.disposition===n.retry.disposition&&(n.retry.disposition!=="fatal"||i.message===n.message),a=d?i.since:n.since,E=await te(e,i.faultId,{...n,since:a,anchorEntryId:i.anchorEntryId??n.anchorEntryId,retry:s},r);return d||await e.prepare("UPDATE node_faults SET notified_since = NULL WHERE fault_id = ?").run(i.faultId),E}return i.link!==n.link&&w(i)>w(n)?null:(await e.prepare("UPDATE node_faults SET active = 0, updated_at = ? WHERE fault_id = ?").run(u(),i.faultId),await D(e,i.faultId),await ee(e,t,n,!0,r))}o(ne,"replaceActiveFault");async function m(e,t,n){return(await e.prepare("SELECT binding_id FROM sessions WHERE node_id = ? AND session_id = ? AND unbound_at IS NULL").get(t,n))?.binding_id??null}o(m,"liveBinding");async function Xe(e,t){return await l(async n=>{const r=u();return(await n.prepare("UPDATE executions SET turn_progress_at = ? WHERE execution_id = ? AND state != 'exited' AND turn_open_at IS NOT NULL AND turn_closed_at IS NULL").run(r,e)).changes>0?!0:(await n.prepare("UPDATE executions SET turn_open_at = ?, turn_progress_at = ?, turn_closed_at = NULL, turn_end_reason = NULL WHERE execution_id = ? AND state != 'exited'").run(r,r,e)).changes>0})}o(Xe,"openTurn");async function $e(e){return(await(await p()).prepare("UPDATE executions SET turn_progress_at = ? WHERE execution_id = ? AND state != 'exited' AND turn_open_at IS NOT NULL AND turn_closed_at IS NULL").run(u(),e)).changes>0}o($e,"recordTurnProgress");async function je(e,t){return await l(async n=>{const r=u(),i=(await n.prepare("UPDATE executions SET turn_closed_at = ?, turn_end_reason = ? WHERE execution_id = ? AND state != 'exited' AND turn_open_at IS NOT NULL AND turn_closed_at IS NULL").run(r,t.endReason,e)).changes>0;if(i&&t.endReason==="settled"){const s="(SELECT node_id FROM executions WHERE execution_id = ?)";t.viewerPresent===!0?await n.prepare(`UPDATE nodes SET reply_at = ?, read_at = ? WHERE node_id = ${s}`).run(r,r,e):await n.prepare(`UPDATE nodes SET reply_at = ? WHERE node_id = ${s}`).run(r,e)}return i})}o(je,"closeTurn");async function Be(e){return(await(await p()).prepare("UPDATE nodes SET read_at = ? WHERE node_id = ?").run(u(),e)).changes>0}o(Be,"markNodeRead");async function Je(e,t){if(!Number.isInteger(t.consecutivePasses)||t.consecutivePasses<1||t.routes.length===0||!t.routes.every(n=>n!==""))throw new Error("invalid transport-poison verdict");return(await(await p()).prepare("UPDATE executions SET exit_diagnostic_json = ? WHERE execution_id = ? AND state != 'exited'").run(JSON.stringify({schema:"crtr.execution-exit-diagnostic/v1",transport_poison:{consecutive_passes:t.consecutivePasses,routes:t.routes}}),e)).changes>0}o(Je,"recordTransportPoisonVerdict");async function Ke(e){const t=await(await p()).prepare("SELECT exit_diagnostic_json FROM executions WHERE node_id = ? ORDER BY rowid DESC LIMIT 1").get(e);if(t===void 0||t.exit_diagnostic_json===null)return null;try{const n=JSON.parse(t.exit_diagnostic_json),r=n.transport_poison;return n.schema!=="crtr.execution-exit-diagnostic/v1"||r===void 0||!Number.isInteger(r.consecutive_passes)||r.consecutive_passes<1||!Array.isArray(r.routes)||r.routes.length===0||!r.routes.every(i=>typeof i=="string"&&i!=="")?null:{consecutivePasses:r.consecutive_passes,routes:r.routes}}catch{return null}}o(Ke,"readTransportPoisonVerdict");async function Ye(e){const t=await(await p()).prepare("SELECT turn_open_at, turn_closed_at, turn_progress_at FROM executions WHERE node_id = ? AND state != 'exited'").get(e);return t===void 0?null:{busy:t.turn_open_at!==null&&t.turn_closed_at===null,progressAt:t.turn_progress_at}}o(Ye,"readLiveTurn");async function Ge(e){const t=await p(),n=await t.prepare("SELECT turn_closed_at, turn_progress_at FROM executions WHERE node_id = ? AND turn_open_at IS NOT NULL ORDER BY rowid DESC LIMIT 1").get(e);if(n===void 0)return null;const r=await t.prepare("SELECT turn_end_reason FROM executions WHERE node_id = ? ORDER BY rowid DESC LIMIT 1").get(e);return{interrupted:n.turn_closed_at===null||r?.turn_end_reason==="teardown-aborted",progressAt:n.turn_progress_at}}o(Ge,"readInterruptedTurn");async function Ve(e){return await(await p()).prepare("SELECT 1 FROM executions WHERE node_id = ? AND turn_open_at IS NOT NULL LIMIT 1").get(e)!==void 0}o(Ve,"hasAdmittedTurn");async function Qe(e,t){const n=Q(t);return q(e,n),await l(async r=>await ne(r,e,n))}o(Qe,"recordFault");async function qe(e){return await l(async t=>(await t.prepare("UPDATE node_faults SET notified_since = since, updated_at = ? WHERE fault_id = ?").run(u(),e)).changes>0)}o(qe,"markFaultNotified");function Re(e){return e.link==="pi\u2192provider"&&e.retry.disposition==="fatal"&&e.notifiedSince!==e.since}o(Re,"isUnnotifiedFatalProviderFault");async function ze(){return(await(await p()).prepare("SELECT f.node_id FROM node_faults f JOIN nodes n ON n.node_id = f.node_id WHERE f.active = 1 AND f.link = 'pi\u2192provider' AND f.retry_disposition = 'fatal' AND (f.notified_since IS NULL OR f.notified_since != f.since) AND n.status IN ('active', 'idle')").all()).map(e=>e.node_id)}o(ze,"listUnnotifiedFatalFaultNodes");let W=null;function Ze(e){W=e}o(Ze,"setFatalFaultAnnouncer");async function et(e,t){const n=await L(await p(),e);return n===null||t?.link!==void 0&&n.link!==t.link?!1:await l(async r=>{const i=await L(r,e);if(i===null||t?.link!==void 0&&i.link!==t.link)return!1;W!==null&&Re(i)&&await W(e);const s=await r.prepare("SELECT episode_state FROM node_faults WHERE fault_id = ?").get(i.faultId);await r.prepare("UPDATE node_faults SET active = 0, updated_at = ? WHERE fault_id = ?").run(u(),i.faultId),s.episode_state==="pending"&&t?.preserveEpisode!==!0&&await r.prepare("UPDATE node_faults SET episode_state = NULL, episode_binding_id = NULL, updated_at = ? WHERE fault_id = ?").run(u(),i.faultId),await D(r,i.faultId);const d=G();return $({level:"info",event:"fault.cleared",operation_id:d,node_id:e,error_class:X(i),fields:{cleared_fault_operation_id:i.operation_id,link:i.link,op:i.op,kind:i.kind,retry:i.retry,message:i.message,since:i.since,...i.anchorEntryId===void 0?{}:{anchor_entry_id:i.anchorEntryId}}}),!0})}o(et,"clearFault");async function re(e){return await L(await p(),e)}o(re,"readFault");async function tt(e,t){const n=Q(t.input);if(n.link!=="pi\u2192provider"||n.retry.disposition!=="auto"||n.retry.by!=="daemon")throw new Error("provider retry episode requires an automatic daemon provider fault");return q(e,n),await l(async r=>{const i=await m(r,e,t.sessionId);if(i===null)return null;const s=await L(r,e);if(s!==null&&(s.link!==n.link||s.kind!==n.kind)&&w(s)>w(n))return null;const d=await r.prepare("SELECT fault_id FROM node_faults WHERE node_id = ? AND episode_state IS NOT NULL").all(e);await r.prepare("UPDATE node_faults SET episode_state = NULL, episode_binding_id = NULL, updated_at = ? WHERE node_id = ? AND episode_state IS NOT NULL").run(u(),e);for(const E of d)await D(r,E.fault_id);const a=await ne(r,e,n,{state:"pending",bindingId:i});return a===null?null:(await r.prepare("UPDATE node_faults SET episode_state = ?, episode_binding_id = ?, updated_at = ? WHERE fault_id = ?").run("pending",i,u(),a.faultId),a)})}o(tt,"recordPendingEpisode");async function nt(e,t){return await l(async n=>{if(await n.prepare("SELECT 1 FROM nodes WHERE node_id = ? AND intent IS 'refresh'").get(e)!==void 0)return!1;const r=await m(n,e,t.sessionId);return r===null?!1:(await n.prepare("UPDATE node_faults SET episode_state = 'admitted', retry_disposition = ?, retry_by = ?, retry_attempt = ?, retry_max = ?, retry_next_at = ?, updated_at = ? WHERE node_id = ? AND fault_id = ? AND episode_state = 'pending' AND episode_binding_id = ?").run(t.retry.disposition,t.retry.by??null,t.retry.attempt??null,t.retry.max??null,t.retry.nextAt??null,u(),e,t.faultId,r)).changes>0})}o(nt,"admitEpisode");async function rt(e,t){return await l(async n=>{const r=await m(n,e,t.sessionId);return r===null?!1:(await n.prepare("UPDATE node_faults SET episode_state = 'pending', updated_at = ? WHERE node_id = ? AND episode_state = 'admitted' AND episode_binding_id = ?").run(u(),e,r)).changes>0})}o(rt,"reopenEpisode");async function it(e,t){return await l(async n=>{const r=await m(n,e,t.sessionId);return r===null?!1:(await n.prepare("UPDATE node_faults SET episode_state = 'invalidated', updated_at = ? WHERE node_id = ? AND episode_state != 'invalidated' AND episode_state IS NOT NULL AND episode_binding_id = ?").run(u(),e,r)).changes>0})}o(it,"invalidateEpisode");async function ot(e,t){return await l(async n=>{const r=await m(n,e,t.sessionId);if(r===null)return!1;const i=await n.prepare("SELECT fault_id FROM node_faults WHERE node_id = ? AND episode_binding_id = ? AND episode_state IS NOT NULL").all(e,r);if(i.length===0)return!1;await n.prepare("UPDATE node_faults SET episode_state = NULL, episode_binding_id = NULL, updated_at = ? WHERE node_id = ? AND episode_binding_id = ? AND episode_state IS NOT NULL").run(u(),e,r);for(const s of i)await D(n,s.fault_id);return!0})}o(ot,"clearEpisode");async function st(e){const t=await(await p()).prepare("SELECT f.*, s.session_id FROM node_faults f JOIN sessions s ON s.binding_id = f.episode_binding_id WHERE f.node_id = ? AND f.episode_state IS NOT NULL").get(e);return t===void 0?null:{state:t.episode_state,sessionId:t.session_id,fault:H(t)}}o(st,"readEpisode");async function at(){return(await(await p()).prepare("SELECT f.*, s.session_id AS bound_session_id FROM node_faults f JOIN sessions s ON s.binding_id = f.episode_binding_id WHERE f.active = 1 AND f.episode_state = 'pending' AND s.unbound_at IS NULL AND s.session_id IS NOT NULL AND f.link = 'pi\u2192provider' AND f.retry_disposition = 'auto' AND f.retry_by = 'daemon' AND f.kind IN ('connection', 'rate-limit', 'overloaded')").all()).map(t=>({nodeId:t.node_id,sessionId:t.bound_session_id,fault:H(t),updatedAt:t.updated_at}))}o(at,"listPendingProviderRetries");async function dt(e){const t=await re(e)===null;return{async explanation(){if(!t)return null;const n=await re(e);if(n===null||n.link!=="crtr\u2192pi"||n.retry.disposition!=="fatal")return null;const r=n.op.trim(),i=n.message.trim();return r===""||i===""?null:`${r}: ${i}`}}}o(dt,"beginBootFaultAttempt");function ie(e,t){try{return ce(e).mtime.toISOString()}catch{return t}}o(ie,"markerMtime");function P(e,t){if(!f(e))return null;try{return de(e,"utf8")}catch(n){if(!t)return null;throw new Error(`cannot import recovery input ${e}: ${n.message}`)}}o(P,"legacyFile");function Ie(e,t){return _(e,"SELECT execution_id, started_at FROM executions WHERE node_id = ? ORDER BY rowid DESC LIMIT 1").get(t)??null}o(Ie,"latestExecution");function we(e,t){const r=C(e,"nodes").has("launched_at")?_(e,"SELECT COALESCE(launched_at, created) AS started_at FROM nodes WHERE node_id = ?").get(t):_(e,"SELECT created AS started_at FROM nodes WHERE node_id = ?").get(t);if(r===void 0)throw new Error(`cannot import recovery witness for unknown node ${t}`);const i=I();return _(e,"INSERT INTO executions (execution_id, node_id, daemon_epoch, pid, process_identity, state, started_at, ended_at, exit_reason) VALUES (?, ?, NULL, NULL, NULL, 'exited', ?, ?, 'pre-consolidation')").run(i,t,r.started_at,r.started_at),{execution_id:i,started_at:r.started_at}}o(we,"syntheticExecution");function oe(e,t,n,r,i){const s=I();return _(e,z).run(...Z(s,t,n,r,i)),{...n,faultId:s}}o(oe,"insertMigratedFault");function De(e,t,n,r){const i=_(e,"SELECT binding_id, node_id FROM sessions WHERE transcript_path = ? AND unbound_at IS NULL").get(n);if(i!==void 0){if(i.node_id!==t)throw new Error(`cannot import provider retry ${r}: transcript is live-owned by ${i.node_id}`);return i.binding_id}const s=_(e,"SELECT binding_id FROM sessions WHERE node_id = ? AND transcript_path = ? ORDER BY rowid DESC LIMIT 1").get(t,n);if(s!==void 0)return s.binding_id;const d=_(e,"SELECT created FROM nodes WHERE node_id = ?").get(t);if(d===void 0)throw new Error(`cannot import provider retry ${r}: unknown node ${t}`);const a=I();return _(e,"INSERT INTO sessions (binding_id, session_id, node_id, transcript_path, source_session_id, fork_entry_id, created_at, bound_at, unbound_at) VALUES (?, NULL, ?, ?, NULL, NULL, ?, ?, ?)").run(a,t,n,d.created,d.created,u()),a}o(De,"migrationBinding");function ut(e){e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'node_faults'").get()!==void 0&&(C(e,"node_faults").has("notified_since")||e.exec("ALTER TABLE node_faults ADD COLUMN notified_since TEXT"))}o(ut,"addFaultNotifiedSince");function ct(e){if(Le(e),me(e),!f(F()))return;const t=ae(F(),{withFileTypes:!0}).filter(r=>r.isDirectory()).sort((r,i)=>r.name.localeCompare(i.name)),n=_(e,"SELECT 1 FROM nodes WHERE node_id = ?");for(const r of t){const i=r.name,s=pe(i),d=N(s,"busy"),a=N(s,"clean-abort"),E=N(s,"transport-poison.json"),U=N(s,"fault"),A=N(s,"provider-retry"),O=f(d),h=f(a);if(!O&&!h&&!f(E)&&!f(U)&&!f(A)||!f(N(F(),i,"meta.json"))&&n.get(i)===void 0)continue;const k=P(E,!1),S=P(U,!0),x=P(A,!0);if(!O&&!h&&k===null&&S===null&&x===null)continue;let y=Ie(e,i);if(y===null&&(y=we(e,i)),O){const c=ie(d,y.started_at);_(e,"UPDATE executions SET turn_open_at = ?, turn_progress_at = ?, turn_closed_at = NULL, turn_end_reason = NULL WHERE execution_id = ?").run(c,c,y.execution_id)}else if(h){const c=ie(a,y.started_at);_(e,"UPDATE executions SET turn_open_at = ?, turn_progress_at = ?, turn_closed_at = ?, turn_end_reason = 'teardown-aborted' WHERE execution_id = ?").run(c,c,c,y.execution_id)}if(k!==null)try{const c=JSON.parse(k);Number.isInteger(c.consecutivePasses)&&c.consecutivePasses>=1&&Array.isArray(c.routes)&&c.routes.length>0&&c.routes.every(M=>typeof M=="string"&&M!=="")&&_(e,"UPDATE executions SET exit_diagnostic_json = ? WHERE execution_id = ?").run(JSON.stringify({schema:"crtr.execution-exit-diagnostic/v1",transport_poison:{consecutive_passes:c.consecutivePasses,routes:c.routes}}),y.execution_id)}catch{}const R=S===null?null:Y(S);if(S!==null&&R===null)throw new Error(`cannot import recovery fault ${U}`);const T=x===null?null:Se(x);if(x!==null&&T===null)throw new Error(`cannot import provider retry ${A}`);let v=R===null||R.link==="broker\u2194crtrd"?null:oe(e,i,R,!0);if(T!==null){const c=De(e,i,T.sessionFile,A);v!==null&&v.since===T.fault.since?_(e,"UPDATE node_faults SET episode_state = ?, episode_binding_id = ?, updated_at = ? WHERE fault_id = ?").run(T.state,c,u(),v.faultId):oe(e,i,T.fault,!1,{state:T.state,bindingId:c})}}}o(ct,"migrateRecoveryWitnesses");export{Me as FAULT_QUIET_MS,ut as addFaultNotifiedSince,nt as admitEpisode,dt as beginBootFaultAttempt,ot as clearEpisode,et as clearFault,je as closeTurn,Ve as hasAdmittedTurn,H as hydrateFault,it as invalidateEpisode,at as listPendingProviderRetries,ze as listUnnotifiedFatalFaultNodes,qe as markFaultNotified,Be as markNodeRead,ct as migrateRecoveryWitnesses,Xe as openTurn,K as parseProviderError,st as readEpisode,re as readFault,Ge as readInterruptedTurn,Ye as readLiveTurn,Ke as readTransportPoisonVerdict,Qe as recordFault,tt as recordPendingEpisode,Je as recordTransportPoisonVerdict,$e as recordTurnProgress,rt as reopenEpisode,Ze as setFatalFaultAnnouncer};
|
|
@@ -156,7 +156,7 @@ export declare function readSessionTail(sessionFile: string | null | undefined):
|
|
|
156
156
|
* by design: ANY substance keeps the node, so the reap never deletes real work
|
|
157
157
|
* — a tool-call-only turn (no final text) still counts. Drives reap-on-close/
|
|
158
158
|
* detach. One file read with an early exit on the first substantive turn. */
|
|
159
|
-
export declare function nodeHasAssistantMessage(sessionFile: string | null | undefined): boolean
|
|
159
|
+
export declare function nodeHasAssistantMessage(sessionFile: string | null | undefined): Promise<boolean>;
|
|
160
160
|
/** "Most recent activity" sort key from the daemon's telemetry projection. It
|
|
161
161
|
* falls back to `created` when the broker has never reported telemetry. */
|
|
162
162
|
export declare function sessionMtime(created: string, telemetryUpdatedAt: string | null | undefined, remote?: boolean): number;
|
|
@@ -4,4 +4,4 @@ var Y=Object.defineProperty;var u=(t,e)=>Y(t,"name",{value:e,configurable:!0});i
|
|
|
4
4
|
`)}u(bt,"renderForestFromSource");const E=4096;function O(t){try{const e=K(U(t),R(t,"initial-prompt.md"))?.trim()??"";return e===""?void 0:e.length>E?e.slice(0,E):e}catch{return}}u(O,"readGoalText");const F=1024;function nt(t){if(t==null)return;const e=t.tier,i=t.created,n=t.body,r=n.split(`
|
|
5
5
|
`);let s="",c=n;for(let l=0;l<r.length;l++){const o=(r[l]??"").trim();if(o!==""){s=o.startsWith("#")?o.replace(/^#+\s*/,"").trim():o,c=r.slice(l+1).join(`
|
|
6
6
|
`);break}}const a=c.replace(/\s+/g," ").trim();return{kind:e,ts:i,heading:s,body:a.length>F?a.slice(0,F):a}}u(nt,"reportPreview");const it=[262144,1<<20,4<<20],rt=65536,st=65536;async function M(t,e,i){if(t==null||t==="")return null;const n=v(t);if(n===null)return null;try{const{entries:r,tail:s}=await J(n,{head:e,tail:i});return{head:r,tail:s??r,windowed:s!==void 0}}catch(r){if(r instanceof N)return null;throw r}}u(M,"readSessionWindow");const b=8192,k=2048;async function at(t){const e=await M(t,rt,st);if(e===null)return;const i=[];let n=0;for(const s of e.windowed?[...e.head,...e.tail]:e.head){if(s.type!=="message"||s.message.role!=="user")continue;const c=D(s.message.content);if(c===""||C({role:"user",content:c})!==null)continue;const a=c.length>k?c.slice(0,k):c;if(i.push(a),n+=a.length+1,n>=b)break}if(i.length===0)return;const r=i.join(`
|
|
7
|
-
`);return r.length>b?r.slice(0,b):r}u(at,"readSessionPrompts");const j=120,z=4096;async function ot(t){let e={transcript:[]};for(const i of it){const n=await M(t,0,i);if(n===null||(e=ct(n.tail),!n.windowed||e.lastAssistant!==void 0))return e}return e}u(ot,"readSessionTail");function ct(t){const e=[];let i;for(const n of t){if(n.type!=="message")continue;const r=n.message.role;if(r!=="user"&&r!=="assistant")continue;const s=D(n.message.content);s!==""&&(r==="assistant"&&(i=s.length>k?s.slice(0,k):s),C({role:r,content:s})===null&&e.push({role:r,text:s.length>z?s.slice(0,z):s}))}return{transcript:e.length>j?e.slice(e.length-j):e,...i===void 0?{}:{lastAssistant:i}}}u(ct,"sessionTailFrom");function vt(t){if(t==null||t==="")return!1;const e=v(t);if(e===null)return!1;let i;try{i=H().read(e).entries}catch(n){if(n instanceof N)return!1;throw n}for(const n of i)if(!(n.type!=="message"||n.message.role!=="assistant")&&ut(n.message.content))return!0;return!1}u(vt,"nodeHasAssistantMessage");function ut(t){if(typeof t=="string")return t.trim()!=="";if(!Array.isArray(t))return!1;for(const e of t){if(e===null||typeof e!="object")continue;const i=e,n=(i.type??"").toLowerCase();if(n==="text"){if(typeof i.text=="string"&&i.text.trim()!=="")return!0}else if(n==="thinking"){if(typeof i.thinking=="string"&&i.thinking.trim()!=="")return!0}else return!0}return!1}u(ut,"assistantContentIsSubstantive");function D(t){if(typeof t=="string")return t.trim();if(!Array.isArray(t))return"";const e=[];for(const i of t)if(i!==null&&typeof i=="object"){const n=i;n.type==="text"&&typeof n.text=="string"&&e.push(n.text)}return e.join(" ").trim()}u(D,"extractUserText");function lt(t,e,i=!1){if(!i&&e!==null&&e!==void 0){const r=Date.parse(e);if(!Number.isNaN(r))return r}const n=Date.parse(t);return Number.isNaN(n)?0:n}u(lt,"sessionMtime");function ft(t){if(t.status!=="active")return!1;try{const e=JSON.parse(q(Q(t.node_id),R(X(t.node_id),"attach.json")).toString("utf8"));return typeof e.viewers=="number"&&e.viewers>0}catch{return!1}}u(ft,"hasLiveBrokerViewer");function dt(t,e,i){const n=t.status==="active"||t.status==="idle",r=t.fault??null;return{node_id:t.node_id,name:S(t),handle:t.name,description:t.description,status:t.status,frozen_at:t.frozen_at??null,terminal_reason:t.terminal_reason??null,kind:t.kind,mode:t.mode,ctx_tokens:i?0:t.telemetry_tokens_in??0,asks:0,cwd:t.cwd,profile_id:t.profile_id,created:t.created,lifecycle:t.lifecycle,finalized:t.final_report!=null,mtimeMs:lt(t.created,t.telemetry_updated_at,i),streaming:r===null&&n&&t.streaming===!0,hanging:r,viewed:i?!1:e.has(t.node_id)||ft(t),srcRow:t}}u(dt,"dashboardRowFromNodeRow");async function Nt(t,e,i,n){const r=t instanceof y,s=n??await t.ticketCountsForView(e).catch(()=>({})),c=new Map((i??await t.listNodes()).map(l=>[l.node_id,l]));return[e,...await t.view(e)].flatMap(l=>{const o=c.get(l);return o===void 0?[]:[{node_id:l,name:S(o),handle:o.name,description:o.description,status:o.status,frozen_at:o.frozen_at??null,terminal_reason:o.terminal_reason??null,kind:o.kind,mode:o.mode,ctx_tokens:r?0:o.telemetry_tokens_in??0,asks:s[l]??0,cwd:o.cwd,profile_id:o.profile_id,created:o.created}]})}u(Nt,"dashboardRowsFromSource");async function Rt(t,e=new Set,i=!1,n){const r=t instanceof y,s=r?new Set:e;return(n??await t.listNodes(i?{status:["active","idle"]}:void 0)).map(a=>dt(a,s,r))}u(Rt,"dashboardRowsAllFromSource");async function Tt(t,e,i){const n=e.filter(s=>s.enriched!==!0);if(n.length===0)return;const r=i??{};for(const s of n)s.asks=r[s.node_id]??0,s.enriched=!0}u(Tt,"enrichRowsFromSource");async function B(t,e,i){const n=i?.paths;if(n!==void 0)return n.context_dir;const r=e.srcRow?.grantee??(await t.getRow(e.node_id))?.grantee;if(!r)throw new Error(`node ${e.node_id} has no app assignment`);return Z(e.node_id,r)}u(B,"contextPathOf");async function wt(t,e,i={}){const n=i.transcript===!0&&e.transcriptLoaded!==!0;if(e.previewLoaded===!0&&!n)return e;if(t instanceof y)return e.previewLoaded=!0,n&&(e.transcript=[],e.transcriptLoaded=!0),e;const r=await t.getNode(e.node_id),s=await ot(r?.pi_session_file);return e.previewLoaded!==!0&&(e.goal??=O(await B(t,e,r)),e.lastAssistant=s.lastAssistant,e.recap=I(e.node_id),e.report=nt(await t.newestReport?.(e.node_id).catch(()=>null)),e.previewLoaded=!0),n&&(e.transcript=s.transcript,e.transcriptLoaded=!0),e}u(wt,"loadPreviewFromSource");async function At(t,e){if(e.promptsLoaded===!0)return e;if(!(t instanceof y)){const i=await t.getNode(e.node_id);e.goal??=O(await B(t,e,i)),e.prompts=await at(i?.pi_session_file)}return e.promptsLoaded=!0,e}u(At,"loadSearchTextFromSource");export{dt as dashboardRowFromNodeRow,Rt as dashboardRowsAllFromSource,Nt as dashboardRowsFromSource,Tt as enrichRowsFromSource,P as fmtCtx,wt as loadPreviewFromSource,At as loadSearchTextFromSource,vt as nodeHasAssistantMessage,O as readGoalText,at as readSessionPrompts,ot as readSessionTail,bt as renderForestFromSource,et as renderTreeFromSource,nt as reportPreview,lt as sessionMtime};
|
|
7
|
+
`);return r.length>b?r.slice(0,b):r}u(at,"readSessionPrompts");const j=120,z=4096;async function ot(t){let e={transcript:[]};for(const i of it){const n=await M(t,0,i);if(n===null||(e=ct(n.tail),!n.windowed||e.lastAssistant!==void 0))return e}return e}u(ot,"readSessionTail");function ct(t){const e=[];let i;for(const n of t){if(n.type!=="message")continue;const r=n.message.role;if(r!=="user"&&r!=="assistant")continue;const s=D(n.message.content);s!==""&&(r==="assistant"&&(i=s.length>k?s.slice(0,k):s),C({role:r,content:s})===null&&e.push({role:r,text:s.length>z?s.slice(0,z):s}))}return{transcript:e.length>j?e.slice(e.length-j):e,...i===void 0?{}:{lastAssistant:i}}}u(ct,"sessionTailFrom");async function vt(t){if(t==null||t==="")return!1;const e=v(t);if(e===null)return!1;let i;try{i=(await H().read(e)).entries}catch(n){if(n instanceof N)return!1;throw n}for(const n of i)if(!(n.type!=="message"||n.message.role!=="assistant")&&ut(n.message.content))return!0;return!1}u(vt,"nodeHasAssistantMessage");function ut(t){if(typeof t=="string")return t.trim()!=="";if(!Array.isArray(t))return!1;for(const e of t){if(e===null||typeof e!="object")continue;const i=e,n=(i.type??"").toLowerCase();if(n==="text"){if(typeof i.text=="string"&&i.text.trim()!=="")return!0}else if(n==="thinking"){if(typeof i.thinking=="string"&&i.thinking.trim()!=="")return!0}else return!0}return!1}u(ut,"assistantContentIsSubstantive");function D(t){if(typeof t=="string")return t.trim();if(!Array.isArray(t))return"";const e=[];for(const i of t)if(i!==null&&typeof i=="object"){const n=i;n.type==="text"&&typeof n.text=="string"&&e.push(n.text)}return e.join(" ").trim()}u(D,"extractUserText");function lt(t,e,i=!1){if(!i&&e!==null&&e!==void 0){const r=Date.parse(e);if(!Number.isNaN(r))return r}const n=Date.parse(t);return Number.isNaN(n)?0:n}u(lt,"sessionMtime");function ft(t){if(t.status!=="active")return!1;try{const e=JSON.parse(q(Q(t.node_id),R(X(t.node_id),"attach.json")).toString("utf8"));return typeof e.viewers=="number"&&e.viewers>0}catch{return!1}}u(ft,"hasLiveBrokerViewer");function dt(t,e,i){const n=t.status==="active"||t.status==="idle",r=t.fault??null;return{node_id:t.node_id,name:S(t),handle:t.name,description:t.description,status:t.status,frozen_at:t.frozen_at??null,terminal_reason:t.terminal_reason??null,kind:t.kind,mode:t.mode,ctx_tokens:i?0:t.telemetry_tokens_in??0,asks:0,cwd:t.cwd,profile_id:t.profile_id,created:t.created,lifecycle:t.lifecycle,finalized:t.final_report!=null,mtimeMs:lt(t.created,t.telemetry_updated_at,i),streaming:r===null&&n&&t.streaming===!0,hanging:r,viewed:i?!1:e.has(t.node_id)||ft(t),srcRow:t}}u(dt,"dashboardRowFromNodeRow");async function Nt(t,e,i,n){const r=t instanceof y,s=n??await t.ticketCountsForView(e).catch(()=>({})),c=new Map((i??await t.listNodes()).map(l=>[l.node_id,l]));return[e,...await t.view(e)].flatMap(l=>{const o=c.get(l);return o===void 0?[]:[{node_id:l,name:S(o),handle:o.name,description:o.description,status:o.status,frozen_at:o.frozen_at??null,terminal_reason:o.terminal_reason??null,kind:o.kind,mode:o.mode,ctx_tokens:r?0:o.telemetry_tokens_in??0,asks:s[l]??0,cwd:o.cwd,profile_id:o.profile_id,created:o.created}]})}u(Nt,"dashboardRowsFromSource");async function Rt(t,e=new Set,i=!1,n){const r=t instanceof y,s=r?new Set:e;return(n??await t.listNodes(i?{status:["active","idle"]}:void 0)).map(a=>dt(a,s,r))}u(Rt,"dashboardRowsAllFromSource");async function Tt(t,e,i){const n=e.filter(s=>s.enriched!==!0);if(n.length===0)return;const r=i??{};for(const s of n)s.asks=r[s.node_id]??0,s.enriched=!0}u(Tt,"enrichRowsFromSource");async function B(t,e,i){const n=i?.paths;if(n!==void 0)return n.context_dir;const r=e.srcRow?.grantee??(await t.getRow(e.node_id))?.grantee;if(!r)throw new Error(`node ${e.node_id} has no app assignment`);return Z(e.node_id,r)}u(B,"contextPathOf");async function wt(t,e,i={}){const n=i.transcript===!0&&e.transcriptLoaded!==!0;if(e.previewLoaded===!0&&!n)return e;if(t instanceof y)return e.previewLoaded=!0,n&&(e.transcript=[],e.transcriptLoaded=!0),e;const r=await t.getNode(e.node_id),s=await ot(r?.pi_session_file);return e.previewLoaded!==!0&&(e.goal??=O(await B(t,e,r)),e.lastAssistant=s.lastAssistant,e.recap=I(e.node_id),e.report=nt(await t.newestReport?.(e.node_id).catch(()=>null)),e.previewLoaded=!0),n&&(e.transcript=s.transcript,e.transcriptLoaded=!0),e}u(wt,"loadPreviewFromSource");async function At(t,e){if(e.promptsLoaded===!0)return e;if(!(t instanceof y)){const i=await t.getNode(e.node_id);e.goal??=O(await B(t,e,i)),e.prompts=await at(i?.pi_session_file)}return e.promptsLoaded=!0,e}u(At,"loadSearchTextFromSource");export{dt as dashboardRowFromNodeRow,Rt as dashboardRowsAllFromSource,Nt as dashboardRowsFromSource,Tt as enrichRowsFromSource,P as fmtCtx,wt as loadPreviewFromSource,At as loadSearchTextFromSource,vt as nodeHasAssistantMessage,O as readGoalText,at as readSessionPrompts,ot as readSessionTail,bt as renderForestFromSource,et as renderTreeFromSource,nt as reportPreview,lt as sessionMtime};
|
|
@@ -10,18 +10,18 @@ export interface SessionBinding {
|
|
|
10
10
|
boundAt: string;
|
|
11
11
|
unboundAt: string | null;
|
|
12
12
|
}
|
|
13
|
-
export declare function readLiveSession(nodeId: string): SessionBinding | null
|
|
14
|
-
export declare function findNodeBySessionFileSql(path: string): string | null
|
|
13
|
+
export declare function readLiveSession(nodeId: string): Promise<SessionBinding | null>;
|
|
14
|
+
export declare function findNodeBySessionFileSql(path: string): Promise<string | null>;
|
|
15
15
|
export declare function bindSession(nodeId: string, input: {
|
|
16
16
|
executionId: string;
|
|
17
17
|
sessionId: string | null;
|
|
18
18
|
transcriptPath: string | null;
|
|
19
19
|
sourceSessionId?: string | null;
|
|
20
|
-
}): 'bound' | 'shutdown'
|
|
20
|
+
}): Promise<'bound' | 'shutdown'>;
|
|
21
21
|
export declare function resetSession(nodeId: string, input: {
|
|
22
22
|
sessionId: string;
|
|
23
23
|
transcriptPath: string | null;
|
|
24
|
-
}): void
|
|
24
|
+
}): Promise<void>;
|
|
25
25
|
export declare function transferSession(input: {
|
|
26
26
|
fromNodeId: string;
|
|
27
27
|
fromBindingId: string;
|
|
@@ -29,16 +29,16 @@ export declare function transferSession(input: {
|
|
|
29
29
|
executionId: string;
|
|
30
30
|
sessionId: string | null;
|
|
31
31
|
transcriptPath: string | null;
|
|
32
|
-
}): 'transferred' | 'shutdown' | 'changed'
|
|
33
|
-
export declare function unbindSession(nodeId: string): void
|
|
32
|
+
}): Promise<'transferred' | 'shutdown' | 'changed'>;
|
|
33
|
+
export declare function unbindSession(nodeId: string): Promise<void>;
|
|
34
34
|
/** Rewrite the header `cwd` of every transcript this node owns from `oldCwd` to `newCwd`, keeping
|
|
35
35
|
* the sessions bound. Pi opens a transcript with its header cwd and a resume is vetoed once that
|
|
36
36
|
* directory is gone, so a same-directory relocation must move the header too. Each file is replaced
|
|
37
37
|
* atomically (temp + fsync + rename) and a run node's indexed `event_offset` shifts by the byte
|
|
38
38
|
* delta, in one canvas write that also serializes against `appendSection`. Returns files rewritten. */
|
|
39
|
-
export declare function relocateSessionCwd(nodeId: string, oldCwd: string, newCwd: string): number
|
|
40
|
-
export declare function setCyclePending(nodeId: string, pending: boolean): void
|
|
41
|
-
export declare function conversationOwner(conversationId: string): string | null
|
|
39
|
+
export declare function relocateSessionCwd(nodeId: string, oldCwd: string, newCwd: string): Promise<number>;
|
|
40
|
+
export declare function setCyclePending(nodeId: string, pending: boolean): Promise<void>;
|
|
41
|
+
export declare function conversationOwner(conversationId: string): Promise<string | null>;
|
|
42
42
|
/** Map only the indexed conversation paths; repair each file on first use. */
|
|
43
43
|
export declare function openCanvasConversationStore(root: string): ConversationStore & {
|
|
44
44
|
recover(rows: Array<{
|
|
@@ -48,7 +48,7 @@ export declare function openCanvasConversationStore(root: string): ConversationS
|
|
|
48
48
|
}>): void;
|
|
49
49
|
repair(id: string): void;
|
|
50
50
|
};
|
|
51
|
-
export declare function repairRunConversations(runId: string): void
|
|
51
|
+
export declare function repairRunConversations(runId: string): Promise<void>;
|
|
52
52
|
/** Open the canvas conversation store from the user `store` settings, install it in this
|
|
53
53
|
* process, and serve it for brokers. Unset settings use pi's sessions dir and
|
|
54
54
|
* `<CRTR_HOME>/store.sock`. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
2
|
-
FROM sessions s JOIN nodes n ON n.node_id = s.node_id WHERE s.session_id = ? ORDER BY s.unbound_at IS NULL DESC, s.created_at DESC, s.rowid DESC LIMIT 1`).get(n);if(!s?.run_id||s.event_offset===null)return;if(s.event_offset===0&&!
|
|
3
|
-
`);if(
|
|
4
|
-
`).filter(Boolean).map(
|
|
1
|
+
var v=Object.defineProperty;var a=(n,e)=>v(n,"name",{value:e,configurable:!0});import{randomUUID as w}from"node:crypto";import{closeSync as y,existsSync as N,fsyncSync as C,openSync as T,readFileSync as U,readSync as A,renameSync as W,statSync as H,truncateSync as I,unlinkSync as D,writeFileSync as M}from"node:fs";import{openDb as c,withCanvasWrite as l}from"./db.js";import{canonicalSessionFile as R}from"./canvas.js";import{join as O}from"node:path";import{readConfig as x}from"../config.js";import{appSpace as F,socketDir as P}from"../layout.js";import{createFileStore as B,conversationStore as $,defaultConversationRoot as k,installConversationStore as b}from"../conversation-store/index.js";import{listenConversationStore as J}from"../conversation-store/listener.js";import{appendConversationEvents as h}from"../../daemon/runs/append-section.js";function S(){return new Date().toISOString()}a(S,"now");async function m(n,e,s){return await n.prepare("SELECT 1 FROM executions WHERE execution_id = ? AND node_id = ? AND state != 'exited'").get(s,e)!==void 0}a(m,"liveExecution");function j(n){return{bindingId:n.binding_id,sessionId:n.session_id??null,nodeId:n.node_id,transcriptPath:n.transcript_path??null,sourceSessionId:n.source_session_id??null,forkEntryId:n.fork_entry_id??null,createdAt:n.created_at,boundAt:n.bound_at,unboundAt:n.unbound_at??null}}a(j,"hydrate");async function rn(n){const e=await(await c()).prepare("SELECT * FROM sessions WHERE node_id = ? AND unbound_at IS NULL").get(n);return e===void 0?null:j(e)}a(rn,"readLiveSession");async function an(n){return(await(await c()).prepare("SELECT node_id FROM sessions WHERE transcript_path = ? AND unbound_at IS NULL").get(R(n)))?.node_id??null}a(an,"findNodeBySessionFileSql");async function dn(n,e){return await l(async s=>{if(!await m(s,n,e.executionId))return"shutdown";const i=S(),o=e.transcriptPath===null?null:R(e.transcriptPath),r=await s.prepare("SELECT binding_id, session_id FROM sessions WHERE node_id = ? AND unbound_at IS NULL").get(n);if(r!==void 0&&r.session_id===e.sessionId)await s.prepare("UPDATE sessions SET transcript_path = ?, source_session_id = ?, bound_at = ? WHERE binding_id = ?").run(o,e.sourceSessionId??null,i,r.binding_id);else{r!==void 0&&await s.prepare("UPDATE sessions SET unbound_at = ? WHERE binding_id = ?").run(i,r.binding_id);const t=e.sessionId===null?void 0:await s.prepare("SELECT binding_id FROM sessions WHERE node_id = ? AND session_id = ? ORDER BY created_at DESC LIMIT 1").get(n,e.sessionId);t?await s.prepare("UPDATE sessions SET transcript_path = ?, source_session_id = ?, bound_at = ?, unbound_at = NULL WHERE binding_id = ?").run(o,e.sourceSessionId??null,i,t.binding_id):await s.prepare("INSERT INTO sessions (binding_id, session_id, node_id, transcript_path, source_session_id, fork_entry_id, created_at, bound_at) VALUES (?, ?, ?, ?, ?, NULL, ?, ?)").run(w(),e.sessionId,n,o,e.sourceSessionId??null,i,i)}return await s.prepare("UPDATE nodes SET cycle_pending = 0 WHERE node_id = ?").run(n),"bound"})}a(dn,"bindSession");async function cn(n,e){await l(async s=>{const i=S();await s.prepare("UPDATE sessions SET unbound_at = ? WHERE node_id = ? AND unbound_at IS NULL").run(i,n),await s.prepare("INSERT INTO sessions (binding_id, session_id, node_id, transcript_path, source_session_id, fork_entry_id, created_at, bound_at) VALUES (?, ?, ?, ?, NULL, NULL, ?, ?)").run(w(),e.sessionId,n,e.transcriptPath===null?null:R(e.transcriptPath),i,i),await s.prepare("UPDATE nodes SET cycle_pending = 0 WHERE node_id = ?").run(n)})}a(cn,"resetSession");async function _n(n){return await l(async e=>{if(!await m(e,n.toNodeId,n.executionId))return"shutdown";if(await e.prepare("SELECT binding_id FROM sessions WHERE node_id = ? AND binding_id = ? AND unbound_at IS NULL").get(n.fromNodeId,n.fromBindingId)===void 0)return"changed";if(await e.prepare("SELECT run_id FROM nodes WHERE node_id IN (?, ?) AND run_id IS NOT NULL LIMIT 1").get(n.fromNodeId,n.toNodeId))throw new Error("run conversation transfer is not supported");const o=S();return await e.prepare("UPDATE sessions SET unbound_at = ? WHERE binding_id = ?").run(o,n.fromBindingId),await e.prepare("UPDATE sessions SET unbound_at = ? WHERE node_id = ? AND unbound_at IS NULL").run(o,n.toNodeId),await e.prepare("INSERT INTO sessions (binding_id, session_id, node_id, transcript_path, source_session_id, fork_entry_id, created_at, bound_at) VALUES (?, ?, ?, ?, NULL, NULL, ?, ?)").run(w(),n.sessionId,n.toNodeId,n.transcriptPath===null?null:R(n.transcriptPath),o,o),await e.prepare("UPDATE nodes SET cycle_pending = 0 WHERE node_id = ?").run(n.toNodeId),"transferred"})}a(_n,"transferSession");async function un(n){await(await c()).prepare("UPDATE sessions SET unbound_at = ? WHERE node_id = ? AND unbound_at IS NULL").run(S(),n)}a(un,"unbindSession");async function En(n,e,s){return await l(async i=>{const o=await i.prepare("SELECT binding_id, transcript_path FROM sessions WHERE node_id = ? AND transcript_path IS NOT NULL").all(n),r=[];try{for(const t of o){if(!N(t.transcript_path))continue;const _=U(t.transcript_path),f=_.indexOf(10);if(f<0)continue;let u;try{u=JSON.parse(_.subarray(0,f).toString("utf8"))}catch{continue}if(u.type!=="session"||u.cwd!==e)continue;const E=Buffer.concat([Buffer.from(JSON.stringify({...u,cwd:s}),"utf8"),_.subarray(f)]),d=`${t.transcript_path}.${w()}.tmp`;r.push({binding_id:t.binding_id,path:t.transcript_path,temp:d,delta:E.length-_.length}),M(d,E,{flag:"wx",mode:384});const p=T(d,"r");try{C(p)}finally{y(p)}}for(const t of r)t.delta!==0&&await i.prepare("UPDATE sessions SET event_offset = event_offset + ? WHERE binding_id = ? AND event_offset IS NOT NULL AND event_offset > 0").run(t.delta,t.binding_id);for(const t of r)W(t.temp,t.path)}finally{for(const t of r)N(t.temp)&&D(t.temp)}return r.length})}a(En,"relocateSessionCwd");async function pn(n,e){await(await c()).prepare("UPDATE nodes SET cycle_pending = ? WHERE node_id = ?").run(e?1:0,n)}a(pn,"setCyclePending");const L="unbound_at IS NULL DESC, created_at DESC, rowid DESC";async function fn(n){return(await(await c()).prepare(`SELECT node_id FROM sessions WHERE session_id = ? ORDER BY ${L} LIMIT 1`).get(n))?.node_id??null}a(fn,"conversationOwner");const Y={appendSection:a(async(n,e,s)=>{const i=e.kind==="create"?e:void 0;i&&await l(async o=>{if(!await o.prepare("SELECT node_id FROM nodes WHERE node_id = ?").get(i.nodeId))throw new Error(`missing conversation owner ${i.nodeId}`);const t=S();await o.prepare("INSERT INTO sessions (binding_id, session_id, node_id, transcript_path, source_session_id, fork_entry_id, created_at, bound_at, unbound_at, event_offset) VALUES (?, ?, ?, ?, ?, NULL, ?, ?, ?, 0)").run(w(),n,i.nodeId,i.path,i.sourceId??null,t,t,t)}),await l(async o=>{const r=await o.prepare(`SELECT node_id, binding_id, input_ids_json FROM sessions WHERE session_id = ? ORDER BY ${L} LIMIT 1`).get(n),t=i?i.nodeId:r?.node_id;if(!t)throw new Error(`conversation ${n} has no active owner`);const _=await o.prepare("SELECT run_id FROM nodes WHERE node_id = ?").get(t);if(!_)throw new Error(`cannot write conversation ${n}: missing node ${t}`);if(e.kind==="replace"&&_.run_id!==null)throw new Error(`run conversation ${n} is append-only; replace refused`);const f=r.binding_id,u=s();if(_.run_id!==null&&e.kind!=="replace"){const E=i?.sourceId?[]:e.entries,d=await h(o,_.run_id,t,E,JSON.parse(r?.input_ids_json??"[]"));await o.prepare("UPDATE sessions SET event_offset = ?, indexed_entry_id = ?, input_ids_json = ? WHERE binding_id = ?").run(u,E.at(-1)?.id??null,JSON.stringify(d),f)}})},"appendSection"),async abortCreate(n){await(await c()).prepare("DELETE FROM sessions WHERE session_id = ? AND event_offset = 0").run(n)},async delete(n){await(await c()).prepare("DELETE FROM sessions WHERE session_id = ?").run(n)},async pathFor(n){return(await(await c()).prepare(`SELECT transcript_path FROM sessions WHERE session_id = ? ORDER BY ${L} LIMIT 1`).get(n))?.transcript_path??void 0},async createPath(n,e){const s=await(await c()).prepare("SELECT grantee FROM node_rows WHERE node_id = ?").get(n);if(!s)throw new Error(`missing conversation owner ${n}`);return O(F(s.grantee).conversations,n,`${e.timestamp.replace(/[:.]/g,"-")}_${e.id}.jsonl`)},async repair(n,e){await V(n,e)},async owners(){const n=new Map,e=await(await c()).prepare(`SELECT session_id, node_id FROM sessions WHERE session_id IS NOT NULL ORDER BY session_id, ${L}`).all();for(const s of e)n.has(s.session_id)||n.set(s.session_id,s.node_id);return n}};async function V(n,e){const s=await(await c()).prepare(`SELECT s.binding_id, s.node_id, s.event_offset, s.input_ids_json, s.source_session_id, n.run_id
|
|
2
|
+
FROM sessions s JOIN nodes n ON n.node_id = s.node_id WHERE s.session_id = ? ORDER BY s.unbound_at IS NULL DESC, s.created_at DESC, s.rowid DESC LIMIT 1`).get(n);if(!s?.run_id||s.event_offset===null)return;if(s.event_offset===0&&!N(e)){await(await c()).prepare("DELETE FROM sessions WHERE binding_id = ?").run(s.binding_id);return}const i=H(e).size;if(i<s.event_offset)throw new Error(`conversation shorter than indexed offset: ${n}`);if(i===s.event_offset)return;const o=T(e,"r"),r=[];try{const d=Buffer.allocUnsafe(65536);for(let p=s.event_offset;p<i;){const g=A(o,d,0,Math.min(d.length,i-p),p);if(!g)throw new Error(`conversation read ended early: ${n}`);r.push(Buffer.from(d.subarray(0,g))),p+=g}}finally{y(o)}const t=Buffer.concat(r).toString("utf8"),_=t.lastIndexOf(`
|
|
3
|
+
`);if(_<0){s.event_offset===0?(D(e),await(await c()).prepare("DELETE FROM sessions WHERE binding_id = ?").run(s.binding_id)):I(e,s.event_offset);return}const f=t.slice(0,_+1),u=f.split(`
|
|
4
|
+
`).filter(Boolean).map(d=>JSON.parse(d)).filter(d=>d.type!=="session"),E=s.event_offset+Buffer.byteLength(f);E<i&&I(e,E),await l(async d=>{const p=s.source_session_id?[]:await h(d,s.run_id,s.node_id,u,JSON.parse(s.input_ids_json));await d.prepare("UPDATE sessions SET event_offset = ?, indexed_entry_id = ?, input_ids_json = ? WHERE binding_id = ?").run(E,u.at(-1)?.id??null,JSON.stringify(p),s.binding_id)})}a(V,"repairConversationTail");function z(n){return B(n,Y)}a(z,"openCanvasConversationStore");async function ln(n){const e=await(await c()).prepare("SELECT DISTINCT s.session_id FROM sessions s JOIN nodes n ON n.node_id = s.node_id WHERE n.run_id = ? AND s.session_id IS NOT NULL").all(n),s=$();for(const i of e)s.repair?.(i.session_id)}a(ln,"repairRunConversations");async function wn(){const n=x("user").store,e=n?.address??O(P(),"store.sock"),s=z(n?.root??k());b(s),process.env.CRTR_STORE_ADDRESS=e;const i=await J(e,s);return{async close(){await i.close(),b(void 0)}}}a(wn,"serveCanvasConversationStore");export{dn as bindSession,fn as conversationOwner,an as findNodeBySessionFileSql,z as openCanvasConversationStore,rn as readLiveSession,En as relocateSessionCwd,ln as repairRunConversations,cn as resetSession,wn as serveCanvasConversationStore,pn as setCyclePending,_n as transferSession,un as unbindSession};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var u=Object.defineProperty;var
|
|
1
|
+
var u=Object.defineProperty;var a=(t,e)=>u(t,"name",{value:e,configurable:!0});import{getNode as m,getRow as v,listNodes as w,subscriptionsOf as p,subscribersOf as d,view as n,hasActiveLiveSubscription as f}from"./canvas.js";import{ticketCountsForNodes as l}from"./attention.js";import{readState as y}from"../config.js";import{resolveRemoteCanvasTarget as C}from"../remote-canvas-target.js";import{RemoteCanvasSource as N}from"./remote-canvas-source.js";import{isSandboxedNode as b}from"../../shared/env.js";import{ownerOnly as h}from"../errors.js";class S{static{a(this,"LocalCanvasSource")}async getNode(e){return await m(e)}async getRow(e){return await v(e)}async listNodes(e){return await w(e)}async subscriptionsOf(e){return await p(e)}async subscribersOf(e){return await d(e)}async view(e){return await n(e)}async ticketCountsForNodes(e){return await l([...e])}async ticketCountsForView(e){return this.ticketCountsForNodes([e,...await n(e)])}async hasActiveLiveSubscription(e){return await f(e)}}const o=new S;function T(t,e=b()){const r=t?.scope??"user";if(e){if(t?.canvasName!==void 0)throw h("--canvas selects the person's remote canvas targets, which an app's node cannot reach","Omit --canvas; this node reads its own runtime's canvas.");return o}const s=t?.canvasName??y(r).activeCanvas??null;if(!s)return o;const{previewEndpoint:i,relayToken:c}=C(s,r);return new N(i,c)}a(T,"resolveCanvasSource");export{S as LocalCanvasSource,o as localCanvasSource,T as resolveCanvasSource};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { DatabaseSync } from 'node:sqlite';
|
|
2
1
|
import type { StructuredRequestDTO, StructuredRequestModeDTO, StructuredRequestStateDTO, StructuredRequestSubmissionDTO } from '../../api/dto/structured-requests.js';
|
|
3
2
|
import type { DeclinedResult, NodeOutcomeDetailV1, TerminalReason } from './types.js';
|
|
3
|
+
import { type CanvasDb } from './db.js';
|
|
4
4
|
export type StructuredRequestFailureReason = TerminalReason | 'node_create_failed' | 'bind_failed' | 'prompt_delivery_failed' | 'node_deadline_exceeded';
|
|
5
5
|
export interface StructuredRequestRow {
|
|
6
6
|
request_id: string;
|
|
@@ -37,8 +37,8 @@ export interface SettleStructuredRequestResult {
|
|
|
37
37
|
/** The daemon installs its post-commit effects here. Core only exposes a committed row. */
|
|
38
38
|
export declare function registerStructuredRequestEffectRunner(runner: (row: StructuredRequestRow) => void): void;
|
|
39
39
|
export declare function runStructuredRequestEffects(row: StructuredRequestRow | null): void;
|
|
40
|
-
export declare function getStructuredRequest(requestId: string): StructuredRequestRow | null
|
|
41
|
-
export declare function getPendingStructuredRequestForNode(nodeId: string): StructuredRequestRow | null
|
|
40
|
+
export declare function getStructuredRequest(requestId: string): Promise<StructuredRequestRow | null>;
|
|
41
|
+
export declare function getPendingStructuredRequestForNode(nodeId: string): Promise<StructuredRequestRow | null>;
|
|
42
42
|
export declare function admitStructuredRequest(input: {
|
|
43
43
|
requestId: string;
|
|
44
44
|
mode: StructuredRequestModeDTO;
|
|
@@ -49,21 +49,21 @@ export declare function admitStructuredRequest(input: {
|
|
|
49
49
|
nodeId?: string | null;
|
|
50
50
|
requestMessageId?: string | null;
|
|
51
51
|
now?: number;
|
|
52
|
-
}): StructuredRequestRow
|
|
52
|
+
}): Promise<StructuredRequestRow>;
|
|
53
53
|
/** Bind is conditional so a cancel that won after creation cannot attach its node. */
|
|
54
|
-
export declare function bindStructuredRequest(requestId: string, nodeId: string): SettleStructuredRequestResult
|
|
54
|
+
export declare function bindStructuredRequest(requestId: string, nodeId: string): Promise<SettleStructuredRequestResult>;
|
|
55
55
|
/** One settlement statement with deadline precedence. Callers that own a wider transaction pass that db. */
|
|
56
|
-
export declare function settleStructuredRequestIn(db:
|
|
57
|
-
export declare function settleStructuredRequest(requestId: string, input: SettleStructuredRequestInput): SettleStructuredRequestResult
|
|
58
|
-
export declare function settlePendingStructuredRequestForNodeIn(db:
|
|
59
|
-
export declare function settlePendingStructuredRequestForNode(nodeId: string, input: SettleStructuredRequestInput): SettleStructuredRequestResult
|
|
60
|
-
export declare function pendingStructuredRequestsPast(now: number): StructuredRequestRow[]
|
|
61
|
-
export declare function incompleteStructuredRequestEffects(): StructuredRequestRow[]
|
|
56
|
+
export declare function settleStructuredRequestIn(db: CanvasDb, requestId: string, input: SettleStructuredRequestInput): Promise<SettleStructuredRequestResult>;
|
|
57
|
+
export declare function settleStructuredRequest(requestId: string, input: SettleStructuredRequestInput): Promise<SettleStructuredRequestResult>;
|
|
58
|
+
export declare function settlePendingStructuredRequestForNodeIn(db: CanvasDb, nodeId: string, input: SettleStructuredRequestInput): Promise<SettleStructuredRequestResult>;
|
|
59
|
+
export declare function settlePendingStructuredRequestForNode(nodeId: string, input: SettleStructuredRequestInput): Promise<SettleStructuredRequestResult>;
|
|
60
|
+
export declare function pendingStructuredRequestsPast(now: number): Promise<StructuredRequestRow[]>;
|
|
61
|
+
export declare function incompleteStructuredRequestEffects(): Promise<StructuredRequestRow[]>;
|
|
62
62
|
/** One-off result paths belong to one request; terminal result paths belong to the latest terminal settlement on the node. */
|
|
63
|
-
export declare function ownsStructuredRequestResultProjection(row: StructuredRequestRow): boolean
|
|
63
|
+
export declare function ownsStructuredRequestResultProjection(row: StructuredRequestRow): Promise<boolean>;
|
|
64
64
|
/** Declines share one legacy path, so its owner is the latest declined request regardless of submission mode. */
|
|
65
|
-
export declare function ownsStructuredRequestDeclineProjection(row: StructuredRequestRow): boolean
|
|
66
|
-
export declare function markStructuredRequestEffectsDone(requestId: string, resultPath: string | null): void
|
|
65
|
+
export declare function ownsStructuredRequestDeclineProjection(row: StructuredRequestRow): Promise<boolean>;
|
|
66
|
+
export declare function markStructuredRequestEffectsDone(requestId: string, resultPath: string | null): Promise<void>;
|
|
67
67
|
/** Legacy node/message schema paths get the same identity and authority. */
|
|
68
|
-
export declare function registerLegacyStructuredRequest(nodeId: string, mode: StructuredRequestSubmissionDTO, schema: Record<string, unknown>, requestMessageId?: string): StructuredRequestRow
|
|
68
|
+
export declare function registerLegacyStructuredRequest(nodeId: string, mode: StructuredRequestSubmissionDTO, schema: Record<string, unknown>, requestMessageId?: string): Promise<StructuredRequestRow>;
|
|
69
69
|
export declare function toStructuredRequestDTO(row: StructuredRequestRow): StructuredRequestDTO;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var g=Object.defineProperty;var d=(e,n)=>g(e,"name",{value:n,configurable:!0});import{randomUUID as D}from"node:crypto";import{openDb as s,withCanvasWrite as
|
|
2
|
-
VALUES (?, ?, ?, ?, ?, 'pending', ?, ?, ?, ?)`).run(e.requestId,e.nodeId??null,e.mode,e.submission,e.dedicated?1:0,JSON.stringify(e.schema),e.deadlineAt,n,e.requestMessageId??null),
|
|
1
|
+
var g=Object.defineProperty;var d=(e,n)=>g(e,"name",{value:n,configurable:!0});import{randomUUID as D}from"node:crypto";import{openDb as s,withCanvasWrite as l}from"./db.js";let _;function A(e){_=e}d(A,"registerStructuredRequestEffectRunner");function E(e){e!==null&&e.state!=="pending"&&_?.(e)}d(E,"runStructuredRequestEffects");function f(e){return e==null?null:JSON.stringify(e)}d(f,"json");function o(e){return typeof e!="string"?null:JSON.parse(e)}d(o,"parseJson");function r(e){if(e===void 0)return null;const n=o(e.schema_json);if(n===null||typeof n!="object"||Array.isArray(n))throw new Error(`structured request ${String(e.request_id)} has invalid schema_json`);const t=e.declined_reason===null?null:{reason:e.declined_reason,code:e.declined_code,retryable:e.declined_retryable===1},a=o(e.failure_detail_json);return{request_id:e.request_id,node_id:e.node_id,mode:e.mode,submission:e.submission,dedicated:e.dedicated===1,state:e.state,schema:n,result:o(e.result_json),deadline_at:e.deadline_at,created_at:e.created_at,settled_at:e.settled_at,effects_done_at:e.effects_done_at,result_path:e.result_path,declined:t,failure_reason:e.failure_reason,failure_detail:a,request_message_id:e.request_message_id??null}}d(r,"rowFrom");async function c(e,n){return r(await e.prepareUncached("SELECT * FROM structured_requests WHERE request_id = ?").get(n))}d(c,"get");async function y(e){return await c(await s(),e)}d(y,"getStructuredRequest");async function p(e){return r(await(await s()).prepareUncached("SELECT * FROM structured_requests WHERE node_id = ? AND state = 'pending'").get(e))}d(p,"getPendingStructuredRequestForNode");async function R(e){const n=e.now??Date.now();return await l(async t=>(await t.prepareUncached(`INSERT INTO structured_requests (request_id, node_id, mode, submission, dedicated, state, schema_json, deadline_at, created_at, request_message_id)
|
|
2
|
+
VALUES (?, ?, ?, ?, ?, 'pending', ?, ?, ?, ?)`).run(e.requestId,e.nodeId??null,e.mode,e.submission,e.dedicated?1:0,JSON.stringify(e.schema),e.deadlineAt,n,e.requestMessageId??null),await c(t,e.requestId)))}d(R,"admitStructuredRequest");async function I(e,n){return await l(async t=>({changed:Number((await t.prepareUncached("UPDATE structured_requests SET node_id = ? WHERE request_id = ? AND state = 'pending' AND node_id IS NULL").run(n,e)).changes)===1,row:await c(t,e)}))}d(I,"bindStructuredRequest");async function N(e,n,t){const a=t.now??Date.now(),i=t.intended==="completed"?f(t.result):null,u=t.intended==="declined"?t.declined:void 0,S=t.intended==="failed"?t.failureReason??"crashed":t.intended==="expired"?t.failureReason??null:null,q=t.intended==="failed"||t.intended==="expired"?f(t.failureDetail??null):null;return{changed:Number((await e.prepareUncached(`UPDATE structured_requests
|
|
3
3
|
SET state = CASE WHEN deadline_at IS NOT NULL AND ? >= deadline_at THEN 'expired' ELSE ? END,
|
|
4
4
|
result_json = CASE WHEN deadline_at IS NOT NULL AND ? >= deadline_at THEN result_json WHEN ? = 'completed' THEN ? ELSE result_json END,
|
|
5
5
|
declined_reason = CASE WHEN deadline_at IS NOT NULL AND ? >= deadline_at THEN declined_reason WHEN ? = 'declined' THEN ? ELSE declined_reason END,
|
|
@@ -8,8 +8,8 @@ var g=Object.defineProperty;var d=(e,n)=>g(e,"name",{value:n,configurable:!0});i
|
|
|
8
8
|
failure_reason = CASE WHEN deadline_at IS NOT NULL AND ? >= deadline_at THEN failure_reason WHEN ? IN ('failed', 'expired') THEN ? ELSE failure_reason END,
|
|
9
9
|
failure_detail_json = CASE WHEN deadline_at IS NOT NULL AND ? >= deadline_at THEN failure_detail_json WHEN ? IN ('failed', 'expired') THEN ? ELSE failure_detail_json END,
|
|
10
10
|
settled_at = ?
|
|
11
|
-
WHERE request_id = ? AND state = 'pending'`).run(
|
|
11
|
+
WHERE request_id = ? AND state = 'pending'`).run(a,t.intended,a,t.intended,i,a,t.intended,u?.reason??null,a,t.intended,u?.code??null,a,t.intended,u===void 0?null:u.retryable?1:0,a,t.intended,S,a,t.intended,q,a,n)).changes)===1,row:await c(e,n)}}d(N,"settleStructuredRequestIn");async function U(e,n){const t=await l(async a=>await N(a,e,n));return t.changed&&E(t.row),t}d(U,"settleStructuredRequest");async function m(e,n,t){const a=r(await e.prepareUncached("SELECT * FROM structured_requests WHERE node_id = ? AND state = 'pending'").get(n));return a===null?{changed:!1,row:null}:await N(e,a.request_id,t)}d(m,"settlePendingStructuredRequestForNodeIn");async function O(e,n){const t=await l(async a=>await m(a,e,n));return t.changed&&E(t.row),t}d(O,"settlePendingStructuredRequestForNode");async function W(e){return(await(await s()).prepareUncached("SELECT * FROM structured_requests WHERE state = 'pending' AND deadline_at IS NOT NULL AND deadline_at <= ?").all(e)).map(n=>r(n))}d(W,"pendingStructuredRequestsPast");async function x(){return(await(await s()).prepareUncached("SELECT * FROM structured_requests WHERE state != 'pending' AND effects_done_at IS NULL").all()).map(e=>r(e))}d(x,"incompleteStructuredRequestEffects");async function C(e){return e.node_id===null?!1:e.submission==="oneoff"?!0:(await(await s()).prepareUncached(`SELECT request_id FROM structured_requests
|
|
12
12
|
WHERE node_id = ? AND submission = 'terminal' AND state IN ('completed', 'declined')
|
|
13
|
-
ORDER BY settled_at DESC, rowid DESC LIMIT 1`).get(e.node_id)?.request_id===e.request_id}d(
|
|
13
|
+
ORDER BY settled_at DESC, rowid DESC LIMIT 1`).get(e.node_id))?.request_id===e.request_id}d(C,"ownsStructuredRequestResultProjection");async function b(e){return e.node_id===null?!1:(await(await s()).prepareUncached(`SELECT request_id FROM structured_requests
|
|
14
14
|
WHERE node_id = ? AND state = 'declined'
|
|
15
|
-
ORDER BY settled_at DESC, rowid DESC LIMIT 1`).get(e.node_id)?.request_id===e.request_id}d(
|
|
15
|
+
ORDER BY settled_at DESC, rowid DESC LIMIT 1`).get(e.node_id))?.request_id===e.request_id}d(b,"ownsStructuredRequestDeclineProjection");async function j(e,n){await(await s()).prepareUncached("UPDATE structured_requests SET effects_done_at = ?, result_path = COALESCE(?, result_path) WHERE request_id = ? AND state != 'pending'").run(Date.now(),n,e)}d(j,"markStructuredRequestEffectsDone");async function F(e,n,t,a){const i=await p(e);return i!==null?i:await R({requestId:`legacy-${D().replace(/-/g,"")}`,mode:"async",submission:n,dedicated:n==="terminal",schema:t,deadlineAt:null,nodeId:e,requestMessageId:a??null})}d(F,"registerLegacyStructuredRequest");function M(e){return{request_id:e.request_id,node_id:e.node_id,mode:e.mode,submission:e.submission,state:e.state,created_at:new Date(e.created_at).toISOString(),deadline_at:e.deadline_at===null?null:new Date(e.deadline_at).toISOString(),settled_at:e.settled_at===null?null:new Date(e.settled_at).toISOString(),result:e.state==="completed"?e.result:null,declined:e.state==="declined"?e.declined:null,failure:e.state==="failed"&&e.failure_reason!==null?{reason:e.failure_reason,detail:e.failure_detail}:null}}d(M,"toStructuredRequestDTO");export{R as admitStructuredRequest,I as bindStructuredRequest,p as getPendingStructuredRequestForNode,y as getStructuredRequest,x as incompleteStructuredRequestEffects,j as markStructuredRequestEffectsDone,b as ownsStructuredRequestDeclineProjection,C as ownsStructuredRequestResultProjection,W as pendingStructuredRequestsPast,F as registerLegacyStructuredRequest,A as registerStructuredRequestEffectRunner,E as runStructuredRequestEffects,O as settlePendingStructuredRequestForNode,m as settlePendingStructuredRequestForNodeIn,U as settleStructuredRequest,N as settleStructuredRequestIn,M as toStructuredRequestDTO};
|
|
@@ -7,23 +7,23 @@ export interface RosterEdge {
|
|
|
7
7
|
created: string;
|
|
8
8
|
}
|
|
9
9
|
/** Every in-tree node→node watch, oldest first — the roster's topology half. */
|
|
10
|
-
export declare function rosterEdges(): RosterEdge[]
|
|
10
|
+
export declare function rosterEdges(): Promise<RosterEdge[]>;
|
|
11
11
|
/** `subscriber` asks to watch `publisher` (an `ask` watch, in the tree). Re-running sets the
|
|
12
12
|
* pair's tree subscriptions active or passive (`{"3":"next-turn"}`). */
|
|
13
|
-
export declare function subscribe(subscriber: string, publisher: string, active?: boolean): void
|
|
13
|
+
export declare function subscribe(subscriber: string, publisher: string, active?: boolean): Promise<void>;
|
|
14
14
|
/** Drop the pair's tree subscriptions; a reading or message watch on the same pair survives. */
|
|
15
|
-
export declare function unsubscribe(subscriber: string, publisher: string): void
|
|
15
|
+
export declare function unsubscribe(subscriber: string, publisher: string): Promise<void>;
|
|
16
16
|
/** Rewrite the listening configuration of the pair's tree subscriptions: NULL (the watcher's
|
|
17
17
|
* default) for active, `{"3":"next-turn"}` for passive. */
|
|
18
|
-
export declare function setSubscriptionActive(subscriber: string, publisher: string, active: boolean): void
|
|
18
|
+
export declare function setSubscriptionActive(subscriber: string, publisher: string, active: boolean): Promise<void>;
|
|
19
19
|
/** Who watches `publisher` in the tree — the targets a push fans out to. */
|
|
20
|
-
export declare function subscribersOf(publisher: string): SubscriptionRef[]
|
|
20
|
+
export declare function subscribersOf(publisher: string): Promise<SubscriptionRef[]>;
|
|
21
21
|
/** The nodes `subscriber` watches in the tree — its reports. */
|
|
22
|
-
export declare function subscriptionsOf(subscriber: string): SubscriptionRef[]
|
|
22
|
+
export declare function subscriptionsOf(subscriber: string): Promise<SubscriptionRef[]>;
|
|
23
23
|
/** Every node below `root` in the tree, excluding root. */
|
|
24
|
-
export declare function view(root: string): string[]
|
|
24
|
+
export declare function view(root: string): Promise<string[]>;
|
|
25
25
|
/** Stop-guard primitive: does this node hold an active tree subscription to a live node —
|
|
26
26
|
* something that can actually wake it? */
|
|
27
|
-
export declare function hasActiveLiveSubscription(nodeId: string): boolean
|
|
27
|
+
export declare function hasActiveLiveSubscription(nodeId: string): Promise<boolean>;
|
|
28
28
|
/** Whether a live node still actively watches this one in the tree — a report this node owes. */
|
|
29
|
-
export declare function hasLiveSubscriber(nodeId: string): boolean
|
|
29
|
+
export declare function hasLiveSubscriber(nodeId: string): Promise<boolean>;
|
package/dist/core/canvas/tree.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
var
|
|
1
|
+
var N=Object.defineProperty;var s=(o,t)=>N(o,"name",{value:t,configurable:!0});import{openDb as r,withCanvasWrite as d}from"./db.js";import{getById as A,nodeObject as c}from"../graph/objects.js";import{recordWatch as S,unwatch as v,descendants as b,configFromJson as y,configToJson as O}from"../graph/watches.js";import{publish as R}from"../graph/events.js";import{DEFAULT_LISTEN as T}from"../graph/types.js";import{filterAsync as j}from"../async-array.js";const D=["spawn","job-start","ask"],E="('spawn','job-start','ask')",I=[{threshold:3,delivery:"next-turn"}];function h(o){const t=o.find(a=>a.threshold<=7);return t!==void 0&&t.delivery!=="next-turn"}s(h,"wakesAtSeven");async function w(o,t,...a){const n=await o.prepareUncached(`SELECT wo.id AS from_id, oo.id AS to_id, ws.config_json, ws.created_at,
|
|
2
2
|
wo.listen_json, wn.status AS from_status, onode.status AS to_status
|
|
3
3
|
FROM watches w
|
|
4
4
|
JOIN objects wo ON wo.rowid = w.watcher AND wo.type = 'node'
|
|
5
5
|
JOIN objects oo ON oo.rowid = w.object AND oo.type = 'node'
|
|
6
|
-
JOIN watch_subscriptions ws ON ws.watch = w.rowid AND ws.started_by IN ${
|
|
6
|
+
JOIN watch_subscriptions ws ON ws.watch = w.rowid AND ws.started_by IN ${E}
|
|
7
7
|
JOIN nodes wn ON wn.node_id = wo.id
|
|
8
8
|
JOIN nodes onode ON onode.node_id = oo.id
|
|
9
9
|
WHERE w.in_tree = 1 ${t}
|
|
10
|
-
ORDER BY ws.created_at, ws.rowid`).all(...
|
|
11
|
-
WHERE started_by IN ${
|
|
12
|
-
AND watch IN (SELECT rowid FROM watches WHERE watcher = ? AND object = ?)`).run(
|
|
10
|
+
ORDER BY ws.created_at, ws.rowid`).all(...a),i=new Map;for(const e of n){const u=e.config_json,f=e.listen_json,_=u!=null?y(u):f!=null?y(f):T,p=`${e.from_id}\0${e.to_id}`,m=i.get(p);if(m){m.active||=h(_);continue}i.set(p,{from_id:e.from_id,to_id:e.to_id,active:h(_),created:e.created_at,from_status:e.from_status??null,to_status:e.to_status??null})}return[...i.values()]}s(w,"treeEdges");async function C(){return(await w(await r(),"")).map(({from_id:o,to_id:t,active:a,created:n})=>({from_id:o,to_id:t,active:a,created:n}))}s(C,"rosterEdges");async function H(o,t,a=!0){await d(async n=>{const i=await c(n,o),e=await c(n,t);await S(n,i,e,"ask"),await g(o,t,a),await R(n,{event:"watched",object:e,actor:i,attrs:{}})})}s(H,"subscribe");async function M(o,t){await d(async a=>{const n=await c(a,o),i=await c(a,t);for(const e of D)await v(a,n,i,{startedBy:e})})}s(M,"unsubscribe");async function g(o,t,a){await d(async n=>{await n.prepareUncached(`UPDATE watch_subscriptions SET config_json = ?
|
|
11
|
+
WHERE started_by IN ${E}
|
|
12
|
+
AND watch IN (SELECT rowid FROM watches WHERE watcher = ? AND object = ?)`).run(a?null:O(I),(await c(n,o)).rowid,(await c(n,t)).rowid)})}s(g,"setSubscriptionActive");async function U(o){return(await w(await r(),"AND oo.id = ?",o)).map(t=>({node_id:t.from_id,active:t.active,created:t.created}))}s(U,"subscribersOf");async function B(o){return(await w(await r(),"AND wo.id = ?",o)).map(t=>({node_id:t.to_id,active:t.active,created:t.created}))}s(B,"subscriptionsOf");async function P(o){const t=await r(),a=await A(t,o);if(a?.type!=="node")return[];const n=t.prepare("SELECT 1 FROM nodes WHERE node_id = ?");return await j((await b(t,a)).map(i=>i.id),async i=>await n.get(i)!==void 0)}s(P,"view");const l=new Set(["active","idle"]);async function V(o){return(await w(await r(),"AND wo.id = ?",o)).some(t=>t.active&&l.has(t.to_status??""))}s(V,"hasActiveLiveSubscription");async function Q(o){return(await w(await r(),"AND oo.id = ?",o)).some(t=>t.active&&l.has(t.from_status??""))}s(Q,"hasLiveSubscriber");export{V as hasActiveLiveSubscription,Q as hasLiveSubscriber,C as rosterEdges,g as setSubscriptionActive,H as subscribe,U as subscribersOf,B as subscriptionsOf,M as unsubscribe,P as view};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type CanvasDb } from './db.js';
|
|
2
2
|
export interface ControllerWait {
|
|
3
3
|
waitId: string;
|
|
4
4
|
nodeId: string;
|
|
@@ -8,14 +8,14 @@ export interface ControllerWait {
|
|
|
8
8
|
satisfiedAt: number | null;
|
|
9
9
|
}
|
|
10
10
|
/** Replace a node's live controller wait while retaining the prior row as history. */
|
|
11
|
-
export declare function armControllerWait(nodeId: string, controllerId: string, now?: number): ControllerWait
|
|
12
|
-
export declare function readControllerWait(nodeId: string): ControllerWait | null
|
|
11
|
+
export declare function armControllerWait(nodeId: string, controllerId: string, now?: number): Promise<ControllerWait>;
|
|
12
|
+
export declare function readControllerWait(nodeId: string): Promise<ControllerWait | null>;
|
|
13
13
|
/** Clear only the wait that was observed for this sender; a rearm wins a race. */
|
|
14
|
-
export declare function settleMatchingControllerWait(nodeId: string, senderId: string | null, now: number, db?:
|
|
14
|
+
export declare function settleMatchingControllerWait(nodeId: string, senderId: string | null, now: number, db?: CanvasDb): Promise<boolean>;
|
|
15
15
|
/** Clear a matching wait only if its controller is no longer active or idle. */
|
|
16
|
-
export declare function settleDeadControllerWait(nodeId: string, controllerId: string, now: number, db?:
|
|
16
|
+
export declare function settleDeadControllerWait(nodeId: string, controllerId: string, now: number, db?: CanvasDb): Promise<boolean>;
|
|
17
17
|
/** Live rows drive controller-death reconciliation without relying on the retired node columns. */
|
|
18
|
-
export declare function liveControllerWaits(): ControllerWait[]
|
|
18
|
+
export declare function liveControllerWaits(): Promise<ControllerWait[]>;
|
|
19
19
|
/** A node's live wait on a watched object, ended by the event its kind declares `endsWait` (`waits`, kind `object`). */
|
|
20
20
|
export interface ObjectWait {
|
|
21
21
|
waitId: string;
|
|
@@ -24,16 +24,16 @@ export interface ObjectWait {
|
|
|
24
24
|
createdAt: number;
|
|
25
25
|
}
|
|
26
26
|
/** Arm a node's wait on an object, inside the caller's write transaction; an existing live wait on the same object stands. */
|
|
27
|
-
export declare function armObjectWait(db:
|
|
27
|
+
export declare function armObjectWait(db: CanvasDb, nodeId: string, objectId: string, now?: number): Promise<void>;
|
|
28
28
|
/** Settle every live wait on `objectId` (its ending event was published), or only `nodeId`'s (it stopped watching). */
|
|
29
|
-
export declare function settleObjectWaits(db:
|
|
29
|
+
export declare function settleObjectWaits(db: CanvasDb, objectId: string, nodeId?: string | null, now?: number): Promise<number>;
|
|
30
30
|
/** A node that ended waits on nothing: settle all of its live object waits. */
|
|
31
|
-
export declare function settleNodeObjectWaits(db:
|
|
31
|
+
export declare function settleNodeObjectWaits(db: CanvasDb, nodeId: string, now?: number): Promise<number>;
|
|
32
32
|
/** Every node's live object waits with the watched object's kind and name, for the roster. A deleted object
|
|
33
33
|
* settles its waits on publish, so none should dangle; a wait whose object row is gone is skipped rather than shown nameless. */
|
|
34
|
-
export declare function liveObjectWaitsNamed(db?:
|
|
34
|
+
export declare function liveObjectWaitsNamed(db?: CanvasDb): Promise<Array<ObjectWait & {
|
|
35
35
|
objectType: string;
|
|
36
36
|
objectName: string;
|
|
37
|
-
}
|
|
38
|
-
export declare function hasLiveObjectWait(nodeId: string): boolean
|
|
39
|
-
export declare function hasLiveControllerWait(nodeId: string): boolean
|
|
37
|
+
}>>;
|
|
38
|
+
export declare function hasLiveObjectWait(nodeId: string): Promise<boolean>;
|
|
39
|
+
export declare function hasLiveControllerWait(nodeId: string): Promise<boolean>;
|