@north-light/crouter 0.3.318 → 0.3.320
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/README.md +0 -3
- package/dist/api/client.js +2 -912
- package/dist/api/dto/attach.js +0 -13
- package/dist/api/dto/bash-jobs.js +1 -9
- package/dist/api/dto/broker-ops.js +0 -6
- package/dist/api/dto/broker.js +0 -20
- package/dist/api/dto/canvas.js +0 -2
- package/dist/api/dto/chat-inventory.js +0 -11
- package/dist/api/dto/common.js +1 -15
- package/dist/api/dto/config.js +0 -3
- package/dist/api/dto/crons.js +1 -10
- package/dist/api/dto/files.js +0 -7
- package/dist/api/dto/focus.js +0 -10
- package/dist/api/dto/health.js +0 -2
- package/dist/api/dto/human-requests.js +0 -4
- package/dist/api/dto/human.js +0 -4
- package/dist/api/dto/inbox.js +0 -4
- package/dist/api/dto/lifecycle.js +0 -3
- package/dist/api/dto/mail.js +0 -1
- package/dist/api/dto/memory.js +0 -6
- package/dist/api/dto/messages.js +0 -2
- package/dist/api/dto/model-config.js +0 -1
- package/dist/api/dto/modelauth.js +0 -4
- package/dist/api/dto/node-outcomes.js +0 -2
- package/dist/api/dto/nodes.js +0 -3
- package/dist/api/dto/profiles.js +1 -4
- package/dist/api/dto/recovery.js +0 -1
- package/dist/api/dto/reports.js +0 -2
- package/dist/api/dto/review-comments.js +0 -5
- package/dist/api/dto/reviews.js +0 -5
- package/dist/api/dto/subscriptions.js +0 -2
- package/dist/api/dto/worktree.js +0 -6
- package/dist/api/errors.js +1 -40
- package/dist/api/index.js +1 -33
- package/dist/api/plugin-manifest-schema.js +0 -23
- package/dist/api/routes.js +1 -147
- package/dist/build-root.js +1 -198
- package/dist/cli.js +3 -99
- package/dist/clients/attach/ansi-cells.js +1 -137
- package/dist/clients/attach/chrome/bash-jobs.js +1 -31
- package/dist/clients/attach/chrome/canvas-panels.js +1 -194
- package/dist/clients/attach/chrome/completion-bell.js +1 -89
- package/dist/clients/attach/chrome/cron-wait.js +1 -34
- package/dist/clients/attach/chrome/git-info.js +2 -44
- package/dist/clients/attach/chrome/header.js +1 -30
- package/dist/clients/attach/chrome/inbox-strip.js +1 -199
- package/dist/clients/attach/chrome/recap.js +1 -19
- package/dist/clients/attach/chrome/review-wait.js +1 -22
- package/dist/clients/attach/chrome/roster.js +4 -275
- package/dist/clients/attach/chrome/status-line.js +1 -117
- package/dist/clients/attach/chrome/ticket-panel.js +1 -280
- package/dist/clients/attach/chrome/widgets.js +1 -51
- package/dist/clients/attach/command.js +1 -107
- package/dist/clients/attach/config.js +1 -274
- package/dist/clients/attach/input/capabilities.js +1 -104
- package/dist/clients/attach/input/clipboard-image.js +3 -220
- package/dist/clients/attach/input/completion-frecency.js +1 -141
- package/dist/clients/attach/input/controller.js +7 -377
- package/dist/clients/attach/input/overlay-owner.js +1 -199
- package/dist/clients/attach/input/ref-autocomplete.js +2 -176
- package/dist/clients/attach/input/titled-editor.js +4 -859
- package/dist/clients/attach/overlays/auth.js +2 -271
- package/dist/clients/attach/overlays/dialogs.js +2 -102
- package/dist/clients/attach/overlays/file-review.js +2 -128
- package/dist/clients/attach/overlays/graph.js +1 -661
- package/dist/clients/attach/overlays/help.js +1 -211
- package/dist/clients/attach/overlays/mcp.js +1 -302
- package/dist/clients/attach/overlays/pickers.js +1 -163
- package/dist/clients/attach/render/activity-slot.js +1 -13
- package/dist/clients/attach/render/assistant-message.js +1 -56
- package/dist/clients/attach/render/card-presentation.js +5 -218
- package/dist/clients/attach/render/chat-view.js +5 -1708
- package/dist/clients/attach/render/condensed-history.js +1 -60
- package/dist/clients/attach/render/context-message.js +1 -63
- package/dist/clients/attach/render/crtr-output.js +17 -905
- package/dist/clients/attach/render/diagram.js +7 -111
- package/dist/clients/attach/render/edit-diff.js +5 -304
- package/dist/clients/attach/render/glyph-codepoints.js +1 -42
- package/dist/clients/attach/render/group-activity.js +2 -263
- package/dist/clients/attach/render/group-recap.js +1 -152
- package/dist/clients/attach/render/markdown-source.js +5 -266
- package/dist/clients/attach/render/measured-container.js +1 -322
- package/dist/clients/attach/render/page-block.js +1 -183
- package/dist/clients/attach/render/scroll-animation.js +1 -80
- package/dist/clients/attach/render/tool-calls.js +3 -361
- package/dist/clients/attach/render/transcript-copy.js +2 -81
- package/dist/clients/attach/render/transcript-search.js +1 -152
- package/dist/clients/attach/render/viewport.js +1 -184
- package/dist/clients/attach/session/banner.js +1 -29
- package/dist/clients/attach/session/bindings.js +1 -71
- package/dist/clients/attach/session/chrome-refresh.js +1 -94
- package/dist/clients/attach/session/connection.js +1 -186
- package/dist/clients/attach/session/context.js +0 -16
- package/dist/clients/attach/session/editor-frame.js +1 -142
- package/dist/clients/attach/session/editor-inventory.js +6 -160
- package/dist/clients/attach/session/file-links.js +1 -68
- package/dist/clients/attach/session/focus-events.js +1 -12
- package/dist/clients/attach/session/frame.js +1 -214
- package/dist/clients/attach/session/frames.js +1 -188
- package/dist/clients/attach/session/identity.js +1 -26
- package/dist/clients/attach/session/input-wiring.js +1 -140
- package/dist/clients/attach/session/invariant.js +1 -15
- package/dist/clients/attach/session/keys.js +1 -77
- package/dist/clients/attach/session/layout.js +1 -59
- package/dist/clients/attach/session/mouse.js +1 -78
- package/dist/clients/attach/session/pane-focus.js +1 -42
- package/dist/clients/attach/session/pane-tag.js +1 -112
- package/dist/clients/attach/session/pi-assets.js +1 -24
- package/dist/clients/attach/session/pi-oauth-flows.js +1 -21
- package/dist/clients/attach/session/profile-files.js +1 -228
- package/dist/clients/attach/session/reconnect.js +1 -175
- package/dist/clients/attach/session/selection.js +3 -108
- package/dist/clients/attach/session/state-sync.js +1 -67
- package/dist/clients/attach/session/surface-frame.js +1 -73
- package/dist/clients/attach/session/surface-host.js +1 -255
- package/dist/clients/attach/session/teardown.js +5 -94
- package/dist/clients/attach/session/transcript-search.js +3 -151
- package/dist/clients/attach/session/whip-achievements.js +2 -145
- package/dist/clients/attach/session/whip.js +1 -362
- package/dist/clients/attach/slash/dispatch.js +1 -706
- package/dist/clients/attach/slash/prompt-preview.js +1 -121
- package/dist/clients/attach/viewer.js +441 -441
- package/dist/clients/conversation/projection.js +1 -324
- package/dist/clients/conversation/submit.js +1 -51
- package/dist/clients/inbox/controller.js +1 -701
- package/dist/clients/inbox/dto-adapt.js +1 -93
- package/dist/clients/inbox/layout.js +1 -9
- package/dist/clients/inbox/page-adapter.js +1 -55
- package/dist/clients/inbox/resolve.js +1 -35
- package/dist/clients/inbox/review/anchors.js +1 -89
- package/dist/clients/inbox/review/comments-client.js +1 -98
- package/dist/clients/inbox/review/companion-pane.js +1 -82
- package/dist/clients/inbox/review/document-surface.js +2 -1188
- package/dist/clients/inbox/review/frame.js +1 -216
- package/dist/clients/inbox/review/keys.js +1 -123
- package/dist/clients/inbox/review/launch.js +1 -151
- package/dist/clients/inbox/review/live-source.js +1 -160
- package/dist/clients/inbox/review/nvim.js +1 -44
- package/dist/clients/inbox/review/remap.js +1 -157
- package/dist/clients/inbox/review/review-client.js +1 -123
- package/dist/clients/inbox/review/roundtrip.js +3 -36
- package/dist/clients/inbox/review/state.js +4 -315
- package/dist/clients/inbox/review-adapter.js +1 -43
- package/dist/clients/inbox/surface.js +1 -152
- package/dist/clients/inbox/tui/ansi.js +3 -321
- package/dist/clients/inbox/tui/input.js +5 -392
- package/dist/clients/inbox/tui/keys.js +1 -104
- package/dist/clients/inbox/tui/page-body.js +1 -66
- package/dist/clients/inbox/tui/panel.js +1 -84
- package/dist/clients/inbox/tui/render.js +2 -368
- package/dist/clients/inbox/tui/slots.js +3 -134
- package/dist/clients/inbox/tui/types.js +0 -1
- package/dist/clients/inbox/tui.js +1 -86
- package/dist/clients/surfaces/host.js +0 -1
- package/dist/commands/api-client.js +4 -290
- package/dist/commands/attention.js +1 -215
- package/dist/commands/canvas-browse.js +1 -70
- package/dist/commands/canvas-config.js +2 -192
- package/dist/commands/canvas-history/grep.js +7 -85
- package/dist/commands/canvas-history/read.js +3 -50
- package/dist/commands/canvas-history/search.js +10 -99
- package/dist/commands/canvas-history/shared.js +1 -139
- package/dist/commands/canvas-history/stats.js +6 -68
- package/dist/commands/canvas-history.js +1 -32
- package/dist/commands/canvas-issue.js +14 -149
- package/dist/commands/canvas-prune.js +1 -108
- package/dist/commands/canvas-roster.js +1 -69
- package/dist/commands/canvas-snapshot.js +1 -34
- package/dist/commands/canvas-use.js +1 -61
- package/dist/commands/canvas.js +1 -49
- package/dist/commands/chord.js +1 -241
- package/dist/commands/cron.js +11 -534
- package/dist/commands/dashboard.js +1 -85
- package/dist/commands/human/components.js +3 -77
- package/dist/commands/human/feedback.js +1 -112
- package/dist/commands/human/prompts.js +1 -331
- package/dist/commands/human/queue.js +1 -191
- package/dist/commands/human/request.js +1 -266
- package/dist/commands/human/review.js +1 -288
- package/dist/commands/human/shared.js +1 -67
- package/dist/commands/human.js +4 -60
- package/dist/commands/memory/delete.js +1 -100
- package/dist/commands/memory/edit.js +21 -219
- package/dist/commands/memory/find.js +2 -244
- package/dist/commands/memory/history.js +5 -199
- package/dist/commands/memory/lint.js +1 -107
- package/dist/commands/memory/list.js +1 -142
- package/dist/commands/memory/move.js +1 -223
- package/dist/commands/memory/origin.js +1 -130
- package/dist/commands/memory/read.js +6 -232
- package/dist/commands/memory/shared.js +12 -802
- package/dist/commands/memory/write.js +13 -235
- package/dist/commands/memory.js +1 -30
- package/dist/commands/node/bash.js +5 -245
- package/dist/commands/node/create.js +3 -332
- package/dist/commands/node/inspect.js +12 -300
- package/dist/commands/node/lifecycle.js +2 -453
- package/dist/commands/node/message.js +1 -161
- package/dist/commands/node/outcome.js +4 -134
- package/dist/commands/node/pyramid.js +2 -79
- package/dist/commands/node/subscription.js +1 -78
- package/dist/commands/node/wait.js +7 -163
- package/dist/commands/node-context.js +2 -159
- package/dist/commands/node-inspect-artifacts.js +8 -109
- package/dist/commands/node-lifecycle-revive.js +1 -217
- package/dist/commands/node-snapshot.js +1 -37
- package/dist/commands/node-transcript.js +1 -62
- package/dist/commands/node-worktree.js +1 -138
- package/dist/commands/node.js +1 -29
- package/dist/commands/pkg/browse/actions.js +1 -198
- package/dist/commands/pkg/browse/catalog.js +1 -466
- package/dist/commands/pkg/browse/command-view.js +1 -191
- package/dist/commands/pkg/browse/detail-panel.js +1 -402
- package/dist/commands/pkg/browse/doc-view.js +1 -89
- package/dist/commands/pkg/browse/list-panel.js +2 -168
- package/dist/commands/pkg/browse/model.js +1 -36
- package/dist/commands/pkg/browse/shell.js +1 -640
- package/dist/commands/pkg/browse.js +1 -27
- package/dist/commands/pkg/market-inspect.js +1 -141
- package/dist/commands/pkg/market-manage.js +1 -327
- package/dist/commands/pkg/market.js +1 -14
- package/dist/commands/pkg/plugin-inspect.js +1 -168
- package/dist/commands/pkg/plugin-manage.js +17 -1109
- package/dist/commands/pkg/plugin.js +1 -14
- package/dist/commands/pkg/shared.js +1 -62
- package/dist/commands/pkg.js +1 -21
- package/dist/commands/profile/default.js +1 -139
- package/dist/commands/profile/delete.js +1 -66
- package/dist/commands/profile/env.js +3 -188
- package/dist/commands/profile/kind.js +2 -35
- package/dist/commands/profile/list.js +1 -43
- package/dist/commands/profile/meta.js +1 -67
- package/dist/commands/profile/new.js +1 -115
- package/dist/commands/profile/pause.js +1 -59
- package/dist/commands/profile/project.js +1 -113
- package/dist/commands/profile/rename.js +1 -38
- package/dist/commands/profile/show.js +1 -52
- package/dist/commands/profile.js +1 -35
- package/dist/commands/push.js +9 -265
- package/dist/commands/revive.js +10 -181
- package/dist/commands/surface/node/cycle.js +1 -83
- package/dist/commands/surface/node/focus.js +1 -81
- package/dist/commands/surface/node/id.js +1 -38
- package/dist/commands/surface/node/pin.js +1 -42
- package/dist/commands/surface/node/placement.js +1 -134
- package/dist/commands/surface-edit.js +1 -157
- package/dist/commands/surface-inbox.js +1 -98
- package/dist/commands/surface-inspect.js +1 -39
- package/dist/commands/surface-node.js +1 -19
- package/dist/commands/surface-reload.js +2 -134
- package/dist/commands/surface-tmux-spread.js +1 -214
- package/dist/commands/surface.js +1 -28
- package/dist/commands/sys/branch.js +1 -19
- package/dist/commands/sys/config.js +1 -353
- package/dist/commands/sys/context/admin/actions.js +2 -246
- package/dist/commands/sys/context/admin/detail-panel.js +1 -247
- package/dist/commands/sys/context/admin/docs-panel.js +1 -191
- package/dist/commands/sys/context/admin/list-view.js +1 -183
- package/dist/commands/sys/context/admin/model.js +1 -229
- package/dist/commands/sys/context/admin/rail-panel.js +1 -227
- package/dist/commands/sys/context/admin/read-view.js +2 -194
- package/dist/commands/sys/context/admin/shell.js +1 -910
- package/dist/commands/sys/context/admin.js +2 -126
- package/dist/commands/sys/context/doc.js +3 -197
- package/dist/commands/sys/context/prompt-review.js +11 -291
- package/dist/commands/sys/context/resolve.js +10 -489
- package/dist/commands/sys/context/sysprompt.js +5 -96
- package/dist/commands/sys/context.js +1 -20
- package/dist/commands/sys/daemon.js +1 -313
- package/dist/commands/sys/doctor.js +1 -617
- package/dist/commands/sys/feedback.js +7 -228
- package/dist/commands/sys/logs.js +3 -129
- package/dist/commands/sys/migrate.js +1 -94
- package/dist/commands/sys/panels/broker-limits-panel.js +2 -110
- package/dist/commands/sys/panels/dependencies-panel.js +1 -80
- package/dist/commands/sys/panels/keybindings-panel.js +1 -703
- package/dist/commands/sys/panels/models-panel.js +1 -1133
- package/dist/commands/sys/panels/plugins-panel.js +1 -80
- package/dist/commands/sys/panels/prefs-panel.js +1 -85
- package/dist/commands/sys/panels/profiles-panel.js +1 -601
- package/dist/commands/sys/panels/provider-panel.js +1 -538
- package/dist/commands/sys/settings-shell.js +1 -400
- package/dist/commands/sys/settings.js +1 -46
- package/dist/commands/sys/setup-core.js +6 -579
- package/dist/commands/sys/setup-settings-runner.js +1 -16
- package/dist/commands/sys/setup-wizard.js +1 -279
- package/dist/commands/sys/setup.js +1 -34
- package/dist/commands/sys/shared.js +1 -81
- package/dist/commands/sys/support/prepare.js +3 -239
- package/dist/commands/sys/support/submit.js +6 -524
- package/dist/commands/sys/support.js +1 -18
- package/dist/commands/sys/sync-deps.js +15 -498
- package/dist/commands/sys/sync-project-guidance.js +4 -481
- package/dist/commands/sys/sync-shared.js +1 -49
- package/dist/commands/sys/sync-skills.js +2 -311
- package/dist/commands/sys/sync.js +1 -18
- package/dist/commands/sys/update.js +1 -147
- package/dist/commands/sys/worktrees.js +5 -53
- package/dist/commands/sys.js +1 -18
- package/dist/core/activity-signal.js +2 -38
- package/dist/core/asset-root.js +1 -18
- package/dist/core/auth-file.js +2 -179
- package/dist/core/auth-interaction.js +3 -94
- package/dist/core/auto-update.js +4 -94
- package/dist/core/bash-guard.js +11 -393
- package/dist/core/bash-jobs.js +7 -411
- package/dist/core/bootstrap.js +2 -53
- package/dist/core/broker-client/client.js +1 -184
- package/dist/core/broker-client/index.js +1 -13
- package/dist/core/broker-client/transport-relay.js +1 -157
- package/dist/core/broker-client/transport-socket.js +1 -179
- package/dist/core/broker-client/transport.js +1 -26
- package/dist/core/canvas/attention.js +1 -47
- package/dist/core/canvas/boot-id.js +1 -26
- package/dist/core/canvas/boot.js +1 -186
- package/dist/core/canvas/browse/app.js +3 -919
- package/dist/core/canvas/browse/model.js +1 -477
- package/dist/core/canvas/browse/pins.js +1 -29
- package/dist/core/canvas/browse/render.js +3 -1055
- package/dist/core/canvas/canvas.js +15 -922
- package/dist/core/canvas/crons.js +11 -481
- package/dist/core/canvas/daemon-owner.js +2 -146
- package/dist/core/canvas/db.js +2 -100
- package/dist/core/canvas/deliveries.js +22 -283
- package/dist/core/canvas/delivery-contract.js +1 -8
- package/dist/core/canvas/executions.js +1 -68
- package/dist/core/canvas/extensions.js +1 -83
- package/dist/core/canvas/focuses.js +1 -77
- package/dist/core/canvas/history.js +24 -860
- package/dist/core/canvas/index.js +1 -15
- package/dist/core/canvas/install-id.js +1 -84
- package/dist/core/canvas/labels.js +1 -43
- package/dist/core/canvas/meta-file.js +1 -89
- package/dist/core/canvas/migrations.js +41 -1150
- package/dist/core/canvas/nav-model.js +1 -231
- package/dist/core/canvas/nav-render.js +1 -260
- package/dist/core/canvas/node-order.js +1 -37
- package/dist/core/canvas/node-recap.js +2 -67
- package/dist/core/canvas/node-sql-migration.js +2 -209
- package/dist/core/canvas/paths.js +1 -153
- package/dist/core/canvas/pid.js +4 -683
- package/dist/core/canvas/recovery.js +3 -565
- package/dist/core/canvas/remote-canvas-source.js +1 -288
- package/dist/core/canvas/remote-transport.js +1 -57
- package/dist/core/canvas/render-source.js +10 -635
- package/dist/core/canvas/sessions.js +1 -78
- package/dist/core/canvas/source.js +1 -47
- package/dist/core/canvas/status-glyph.js +1 -132
- package/dist/core/canvas/telemetry.js +1 -35
- package/dist/core/canvas/types.js +1 -6
- package/dist/core/canvas/waits.js +4 -68
- package/dist/core/canvas/worktrees.js +1 -93
- package/dist/core/clipboard-text.js +1 -57
- package/dist/core/command-hooks/artifact.js +1 -145
- package/dist/core/command-hooks/catalog.js +1 -38
- package/dist/core/command-hooks/compose.js +1 -99
- package/dist/core/command-hooks/discovery.js +1 -228
- package/dist/core/command-hooks/help.js +1 -18
- package/dist/core/command-hooks/index.js +1 -7
- package/dist/core/command-hooks/lifecycle-catalog.js +1 -9
- package/dist/core/command-hooks/lifecycle-create.js +1 -51
- package/dist/core/command-hooks/report.js +1 -28
- package/dist/core/command-hooks/schema.js +1 -157
- package/dist/core/command-hooks/transport/exec-invoke.js +1 -276
- package/dist/core/command-hooks/transport/exec-lifecycle.js +1 -211
- package/dist/core/command-manifests/manifest.js +1 -324
- package/dist/core/command-manifests/registry.js +1 -118
- package/dist/core/command-manifests/schema.js +1 -736
- package/dist/core/command-plugins/bundle.js +1 -261
- package/dist/core/command-plugins/compose.js +1 -65
- package/dist/core/command-plugins/discovery.js +1 -245
- package/dist/core/command-plugins/endpoint.js +1 -48
- package/dist/core/command-plugins/extensions.js +1 -166
- package/dist/core/command-plugins/help-addenda.js +1 -44
- package/dist/core/command-plugins/presence.js +1 -17
- package/dist/core/command-plugins/revalidate.js +2 -152
- package/dist/core/command-plugins/transport/exec-invoke.js +1 -215
- package/dist/core/command-plugins/transport/http-fetch.js +1 -68
- package/dist/core/command-plugins/transport/http-invoke.js +3 -546
- package/dist/core/command.js +10 -739
- package/dist/core/config.js +1 -1059
- package/dist/core/document-lines.js +3 -6
- package/dist/core/env-name.js +1 -9
- package/dist/core/errors.js +1 -52
- package/dist/core/events/emit.js +1 -17
- package/dist/core/events/envelope.js +1 -84
- package/dist/core/events/errors.js +1 -69
- package/dist/core/events/index.js +1 -4
- package/dist/core/events/operation-id.js +1 -24
- package/dist/core/events/read.js +1 -623
- package/dist/core/events/serialize.js +1 -199
- package/dist/core/events/source.js +1 -31
- package/dist/core/events/types.js +1 -11
- package/dist/core/exclusive-lock.js +1 -197
- package/dist/core/fault-classifier.js +1 -96
- package/dist/core/feed/feed.js +7 -202
- package/dist/core/feed/inbox-migrate.js +3 -135
- package/dist/core/feed/inbox.js +10 -122
- package/dist/core/feed/messages.js +6 -212
- package/dist/core/frontmatter.js +1 -35
- package/dist/core/fs-utils.js +3 -202
- package/dist/core/git.js +2 -103
- package/dist/core/help.js +9 -310
- package/dist/core/host-exports/builtins.js +9 -68
- package/dist/core/host-exports/export.js +3 -124
- package/dist/core/human/action-binding.js +1 -40
- package/dist/core/human/answer-text.js +5 -100
- package/dist/core/human/answer.js +1 -119
- package/dist/core/human/claim.js +3 -67
- package/dist/core/human/completion.js +1 -27
- package/dist/core/human/component-docs.js +78 -272
- package/dist/core/human/convention.js +2 -82
- package/dist/core/human/feedback-companion.js +1 -106
- package/dist/core/human/feedback.js +1 -88
- package/dist/core/human/page-authoring.js +1 -19
- package/dist/core/human/page-catalog.js +1 -172
- package/dist/core/human/page-errors.js +1 -7
- package/dist/core/human/page-eval.js +1 -125
- package/dist/core/human/page-html-markdown.js +8 -260
- package/dist/core/human/page-markdown.js +17 -295
- package/dist/core/human/page-schema.js +1 -373
- package/dist/core/human/page-synth.js +8 -27
- package/dist/core/human/page.js +1 -198
- package/dist/core/human/requests.js +15 -466
- package/dist/core/human/review-schema.js +1 -34
- package/dist/core/human/root.js +1 -11
- package/dist/core/human/scan.js +1 -69
- package/dist/core/human/summary.js +1 -5
- package/dist/core/human/tickets.js +1 -171
- package/dist/core/human/types.js +0 -1
- package/dist/core/human/visible-paths.js +1 -77
- package/dist/core/human-actions.js +1 -101
- package/dist/core/inspector/chrome.js +1 -14
- package/dist/core/inspector/contract.js +0 -1
- package/dist/core/inspector/core.js +2 -295
- package/dist/core/inspector/host.js +4 -538
- package/dist/core/inspector/model.js +2 -226
- package/dist/core/inspector/text.js +6 -45
- package/dist/core/inspector/transport.js +1 -36
- package/dist/core/inspector/tui.js +2 -295
- package/dist/core/installed-plugins.js +1 -78
- package/dist/core/io.js +7 -356
- package/dist/core/keybindings/attach-control.js +1 -42
- package/dist/core/keybindings/background-bash.js +1 -33
- package/dist/core/keybindings/catalog.js +1 -256
- package/dist/core/keybindings/inbox.js +1 -25
- package/dist/core/keybindings/index.js +1 -7
- package/dist/core/keybindings/match.js +1 -127
- package/dist/core/keybindings/persistence.js +1 -49
- package/dist/core/keybindings/resolve.js +1 -348
- package/dist/core/keybindings/types.js +0 -1
- package/dist/core/locked-file.js +1 -118
- package/dist/core/log.js +3 -27
- package/dist/core/manifest-recovery.js +1 -72
- package/dist/core/manifest-stale.js +1 -39
- package/dist/core/manifest.js +1 -20
- package/dist/core/memory/doc-link-grammar.js +2 -109
- package/dist/core/memory/extensions.js +1 -221
- package/dist/core/memory/history.js +6 -268
- package/dist/core/memory/identity.js +1 -181
- package/dist/core/memory/inline-ref-grammar.js +1 -98
- package/dist/core/memory/inline-ref-guidance.js +2 -35
- package/dist/core/memory/inline-ref-inventory.js +1 -59
- package/dist/core/memory/lint.js +2 -671
- package/dist/core/memory/project-namespace.js +2 -85
- package/dist/core/memory/repository-association.js +1 -129
- package/dist/core/memory/tree.js +1 -93
- package/dist/core/memory-resolver.js +2 -611
- package/dist/core/model-config.js +1 -107
- package/dist/core/model-routes.js +1 -201
- package/dist/core/nested-stores.js +2 -166
- package/dist/core/output.js +7 -99
- package/dist/core/pagination.js +1 -88
- package/dist/core/plugin-swap-lock.js +1 -31
- package/dist/core/pool-credential-store.js +1 -116
- package/dist/core/predicate.js +1 -191
- package/dist/core/preview-registry.js +2 -411
- package/dist/core/preview-result-path.js +1 -26
- package/dist/core/profiles/default-binding.js +1 -24
- package/dist/core/profiles/deletion-reservation.js +1 -42
- package/dist/core/profiles/env-store.js +2 -162
- package/dist/core/profiles/fuzzy-match.js +1 -92
- package/dist/core/profiles/manifest.js +1 -574
- package/dist/core/profiles/select.js +35 -741
- package/dist/core/profiles/state-block.js +3 -17
- package/dist/core/provider-error-recognition.js +1 -74
- package/dist/core/provider-failure.js +1 -86
- package/dist/core/provider-management.js +1 -22
- package/dist/core/remote-canvas-target.js +1 -30
- package/dist/core/render.js +18 -138
- package/dist/core/resolver.js +1 -111
- package/dist/core/review/birth.js +1 -52
- package/dist/core/review/comments.js +5 -279
- package/dist/core/review/companion.js +1 -215
- package/dist/core/review/document.js +2 -138
- package/dist/core/review/project.js +1 -36
- package/dist/core/review/realize.js +1 -71
- package/dist/core/review/remap.js +4 -141
- package/dist/core/review/signal.js +1 -12
- package/dist/core/review/stage.js +1 -184
- package/dist/core/review/store.js +1 -168
- package/dist/core/review/types.js +1 -23
- package/dist/core/runtime/advertised-command-invocation.js +1 -233
- package/dist/core/runtime/auth-reload.js +1 -67
- package/dist/core/runtime/banner.js +1 -51
- package/dist/core/runtime/bearings-render.js +18 -250
- package/dist/core/runtime/bearings.js +7 -194
- package/dist/core/runtime/bin-contributions.js +2 -186
- package/dist/core/runtime/boot-root.js +1 -107
- package/dist/core/runtime/branded-host.js +2 -264
- package/dist/core/runtime/broker/auth-reload.js +1 -157
- package/dist/core/runtime/broker/client-registry.js +1 -179
- package/dist/core/runtime/broker/daemon-ops.js +1 -88
- package/dist/core/runtime/broker/engine-drive.js +1 -354
- package/dist/core/runtime/broker/engine-routing.js +1 -211
- package/dist/core/runtime/broker/event-projection.js +1 -193
- package/dist/core/runtime/broker/extension-abort.js +1 -36
- package/dist/core/runtime/broker/fault-retry.js +1 -588
- package/dist/core/runtime/broker/frame-client.js +1 -132
- package/dist/core/runtime/broker/frame-dispatch.js +1 -183
- package/dist/core/runtime/broker/frame-engine-control.js +1 -231
- package/dist/core/runtime/broker/frame-memory-refs.js +1 -41
- package/dist/core/runtime/broker/frame-model-query.js +1 -69
- package/dist/core/runtime/broker/frame-read.js +1 -116
- package/dist/core/runtime/broker/frame-replies.js +1 -64
- package/dist/core/runtime/broker/frame-session.js +4 -203
- package/dist/core/runtime/broker/held-deferred-inbox.js +1 -13
- package/dist/core/runtime/broker/inbox.js +13 -163
- package/dist/core/runtime/broker/node-named.js +1 -27
- package/dist/core/runtime/broker/read-ops.js +1 -171
- package/dist/core/runtime/broker/rebind.js +1 -318
- package/dist/core/runtime/broker/tool-groups.js +1 -246
- package/dist/core/runtime/broker/turn-admission.js +1 -31
- package/dist/core/runtime/broker/turn-ignition.js +1 -84
- package/dist/core/runtime/broker-cli.js +3 -81
- package/dist/core/runtime/broker-extension-render.js +5 -135
- package/dist/core/runtime/broker-inventory.js +1 -116
- package/dist/core/runtime/broker-persona-guidance.js +4 -154
- package/dist/core/runtime/broker-protocol.js +3 -152
- package/dist/core/runtime/broker-request.js +1 -85
- package/dist/core/runtime/broker-sdk.js +1 -129
- package/dist/core/runtime/broker.js +1 -1214
- package/dist/core/runtime/canvas-extensions.js +1 -96
- package/dist/core/runtime/chat-inventory-rows.js +1 -105
- package/dist/core/runtime/close.js +1 -265
- package/dist/core/runtime/command-expansion.js +9 -104
- package/dist/core/runtime/command-surface.js +1 -117
- package/dist/core/runtime/connectivity.js +1 -73
- package/dist/core/runtime/deliver-live.js +1 -88
- package/dist/core/runtime/fault-recovery.js +1 -83
- package/dist/core/runtime/fault.js +1 -17
- package/dist/core/runtime/fleet.js +1 -58
- package/dist/core/runtime/front-door-env.js +1 -16
- package/dist/core/runtime/front-door.js +7 -183
- package/dist/core/runtime/headless-pi.js +1 -161
- package/dist/core/runtime/host.js +1 -457
- package/dist/core/runtime/interactive-deliver.js +1 -51
- package/dist/core/runtime/invocation.js +0 -10
- package/dist/core/runtime/kickoff.js +30 -327
- package/dist/core/runtime/launch-config-worker.js +1 -12
- package/dist/core/runtime/launch-prompt.js +4 -13
- package/dist/core/runtime/launch-target.js +1 -55
- package/dist/core/runtime/launch.js +1 -483
- package/dist/core/runtime/lifecycle.js +2 -213
- package/dist/core/runtime/managed-provider-cooling.js +1 -62
- package/dist/core/runtime/memory.js +1 -17
- package/dist/core/runtime/model-registry.js +1 -13
- package/dist/core/runtime/model-selection.js +1 -135
- package/dist/core/runtime/model-swap.js +1 -86
- package/dist/core/runtime/naming.js +14 -298
- package/dist/core/runtime/nerd-font.js +2 -127
- package/dist/core/runtime/node-read.js +2 -386
- package/dist/core/runtime/nodes.js +1 -331
- package/dist/core/runtime/outcome-document.js +1 -97
- package/dist/core/runtime/package-health.js +4 -99
- package/dist/core/runtime/persona.js +2 -55
- package/dist/core/runtime/pi-cli.js +1 -65
- package/dist/core/runtime/pi-vendored.js +1 -66
- package/dist/core/runtime/placement-tmux.js +1 -81
- package/dist/core/runtime/placement.js +1 -386
- package/dist/core/runtime/promote.js +1 -174
- package/dist/core/runtime/prospective-inventory-cli.js +3 -61
- package/dist/core/runtime/prospective-inventory.js +2 -88
- package/dist/core/runtime/recap.js +27 -103
- package/dist/core/runtime/recycle.js +1 -190
- package/dist/core/runtime/reopen.js +1 -138
- package/dist/core/runtime/reset.js +1 -245
- package/dist/core/runtime/resume-root.js +10 -290
- package/dist/core/runtime/revive-all.js +1 -107
- package/dist/core/runtime/revive.js +4 -544
- package/dist/core/runtime/roadmap.js +4 -38
- package/dist/core/runtime/session-branch.js +1 -46
- package/dist/core/runtime/session-cycles.js +1 -110
- package/dist/core/runtime/session-list-cache.js +1 -406
- package/dist/core/runtime/session-visibility.js +1 -99
- package/dist/core/runtime/shell-expansion.js +9 -100
- package/dist/core/runtime/situational-context.js +2 -67
- package/dist/core/runtime/situational-live.js +1 -41
- package/dist/core/runtime/spawn-env.js +1 -255
- package/dist/core/runtime/spawn.js +3 -577
- package/dist/core/runtime/stamp/channel.js +1 -76
- package/dist/core/runtime/stamp/protocol.js +1 -113
- package/dist/core/runtime/stop-guard.js +7 -116
- package/dist/core/runtime/stop-signals.js +1 -46
- package/dist/core/runtime/stream-watchdog.js +1 -134
- package/dist/core/runtime/structured-output.js +4 -156
- package/dist/core/runtime/surface-bg.js +1 -85
- package/dist/core/runtime/tmux-bindings.js +4 -730
- package/dist/core/runtime/tmux-chrome.js +1 -5
- package/dist/core/runtime/tmux-driver.js +7 -637
- package/dist/core/runtime/tool-group-summary.js +6 -85
- package/dist/core/runtime/turn-visibility.js +1 -31
- package/dist/core/runtime/view-socket.js +1 -83
- package/dist/core/runtime/warm-pool.js +1 -395
- package/dist/core/scope.js +1 -254
- package/dist/core/scoped-state/db.js +1 -135
- package/dist/core/scoped-state/migrate.js +3 -181
- package/dist/core/scoped-state/paths.js +1 -27
- package/dist/core/scoped-state/profiles.js +1 -62
- package/dist/core/scoped-state/providers.js +1 -8
- package/dist/core/scoped-state/schema.js +3 -16
- package/dist/core/scoped-state/settings.js +1 -82
- package/dist/core/secrets.js +2 -55
- package/dist/core/self-update.js +1 -71
- package/dist/core/session-model/session-state.js +1 -180
- package/dist/core/shell-segments.js +4 -169
- package/dist/core/spawn.js +1 -26
- package/dist/core/stdout-errors.js +1 -14
- package/dist/core/subscription-state.js +3 -193
- package/dist/core/substrate/frontmatter-validation.js +1 -105
- package/dist/core/substrate/gate-explain.js +1 -424
- package/dist/core/substrate/gate.js +1 -26
- package/dist/core/substrate/index.js +1 -30
- package/dist/core/substrate/injected-store.js +1 -249
- package/dist/core/substrate/listings.js +1 -115
- package/dist/core/substrate/on-read-node.js +1 -36
- package/dist/core/substrate/on-read.js +9 -315
- package/dist/core/substrate/plan.js +1 -266
- package/dist/core/substrate/render-node.js +1 -30
- package/dist/core/substrate/render.js +65 -689
- package/dist/core/substrate/schema.js +1 -186
- package/dist/core/substrate/session-cache.js +1 -83
- package/dist/core/substrate/subject-fields.js +1 -35
- package/dist/core/substrate/subject.js +1 -47
- package/dist/core/substrate/surface-match.js +1 -242
- package/dist/core/termrender/code-doc.js +5 -92
- package/dist/core/termrender/display.js +2 -56
- package/dist/core/termrender/termrender.js +14 -719
- package/dist/core/termrender/version.js +1 -1
- package/dist/core/timing.js +2 -94
- package/dist/core/tui/draw.js +2 -378
- package/dist/core/tui/fuzzy.js +1 -38
- package/dist/core/tui/markdown.js +3 -407
- package/dist/core/tui/page-host.js +1 -74
- package/dist/core/tui/panel.js +1 -137
- package/dist/core/tui/terminal.js +2 -100
- package/dist/core/user-settings.js +1 -454
- package/dist/core/wake.js +1 -296
- package/dist/core/worktree-close.js +6 -228
- package/dist/core/worktree-containment.js +3 -48
- package/dist/core/worktree-landing.js +4 -56
- package/dist/core/worktree-mutation-async.js +10 -280
- package/dist/core/worktree-quarantine.js +1 -54
- package/dist/core/worktree-sweep.js +6 -453
- package/dist/core/worktree.js +18 -899
- package/dist/daemon/api/bridge.js +8 -418
- package/dist/daemon/api/handlers/attach.js +1 -65
- package/dist/daemon/api/handlers/bash-jobs.js +2 -91
- package/dist/daemon/api/handlers/broker-ops.js +1 -447
- package/dist/daemon/api/handlers/broker-recovery.js +1 -251
- package/dist/daemon/api/handlers/canvas.js +6 -490
- package/dist/daemon/api/handlers/chat-inventory.js +1 -25
- package/dist/daemon/api/handlers/crons.js +1 -373
- package/dist/daemon/api/handlers/daemon.js +1 -76
- package/dist/daemon/api/handlers/feedback-comments.js +3 -199
- package/dist/daemon/api/handlers/files.js +1 -63
- package/dist/daemon/api/handlers/focus.js +1 -92
- package/dist/daemon/api/handlers/health.js +1 -76
- package/dist/daemon/api/handlers/human-requests.js +1 -379
- package/dist/daemon/api/handlers/human.js +1 -3
- package/dist/daemon/api/handlers/inbox-page.js +1 -89
- package/dist/daemon/api/handlers/inbox.js +1 -301
- package/dist/daemon/api/handlers/memory.js +1 -50
- package/dist/daemon/api/handlers/messages.js +2 -506
- package/dist/daemon/api/handlers/model-config.js +1 -44
- package/dist/daemon/api/handlers/modelauth.js +1 -165
- package/dist/daemon/api/handlers/node-outcomes.js +1 -181
- package/dist/daemon/api/handlers/nodes.js +1 -939
- package/dist/daemon/api/handlers/profiles.js +1 -140
- package/dist/daemon/api/handlers/prospective-chat-inventory.js +1 -59
- package/dist/daemon/api/handlers/reports.js +16 -332
- package/dist/daemon/api/handlers/review-comments.js +1 -465
- package/dist/daemon/api/handlers/reviews.js +1 -200
- package/dist/daemon/api/handlers/subscriptions.js +1 -53
- package/dist/daemon/api/handlers/validate.js +1 -58
- package/dist/daemon/api/handlers/worktree.js +1 -39
- package/dist/daemon/api/map.js +2 -735
- package/dist/daemon/api/router.js +1 -190
- package/dist/daemon/api/server.js +11 -408
- package/dist/daemon/boot-migrations.js +1 -31
- package/dist/daemon/companion-retire.js +1 -34
- package/dist/daemon/control.js +1 -22
- package/dist/daemon/cron/armed-context.js +1 -100
- package/dist/daemon/cron/capture.js +2 -45
- package/dist/daemon/cron/disposition.js +1 -55
- package/dist/daemon/cron/escalation.js +3 -124
- package/dist/daemon/cron/held.js +1 -20
- package/dist/daemon/cron/lease-recovery.js +1 -119
- package/dist/daemon/cron/live-runs.js +1 -23
- package/dist/daemon/cron/passes.js +1 -58
- package/dist/daemon/cron/settle.js +1 -61
- package/dist/daemon/cron/sinks.js +2 -59
- package/dist/daemon/cron-run.js +1 -405
- package/dist/daemon/crtrd-cli.js +1 -23
- package/dist/daemon/crtrd.js +8 -854
- package/dist/daemon/delivery/run-delivery.js +1 -164
- package/dist/daemon/fleet.js +17 -475
- package/dist/daemon/human/finish.js +10 -179
- package/dist/daemon/human/settle.js +1 -89
- package/dist/daemon/human/sweep.js +1 -66
- package/dist/daemon/manage.js +2 -595
- package/dist/daemon/messaging/node-message.js +1 -99
- package/dist/daemon/park-activity.js +1 -30
- package/dist/daemon/park-pending.js +1 -52
- package/dist/daemon/pidfile.js +1 -37
- package/dist/daemon/profile-delete.js +1 -306
- package/dist/daemon/reconcilers/bash-deadline.js +1 -80
- package/dist/daemon/reconcilers/broker-supervision.js +4 -761
- package/dist/daemon/reconcilers/controller-death.js +1 -14
- package/dist/daemon/reconcilers/cron-lane.js +1 -29
- package/dist/daemon/reconcilers/delivery-lane.js +1 -130
- package/dist/daemon/reconcilers/live-obligation.js +1 -87
- package/dist/daemon/reconcilers/managed-worktree-sweep.js +1 -202
- package/dist/daemon/reconcilers/node-deadline.js +1 -82
- package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -172
- package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.js +1 -59
- package/dist/daemon/reconcilers/node-lifecycle/terminating.js +1 -12
- package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -146
- package/dist/daemon/reconcilers/node-lifecycle/wants-execution.js +1 -11
- package/dist/daemon/reconcilers/pending-review-submit.js +1 -36
- package/dist/daemon/reconcilers/storage-maintenance.js +1 -207
- package/dist/daemon/review/comment-notify.js +2 -109
- package/dist/daemon/review/companion.js +1 -29
- package/dist/daemon/review/deliver.js +3 -8
- package/dist/daemon/review/finish.js +1 -122
- package/dist/daemon/review/sweep.js +1 -18
- package/dist/daemon/startup-policy.js +1 -1
- package/dist/daemon/supervise-cadence.js +1 -6
- package/dist/hook-authoring.js +5 -447
- package/dist/hook-process.js +1 -34
- package/dist/index.js +1 -52
- package/dist/migrations/001-surfaces-frontmatter.js +1 -161
- package/dist/migrations/002-profile-project-memory.js +1 -72
- package/dist/migrations/003-repository-root-memory-identity/front-door.js +11 -231
- package/dist/migrations/003-repository-root-memory-identity/index.js +5 -513
- package/dist/migrations/003-repository-root-memory-identity/references.js +5 -469
- package/dist/migrations/003-repository-root-memory-identity/repository-facts.js +3 -349
- package/dist/migrations/activation.js +2 -89
- package/dist/migrations/convergent.js +2 -82
- package/dist/migrations/corpus.js +3 -483
- package/dist/migrations/frontmatter-splice.js +8 -176
- package/dist/migrations/profile-manifests.js +2 -70
- package/dist/migrations/registry.js +1 -42
- package/dist/migrations/runner.js +1 -85
- package/dist/migrations/types.js +0 -24
- package/dist/pi-extensions/broker-local.js +2 -106
- package/dist/pi-extensions/canvas-bash-valve.js +7 -461
- package/dist/pi-extensions/canvas-context-intro.js +2 -113
- package/dist/pi-extensions/canvas-doc-substrate.js +9 -178
- package/dist/pi-extensions/canvas-goal-capture.js +1 -83
- package/dist/pi-extensions/canvas-inbox-watcher.js +1 -1010
- package/dist/pi-extensions/canvas-passive-context.js +14 -203
- package/dist/pi-extensions/canvas-preview-result.js +2 -72
- package/dist/pi-extensions/canvas-prompt-scrub.js +2 -54
- package/dist/pi-extensions/canvas-recap.js +11 -405
- package/dist/pi-extensions/canvas-review-boundary.js +3 -63
- package/dist/pi-extensions/canvas-stamp.js +2 -77
- package/dist/pi-extensions/canvas-stophook.js +1 -643
- package/dist/pi-extensions/canvas-structured-output.js +13 -35
- package/dist/pi-extensions/canvas-tool-guide.js +9 -78
- package/dist/pi-extensions/envelope-merge.js +8 -29
- package/dist/prompts/review.js +20 -42
- package/dist/shared/birth-announcement.js +1 -25
- package/dist/shared/crtr-version.js +1 -18
- package/dist/shared/env.js +1 -214
- package/dist/shared/generated-context.js +11 -226
- package/dist/shared/predicates.js +1 -4
- package/dist/shared/shell-quote.js +1 -5
- package/dist/shared/tool-groups.js +1 -64
- package/dist/shared/working-activity.js +1 -27
- package/dist/suppress-experimental-warnings.js +1 -15
- package/dist/types.js +1 -185
- package/docs/public-api.md +10 -9
- package/package.json +6 -4
- package/runtime.lock.json +5 -5
- package/scripts/pack-minify.mjs +108 -0
- package/dist/api/__tests__/integration/client.test.d.ts +0 -1
- package/dist/api/__tests__/integration/client.test.js +0 -163
- package/dist/builtin-pi-packages/pi-crtr-extensions/__tests__/insights-active-init.test.ts +0 -98
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-commands.test.ts +0 -93
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/integration/provider-rotation.test.ts +0 -2530
- package/dist/clients/__tests__/helpers/human-daemon.d.ts +0 -11
- package/dist/clients/__tests__/helpers/human-daemon.js +0 -60
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +0 -97
- package/dist/clients/attach/__tests__/bash-call-width.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/bash-call-width.test.js +0 -38
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +0 -175
- package/dist/clients/attach/__tests__/completion-frecency.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/completion-frecency.test.js +0 -35
- package/dist/clients/attach/__tests__/context-message.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/context-message.test.js +0 -130
- package/dist/clients/attach/__tests__/crtr-output.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/crtr-output.test.js +0 -68
- package/dist/clients/attach/__tests__/diagram.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/diagram.test.js +0 -42
- package/dist/clients/attach/__tests__/edit-diff.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/edit-diff.test.js +0 -31
- package/dist/clients/attach/__tests__/frame-selection.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/frame-selection.test.js +0 -84
- package/dist/clients/attach/__tests__/group-activity.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/group-activity.test.js +0 -165
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +0 -83
- package/dist/clients/attach/__tests__/pane-tag-successor.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/pane-tag-successor.test.js +0 -56
- package/dist/clients/attach/__tests__/profile-files.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/profile-files.test.js +0 -21
- package/dist/clients/attach/__tests__/prompt-preview.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/prompt-preview.test.js +0 -21
- package/dist/clients/attach/__tests__/ref-autocomplete.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +0 -64
- package/dist/clients/attach/__tests__/titled-editor-paste.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/titled-editor-paste.test.js +0 -114
- package/dist/clients/attach/__tests__/titled-editor-preview.test.d.ts +0 -1
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +0 -83
- package/dist/clients/inbox/__tests__/integration/inbox-controller.test.d.ts +0 -1
- package/dist/clients/inbox/__tests__/integration/inbox-controller.test.js +0 -81
- package/dist/clients/inbox/__tests__/integration/mount-panel.test.d.ts +0 -1
- package/dist/clients/inbox/__tests__/integration/mount-panel.test.js +0 -135
- package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.d.ts +0 -1
- package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.js +0 -66
- package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.d.ts +0 -1
- package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +0 -35
- package/dist/clients/inbox/review/__tests__/review-core.test.d.ts +0 -1
- package/dist/clients/inbox/review/__tests__/review-core.test.js +0 -52
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.d.ts +0 -1
- package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +0 -100
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.d.ts +0 -1
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +0 -69
- package/dist/commands/__tests__/human.test.d.ts +0 -1
- package/dist/commands/__tests__/human.test.js +0 -172
- package/dist/commands/__tests__/integration/dashboard-snapshot.test.d.ts +0 -1
- package/dist/commands/__tests__/integration/dashboard-snapshot.test.js +0 -237
- package/dist/commands/__tests__/integration/migrate.test.d.ts +0 -1
- package/dist/commands/__tests__/integration/migrate.test.js +0 -1330
- package/dist/commands/__tests__/node-message.test.d.ts +0 -1
- package/dist/commands/__tests__/node-message.test.js +0 -112
- package/dist/commands/__tests__/node-new.test.d.ts +0 -1
- package/dist/commands/__tests__/node-new.test.js +0 -58
- package/dist/commands/__tests__/revive-now-gate.test.d.ts +0 -1
- package/dist/commands/__tests__/revive-now-gate.test.js +0 -62
- package/dist/commands/__tests__/seam/daemon-status.test.d.ts +0 -1
- package/dist/commands/__tests__/seam/daemon-status.test.js +0 -29
- package/dist/commands/__tests__/surface-reload-target.test.d.ts +0 -1
- package/dist/commands/__tests__/surface-reload-target.test.js +0 -21
- package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.js +0 -379
- package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.js +0 -124
- package/dist/commands/memory/__tests__/repository-root-lint.test.d.ts +0 -1
- package/dist/commands/memory/__tests__/repository-root-lint.test.js +0 -148
- package/dist/commands/sys/__tests__/config-model-ladders.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/config-model-ladders.test.js +0 -114
- package/dist/commands/sys/__tests__/setup-core.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/setup-core.test.js +0 -45
- package/dist/commands/sys/__tests__/sync-project-guidance.test.d.ts +0 -1
- package/dist/commands/sys/__tests__/sync-project-guidance.test.js +0 -244
- package/dist/core/__tests__/bash-guard.test.d.ts +0 -1
- package/dist/core/__tests__/bash-guard.test.js +0 -190
- package/dist/core/__tests__/boot-fault-attempt.test.d.ts +0 -1
- package/dist/core/__tests__/boot-fault-attempt.test.js +0 -105
- package/dist/core/__tests__/boot.test.d.ts +0 -1
- package/dist/core/__tests__/boot.test.js +0 -274
- package/dist/core/__tests__/branded-host-concurrency.test.d.ts +0 -1
- package/dist/core/__tests__/branded-host-concurrency.test.js +0 -72
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.d.ts +0 -1
- package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +0 -75
- package/dist/core/__tests__/broker-launch-candidates.test.d.ts +0 -1
- package/dist/core/__tests__/broker-launch-candidates.test.js +0 -311
- package/dist/core/__tests__/broker-preflight.test.d.ts +0 -1
- package/dist/core/__tests__/broker-preflight.test.js +0 -95
- package/dist/core/__tests__/broker-stream-watchdog-floor.test.d.ts +0 -1
- package/dist/core/__tests__/broker-stream-watchdog-floor.test.js +0 -82
- package/dist/core/__tests__/broker-turn-admission.test.d.ts +0 -1
- package/dist/core/__tests__/broker-turn-admission.test.js +0 -44
- package/dist/core/__tests__/canvas-db-boundary.test.d.ts +0 -1
- package/dist/core/__tests__/canvas-db-boundary.test.js +0 -46
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.d.ts +0 -1
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +0 -710
- package/dist/core/__tests__/canvas-inbox-watcher-naming.test.d.ts +0 -1
- package/dist/core/__tests__/canvas-inbox-watcher-naming.test.js +0 -310
- package/dist/core/__tests__/canvas-inbox-watcher.test.d.ts +0 -1
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +0 -397
- package/dist/core/__tests__/canvas.test.d.ts +0 -1
- package/dist/core/__tests__/canvas.test.js +0 -138
- package/dist/core/__tests__/child-death-wake.test.d.ts +0 -1
- package/dist/core/__tests__/child-death-wake.test.js +0 -153
- package/dist/core/__tests__/cli-help-contract.test.d.ts +0 -1
- package/dist/core/__tests__/cli-help-contract.test.js +0 -152
- package/dist/core/__tests__/close.test.d.ts +0 -1
- package/dist/core/__tests__/close.test.js +0 -284
- package/dist/core/__tests__/collectible.test.d.ts +0 -1
- package/dist/core/__tests__/collectible.test.js +0 -89
- package/dist/core/__tests__/config-change-delta.test.d.ts +0 -1
- package/dist/core/__tests__/config-change-delta.test.js +0 -108
- package/dist/core/__tests__/context-intro.test.d.ts +0 -1
- package/dist/core/__tests__/context-intro.test.js +0 -123
- package/dist/core/__tests__/cron-armed-context-failure.test.d.ts +0 -1
- package/dist/core/__tests__/cron-armed-context-failure.test.js +0 -150
- package/dist/core/__tests__/cron-held-settlement.test.d.ts +0 -1
- package/dist/core/__tests__/cron-held-settlement.test.js +0 -240
- package/dist/core/__tests__/cron-node-sink-parked-root.test.d.ts +0 -1
- package/dist/core/__tests__/cron-node-sink-parked-root.test.js +0 -166
- package/dist/core/__tests__/cron-self-cancel-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/cron-self-cancel-delivery.test.js +0 -84
- package/dist/core/__tests__/cron-timeout-descendants.test.d.ts +0 -1
- package/dist/core/__tests__/cron-timeout-descendants.test.js +0 -114
- package/dist/core/__tests__/daemon-boot.test.d.ts +0 -1
- package/dist/core/__tests__/daemon-boot.test.js +0 -422
- package/dist/core/__tests__/daemon-wedge.test.d.ts +0 -1
- package/dist/core/__tests__/daemon-wedge.test.js +0 -106
- package/dist/core/__tests__/dead-node-policy-table.test.d.ts +0 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +0 -77
- package/dist/core/__tests__/events-contract.test.d.ts +0 -1
- package/dist/core/__tests__/events-contract.test.js +0 -76
- package/dist/core/__tests__/extension-abort.test.d.ts +0 -1
- package/dist/core/__tests__/extension-abort.test.js +0 -21
- package/dist/core/__tests__/fault-classifier.test.d.ts +0 -1
- package/dist/core/__tests__/fault-classifier.test.js +0 -138
- package/dist/core/__tests__/fixtures/api-server-host.d.ts +0 -1
- package/dist/core/__tests__/fixtures/api-server-host.js +0 -47
- package/dist/core/__tests__/fixtures/c3-custom-provider-ext.d.ts +0 -2
- package/dist/core/__tests__/fixtures/c3-custom-provider-ext.js +0 -34
- package/dist/core/__tests__/fixtures/c5-command-boundary-ext.d.ts +0 -2
- package/dist/core/__tests__/fixtures/c5-command-boundary-ext.js +0 -32
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +0 -347
- package/dist/core/__tests__/fixtures/fake-engine.js +0 -1509
- package/dist/core/__tests__/fixtures/fake-pi-host.d.ts +0 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +0 -311
- package/dist/core/__tests__/fixtures/memory-slash-live-probe.d.ts +0 -1
- package/dist/core/__tests__/fixtures/memory-slash-live-probe.js +0 -75
- package/dist/core/__tests__/fixtures/metadata-migration-race.d.ts +0 -1
- package/dist/core/__tests__/fixtures/metadata-migration-race.js +0 -49
- package/dist/core/__tests__/focuses.test.d.ts +0 -1
- package/dist/core/__tests__/focuses.test.js +0 -113
- package/dist/core/__tests__/fs-utils.test.d.ts +0 -1
- package/dist/core/__tests__/fs-utils.test.js +0 -50
- package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -43
- package/dist/core/__tests__/helpers/broker-clients.js +0 -174
- package/dist/core/__tests__/helpers/fleet.d.ts +0 -12
- package/dist/core/__tests__/helpers/fleet.js +0 -50
- package/dist/core/__tests__/helpers/harness.d.ts +0 -124
- package/dist/core/__tests__/helpers/harness.js +0 -806
- package/dist/core/__tests__/helpers/viewer-panes.d.ts +0 -12
- package/dist/core/__tests__/helpers/viewer-panes.js +0 -133
- package/dist/core/__tests__/history-inbox.test.d.ts +0 -1
- package/dist/core/__tests__/history-inbox.test.js +0 -121
- package/dist/core/__tests__/human-action-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/human-action-delivery.test.js +0 -162
- package/dist/core/__tests__/human-actions.test.d.ts +0 -1
- package/dist/core/__tests__/human-actions.test.js +0 -120
- package/dist/core/__tests__/inline-memory-refs.test.d.ts +0 -1
- package/dist/core/__tests__/inline-memory-refs.test.js +0 -225
- package/dist/core/__tests__/integration/broker-fork-seam.test.d.ts +0 -1
- package/dist/core/__tests__/integration/broker-fork-seam.test.js +0 -193
- package/dist/core/__tests__/integration/broker-sdk-wiring.test.d.ts +0 -1
- package/dist/core/__tests__/integration/broker-sdk-wiring.test.js +0 -750
- package/dist/core/__tests__/integration/broker-snapshot-history.test.d.ts +0 -1
- package/dist/core/__tests__/integration/broker-snapshot-history.test.js +0 -288
- package/dist/core/__tests__/integration/broker-wedge-supervision.test.d.ts +0 -1
- package/dist/core/__tests__/integration/broker-wedge-supervision.test.js +0 -103
- package/dist/core/__tests__/integration/command-plugins.test.d.ts +0 -1
- package/dist/core/__tests__/integration/command-plugins.test.js +0 -1200
- package/dist/core/__tests__/integration/deferred-no-wake.test.d.ts +0 -1
- package/dist/core/__tests__/integration/deferred-no-wake.test.js +0 -610
- package/dist/core/__tests__/integration/flagship-lifecycle.test.d.ts +0 -1
- package/dist/core/__tests__/integration/flagship-lifecycle.test.js +0 -264
- package/dist/core/__tests__/integration/fresh-home-commands.test.d.ts +0 -1
- package/dist/core/__tests__/integration/fresh-home-commands.test.js +0 -49
- package/dist/core/__tests__/integration/git-optional-locks.test.d.ts +0 -1
- package/dist/core/__tests__/integration/git-optional-locks.test.js +0 -81
- package/dist/core/__tests__/integration/host-teardown-process-group.test.d.ts +0 -1
- package/dist/core/__tests__/integration/host-teardown-process-group.test.js +0 -480
- package/dist/core/__tests__/integration/lifecycle-hooks.test.d.ts +0 -1
- package/dist/core/__tests__/integration/lifecycle-hooks.test.js +0 -498
- package/dist/core/__tests__/integration/live-mutation-verbs.test.d.ts +0 -1
- package/dist/core/__tests__/integration/live-mutation-verbs.test.js +0 -180
- package/dist/core/__tests__/integration/live-mutation.test.d.ts +0 -1
- package/dist/core/__tests__/integration/live-mutation.test.js +0 -173
- package/dist/core/__tests__/integration/plugin-revalidate.test.d.ts +0 -1
- package/dist/core/__tests__/integration/plugin-revalidate.test.js +0 -359
- package/dist/core/__tests__/integration/profile-pause.test.d.ts +0 -1
- package/dist/core/__tests__/integration/profile-pause.test.js +0 -115
- package/dist/core/__tests__/integration/refresh-stall-recycle.test.d.ts +0 -1
- package/dist/core/__tests__/integration/refresh-stall-recycle.test.js +0 -151
- package/dist/core/__tests__/integration/revive.test.d.ts +0 -1
- package/dist/core/__tests__/integration/revive.test.js +0 -615
- package/dist/core/__tests__/integration/spawn-root.test.d.ts +0 -1
- package/dist/core/__tests__/integration/spawn-root.test.js +0 -536
- package/dist/core/__tests__/integration/subscription-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/integration/subscription-delivery.test.js +0 -132
- package/dist/core/__tests__/integration/tmux-surface.test.d.ts +0 -1
- package/dist/core/__tests__/integration/tmux-surface.test.js +0 -330
- package/dist/core/__tests__/integration/worktree-land.test.d.ts +0 -1
- package/dist/core/__tests__/integration/worktree-land.test.js +0 -607
- package/dist/core/__tests__/integration/worktree-reap.test.d.ts +0 -1
- package/dist/core/__tests__/integration/worktree-reap.test.js +0 -842
- package/dist/core/__tests__/kickoff.test.d.ts +0 -1
- package/dist/core/__tests__/kickoff.test.js +0 -196
- package/dist/core/__tests__/lifecycle-terminal-reasons.test.d.ts +0 -1
- package/dist/core/__tests__/lifecycle-terminal-reasons.test.js +0 -62
- package/dist/core/__tests__/lifecycle.test.d.ts +0 -1
- package/dist/core/__tests__/lifecycle.test.js +0 -176
- package/dist/core/__tests__/live-lifecycle-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/live-lifecycle-prompt.test.js +0 -63
- package/dist/core/__tests__/memory-resolver-precedence.test.d.ts +0 -1
- package/dist/core/__tests__/memory-resolver-precedence.test.js +0 -228
- package/dist/core/__tests__/migration.test.d.ts +0 -1
- package/dist/core/__tests__/migration.test.js +0 -946
- package/dist/core/__tests__/model-pin-durability.test.d.ts +0 -1
- package/dist/core/__tests__/model-pin-durability.test.js +0 -195
- package/dist/core/__tests__/model-routes-config.test.d.ts +0 -1
- package/dist/core/__tests__/model-routes-config.test.js +0 -150
- package/dist/core/__tests__/nested-store-discovery.test.d.ts +0 -1
- package/dist/core/__tests__/nested-store-discovery.test.js +0 -89
- package/dist/core/__tests__/node-outcome.test.d.ts +0 -1
- package/dist/core/__tests__/node-outcome.test.js +0 -246
- package/dist/core/__tests__/on-read-crouter-home-fence.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-crouter-home-fence.test.js +0 -66
- package/dist/core/__tests__/on-read-dedup-resume.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-dedup-resume.test.js +0 -132
- package/dist/core/__tests__/on-read-nested-store.test.d.ts +0 -1
- package/dist/core/__tests__/on-read-nested-store.test.js +0 -135
- package/dist/core/__tests__/parse-argv-stdin-secret.test.d.ts +0 -1
- package/dist/core/__tests__/parse-argv-stdin-secret.test.js +0 -68
- package/dist/core/__tests__/passive-subscription.test.d.ts +0 -1
- package/dist/core/__tests__/passive-subscription.test.js +0 -120
- package/dist/core/__tests__/pid-identity-match.test.d.ts +0 -1
- package/dist/core/__tests__/pid-identity-match.test.js +0 -145
- package/dist/core/__tests__/pid-zombie.test.d.ts +0 -1
- package/dist/core/__tests__/pid-zombie.test.js +0 -42
- package/dist/core/__tests__/plugin-kinds.test.d.ts +0 -1
- package/dist/core/__tests__/plugin-kinds.test.js +0 -182
- package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.d.ts +0 -1
- package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.js +0 -43
- package/dist/core/__tests__/plugin-page-components.test.d.ts +0 -1
- package/dist/core/__tests__/plugin-page-components.test.js +0 -159
- package/dist/core/__tests__/preview-mirror-cap.test.d.ts +0 -1
- package/dist/core/__tests__/preview-mirror-cap.test.js +0 -53
- package/dist/core/__tests__/preview-registry-sync.test.d.ts +0 -1
- package/dist/core/__tests__/preview-registry-sync.test.js +0 -107
- package/dist/core/__tests__/profile-project-memory-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/profile-project-memory-delivery.test.js +0 -644
- package/dist/core/__tests__/prospective-inventory-capability-parity.test.d.ts +0 -1
- package/dist/core/__tests__/prospective-inventory-capability-parity.test.js +0 -91
- package/dist/core/__tests__/prune.test.d.ts +0 -1
- package/dist/core/__tests__/prune.test.js +0 -243
- package/dist/core/__tests__/push-final-guard.test.d.ts +0 -1
- package/dist/core/__tests__/push-final-guard.test.js +0 -191
- package/dist/core/__tests__/relaunch-root.test.d.ts +0 -1
- package/dist/core/__tests__/relaunch-root.test.js +0 -249
- package/dist/core/__tests__/remote-canvas-target.test.d.ts +0 -1
- package/dist/core/__tests__/remote-canvas-target.test.js +0 -93
- package/dist/core/__tests__/repository-association.test.d.ts +0 -1
- package/dist/core/__tests__/repository-association.test.js +0 -153
- package/dist/core/__tests__/repository-root-identity.test.d.ts +0 -1
- package/dist/core/__tests__/repository-root-identity.test.js +0 -223
- package/dist/core/__tests__/respawn-throttle.test.d.ts +0 -1
- package/dist/core/__tests__/respawn-throttle.test.js +0 -20
- package/dist/core/__tests__/review-model-floor.test.d.ts +0 -1
- package/dist/core/__tests__/review-model-floor.test.js +0 -83
- package/dist/core/__tests__/revive-all.test.d.ts +0 -1
- package/dist/core/__tests__/revive-all.test.js +0 -157
- package/dist/core/__tests__/revive-capacity.test.d.ts +0 -1
- package/dist/core/__tests__/revive-capacity.test.js +0 -184
- package/dist/core/__tests__/revive-parked-fresh.test.d.ts +0 -1
- package/dist/core/__tests__/revive-parked-fresh.test.js +0 -176
- package/dist/core/__tests__/scope-crouter-home-fence.test.d.ts +0 -1
- package/dist/core/__tests__/scope-crouter-home-fence.test.js +0 -55
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +0 -262
- package/dist/core/__tests__/seam/broker-attach-stream.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-attach-stream.test.js +0 -176
- package/dist/core/__tests__/seam/broker-cap-freeze.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-cap-freeze.test.js +0 -155
- package/dist/core/__tests__/seam/broker-crash-teardown.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-crash-teardown.test.js +0 -131
- package/dist/core/__tests__/seam/broker-pane-resolution.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-pane-resolution.test.js +0 -204
- package/dist/core/__tests__/seam/broker-provider-retry.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-provider-retry.test.js +0 -686
- package/dist/core/__tests__/seam/broker-startup-diagnostics.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-startup-diagnostics.test.js +0 -82
- package/dist/core/__tests__/seam/broker-whip-interrupt.test.d.ts +0 -1
- package/dist/core/__tests__/seam/broker-whip-interrupt.test.js +0 -50
- package/dist/core/__tests__/seam/deadline-wake-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/seam/deadline-wake-delivery.test.js +0 -138
- package/dist/core/__tests__/seam/dormancy-release.test.d.ts +0 -1
- package/dist/core/__tests__/seam/dormancy-release.test.js +0 -516
- package/dist/core/__tests__/seam/held-deferred-human-prompt.test.d.ts +0 -1
- package/dist/core/__tests__/seam/held-deferred-human-prompt.test.js +0 -65
- package/dist/core/__tests__/seam/inbox-reference-guidance.test.d.ts +0 -1
- package/dist/core/__tests__/seam/inbox-reference-guidance.test.js +0 -84
- package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.d.ts +0 -1
- package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.js +0 -160
- package/dist/core/__tests__/seam/node-outcome-delivery.test.d.ts +0 -1
- package/dist/core/__tests__/seam/node-outcome-delivery.test.js +0 -177
- package/dist/core/__tests__/seam/prospective-inventory-stdout.test.d.ts +0 -1
- package/dist/core/__tests__/seam/prospective-inventory-stdout.test.js +0 -31
- package/dist/core/__tests__/seam/reopen-invalidated-worktree.test.d.ts +0 -1
- package/dist/core/__tests__/seam/reopen-invalidated-worktree.test.js +0 -60
- package/dist/core/__tests__/seam/self-close-teardown.test.d.ts +0 -1
- package/dist/core/__tests__/seam/self-close-teardown.test.js +0 -49
- package/dist/core/__tests__/seam/yield-refresh-transaction.test.d.ts +0 -1
- package/dist/core/__tests__/seam/yield-refresh-transaction.test.js +0 -100
- package/dist/core/__tests__/secrets.test.d.ts +0 -1
- package/dist/core/__tests__/secrets.test.js +0 -49
- package/dist/core/__tests__/self-update.test.d.ts +0 -1
- package/dist/core/__tests__/self-update.test.js +0 -46
- package/dist/core/__tests__/session-branch.test.d.ts +0 -1
- package/dist/core/__tests__/session-branch.test.js +0 -61
- package/dist/core/__tests__/session-cycles.test.d.ts +0 -1
- package/dist/core/__tests__/session-cycles.test.js +0 -133
- package/dist/core/__tests__/session-model.test.d.ts +0 -1
- package/dist/core/__tests__/session-model.test.js +0 -111
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.d.ts +0 -1
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +0 -71
- package/dist/core/__tests__/stdin-body-no-discard.test.d.ts +0 -1
- package/dist/core/__tests__/stdin-body-no-discard.test.js +0 -33
- package/dist/core/__tests__/stdout-errors.test.d.ts +0 -1
- package/dist/core/__tests__/stdout-errors.test.js +0 -16
- package/dist/core/__tests__/stop-guard.test.d.ts +0 -1
- package/dist/core/__tests__/stop-guard.test.js +0 -237
- package/dist/core/__tests__/stream-watchdog.test.d.ts +0 -1
- package/dist/core/__tests__/stream-watchdog.test.js +0 -154
- package/dist/core/__tests__/subscription-pool-credential-guard.test.d.ts +0 -1
- package/dist/core/__tests__/subscription-pool-credential-guard.test.js +0 -95
- package/dist/core/__tests__/tmux-driver-boundary.test.d.ts +0 -1
- package/dist/core/__tests__/tmux-driver-boundary.test.js +0 -50
- package/dist/core/__tests__/warm-claim-preference-snapshot.test.d.ts +0 -1
- package/dist/core/__tests__/warm-claim-preference-snapshot.test.js +0 -54
- package/dist/core/__tests__/worktree-landing.test.d.ts +0 -1
- package/dist/core/__tests__/worktree-landing.test.js +0 -11
- package/dist/core/__tests__/yield-ensures-daemon.test.d.ts +0 -1
- package/dist/core/__tests__/yield-ensures-daemon.test.js +0 -55
- package/dist/core/broker-client/__tests__/transport-relay.test.d.ts +0 -1
- package/dist/core/broker-client/__tests__/transport-relay.test.js +0 -214
- package/dist/core/broker-client/__tests__/transport-socket.test.d.ts +0 -1
- package/dist/core/broker-client/__tests__/transport-socket.test.js +0 -73
- package/dist/core/canvas/__tests__/attention.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/attention.test.js +0 -83
- package/dist/core/canvas/__tests__/history-transcript.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/history-transcript.test.js +0 -102
- package/dist/core/canvas/__tests__/remote-canvas-source.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +0 -328
- package/dist/core/canvas/__tests__/remote-transport.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/remote-transport.test.js +0 -97
- package/dist/core/canvas/__tests__/render-remote.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/render-remote.test.js +0 -243
- package/dist/core/canvas/__tests__/session-window.test.d.ts +0 -1
- package/dist/core/canvas/__tests__/session-window.test.js +0 -70
- package/dist/core/feed/__tests__/inbox-migrate.test.d.ts +0 -1
- package/dist/core/feed/__tests__/inbox-migrate.test.js +0 -49
- package/dist/core/human/__tests__/page-catalog.test.d.ts +0 -1
- package/dist/core/human/__tests__/page-catalog.test.js +0 -20
- package/dist/core/human/__tests__/page-html-markdown.test.d.ts +0 -1
- package/dist/core/human/__tests__/page-html-markdown.test.js +0 -48
- package/dist/core/human/__tests__/page.test.d.ts +0 -1
- package/dist/core/human/__tests__/page.test.js +0 -92
- package/dist/core/keybindings/__tests__/resolve.test.d.ts +0 -1
- package/dist/core/keybindings/__tests__/resolve.test.js +0 -171
- package/dist/core/profiles/__tests__/env-store.test.d.ts +0 -1
- package/dist/core/profiles/__tests__/env-store.test.js +0 -99
- package/dist/core/profiles/__tests__/fuzzy-match.test.d.ts +0 -1
- package/dist/core/profiles/__tests__/fuzzy-match.test.js +0 -51
- package/dist/core/profiles/__tests__/root-profile.test.d.ts +0 -1
- package/dist/core/profiles/__tests__/root-profile.test.js +0 -59
- package/dist/core/review/__tests__/capture-origin.test.d.ts +0 -1
- package/dist/core/review/__tests__/capture-origin.test.js +0 -150
- package/dist/core/review/__tests__/comments.test.d.ts +0 -1
- package/dist/core/review/__tests__/comments.test.js +0 -116
- package/dist/core/review/__tests__/remap.test.d.ts +0 -1
- package/dist/core/review/__tests__/remap.test.js +0 -177
- package/dist/core/review/__tests__/stage-identity.test.d.ts +0 -1
- package/dist/core/review/__tests__/stage-identity.test.js +0 -150
- package/dist/core/runtime/__tests__/engine-route.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/engine-route.test.js +0 -36
- package/dist/core/runtime/__tests__/install-id-cache-scoping.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/install-id-cache-scoping.test.js +0 -45
- package/dist/core/runtime/__tests__/node-env.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/node-env.test.js +0 -73
- package/dist/core/runtime/__tests__/spawn-env.test.d.ts +0 -1
- package/dist/core/runtime/__tests__/spawn-env.test.js +0 -259
- package/dist/core/substrate/__tests__/surface-match-command.test.d.ts +0 -1
- package/dist/core/substrate/__tests__/surface-match-command.test.js +0 -89
- package/dist/core/substrate/__tests__/surface-match-memory-read.test.d.ts +0 -1
- package/dist/core/substrate/__tests__/surface-match-memory-read.test.js +0 -28
- package/dist/core/substrate/__tests__/surface-match-pre-command.test.d.ts +0 -1
- package/dist/core/substrate/__tests__/surface-match-pre-command.test.js +0 -92
- package/dist/daemon/__tests__/autostart-storm.test.d.ts +0 -1
- package/dist/daemon/__tests__/autostart-storm.test.js +0 -128
- package/dist/daemon/__tests__/broker-ownership.test.d.ts +0 -1
- package/dist/daemon/__tests__/broker-ownership.test.js +0 -25
- package/dist/daemon/__tests__/daemon-ownership.test.d.ts +0 -1
- package/dist/daemon/__tests__/daemon-ownership.test.js +0 -27
- package/dist/daemon/__tests__/helpers/source-daemon.d.ts +0 -30
- package/dist/daemon/__tests__/helpers/source-daemon.js +0 -176
- package/dist/daemon/__tests__/integration/api-startup-readiness.test.d.ts +0 -1
- package/dist/daemon/__tests__/integration/api-startup-readiness.test.js +0 -83
- package/dist/daemon/__tests__/integration/migration-startup.test.d.ts +0 -1
- package/dist/daemon/__tests__/integration/migration-startup.test.js +0 -127
- package/dist/daemon/__tests__/node-deadline-lane.test.d.ts +0 -1
- package/dist/daemon/__tests__/node-deadline-lane.test.js +0 -77
- package/dist/daemon/__tests__/node-outcome-birth-invariants.test.d.ts +0 -1
- package/dist/daemon/__tests__/node-outcome-birth-invariants.test.js +0 -146
- package/dist/daemon/__tests__/node-outcome-delivery.test.d.ts +0 -1
- package/dist/daemon/__tests__/node-outcome-delivery.test.js +0 -116
- package/dist/daemon/__tests__/reconciler-signature.test.d.ts +0 -1
- package/dist/daemon/__tests__/reconciler-signature.test.js +0 -37
- package/dist/daemon/__tests__/subtree-filter-freshness.test.d.ts +0 -1
- package/dist/daemon/__tests__/subtree-filter-freshness.test.js +0 -63
- package/dist/daemon/__tests__/thaw-order.test.d.ts +0 -1
- package/dist/daemon/__tests__/thaw-order.test.js +0 -55
- package/dist/daemon/api/__tests__/bridge-heartbeat.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/bridge-heartbeat.test.js +0 -58
- package/dist/daemon/api/__tests__/broker-settle-park.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/broker-settle-park.test.js +0 -175
- package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.js +0 -216
- package/dist/daemon/api/__tests__/error-seam.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/error-seam.test.js +0 -83
- package/dist/daemon/api/__tests__/model-config.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/model-config.test.js +0 -73
- package/dist/daemon/api/__tests__/node-create-description.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/node-create-description.test.js +0 -127
- package/dist/daemon/api/__tests__/node-model-validation.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/node-model-validation.test.js +0 -183
- package/dist/daemon/api/__tests__/nodes-activity-query.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/nodes-activity-query.test.js +0 -99
- package/dist/daemon/api/__tests__/profile-launch-gates.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/profile-launch-gates.test.js +0 -172
- package/dist/daemon/api/__tests__/profile-metadata-route.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/profile-metadata-route.test.js +0 -95
- package/dist/daemon/api/__tests__/reopen-delivery.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/reopen-delivery.test.js +0 -260
- package/dist/daemon/api/__tests__/seam/api-server.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/api-server.test.js +0 -442
- package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.js +0 -310
- package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.js +0 -351
- package/dist/daemon/api/__tests__/seam/node-outcome-api.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/node-outcome-api.test.js +0 -159
- package/dist/daemon/api/__tests__/seam/profile-delete.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/seam/profile-delete.test.js +0 -372
- package/dist/daemon/api/__tests__/submit-result.test.d.ts +0 -1
- package/dist/daemon/api/__tests__/submit-result.test.js +0 -215
- package/dist/migrations/__tests__/activation-concurrency.test.d.ts +0 -1
- package/dist/migrations/__tests__/activation-concurrency.test.js +0 -146
- package/dist/migrations/__tests__/activation.test.d.ts +0 -1
- package/dist/migrations/__tests__/activation.test.js +0 -152
- package/dist/migrations/__tests__/deletion-and-root-declaration.test.d.ts +0 -1
- package/dist/migrations/__tests__/deletion-and-root-declaration.test.js +0 -149
- package/dist/pi-extensions/__tests__/canvas-bash-valve.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-bash-valve.test.js +0 -86
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +0 -364
- package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.js +0 -106
- package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +0 -62
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +0 -432
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +0 -152
- package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +0 -88
- package/dist/pi-extensions/__tests__/canvas-tool-guide.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/canvas-tool-guide.test.js +0 -96
- package/dist/pi-extensions/__tests__/integration/canvas-bash-valve.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/integration/canvas-bash-valve.test.js +0 -133
- package/dist/pi-extensions/__tests__/pre-command-gate.test.d.ts +0 -1
- package/dist/pi-extensions/__tests__/pre-command-gate.test.js +0 -232
- package/dist/shared/__tests__/env-boundary.test.d.ts +0 -1
- package/dist/shared/__tests__/env-boundary.test.js +0 -95
- package/dist/shared/__tests__/generated-context-grammar.test.d.ts +0 -1
- package/dist/shared/__tests__/generated-context-grammar.test.js +0 -80
- package/docs/compat/hearth-crtr-v1.md +0 -179
- package/docs/compat/hearth-crtr-v2.md +0 -177
- package/docs/compat/hearth-crtr-v3.md +0 -176
- package/docs/compat/hearth-crtr-v4.md +0 -182
- package/docs/compat/hearth-crtr-v5.md +0 -169
package/dist/daemon/crtrd.js
CHANGED
|
@@ -1,854 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
// clock. A broker's real `exit` event enqueues an exit-policy job on the
|
|
10
|
-
// daemon's serial work lane (never inline on the Node event callback), where
|
|
11
|
-
// classifyDeadNode — one pure 8-row policy table over durable row state —
|
|
12
|
-
// decides forget / dormant / respawn / boot-failure. The row-driven tick
|
|
13
|
-
// classifies disconnected rows through the same table. Every broker's argv is
|
|
14
|
-
// stamped `--epoch <id>`: at boot the census reaps every prior-epoch broker
|
|
15
|
-
// (no adoption), and at shutdown the daemon tears its whole fleet down, so no
|
|
16
|
-
// broker ever outlives the daemon epoch that launched it. A tmux pane, when
|
|
17
|
-
// present, is only a VIEWER of the engine and never hosts it; a viewer window
|
|
18
|
-
// closing is not a node death.
|
|
19
|
-
//
|
|
20
|
-
// §H refresh-authority: a stale in-process stophook (pi extensions never reload,
|
|
21
|
-
// so a days-old resident carries an old hook) can leave intent='refresh' on a
|
|
22
|
-
// LIVE engine forever — the hook never calls shutdown, so no exit event arrives.
|
|
23
|
-
// The daemon is the authority: when intent='refresh' persists on a fleet-owned
|
|
24
|
-
// live engine whose turn is over, past a grace, it force-kills the engine itself
|
|
25
|
-
// (handleYieldStall); the resulting exit-policy job respawns it fresh.
|
|
26
|
-
//
|
|
27
|
-
// An engine whose turn ends with stopReason 'error' (e.g. a provider outage
|
|
28
|
-
// exhausted the SDK retry budget) is left parked by the stophook ("stay alive
|
|
29
|
-
// for re-steering") — but a headless node has no human to re-steer it, so the
|
|
30
|
-
// broker stays alive and status stays 'active'. The daemon is the authority here
|
|
31
|
-
// too: when a live, not-busy node with no pending intent has a session file that
|
|
32
|
-
// is quiet past the recovery window and whose last assistant message stops with
|
|
33
|
-
// 'error', the daemon keeps the live broker parked and retries it via the
|
|
34
|
-
// inbox-based fault-recovery pass; no out-of-band launch is needed.
|
|
35
|
-
// An exit-policy respawn requests a cycle for an interrupted busy turn and a
|
|
36
|
-
// strict resume otherwise. reviveNode centrally arbitrates either preference
|
|
37
|
-
// against durable pending-refresh state.
|
|
38
|
-
//
|
|
39
|
-
// Single-instance guarantee
|
|
40
|
-
// A snapshot-conditioned canvas claim authorizes exactly one daemon to bind
|
|
41
|
-
// its event source. The PID file is a readiness mirror for external managers,
|
|
42
|
-
// scoped by CRTR_PIDFILE in managed deployments and crtrHome()/crtrd.pid
|
|
43
|
-
// otherwise. Shutdown quiesces admitted work, removes only this invocation's
|
|
44
|
-
// mirror, and then releases its exact claim.
|
|
45
|
-
import { writeFileSync, readFileSync, rmSync, mkdirSync, } from 'node:fs';
|
|
46
|
-
import { dirname } from 'node:path';
|
|
47
|
-
import { randomBytes } from 'node:crypto';
|
|
48
|
-
import { crtrHome } from '../core/canvas/paths.js';
|
|
49
|
-
import { listNodeMemoryTargets, listNodes, } from '../core/canvas/index.js';
|
|
50
|
-
import { createApiServer } from './api/server.js';
|
|
51
|
-
import { reconcileUndeliveredTickets } from './human/sweep.js';
|
|
52
|
-
import { resetHandedOffDeliveries } from '../core/canvas/deliveries.js';
|
|
53
|
-
import { sweepReviews } from './review/sweep.js';
|
|
54
|
-
import { pidfilePath } from './pidfile.js';
|
|
55
|
-
import { rendererWarning } from '../core/runtime/package-health.js';
|
|
56
|
-
import { DEFAULT_INTERVAL_MS } from './supervise-cadence.js';
|
|
57
|
-
import { BrokerSupervisionReconciler } from './reconcilers/broker-supervision.js';
|
|
58
|
-
import { ControllerDeathReconciler } from './reconcilers/controller-death.js';
|
|
59
|
-
import { NodeLifecycleReconciler } from './reconcilers/node-lifecycle/tick.js';
|
|
60
|
-
import { NodeDeadlineReconciler } from './reconcilers/node-deadline.js';
|
|
61
|
-
import { CronLaneReconciler } from './reconcilers/cron-lane.js';
|
|
62
|
-
import { DeliveryLaneReconciler } from './reconcilers/delivery-lane.js';
|
|
63
|
-
import { migrateLegacyExecutionIdentities } from '../core/canvas/executions.js';
|
|
64
|
-
import { PendingReviewSubmitReconciler } from './reconcilers/pending-review-submit.js';
|
|
65
|
-
import { StorageMaintenanceReconciler } from './reconcilers/storage-maintenance.js';
|
|
66
|
-
import { BashDeadlineReconciler } from './reconcilers/bash-deadline.js';
|
|
67
|
-
import { captureLivenessSnapshot, capturePidCommand, captureTeardownSnapshot, isPidAlive, isAnyPidAlive, killProcessTreePids, } from '../core/canvas/pid.js';
|
|
68
|
-
import { bindFleet, boundFleet } from '../core/runtime/fleet.js';
|
|
69
|
-
import { bindDaemonControl, clearDaemonControl } from './control.js';
|
|
70
|
-
import { execDaemon, spawnDaemon } from './manage.js';
|
|
71
|
-
import { reconcileAndMigrateBoot } from '../core/canvas/boot.js';
|
|
72
|
-
import { resolveInstallId } from '../core/canvas/install-id.js';
|
|
73
|
-
import { setInstallId } from '../core/runtime/nodes.js';
|
|
74
|
-
import { claimDaemonOwnership, releaseDaemonOwnership } from '../core/canvas/daemon-owner.js';
|
|
75
|
-
import { migrate, openDb } from '../core/canvas/db.js';
|
|
76
|
-
import { prewarmRecentRecipes, reapStaleSpares } from '../core/runtime/warm-pool.js';
|
|
77
|
-
import { DaemonFleet } from './fleet.js';
|
|
78
|
-
import { BOOT_MIGRATIONS } from './boot-migrations.js';
|
|
79
|
-
import { emitEvent } from '../core/events/emit.js';
|
|
80
|
-
import { operationIdContext } from '../core/events/operation-id.js';
|
|
81
|
-
import { bindDaemonEventSource } from '../core/events/source.js';
|
|
82
|
-
import { activateOnDiskMigrations, MigrationBlockedError, runForcedOnDiskMigrations } from '../migrations/activation.js';
|
|
83
|
-
import { profilesRoot, withProfileManifestLock } from '../core/profiles/manifest.js';
|
|
84
|
-
import { runProfileManifestMigrations } from '../migrations/profile-manifests.js';
|
|
85
|
-
import { convertLegacyProviderStore, convertLegacyScopedStore } from '../core/scoped-state/migrate.js';
|
|
86
|
-
import { userScopeRoot } from '../core/scope.js';
|
|
87
|
-
import { piAgentDir } from '../core/runtime/package-health.js';
|
|
88
|
-
// A broker DECLARES its owning canvas in argv at spawn (host.ts launch:
|
|
89
|
-
// `broker-cli.js --canvas-home <home> --epoch <id> <nodeId>`), so ownership is
|
|
90
|
-
// an exact match on this daemon's own canvas home — no path inference. An
|
|
91
|
-
// untagged broker-cli process (a foreign install, a test harness spawning
|
|
92
|
-
// brokers directly) is NOT ours to count or kill; its own canvas' daemon
|
|
93
|
-
// supervises it. Without this scope the startup census would SIGTERM every
|
|
94
|
-
// broker on the machine — a test-fixture daemon in a temp CRTR_HOME would
|
|
95
|
-
// slaughter the real fleet while the real daemon symmetrically reaped the
|
|
96
|
-
// fixture's brokers.
|
|
97
|
-
export function brokerCommandDeclaresCanvasHome(command, home) {
|
|
98
|
-
return command.includes(` --canvas-home ${home} `);
|
|
99
|
-
}
|
|
100
|
-
// Startup epoch census (design flow C step 1): before this daemon writes its
|
|
101
|
-
// readiness mirror, reap every broker of a PRIOR epoch on its own canvas.
|
|
102
|
-
// Ownership is never adopted across epochs — a prior daemon's ChildProcess
|
|
103
|
-
// handles died with it, so its brokers are unsupervisable; tear them down and
|
|
104
|
-
// let the next supervision tick classify their rows through the policy table.
|
|
105
|
-
// A broker whose argv carries NO `--epoch` tag is a legacy-generation
|
|
106
|
-
// broker and gets the same verdict (reap): it predates epoch ownership.
|
|
107
|
-
/** The `--epoch <id>` tag host.ts stamps into every broker's argv, or null
|
|
108
|
-
* for a legacy/untagged broker (which the census treats as prior-epoch). */
|
|
109
|
-
export function brokerCommandEpoch(command) {
|
|
110
|
-
const m = / --epoch (\S+) /.exec(command);
|
|
111
|
-
return m?.[1] ?? null;
|
|
112
|
-
}
|
|
113
|
-
// How long a SIGTERMed prior-epoch broker gets to exit gracefully before the
|
|
114
|
-
// census escalates to a SIGKILL of its captured process tree.
|
|
115
|
-
const PRIOR_EPOCH_TERM_GRACE_MS = 5_000;
|
|
116
|
-
const CENSUS_POLL_MS = 150;
|
|
117
|
-
async function reapPriorEpochBrokers(epoch) {
|
|
118
|
-
const snapshot = captureLivenessSnapshot();
|
|
119
|
-
if (snapshot === null) {
|
|
120
|
-
emitEvent({
|
|
121
|
-
level: 'error',
|
|
122
|
-
event: 'daemon.census.snapshot_failed',
|
|
123
|
-
fields: { invariant: 'prior-epoch brokers are reaped before readiness' },
|
|
124
|
-
});
|
|
125
|
-
throw new Error('prior-epoch broker census could not capture the process table');
|
|
126
|
-
}
|
|
127
|
-
const home = crtrHome();
|
|
128
|
-
const victims = [];
|
|
129
|
-
for (const [pid, processInfo] of snapshot.processes) {
|
|
130
|
-
const command = processInfo.command;
|
|
131
|
-
if (processInfo.zombie || !command.includes('broker-cli.js'))
|
|
132
|
-
continue;
|
|
133
|
-
if (!brokerCommandDeclaresCanvasHome(command, home))
|
|
134
|
-
continue;
|
|
135
|
-
if (brokerCommandEpoch(command) === epoch)
|
|
136
|
-
continue;
|
|
137
|
-
const nodeId = command.trim().split(/\s+/).at(-1) ?? '';
|
|
138
|
-
if (nodeId === '' || nodeId.endsWith('broker-cli.js'))
|
|
139
|
-
continue;
|
|
140
|
-
victims.push({ pid, nodeId });
|
|
141
|
-
}
|
|
142
|
-
// SIGTERM each victim. The snapshot identifies it, but only a fresh command
|
|
143
|
-
// read authorizes signaling: the pid may have been reused since the capture.
|
|
144
|
-
// The teardown snapshot (tree + identities) is taken BEFORE the SIGTERM so a
|
|
145
|
-
// survivor's whole tree can be SIGKILLed without re-walking a dead root.
|
|
146
|
-
let sigtermed = 0;
|
|
147
|
-
const signaled = [];
|
|
148
|
-
for (const victim of victims) {
|
|
149
|
-
const command = capturePidCommand(victim.pid);
|
|
150
|
-
if (command === null || !command.includes('broker-cli.js'))
|
|
151
|
-
continue;
|
|
152
|
-
if (!brokerCommandDeclaresCanvasHome(command, home))
|
|
153
|
-
continue;
|
|
154
|
-
if (brokerCommandEpoch(command) === epoch)
|
|
155
|
-
continue;
|
|
156
|
-
if (command.trim().split(/\s+/).at(-1) !== victim.nodeId)
|
|
157
|
-
continue;
|
|
158
|
-
const snap = captureTeardownSnapshot(victim.pid, null);
|
|
159
|
-
if (snap.reused)
|
|
160
|
-
continue; // positively a different process now — never signal
|
|
161
|
-
try {
|
|
162
|
-
process.kill(victim.pid, 'SIGTERM');
|
|
163
|
-
}
|
|
164
|
-
catch {
|
|
165
|
-
continue; // already gone — nothing was signaled
|
|
166
|
-
}
|
|
167
|
-
sigtermed++;
|
|
168
|
-
signaled.push({ pid: victim.pid, snap });
|
|
169
|
-
}
|
|
170
|
-
// Bounded graceful wait, then SIGKILL each survivor's captured tree.
|
|
171
|
-
const deadline = Date.now() + PRIOR_EPOCH_TERM_GRACE_MS;
|
|
172
|
-
while (Date.now() < deadline && signaled.some((s) => isAnyPidAlive(s.snap.tree.length > 0 ? s.snap.tree : [s.pid]))) {
|
|
173
|
-
await new Promise((resolve) => setTimeout(resolve, CENSUS_POLL_MS));
|
|
174
|
-
}
|
|
175
|
-
let sigkilled = 0;
|
|
176
|
-
for (const s of signaled) {
|
|
177
|
-
const tree = s.snap.tree.length > 0 ? s.snap.tree : [s.pid];
|
|
178
|
-
if (!isAnyPidAlive(tree))
|
|
179
|
-
continue;
|
|
180
|
-
killProcessTreePids(tree, 'SIGKILL', s.snap.identities);
|
|
181
|
-
sigkilled++;
|
|
182
|
-
}
|
|
183
|
-
if (sigkilled > 0)
|
|
184
|
-
await new Promise((resolve) => setTimeout(resolve, CENSUS_POLL_MS));
|
|
185
|
-
// Only a fresh full table sample proves a prior writer is gone.
|
|
186
|
-
const finalSnapshot = captureLivenessSnapshot();
|
|
187
|
-
if (finalSnapshot === null) {
|
|
188
|
-
emitEvent({
|
|
189
|
-
level: 'error',
|
|
190
|
-
event: 'daemon.census.snapshot_failed',
|
|
191
|
-
fields: { invariant: 'prior-epoch brokers are reaped before readiness', stage: 'final' },
|
|
192
|
-
});
|
|
193
|
-
throw new Error('prior-epoch broker census could not capture the final process table');
|
|
194
|
-
}
|
|
195
|
-
const survivors = [];
|
|
196
|
-
for (const [pid, processInfo] of finalSnapshot.processes) {
|
|
197
|
-
const command = processInfo.command;
|
|
198
|
-
if (processInfo.zombie || !command.includes('broker-cli.js'))
|
|
199
|
-
continue;
|
|
200
|
-
if (!brokerCommandDeclaresCanvasHome(command, home))
|
|
201
|
-
continue;
|
|
202
|
-
if (brokerCommandEpoch(command) === epoch)
|
|
203
|
-
continue;
|
|
204
|
-
survivors.push(pid);
|
|
205
|
-
}
|
|
206
|
-
if (survivors.length > 0) {
|
|
207
|
-
throw new Error(`prior-epoch broker census could not prove termination of pid(s): ${survivors.join(', ')}`);
|
|
208
|
-
}
|
|
209
|
-
emitEvent({
|
|
210
|
-
level: 'info',
|
|
211
|
-
event: 'daemon.census.completed',
|
|
212
|
-
fields: { prior_epoch_brokers: victims.length, sigtermed, sigkilled },
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
// Daemon-shutdown fleet teardown (invariant 2: no broker outlives the daemon
|
|
216
|
-
// epoch that launched it). SIGTERM every live entry, race each handle's real
|
|
217
|
-
// exit against ONE shared bounded grace, then SIGKILL each survivor's captured
|
|
218
|
-
// process tree. Rows are deliberately NOT rewritten here — the next daemon's
|
|
219
|
-
// supervision tick classifies them through the policy table, so clean shutdown
|
|
220
|
-
// and crash converge on one recovery path.
|
|
221
|
-
const FLEET_TEARDOWN_GRACE_MS = 5_000;
|
|
222
|
-
async function teardownFleet(fleet) {
|
|
223
|
-
const entries = Array.from(fleet.entries());
|
|
224
|
-
if (entries.length === 0)
|
|
225
|
-
return;
|
|
226
|
-
// Capture each broker's teardown snapshot (tree + identities) BEFORE the
|
|
227
|
-
// SIGTERM — a survivor's whole tree must be SIGKILLable without re-walking a
|
|
228
|
-
// dead root (the kernel reparents children the instant the broker exits).
|
|
229
|
-
const items = entries.map(([, entry]) => ({
|
|
230
|
-
pid: entry.pid,
|
|
231
|
-
snap: captureTeardownSnapshot(entry.pid, null),
|
|
232
|
-
exited: entry.handle.exited,
|
|
233
|
-
}));
|
|
234
|
-
for (const item of items) {
|
|
235
|
-
if (item.snap.reused)
|
|
236
|
-
continue; // positively a different process now — never signal
|
|
237
|
-
try {
|
|
238
|
-
process.kill(item.pid, 'SIGTERM');
|
|
239
|
-
}
|
|
240
|
-
catch {
|
|
241
|
-
/* already gone */
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
// ONE shared unref'd grace timer races every handle's real exit event: the
|
|
245
|
-
// whole teardown is bounded by FLEET_TEARDOWN_GRACE_MS, not grace × fleet.
|
|
246
|
-
const timeout = new Promise((resolve) => {
|
|
247
|
-
const t = setTimeout(resolve, FLEET_TEARDOWN_GRACE_MS);
|
|
248
|
-
t.unref();
|
|
249
|
-
});
|
|
250
|
-
await Promise.allSettled(items.map((item) => Promise.race([item.exited.then(() => { }), timeout])));
|
|
251
|
-
const sigkilled = [];
|
|
252
|
-
for (const item of items) {
|
|
253
|
-
if (!isPidAlive(item.pid))
|
|
254
|
-
continue;
|
|
255
|
-
killProcessTreePids(item.snap.tree.length > 0 ? item.snap.tree : [item.pid], 'SIGKILL', item.snap.identities);
|
|
256
|
-
sigkilled.push(item);
|
|
257
|
-
}
|
|
258
|
-
// A signal only requests termination. The handle's exit promise is the
|
|
259
|
-
// authoritative proof that each escalated broker has exited, so cleanup must
|
|
260
|
-
// not release its daemon ownership claim before these promises settle.
|
|
261
|
-
await Promise.all(sigkilled.map((item) => item.exited));
|
|
262
|
-
emitEvent({
|
|
263
|
-
level: 'info',
|
|
264
|
-
event: 'daemon.fleet_teardown.completed',
|
|
265
|
-
fields: { brokers: items.length, sigkilled: sigkilled.length },
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
// Pidfile
|
|
269
|
-
function writePidfile() {
|
|
270
|
-
// Ensure the pidfile parent exists before writing.
|
|
271
|
-
mkdirSync(dirname(pidfilePath()), { recursive: true });
|
|
272
|
-
writeFileSync(pidfilePath(), String(process.pid), 'utf8');
|
|
273
|
-
}
|
|
274
|
-
function isMissingPathError(error) {
|
|
275
|
-
return typeof error === 'object' && error !== null && error.code === 'ENOENT';
|
|
276
|
-
}
|
|
277
|
-
/** Inspect the readiness mirror and unlink it only while it names `pid`. */
|
|
278
|
-
function removeOwnedPidfileMirror(pid) {
|
|
279
|
-
const path = pidfilePath();
|
|
280
|
-
let raw;
|
|
281
|
-
try {
|
|
282
|
-
raw = readFileSync(path, 'utf8');
|
|
283
|
-
}
|
|
284
|
-
catch (error) {
|
|
285
|
-
if (isMissingPathError(error))
|
|
286
|
-
return;
|
|
287
|
-
throw error;
|
|
288
|
-
}
|
|
289
|
-
if (raw.trim() !== String(pid)) {
|
|
290
|
-
throw new Error(`daemon readiness mirror does not name this invocation (expected pid ${pid})`);
|
|
291
|
-
}
|
|
292
|
-
try {
|
|
293
|
-
rmSync(path);
|
|
294
|
-
}
|
|
295
|
-
catch (error) {
|
|
296
|
-
if (isMissingPathError(error))
|
|
297
|
-
return;
|
|
298
|
-
throw error;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
const directTickLifecycle = {
|
|
302
|
-
acceptsDetachedWork: () => true,
|
|
303
|
-
registerDetached: (work) => {
|
|
304
|
-
void work.catch(() => { });
|
|
305
|
-
},
|
|
306
|
-
};
|
|
307
|
-
const brokerSupervision = new BrokerSupervisionReconciler();
|
|
308
|
-
const controllerDeath = new ControllerDeathReconciler();
|
|
309
|
-
const nodeLifecycle = new NodeLifecycleReconciler();
|
|
310
|
-
const nodeDeadline = new NodeDeadlineReconciler();
|
|
311
|
-
const cronLane = new CronLaneReconciler();
|
|
312
|
-
const deliveryLane = new DeliveryLaneReconciler();
|
|
313
|
-
const pendingReviewSubmit = new PendingReviewSubmitReconciler();
|
|
314
|
-
const storageMaintenance = new StorageMaintenanceReconciler();
|
|
315
|
-
const bashDeadline = new BashDeadlineReconciler();
|
|
316
|
-
/** Supervision tick over the daemon's current live set. */
|
|
317
|
-
export async function superviseTick(now = Date.now(), lifecycle = directTickLifecycle) {
|
|
318
|
-
const fleet = boundFleet();
|
|
319
|
-
// Auth reload must precede the row-list guard: it is fleet-wide and does not
|
|
320
|
-
// depend on a successful canvas scan.
|
|
321
|
-
const thresholds = await brokerSupervision.runFleetPreamble(fleet);
|
|
322
|
-
let rows;
|
|
323
|
-
// A terminal row that still holds a process is the Terminating state, and the
|
|
324
|
-
// lifecycle tick is the only pass that owes it anything.
|
|
325
|
-
let terminating;
|
|
326
|
-
try {
|
|
327
|
-
// Human bridge rows have no broker engine and participate in none of the
|
|
328
|
-
// recurring row-driven reconciler passes.
|
|
329
|
-
rows = listNodes({ status: ['active', 'idle'] }).filter((row) => row.kind !== 'human');
|
|
330
|
-
terminating = listNodes({ status: ['done', 'canceled', 'dead'], withRecordedPidOrFrozen: true })
|
|
331
|
-
.filter((row) => row.kind !== 'human');
|
|
332
|
-
}
|
|
333
|
-
catch (err) {
|
|
334
|
-
emitEvent({ level: 'error', event: 'canvas.node_list.failed', error: err });
|
|
335
|
-
return;
|
|
336
|
-
}
|
|
337
|
-
await brokerSupervision.run(now, { rows, fleet, lifecycle });
|
|
338
|
-
controllerDeath.run(now, { rows });
|
|
339
|
-
const frozen = await nodeLifecycle.run(now, { rows: [...rows, ...terminating], fleet });
|
|
340
|
-
// The universal backstop: a node past its deadline with no outcome is
|
|
341
|
-
// canceled and terminalized here, after the lifecycle pass has had its say.
|
|
342
|
-
nodeDeadline.run(now);
|
|
343
|
-
cronLane.run(now, { lifecycle });
|
|
344
|
-
deliveryLane.run(now, { lifecycle });
|
|
345
|
-
pendingReviewSubmit.run(now, { lifecycle });
|
|
346
|
-
storageMaintenance.run(now, { lifecycle, fleet });
|
|
347
|
-
await bashDeadline.run(now, { rows });
|
|
348
|
-
// Last: the saturation figure is only true once the freeze lane has spent
|
|
349
|
-
// this tick's free slots.
|
|
350
|
-
brokerSupervision.warnIfSaturated({ fleet, lifecycle, thresholds, frozen });
|
|
351
|
-
}
|
|
352
|
-
/** Start the supervisor loop after winning the authoritative canvas claim.
|
|
353
|
-
*
|
|
354
|
-
* A losing claimant stays unbound and returns an inert async teardown so its
|
|
355
|
-
* process exits cleanly. A winner returns the one serialized teardown that
|
|
356
|
-
* quiesces admitted work, removes its readiness mirror, and releases its exact
|
|
357
|
-
* claim. */
|
|
358
|
-
export async function runDaemon(opts = {}) {
|
|
359
|
-
const ownership = claimDaemonOwnership(randomBytes(16).toString('hex'));
|
|
360
|
-
if (!ownership.claimed) {
|
|
361
|
-
// A losing claim isn't always a singleton race: `own_identity_indeterminate`
|
|
362
|
-
// and `incumbent_malformed` are claim-integrity failures with a different
|
|
363
|
-
// root cause than a live incumbent. "already running" is reserved for the
|
|
364
|
-
// one reason that's actually true — `incumbent_alive` — so the other
|
|
365
|
-
// reasons stay diagnosable instead of masquerading as a normal race.
|
|
366
|
-
if (ownership.reason === 'incumbent_alive') {
|
|
367
|
-
process.stderr.write(`[crtrd] already running (pid ${ownership.incumbentPid ?? '?'})\n`);
|
|
368
|
-
}
|
|
369
|
-
else {
|
|
370
|
-
const details = [
|
|
371
|
-
ownership.incumbentPid !== undefined ? `pid ${ownership.incumbentPid}` : undefined,
|
|
372
|
-
ownership.verdict !== undefined ? `verdict ${ownership.verdict}` : undefined,
|
|
373
|
-
].filter((d) => d !== undefined);
|
|
374
|
-
const suffix = details.length > 0 ? ` (${details.join(', ')})` : '';
|
|
375
|
-
process.stderr.write(`[crtrd] claim lost: ${ownership.reason}${suffix}\n`);
|
|
376
|
-
}
|
|
377
|
-
return async () => { };
|
|
378
|
-
}
|
|
379
|
-
const claim = ownership.claim;
|
|
380
|
-
try {
|
|
381
|
-
await reapPriorEpochBrokers(claim.token);
|
|
382
|
-
runProfileManifestMigrations(profilesRoot(), { dryRun: false, withLock: withProfileManifestLock });
|
|
383
|
-
convertLegacyScopedStore({ kind: 'user', root: userScopeRoot() });
|
|
384
|
-
await convertLegacyProviderStore(piAgentDir());
|
|
385
|
-
migrate(openDb());
|
|
386
|
-
}
|
|
387
|
-
catch (migrationError) {
|
|
388
|
-
try {
|
|
389
|
-
const { released } = releaseDaemonOwnership(claim);
|
|
390
|
-
if (!released)
|
|
391
|
-
throw new Error('daemon ownership claim was not released');
|
|
392
|
-
}
|
|
393
|
-
catch (cleanupError) {
|
|
394
|
-
throw new AggregateError([migrationError, cleanupError], 'daemon startup failed and cleanup also failed');
|
|
395
|
-
}
|
|
396
|
-
throw migrationError;
|
|
397
|
-
}
|
|
398
|
-
let admissionOpen = true;
|
|
399
|
-
let interval;
|
|
400
|
-
let laneTail = Promise.resolve();
|
|
401
|
-
let tickQueued = false;
|
|
402
|
-
let intervalTimer;
|
|
403
|
-
let fleet;
|
|
404
|
-
const detached = new Set();
|
|
405
|
-
let mirrorComplete = false;
|
|
406
|
-
let claimComplete = false;
|
|
407
|
-
let cleanupInFlight;
|
|
408
|
-
let apiServer;
|
|
409
|
-
let apiServerClosed = false;
|
|
410
|
-
let startup = {
|
|
411
|
-
phase: 'initializing',
|
|
412
|
-
message: 'daemon startup is initializing its on-disk memory migration and normal services are unavailable',
|
|
413
|
-
blockerPaths: [],
|
|
414
|
-
};
|
|
415
|
-
// This slot is occupied before the repair socket binds, and remains occupied
|
|
416
|
-
// through normal startup. A request never receives another request's report.
|
|
417
|
-
let migrationInFlight = 'initial startup activation';
|
|
418
|
-
let resume = null;
|
|
419
|
-
function startupBlock() {
|
|
420
|
-
return startup.phase === 'ready' ? null : { phase: startup.phase, message: startup.message, blockerPaths: startup.blockerPaths };
|
|
421
|
-
}
|
|
422
|
-
function registerDetached(work) {
|
|
423
|
-
detached.add(work);
|
|
424
|
-
void work.finally(() => {
|
|
425
|
-
detached.delete(work);
|
|
426
|
-
}).catch(() => { });
|
|
427
|
-
}
|
|
428
|
-
const tickLifecycle = {
|
|
429
|
-
acceptsDetachedWork: () => admissionOpen,
|
|
430
|
-
registerDetached,
|
|
431
|
-
};
|
|
432
|
-
async function cleanupAttempt() {
|
|
433
|
-
try {
|
|
434
|
-
admissionOpen = false;
|
|
435
|
-
if (intervalTimer !== undefined) {
|
|
436
|
-
clearInterval(intervalTimer);
|
|
437
|
-
intervalTimer = undefined;
|
|
438
|
-
}
|
|
439
|
-
// Quiesce the serial work lane. enqueue drops new jobs once admission
|
|
440
|
-
// closes, so the tail is final apart from an append that raced the flag
|
|
441
|
-
// — the re-check loop absorbs exactly that boundary. laneTail never
|
|
442
|
-
// rejects (enqueue attaches the rejection handler on every append).
|
|
443
|
-
let tail;
|
|
444
|
-
do {
|
|
445
|
-
tail = laneTail;
|
|
446
|
-
await tail;
|
|
447
|
-
} while (tail !== laneTail);
|
|
448
|
-
while (detached.size > 0) {
|
|
449
|
-
await Promise.allSettled([...detached]);
|
|
450
|
-
}
|
|
451
|
-
// Fleet teardown (invariant 2): SIGTERM every live broker, bounded
|
|
452
|
-
// grace, SIGKILL survivors' trees — no broker outlives the epoch that
|
|
453
|
-
// launched it. The SIGTERMs land as real exit events whose policy jobs
|
|
454
|
-
// the closed lane DROPS, so teardown can never respawn what it kills.
|
|
455
|
-
if (fleet !== undefined) {
|
|
456
|
-
await teardownFleet(fleet);
|
|
457
|
-
fleet.dispose();
|
|
458
|
-
}
|
|
459
|
-
// Tear down the API server before releasing the pidfile mirror + claim.
|
|
460
|
-
// Guarded so a double-cleanup is a no-op (close() is itself double-safe).
|
|
461
|
-
if (apiServer !== undefined && !apiServerClosed) {
|
|
462
|
-
apiServerClosed = true;
|
|
463
|
-
await apiServer.close();
|
|
464
|
-
}
|
|
465
|
-
if (!mirrorComplete) {
|
|
466
|
-
removeOwnedPidfileMirror(process.pid);
|
|
467
|
-
mirrorComplete = true;
|
|
468
|
-
}
|
|
469
|
-
if (mirrorComplete && !claimComplete) {
|
|
470
|
-
const { released } = releaseDaemonOwnership(claim);
|
|
471
|
-
if (!released)
|
|
472
|
-
throw new Error('daemon ownership claim was not released');
|
|
473
|
-
claimComplete = true;
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
finally {
|
|
477
|
-
clearDaemonControl();
|
|
478
|
-
process.off('SIGINT', onSigint);
|
|
479
|
-
process.off('SIGTERM', onSigterm);
|
|
480
|
-
process.off('exit', onExit);
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
// Handover — the daemon replaces ITSELF (POST /v1/daemon/restart)
|
|
484
|
-
//
|
|
485
|
-
// The routine reason to restart crtrd is to put a newly selected runtime
|
|
486
|
-
// generation in service, and the routine caller is an agent's bash tool. A
|
|
487
|
-
// client-driven `stop` makes that caller a victim of its own command: the
|
|
488
|
-
// shutdown tears down every broker of this epoch (invariant 2), including the
|
|
489
|
-
// one running the command, so the tool call dies without a result and the
|
|
490
|
-
// resumed agent re-issues it. Owning the restart here inverts that — the API
|
|
491
|
-
// handler answers first, this grace lets the answer settle into the caller's
|
|
492
|
-
// transcript as a real tool result, and only then does teardown begin.
|
|
493
|
-
//
|
|
494
|
-
// The grace covers: response flush → the CLI process printing and exiting →
|
|
495
|
-
// pi persisting the tool result. It is NOT a correctness fallback; a broker
|
|
496
|
-
// SIGTERMed mid-turn still gets `abortAndExit`'s own bounded persistence
|
|
497
|
-
// window, and the successor's supervision tick resolves it either way.
|
|
498
|
-
const HANDOVER_ACK_GRACE_MS = 1_000;
|
|
499
|
-
let handoverArmed = false;
|
|
500
|
-
/** Arm the handover. Idempotent: a retry while one is already scheduled
|
|
501
|
-
* reports the same grace and schedules nothing new, so a caller that repeats
|
|
502
|
-
* the request cannot stack teardowns. */
|
|
503
|
-
function requestHandover() {
|
|
504
|
-
if (handoverArmed)
|
|
505
|
-
return { graceMs: HANDOVER_ACK_GRACE_MS };
|
|
506
|
-
handoverArmed = true;
|
|
507
|
-
operationIdContext.fresh(() => {
|
|
508
|
-
emitEvent({
|
|
509
|
-
level: 'info',
|
|
510
|
-
event: 'daemon.handover.armed',
|
|
511
|
-
fields: { pid: process.pid, grace_ms: HANDOVER_ACK_GRACE_MS },
|
|
512
|
-
});
|
|
513
|
-
});
|
|
514
|
-
// Deliberately NOT unref'd: this timer is the only thing that must keep the
|
|
515
|
-
// process alive once the answer is out.
|
|
516
|
-
setTimeout(() => {
|
|
517
|
-
void performHandover();
|
|
518
|
-
}, HANDOVER_ACK_GRACE_MS);
|
|
519
|
-
return { graceMs: HANDOVER_ACK_GRACE_MS };
|
|
520
|
-
}
|
|
521
|
-
/** Quiesce exactly as a SIGTERM would, then start the successor.
|
|
522
|
-
* Ordering is forced: the successor's claim can only be won after this
|
|
523
|
-
* daemon has released its own. PID 1 is replaced in place so a container
|
|
524
|
-
* does not stop between daemon generations; ordinary hosts spawn and exit. */
|
|
525
|
-
async function performHandover() {
|
|
526
|
-
try {
|
|
527
|
-
await requestCleanup();
|
|
528
|
-
}
|
|
529
|
-
catch (error) {
|
|
530
|
-
const detail = error instanceof Error ? error.stack ?? error.message : String(error);
|
|
531
|
-
process.stderr.write(`[crtrd] handover cleanup failed:\n${detail}\n`);
|
|
532
|
-
process.exit(1);
|
|
533
|
-
}
|
|
534
|
-
try {
|
|
535
|
-
if (process.pid === 1) {
|
|
536
|
-
await execDaemon();
|
|
537
|
-
}
|
|
538
|
-
const spawned = await spawnDaemon();
|
|
539
|
-
operationIdContext.fresh(() => {
|
|
540
|
-
emitEvent({
|
|
541
|
-
level: 'info',
|
|
542
|
-
event: 'daemon.handover.completed',
|
|
543
|
-
fields: {
|
|
544
|
-
predecessor_pid: process.pid,
|
|
545
|
-
successor_pid: spawned.pid ?? spawned.existing_pid ?? null,
|
|
546
|
-
spawned: spawned.started,
|
|
547
|
-
},
|
|
548
|
-
});
|
|
549
|
-
});
|
|
550
|
-
}
|
|
551
|
-
catch (error) {
|
|
552
|
-
// The canvas is now daemonless. Loud, and recoverable: the next front-door
|
|
553
|
-
// command's ensureDaemon() starts one, and every torn-down node is
|
|
554
|
-
// reclassified by that daemon's supervision tick.
|
|
555
|
-
operationIdContext.fresh(() => {
|
|
556
|
-
emitEvent({ level: 'error', event: 'daemon.handover.successor_failed', error });
|
|
557
|
-
});
|
|
558
|
-
const detail = error instanceof Error ? error.message : String(error);
|
|
559
|
-
process.stderr.write(`[crtrd] handover successor failed to start: ${detail}\n`);
|
|
560
|
-
process.exit(1);
|
|
561
|
-
}
|
|
562
|
-
process.exit(0);
|
|
563
|
-
}
|
|
564
|
-
function requestCleanup() {
|
|
565
|
-
if (cleanupInFlight !== undefined)
|
|
566
|
-
return cleanupInFlight;
|
|
567
|
-
const attempt = cleanupAttempt();
|
|
568
|
-
cleanupInFlight = attempt;
|
|
569
|
-
void attempt.then(() => {
|
|
570
|
-
if (cleanupInFlight === attempt)
|
|
571
|
-
cleanupInFlight = undefined;
|
|
572
|
-
}, () => {
|
|
573
|
-
if (cleanupInFlight === attempt)
|
|
574
|
-
cleanupInFlight = undefined;
|
|
575
|
-
});
|
|
576
|
-
return attempt;
|
|
577
|
-
}
|
|
578
|
-
async function handleSignal(signal) {
|
|
579
|
-
try {
|
|
580
|
-
await requestCleanup();
|
|
581
|
-
process.exit(0);
|
|
582
|
-
}
|
|
583
|
-
catch (error) {
|
|
584
|
-
process.exitCode = 1;
|
|
585
|
-
const detail = error instanceof Error ? error.stack ?? `${error.name}: ${error.message}` : String(error);
|
|
586
|
-
process.stderr.write(`[crtrd] ${signal} cleanup failed:\n${detail}\n`);
|
|
587
|
-
process.exit(1);
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
function onSigint() {
|
|
591
|
-
void handleSignal('SIGINT');
|
|
592
|
-
}
|
|
593
|
-
function onSigterm() {
|
|
594
|
-
void handleSignal('SIGTERM');
|
|
595
|
-
}
|
|
596
|
-
function onExit() {
|
|
597
|
-
void requestCleanup().catch(() => { });
|
|
598
|
-
}
|
|
599
|
-
/** The serial work lane (design D-3): supervision ticks, exit-policy jobs,
|
|
600
|
-
* and matured backoff respawns run strictly one at a time, so policy never
|
|
601
|
-
* interleaves with a tick's row reads. `laneTail` never rejects — every append attaches the rejection
|
|
602
|
-
* handler. Once admission closes, new jobs are DROPPED (not queued): a
|
|
603
|
-
* shutdown SIGTERM fans exit events across the whole fleet, and running
|
|
604
|
-
* their policy jobs would respawn brokers mid-teardown. */
|
|
605
|
-
function enqueue(job) {
|
|
606
|
-
if (!admissionOpen)
|
|
607
|
-
return;
|
|
608
|
-
laneTail = laneTail.then(job).then(() => { }, (err) => {
|
|
609
|
-
operationIdContext.fresh(() => {
|
|
610
|
-
emitEvent({ level: 'error', event: 'daemon.lane_job.failed', error: err });
|
|
611
|
-
});
|
|
612
|
-
});
|
|
613
|
-
}
|
|
614
|
-
/** Enqueue a supervision tick, collapsed to at most ONE queued tick: the
|
|
615
|
-
* interval keeps firing while a long lane drains (a census, a slow exit
|
|
616
|
-
* policy), and queuing every missed beat would burst-run ticks back-to-back
|
|
617
|
-
* once the lane frees. */
|
|
618
|
-
function enqueueTick() {
|
|
619
|
-
if (!admissionOpen || tickQueued)
|
|
620
|
-
return;
|
|
621
|
-
tickQueued = true;
|
|
622
|
-
enqueue(async () => {
|
|
623
|
-
tickQueued = false;
|
|
624
|
-
if (!admissionOpen)
|
|
625
|
-
return;
|
|
626
|
-
try {
|
|
627
|
-
await superviseTick(Date.now(), tickLifecycle);
|
|
628
|
-
}
|
|
629
|
-
catch (error) {
|
|
630
|
-
operationIdContext.fresh(() => {
|
|
631
|
-
emitEvent({ level: 'error', event: 'daemon.tick.failed', error });
|
|
632
|
-
});
|
|
633
|
-
}
|
|
634
|
-
});
|
|
635
|
-
}
|
|
636
|
-
let admissionFailure = null;
|
|
637
|
-
async function admitStartup() {
|
|
638
|
-
if (admissionFailure !== null) {
|
|
639
|
-
const message = admissionFailure instanceof Error ? admissionFailure.message : String(admissionFailure);
|
|
640
|
-
throw { status: 500, code: 'admission_failed', message: `daemon admission previously failed: ${message}` };
|
|
641
|
-
}
|
|
642
|
-
if (startup.phase === 'ready') {
|
|
643
|
-
return { admitted: false, already_admitted: true, startup_phase: 'ready' };
|
|
644
|
-
}
|
|
645
|
-
if (startup.phase !== 'prepared' && startup.phase !== 'recovering') {
|
|
646
|
-
throw {
|
|
647
|
-
status: 409,
|
|
648
|
-
code: 'not_prepared',
|
|
649
|
-
message: startup.message,
|
|
650
|
-
};
|
|
651
|
-
}
|
|
652
|
-
const admitted = startup.phase === 'prepared';
|
|
653
|
-
try {
|
|
654
|
-
await resumeStartup();
|
|
655
|
-
startup = { phase: 'ready', message: '', blockerPaths: [] };
|
|
656
|
-
return admitted
|
|
657
|
-
? { admitted: true, already_admitted: false, startup_phase: 'ready' }
|
|
658
|
-
: { admitted: false, already_admitted: true, startup_phase: 'ready' };
|
|
659
|
-
}
|
|
660
|
-
catch (error) {
|
|
661
|
-
admissionFailure = error;
|
|
662
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
663
|
-
throw { status: 500, code: 'admission_failed', message: `daemon admission failed: ${message}` };
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
async function repairMigrations(req) {
|
|
667
|
-
if (migrationInFlight !== null) {
|
|
668
|
-
throw {
|
|
669
|
-
status: 409,
|
|
670
|
-
code: 'migration_in_progress',
|
|
671
|
-
message: `on-disk migration is already running (${migrationInFlight})`,
|
|
672
|
-
};
|
|
673
|
-
}
|
|
674
|
-
migrationInFlight = 'repair';
|
|
675
|
-
try {
|
|
676
|
-
const result = await runForcedOnDiskMigrations({
|
|
677
|
-
dryRun: req.dryRun,
|
|
678
|
-
explicitDirs: req.dirs,
|
|
679
|
-
nodes: listNodeMemoryTargets(),
|
|
680
|
-
});
|
|
681
|
-
if (req.dryRun || !result.finalVerificationSucceeded || startup.phase !== 'blocked') {
|
|
682
|
-
return { result, resumed: false };
|
|
683
|
-
}
|
|
684
|
-
if (opts.prepare) {
|
|
685
|
-
startup = {
|
|
686
|
-
phase: 'prepared',
|
|
687
|
-
message: 'daemon storage is prepared and normal services are unavailable until admission',
|
|
688
|
-
blockerPaths: [],
|
|
689
|
-
};
|
|
690
|
-
return { result, resumed: false };
|
|
691
|
-
}
|
|
692
|
-
try {
|
|
693
|
-
await resumeStartup();
|
|
694
|
-
startup = { phase: 'ready', message: '', blockerPaths: [] };
|
|
695
|
-
return { result, resumed: true };
|
|
696
|
-
}
|
|
697
|
-
catch (error) {
|
|
698
|
-
const resumeError = error instanceof Error ? error.message : String(error);
|
|
699
|
-
// The route must flush this result before cleanup closes its connection.
|
|
700
|
-
setTimeout(() => { void requestCleanup().catch(() => { }); }, 1_000);
|
|
701
|
-
return { result, resumed: false, resumeError };
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
finally {
|
|
705
|
-
migrationInFlight = null;
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
async function completeStartup() {
|
|
709
|
-
interval = opts.intervalMs ?? DEFAULT_INTERVAL_MS;
|
|
710
|
-
const epoch = claim.token;
|
|
711
|
-
fleet = new DaemonFleet({ epoch, enqueue });
|
|
712
|
-
bindFleet(fleet);
|
|
713
|
-
startup = {
|
|
714
|
-
phase: 'recovering',
|
|
715
|
-
message: 'daemon startup recovery is running and normal services are unavailable',
|
|
716
|
-
blockerPaths: [],
|
|
717
|
-
};
|
|
718
|
-
operationIdContext.fresh(() => {
|
|
719
|
-
emitEvent({
|
|
720
|
-
level: 'info',
|
|
721
|
-
event: 'daemon.started',
|
|
722
|
-
fields: { pid: process.pid, interval_ms: interval },
|
|
723
|
-
});
|
|
724
|
-
});
|
|
725
|
-
const installId = resolveInstallId();
|
|
726
|
-
setInstallId(installId);
|
|
727
|
-
operationIdContext.fresh(() => {
|
|
728
|
-
emitEvent({ level: 'info', event: 'daemon.install_id.resolved', fields: { install_id: installId } });
|
|
729
|
-
});
|
|
730
|
-
operationIdContext.fresh(() => {
|
|
731
|
-
let warning;
|
|
732
|
-
try {
|
|
733
|
-
warning = rendererWarning();
|
|
734
|
-
}
|
|
735
|
-
catch {
|
|
736
|
-
return;
|
|
737
|
-
}
|
|
738
|
-
if (warning !== null) {
|
|
739
|
-
emitEvent({
|
|
740
|
-
level: 'warn',
|
|
741
|
-
event: 'daemon.startup.warning',
|
|
742
|
-
fields: { stage: 'termrender', warning: warning.slice(0, 2_048) },
|
|
743
|
-
});
|
|
744
|
-
}
|
|
745
|
-
});
|
|
746
|
-
await operationIdContext.fresh(async () => {
|
|
747
|
-
await sweepReviews();
|
|
748
|
-
await reconcileUndeliveredTickets();
|
|
749
|
-
resetHandedOffDeliveries(Date.now());
|
|
750
|
-
});
|
|
751
|
-
operationIdContext.fresh(() => {
|
|
752
|
-
const { reconcile, migrated } = reconcileAndMigrateBoot(migrateLegacyExecutionIdentities);
|
|
753
|
-
if (reconcile.changed) {
|
|
754
|
-
emitEvent({
|
|
755
|
-
level: 'info',
|
|
756
|
-
event: 'daemon.boot_change.reconciled',
|
|
757
|
-
fields: {
|
|
758
|
-
cleared_count: reconcile.cleared.length,
|
|
759
|
-
same_boot_proven: reconcile.sameBootProven,
|
|
760
|
-
},
|
|
761
|
-
});
|
|
762
|
-
}
|
|
763
|
-
if (migrated.length > 0) {
|
|
764
|
-
emitEvent({
|
|
765
|
-
level: 'info',
|
|
766
|
-
event: 'daemon.pid_identity.migrated',
|
|
767
|
-
fields: { migrated_count: migrated.length },
|
|
768
|
-
});
|
|
769
|
-
}
|
|
770
|
-
});
|
|
771
|
-
operationIdContext.fresh(() => {
|
|
772
|
-
for (const migration of BOOT_MIGRATIONS) {
|
|
773
|
-
const result = migration.apply();
|
|
774
|
-
if (result.changed) {
|
|
775
|
-
emitEvent({
|
|
776
|
-
level: 'info',
|
|
777
|
-
event: 'daemon.boot_migration.applied',
|
|
778
|
-
fields: { migration: migration.id, ...result.summary },
|
|
779
|
-
});
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
});
|
|
783
|
-
enqueue(() => { reapStaleSpares(); prewarmRecentRecipes(); });
|
|
784
|
-
intervalTimer = setInterval(enqueueTick, interval);
|
|
785
|
-
enqueueTick();
|
|
786
|
-
}
|
|
787
|
-
function resumeStartup() {
|
|
788
|
-
return resume ??= completeStartup().catch((error) => {
|
|
789
|
-
startup = {
|
|
790
|
-
phase: 'initializing',
|
|
791
|
-
message: 'daemon startup recovery failed and normal services are unavailable',
|
|
792
|
-
blockerPaths: [],
|
|
793
|
-
};
|
|
794
|
-
throw error;
|
|
795
|
-
});
|
|
796
|
-
}
|
|
797
|
-
try {
|
|
798
|
-
process.on('SIGINT', onSigint);
|
|
799
|
-
process.on('SIGTERM', onSigterm);
|
|
800
|
-
process.on('exit', onExit);
|
|
801
|
-
// Bind restricted diagnostics and repair before the socket can accept a
|
|
802
|
-
// request. No normal route is admitted until `startup` becomes ready.
|
|
803
|
-
bindDaemonEventSource();
|
|
804
|
-
const epoch = claim.token;
|
|
805
|
-
bindDaemonControl({ epoch, requestHandover, registerDetached, startupBlock, admitStartup, repairMigrations });
|
|
806
|
-
writePidfile();
|
|
807
|
-
// The socket is the repair boundary, not readiness. A rejected bind still
|
|
808
|
-
// enters this catch and releases this invocation's pidfile and ownership.
|
|
809
|
-
apiServer = createApiServer({ tcp: opts.tcp });
|
|
810
|
-
await apiServer.ready;
|
|
811
|
-
try {
|
|
812
|
-
await activateOnDiskMigrations({ nodes: listNodeMemoryTargets() });
|
|
813
|
-
}
|
|
814
|
-
catch (error) {
|
|
815
|
-
migrationInFlight = null;
|
|
816
|
-
if (error instanceof MigrationBlockedError) {
|
|
817
|
-
startup = {
|
|
818
|
-
phase: 'blocked',
|
|
819
|
-
message: error.message,
|
|
820
|
-
blockerPaths: error.blockerPaths,
|
|
821
|
-
};
|
|
822
|
-
return requestCleanup;
|
|
823
|
-
}
|
|
824
|
-
throw error;
|
|
825
|
-
}
|
|
826
|
-
try {
|
|
827
|
-
if (opts.prepare) {
|
|
828
|
-
startup = {
|
|
829
|
-
phase: 'prepared',
|
|
830
|
-
message: 'daemon storage is prepared and normal services are unavailable until admission',
|
|
831
|
-
blockerPaths: [],
|
|
832
|
-
};
|
|
833
|
-
}
|
|
834
|
-
else {
|
|
835
|
-
await resumeStartup();
|
|
836
|
-
startup = { phase: 'ready', message: '', blockerPaths: [] };
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
finally {
|
|
840
|
-
migrationInFlight = null;
|
|
841
|
-
}
|
|
842
|
-
return requestCleanup;
|
|
843
|
-
}
|
|
844
|
-
catch (startupError) {
|
|
845
|
-
try {
|
|
846
|
-
await requestCleanup();
|
|
847
|
-
}
|
|
848
|
-
catch (cleanupError) {
|
|
849
|
-
throw new AggregateError([startupError, cleanupError], 'daemon startup failed and cleanup also failed');
|
|
850
|
-
}
|
|
851
|
-
throw startupError;
|
|
852
|
-
}
|
|
853
|
-
}
|
|
854
|
-
export default runDaemon;
|
|
1
|
+
var ie=Object.defineProperty;var o=(t,i)=>ie(t,"name",{value:i,configurable:!0});import{writeFileSync as oe,readFileSync as ae,rmSync as se,mkdirSync as ce}from"node:fs";import{dirname as de}from"node:path";import{randomBytes as le}from"node:crypto";import{crtrHome as me}from"../core/canvas/paths.js";import{listNodeMemoryTargets as B,listNodes as j}from"../core/canvas/index.js";import{createApiServer as pe}from"./api/server.js";import{reconcileUndeliveredTickets as fe}from"./human/sweep.js";import{resetHandedOffDeliveries as ue}from"../core/canvas/deliveries.js";import{sweepReviews as he}from"./review/sweep.js";import{pidfilePath as I}from"./pidfile.js";import{rendererWarning as ge}from"../core/runtime/package-health.js";import{DEFAULT_INTERVAL_MS as ve}from"./supervise-cadence.js";import{BrokerSupervisionReconciler as we}from"./reconcilers/broker-supervision.js";import{ControllerDeathReconciler as ye}from"./reconcilers/controller-death.js";import{NodeLifecycleReconciler as Se}from"./reconcilers/node-lifecycle/tick.js";import{NodeDeadlineReconciler as ke}from"./reconcilers/node-deadline.js";import{CronLaneReconciler as be}from"./reconcilers/cron-lane.js";import{DeliveryLaneReconciler as _e}from"./reconcilers/delivery-lane.js";import{migrateLegacyExecutionIdentities as Ee}from"../core/canvas/executions.js";import{PendingReviewSubmitReconciler as Pe}from"./reconcilers/pending-review-submit.js";import{StorageMaintenanceReconciler as Re}from"./reconcilers/storage-maintenance.js";import{BashDeadlineReconciler as De}from"./reconcilers/bash-deadline.js";import{captureLivenessSnapshot as z,capturePidCommand as Ie,captureTeardownSnapshot as H,isPidAlive as Te,isAnyPidAlive as W,killProcessTreePids as K}from"../core/canvas/pid.js";import{bindFleet as Me,boundFleet as xe}from"../core/runtime/fleet.js";import{bindDaemonControl as Le,clearDaemonControl as Ae}from"./control.js";import{execDaemon as Ce,spawnDaemon as $e}from"./manage.js";import{reconcileAndMigrateBoot as Oe}from"../core/canvas/boot.js";import{resolveInstallId as Fe}from"../core/canvas/install-id.js";import{setInstallId as Ge}from"../core/runtime/nodes.js";import{claimDaemonOwnership as Ne,releaseDaemonOwnership as U}from"../core/canvas/daemon-owner.js";import{migrate as Be,openDb as je}from"../core/canvas/db.js";import{prewarmRecentRecipes as ze,reapStaleSpares as He}from"../core/runtime/warm-pool.js";import{DaemonFleet as We}from"./fleet.js";import{BOOT_MIGRATIONS as Ke}from"./boot-migrations.js";import{emitEvent as u}from"../core/events/emit.js";import{operationIdContext as g}from"../core/events/operation-id.js";import{bindDaemonEventSource as Ue}from"../core/events/source.js";import{activateOnDiskMigrations as Ve,MigrationBlockedError as qe,runForcedOnDiskMigrations as Qe}from"../migrations/activation.js";import{profilesRoot as Je,withProfileManifestLock as Xe}from"../core/profiles/manifest.js";import{runProfileManifestMigrations as Ye}from"../migrations/profile-manifests.js";import{convertLegacyProviderStore as Ze,convertLegacyScopedStore as er}from"../core/scoped-state/migrate.js";import{userScopeRoot as rr}from"../core/scope.js";import{piAgentDir as tr}from"../core/runtime/package-health.js";function T(t,i){return t.includes(` --canvas-home ${i} `)}o(T,"brokerCommandDeclaresCanvasHome");function M(t){return/ --epoch (\S+) /.exec(t)?.[1]??null}o(M,"brokerCommandEpoch");const nr=5e3,V=150;async function ir(t){const i=z();if(i===null)throw u({level:"error",event:"daemon.census.snapshot_failed",fields:{invariant:"prior-epoch brokers are reaped before readiness"}}),new Error("prior-epoch broker census could not capture the process table");const s=me(),c=[];for(const[a,p]of i.processes){const d=p.command;if(p.zombie||!d.includes("broker-cli.js")||!T(d,s)||M(d)===t)continue;const S=d.trim().split(/\s+/).at(-1)??"";S===""||S.endsWith("broker-cli.js")||c.push({pid:a,nodeId:S})}let f=0;const n=[];for(const a of c){const p=Ie(a.pid);if(p===null||!p.includes("broker-cli.js")||!T(p,s)||M(p)===t||p.trim().split(/\s+/).at(-1)!==a.nodeId)continue;const d=H(a.pid,null);if(!d.reused){try{process.kill(a.pid,"SIGTERM")}catch{continue}f++,n.push({pid:a.pid,snap:d})}}const v=Date.now()+nr;for(;Date.now()<v&&n.some(a=>W(a.snap.tree.length>0?a.snap.tree:[a.pid]));)await new Promise(a=>setTimeout(a,V));let h=0;for(const a of n){const p=a.snap.tree.length>0?a.snap.tree:[a.pid];W(p)&&(K(p,"SIGKILL",a.snap.identities),h++)}h>0&&await new Promise(a=>setTimeout(a,V));const w=z();if(w===null)throw u({level:"error",event:"daemon.census.snapshot_failed",fields:{invariant:"prior-epoch brokers are reaped before readiness",stage:"final"}}),new Error("prior-epoch broker census could not capture the final process table");const y=[];for(const[a,p]of w.processes){const d=p.command;p.zombie||!d.includes("broker-cli.js")||T(d,s)&&M(d)!==t&&y.push(a)}if(y.length>0)throw new Error(`prior-epoch broker census could not prove termination of pid(s): ${y.join(", ")}`);u({level:"info",event:"daemon.census.completed",fields:{prior_epoch_brokers:c.length,sigtermed:f,sigkilled:h}})}o(ir,"reapPriorEpochBrokers");const or=5e3;async function ar(t){const i=Array.from(t.entries());if(i.length===0)return;const s=i.map(([,n])=>({pid:n.pid,snap:H(n.pid,null),exited:n.handle.exited}));for(const n of s)if(!n.snap.reused)try{process.kill(n.pid,"SIGTERM")}catch{}const c=new Promise(n=>{setTimeout(n,or).unref()});await Promise.allSettled(s.map(n=>Promise.race([n.exited.then(()=>{}),c])));const f=[];for(const n of s)Te(n.pid)&&(K(n.snap.tree.length>0?n.snap.tree:[n.pid],"SIGKILL",n.snap.identities),f.push(n));await Promise.all(f.map(n=>n.exited)),u({level:"info",event:"daemon.fleet_teardown.completed",fields:{brokers:s.length,sigkilled:f.length}})}o(ar,"teardownFleet");function sr(){ce(de(I()),{recursive:!0}),oe(I(),String(process.pid),"utf8")}o(sr,"writePidfile");function q(t){return typeof t=="object"&&t!==null&&t.code==="ENOENT"}o(q,"isMissingPathError");function cr(t){const i=I();let s;try{s=ae(i,"utf8")}catch(c){if(q(c))return;throw c}if(s.trim()!==String(t))throw new Error(`daemon readiness mirror does not name this invocation (expected pid ${t})`);try{se(i)}catch(c){if(q(c))return;throw c}}o(cr,"removeOwnedPidfileMirror");const dr={acceptsDetachedWork:o(()=>!0,"acceptsDetachedWork"),registerDetached:o(t=>{t.catch(()=>{})},"registerDetached")},x=new we,lr=new ye,mr=new Se,pr=new ke,fr=new be,ur=new _e,hr=new Pe,gr=new Re,vr=new De;async function wr(t=Date.now(),i=dr){const s=xe(),c=await x.runFleetPreamble(s);let f,n;try{f=j({status:["active","idle"]}).filter(h=>h.kind!=="human"),n=j({status:["done","canceled","dead"],withRecordedPidOrFrozen:!0}).filter(h=>h.kind!=="human")}catch(h){u({level:"error",event:"canvas.node_list.failed",error:h});return}await x.run(t,{rows:f,fleet:s,lifecycle:i}),lr.run(t,{rows:f});const v=await mr.run(t,{rows:[...f,...n],fleet:s});pr.run(t),fr.run(t,{lifecycle:i}),ur.run(t,{lifecycle:i}),hr.run(t,{lifecycle:i}),gr.run(t,{lifecycle:i,fleet:s}),await vr.run(t,{rows:f}),x.warnIfSaturated({fleet:s,lifecycle:i,thresholds:c,frozen:v})}o(wr,"superviseTick");async function yr(t={}){const i=Ne(le(16).toString("hex"));if(!i.claimed){if(i.reason==="incumbent_alive")process.stderr.write(`[crtrd] already running (pid ${i.incumbentPid??"?"})
|
|
2
|
+
`);else{const e=[i.incumbentPid!==void 0?`pid ${i.incumbentPid}`:void 0,i.verdict!==void 0?`verdict ${i.verdict}`:void 0].filter(l=>l!==void 0),r=e.length>0?` (${e.join(", ")})`:"";process.stderr.write(`[crtrd] claim lost: ${i.reason}${r}
|
|
3
|
+
`)}return async()=>{}}const s=i.claim;try{await ir(s.token),Ye(Je(),{dryRun:!1,withLock:Xe}),er({kind:"user",root:rr()}),await Ze(tr()),Be(je())}catch(e){try{const{released:r}=U(s);if(!r)throw new Error("daemon ownership claim was not released")}catch(r){throw new AggregateError([e,r],"daemon startup failed and cleanup also failed")}throw e}let c=!0,f,n=Promise.resolve(),v=!1,h,w;const y=new Set;let a=!1,p=!1,d,S,L=!1,m={phase:"initializing",message:"daemon startup is initializing its on-disk memory migration and normal services are unavailable",blockerPaths:[]},_="initial startup activation",Q=null;function J(){return m.phase==="ready"?null:{phase:m.phase,message:m.message,blockerPaths:m.blockerPaths}}o(J,"startupBlock");function A(e){y.add(e),e.finally(()=>{y.delete(e)}).catch(()=>{})}o(A,"registerDetached");const X={acceptsDetachedWork:o(()=>c,"acceptsDetachedWork"),registerDetached:A};async function Y(){try{c=!1,h!==void 0&&(clearInterval(h),h=void 0);let e;do e=n,await e;while(e!==n);for(;y.size>0;)await Promise.allSettled([...y]);if(w!==void 0&&(await ar(w),w.dispose()),S!==void 0&&!L&&(L=!0,await S.close()),a||(cr(process.pid),a=!0),a&&!p){const{released:r}=U(s);if(!r)throw new Error("daemon ownership claim was not released");p=!0}}finally{Ae(),process.off("SIGINT",O),process.off("SIGTERM",F),process.off("exit",G)}}o(Y,"cleanupAttempt");const P=1e3;let C=!1;function Z(){return C?{graceMs:P}:(C=!0,g.fresh(()=>{u({level:"info",event:"daemon.handover.armed",fields:{pid:process.pid,grace_ms:P}})}),setTimeout(()=>{ee()},P),{graceMs:P})}o(Z,"requestHandover");async function ee(){try{await k()}catch(e){const r=e instanceof Error?e.stack??e.message:String(e);process.stderr.write(`[crtrd] handover cleanup failed:
|
|
4
|
+
${r}
|
|
5
|
+
`),process.exit(1)}try{process.pid===1&&await Ce();const e=await $e();g.fresh(()=>{u({level:"info",event:"daemon.handover.completed",fields:{predecessor_pid:process.pid,successor_pid:e.pid??e.existing_pid??null,spawned:e.started}})})}catch(e){g.fresh(()=>{u({level:"error",event:"daemon.handover.successor_failed",error:e})});const r=e instanceof Error?e.message:String(e);process.stderr.write(`[crtrd] handover successor failed to start: ${r}
|
|
6
|
+
`),process.exit(1)}process.exit(0)}o(ee,"performHandover");function k(){if(d!==void 0)return d;const e=Y();return d=e,e.then(()=>{d===e&&(d=void 0)},()=>{d===e&&(d=void 0)}),e}o(k,"requestCleanup");async function $(e){try{await k(),process.exit(0)}catch(r){process.exitCode=1;const l=r instanceof Error?r.stack??`${r.name}: ${r.message}`:String(r);process.stderr.write(`[crtrd] ${e} cleanup failed:
|
|
7
|
+
${l}
|
|
8
|
+
`),process.exit(1)}}o($,"handleSignal");function O(){$("SIGINT")}o(O,"onSigint");function F(){$("SIGTERM")}o(F,"onSigterm");function G(){k().catch(()=>{})}o(G,"onExit");function R(e){c&&(n=n.then(e).then(()=>{},r=>{g.fresh(()=>{u({level:"error",event:"daemon.lane_job.failed",error:r})})}))}o(R,"enqueue");function N(){!c||v||(v=!0,R(async()=>{if(v=!1,!!c)try{await wr(Date.now(),X)}catch(e){g.fresh(()=>{u({level:"error",event:"daemon.tick.failed",error:e})})}}))}o(N,"enqueueTick");let E=null;async function re(){if(E!==null)throw{status:500,code:"admission_failed",message:`daemon admission previously failed: ${E instanceof Error?E.message:String(E)}`};if(m.phase==="ready")return{admitted:!1,already_admitted:!0,startup_phase:"ready"};if(m.phase!=="prepared"&&m.phase!=="recovering")throw{status:409,code:"not_prepared",message:m.message};const e=m.phase==="prepared";try{return await D(),m={phase:"ready",message:"",blockerPaths:[]},e?{admitted:!0,already_admitted:!1,startup_phase:"ready"}:{admitted:!1,already_admitted:!0,startup_phase:"ready"}}catch(r){throw E=r,{status:500,code:"admission_failed",message:`daemon admission failed: ${r instanceof Error?r.message:String(r)}`}}}o(re,"admitStartup");async function te(e){if(_!==null)throw{status:409,code:"migration_in_progress",message:`on-disk migration is already running (${_})`};_="repair";try{const r=await Qe({dryRun:e.dryRun,explicitDirs:e.dirs,nodes:B()});if(e.dryRun||!r.finalVerificationSucceeded||m.phase!=="blocked")return{result:r,resumed:!1};if(t.prepare)return m={phase:"prepared",message:"daemon storage is prepared and normal services are unavailable until admission",blockerPaths:[]},{result:r,resumed:!1};try{return await D(),m={phase:"ready",message:"",blockerPaths:[]},{result:r,resumed:!0}}catch(l){const b=l instanceof Error?l.message:String(l);return setTimeout(()=>{k().catch(()=>{})},1e3),{result:r,resumed:!1,resumeError:b}}}finally{_=null}}o(te,"repairMigrations");async function ne(){f=t.intervalMs??ve;const e=s.token;w=new We({epoch:e,enqueue:R}),Me(w),m={phase:"recovering",message:"daemon startup recovery is running and normal services are unavailable",blockerPaths:[]},g.fresh(()=>{u({level:"info",event:"daemon.started",fields:{pid:process.pid,interval_ms:f}})});const r=Fe();Ge(r),g.fresh(()=>{u({level:"info",event:"daemon.install_id.resolved",fields:{install_id:r}})}),g.fresh(()=>{let l;try{l=ge()}catch{return}l!==null&&u({level:"warn",event:"daemon.startup.warning",fields:{stage:"termrender",warning:l.slice(0,2048)}})}),await g.fresh(async()=>{await he(),await fe(),ue(Date.now())}),g.fresh(()=>{const{reconcile:l,migrated:b}=Oe(Ee);l.changed&&u({level:"info",event:"daemon.boot_change.reconciled",fields:{cleared_count:l.cleared.length,same_boot_proven:l.sameBootProven}}),b.length>0&&u({level:"info",event:"daemon.pid_identity.migrated",fields:{migrated_count:b.length}})}),g.fresh(()=>{for(const l of Ke){const b=l.apply();b.changed&&u({level:"info",event:"daemon.boot_migration.applied",fields:{migration:l.id,...b.summary}})}}),R(()=>{He(),ze()}),h=setInterval(N,f),N()}o(ne,"completeStartup");function D(){return Q??=ne().catch(e=>{throw m={phase:"initializing",message:"daemon startup recovery failed and normal services are unavailable",blockerPaths:[]},e})}o(D,"resumeStartup");try{process.on("SIGINT",O),process.on("SIGTERM",F),process.on("exit",G),Ue();const e=s.token;Le({epoch:e,requestHandover:Z,registerDetached:A,startupBlock:J,admitStartup:re,repairMigrations:te}),sr(),S=pe({tcp:t.tcp}),await S.ready;try{await Ve({nodes:B()})}catch(r){if(_=null,r instanceof qe)return m={phase:"blocked",message:r.message,blockerPaths:r.blockerPaths},k;throw r}try{t.prepare?m={phase:"prepared",message:"daemon storage is prepared and normal services are unavailable until admission",blockerPaths:[]}:(await D(),m={phase:"ready",message:"",blockerPaths:[]})}finally{_=null}return k}catch(e){try{await k()}catch(r){throw new AggregateError([e,r],"daemon startup failed and cleanup also failed")}throw e}}o(yr,"runDaemon");var lt=yr;export{T as brokerCommandDeclaresCanvasHome,M as brokerCommandEpoch,lt as default,yr as runDaemon,wr as superviseTick};
|