@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,13 +1,13 @@
|
|
|
1
|
-
var Z=Object.defineProperty;var
|
|
1
|
+
var Z=Object.defineProperty;var i=(e,n)=>Z(e,"name",{value:n,configurable:!0});import{envNodeId as j}from"../../shared/env.js";import{rmdirSync as ee,rmSync as ne,statSync as te}from"node:fs";import{dirname as ae,join as U,resolve as ie}from"node:path";import{removeTreeBeneath as W}from"../spaces/open-beneath.js";import{emitEvent as oe}from"../events/emit.js";import{withCanvasWrite as p,openDb as s}from"./db.js";import{conversationStore as re,ConversationNotFoundError as se}from"../conversation-store/index.js";import{hasUnseenWakeMail as de}from"./deliveries.js";import{isAppRun as b}from"./app-run.js";import{registerOutcomeAction as I}from"./outcome-actions.js";import{publish as le}from"../graph/events.js";import{nodeObject as ue}from"../graph/objects.js";import{findNodeBySessionFileSql as ce}from"./sessions.js";import{hydrateFault as _e}from"./recovery.js";import{hasUnreconciledWorktree as pe,openWorktree as fe,readWorktree as Ee,worktreeFromRow as we}from"./worktrees.js";import{isPidAlive as ye,isPidPresent as F,recordedPidLiveness as me}from"./pid.js";import{ensureHome as Ne,jobDir as Re,nodeDir as Se,nodeRunDir as H}from"./paths.js";import{appForNode as he,ensureNodeDirs as Oe,nodeAgentDir as Te}from"./node-agent-paths.js";import{appSpace as C}from"../layout.js";import{createObject as Le,getById as M,ownerForGrantee as h,setObjectKind as ge,setObjectName as De}from"../graph/objects.js";import{deleteNodeWithOwned as ve}from"../graph/deletion.js";import{filterAsync as y,mapAsync as O}from"../async-array.js";function E(e,n){if(e==null)return null;const t=JSON.stringify(e);if(t===void 0)throw new TypeError(`${n} must be JSON-serializable`);return t}i(E,"jsonValue");async function on(e,n){if((await e.prepare("SELECT deleting_at FROM nodes WHERE node_id = ?").get(n))?.deleting_at)throw new Error("run is deleting")}i(on,"assertRunNotDeleting");async function Ae(e,n){const t=await h(n,e.grantee??"app:terminal");await Le(n,{id:e.node_id,type:"node",kind:e.kind,owner:t.rowid,privacy:"public",name:e.name,preview:""}),await n.prepare(`INSERT INTO nodes (node_id, description, title, icon, cycles, mode, lifecycle, cwd, host_kind, profile_id, parent, spawned_by, creator, fork_from, fork_source_file, created, passive_default, cycle_pending, model_override, persona_ack_json, review_binding_json, launch_config_json, scopes_json, isolated, status, intent, final_report, finalized_at, deadline_at, "window", tmux_session, pane, sub, grant_id, client_id, metadata_json, run_id, event_cursor, usage_json, deleting_at) VALUES (${Array(40).fill("?").join(", ")})`).run(e.node_id,e.description??null,e.title??null,e.icon??null,e.cycles??null,e.mode,e.lifecycle,e.cwd,e.host_kind??null,e.profile_id??null,e.parent??null,e.spawned_by??null,e.creator??null,e.fork_from??null,e.fork_source_file??null,e.created,e.passive_default===!0?1:0,e.cycle_pending===!0?1:0,e.model_override??null,E(e.persona_ack,"persona_ack"),E(e.review_binding,"review_binding"),E(e.launch,"launch"),E(e.scopes,"scopes"),e.isolated===!0?1:0,e.status??"active",e.intent??null,e.final_report??null,e.finalized_at??null,e.deadline_at??null,e.window??null,e.tmux_session??null,e.pane??null,e.sub??null,e.grant_id??null,e.client_id??null,e.metadata_json??null,e.run_id??null,e.event_cursor??null,e.usage_json??null,e.deleting_at??null)}i(Ae,"seedRow");function P(e){if(e.fault_id==null)return null;const n=Object.entries(e).filter(([t])=>t.startsWith("fault_")).map(([t,a])=>[t==="fault_id"?t:t.slice(6),a]);return _e(Object.fromEntries(n))}i(P,"faultFrom");function f(e){const n={node_id:e.node_id,name:e.name,description:e.description??void 0,cycles:e.cycles??void 0,kind:e.kind,mode:e.mode,lifecycle:e.lifecycle,status:e.status,cwd:e.cwd,host_kind:e.host_kind??null,profile_id:e.profile_id??null,scopes:e.scopes_json==null?null:JSON.parse(e.scopes_json),isolated:e.isolated===1,grantee:e.grantee,sub:e.sub??null,grant_id:e.grant_id??null,client_id:e.client_id??null,metadata_json:e.metadata_json??null,run_id:e.run_id??null,event_cursor:e.event_cursor??null,last_activity_at:e.last_activity_at??null,usage_json:e.usage_json??null,last_turn_error_json:e.last_turn_error_json??null,deleting_at:e.deleting_at??null,parent:e.parent??null,created:e.created,intent:e.intent??null,frozen_at:e.frozen_at??null,respawn_failures:e.respawn_failures??0,respawn_not_before:e.respawn_not_before??null,launched_at:e.launched_at??null,last_settled_at:e.last_settled_at??null,terminal_reason:e.terminal_reason??null,final_report:e.final_report??null,finalized_at:e.finalized_at??null,outcome_kind:e.outcome_kind??null,outcome_reason:e.outcome_reason??null,outcome_at:e.outcome_at??null,outcome_revision:e.outcome_revision??0,outcome_detail_json:e.outcome_detail_json??null,deadline_at:e.deadline_at??null,telemetry_tokens_in:e.telemetry_tokens_in??null,telemetry_context_tokens:e.telemetry_context_tokens??null,telemetry_last_activity:e.telemetry_last_activity??null,telemetry_updated_at:e.telemetry_updated_at??null,pi_pid:e.pi_pid??null,pi_pid_identity:e.pi_pid_identity??null,window:e.window??null,tmux_session:e.tmux_session??null,pane:e.pane??null,fault:null,streaming:!1},t=F(n.pi_pid),a=P(e);return n.fault=a?.link==="pi\u2192provider"&&a.retry.by==="daemon"&&a.retry.disposition==="auto"&&!t?null:a,n.streaming=e.turn_open_at!==null&&e.turn_closed_at===null&&t,n}i(f,"rowFrom");async function q(e,n){return n??=await Ee(e.node_id),{...f(e),title:e.title??void 0,icon:e.icon??void 0,spawned_by:e.spawned_by??null,creator:e.creator??null,fork_from:e.fork_from??null,fork_source_file:e.fork_source_file??null,passive_default:e.passive_default===1,cycle_pending:e.cycle_pending===1,model_override:e.model_override??null,scopes:e.scopes_json==null?null:JSON.parse(e.scopes_json),persona_ack:e.persona_ack_json==null?void 0:JSON.parse(e.persona_ack_json),review_binding:e.review_binding_json==null?void 0:JSON.parse(e.review_binding_json),launch:e.launch_config_json==null?void 0:JSON.parse(e.launch_config_json),pi_session_id:e.pi_session_id??null,pi_session_file:e.pi_session_file??null,...n===null?{}:{managed_worktree:n}}}i(q,"metaFrom");async function rn(e,n={}){return Ne(),await p(async t=>{await Ae(e,t),e.managed_worktree!==void 0&&e.managed_worktree!==null&&await fe(e.node_id,e.managed_worktree,t),n.outcomeDelivery!==void 0&&await I(t,e.node_id,n.outcomeDelivery),await n.withinCreate?.(t,e)}),await Oe(e.node_id),await N(e.node_id)}i(rn,"createNode");async function N(e){const n=await(await s()).prepare("SELECT * FROM node_rows WHERE node_id = ?").get(e);return n===void 0?null:await q(n)}i(N,"getNode");const ke=1440*60*1e3;function $(e){return{requestKey:e.request_key,nodeId:e.node_id,state:e.state}}i($,"createRequestRecord");async function sn(e){const n=await(await s()).prepareUncached("SELECT request_key, node_id, state FROM create_requests WHERE request_key = ?").get(e);return n===void 0?null:$(n)}i(sn,"findCreateRequest");async function dn(e){return await p(async n=>{const t=Date.now();await n.prepareUncached("DELETE FROM create_requests WHERE expires_at <= ?").run(t);const a=await n.prepareUncached("SELECT request_key, node_id, state FROM create_requests WHERE request_key = ?").get(e);return a!==void 0?$(a):(await n.prepareUncached("INSERT INTO create_requests (request_key, node_id, expires_at, state) VALUES (?, NULL, ?, 'reserved')").run(e,t+ke),{requestKey:e,nodeId:null,state:"reserved"})})}i(dn,"reserveCreateRequest");async function ln(e=Date.now()){return Number((await(await s()).prepareUncached("DELETE FROM create_requests WHERE expires_at <= ?").run(e)).changes)}i(ln,"pruneExpiredCreateRequests");async function un(e,n){await(await s()).prepareUncached("UPDATE create_requests SET node_id = ?, state = 'complete' WHERE request_key = ?").run(n,e)}i(un,"recordCreateRequestNode");async function cn(e,n){await(await s()).prepareUncached("UPDATE create_requests SET node_id = ?, state = 'reserved' WHERE request_key = ?").run(n,e)}i(cn,"reserveCreateRequestNode");async function _n(e,n){await(await s()).prepareUncached("UPDATE create_requests SET state = 'complete' WHERE request_key = ? AND node_id = ?").run(e,n)}i(_n,"completeCreateRequest");async function pn(e,n){await p(async t=>{if(n===null){await t.prepareUncached("DELETE FROM create_requests WHERE request_key = ? AND node_id IS NULL").run(e);return}await t.prepareUncached("DELETE FROM create_requests WHERE request_key = ? AND node_id = ?").run(e,n)})}i(pn,"abandonCreateRequest");function fn(e){return ie(e)}i(fn,"canonicalSessionFile");async function En(e){const n=await ce(e);return n===null?null:await N(n)}i(En,"findNodeBySessionFile");async function wn(e){const n=await(await s()).prepare("SELECT * FROM node_rows WHERE node_id = ?").get(e);return n?f(n):null}i(wn,"getRow");async function yn(e){const n=await(await s()).prepare("SELECT * FROM node_rows WHERE pane = ?").get(e);return n?f(n):null}i(yn,"getRowByPane");async function mn(e){return(await(await s()).prepare(`SELECT * FROM node_rows
|
|
2
2
|
WHERE deadline_at IS NOT NULL AND outcome_at IS NULL
|
|
3
3
|
AND deadline_at <= ? AND status IN ('active','idle') AND kind != 'human'
|
|
4
|
-
ORDER BY deadline_at, created, node_id`).all(e).map(
|
|
5
|
-
WHERE profile_id = ? AND deadline_at IS NOT NULL AND status IN ('active', 'idle')`).all(e),
|
|
6
|
-
WHERE o.type = 'node' AND i.scheme = 'local-user' AND i.external_id = 'user:local'`,
|
|
4
|
+
ORDER BY deadline_at, created, node_id`).all(e)).map(f)}i(mn,"dueNodeDeadlines");async function Nn(e,n){return Number((await(await s()).prepare("UPDATE nodes SET deadline_at = ? WHERE node_id = ?").run(n,e)).changes)===1}i(Nn,"setNodeDeadline");async function Rn(e,n){return!Number.isFinite(n)||n<=0?0:await p(async t=>{const a=await t.prepare(`SELECT node_id, deadline_at FROM nodes
|
|
5
|
+
WHERE profile_id = ? AND deadline_at IS NOT NULL AND status IN ('active', 'idle')`).all(e),o=t.prepare("UPDATE nodes SET deadline_at = ? WHERE node_id = ? AND deadline_at = ?");let r=0;for(const d of a){const u=Date.parse(d.deadline_at);Number.isNaN(u)||(r+=Number((await o.run(new Date(u+n).toISOString(),d.node_id,d.deadline_at)).changes))}return r})}i(Rn,"shiftProfileNodeDeadlines");async function Sn(e,n,t){const a=`SELECT o.rowid FROM objects o JOIN identities i ON i.object = o.owner JOIN nodes n ON n.node_id = o.id
|
|
6
|
+
WHERE o.type = 'node' AND i.scheme = 'local-user' AND i.external_id = 'user:local'`,r=await e.prepareUncached(`${a} LIMIT 1`).get()!==void 0?Number((await e.prepareUncached(`UPDATE objects SET owner = ? WHERE rowid IN (${a})`).run((await h(e,"app:terminal")).rowid)).changes):0,d=`SELECT o.rowid FROM objects o JOIN peer_stubs s ON s.object = o.rowid JOIN identities i ON i.object = o.owner
|
|
7
7
|
WHERE o.type = 'node' AND o.reception = 2 AND json_extract(s.envelope_json, '$.app') IS NULL
|
|
8
|
-
AND i.scheme = 'app' AND i.external_id = 'app:terminal'`,
|
|
8
|
+
AND i.scheme = 'app' AND i.external_id = 'app:terminal'`,u=await e.prepareUncached(`${d} LIMIT 1`).get()!==void 0?Number((await e.prepareUncached(`UPDATE objects SET owner = ? WHERE rowid IN (${d})`).run((await h(e,"user:local")).rowid)).changes):0;return Number((await e.prepare("UPDATE nodes SET sub = ? WHERE sub = 'user:local'").run(n)).changes)+r+u+Number((await e.prepare(`UPDATE nodes SET sub = ? WHERE sub IS NULL AND node_id IN (
|
|
9
9
|
SELECT o.id FROM objects o JOIN identities i ON i.object = o.owner
|
|
10
|
-
WHERE o.type = 'node' AND i.scheme = 'app' AND i.external_id = 'app:terminal')`).run(n).changes)+Number(
|
|
10
|
+
WHERE o.type = 'node' AND i.scheme = 'app' AND i.external_id = 'app:terminal')`).run(n)).changes)+Number((await e.prepare("UPDATE nodes SET grant_id = NULL WHERE grant_id = ?").run(t)).changes)}i(Sn,"rewriteLocalNodeIdentity");function T(e,n){if(e==null)return null;if(typeof e=="string"||typeof e=="number"||typeof e=="bigint"||e instanceof Uint8Array)return e;throw new TypeError(`${n} must be a SQLite scalar`)}i(T,"sqlInput");async function hn(e,n){const t=[],a=i((r,d=r)=>{Object.prototype.hasOwnProperty.call(n,r)&&t.push([d,T(n[r],r)])},"add");if(a("description"),a("title"),a("icon"),a("cycles"),a("mode"),a("lifecycle"),a("cwd"),a("host_kind"),a("profile_id"),a("parent"),a("spawned_by"),a("creator"),a("fork_from"),a("fork_source_file"),a("model_override"),Object.prototype.hasOwnProperty.call(n,"passive_default")&&t.push(["passive_default",n.passive_default===!0?1:0]),Object.prototype.hasOwnProperty.call(n,"cycle_pending")&&t.push(["cycle_pending",n.cycle_pending===!0?1:0]),Object.prototype.hasOwnProperty.call(n,"persona_ack")&&t.push(["persona_ack_json",E(n.persona_ack,"persona_ack")]),Object.prototype.hasOwnProperty.call(n,"review_binding")&&t.push(["review_binding_json",E(n.review_binding,"review_binding")]),Object.prototype.hasOwnProperty.call(n,"isolated"))throw new TypeError("isolated cannot change after node creation");Object.prototype.hasOwnProperty.call(n,"scopes")&&t.push(["scopes_json",E(n.scopes,"scopes")]),Object.prototype.hasOwnProperty.call(n,"launch")&&t.push(["launch_config_json",E(n.launch,"launch")]);const o=i(r=>Object.prototype.hasOwnProperty.call(n,r),"has");return await p(async r=>{const d=await M(r,e);if(d===null||d.type!=="node")throw new Error(`unknown node: ${e}`);if(o("name")&&await De(r,d,T(n.name,"name")),o("kind")&&await ge(r,d,T(n.kind,"kind")),t.length===0)return;if((await r.prepareUncached(`UPDATE nodes SET ${t.map(([l])=>`${l} = ?`).join(", ")} WHERE node_id = ?`).run(...t.map(([,l])=>l),e)).changes!==1)throw new Error(`unknown node: ${e}`)}),await N(e)}i(hn,"updateNode");async function On(e,n){await(await s()).prepare("UPDATE nodes SET status = ? WHERE node_id = ?").run(n,e)}i(On,"setStatus");async function Tn(e,n){await(await s()).prepare("UPDATE nodes SET intent = ? WHERE node_id = ?").run(n??null,e)}i(Tn,"setIntent");async function Ln(e,n,t={}){if(t.outcome===void 0){const o=[],r=[];Object.prototype.hasOwnProperty.call(n,"status")&&(o.push("status = ?"),r.push(n.status??null)),Object.prototype.hasOwnProperty.call(n,"intent")&&(o.push("intent = ?"),r.push(n.intent??null)),Object.prototype.hasOwnProperty.call(n,"terminal_reason")&&(o.push("terminal_reason = ?"),r.push(n.terminal_reason??null));const d=["node_id = ?"];r.push(e),t.fromStatuses!==void 0&&(d.push(`status IN (${t.fromStatuses.map(()=>"?").join(", ")})`),r.push(...t.fromStatuses)),t.requireNoFinalReport===!0&&d.push("final_report IS NULL");const u=await(await s()).prepareUncached(`UPDATE nodes SET ${o.join(", ")} WHERE ${d.join(" AND ")}`).run(...r);return Number(u.changes)}const a=t.outcome;return await p(async o=>{const r=[],d=[];Object.prototype.hasOwnProperty.call(n,"status")&&(r.push("status = ?"),d.push(n.status??null)),Object.prototype.hasOwnProperty.call(n,"intent")&&(r.push("intent = ?"),d.push(n.intent??null)),Object.prototype.hasOwnProperty.call(n,"terminal_reason")&&(r.push("terminal_reason = ?"),d.push(n.terminal_reason??null));const u=i((m,c)=>a.supersede===!0?"?":`CASE WHEN outcome_at IS NULL THEN ? ELSE ${c} END`,"outcomeValue");r.push(`outcome_kind = ${u(a.kind,"outcome_kind")}`,`outcome_reason = ${u(a.reason,"outcome_reason")}`,`outcome_detail_json = ${u(a.detailJson,"outcome_detail_json")}`,`outcome_revision = ${a.supersede===!0?"outcome_revision + 1":"CASE WHEN outcome_at IS NULL THEN outcome_revision + 1 ELSE outcome_revision END"}`,`outcome_at = ${u(a.at,"outcome_at")}`),d.push(a.kind,a.reason,a.detailJson,a.at);const l=["node_id = ?"];d.push(e),t.fromStatuses!==void 0&&(l.push(`status IN (${t.fromStatuses.map(()=>"?").join(", ")})`),d.push(...t.fromStatuses)),t.requireNoFinalReport===!0&&l.push("final_report IS NULL");const _=await o.prepareUncached(`UPDATE nodes SET ${r.join(", ")} WHERE ${l.join(" AND ")}`).run(...d);if(Number(_.changes)===0)return 0;const S=await o.prepare("SELECT outcome_at FROM nodes WHERE node_id = ?").get(e);return(a.supersede===!0||S.outcome_at===a.at)&&a.documentJson!==null&&a.documentJson!==void 0&&await le(o,{event:"outcome",object:await ue(o,e),actor:null,attrs:{revision:Number((await o.prepare("SELECT outcome_revision FROM nodes WHERE node_id = ?").get(e)).outcome_revision)},messageBody:JSON.parse(a.documentJson)}),Number(_.changes)})}i(Ln,"transitionStatusIntent");async function gn(e){return(await(await s()).prepare("SELECT final_report FROM nodes WHERE node_id = ?").get(e))?.final_report??null}i(gn,"getFinalReport");async function Dn(e,n){return(await(await s()).prepare("UPDATE nodes SET final_report = NULL, finalized_at = NULL WHERE node_id = ? AND final_report = ?").run(e,n)).changes>0}i(Dn,"clearFinalReportIfMatches");async function vn(e,n){await(await s()).prepare('UPDATE nodes SET tmux_session = ?, "window" = ?, pane = ? WHERE node_id = ?').run(n.tmux_session??null,n.window??null,n.pane??null,e)}i(vn,"setPresence");async function An(e,n){await(await s()).prepare("UPDATE nodes SET launched_at = ?, frozen_at = NULL, respawn_not_before = NULL WHERE node_id = ?").run(n,e)}i(An,"recordLaunch");async function kn(e,n){await(await s()).prepare("UPDATE nodes SET last_settled_at = ? WHERE node_id = ?").run(n,e)}i(kn,"recordSettledTurn");async function xn(e,n){await(await s()).prepare("UPDATE nodes SET frozen_at = ? WHERE node_id = ?").run(n,e)}i(xn,"setFrozen");async function jn(e){await(await s()).prepare("UPDATE nodes SET frozen_at = NULL WHERE node_id = ?").run(e)}i(jn,"clearFrozen");async function Un(e,n){await(await s()).prepare("UPDATE nodes SET respawn_failures = ?, respawn_not_before = ? WHERE node_id = ?").run(n.failures,n.notBefore,e)}i(Un,"recordRespawnAttempt");const w="node_id NOT IN (SELECT node_id FROM warm_pool)",z=["state","cleanup_state","path","branch","repo_root","base_ref","base_sha","created_at","closed_at","next_attempt_at","attempts","quarantined","sweep_reason","sweep_detail","sweep_last_at","sweep_observed_json","abandoned_json","land_intent_json","disposal_json"];function xe(e){return e.worktree_state===null?null:we(Object.fromEntries(z.map(n=>[n,e[`worktree_${n}`]])))}i(xe,"worktreeFromProjection");async function Wn(e){const n=z.map(a=>`w.${a} AS worktree_${a}`).join(", "),t=await(await s()).prepareUncached(`SELECT n.*, ${n} FROM node_rows n LEFT JOIN worktrees w ON w.node_id = n.node_id WHERE n.profile_id = ? ORDER BY n.created`).all(e);return await O(t,async a=>await q(a,xe(a)))}i(Wn,"listNodesByProfile");async function bn(){return(await(await s()).prepare(`SELECT
|
|
11
11
|
node_id, name, description, kind, mode, lifecycle, status, cwd, profile_id,
|
|
12
12
|
grantee, parent, created, frozen_at, terminal_reason, final_report,
|
|
13
13
|
telemetry_tokens_in, telemetry_updated_at, pi_pid, turn_open_at, turn_closed_at,
|
|
@@ -15,13 +15,13 @@ var Z=Object.defineProperty;var r=(e,n)=>Z(e,"name",{value:n,configurable:!0});i
|
|
|
15
15
|
fault_operation_id, fault_anchor_entry_id, fault_retry_disposition,
|
|
16
16
|
fault_retry_by, fault_retry_attempt, fault_retry_max, fault_retry_next_at,
|
|
17
17
|
fault_provider_error_json
|
|
18
|
-
FROM node_rows WHERE ${
|
|
18
|
+
FROM node_rows WHERE ${w} ORDER BY created`).all()).map(f)}i(bn,"browseNodes");async function In(e,n){await(await s()).prepare(`UPDATE nodes
|
|
19
19
|
SET telemetry_tokens_in = ?,
|
|
20
20
|
telemetry_context_tokens = COALESCE(?, telemetry_context_tokens),
|
|
21
21
|
telemetry_last_activity = COALESCE(?, telemetry_last_activity),
|
|
22
22
|
telemetry_updated_at = ?
|
|
23
23
|
WHERE node_id = ?
|
|
24
|
-
AND (telemetry_updated_at IS NULL OR telemetry_updated_at < ?)`).run(n.tokensIn,n.contextTokens,n.lastActivity,n.updatedAt,e,n.updatedAt)}
|
|
24
|
+
AND (telemetry_updated_at IS NULL OR telemetry_updated_at < ?)`).run(n.tokensIn,n.contextTokens,n.lastActivity,n.updatedAt,e,n.updatedAt)}i(In,"updateNodeTelemetry");async function Fn(){return(await(await s()).prepare(`SELECT
|
|
25
25
|
node_id, name, description, cycles, kind, status, frozen_at,
|
|
26
26
|
telemetry_context_tokens, telemetry_last_activity,
|
|
27
27
|
pi_pid, turn_open_at, turn_closed_at,
|
|
@@ -29,14 +29,14 @@ var Z=Object.defineProperty;var r=(e,n)=>Z(e,"name",{value:n,configurable:!0});i
|
|
|
29
29
|
fault_operation_id, fault_anchor_entry_id, fault_retry_disposition,
|
|
30
30
|
fault_retry_by, fault_retry_attempt, fault_retry_max, fault_retry_next_at,
|
|
31
31
|
fault_provider_error_json
|
|
32
|
-
FROM node_rows WHERE ${
|
|
32
|
+
FROM node_rows WHERE ${w} ORDER BY created`).all()).map(n=>{const t=n.pi_pid??null,a=F(t),o=P(n);return{node_id:n.node_id,name:n.name,description:n.description??null,cycles:n.cycles??null,kind:n.kind,status:n.status,frozen_at:n.frozen_at??null,pi_pid:t,telemetry_context_tokens:n.telemetry_context_tokens??null,telemetry_last_activity:n.telemetry_last_activity??null,fault:o?.link==="pi\u2192provider"&&o.retry.by==="daemon"&&o.retry.disposition==="auto"&&!a?null:o,streaming:n.turn_open_at!==null&&n.turn_closed_at===null&&a}})}i(Fn,"graphNodes");async function je(e){const n=[w],t=[];if(e?.status!==void 0){const o=Array.isArray(e.status)?e.status:[e.status];n.push(`status IN (${o.map(()=>"?").join(",")})`),t.push(...o)}return e?.withRecordedPid===!0&&n.push("pi_pid IS NOT NULL"),e?.withRecordedPidOrFrozen===!0&&n.push("(pi_pid IS NOT NULL OR frozen_at IS NOT NULL)"),(await(await s()).prepareUncached(`SELECT * FROM node_rows WHERE ${n.join(" AND ")} ORDER BY created`).all(...t)).map(f)}i(je,"listNodes");const Ue=`SELECT
|
|
33
33
|
node_id, created, launched_at, last_settled_at, finalized_at,
|
|
34
34
|
outcome_at, last_activity_at, pane, "window", tmux_session
|
|
35
35
|
FROM nodes INDEXED BY idx_nodes_terminal_placement_created
|
|
36
|
-
WHERE ${
|
|
36
|
+
WHERE ${w}
|
|
37
37
|
AND status IN ('done', 'canceled', 'dead')
|
|
38
38
|
AND (pane IS NOT NULL OR "window" IS NOT NULL OR tmux_session IS NOT NULL)
|
|
39
|
-
ORDER BY created`;function
|
|
39
|
+
ORDER BY created`;async function Hn(){return await(await s()).prepare(Ue).all()}i(Hn,"listTerminalPlacementResidue");const We=`WITH candidates AS MATERIALIZED (
|
|
40
40
|
SELECT node_id FROM nodes WHERE status IN ('active', 'idle')
|
|
41
41
|
UNION
|
|
42
42
|
SELECT node_id FROM nodes INDEXED BY idx_nodes_supervision_frozen
|
|
@@ -50,16 +50,16 @@ var Z=Object.defineProperty;var r=(e,n)=>Z(e,"name",{value:n,configurable:!0});i
|
|
|
50
50
|
AND v.node_id NOT IN (SELECT node_id FROM warm_pool)
|
|
51
51
|
AND v.kind != 'human'
|
|
52
52
|
AND (v.status IN ('active', 'idle') OR (v.status IN ('done', 'canceled', 'dead') AND (v.pi_pid IS NOT NULL OR v.frozen_at IS NOT NULL)))
|
|
53
|
-
ORDER BY v.created`;function
|
|
53
|
+
ORDER BY v.created`;async function Cn(){return(await(await s()).prepare(We).all()).map(f)}i(Cn,"listNodesForSupervision");async function Mn(){return await(await s()).prepare(`SELECT node_id, name, created, grantee FROM node_rows WHERE ${w} ORDER BY created`).all()}i(Mn,"listNodeIdentities");async function Pn(e,n){await(await s()).prepare("INSERT OR REPLACE INTO warm_pool (node_id, recipe_key, created) VALUES (?, ?, ?)").run(e,n,new Date().toISOString())}i(Pn,"registerWarmSpare");async function qn(e){return(await(await s()).prepare("DELETE FROM warm_pool WHERE node_id = ?").run(e)).changes>0}i(qn,"unregisterWarmSpare");async function L(e,n){const t=`SELECT w.node_id AS node_id, w.recipe_key AS recipe_key, w.created AS created,
|
|
54
54
|
n.status AS status, n.pi_pid AS pi_pid, n.pi_pid_identity AS pi_pid_identity
|
|
55
|
-
FROM warm_pool w JOIN node_rows n ON n.node_id = w.node_id`+(n===void 0?"":" WHERE w.recipe_key = ?")+" ORDER BY w.created";return(n===void 0?e.
|
|
56
|
-
FROM node_rows WHERE ${
|
|
55
|
+
FROM warm_pool w JOIN node_rows n ON n.node_id = w.node_id`+(n===void 0?"":" WHERE w.recipe_key = ?")+" ORDER BY w.created";return(n===void 0?await e.prepareUncached(t).all():await e.prepareUncached(t).all(n)).map(o=>({node_id:o.node_id,recipe_key:o.recipe_key,created:o.created,status:o.status,pi_pid:o.pi_pid??null,pi_pid_identity:o.pi_pid_identity??null}))}i(L,"warmSpareRowsFor");async function $n(){return await L(await s())}i($n,"listWarmSpares");async function zn(e){return await(await s()).prepare("SELECT 1 FROM warm_pool WHERE node_id = ?").get(e)!==void 0}i(zn,"isWarmSpare");function B(e){return e.status!=="active"&&e.status!=="idle"?!1:me(e.pi_pid,e.pi_pid_identity)==="alive"}i(B,"spareIsClaimable");async function Bn(e,n,t={}){return await p(async a=>{const o=(await L(a,e)).find(B);return o===void 0||t.requestKey!==void 0&&(await a.prepareUncached("UPDATE create_requests SET node_id = ?, state = 'warm_claimed' WHERE request_key = ? AND node_id IS NULL").run(o.node_id,t.requestKey)).changes===0||(await a.prepare("DELETE FROM warm_pool WHERE node_id = ?").run(o.node_id)).changes===0?null:(await a.prepare("UPDATE nodes SET created = ?, deadline_at = ? WHERE node_id = ?").run(n,t.deadlineAt??null,o.node_id),t.outcomeDelivery!==void 0&&await I(a,o.node_id,t.outcomeDelivery),o.node_id)})}i(Bn,"claimWarmSpare");async function Jn(e){return(await L(await s(),e)).filter(B).length}i(Jn,"warmSpareCount");async function Yn(e){return(await(await s()).prepare("SELECT node_id FROM nodes WHERE parent = ? ORDER BY created").all(e)).map(n=>n.node_id)}i(Yn,"childrenOf");async function Vn(){return(await(await s()).prepareUncached(`SELECT node_id, name, kind, mode, lifecycle, status, cwd, host_kind, parent, created
|
|
56
|
+
FROM node_rows WHERE ${w} ORDER BY created`).all()).map(e=>({node_id:e.node_id,name:e.name,kind:e.kind,mode:e.mode,lifecycle:e.lifecycle,status:e.status,cwd:e.cwd,host_kind:e.host_kind??null,parent:e.parent??null,created:e.created}))}i(Vn,"rosterNodes");async function Xn(e){return(await(await s()).prepareUncached(`SELECT * FROM node_rows
|
|
57
57
|
WHERE parent IS NULL AND kind != 'human'
|
|
58
58
|
AND status IN ('active','idle') AND cwd = ?
|
|
59
|
-
AND ${
|
|
60
|
-
ORDER BY created DESC`).all(e).map(
|
|
61
|
-
AND NOT EXISTS (SELECT 1 FROM sessions s WHERE s.node_id = n.node_id) LIMIT 1`);for(const
|
|
59
|
+
AND ${w}
|
|
60
|
+
ORDER BY created DESC`).all(e)).map(f)}i(Xn,"listResumableRoots");export*from"./tree.js";async function Gn(e,n,t){return await p(async a=>{const o=await a.prepare("SELECT status, final_report, frozen_at FROM nodes WHERE node_id = ?").get(e);return o===void 0?{kind:"missing"}:n(o)?{kind:"terminal",status:o.status,final_report:o.final_report}:{kind:"ran",result:await t()}})}i(Gn,"withFreshTerminalGuard");async function R(e){return await pe(e)}i(R,"hasUnreconciledManagedWorktree");async function J(e,n={}){return!["done","dead","canceled"].includes(e.status)||e.pi_pid!==null||e.frozen_at!==null||await R(e.node_id)||e.node_id===j()||b(e)?!1:n.pastTtl===!0||!["crashed","stranded",null].includes(e.terminal_reason??null)}i(J,"isCollectible");async function g(e){if(e.length===0)return[];const n=e.map(()=>"?").join(",");return(await(await s()).prepareUncached(`SELECT DISTINCT session_id FROM sessions WHERE node_id IN (${n}) AND session_id IS NOT NULL`).all(...e)).map(({session_id:a})=>a)}i(g,"nodeConversationIds");async function D(e){const n=await s(),t=n.prepare("SELECT 1 FROM sessions WHERE session_id = ? LIMIT 1"),a=n.prepare(`SELECT 1 FROM nodes n WHERE n.fork_source_file LIKE '%\\_' || ? || '.jsonl' ESCAPE '\\'
|
|
61
|
+
AND NOT EXISTS (SELECT 1 FROM sessions s WHERE s.node_id = n.node_id) LIMIT 1`);for(const o of e)if(!(await t.get(o)!==void 0||await a.get(o)!==void 0))try{await re().delete(o)}catch(r){if(!(r instanceof se))throw r}}i(D,"deleteNodeConversations");async function v(e,n){const t=await M(e,n);return t===null||t.deleted_at!==null?!1:(await ve(e,t),!0)}i(v,"deleteNodeObject");async function A(e){return{nodeId:e,app:await N(e)===null?null:await he(e)}}i(A,"nodeFiles");async function Y({nodeId:e,app:n}){n!==null&&W(C(n).nodes,await Te(e,n)),W(ae(H(e)),H(e))}i(Y,"removeNodeAppTrees");function V({nodeId:e}){return[Se(e)]}i(V,"nodeOwnedDirs");function X({nodeId:e,app:n}){if(n!==null)try{ee(U(C(n).conversations,e))}catch(t){if(!["ENOENT","ENOTEMPTY"].includes(t.code??""))throw t}}i(X,"removeNodeConversationDir");async function k(e){await Y(e);for(const n of V(e))ne(n,{recursive:!0,force:!0});X(e)}i(k,"removeNodeFiles");async function Qn(e){if(await R(e))return{deleted:!1};const n=await A(e),t=await g([e]),a=await p(async o=>(await v(o,e),{deleted:!0}));return await D(t),await k(n),a}i(Qn,"deleteNode");async function Kn(e){const n=[...new Set(e)];if(n.length===0)return[];const t=await y(n,R);if(t.length>0)throw new Error(`refusing to delete nodes with unreconciled managed worktrees: ${t.join(", ")}`);const a=await O(n,A),o=await g(n),r=n.map(()=>"?").join(","),d=(await(await s()).prepareUncached(`SELECT node_id FROM nodes WHERE node_id IN (${r}) ORDER BY created`).all(...n)).map(({node_id:l})=>l),u=await y(d,async l=>await p(async _=>await v(_,l)));await D(o);for(const l of u){const _=a[n.indexOf(l)];await x(_,async()=>await k(_))}return u}i(Kn,"deleteNodes");async function Zn(e){const n=e.dryRun??!1,t=e.includeStale??!1,a=Date.now()-e.ttlDays*864e5,o=new Date(a).toISOString(),r=j()??"",d=await s(),u=i(c=>K(c)<a,"quiet"),l=i(c=>({node_id:c.node_id,status:c.status,created:c.created}),"toPruned"),_=(await y((await d.prepare(`SELECT * FROM node_rows
|
|
62
62
|
WHERE status IN ('dead', 'done', 'canceled') AND created < ?
|
|
63
|
-
ORDER BY created`).all(
|
|
63
|
+
ORDER BY created`).all(o)).map(f),async c=>await J(c,{pastTtl:!0})&&u(c)&&!await e.held(c.node_id))).map(l),S=t?(await y((await d.prepare(`SELECT * FROM node_rows
|
|
64
64
|
WHERE status IN ('active', 'idle') AND created < ?
|
|
65
|
-
ORDER BY created`).all(
|
|
65
|
+
ORDER BY created`).all(o)).map(f),async c=>c.node_id!==r&&!ye(c.pi_pid??null)&&(c.frozen_at??null)===null&&(c.respawn_not_before??null)===null&&c.intent!=="idle-release"&&!b(c)&&!await de(c.node_id)&&!await R(c.node_id)&&u(c)&&!await e.held(c.node_id))).map(l):[],m=await G([..._,...S]);return n||m.length===0?{pruned:m,dryRun:n}:(await Q(m,e.removeDirs),{pruned:m,dryRun:n})}i(Zn,"pruneNodes");async function G(e){const t=(await s()).prepare("SELECT node_id FROM nodes WHERE run_id = ? AND node_id != ?"),a=new Set(e.map(o=>o.node_id));return await y(e,async o=>(await t.all(o.node_id,o.node_id)).every(r=>a.has(r.node_id)))}i(G,"retainRunRootsWithMembers");async function Q(e,n){if(e.length===0)return;const t=await O(e,async o=>await A(o.node_id)),a=await g(e.map(o=>o.node_id));for(const o of e)await p(async r=>await v(r,o.node_id));if(await D(a),n!==void 0){for(const o of t)await x(o,async()=>{await Y(o),X(o)});n(t.flatMap(V));return}for(const o of t)await x(o,async()=>await k(o))}i(Q,"deletePrunedNodes");async function x(e,n){try{n()}catch(t){oe({level:"error",event:"canvas.node_files.remove_failed",error:t,fields:{node_id:e.nodeId}})}}i(x,"eachNodeBestEffort");function K(e){let n=0;for(const t of[e.created,e.launched_at,e.last_settled_at,e.finalized_at,e.outcome_at,e.last_activity_at]){if(t==null)continue;const a=Date.parse(t);Number.isFinite(a)&&a>n&&(n=a)}try{const t=te(U(Re(e.node_id),"telemetry.json"),{throwIfNoEntry:!1});t!==void 0&&t.mtimeMs>n&&(n=t.mtimeMs)}catch{}return n}i(K,"lastActivityMs");async function et(e){const n=e.dryRun??!1,t=await je(),a=await y(t,async l=>await J(l)&&!await e.held(l.node_id)),o=t.length-a.length,r=Math.max(0,e.maxNodes-o),d=a.map(l=>({row:l,recency:K(l)})).sort((l,_)=>_.recency-l.recency).slice(r).map(({row:l})=>({node_id:l.node_id,status:l.status,created:l.created})),u=await G(d);return n||u.length===0?{pruned:u,dryRun:n}:(await Q(u),{pruned:u,dryRun:n})}i(et,"pruneToLimit");export{pn as abandonCreateRequest,on as assertRunNotDeleting,bn as browseNodes,fn as canonicalSessionFile,Yn as childrenOf,Bn as claimWarmSpare,Dn as clearFinalReportIfMatches,jn as clearFrozen,_n as completeCreateRequest,rn as createNode,Qn as deleteNode,Kn as deleteNodes,mn as dueNodeDeadlines,sn as findCreateRequest,En as findNodeBySessionFile,gn as getFinalReport,N as getNode,wn as getRow,yn as getRowByPane,Fn as graphNodes,J as isCollectible,zn as isWarmSpare,K as lastActivityMs,Mn as listNodeIdentities,je as listNodes,Wn as listNodesByProfile,Cn as listNodesForSupervision,Xn as listResumableRoots,Hn as listTerminalPlacementResidue,$n as listWarmSpares,A as nodeFiles,We as nodesForSupervisionSql,ln as pruneExpiredCreateRequests,Zn as pruneNodes,et as pruneToLimit,un as recordCreateRequestNode,An as recordLaunch,Un as recordRespawnAttempt,kn as recordSettledTurn,Pn as registerWarmSpare,k as removeNodeFiles,dn as reserveCreateRequest,cn as reserveCreateRequestNode,Sn as rewriteLocalNodeIdentity,Vn as rosterNodes,xn as setFrozen,Tn as setIntent,Nn as setNodeDeadline,vn as setPresence,On as setStatus,Rn as shiftProfileNodeDeadlines,Ue as terminalPlacementResidueSql,Ln as transitionStatusIntent,qn as unregisterWarmSpare,hn as updateNode,In as updateNodeTelemetry,Jn as warmSpareCount,Gn as withFreshTerminalGuard};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var F=Object.defineProperty;var s=(t,e)=>F(t,"name",{value:e,configurable:!0});import{readFile as M,writeFile as R}from"node:fs/promises";import{setImmediate as B}from"node:timers/promises";import{join as p,relative as
|
|
1
|
+
var F=Object.defineProperty;var s=(t,e)=>F(t,"name",{value:e,configurable:!0});import{readFile as M,writeFile as R}from"node:fs/promises";import{setImmediate as B}from"node:timers/promises";import{join as p,relative as S}from"node:path";import{appSpace as v}from"../layout.js";import{readdirBeneath as d,removeTreeBeneath as $,statBeneath as T,writeFileBeneath as E}from"../spaces/open-beneath.js";import{appForNode as I,contextDir as C}from"./node-agent-paths.js";import{jobDir as N}from"./paths.js";const x=10*1024*1024,A=new Set(["node_modules",".pnpm-store",".git",".venv","venv","__pycache__","dist","build","target",".next",".turbo"]),L=[".heapsnapshot",".heapprofile",".cpuprofile"],g="REMOVED.md",D="context-stripped.json";async function Y(t){try{const e=JSON.parse(await M(p(N(t),D),"utf8")),n=typeof e.stripped_at=="string"?Date.parse(e.stripped_at):Number.NaN;return Number.isFinite(n)?n:null}catch{return null}}s(Y,"lastContextStripMs");function P(t,e){const n=t.toLowerCase();return n.endsWith(".md")?null:L.some(r=>n.endsWith(r))?"heap or CPU profile":n.endsWith(".har")||n==="har.json"?"browser network capture (HAR)":e>x?`file larger than ${x/(1024*1024)} MB`:null}s(P,"fileReason");function O(t,e,n){const r=(e.bytes/1048576).toFixed(1);return`# Removed by crouter retention
|
|
2
2
|
|
|
3
3
|
\`${e.path}\` (${r} MB, ${e.reason}) was deleted from node ${t}'s context folder on ${n.toISOString()}, after the node had been finished for at least a day. The original content is gone; recreate it if you need it.
|
|
4
|
-
`}s(O,"tombstoneText");function j(t,e){let n=0;const r=[e];for(;r.length>0;){const a=r.pop();for(const o of d(t,a)){const c=p(a,o.name);o.isDirectory()?r.push(c):o.isFile()&&(n+=
|
|
4
|
+
`}s(O,"tombstoneText");function j(t,e){let n=0;const r=[e];for(;r.length>0;){const a=r.pop();for(const o of d(t,a)){const c=p(a,o.name);o.isDirectory()?r.push(c):o.isFile()&&(n+=T(t,c).size)}}return n}s(j,"treeBytes");function k(t,e){const n=d(t,e);return n.length===1&&n[0].name===g}s(k,"isTombstonedDir");async function q(t,e=new Date){const n=await I(t),r=v(n).nodes,a=await C(t,n),o=[],c=s(async u=>{let f;try{f=d(r,u)}catch{return}for(const m of f){const l=m.name,i=p(u,l);try{if(m.isDirectory()){if(!A.has(l)){await B(),await c(i);continue}if(k(r,i))continue;const w={path:S(a,i),bytes:j(r,i),reason:`${l} directory`};$(r,i),E(r,p(i,g),O(t,w,e)),o.push(w);continue}if(!m.isFile())continue;const h=T(r,i).size,_=P(l,h);if(_===null||h<1024)continue;const b={path:S(a,i),bytes:h,reason:_};E(r,i,O(t,b,e)),o.push(b)}catch{}}},"walk");await c(a);const y=o.reduce((u,f)=>u+f.bytes,0);try{await R(p(N(t),D),`${JSON.stringify({stripped_at:e.toISOString(),bytes:y,removed:o},null,2)}
|
|
5
5
|
`)}catch{}return{removed:o,bytes:y}}s(q,"stripContextDir");export{x as CONTEXT_STRIP_FILE_LIMIT_BYTES,g as CONTEXT_TOMBSTONE_NAME,Y as lastContextStripMs,q as stripContextDir};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type CanvasDb } from './db.js';
|
|
2
2
|
export type CronScope = 'profile' | 'global';
|
|
3
3
|
export type CronOverlap = 'skip' | 'queue' | 'replace';
|
|
4
4
|
export type CronOnOutput = 'silent' | 'on-failure' | 'always' | 'on-change';
|
|
@@ -155,12 +155,12 @@ export declare function verifyLeasedCronRun(c: Cron): boolean;
|
|
|
155
155
|
* rows are displaced — a standing declarative cron on the same anchor is
|
|
156
156
|
* untouched. Any displaced in-flight run's process group is killed first (the
|
|
157
157
|
* cancelCron discipline). */
|
|
158
|
-
export declare function armCron(spec: ArmCronSpec): {
|
|
158
|
+
export declare function armCron(spec: ArmCronSpec): Promise<{
|
|
159
159
|
cron_id: string;
|
|
160
160
|
replaced: string[];
|
|
161
|
-
}
|
|
161
|
+
}>;
|
|
162
162
|
/** SELECT one cron by id. */
|
|
163
|
-
export declare function getCron(cron_id: string): Cron | null
|
|
163
|
+
export declare function getCron(cron_id: string): Promise<Cron | null>;
|
|
164
164
|
/** List crons for a scope, next-fire order. `{profile}` = that profile's
|
|
165
165
|
* profile-scoped rows; `{global:true}` = global-scoped rows only;
|
|
166
166
|
* `{all:true}` = every cron on the canvas. */
|
|
@@ -170,7 +170,7 @@ export declare function listCrons(scope: {
|
|
|
170
170
|
global: true;
|
|
171
171
|
} | {
|
|
172
172
|
all: true;
|
|
173
|
-
}): Cron[]
|
|
173
|
+
}): Promise<Cron[]>;
|
|
174
174
|
/** DELETE one cron — the explicit user/surface cancel. Idempotent: an absent
|
|
175
175
|
* row is a no-op `false`. Kills any in-flight run process group before
|
|
176
176
|
* deleting unless the daemon has proved the caller is that exact run; then
|
|
@@ -180,34 +180,34 @@ export declare function listCrons(scope: {
|
|
|
180
180
|
* the cron's run history with it. */
|
|
181
181
|
export declare function cancelCron(cron_id: string, options?: {
|
|
182
182
|
preserveRunningProcess?: boolean;
|
|
183
|
-
}): boolean
|
|
183
|
+
}): Promise<boolean>;
|
|
184
184
|
/** Cron ids a hard profile deletion will remove: matching execution profile,
|
|
185
185
|
* plus every row anchored to a node being deleted. */
|
|
186
|
-
export declare function cronIdsForProfileDeletion(profileId: string, anchorNodeIds: readonly string[]): string[]
|
|
186
|
+
export declare function cronIdsForProfileDeletion(profileId: string, anchorNodeIds: readonly string[]): Promise<string[]>;
|
|
187
187
|
/** Kill any leased matching/anchored runs, then delete their rows together. */
|
|
188
|
-
export declare function deleteCronsForProfile(profileId: string, anchorNodeIds: readonly string[]): string[]
|
|
188
|
+
export declare function deleteCronsForProfile(profileId: string, anchorNodeIds: readonly string[]): Promise<string[]>;
|
|
189
189
|
/** Cron ids whose snapshotted profile will be detached. */
|
|
190
|
-
export declare function cronIdsForProfileDetach(profileId: string): string[]
|
|
190
|
+
export declare function cronIdsForProfileDetach(profileId: string): Promise<string[]>;
|
|
191
191
|
/** Preserve matching crons while removing their deleted profile dependency. */
|
|
192
|
-
export declare function globalizeCronsForProfile(profileId: string): string[]
|
|
192
|
+
export declare function globalizeCronsForProfile(profileId: string): Promise<string[]>;
|
|
193
193
|
/** DELETE one cron by id — one-shot consumption after its run settles.
|
|
194
194
|
* Returns whether a live row was removed, so a consumer racing an explicit
|
|
195
195
|
* cancel can no-op instead of double-settling. */
|
|
196
|
-
export declare function consumeCron(cron_id: string): boolean
|
|
196
|
+
export declare function consumeCron(cron_id: string): Promise<boolean>;
|
|
197
197
|
/** UPDATE `state` (active|paused). Returns whether a row changed — pausing an
|
|
198
198
|
* already-paused cron (or a gone one) reports `false`. Pausing does NOT kill
|
|
199
199
|
* an in-flight run: the run settles normally, the row just stops being due. */
|
|
200
|
-
export declare function setCronState(cron_id: string, state: CronState): boolean
|
|
200
|
+
export declare function setCronState(cron_id: string, state: CronState): Promise<boolean>;
|
|
201
201
|
/** UPDATE `last_output_hash` — the on-change disposition's memory of the
|
|
202
202
|
* previous run's stdout. Written after EVERY settled run of an on-change
|
|
203
203
|
* cron, delivered or not. */
|
|
204
|
-
export declare function setCronLastOutputHash(cron_id: string, hash: string): void
|
|
204
|
+
export declare function setCronLastOutputHash(cron_id: string, hash: string): Promise<void>;
|
|
205
205
|
/** True when a cron can still wake this node. An active deadline is a wake
|
|
206
206
|
* source by its anchor; output delivery is a wake source by its decoded node
|
|
207
207
|
* sink. Scheduled rows must remain active and unexpired, while a leased run
|
|
208
208
|
* remains eligible through settlement even if it has since been paused or
|
|
209
209
|
* expired. */
|
|
210
|
-
export declare function hasPendingCronWake(nodeId: string): boolean
|
|
210
|
+
export declare function hasPendingCronWake(nodeId: string): Promise<boolean>;
|
|
211
211
|
/** DELETE every cancel-on-wake cron anchored to this node — the deadline rule.
|
|
212
212
|
* A real wake consumes the wait at its delivery boundary or, as a dormant
|
|
213
213
|
* fallback, in reviveNode; recovery replacement and a viewer attach are not
|
|
@@ -215,16 +215,16 @@ export declare function hasPendingCronWake(nodeId: string): boolean;
|
|
|
215
215
|
* lifecycle transitions also clear the wait. Standing declarative crons are
|
|
216
216
|
* untouched. Kills an in-flight run process group first (the cancelCron
|
|
217
217
|
* discipline), under one canvas write boundary. Returns removed cron ids. */
|
|
218
|
-
export declare function cancelCronsOnWake(anchor_node: string): string[]
|
|
218
|
+
export declare function cancelCronsOnWake(anchor_node: string): Promise<string[]>;
|
|
219
219
|
/** UPDATE the next fire time — recurrence advancement. The daemon settles a
|
|
220
220
|
* recurring row to its next slot BEFORE enacting the run (crash-safe). */
|
|
221
|
-
export declare function advanceCron(cron_id: string, nextFireIso: string): void
|
|
221
|
+
export declare function advanceCron(cron_id: string, nextFireIso: string): Promise<void>;
|
|
222
222
|
/** The daemon's per-tick due query: active, idle, fire_at arrived, in
|
|
223
223
|
* deterministic order. The idle-only filter IS the default `overlap='skip'`
|
|
224
224
|
* behavior — a row whose previous run is still leased is simply not due.
|
|
225
225
|
* Returns exactly ONE row per cron regardless of missed slots — coalescing
|
|
226
226
|
* is structural (fire_at holds a single next occurrence). */
|
|
227
|
-
export declare function dueClockCrons(nowIso: string): Cron[]
|
|
227
|
+
export declare function dueClockCrons(nowIso: string): Promise<Cron[]>;
|
|
228
228
|
/** Atomically acquire the idle run lease: flips `run_state` to 'running' and
|
|
229
229
|
* records lease/pid metadata, but ONLY if the row is still idle (the
|
|
230
230
|
* `WHERE run_state = 'idle'` guard is the atomicity). Returns whether THIS
|
|
@@ -237,9 +237,9 @@ export declare function dueClockCrons(nowIso: string): Cron[];
|
|
|
237
237
|
*
|
|
238
238
|
* `outOfBand` stamps the lease as a `cron run` (manual verification) so the
|
|
239
239
|
* overlap pass leaves it alone — see `dueOverlapCrons`. */
|
|
240
|
-
export declare function acquireCronRunLease(cron_id: string, leaseOwner: string, startedAtIso: string, outOfBand: boolean, executionId?: string | null): boolean
|
|
240
|
+
export declare function acquireCronRunLease(cron_id: string, leaseOwner: string, startedAtIso: string, outOfBand: boolean, executionId?: string | null): Promise<boolean>;
|
|
241
241
|
/** Attach the launcher's pid only to the run that claimed this lease. */
|
|
242
|
-
export declare function attachCronRunPid(cron_id: string, leaseOwner: string, startedAtIso: string, pid: number): boolean
|
|
242
|
+
export declare function attachCronRunPid(cron_id: string, leaseOwner: string, startedAtIso: string, pid: number): Promise<boolean>;
|
|
243
243
|
/** What a settling run does with the row's `held` state, applied in the SAME
|
|
244
244
|
* UPDATE that releases the lease — one write boundary, so no tick can observe
|
|
245
245
|
* `run_state='idle'` with the held transition not yet applied.
|
|
@@ -264,7 +264,7 @@ export type HeldSettle = {
|
|
|
264
264
|
/** Release the run lease back to idle (run settled, or stale-lease recovery
|
|
265
265
|
* for a dead pid), applying the settlement's `held` disposition in the same
|
|
266
266
|
* statement. */
|
|
267
|
-
export declare function releaseCronRunLease(cron_id: string, held?: HeldSettle): void
|
|
267
|
+
export declare function releaseCronRunLease(cron_id: string, held?: HeldSettle): Promise<void>;
|
|
268
268
|
/** The daemon-level eligibility poke (`POST /v1/crons/poke`): "something
|
|
269
269
|
* changed; re-check now". One write boundary, two statements:
|
|
270
270
|
* 1. stamp `last_poke_at` on EVERY row — this is what reaches a gate check
|
|
@@ -281,7 +281,7 @@ export declare function releaseCronRunLease(cron_id: string, held?: HeldSettle):
|
|
|
281
281
|
* a paused held row keeps its state and unparks via a later poke/backstop
|
|
282
282
|
* after resume (it still receives the stamp, harmlessly). Returns the
|
|
283
283
|
* unparked count. Idempotent and free when nothing is held. */
|
|
284
|
-
export declare function pokeHeldCrons(nowIso: string, grantee?: string | null): number
|
|
284
|
+
export declare function pokeHeldCrons(nowIso: string, grantee?: string | null): Promise<number>;
|
|
285
285
|
/** Recurring crons whose NEXT fire has arrived while their previous run is
|
|
286
286
|
* still leased — the overlap-policy pass. One-shots never appear here (a
|
|
287
287
|
* one-shot has exactly one fire, already consumed by its running lease).
|
|
@@ -292,21 +292,21 @@ export declare function pokeHeldCrons(nowIso: string, grantee?: string | null):
|
|
|
292
292
|
* `fire_at` past a genuine occurrence (`skip`) or SIGTERM the invoker's own
|
|
293
293
|
* run (`replace`). Such a row simply is not due for overlap; the real
|
|
294
294
|
* occurrence stays past-due and fires the moment the manual lease releases. */
|
|
295
|
-
export declare function dueOverlapCrons(nowIso: string): Cron[]
|
|
295
|
+
export declare function dueOverlapCrons(nowIso: string): Promise<Cron[]>;
|
|
296
296
|
/** Crons whose clock bound (`expires_at`) has passed — the daemon deletes
|
|
297
297
|
* these each tick. Idle rows only: an expired row whose run is still in
|
|
298
298
|
* flight is picked up on a later tick, after the run settles. */
|
|
299
|
-
export declare function expiredIdleCrons(nowIso: string): Cron[]
|
|
299
|
+
export declare function expiredIdleCrons(nowIso: string): Promise<Cron[]>;
|
|
300
300
|
/** The run-log ring for one cron, most recent first. */
|
|
301
|
-
export declare function listCronRuns(cron_id: string): CronRunRecord[]
|
|
301
|
+
export declare function listCronRuns(cron_id: string): Promise<CronRunRecord[]>;
|
|
302
302
|
/** Every cron currently marked 'running' — the daemon's stale-lease recovery
|
|
303
303
|
* scan checks each recorded `run_pid` for liveness. */
|
|
304
|
-
export declare function runningCrons(): Cron[]
|
|
304
|
+
export declare function runningCrons(): Promise<Cron[]>;
|
|
305
305
|
/** INSERT one settled run record, then prune that cron's history down to the
|
|
306
306
|
* most recent CRON_RUN_RING rows — one canvas write boundary, so the ring
|
|
307
307
|
* bound holds atomically with the insert. Returns whether the record was
|
|
308
308
|
* written: a cron canceled while its run was in flight is already gone (and
|
|
309
309
|
* its history cascaded), so a settling run no-ops with `false` instead of
|
|
310
310
|
* violating the FK. */
|
|
311
|
-
export declare function recordCronRunLocked(db:
|
|
312
|
-
export declare function recordCronRun(run: CronRunRecord): boolean
|
|
311
|
+
export declare function recordCronRunLocked(db: CanvasDb, run: CronRunRecord): Promise<boolean>;
|
|
312
|
+
export declare function recordCronRun(run: CronRunRecord): Promise<boolean>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
var
|
|
1
|
+
var f=Object.defineProperty;var a=(n,r)=>f(n,"name",{value:r,configurable:!0});import{withCanvasWrite as c,openDb as i}from"./db.js";import{capturePidIdentities as l,identitiesMatch as w,killProcessGroup as R}from"./pid.js";import{isProfilePaused as h}from"../profiles/manifest.js";import{stopAppProcess as m}from"../spaces/process.js";import{emitEvent as D}from"../events/emit.js";const S=20;function N(n){if(typeof n!="string")return null;try{const r=JSON.parse(n);return Array.isArray(r)?r.filter(e=>typeof e=="string"):null}catch{return null}}a(N,"scopesFrom");function s(n){return{cron_id:n.cron_id,name:n.name,created_by:n.created_by??null,grantee:n.grantee,sub:n.sub??"user:local",grant_id:n.grant_id??null,scopes:N(n.scopes_json),origin_run_id:n.origin_run_id??null,run_execution_id:n.run_execution_id??null,isolated:Number(n.isolated)!==0,command:n.command,fire_at:n.fire_at,recur:n.recur??null,tz:n.tz??null,expires_at:n.expires_at??null,anchor_node:n.anchor_node??null,cancel_on_wake:Number(n.cancel_on_wake)!==0,cwd:n.cwd,env_json:n.env_json??null,profile:n.profile??null,scope:n.scope,run_timeout_s:Number(n.run_timeout_s),overlap:n.overlap,on_output:n.on_output,sink:n.sink,tier:n.tier,last_output_hash:n.last_output_hash??null,held:Number(n.held)!==0,last_poke_at:n.last_poke_at??null,state:n.state,run_state:n.run_state,run_pid:n.run_pid??null,run_pid_identity:n.run_pid_identity??null,run_started_at:n.run_started_at??null,run_lease_owner:n.run_lease_owner??null,run_out_of_band:Number(n.run_out_of_band)!==0,created:n.created,updated:n.updated}}a(s,"cronFrom");function p(n){try{const r=JSON.parse(n);if(typeof r.node=="string")return{kind:"node",node:r.node};if(typeof r.spawn=="string")return{kind:"spawn",spawn:r.spawn};if(r.human===!0)return{kind:"human"}}catch{}return null}a(p,"parseCronSink");function W(n){const r=p(n);if(r===null)return null;switch(r.kind){case"node":return`node:${r.node}`;case"spawn":return`spawn:${r.spawn}`;case"human":return"human"}}a(W,"cronSinkDisplay");async function O(n,r="SIGTERM"){if(!d(n))return!1;if(process.platform!=="linux")return R(n.run_pid,r),!0;try{return await m(n.run_pid,r,n.anchor_node??void 0),!0}catch(e){if(!d(n))return!1;throw e}}a(O,"stopLeasedCronRun");function _(n,r="SIGTERM"){return d(n)?(O(n,r).catch(e=>{D({level:"error",event:"cron.run.stop_failed",error:e,fields:{cron_id:n.cron_id,pid:n.run_pid}})}),!0):!1}a(_,"killLeasedCronRun");function d(n){const r=n.run_pid;if(r==null||n.run_pid_identity==null)return!1;const e=l([r]);if(e===null)return!1;const t=e.get(r);return t===void 0?!1:w(t,n.run_pid_identity)}a(d,"verifyLeasedCronRun");async function H(n){return await c(async r=>{const e=[];if(n.cancel_on_wake&&n.anchor_node!==null){const t=(await r.prepare("SELECT * FROM crons WHERE anchor_node = ? AND cancel_on_wake = 1").all(n.anchor_node)).map(s);for(const o of t)o.run_state==="running"&&_(o),await r.prepare("DELETE FROM crons WHERE cron_id = ?").run(o.cron_id),e.push(o.cron_id)}return await y(r,n),{cron_id:n.cron_id,replaced:e}})}a(H,"armCron");async function y(n,r){const e=new Date().toISOString();await n.prepare(`INSERT INTO crons (
|
|
2
2
|
cron_id, name, created_by, grantee, sub, grant_id, scopes_json, origin_run_id, isolated, command, fire_at, recur, tz, expires_at,
|
|
3
3
|
anchor_node, cancel_on_wake, cwd, env_json, profile, scope,
|
|
4
4
|
run_timeout_s, overlap, on_output, sink, tier, created, updated
|
|
5
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(r.cron_id,r.name,r.created_by,r.grantee??"app:terminal",r.sub??"user:local",r.grant_id??null,r.scopes==null?null:JSON.stringify(r.scopes),r.origin_run_id??null,r.isolated?1:0,r.command,r.fire_at,r.recur,r.tz,r.expires_at,r.anchor_node,r.cancel_on_wake?1:0,r.cwd,r.env_json,r.profile,r.scope,r.run_timeout_s,r.overlap,r.on_output,r.sink,r.tier,e,e)}
|
|
5
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(r.cron_id,r.name,r.created_by,r.grantee??"app:terminal",r.sub??"user:local",r.grant_id??null,r.scopes==null?null:JSON.stringify(r.scopes),r.origin_run_id??null,r.isolated?1:0,r.command,r.fire_at,r.recur,r.tz,r.expires_at,r.anchor_node,r.cancel_on_wake?1:0,r.cwd,r.env_json,r.profile,r.scope,r.run_timeout_s,r.overlap,r.on_output,r.sink,r.tier,e,e)}a(y,"insertCron");async function F(n){const r=await(await i()).prepare("SELECT * FROM crons WHERE cron_id = ?").get(n);return r===void 0?null:s(r)}a(F,"getCron");async function U(n){const r=await i();let e;return"profile"in n?e=await r.prepare("SELECT * FROM crons WHERE scope = 'profile' AND profile = ? ORDER BY fire_at").all(n.profile):"global"in n?e=await r.prepare("SELECT * FROM crons WHERE scope = 'global' ORDER BY fire_at").all():e=await r.prepare("SELECT * FROM crons ORDER BY fire_at").all(),e.map(s)}a(U,"listCrons");async function M(n,r){return await c(async e=>{const t=await e.prepare("SELECT * FROM crons WHERE cron_id = ?").get(n);if(t===void 0)return!1;const o=s(t);return o.run_state==="running"&&r?.preserveRunningProcess!==!0&&_(o),await e.prepare("DELETE FROM crons WHERE cron_id = ?").run(n),!0})}a(M,"cancelCron");function E(n,r){const e=[...new Set(r)];return e.length===0?{sql:"profile = ?",params:[n]}:{sql:`profile = ? OR anchor_node IN (${e.map(()=>"?").join(",")})`,params:[n,...e]}}a(E,"profileCronWhere");async function v(n,r){const e=E(n,r);return(await(await i()).prepareUncached(`SELECT cron_id FROM crons WHERE ${e.sql} ORDER BY created, cron_id`).all(...e.params)).map(({cron_id:t})=>t)}a(v,"cronIdsForProfileDeletion");async function I(n,r){return await c(async e=>{const t=E(n,r),o=(await e.prepareUncached(`SELECT * FROM crons WHERE ${t.sql} ORDER BY created, cron_id`).all(...t.params)).map(s);for(const u of o)u.run_state==="running"&&_(u);return await e.prepareUncached(`DELETE FROM crons WHERE ${t.sql}`).run(...t.params),o.map(({cron_id:u})=>u)})}a(I,"deleteCronsForProfile");async function P(n){return(await(await i()).prepare("SELECT cron_id FROM crons WHERE profile = ? ORDER BY created, cron_id").all(n)).map(({cron_id:r})=>r)}a(P,"cronIdsForProfileDetach");async function b(n){return await c(async r=>{const e=(await r.prepare("SELECT cron_id FROM crons WHERE profile = ? ORDER BY created, cron_id").all(n)).map(({cron_id:t})=>t);return e.length>0&&await r.prepare("UPDATE crons SET profile = NULL, scope = 'global', updated = ? WHERE profile = ?").run(new Date().toISOString(),n),e})}a(b,"globalizeCronsForProfile");async function B(n){return(await(await i()).prepare("DELETE FROM crons WHERE cron_id = ?").run(n)).changes>0}a(B,"consumeCron");async function Y(n,r){return(await(await i()).prepare("UPDATE crons SET state = ?, updated = ? WHERE cron_id = ?").run(r,new Date().toISOString(),n)).changes>0}a(Y,"setCronState");async function $(n,r){await(await i()).prepare("UPDATE crons SET last_output_hash = ?, updated = ? WHERE cron_id = ?").run(r,new Date().toISOString(),n)}a($,"setCronLastOutputHash");async function j(n){const r=await(await i()).prepare(`SELECT anchor_node, cancel_on_wake, sink
|
|
6
6
|
FROM crons
|
|
7
7
|
WHERE (anchor_node = ? AND cancel_on_wake = 1 AND state = 'active')
|
|
8
8
|
OR (
|
|
@@ -11,26 +11,26 @@ var R=Object.defineProperty;var o=(n,r)=>R(n,"name",{value:r,configurable:!0});i
|
|
|
11
11
|
run_state = 'running'
|
|
12
12
|
OR (run_state = 'idle' AND state = 'active' AND (expires_at IS NULL OR expires_at > ?))
|
|
13
13
|
)
|
|
14
|
-
)`).all(n,new Date().toISOString());for(const e of r){if(e.anchor_node===n&&Number(e.cancel_on_wake)!==0)return!0;const t=p(e.sink);if(t?.kind==="node"&&t.node===n)return!0}return!1}
|
|
14
|
+
)`).all(n,new Date().toISOString());for(const e of r){if(e.anchor_node===n&&Number(e.cancel_on_wake)!==0)return!0;const t=p(e.sink);if(t?.kind==="node"&&t.node===n)return!0}return!1}a(j,"hasPendingCronWake");async function q(n){return await c(async r=>{const e=(await r.prepare("SELECT * FROM crons WHERE anchor_node = ? AND cancel_on_wake = 1").all(n)).map(s);for(const t of e)t.run_state==="running"&&_(t),await r.prepare("DELETE FROM crons WHERE cron_id = ?").run(t.cron_id);return e.map(t=>t.cron_id)})}a(q,"cancelCronsOnWake");async function z(n,r){await(await i()).prepare("UPDATE crons SET fire_at = ?, updated = ? WHERE cron_id = ?").run(r,new Date().toISOString(),n)}a(z,"advanceCron");async function G(n){return(await(await i()).prepare(`SELECT * FROM crons
|
|
15
15
|
WHERE state = 'active' AND run_state = 'idle' AND fire_at <= ?
|
|
16
|
-
ORDER BY fire_at, created, cron_id`).all(n).map(
|
|
16
|
+
ORDER BY fire_at, created, cron_id`).all(n)).map(s).filter(r=>!h(r.profile))}a(G,"dueClockCrons");async function J(n,r,e,t,o=null){const u=await(await i()).prepare(`UPDATE crons
|
|
17
17
|
SET run_state = 'running', run_started_at = ?, run_pid = NULL, run_pid_identity = NULL,
|
|
18
18
|
run_lease_owner = ?, run_out_of_band = ?, run_execution_id = ?, updated = ?
|
|
19
|
-
WHERE cron_id = ? AND run_state = 'idle'`).run(e,r,t?1:0,
|
|
19
|
+
WHERE cron_id = ? AND run_state = 'idle'`).run(e,r,t?1:0,o,new Date().toISOString(),n);return Number(u.changes)>0}a(J,"acquireCronRunLease");async function V(n,r,e,t){const o=l([t])?.get(t)??null,u=await(await i()).prepare(`UPDATE crons SET run_pid = ?, run_pid_identity = ?, updated = ?
|
|
20
20
|
WHERE cron_id = ? AND run_state = 'running' AND run_lease_owner = ?
|
|
21
|
-
AND run_started_at = ? AND run_pid IS NULL`).run(t,
|
|
21
|
+
AND run_started_at = ? AND run_pid IS NULL`).run(t,o,new Date().toISOString(),n,r,e);return Number(u.changes)>0}a(V,"attachCronRunPid");async function K(n,r){let e="";const t=[];r!==void 0&&(r.kind==="clear"?e=", held = 0":r.kind==="park"?(e=r.fireAt!==void 0?", held = 1, fire_at = ?":", held = 1",r.fireAt!==void 0&&t.push(r.fireAt)):(e=", held = 0, fire_at = ?",t.push(r.nowIso))),await(await i()).prepareUncached(`UPDATE crons
|
|
22
22
|
SET run_state = 'idle', run_started_at = NULL, run_pid = NULL, run_pid_identity = NULL,
|
|
23
23
|
run_lease_owner = NULL, run_out_of_band = 0, run_execution_id = NULL, updated = ?${e}
|
|
24
|
-
WHERE cron_id = ?`).run(new Date().toISOString(),...t,n)}
|
|
24
|
+
WHERE cron_id = ?`).run(new Date().toISOString(),...t,n)}a(K,"releaseCronRunLease");async function Q(n,r=null){return await c(async e=>{const t=r===null?"":" AND grantee = ?",o=r===null?[]:[r];await e.prepareUncached(`UPDATE crons SET last_poke_at = ? WHERE 1 = 1${t}`).run(n,...o);const u=await e.prepareUncached(`UPDATE crons SET fire_at = ?, held = 0, updated = ? WHERE held = 1 AND state = 'active' AND run_state = 'idle'${t}`).run(n,n,...o);return Number(u.changes)})}a(Q,"pokeHeldCrons");async function X(n){return(await(await i()).prepare(`SELECT * FROM crons
|
|
25
25
|
WHERE state = 'active' AND run_state = 'running' AND run_out_of_band = 0
|
|
26
26
|
AND recur IS NOT NULL AND fire_at <= ?
|
|
27
|
-
ORDER BY fire_at, created, cron_id`).all(n).map(
|
|
27
|
+
ORDER BY fire_at, created, cron_id`).all(n)).map(s)}a(X,"dueOverlapCrons");async function Z(n){return(await(await i()).prepare(`SELECT * FROM crons
|
|
28
28
|
WHERE expires_at IS NOT NULL AND expires_at <= ? AND run_state = 'idle'
|
|
29
|
-
ORDER BY expires_at`).all(n).map(
|
|
29
|
+
ORDER BY expires_at`).all(n)).map(s)}a(Z,"expiredIdleCrons");async function nn(n){return(await(await i()).prepare("SELECT * FROM cron_runs WHERE cron_id = ? ORDER BY started DESC, run_id DESC").all(n)).map(r=>({run_id:r.run_id,cron_id:r.cron_id,started:r.started,finished:r.finished,duration_ms:Number(r.duration_ms),exit_code:r.exit_code??null,stdout_head:r.stdout_head??null,stderr_head:r.stderr_head??null,delivered:r.delivered??null}))}a(nn,"listCronRuns");async function rn(){return(await(await i()).prepare("SELECT * FROM crons WHERE run_state = 'running'").all()).map(s)}a(rn,"runningCrons");async function L(n,r){return await n.prepare("SELECT 1 FROM crons WHERE cron_id = ?").get(r.cron_id)===void 0?!1:(await n.prepare(`INSERT INTO cron_runs (
|
|
30
30
|
run_id, cron_id, started, finished, duration_ms, exit_code,
|
|
31
31
|
stdout_head, stderr_head, delivered
|
|
32
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(r.run_id,r.cron_id,r.started,r.finished,r.duration_ms,r.exit_code,r.stdout_head,r.stderr_head,r.delivered),
|
|
32
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(r.run_id,r.cron_id,r.started,r.finished,r.duration_ms,r.exit_code,r.stdout_head,r.stderr_head,r.delivered),await n.prepare(`DELETE FROM cron_runs
|
|
33
33
|
WHERE cron_id = ? AND run_id NOT IN (
|
|
34
34
|
SELECT run_id FROM cron_runs WHERE cron_id = ?
|
|
35
35
|
ORDER BY started DESC, run_id DESC LIMIT ?
|
|
36
|
-
)`).run(r.cron_id,r.cron_id,
|
|
36
|
+
)`).run(r.cron_id,r.cron_id,S),!0)}a(L,"recordCronRunLocked");async function en(n){return await c(async r=>await L(r,n))}a(en,"recordCronRun");export{S as CRON_RUN_RING,J as acquireCronRunLease,z as advanceCron,H as armCron,V as attachCronRunPid,M as cancelCron,q as cancelCronsOnWake,B as consumeCron,v as cronIdsForProfileDeletion,P as cronIdsForProfileDetach,W as cronSinkDisplay,I as deleteCronsForProfile,G as dueClockCrons,X as dueOverlapCrons,Z as expiredIdleCrons,F as getCron,b as globalizeCronsForProfile,j as hasPendingCronWake,_ as killLeasedCronRun,nn as listCronRuns,U as listCrons,p as parseCronSink,Q as pokeHeldCrons,en as recordCronRun,L as recordCronRunLocked,K as releaseCronRunLease,rn as runningCrons,$ as setCronLastOutputHash,Y as setCronState,O as stopLeasedCronRun,d as verifyLeasedCronRun};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type CanvasDb } from './db.js';
|
|
2
2
|
import { type DeliverySettlement } from './deliveries.js';
|
|
3
3
|
import { type DeliveryFailure, type DeliverySettlement as ProcessDeliverySettlement } from './delivery-contract.js';
|
|
4
4
|
export type DaemonActionState = 'pending' | 'handed_off' | 'acknowledged' | 'permanent_failed';
|
|
@@ -30,16 +30,16 @@ export interface DaemonActionRecord {
|
|
|
30
30
|
updatedAt: number;
|
|
31
31
|
}
|
|
32
32
|
/** The table DDL. Shared by the migration that creates it; idempotent. */
|
|
33
|
-
export declare function createDaemonActionsTable(db:
|
|
33
|
+
export declare function createDaemonActionsTable(db: CanvasDb): Promise<void>;
|
|
34
34
|
/** Insert one frozen daemon action, due now. A duplicate idempotency key returns the original action id. */
|
|
35
|
-
export declare function enqueueDaemonAction(input: DaemonActionInput): string
|
|
36
|
-
export declare function readDaemonAction(idempotencyKey: string): DaemonActionRecord | null
|
|
37
|
-
export declare function readDaemonActionById(actionId: string): DaemonActionRecord | null
|
|
38
|
-
export declare function dueDaemonActions(now: number): DaemonActionRecord[]
|
|
39
|
-
export declare function claimDaemonAction(actionId: string, now: number, claimOwner: string): DaemonActionRecord | null
|
|
35
|
+
export declare function enqueueDaemonAction(input: DaemonActionInput): Promise<string>;
|
|
36
|
+
export declare function readDaemonAction(idempotencyKey: string): Promise<DaemonActionRecord | null>;
|
|
37
|
+
export declare function readDaemonActionById(actionId: string): Promise<DaemonActionRecord | null>;
|
|
38
|
+
export declare function dueDaemonActions(now: number): Promise<DaemonActionRecord[]>;
|
|
39
|
+
export declare function claimDaemonAction(actionId: string, now: number, claimOwner: string): Promise<DaemonActionRecord | null>;
|
|
40
40
|
/** The state/attempt/owner fence, identical in shape to `settleDelivery`. */
|
|
41
|
-
export declare function settleDaemonAction(actionId: string, attempts: number, claimOwner: string, settlement: DeliverySettlement | ProcessDeliverySettlement, now?: number): boolean
|
|
41
|
+
export declare function settleDaemonAction(actionId: string, attempts: number, claimOwner: string, settlement: DeliverySettlement | ProcessDeliverySettlement, now?: number): Promise<boolean>;
|
|
42
42
|
/** Deliberate operator retry of a daemon action that failed for good: pending, due now, fresh attempt budget. */
|
|
43
|
-
export declare function retryFailedDaemonAction(actionId: string, now?: number): boolean
|
|
43
|
+
export declare function retryFailedDaemonAction(actionId: string, now?: number): Promise<boolean>;
|
|
44
44
|
/** Daemon startup: an action a previous daemon handed off is due again now. */
|
|
45
|
-
export declare function resetHandedOffDaemonActions(now: number): number
|
|
45
|
+
export declare function resetHandedOffDaemonActions(now: number): Promise<number>;
|