@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/core/canvas/pid.js
CHANGED
|
@@ -1,683 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
// "down" without a reverse-layer violation (runtime/ sits above canvas/, daemon/
|
|
6
|
-
// above runtime/). It is a pure process-existence utility, NOT data-model access,
|
|
7
|
-
// so it is exempt from the "only canvas.ts touches the db" rule. canvas.ts,
|
|
8
|
-
// revive.ts, placement.ts, and crtrd.ts all probe liveness through it.
|
|
9
|
-
import { spawn, spawnSync } from 'node:child_process';
|
|
10
|
-
import { readFileSync } from 'node:fs';
|
|
11
|
-
import { readKernelBootId } from './boot-id.js';
|
|
12
|
-
/** Classify the current `ps` row for a pid. BSD ps and procps-ng both report a
|
|
13
|
-
* leading `Z` for zombies and exit silently with empty output when no process
|
|
14
|
-
* matches. Only a probe that could not run is unknown; that is the sole
|
|
15
|
-
* fail-open result. */
|
|
16
|
-
function psProcessState(pid) {
|
|
17
|
-
try {
|
|
18
|
-
const r = spawnSync('ps', ['-o', 'stat=', '-p', String(pid)], { encoding: 'utf8', timeout: 2000 });
|
|
19
|
-
if (r.error != null || r.signal != null || typeof r.stdout !== 'string')
|
|
20
|
-
return 'unknown';
|
|
21
|
-
if (typeof r.stderr === 'string' && r.stderr.trim() !== '')
|
|
22
|
-
return 'unknown';
|
|
23
|
-
const stat = r.stdout.trim();
|
|
24
|
-
if (stat === '')
|
|
25
|
-
return 'gone';
|
|
26
|
-
return stat.charAt(0) === 'Z' ? 'zombie' : 'live';
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return 'unknown';
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/** True if a process with `pid` is currently alive. `kill(pid, 0)` provides the
|
|
33
|
-
* initial existence check; EPERM means the foreign process exists. For our
|
|
34
|
-
* processes, the later `ps` read is authoritative because it also distinguishes
|
|
35
|
-
* zombies and processes reaped between the two probes. Only an unavailable
|
|
36
|
-
* `ps` probe fails open to alive. A null/undefined pid reads dead. */
|
|
37
|
-
export function isPidAlive(pid) {
|
|
38
|
-
if (pid == null)
|
|
39
|
-
return false;
|
|
40
|
-
try {
|
|
41
|
-
process.kill(pid, 0);
|
|
42
|
-
}
|
|
43
|
-
catch (e) {
|
|
44
|
-
return e.code === 'EPERM';
|
|
45
|
-
}
|
|
46
|
-
const state = psProcessState(pid);
|
|
47
|
-
return state !== 'zombie' && state !== 'gone';
|
|
48
|
-
}
|
|
49
|
-
/** Existence-only liveness for READ-ONLY display projections: the signal-0
|
|
50
|
-
* probe alone, no `ps`. A zombie reads alive here, which a dashboard column
|
|
51
|
-
* tolerates and which no lifecycle decision may rely on — revive, teardown,
|
|
52
|
-
* and every other authority stays on `isPidAlive`. Exists because the
|
|
53
|
-
* dashboard snapshot runs this per live row per request; a `ps` spawn each
|
|
54
|
-
* time was a third of daemon CPU on a large canvas. */
|
|
55
|
-
export function isPidPresent(pid) {
|
|
56
|
-
if (pid == null)
|
|
57
|
-
return false;
|
|
58
|
-
try {
|
|
59
|
-
process.kill(pid, 0);
|
|
60
|
-
return true;
|
|
61
|
-
}
|
|
62
|
-
catch (e) {
|
|
63
|
-
return e.code === 'EPERM';
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/** Matches the kernel `boot_id` UUID shape (`/proc/sys/kernel/random/boot_id`),
|
|
67
|
-
* used to tell a NEW-format identity base (a per-boot UUID) apart from a
|
|
68
|
-
* LEGACY one (a `ps lstart` wall-clock timestamp). A boot_id is a lowercase
|
|
69
|
-
* hex UUID; an `lstart` string is a human-readable date — the two never
|
|
70
|
-
* collide, so this cleanly classifies which comparison rule an identity's
|
|
71
|
-
* base obeys (see `identitiesMatch`). */
|
|
72
|
-
const BOOT_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
73
|
-
/** Split a `composeIdentity` fingerprint (`<base>` or `<base>#<ticks>`, where
|
|
74
|
-
* `base` is a per-boot `boot_id` UUID on Linux-with-procfs or the portable
|
|
75
|
-
* `ps lstart` timestamp otherwise) into its coarse base and fine `ticks`
|
|
76
|
-
* (Linux-only jiffies) parts. `#` never appears in a `boot_id` or an `lstart`
|
|
77
|
-
* timestamp, so the first `#` unambiguously separates them. Only a NON-EMPTY,
|
|
78
|
-
* purely-numeric suffix counts as ticks (the shape `procStartTicks` and
|
|
79
|
-
* `composeIdentity` guarantee); a malformed or empty suffix (`A#`, `A#bad`,
|
|
80
|
-
* `A#1#2`) is treated as ABSENT ticks, so the base compare then applies — a
|
|
81
|
-
* garbage suffix must never be trusted as a fine discriminator. */
|
|
82
|
-
function splitIdentity(identity) {
|
|
83
|
-
const i = identity.indexOf('#');
|
|
84
|
-
if (i === -1)
|
|
85
|
-
return { base: identity, ticks: undefined };
|
|
86
|
-
const suffix = identity.slice(i + 1);
|
|
87
|
-
return { base: identity.slice(0, i), ticks: /^\d+$/.test(suffix) ? suffix : undefined };
|
|
88
|
-
}
|
|
89
|
-
/** THE single precision-aware identity compare, used EVERYWHERE two
|
|
90
|
-
* `composeIdentity` fingerprints are compared (this module's own
|
|
91
|
-
* `recordedPidLiveness`, `captureTeardownSnapshot`'s reuse check, and
|
|
92
|
-
* `killProcessTreePids`'s reuse check) — centralized so no call site can
|
|
93
|
-
* drift from this rule.
|
|
94
|
-
*
|
|
95
|
-
* Two hazards this closes, both in the false-DEAD direction (the dangerous
|
|
96
|
-
* one — a false DEAD lets `reviveNode`'s double-launch guard relaunch a
|
|
97
|
-
* SECOND broker onto a still-live session):
|
|
98
|
-
*
|
|
99
|
-
* 1. `composeIdentity` appends the `#<ticks>` Linux discriminator only when
|
|
100
|
-
* `/proc/<pid>/stat` happens to be readable at capture time — so the SAME
|
|
101
|
-
* live process can be recorded plain `lstart` on one capture and
|
|
102
|
-
* `lstart#ticks` on another (a transient `/proc` read failure, or
|
|
103
|
-
* capturing on a platform/container without procfs). A naive `===` reads
|
|
104
|
-
* that as a reuse (different string) and reports `dead` for a broker that
|
|
105
|
-
* never died.
|
|
106
|
-
* 2. `lstart` is NOT stable for a live process on every host. It is derived
|
|
107
|
-
* from `/proc/stat` btime (wall-clock boot epoch) + starttime jiffies, so
|
|
108
|
-
* a clock correction / suspend-resume shifts btime and re-anchors the
|
|
109
|
-
* SAME live process's `lstart` by seconds between two captures. Observed
|
|
110
|
-
* on Blaxel unikraft guests: pid+ticks identical across probes, `lstart`
|
|
111
|
-
* drifting +81s — a base-first compare then reads the live home-node
|
|
112
|
-
* broker as reused/dead every cycle, driving an uncapped revive loop.
|
|
113
|
-
*
|
|
114
|
-
* A third hazard the base itself once carried: `ticks` (jiffies-since-boot)
|
|
115
|
-
* RESET on every boot and can repeat across boots, so ticks-alone is only
|
|
116
|
-
* safe WITHIN one boot. `composeIdentity` therefore boot-SCOPES the base on
|
|
117
|
-
* Linux-with-procfs — the base IS the kernel `boot_id` UUID — so a
|
|
118
|
-
* new-format identity is `<bootId>#<ticks>` and equality means same boot AND
|
|
119
|
-
* same process. This closes the cross-boot false match at the root, without
|
|
120
|
-
* plumbing boot reconciliation ahead of every caller.
|
|
121
|
-
*
|
|
122
|
-
* Rule: split both on `#`.
|
|
123
|
-
* - BOTH sides carry `#ticks` AND both bases are `boot_id` UUIDs
|
|
124
|
-
* (new-format vs new-format): match iff base AND ticks are equal. A
|
|
125
|
-
* different boot_id with equal ticks is NOT a match (the cross-boot
|
|
126
|
-
* collision).
|
|
127
|
-
* - BOTH sides carry `#ticks` but a base is NOT a boot_id UUID on EITHER
|
|
128
|
-
* side — a LEGACY `lstart#ticks` row recorded before this repo boot-scoped
|
|
129
|
-
* the base, or a Linux host that has procfs ticks but no readable boot_id:
|
|
130
|
-
* ticks DECIDE it alone (the prior landed semantics). This is a NARROW
|
|
131
|
-
* format-migration path so an in-place upgrade never false-kills a live
|
|
132
|
-
* broker whose row still holds `lstart#ticks`; it is NOT a general
|
|
133
|
-
* fallback — new-format vs new-format always demands base+ticks above.
|
|
134
|
-
* - EITHER side lacks a valid `#ticks` suffix (macOS / no procfs / transient
|
|
135
|
-
* `/proc` miss / malformed suffix): fall back to the coarse base —
|
|
136
|
-
* matching iff the bases agree (fail-open to same-process, matching this
|
|
137
|
-
* module's universal discipline: only a POSITIVE mismatch counts as reuse,
|
|
138
|
-
* never an absence of evidence). */
|
|
139
|
-
export function identitiesMatch(a, b) {
|
|
140
|
-
const ia = splitIdentity(a);
|
|
141
|
-
const ib = splitIdentity(b);
|
|
142
|
-
if (ia.ticks !== undefined && ib.ticks !== undefined) {
|
|
143
|
-
if (BOOT_ID_RE.test(ia.base) && BOOT_ID_RE.test(ib.base)) {
|
|
144
|
-
return ia.base === ib.base && ia.ticks === ib.ticks;
|
|
145
|
-
}
|
|
146
|
-
return ia.ticks === ib.ticks; // legacy lstart#ticks (either side) → ticks-alone migration
|
|
147
|
-
}
|
|
148
|
-
return ia.base === ib.base;
|
|
149
|
-
}
|
|
150
|
-
export function recordedPidLiveness(pid, expectedIdentity, snapshot) {
|
|
151
|
-
const debug = Boolean(process.env.CRTR_DEBUG_PID_LIVENESS);
|
|
152
|
-
if (pid == null)
|
|
153
|
-
return 'dead';
|
|
154
|
-
if (snapshot === null) {
|
|
155
|
-
if (debug)
|
|
156
|
-
logPidLivenessDecision(pid, false, expectedIdentity, 'probe-null', 'ps snapshot failed → indeterminate', 'indeterminate');
|
|
157
|
-
return 'indeterminate';
|
|
158
|
-
}
|
|
159
|
-
const snapshotProcess = snapshot?.processes.get(pid);
|
|
160
|
-
const alive = snapshot === undefined ? isPidAlive(pid) : snapshotProcess !== undefined && !snapshotProcess.zombie;
|
|
161
|
-
if (!alive) {
|
|
162
|
-
if (debug)
|
|
163
|
-
logPidLivenessDecision(pid, alive, expectedIdentity, snapshot === undefined ? 'no-probe' : 'no-entry', 'process absent/zombie → dead', 'dead');
|
|
164
|
-
return 'dead';
|
|
165
|
-
}
|
|
166
|
-
if (expectedIdentity == null) {
|
|
167
|
-
if (debug)
|
|
168
|
-
logPidLivenessDecision(pid, alive, expectedIdentity, 'no-probe', 'no baseline → trust process presence', 'alive');
|
|
169
|
-
return 'alive';
|
|
170
|
-
}
|
|
171
|
-
let actual;
|
|
172
|
-
if (snapshot === undefined) {
|
|
173
|
-
const current = capturePidIdentities([pid]);
|
|
174
|
-
if (current == null) {
|
|
175
|
-
if (debug)
|
|
176
|
-
logPidLivenessDecision(pid, alive, expectedIdentity, 'probe-null', 'ps probe failed → indeterminate', 'indeterminate');
|
|
177
|
-
return 'indeterminate';
|
|
178
|
-
}
|
|
179
|
-
actual = current.get(pid);
|
|
180
|
-
if (actual === undefined) {
|
|
181
|
-
if (debug)
|
|
182
|
-
logPidLivenessDecision(pid, alive, expectedIdentity, 'no-entry', 'no identity row for pid (race) → dead', 'dead');
|
|
183
|
-
return 'dead';
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
actual = snapshotProcess.identity;
|
|
188
|
-
}
|
|
189
|
-
const matches = identitiesMatch(actual, expectedIdentity);
|
|
190
|
-
if (debug)
|
|
191
|
-
logPidLivenessDecision(pid, alive, expectedIdentity, 'value', matches ? 'identity matches expected → alive' : 'identity differs from expected → REUSED → dead', matches ? 'alive' : 'dead', actual);
|
|
192
|
-
return matches ? 'alive' : 'dead';
|
|
193
|
-
}
|
|
194
|
-
/** Diagnostic-only decision trace for `recordedPidLiveness`, gated entirely
|
|
195
|
-
* behind `CRTR_DEBUG_PID_LIVENESS` — callers must check the env var
|
|
196
|
-
* themselves before calling this so the (tiny) formatting cost is paid ONLY
|
|
197
|
-
* when the env var is set; this function does no env check of its own.
|
|
198
|
-
* Written to trace subtle PID-reuse decisions at the remaining signal and
|
|
199
|
-
* teardown authorization sites: the goal is for a single stderr line per call
|
|
200
|
-
* to make both an identity match and a reused/indeterminate identity fully
|
|
201
|
-
* self-explaining, without changing any return value. `capturePidIdentities`
|
|
202
|
-
* outcome is reported as one of three DISTINCT cases — `probe-null` (the
|
|
203
|
-
* `ps` probe itself failed), `no-entry` (probe succeeded but the map has no
|
|
204
|
-
* row for this pid), or `value` (probe succeeded and found an identity,
|
|
205
|
-
* printed verbatim) — plus `no-probe` for the two branches that return
|
|
206
|
-
* before `capturePidIdentities` is ever called. Kept as permanent
|
|
207
|
-
* observability for this primitive, not a throwaway debug print: pid-reuse
|
|
208
|
-
* liveness is subtle enough that the next person chasing a wedge here should
|
|
209
|
-
* find this already in place. */
|
|
210
|
-
function logPidLivenessDecision(pid, isPidAliveResult, expectedIdentity, probeOutcome, branch, returned, actualIdentity) {
|
|
211
|
-
const parts = [
|
|
212
|
-
`pid=${String(pid)}`,
|
|
213
|
-
`isPidAlive=${isPidAliveResult}`,
|
|
214
|
-
`expectedIdentity=${expectedIdentity === undefined ? 'undefined' : expectedIdentity === null ? 'null' : JSON.stringify(expectedIdentity)}`,
|
|
215
|
-
`capturePidIdentities=${probeOutcome}${probeOutcome === 'value' ? `(${JSON.stringify(actualIdentity)})` : ''}`,
|
|
216
|
-
`branch=${JSON.stringify(branch)}`,
|
|
217
|
-
`returned=${returned}`,
|
|
218
|
-
];
|
|
219
|
-
process.stderr.write(`[recordedPidLiveness] ${parts.join(' ')}\n`);
|
|
220
|
-
}
|
|
221
|
-
/** SIGTERM a process GROUP by pid (the negative-pid convention) — best-effort,
|
|
222
|
-
* swallowing ESRCH (already gone). Used by cron cancellation, timeout, and
|
|
223
|
-
* stale-lease recovery. Lives beside isPidAlive: canvas/ is
|
|
224
|
-
* the lowest shared layer every process-liveness/-teardown primitive sits at.
|
|
225
|
-
* Guards `pid` before signaling: never hit pid 0
|
|
226
|
-
* (which means "my own group") or a negative/non-integer value. */
|
|
227
|
-
export function killProcessGroup(pid, signal = 'SIGTERM') {
|
|
228
|
-
if (!Number.isInteger(pid) || pid <= 0)
|
|
229
|
-
return;
|
|
230
|
-
try {
|
|
231
|
-
process.kill(-pid, signal);
|
|
232
|
-
}
|
|
233
|
-
catch {
|
|
234
|
-
/* already gone */
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
/** Linux-only higher-resolution discriminator layered onto `lstart`:
|
|
238
|
-
* `ps lstart` is only second-granular, so a PID reused
|
|
239
|
-
* within the same wall-clock second compares equal and slips past the reuse
|
|
240
|
-
* guard. `/proc/<pid>/stat`'s `starttime` field is the kernel's own jiffies-
|
|
241
|
-
* since-boot counter for that process — effectively unique per pid even for
|
|
242
|
-
* same-second reuse. `comm` (field 2) is parenthesized and may itself contain
|
|
243
|
-
* spaces/parens, so this splits on the LAST `)` rather than counting fields
|
|
244
|
-
* from the front. Returns `null` (never throws) on any read/parse failure —
|
|
245
|
-
* no `/proc` (macOS, containers without procfs), a raced-away pid, or a
|
|
246
|
-
* malformed line — so this is purely additive precision, never a hard
|
|
247
|
-
* dependency: `composeIdentity` falls back to plain `lstart` in every such
|
|
248
|
-
* case, exactly matching this module's pre-existing cross-platform coarse
|
|
249
|
-
* behavior. */
|
|
250
|
-
function procStartTicks(pid) {
|
|
251
|
-
try {
|
|
252
|
-
const raw = readFileSync(`/proc/${pid}/stat`, 'utf8');
|
|
253
|
-
const closeParen = raw.lastIndexOf(')');
|
|
254
|
-
if (closeParen === -1)
|
|
255
|
-
return null;
|
|
256
|
-
// Fields after `(comm)`, 0-indexed from `state` (proc(5) field 3): state(0)
|
|
257
|
-
// ppid(1) pgrp(2) session(3) tty_nr(4) tpgid(5) flags(6) minflt(7)
|
|
258
|
-
// cminflt(8) majflt(9) cmajflt(10) utime(11) stime(12) cutime(13)
|
|
259
|
-
// cstime(14) priority(15) nice(16) num_threads(17) itrealvalue(18)
|
|
260
|
-
// starttime(19) — proc(5) field 22.
|
|
261
|
-
const rest = raw.slice(closeParen + 2).trim().split(/\s+/);
|
|
262
|
-
const starttime = rest[19];
|
|
263
|
-
return starttime !== undefined && /^\d+$/.test(starttime) ? starttime : null;
|
|
264
|
-
}
|
|
265
|
-
catch {
|
|
266
|
-
return null;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
/** How long a FAILED (`null`) boot_id read is remembered as negative before the
|
|
270
|
-
* next call is allowed to re-read. Bounds the cost on a genuinely no-boot_id
|
|
271
|
-
* host (macOS / no procfs) to one throwing `/proc` read per window rather than
|
|
272
|
-
* one per identity composition — identity is composed per supervised row per
|
|
273
|
-
* daemon tick and per process in a full ps-table capture, so an uncapped
|
|
274
|
-
* retry-on-null is a synchronous read storm there. Kept short so a transient
|
|
275
|
-
* miss on a real boot_id host still recovers promptly. */
|
|
276
|
-
const BOOT_ID_NEGATIVE_TTL_MS = 60_000;
|
|
277
|
-
/** The kernel `boot_id` (`/proc/sys/kernel/random/boot_id`) is stable for the
|
|
278
|
-
* whole lifetime of this process — it only changes on a kernel boot, which
|
|
279
|
-
* necessarily kills this process — so once a real value is read it is cached
|
|
280
|
-
* for good, rather than re-read for every row of a whole-process-table `ps`
|
|
281
|
-
* scan. Only SUCCESSFUL reads are cached forever: a `null` read is negative
|
|
282
|
-
* for `BOOT_ID_NEGATIVE_TTL_MS`, after which the next call retries — so a
|
|
283
|
-
* transient `/proc` miss on a boot_id-capable host still recovers (never
|
|
284
|
-
* permanently downgraded to legacy `lstart#ticks`), while a genuinely
|
|
285
|
-
* no-boot_id host is not hammered with a synchronous throwing read on every
|
|
286
|
-
* identity composition. `now` is injectable for tests. */
|
|
287
|
-
export function makeBootIdCache(read, now = Date.now, negativeTtlMs = BOOT_ID_NEGATIVE_TTL_MS) {
|
|
288
|
-
let cached = null;
|
|
289
|
-
let retryAfter = 0;
|
|
290
|
-
return () => {
|
|
291
|
-
if (cached !== null)
|
|
292
|
-
return cached;
|
|
293
|
-
const t = now();
|
|
294
|
-
if (t < retryAfter)
|
|
295
|
-
return null; // within the negative-cache window — don't re-read
|
|
296
|
-
const v = read();
|
|
297
|
-
if (v !== null)
|
|
298
|
-
return (cached = v);
|
|
299
|
-
retryAfter = t + negativeTtlMs;
|
|
300
|
-
return null;
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
const bootIdBase = makeBootIdCache(readKernelBootId);
|
|
304
|
-
/** Is `identity` a LEGACY (pre-boot-scoped) baseline — a `<lstart>#<ticks>` row
|
|
305
|
-
* whose base is NOT a boot_id UUID but which DOES carry ticks? These are the
|
|
306
|
-
* rows the one-time startup migration re-records once this platform can
|
|
307
|
-
* compose boot-scoped identities (see `migrateLegacyPidIdentities`). */
|
|
308
|
-
export function isLegacyTicksIdentity(identity) {
|
|
309
|
-
const { base, ticks } = splitIdentity(identity);
|
|
310
|
-
return ticks !== undefined && !BOOT_ID_RE.test(base);
|
|
311
|
-
}
|
|
312
|
-
/** Is `identity` a NEW-format boot-scoped baseline — `<bootId>#<ticks>` with a
|
|
313
|
-
* real boot_id UUID base AND ticks? The startup migration only re-records a
|
|
314
|
-
* legacy row when the pid's CURRENT identity comes out in this shape (i.e. the
|
|
315
|
-
* platform now composes new-format), never otherwise. */
|
|
316
|
-
export function isBootScopedIdentity(identity) {
|
|
317
|
-
const { base, ticks } = splitIdentity(identity);
|
|
318
|
-
return ticks !== undefined && BOOT_ID_RE.test(base);
|
|
319
|
-
}
|
|
320
|
-
/** Compose the stable, BOOT-SCOPED process-identity fingerprint used
|
|
321
|
-
* everywhere in this module. ALWAYS used to build an identity string, never a
|
|
322
|
-
* raw field directly, so every identity captured anywhere (launch-time
|
|
323
|
-
* `recordPid`, the teardown snapshot, and the escalation-window re-check) is
|
|
324
|
-
* comparable apples-to-apples.
|
|
325
|
-
*
|
|
326
|
-
* Platform capability, not layered fallbacks — the base is the finest STABLE
|
|
327
|
-
* per-boot anchor available:
|
|
328
|
-
* - Linux-with-procfs (the production guest shape): `<bootId>#<ticks>` — the
|
|
329
|
-
* per-boot `boot_id` UUID plus the per-process jiffies-since-boot. Ticks
|
|
330
|
-
* reset per boot and can repeat, so scoping the base to the boot is what
|
|
331
|
-
* makes an equal-ticks compare safe ACROSS boots (see `identitiesMatch`).
|
|
332
|
-
* - Linux-with-procfs but no readable `boot_id` (if that combination
|
|
333
|
-
* exists): `<lstart>#<ticks>` — the prior landed behavior.
|
|
334
|
-
* - No procfs ticks (macOS / containers without procfs): `<lstart>` alone —
|
|
335
|
-
* unchanged coarse behavior. The base is only ever a `boot_id` when a
|
|
336
|
-
* `ticks` discriminator is ALSO present; a bare `boot_id` (shared by every
|
|
337
|
-
* process on the boot) would be a useless per-process identity. */
|
|
338
|
-
export function composeIdentity(pid, lstart, deps = {}) {
|
|
339
|
-
// `deps` is a TEST-ONLY seam: it lets a unit test drive the composition with
|
|
340
|
-
// an injected ticks/boot_id pair (so `<bootId>#<ticks>` composition is
|
|
341
|
-
// provable off-Linux, where real `/proc` reads return null), without adding
|
|
342
|
-
// any runtime branch — production callers pass no `deps` and read the real
|
|
343
|
-
// `/proc` values exactly as before.
|
|
344
|
-
const ticks = deps.ticks !== undefined ? deps.ticks : procStartTicks(pid);
|
|
345
|
-
if (ticks === null)
|
|
346
|
-
return lstart;
|
|
347
|
-
const bootId = deps.bootId !== undefined ? deps.bootId : bootIdBase();
|
|
348
|
-
return `${bootId ?? lstart}#${ticks}`;
|
|
349
|
-
}
|
|
350
|
-
/** The `ps` invocation both snapshot captures share, so the synchronous and
|
|
351
|
-
* asynchronous forms can never sample different columns. */
|
|
352
|
-
const PS_SNAPSHOT_ARGS = ['-Ao', 'pid=,ppid=,stat=,lstart=,command='];
|
|
353
|
-
const PS_SNAPSHOT_TIMEOUT_MS = 2000;
|
|
354
|
-
export function captureLivenessSnapshot() {
|
|
355
|
-
let stdout;
|
|
356
|
-
try {
|
|
357
|
-
const r = spawnSync('ps', [...PS_SNAPSHOT_ARGS], {
|
|
358
|
-
encoding: 'utf8',
|
|
359
|
-
timeout: PS_SNAPSHOT_TIMEOUT_MS,
|
|
360
|
-
maxBuffer: 8 * 1024 * 1024,
|
|
361
|
-
});
|
|
362
|
-
if (r.status !== 0 || typeof r.stdout !== 'string')
|
|
363
|
-
return null;
|
|
364
|
-
stdout = r.stdout;
|
|
365
|
-
}
|
|
366
|
-
catch {
|
|
367
|
-
return null;
|
|
368
|
-
}
|
|
369
|
-
return parseLivenessTable(stdout);
|
|
370
|
-
}
|
|
371
|
-
/** The same sample without blocking the event loop, for callers running inside
|
|
372
|
-
* crtrd's detached work: one `ps` read classifies every pid they care about,
|
|
373
|
-
* where a per-pid `spawnSync` probe would stall broker supervision and the API
|
|
374
|
-
* socket for the duration of each probe. `null` means the probe failed, which
|
|
375
|
-
* every caller must preserve as unknown rather than absence. */
|
|
376
|
-
export async function captureLivenessSnapshotAsync() {
|
|
377
|
-
const stdout = await new Promise((resolve) => {
|
|
378
|
-
let child;
|
|
379
|
-
try {
|
|
380
|
-
child = spawn('ps', [...PS_SNAPSHOT_ARGS]);
|
|
381
|
-
}
|
|
382
|
-
catch {
|
|
383
|
-
return resolve(null);
|
|
384
|
-
}
|
|
385
|
-
let out = '';
|
|
386
|
-
let settled = false;
|
|
387
|
-
const settle = (value) => {
|
|
388
|
-
if (settled)
|
|
389
|
-
return;
|
|
390
|
-
settled = true;
|
|
391
|
-
clearTimeout(timer);
|
|
392
|
-
resolve(value);
|
|
393
|
-
};
|
|
394
|
-
const timer = setTimeout(() => {
|
|
395
|
-
try {
|
|
396
|
-
child.kill('SIGKILL');
|
|
397
|
-
}
|
|
398
|
-
catch { /* already gone */ }
|
|
399
|
-
settle(null);
|
|
400
|
-
}, PS_SNAPSHOT_TIMEOUT_MS);
|
|
401
|
-
timer.unref?.();
|
|
402
|
-
child.stdout.on('data', (d) => (out += d.toString()));
|
|
403
|
-
child.stderr.on('data', () => { });
|
|
404
|
-
child.on('error', () => settle(null));
|
|
405
|
-
child.on('close', (status) => settle(status === 0 ? out : null));
|
|
406
|
-
});
|
|
407
|
-
return stdout === null ? null : parseLivenessTable(stdout);
|
|
408
|
-
}
|
|
409
|
-
function parseLivenessTable(stdout) {
|
|
410
|
-
const processes = new Map();
|
|
411
|
-
const childrenOf = new Map();
|
|
412
|
-
for (const line of stdout.split('\n')) {
|
|
413
|
-
const trimmed = line.trim();
|
|
414
|
-
if (trimmed === '')
|
|
415
|
-
continue;
|
|
416
|
-
// lstart is five whitespace-delimited fields on BSD ps and procps-ng.
|
|
417
|
-
const m = /^(\d+)\s+(\d+)\s+(\S+)\s+(\S+(?:\s+\S+){4})\s+(.+)$/.exec(trimmed);
|
|
418
|
-
if (m === null)
|
|
419
|
-
continue;
|
|
420
|
-
const pid = Number(m[1]);
|
|
421
|
-
const ppid = Number(m[2]);
|
|
422
|
-
const stat = m[3];
|
|
423
|
-
const lstart = m[4];
|
|
424
|
-
const command = m[5].trim();
|
|
425
|
-
if (!Number.isInteger(pid) || pid <= 0 || !Number.isInteger(ppid) || ppid < 0 || command === '')
|
|
426
|
-
continue;
|
|
427
|
-
processes.set(pid, { zombie: stat.startsWith('Z'), identity: composeIdentity(pid, lstart), command });
|
|
428
|
-
const siblings = childrenOf.get(ppid);
|
|
429
|
-
if (siblings === undefined)
|
|
430
|
-
childrenOf.set(ppid, [pid]);
|
|
431
|
-
else
|
|
432
|
-
siblings.push(pid);
|
|
433
|
-
}
|
|
434
|
-
return { processes, childrenOf };
|
|
435
|
-
}
|
|
436
|
-
/** BFS over an already-parsed ppid → children-pid[] map, starting from
|
|
437
|
-
* `rootPid`'s children. Pure (no `ps` spawn) — split out of `descendantPids`
|
|
438
|
-
* so `captureTeardownSnapshot` can walk the SAME process snapshot it
|
|
439
|
-
* already paid for, rather than re-spawning `ps`. */
|
|
440
|
-
function descendantPidsFrom(rootPid, childrenOf) {
|
|
441
|
-
const out = [];
|
|
442
|
-
const seen = new Set([rootPid]);
|
|
443
|
-
const queue = [...(childrenOf.get(rootPid) ?? [])];
|
|
444
|
-
while (queue.length > 0) {
|
|
445
|
-
const pid = queue.shift();
|
|
446
|
-
if (seen.has(pid))
|
|
447
|
-
continue; // guard against a malformed/cyclic ps snapshot
|
|
448
|
-
seen.add(pid);
|
|
449
|
-
out.push(pid);
|
|
450
|
-
const kids = childrenOf.get(pid);
|
|
451
|
-
if (kids !== undefined)
|
|
452
|
-
queue.push(...kids);
|
|
453
|
-
}
|
|
454
|
-
return out;
|
|
455
|
-
}
|
|
456
|
-
/** Every transitive descendant of `rootPid`, discovered by walking `ps`'s
|
|
457
|
-
* pid/ppid table (BFS) — NOT process-GROUP membership. The pi SDK's bash tool
|
|
458
|
-
* spawns its shell child with
|
|
459
|
-
* `detached: true` (verified in `@earendil-works/pi-agent-core`'s
|
|
460
|
-
* `harness/env/nodejs.js`), which calls `setsid()` and puts that child in a
|
|
461
|
-
* brand-new process GROUP of its own — so `kill(-rootPid)` never reaches it.
|
|
462
|
-
* `setsid()` changes only SID/PGID, NEVER ppid, so the child (and its own
|
|
463
|
-
* descendants) is still discoverable by walking parentage from `rootPid`, as
|
|
464
|
-
* long as `rootPid`'s OS process is still alive when we walk (a fully-dead
|
|
465
|
-
* parent is reparented away by the kernel immediately on exit, severing this
|
|
466
|
-
* link — the wedged-but-alive broker this fix targets never hits that). Best-
|
|
467
|
-
* effort: returns `[]` (never throws) on any `ps` failure, exactly like
|
|
468
|
-
* `killProcessGroup`'s ESRCH-swallowing. */
|
|
469
|
-
export function descendantPids(rootPid) {
|
|
470
|
-
if (!Number.isInteger(rootPid) || rootPid <= 0)
|
|
471
|
-
return [];
|
|
472
|
-
const table = captureLivenessSnapshot();
|
|
473
|
-
if (table === null)
|
|
474
|
-
return [];
|
|
475
|
-
return descendantPidsFrom(rootPid, table.childrenOf);
|
|
476
|
-
}
|
|
477
|
-
/** Capture a portable process-identity fingerprint — `ps`'s `lstart` column,
|
|
478
|
-
* the process's full wall-clock start time — for each of `pids`, in ONE
|
|
479
|
-
* batched `ps -p <list>` call. `lstart` is a standard format keyword on BOTH
|
|
480
|
-
* BSD ps (macOS) and procps-ng (Linux), so this needs no `/proc` parsing or
|
|
481
|
-
* other Linux-only machinery. Used to guard against PID REUSE during the
|
|
482
|
-
* multi-second teardown escalation ladder: a
|
|
483
|
-
* captured pid can exit and the OS can recycle it for an unrelated process
|
|
484
|
-
* before the SIGKILL rung fires, and a bare `kill(pid, 0)` / `kill(pid, sig)`
|
|
485
|
-
* cannot tell the difference.
|
|
486
|
-
*
|
|
487
|
-
* Returns `null` — NOT an empty map — when the `ps` PROBE ITSELF failed (it
|
|
488
|
-
* could not be spawned, or was killed by the timeout): a probe failure means
|
|
489
|
-
* we have NO information, which is a fundamentally different outcome from a
|
|
490
|
-
* probe that SUCCEEDED and simply found no row for a given pid (that pid is
|
|
491
|
-
* genuinely gone). Collapsing these two into the same empty map is unsafe:
|
|
492
|
-
* `killProcessTreePids` cannot tell "pid confirmed gone" from "we don't know"
|
|
493
|
-
* without this
|
|
494
|
-
* distinction, and misreading a failed probe as positive proof of
|
|
495
|
-
* absence/reuse either signals a reused stranger or — worse — silently skips
|
|
496
|
-
* reaping a real live orphan. A successful call may still return a map with
|
|
497
|
-
* no entry for some/all of `pids` (those pids have no current row — genuinely
|
|
498
|
-
* gone); that is the valid empty-or-partial case and is NOT a failure.
|
|
499
|
-
*
|
|
500
|
-
* EXIT STATUS IS NOT THE FAILURE SIGNAL. `ps` exits 1 — on BOTH BSD ps and
|
|
501
|
-
* procps-ng — when it matched no process at all, which is precisely the
|
|
502
|
-
* "probe succeeded, that pid is gone" case, and exits 1 with PARTIAL stdout
|
|
503
|
-
* when only some of a batch's pids still exist. Reading a non-zero exit as a
|
|
504
|
-
* probe failure therefore turned every confirmed-dead pid into
|
|
505
|
-
* `'indeterminate'` (`recordedPidLiveness`), so a just-killed broker read as
|
|
506
|
-
* "can't confirm" — never as dead. Callers that fail open on indeterminate
|
|
507
|
-
* (`ensureAttach`'s revive decision, the daemon's exit policy) then treat a
|
|
508
|
-
* dead broker as live forever. Discriminate on whether the PROCESS RAN
|
|
509
|
-
* (`r.error`/`r.signal`) and whether it complained (`stderr`), never on what
|
|
510
|
-
* it exited with: a real argument/usage failure writes a diagnostic to stderr
|
|
511
|
-
* (`ps: process id too large`), while "matched nothing" is silent. */
|
|
512
|
-
export function capturePidIdentities(pids) {
|
|
513
|
-
const valid = pids.filter((pid) => Number.isInteger(pid) && pid > 0);
|
|
514
|
-
const out = new Map();
|
|
515
|
-
if (valid.length === 0)
|
|
516
|
-
return out;
|
|
517
|
-
try {
|
|
518
|
-
const r = spawnSync('ps', ['-o', 'pid=,lstart=', '-p', valid.join(',')], { encoding: 'utf8', timeout: 2000 });
|
|
519
|
-
if (r.error != null || r.signal != null || typeof r.stdout !== 'string')
|
|
520
|
-
return null;
|
|
521
|
-
if (typeof r.stderr === 'string' && r.stderr.trim() !== '')
|
|
522
|
-
return null;
|
|
523
|
-
for (const line of r.stdout.split('\n')) {
|
|
524
|
-
const trimmed = line.trim();
|
|
525
|
-
if (trimmed === '')
|
|
526
|
-
continue;
|
|
527
|
-
// Only the FIRST token (pid) is split on whitespace — `lstart` is a
|
|
528
|
-
// human-readable timestamp that itself CONTAINS spaces (e.g. "Wed Jul
|
|
529
|
-
// 3 10:23:45 2026"), so everything after the first space is kept
|
|
530
|
-
// verbatim as the identity string. Exact string equality later is
|
|
531
|
-
// sufficient; nothing here needs to parse it as a real date.
|
|
532
|
-
const spaceIdx = trimmed.indexOf(' ');
|
|
533
|
-
if (spaceIdx === -1)
|
|
534
|
-
continue;
|
|
535
|
-
const pid = Number(trimmed.slice(0, spaceIdx));
|
|
536
|
-
const startedAt = trimmed.slice(spaceIdx + 1).trim();
|
|
537
|
-
if (!Number.isInteger(pid) || pid <= 0 || startedAt === '')
|
|
538
|
-
continue;
|
|
539
|
-
out.set(pid, composeIdentity(pid, startedAt));
|
|
540
|
-
}
|
|
541
|
-
return out;
|
|
542
|
-
}
|
|
543
|
-
catch {
|
|
544
|
-
return null;
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
/** Read one pid's current full command line for a destructive caller that
|
|
548
|
-
* must freshly re-confirm process ownership immediately before signaling.
|
|
549
|
-
* Failure and absence both return null, so uncertainty never authorizes a
|
|
550
|
-
* signal. */
|
|
551
|
-
export function capturePidCommand(pid) {
|
|
552
|
-
if (!Number.isInteger(pid) || pid <= 0)
|
|
553
|
-
return null;
|
|
554
|
-
try {
|
|
555
|
-
const r = spawnSync('ps', ['-o', 'command=', '-p', String(pid)], { encoding: 'utf8', timeout: 2000 });
|
|
556
|
-
if (r.status !== 0 || typeof r.stdout !== 'string')
|
|
557
|
-
return null;
|
|
558
|
-
const command = r.stdout.trim();
|
|
559
|
-
return command === '' ? null : command;
|
|
560
|
-
}
|
|
561
|
-
catch {
|
|
562
|
-
return null;
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
export function captureTeardownSnapshot(rootPid, expectedIdentity, excludePid) {
|
|
566
|
-
if (!Number.isInteger(rootPid) || rootPid <= 0)
|
|
567
|
-
return { tree: [], identities: null, reused: false };
|
|
568
|
-
const table = captureLivenessSnapshot();
|
|
569
|
-
if (table === null)
|
|
570
|
-
return { tree: [rootPid], identities: null, reused: false };
|
|
571
|
-
const currentRootIdentity = table.processes.get(rootPid)?.identity;
|
|
572
|
-
const reused = expectedIdentity != null &&
|
|
573
|
-
currentRootIdentity !== undefined &&
|
|
574
|
-
!identitiesMatch(currentRootIdentity, expectedIdentity);
|
|
575
|
-
if (reused)
|
|
576
|
-
return { tree: [], identities: null, reused: true };
|
|
577
|
-
const excluded = excludePid !== undefined && Number.isInteger(excludePid) && excludePid > 0
|
|
578
|
-
? new Set([excludePid, ...descendantPidsFrom(excludePid, table.childrenOf)])
|
|
579
|
-
: undefined;
|
|
580
|
-
const tree = [rootPid, ...descendantPidsFrom(rootPid, table.childrenOf)].filter((pid) => !excluded?.has(pid));
|
|
581
|
-
const identities = new Map();
|
|
582
|
-
for (const pid of tree) {
|
|
583
|
-
const id = table.processes.get(pid)?.identity;
|
|
584
|
-
if (id !== undefined)
|
|
585
|
-
identities.set(pid, id);
|
|
586
|
-
}
|
|
587
|
-
return { tree, identities, reused: false };
|
|
588
|
-
}
|
|
589
|
-
/** Best-effort signal against every pid in an ALREADY-CAPTURED tree snapshot
|
|
590
|
-
* (typically `[rootPid, ...descendantPids(rootPid)]`, taken ONCE by the
|
|
591
|
-
* caller before sending any signal — see the doc on `isProcessTreeAlive` for
|
|
592
|
-
* why re-deriving via `ps` after signaling starts is unsafe). Signals EACH
|
|
593
|
-
* pid's OWN process group (a detached SDK-spawned descendant is its own
|
|
594
|
-
* group leader — the pi bash tool's shell child)
|
|
595
|
-
* PLUS a plain `kill(pid)` on each (belt-and-suspenders for a pid that is
|
|
596
|
-
* NOT its own group leader). Every signal is best-effort — `killProcessGroup`
|
|
597
|
-
* swallows ESRCH and the plain `kill` here does too — so firing this against
|
|
598
|
-
* an already-fully-dead snapshot is a harmless no-op.
|
|
599
|
-
*
|
|
600
|
-
* `identities`, when supplied, is a
|
|
601
|
-
* `capturePidIdentities` snapshot taken alongside the pid list at the SAME
|
|
602
|
-
* moment — `null` if that INITIAL capture's `ps` probe itself failed (see
|
|
603
|
-
* `capturePidIdentities`'s doc). Before signaling EITHER the group or the
|
|
604
|
-
* plain kill for a pid, this re-derives CURRENT identities in one fresh
|
|
605
|
-
* batched call and compares — but ONLY skips on POSITIVE proof of reuse; any
|
|
606
|
-
* failure or absence of evidence falls through to the normal signal path
|
|
607
|
-
* (fail-open, matching this module's unguarded behavior):
|
|
608
|
-
*
|
|
609
|
-
* - baseline identity present AND the current probe SUCCEEDED AND the
|
|
610
|
-
* current identity for this pid is present AND DIFFERENT — the OS has
|
|
611
|
-
* recycled this pid for an unrelated process since the snapshot — SKIP
|
|
612
|
-
* (the sole skip condition; this is the actual reused-pid hazard finding
|
|
613
|
-
* 3 targets).
|
|
614
|
-
* - baseline identity present but the pid is now simply GONE (current
|
|
615
|
-
* probe succeeded, no row for this pid) — it died naturally in the
|
|
616
|
-
* meantime, not reused — SIGNAL as normal (harmless no-op on the plain
|
|
617
|
-
* kill; load-bearing for the group kill, which can still reach a
|
|
618
|
-
* surviving process that shares this now-dead pid's process GROUP).
|
|
619
|
-
* - baseline had NO identity at all for this pid (the pid was ALREADY dead
|
|
620
|
-
* at snapshot time — e.g. a broker that crashed before `teardown()` ever
|
|
621
|
-
* ran) — SIGNAL as normal regardless of the current probe: this is
|
|
622
|
-
* exactly how `killProcessGroup` on an already-dead root still reaches a
|
|
623
|
-
* live process sharing its process group (the pgid persists after the
|
|
624
|
-
* group leader exits; see `host-teardown-process-group.test.ts`'s "dead
|
|
625
|
-
* broker" case).
|
|
626
|
-
* - the INITIAL capture's probe failed outright (`identities === null`) —
|
|
627
|
-
* we have NO baseline to compare against for ANY pid — SIGNAL as normal
|
|
628
|
-
* for the whole list; the CURRENT probe is not even attempted (nothing
|
|
629
|
-
* to compare it to).
|
|
630
|
-
* - the baseline succeeded but the CURRENT probe (taken here) fails — we
|
|
631
|
-
* have NO current information — SIGNAL as normal for the whole list; a
|
|
632
|
-
* failed probe must never be read as "gone" (would risk reaching a
|
|
633
|
-
* reused stranger, the residual risk this guard cannot close) NOR as
|
|
634
|
-
* "reused" (would wrongly disable the reap for every real live pid).
|
|
635
|
-
*
|
|
636
|
-
* Callers that omit `identities` entirely (pre-existing call sites) keep the
|
|
637
|
-
* prior unguarded behavior. */
|
|
638
|
-
export function killProcessTreePids(pids, signal = 'SIGTERM', identities) {
|
|
639
|
-
const current = identities != null ? capturePidIdentities(pids) : undefined;
|
|
640
|
-
for (const pid of pids) {
|
|
641
|
-
if (identities != null && current != null) {
|
|
642
|
-
const expected = identities.get(pid);
|
|
643
|
-
const actual = current.get(pid);
|
|
644
|
-
const reused = expected !== undefined && actual !== undefined && !identitiesMatch(actual, expected);
|
|
645
|
-
if (reused)
|
|
646
|
-
continue;
|
|
647
|
-
}
|
|
648
|
-
killProcessGroup(pid, signal);
|
|
649
|
-
if (!Number.isInteger(pid) || pid <= 0)
|
|
650
|
-
continue;
|
|
651
|
-
try {
|
|
652
|
-
process.kill(pid, signal);
|
|
653
|
-
}
|
|
654
|
-
catch {
|
|
655
|
-
/* already gone */
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
/** Is `rootPid`'s process TREE — itself or any CURRENT descendant — still
|
|
660
|
-
* alive, re-deriving the descendant set fresh via `ps` on every call? Safe
|
|
661
|
-
* ONLY before any signal has been sent to this tree. Once a signal kills the
|
|
662
|
-
* root (it's typically its own process-group leader — see `launch()` in
|
|
663
|
-
* host.ts), the kernel reparents any surviving child away from `rootPid`
|
|
664
|
-
* IMMEDIATELY (standard orphan handling, confirmed empirically: a killed
|
|
665
|
-
* parent's child shows `ppid=1` within the same tick, not lazily) —
|
|
666
|
-
* silently "losing" that child from a fresh `descendantPids` walk even
|
|
667
|
-
* though it is still very much alive. Use this ONLY to watch a tree you have
|
|
668
|
-
* not touched yet (e.g. waiting out a graceful-shutdown grace window); once
|
|
669
|
-
* you start signaling, capture the pid list ONCE and check it with
|
|
670
|
-
* `isAnyPidAlive` instead — see `killProcessTreePids`. */
|
|
671
|
-
export function isProcessTreeAlive(rootPid) {
|
|
672
|
-
if (isPidAlive(rootPid))
|
|
673
|
-
return true;
|
|
674
|
-
return descendantPids(rootPid).some((pid) => isPidAlive(pid));
|
|
675
|
-
}
|
|
676
|
-
/** Is any pid in an ALREADY-CAPTURED pid list (see `killProcessTreePids`)
|
|
677
|
-
* still alive? Pure signal-0 check against the fixed list — NEVER re-walks
|
|
678
|
-
* `ps` — the correct liveness check once you've started signaling a tree
|
|
679
|
-
* (see `isProcessTreeAlive`'s doc for why re-deriving after that point would
|
|
680
|
-
* silently drop a still-alive orphan). */
|
|
681
|
-
export function isAnyPidAlive(pids) {
|
|
682
|
-
return pids.some((pid) => isPidAlive(pid));
|
|
683
|
-
}
|
|
1
|
+
var x=Object.defineProperty;var u=(e,t)=>x(e,"name",{value:t,configurable:!0});import{spawn as $,spawnSync as m}from"node:child_process";import{readFileSync as E}from"node:fs";import{readKernelBootId as O}from"./boot-id.js";function P(e){try{const t=m("ps",["-o","stat=","-p",String(e)],{encoding:"utf8",timeout:2e3});if(t.error!=null||t.signal!=null||typeof t.stdout!="string"||typeof t.stderr=="string"&&t.stderr.trim()!=="")return"unknown";const n=t.stdout.trim();return n===""?"gone":n.charAt(0)==="Z"?"zombie":"live"}catch{return"unknown"}}u(P,"psProcessState");function p(e){if(e==null)return!1;try{process.kill(e,0)}catch(n){return n.code==="EPERM"}const t=P(e);return t!=="zombie"&&t!=="gone"}u(p,"isPidAlive");function J(e){if(e==null)return!1;try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}u(J,"isPidPresent");const b=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function g(e){const t=e.indexOf("#");if(t===-1)return{base:e,ticks:void 0};const n=e.slice(t+1);return{base:e.slice(0,t),ticks:/^\d+$/.test(n)?n:void 0}}u(g,"splitIdentity");function S(e,t){const n=g(e),r=g(t);return n.ticks!==void 0&&r.ticks!==void 0?b.test(n.base)&&b.test(r.base)?n.base===r.base&&n.ticks===r.ticks:n.ticks===r.ticks:n.base===r.base}u(S,"identitiesMatch");function U(e,t,n){const r=!!process.env.CRTR_DEBUG_PID_LIVENESS;if(e==null)return"dead";if(n===null)return r&&d(e,!1,t,"probe-null","ps snapshot failed \u2192 indeterminate","indeterminate"),"indeterminate";const i=n?.processes.get(e),s=n===void 0?p(e):i!==void 0&&!i.zombie;if(!s)return r&&d(e,s,t,n===void 0?"no-probe":"no-entry","process absent/zombie \u2192 dead","dead"),"dead";if(t==null)return r&&d(e,s,t,"no-probe","no baseline \u2192 trust process presence","alive"),"alive";let o;if(n===void 0){const l=w([e]);if(l==null)return r&&d(e,s,t,"probe-null","ps probe failed \u2192 indeterminate","indeterminate"),"indeterminate";if(o=l.get(e),o===void 0)return r&&d(e,s,t,"no-entry","no identity row for pid (race) \u2192 dead","dead"),"dead"}else o=i.identity;const c=S(o,t);return r&&d(e,s,t,"value",c?"identity matches expected \u2192 alive":"identity differs from expected \u2192 REUSED \u2192 dead",c?"alive":"dead",o),c?"alive":"dead"}u(U,"recordedPidLiveness");function d(e,t,n,r,i,s,o){const c=[`pid=${String(e)}`,`isPidAlive=${t}`,`expectedIdentity=${n===void 0?"undefined":n===null?"null":JSON.stringify(n)}`,`capturePidIdentities=${r}${r==="value"?`(${JSON.stringify(o)})`:""}`,`branch=${JSON.stringify(i)}`,`returned=${s}`];process.stderr.write(`[recordedPidLiveness] ${c.join(" ")}
|
|
2
|
+
`)}u(d,"logPidLivenessDecision");function _(e,t="SIGTERM"){if(!(!Number.isInteger(e)||e<=0))try{process.kill(-e,t)}catch{}}u(_,"killProcessGroup");function A(e){try{const t=E(`/proc/${e}/stat`,"utf8"),n=t.lastIndexOf(")");if(n===-1)return null;const i=t.slice(n+2).trim().split(/\s+/)[19];return i!==void 0&&/^\d+$/.test(i)?i:null}catch{return null}}u(A,"procStartTicks");const M=6e4;function L(e,t=Date.now,n=M){let r=null,i=0;return()=>{if(r!==null)return r;const s=t();if(s<i)return null;const o=e();return o!==null?r=o:(i=s+n,null)}}u(L,"makeBootIdCache");const R=L(O);function j(e){const{base:t,ticks:n}=g(e);return n!==void 0&&!b.test(t)}u(j,"isLegacyTicksIdentity");function F(e){const{base:t,ticks:n}=g(e);return n!==void 0&&b.test(t)}u(F,"isBootScopedIdentity");function k(e,t,n={}){const r=n.ticks!==void 0?n.ticks:A(e);return r===null?t:`${(n.bootId!==void 0?n.bootId:R())??t}#${r}`}u(k,"composeIdentity");const I=["-Ao","pid=,ppid=,stat=,lstart=,command="],v=2e3;function N(){let e;try{const t=m("ps",[...I],{encoding:"utf8",timeout:v,maxBuffer:8388608});if(t.status!==0||typeof t.stdout!="string")return null;e=t.stdout}catch{return null}return T(e)}u(N,"captureLivenessSnapshot");async function H(){const e=await new Promise(t=>{let n;try{n=$("ps",[...I])}catch{return t(null)}let r="",i=!1;const s=u(c=>{i||(i=!0,clearTimeout(o),t(c))},"settle"),o=setTimeout(()=>{try{n.kill("SIGKILL")}catch{}s(null)},v);o.unref?.(),n.stdout.on("data",c=>r+=c.toString()),n.stderr.on("data",()=>{}),n.on("error",()=>s(null)),n.on("close",c=>s(c===0?r:null))});return e===null?null:T(e)}u(H,"captureLivenessSnapshotAsync");function T(e){const t=new Map,n=new Map;for(const r of e.split(`
|
|
3
|
+
`)){const i=r.trim();if(i==="")continue;const s=/^(\d+)\s+(\d+)\s+(\S+)\s+(\S+(?:\s+\S+){4})\s+(.+)$/.exec(i);if(s===null)continue;const o=Number(s[1]),c=Number(s[2]),l=s[3],f=s[4],a=s[5].trim();if(!Number.isInteger(o)||o<=0||!Number.isInteger(c)||c<0||a==="")continue;t.set(o,{zombie:l.startsWith("Z"),identity:k(o,f),command:a});const y=n.get(c);y===void 0?n.set(c,[o]):y.push(o)}return{processes:t,childrenOf:n}}u(T,"parseLivenessTable");function h(e,t){const n=[],r=new Set([e]),i=[...t.get(e)??[]];for(;i.length>0;){const s=i.shift();if(r.has(s))continue;r.add(s),n.push(s);const o=t.get(s);o!==void 0&&i.push(...o)}return n}u(h,"descendantPidsFrom");function B(e){if(!Number.isInteger(e)||e<=0)return[];const t=N();return t===null?[]:h(e,t.childrenOf)}u(B,"descendantPids");function w(e){const t=e.filter(r=>Number.isInteger(r)&&r>0),n=new Map;if(t.length===0)return n;try{const r=m("ps",["-o","pid=,lstart=","-p",t.join(",")],{encoding:"utf8",timeout:2e3});if(r.error!=null||r.signal!=null||typeof r.stdout!="string"||typeof r.stderr=="string"&&r.stderr.trim()!=="")return null;for(const i of r.stdout.split(`
|
|
4
|
+
`)){const s=i.trim();if(s==="")continue;const o=s.indexOf(" ");if(o===-1)continue;const c=Number(s.slice(0,o)),l=s.slice(o+1).trim();!Number.isInteger(c)||c<=0||l===""||n.set(c,k(c,l))}return n}catch{return null}}u(w,"capturePidIdentities");function K(e){if(!Number.isInteger(e)||e<=0)return null;try{const t=m("ps",["-o","command=","-p",String(e)],{encoding:"utf8",timeout:2e3});if(t.status!==0||typeof t.stdout!="string")return null;const n=t.stdout.trim();return n===""?null:n}catch{return null}}u(K,"capturePidCommand");function V(e,t,n){if(!Number.isInteger(e)||e<=0)return{tree:[],identities:null,reused:!1};const r=N();if(r===null)return{tree:[e],identities:null,reused:!1};const i=r.processes.get(e)?.identity;if(t!=null&&i!==void 0&&!S(i,t))return{tree:[],identities:null,reused:!0};const o=n!==void 0&&Number.isInteger(n)&&n>0?new Set([n,...h(n,r.childrenOf)]):void 0,c=[e,...h(e,r.childrenOf)].filter(f=>!o?.has(f)),l=new Map;for(const f of c){const a=r.processes.get(f)?.identity;a!==void 0&&l.set(f,a)}return{tree:c,identities:l,reused:!1}}u(V,"captureTeardownSnapshot");function Z(e,t="SIGTERM",n){const r=n!=null?w(e):void 0;for(const i of e){if(n!=null&&r!=null){const s=n.get(i),o=r.get(i);if(s!==void 0&&o!==void 0&&!S(o,s))continue}if(_(i,t),!(!Number.isInteger(i)||i<=0))try{process.kill(i,t)}catch{}}}u(Z,"killProcessTreePids");function q(e){return p(e)?!0:B(e).some(t=>p(t))}u(q,"isProcessTreeAlive");function W(e){return e.some(t=>p(t))}u(W,"isAnyPidAlive");export{N as captureLivenessSnapshot,H as captureLivenessSnapshotAsync,K as capturePidCommand,w as capturePidIdentities,V as captureTeardownSnapshot,k as composeIdentity,B as descendantPids,S as identitiesMatch,W as isAnyPidAlive,F as isBootScopedIdentity,j as isLegacyTicksIdentity,p as isPidAlive,J as isPidPresent,q as isProcessTreeAlive,_ as killProcessGroup,Z as killProcessTreePids,L as makeBootIdCache,U as recordedPidLiveness};
|