@north-light/crouter 0.3.318 → 0.3.319
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 +5 -4
- package/runtime.lock.json +5 -5
- 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/config.js
CHANGED
|
@@ -1,1059 +1 @@
|
|
|
1
|
-
import { envProfileId } from '../shared/env.js';
|
|
2
|
-
import { basename, dirname, join } from 'node:path';
|
|
3
|
-
import { isDeepStrictEqual } from 'node:util';
|
|
4
|
-
import { CONFIG_FILE, STATE_FILE, CONDENSED_HISTORY_MODES, MOUSE_MODE_DEFAULTS, WHIP_MESSAGE_MODES, DEFAULT_WHIP_MESSAGES, defaultScopeConfig, defaultScopeState, defaultModelLaddersConfig, defaultKindsConfig, defaultRemoteCanvasConfig } from '../types.js';
|
|
5
|
-
import { BINDING_CATALOG, BINDING_IDS, isAttachPaneBinding } from './keybindings/catalog.js';
|
|
6
|
-
import { notFound, usage } from './errors.js';
|
|
7
|
-
import { emitEvent } from './events/emit.js';
|
|
8
|
-
import { atomicWriteJson, readJsonIfExists, ensureDir } from './fs-utils.js';
|
|
9
|
-
import { scopeRoot, requireScopeRoot, findProjectScopeRoots, userScopeRoot } from './scope.js';
|
|
10
|
-
import { listInstalledPluginsInRoot } from './installed-plugins.js';
|
|
11
|
-
import { profileRoot, listProfiles } from './profiles/manifest.js';
|
|
12
|
-
import { canonicalRoot, projectStore, userStore } from './scoped-state/paths.js';
|
|
13
|
-
import { convertLegacyScopedStore, initializeFreshScopedStore } from './scoped-state/migrate.js';
|
|
14
|
-
import { mutateRawSettings, readBookkeeping, readRawSettings, readRawSettingsWithRevision, replaceRawSettings, writeBookkeeping, writeRawSettings } from './scoped-state/settings.js';
|
|
15
|
-
import { withExclusiveDirectoryLock } from './exclusive-lock.js';
|
|
16
|
-
import { SCOPE_CONFIG_KEYS } from './user-settings.js';
|
|
17
|
-
import { normalizeWorkingGerunds } from '../shared/working-activity.js';
|
|
18
|
-
import { mergePageComponentLayers, normalizePageComponents } from './human/page-catalog.js';
|
|
19
|
-
function configPathFor(root) {
|
|
20
|
-
return join(root, CONFIG_FILE);
|
|
21
|
-
}
|
|
22
|
-
function withConfigPathLock(path, run) {
|
|
23
|
-
ensureDir(dirname(path));
|
|
24
|
-
return withExclusiveDirectoryLock(`${path}.lock`, () => run(path), { timeoutError: () => new Error(`timed out waiting for config lock: ${path}`) });
|
|
25
|
-
}
|
|
26
|
-
function statePathFor(root) {
|
|
27
|
-
return join(root, STATE_FILE);
|
|
28
|
-
}
|
|
29
|
-
export function configPath(scope) {
|
|
30
|
-
const root = scopeRoot(scope);
|
|
31
|
-
return root ? configPathFor(root) : null;
|
|
32
|
-
}
|
|
33
|
-
export function statePath(scope) {
|
|
34
|
-
const root = scopeRoot(scope);
|
|
35
|
-
return root ? statePathFor(root) : null;
|
|
36
|
-
}
|
|
37
|
-
function settingsOwnerForRoot(root) {
|
|
38
|
-
const canonical = canonicalRoot(root);
|
|
39
|
-
const userRoot = canonicalRoot(userScopeRoot());
|
|
40
|
-
if (canonical === userRoot)
|
|
41
|
-
return { store: userStore(userRoot), key: 'user', kind: 'user', root: userRoot };
|
|
42
|
-
// Project roots can be classified without opening the user store. This keeps a
|
|
43
|
-
// fresh project usable when an unrelated legacy user root still needs conversion.
|
|
44
|
-
if (basename(canonical) === '.crouter') {
|
|
45
|
-
convertLegacyScopedStore({ kind: 'project', root: canonical });
|
|
46
|
-
return { store: projectStore(canonical), key: 'project', kind: 'project', root: canonical };
|
|
47
|
-
}
|
|
48
|
-
for (const profile of listProfiles()) {
|
|
49
|
-
const profilePath = canonicalRoot(profileRoot(profile.profileId));
|
|
50
|
-
if (canonical === profilePath)
|
|
51
|
-
return { store: userStore(userRoot), key: `profile:${profile.profileId}`, kind: 'profile', root: profilePath, profileId: profile.profileId };
|
|
52
|
-
}
|
|
53
|
-
throw new Error(`settings root is not a recognized owner: ${root}`);
|
|
54
|
-
}
|
|
55
|
-
function readRawAtRoot(root) {
|
|
56
|
-
const owner = settingsOwnerForRoot(root);
|
|
57
|
-
if (owner.kind === 'project')
|
|
58
|
-
return readJsonIfExists(configPathFor(owner.root));
|
|
59
|
-
return readRawSettings(owner);
|
|
60
|
-
}
|
|
61
|
-
function writeRawAtRoot(root, raw) {
|
|
62
|
-
const owner = settingsOwnerForRoot(root);
|
|
63
|
-
if (owner.kind === 'project') {
|
|
64
|
-
withConfigPathLock(configPathFor(owner.root), (path) => atomicWriteJson(path, raw));
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
writeRawSettings(owner, raw);
|
|
68
|
-
}
|
|
69
|
-
function mutateRawAtRoot(root, mutate) {
|
|
70
|
-
const owner = settingsOwnerForRoot(root);
|
|
71
|
-
if (owner.kind === 'project')
|
|
72
|
-
return withConfigPathLock(configPathFor(owner.root), (path) => { const result = mutate(readJsonIfExists(path) ?? {}); atomicWriteJson(path, result.next); return result.value; });
|
|
73
|
-
return mutateRawSettings(owner, (raw) => mutate(raw));
|
|
74
|
-
}
|
|
75
|
-
export function readConfig(scope) { const root = scopeRoot(scope); return root ? readConfigAtRoot(root) : defaultScopeConfig(); }
|
|
76
|
-
export function readConfigAtRoot(root) { const existing = readRawAtRoot(root); return existing ? mergeConfig(existing) : defaultScopeConfig(); }
|
|
77
|
-
export function readState(scope) { const root = scopeRoot(scope); if (!root)
|
|
78
|
-
return defaultScopeState(); return readBookkeeping(settingsOwnerForRoot(root)); }
|
|
79
|
-
export class InvalidRawSettingsError extends Error {
|
|
80
|
-
constructor(cause) {
|
|
81
|
-
super(`settings cannot be merged: ${cause instanceof Error ? cause.message : String(cause)}`);
|
|
82
|
-
this.name = 'InvalidRawSettingsError';
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
function rawSettingsOwnerForTarget(target) {
|
|
86
|
-
if (target.scope === 'user')
|
|
87
|
-
return settingsOwnerForRoot(userScopeRoot());
|
|
88
|
-
if (!listProfiles().some((profile) => profile.profileId === target.profileId)) {
|
|
89
|
-
throw notFound(`profile not found: ${target.profileId}`, { received: target.profileId, next: 'Run `crtr profile list` to see available profiles.' });
|
|
90
|
-
}
|
|
91
|
-
return settingsOwnerForRoot(profileRoot(target.profileId));
|
|
92
|
-
}
|
|
93
|
-
export function readRawSettingsForTarget(target) {
|
|
94
|
-
return readRawSettingsWithRevision(rawSettingsOwnerForTarget(target));
|
|
95
|
-
}
|
|
96
|
-
export function replaceRawSettingsForTarget(target, next, ifRevision) {
|
|
97
|
-
return replaceRawSettings(rawSettingsOwnerForTarget(target), next, ifRevision, (settings) => {
|
|
98
|
-
try {
|
|
99
|
-
mergeConfig(settings);
|
|
100
|
-
}
|
|
101
|
-
catch (error) {
|
|
102
|
-
throw new InvalidRawSettingsError(error);
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
export function updateRawConfigAtomically(scope, mutate) { const root = requireScopeRoot(scope); return mutateRawAtRoot(root, (latest) => { const next = mutate(latest); return { value: next, next }; }); }
|
|
107
|
-
export function writeConfig(scope, config) { writeRawAtRoot(requireScopeRoot(scope), config); }
|
|
108
|
-
export function writeRawConfig(scope, config) { writeRawAtRoot(requireScopeRoot(scope), config); }
|
|
109
|
-
export function writeState(scope, state) { const root = requireScopeRoot(scope); writeBookkeeping(settingsOwnerForRoot(root), state); }
|
|
110
|
-
export function ensureScopeInitialized(scope, root) { ensureDir(root); const owner = scope === 'user' ? settingsOwnerForRoot(userScopeRoot()) : settingsOwnerForRoot(root); initializeFreshScopedStore({ kind: owner.kind === 'user' ? 'user' : 'project', root: owner.store.root }); if (owner.kind === 'project' && readJsonIfExists(configPathFor(owner.root)) === null) {
|
|
111
|
-
const { modelLadders: _a, keybindings: _b, tmux_passthrough: _c, brokerThresholds, lifecycle, ...rest } = defaultScopeConfig();
|
|
112
|
-
writeRawAtRoot(owner.root, rest);
|
|
113
|
-
} }
|
|
114
|
-
function normalizeKeybindings(raw) {
|
|
115
|
-
if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
|
|
116
|
-
return {};
|
|
117
|
-
const out = {};
|
|
118
|
-
for (const [id, gestures] of Object.entries(raw)) {
|
|
119
|
-
if (Array.isArray(gestures) && gestures.every((gesture) => typeof gesture === 'string')) {
|
|
120
|
-
out[id] = [...gestures];
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return out;
|
|
124
|
-
}
|
|
125
|
-
const ATTACH_PANE_BINDING_IDS = new Set(BINDING_CATALOG.filter(isAttachPaneBinding).map((definition) => definition.id));
|
|
126
|
-
/** Normalize the user-owned list of attach actions allowed to bridge through an
|
|
127
|
-
* occupied tmux root binding. Unknown and non-attach ids have no effect. */
|
|
128
|
-
export function normalizeTmuxPassthrough(raw) {
|
|
129
|
-
if (!Array.isArray(raw))
|
|
130
|
-
return [];
|
|
131
|
-
return [...new Set(raw.filter((id) => typeof id === 'string' && BINDING_IDS.has(id) && ATTACH_PANE_BINDING_IDS.has(id)))];
|
|
132
|
-
}
|
|
133
|
-
function mergeModelLadders(raw, base = defaultModelLaddersConfig()) {
|
|
134
|
-
const defaults = base;
|
|
135
|
-
if (raw === null || typeof raw !== 'object')
|
|
136
|
-
return defaults;
|
|
137
|
-
const r = raw;
|
|
138
|
-
const out = {
|
|
139
|
-
anthropic: { ...defaults.anthropic },
|
|
140
|
-
openai: { ...defaults.openai },
|
|
141
|
-
...(defaults.defaultProvider !== undefined ? { defaultProvider: defaults.defaultProvider } : {}),
|
|
142
|
-
};
|
|
143
|
-
if (r.defaultProvider === 'anthropic' || r.defaultProvider === 'openai') {
|
|
144
|
-
out.defaultProvider = r.defaultProvider;
|
|
145
|
-
}
|
|
146
|
-
for (const provider of ['anthropic', 'openai']) {
|
|
147
|
-
const over = r[provider];
|
|
148
|
-
if (over === null || typeof over !== 'object')
|
|
149
|
-
continue;
|
|
150
|
-
for (const [strength, value] of Object.entries(over)) {
|
|
151
|
-
if ((strength === 'ultra' || strength === 'strong' || strength === 'medium' || strength === 'light') && typeof value === 'string') {
|
|
152
|
-
out[provider][strength] = value;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
return out;
|
|
157
|
-
}
|
|
158
|
-
function validStrength(value) {
|
|
159
|
-
return value === 'ultra' || value === 'strong' || value === 'medium' || value === 'light';
|
|
160
|
-
}
|
|
161
|
-
const MODEL_STRENGTHS = ['ultra', 'strong', 'medium', 'light'];
|
|
162
|
-
function routeRecord() {
|
|
163
|
-
return Object.create(null);
|
|
164
|
-
}
|
|
165
|
-
function setRouteRecord(record, routeId, value) {
|
|
166
|
-
Object.defineProperty(record, routeId, { value, writable: true, enumerable: true, configurable: true });
|
|
167
|
-
}
|
|
168
|
-
function copyRouteRecord(record) {
|
|
169
|
-
const copy = routeRecord();
|
|
170
|
-
for (const [routeId, value] of Object.entries(record ?? {}))
|
|
171
|
-
setRouteRecord(copy, routeId, value);
|
|
172
|
-
return copy;
|
|
173
|
-
}
|
|
174
|
-
function routeInvalid(routeId, rule) {
|
|
175
|
-
emitEvent({ level: 'warn', event: 'config.model_routes.invalid', fields: { route_id: routeId, rule } });
|
|
176
|
-
}
|
|
177
|
-
/** Overlay raw route patches first so a higher scope may replace one cell of a
|
|
178
|
-
* complete lower route. Completeness belongs to the resulting effective route,
|
|
179
|
-
* never an individual raw scope patch. */
|
|
180
|
-
function mergeModelRoutePatches(raw, base = {}) {
|
|
181
|
-
const out = copyRouteRecord(base);
|
|
182
|
-
if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
|
|
183
|
-
return out;
|
|
184
|
-
for (const [routeId, value] of Object.entries(raw)) {
|
|
185
|
-
if (routeId.trim() === '') {
|
|
186
|
-
routeInvalid(routeId, 'route id must be a non-empty string');
|
|
187
|
-
continue;
|
|
188
|
-
}
|
|
189
|
-
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
190
|
-
routeInvalid(routeId, 'route must be an object');
|
|
191
|
-
continue;
|
|
192
|
-
}
|
|
193
|
-
const patch = value;
|
|
194
|
-
const current = out[routeId];
|
|
195
|
-
const route = { ...current };
|
|
196
|
-
let rule;
|
|
197
|
-
for (const field of ['family', 'credentialSource', 'providerId']) {
|
|
198
|
-
const candidate = patch[field];
|
|
199
|
-
if (candidate === undefined)
|
|
200
|
-
continue;
|
|
201
|
-
if (typeof candidate !== 'string' || candidate.trim() === '') {
|
|
202
|
-
rule = `${field} must be a non-empty string`;
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
route[field] = candidate;
|
|
206
|
-
}
|
|
207
|
-
if (rule === undefined && patch.models !== undefined) {
|
|
208
|
-
if (patch.models === null || typeof patch.models !== 'object' || Array.isArray(patch.models))
|
|
209
|
-
rule = 'models must be an object';
|
|
210
|
-
else {
|
|
211
|
-
const models = { ...current?.models };
|
|
212
|
-
for (const [strength, spec] of Object.entries(patch.models)) {
|
|
213
|
-
if (!validStrength(strength)) {
|
|
214
|
-
rule = `models.${strength} is not a model strength`;
|
|
215
|
-
break;
|
|
216
|
-
}
|
|
217
|
-
if (typeof spec !== 'string' || spec.trim() === '') {
|
|
218
|
-
rule = `models.${strength} must be a non-empty provider/id ref`;
|
|
219
|
-
break;
|
|
220
|
-
}
|
|
221
|
-
const slash = spec.indexOf('/');
|
|
222
|
-
if (slash <= 0 || slash === spec.length - 1) {
|
|
223
|
-
rule = `models.${strength} must be provider/id`;
|
|
224
|
-
break;
|
|
225
|
-
}
|
|
226
|
-
models[strength] = spec;
|
|
227
|
-
}
|
|
228
|
-
route.models = models;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
if (rule === undefined && route.models !== undefined && route.providerId !== undefined) {
|
|
232
|
-
for (const [strength, spec] of Object.entries(route.models)) {
|
|
233
|
-
if (spec.slice(0, spec.indexOf('/')) !== route.providerId) {
|
|
234
|
-
rule = `models.${strength} provider prefix must equal providerId`;
|
|
235
|
-
break;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
if (rule !== undefined) {
|
|
240
|
-
routeInvalid(routeId, rule);
|
|
241
|
-
continue;
|
|
242
|
-
}
|
|
243
|
-
setRouteRecord(out, routeId, route);
|
|
244
|
-
}
|
|
245
|
-
return out;
|
|
246
|
-
}
|
|
247
|
-
/** Resolve complete routes after every scope has overlaid its sparse raw patch.
|
|
248
|
-
* Sparse standalone routes are read for one compatibility release only: they
|
|
249
|
-
* retain their historical candidate behavior, emit a repair warning, and never
|
|
250
|
-
* gain invented cells. New writes cannot create them. */
|
|
251
|
-
function resolveModelRoutes(routes) {
|
|
252
|
-
const complete = routeRecord();
|
|
253
|
-
const legacy = routeRecord();
|
|
254
|
-
for (const [routeId, route] of Object.entries(routes)) {
|
|
255
|
-
if (route.family === undefined || route.credentialSource === undefined || route.providerId === undefined || route.models === undefined) {
|
|
256
|
-
routeInvalid(routeId, 'route must include family, credentialSource, providerId, and models');
|
|
257
|
-
continue;
|
|
258
|
-
}
|
|
259
|
-
const missing = MODEL_STRENGTHS.filter((strength) => route.models[strength] === undefined);
|
|
260
|
-
if (missing.length > 0) {
|
|
261
|
-
routeInvalid(routeId, `incomplete route; missing strengths: ${missing.join(', ')}`);
|
|
262
|
-
setRouteRecord(legacy, routeId, { family: route.family, credentialSource: route.credentialSource, providerId: route.providerId, models: route.models });
|
|
263
|
-
continue;
|
|
264
|
-
}
|
|
265
|
-
setRouteRecord(complete, routeId, {
|
|
266
|
-
family: route.family,
|
|
267
|
-
credentialSource: route.credentialSource,
|
|
268
|
-
providerId: route.providerId,
|
|
269
|
-
models: route.models,
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
return { complete, legacy };
|
|
273
|
-
}
|
|
274
|
-
function assertCompleteModelRoute(routeId, route) {
|
|
275
|
-
if (routeId.trim() === '')
|
|
276
|
-
throw new Error('model route id must be a non-empty string');
|
|
277
|
-
for (const field of ['family', 'credentialSource', 'providerId']) {
|
|
278
|
-
if (typeof route[field] !== 'string' || route[field].trim() === '')
|
|
279
|
-
throw new Error(`model route "${routeId}" ${field} must be a non-empty string`);
|
|
280
|
-
}
|
|
281
|
-
const missing = MODEL_STRENGTHS.filter((strength) => route.models?.[strength] === undefined);
|
|
282
|
-
if (missing.length > 0)
|
|
283
|
-
throw new Error(`model route "${routeId}" is incomplete; missing strengths: ${missing.join(', ')}`);
|
|
284
|
-
for (const strength of MODEL_STRENGTHS) {
|
|
285
|
-
const spec = route.models[strength];
|
|
286
|
-
if (typeof spec !== 'string' || spec.trim() === '')
|
|
287
|
-
throw new Error(`model route "${routeId}" models.${strength} must be a non-empty provider/id ref`);
|
|
288
|
-
const slash = spec.indexOf('/');
|
|
289
|
-
if (slash <= 0 || slash === spec.length - 1)
|
|
290
|
-
throw new Error(`model route "${routeId}" models.${strength} must be provider/id`);
|
|
291
|
-
if (spec.slice(0, slash) !== route.providerId)
|
|
292
|
-
throw new Error(`model route "${routeId}" models.${strength} provider prefix must equal providerId`);
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
function mergeModelRouting(raw, base) {
|
|
296
|
-
if (raw === undefined)
|
|
297
|
-
return base;
|
|
298
|
-
if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
|
|
299
|
-
return base;
|
|
300
|
-
const value = raw;
|
|
301
|
-
const strings = (items) => Array.isArray(items) && items.every((item) => typeof item === 'string' && item.trim() !== '') ? [...items] : undefined;
|
|
302
|
-
const strengths = Array.isArray(value.strengthFallback) && value.strengthFallback.every((item) => validStrength(item)) ? [...value.strengthFallback] : undefined;
|
|
303
|
-
return {
|
|
304
|
-
...(strings(value.credentialSourceOrder) !== undefined ? { credentialSourceOrder: strings(value.credentialSourceOrder) } : {}),
|
|
305
|
-
...(strings(value.familyOrder) !== undefined ? { familyOrder: strings(value.familyOrder) } : {}),
|
|
306
|
-
...(strengths !== undefined ? { strengthFallback: strengths } : {}),
|
|
307
|
-
};
|
|
308
|
-
}
|
|
309
|
-
/** True when `pattern` (a `spawnEnv.allow` entry) matches EVERY possible env
|
|
310
|
-
* var name — a bare `*`, or any run of nothing but `*` characters (`**`,
|
|
311
|
-
* `***`, …). This is the one glob shape that reopens the inherit-all hole
|
|
312
|
-
* the whole spawn-env boundary exists to close, so it is rejected loud
|
|
313
|
-
* rather than silently treated as literal or silently dropped (per
|
|
314
|
-
* `cto-rejects-fallback-hedges`: fix the config, don't hedge around it). */
|
|
315
|
-
function isInheritAllGlob(pattern) {
|
|
316
|
-
return pattern !== '' && pattern.replace(/\*/g, '') === '';
|
|
317
|
-
}
|
|
318
|
-
/** Merge a raw `spawnEnv.allow` list over `base` (defaulting to empty):
|
|
319
|
-
* additive/union, not override — each scope only ADDS a name/glob it
|
|
320
|
-
* explicitly admits across the broker spawn-env boundary (`buildBrokerEnv`),
|
|
321
|
-
* never removes a lower-precedence scope's entry. Non-string entries are
|
|
322
|
-
* dropped, never thrown, mirroring `mergeKinds`/`mergeModelLadders` — but an
|
|
323
|
-
* inherit-all glob (`isInheritAllGlob`) throws immediately at config read: it
|
|
324
|
-
* is not a shape any legitimate entry can mean, and silently accepting or
|
|
325
|
-
* dropping it would either reopen the leak or hide a config mistake. */
|
|
326
|
-
function mergeSpawnEnv(raw, base = []) {
|
|
327
|
-
const r = raw;
|
|
328
|
-
const extra = Array.isArray(r?.allow) ? r.allow.filter((v) => typeof v === 'string') : [];
|
|
329
|
-
for (const pattern of extra) {
|
|
330
|
-
if (isInheritAllGlob(pattern)) {
|
|
331
|
-
throw new Error(`spawnEnv.allow: "${pattern}" matches every env var name (inherit-all) — this is exactly the leak the spawn-env boundary closes. Name the specific vars/prefixes you actually need instead (e.g. "AWS_*", "GIT_ASKPASS").`);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
return { allow: [...new Set([...base, ...extra])] };
|
|
335
|
-
}
|
|
336
|
-
/** Per-provider options, merged SHALLOWLY per provider id so a nearer scope
|
|
337
|
-
* that sets one option does not erase a sibling option from a farther scope. */
|
|
338
|
-
function mergeProviderOptions(raw, base = {}) {
|
|
339
|
-
const merged = {};
|
|
340
|
-
for (const [providerId, options] of Object.entries(base))
|
|
341
|
-
merged[providerId] = { ...options };
|
|
342
|
-
if (raw !== null && typeof raw === 'object') {
|
|
343
|
-
for (const [providerId, options] of Object.entries(raw)) {
|
|
344
|
-
if (options === null || typeof options !== 'object')
|
|
345
|
-
continue;
|
|
346
|
-
const next = { ...merged[providerId] };
|
|
347
|
-
const fastMode = options.fastMode;
|
|
348
|
-
if (typeof fastMode === 'boolean')
|
|
349
|
-
next.fastMode = fastMode;
|
|
350
|
-
merged[providerId] = next;
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
return merged;
|
|
354
|
-
}
|
|
355
|
-
/** The one bare-command-name rule, shared by the read path (`normalizeBin`)
|
|
356
|
-
* and the strict install gate (`invalidPluginBinReasons`): a name a shell can
|
|
357
|
-
* invoke verbatim and a filesystem can hold as a single symlink entry — no
|
|
358
|
-
* separator, no leading dot, no whitespace, no quoting ever required. */
|
|
359
|
-
const BIN_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
|
|
360
|
-
/** Bare names crouter owns on every node's PATH. A contribution may not take
|
|
361
|
-
* one: shadowing the CLI a node drives its own canvas with breaks the runtime
|
|
362
|
-
* contract rather than extending it. */
|
|
363
|
-
const RESERVED_BIN_NAMES = new Set(['crtr', 'crtrd']);
|
|
364
|
-
/** The one bare-command-name validator shared by `bin` and plugin `requires`.
|
|
365
|
-
* `bin` alone reserves crouter's own commands; a plugin may require any safe
|
|
366
|
-
* executable name because it does not contribute or shadow that command. */
|
|
367
|
-
function bareCommandNameIssue(name, field) {
|
|
368
|
-
if (field === 'bin' && RESERVED_BIN_NAMES.has(name))
|
|
369
|
-
return `${field}.${name} is reserved by crouter — pick another bare command name`;
|
|
370
|
-
if (!BIN_NAME_PATTERN.test(name))
|
|
371
|
-
return `${field}.${name} is not a safe bare command name (expected ${BIN_NAME_PATTERN.source})`;
|
|
372
|
-
return undefined;
|
|
373
|
-
}
|
|
374
|
-
/** Validate raw `bin` declaration shape without touching the filesystem.
|
|
375
|
-
* Install uses these findings as a hard gate for plugin manifests; scope
|
|
376
|
-
* resolution reports them through `crtr sys doctor` and continues. */
|
|
377
|
-
export function binDeclarationIssues(raw) {
|
|
378
|
-
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
379
|
-
return [{ name: 'bin', message: 'bin must be a JSON object mapping bare command name to a relative path' }];
|
|
380
|
-
}
|
|
381
|
-
const issues = [];
|
|
382
|
-
for (const [name, target] of Object.entries(raw)) {
|
|
383
|
-
const nameIssue = bareCommandNameIssue(name, 'bin');
|
|
384
|
-
if (nameIssue !== undefined)
|
|
385
|
-
issues.push({ name, message: nameIssue });
|
|
386
|
-
if (typeof target !== 'string' || target.trim() === '') {
|
|
387
|
-
issues.push({ name, message: `bin.${name} must be a non-empty relative path to an executable inside the contributor root` });
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
return issues;
|
|
391
|
-
}
|
|
392
|
-
/** Normalize one raw `bin` block (a scope `config.json`'s or a plugin
|
|
393
|
-
* manifest's) to name → root-relative path. Invalid entries never become
|
|
394
|
-
* commands; `binDeclarationIssues` keeps them visible to Doctor. */
|
|
395
|
-
export function normalizeBin(raw) {
|
|
396
|
-
if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
|
|
397
|
-
return {};
|
|
398
|
-
const out = {};
|
|
399
|
-
for (const [name, target] of Object.entries(raw)) {
|
|
400
|
-
if (bareCommandNameIssue(name, 'bin') !== undefined)
|
|
401
|
-
continue;
|
|
402
|
-
if (typeof target !== 'string' || target.trim() === '')
|
|
403
|
-
continue;
|
|
404
|
-
out[name] = target;
|
|
405
|
-
}
|
|
406
|
-
return out;
|
|
407
|
-
}
|
|
408
|
-
const HUMAN_ACTION_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
|
|
409
|
-
/** Validate `humanActions` declaration shape without touching the filesystem.
|
|
410
|
-
* Filesystem checks happen only when resolving an action or running Doctor. */
|
|
411
|
-
export function humanActionDeclarationIssues(raw) {
|
|
412
|
-
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
413
|
-
return [{ name: 'humanActions', reason: 'humanActions must be a JSON object mapping action names to {argv, cwd}', block: true }];
|
|
414
|
-
}
|
|
415
|
-
const issues = [];
|
|
416
|
-
for (const [name, value] of Object.entries(raw)) {
|
|
417
|
-
const reasons = [];
|
|
418
|
-
if (!HUMAN_ACTION_NAME_PATTERN.test(name)) {
|
|
419
|
-
reasons.push(`action name must match ${HUMAN_ACTION_NAME_PATTERN.source}`);
|
|
420
|
-
}
|
|
421
|
-
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
422
|
-
reasons.push('action must be an object with argv and cwd');
|
|
423
|
-
}
|
|
424
|
-
else {
|
|
425
|
-
const action = value;
|
|
426
|
-
const extras = Object.keys(action).filter((key) => key !== 'argv' && key !== 'cwd');
|
|
427
|
-
if (extras.length > 0)
|
|
428
|
-
reasons.push(`action has unsupported field${extras.length === 1 ? '' : 's'}: ${extras.join(', ')}`);
|
|
429
|
-
if (!Array.isArray(action.argv) || action.argv.length === 0 || !action.argv.every((arg) => typeof arg === 'string' && arg.length > 0)) {
|
|
430
|
-
reasons.push('argv must be a non-empty array of non-empty strings');
|
|
431
|
-
}
|
|
432
|
-
if (typeof action.cwd !== 'string' || action.cwd.length === 0) {
|
|
433
|
-
reasons.push('cwd is required and must be a non-empty string');
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
if (reasons.length > 0)
|
|
437
|
-
issues.push({ name, reason: reasons.join('; ') });
|
|
438
|
-
}
|
|
439
|
-
return issues;
|
|
440
|
-
}
|
|
441
|
-
/** Normalize valid action declarations for scope-local config inspection.
|
|
442
|
-
* Invalid entries remain available through raw reads so resolution and Doctor
|
|
443
|
-
* can report them rather than silently treating them as absent. */
|
|
444
|
-
export function normalizeHumanActions(raw) {
|
|
445
|
-
if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
|
|
446
|
-
return {};
|
|
447
|
-
const invalid = new Set(humanActionDeclarationIssues(raw).map((issue) => issue.name));
|
|
448
|
-
const out = {};
|
|
449
|
-
for (const [name, value] of Object.entries(raw)) {
|
|
450
|
-
if (invalid.has(name))
|
|
451
|
-
continue;
|
|
452
|
-
const action = value;
|
|
453
|
-
out[name] = { argv: [...action.argv], cwd: action.cwd };
|
|
454
|
-
}
|
|
455
|
-
return out;
|
|
456
|
-
}
|
|
457
|
-
/** STRICT install-time validation for a plugin-declared `bin` block. Target
|
|
458
|
-
* filesystem state is checked later by Doctor because it can change after
|
|
459
|
-
* install. */
|
|
460
|
-
export function invalidPluginBinReasons(raw) {
|
|
461
|
-
return binDeclarationIssues(raw).map((issue) => issue.message);
|
|
462
|
-
}
|
|
463
|
-
/** Normalize a plugin manifest's advisory executable requirements. Invalid
|
|
464
|
-
* declarations stay out of the read path; source installs reject them through
|
|
465
|
-
* `invalidPluginRequiresReasons`. */
|
|
466
|
-
export function normalizeRequires(raw) {
|
|
467
|
-
if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
|
|
468
|
-
return {};
|
|
469
|
-
const out = {};
|
|
470
|
-
for (const [name, hint] of Object.entries(raw)) {
|
|
471
|
-
if (bareCommandNameIssue(name, 'requires') !== undefined)
|
|
472
|
-
continue;
|
|
473
|
-
if (typeof hint !== 'string' || hint.trim() === '' || /[\r\n]/.test(hint))
|
|
474
|
-
continue;
|
|
475
|
-
out[name] = hint;
|
|
476
|
-
}
|
|
477
|
-
return out;
|
|
478
|
-
}
|
|
479
|
-
/** STRICT install-time validation for a plugin's advisory `requires` block.
|
|
480
|
-
* A missing executable is advisory; only malformed declarations fail install. */
|
|
481
|
-
export function invalidPluginRequiresReasons(raw) {
|
|
482
|
-
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
483
|
-
return ['requires must be a JSON object mapping a bare executable name to a one-line install hint'];
|
|
484
|
-
}
|
|
485
|
-
const reasons = [];
|
|
486
|
-
for (const [name, hint] of Object.entries(raw)) {
|
|
487
|
-
const nameIssue = bareCommandNameIssue(name, 'requires');
|
|
488
|
-
if (nameIssue !== undefined)
|
|
489
|
-
reasons.push(nameIssue);
|
|
490
|
-
if (typeof hint !== 'string' || hint.trim() === '') {
|
|
491
|
-
reasons.push(`requires.${name} must be a non-empty one-line install hint`);
|
|
492
|
-
}
|
|
493
|
-
else if (/[\r\n]/.test(hint)) {
|
|
494
|
-
reasons.push(`requires.${name} must be a one-line install hint`);
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
return reasons;
|
|
498
|
-
}
|
|
499
|
-
/** Collect the valid `KindConfig` fields of one raw `kinds.<name>` entry —
|
|
500
|
-
* every field is optional here, `whenToUse` included; mistyped fields are
|
|
501
|
-
* dropped, never thrown (an invalid field in config.json must not break
|
|
502
|
-
* config parsing for every other kind — the loud gate is install time, see
|
|
503
|
-
* `invalidPluginKindsReasons`). Returns null when no valid field is present.
|
|
504
|
-
* Whether `whenToUse` is REQUIRED is `mergeKinds`'s call: only an entry that
|
|
505
|
-
* introduces a kind no lower layer defines needs one. */
|
|
506
|
-
function normalizeKindFields(raw) {
|
|
507
|
-
if (raw === null || typeof raw !== 'object')
|
|
508
|
-
return null;
|
|
509
|
-
const r = raw;
|
|
510
|
-
const out = {};
|
|
511
|
-
if (typeof r.whenToUse === 'string' && r.whenToUse.trim() !== '')
|
|
512
|
-
out.whenToUse = r.whenToUse;
|
|
513
|
-
if (typeof r.model === 'string' && r.model.trim() !== '')
|
|
514
|
-
out.model = r.model;
|
|
515
|
-
if (typeof r.orchestratorModel === 'string' && r.orchestratorModel.trim() !== '')
|
|
516
|
-
out.orchestratorModel = r.orchestratorModel;
|
|
517
|
-
const isStringArray = (v) => Array.isArray(v) && v.every((item) => typeof item === 'string');
|
|
518
|
-
if (isStringArray(r.tools))
|
|
519
|
-
out.tools = r.tools;
|
|
520
|
-
if (isStringArray(r.extensions))
|
|
521
|
-
out.extensions = r.extensions;
|
|
522
|
-
if (isStringArray(r.availableTo))
|
|
523
|
-
out.availableTo = r.availableTo;
|
|
524
|
-
return Object.keys(out).length > 0 ? out : null;
|
|
525
|
-
}
|
|
526
|
-
/** Merge a raw `kinds` block over `base` (defaulting to the builtin registry):
|
|
527
|
-
* invalid entries are dropped, never thrown. Mirrors `mergeModelLadders`'s
|
|
528
|
-
* layer-over-defaults shape so a config layer can add or override a single
|
|
529
|
-
* kind without restating the whole registry. One rule, no entry shapes:
|
|
530
|
-
* - A kind some lower layer already defines: the entry FIELD-MERGES over it
|
|
531
|
-
* — any subset of fields, `whenToUse` included, so overriding just the
|
|
532
|
-
* spawn-menu guidance of a builtin kind never strips its model tier
|
|
533
|
-
* (the sparse-override shape `persistDefaultKindModel` writes).
|
|
534
|
-
* - A NEW kind: the entry defines it and must carry `whenToUse` (a kind
|
|
535
|
-
* with no spawn-menu gloss is meaningless); dropped otherwise.
|
|
536
|
-
* Deliberately NOT expressible: wholly replacing a lower layer's kind — a
|
|
537
|
-
* field can be overridden but never removed by omission. */
|
|
538
|
-
function mergeKinds(raw, base = defaultKindsConfig()) {
|
|
539
|
-
const out = { ...base };
|
|
540
|
-
if (raw !== null && typeof raw === 'object') {
|
|
541
|
-
for (const [kind, value] of Object.entries(raw)) {
|
|
542
|
-
const fields = normalizeKindFields(value);
|
|
543
|
-
if (fields === null)
|
|
544
|
-
continue;
|
|
545
|
-
const existing = out[kind];
|
|
546
|
-
if (existing !== undefined) {
|
|
547
|
-
out[kind] = { ...existing, ...fields };
|
|
548
|
-
}
|
|
549
|
-
else if (fields.whenToUse !== undefined) {
|
|
550
|
-
out[kind] = fields;
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
return out;
|
|
555
|
-
}
|
|
556
|
-
/** Layer the `kinds` contributions of every ENABLED plugin installed under
|
|
557
|
-
* `scopeRootPath` over `base`, plugin name-sorted for determinism (directory
|
|
558
|
-
* listing order is filesystem-dependent). Each plugin's block goes through
|
|
559
|
-
* the same `mergeKinds` a scope `config.json` does — full entries add or
|
|
560
|
-
* shadow, patches field-merge, invalid entries drop. Called by
|
|
561
|
-
* `readMergedLaunchConfig` BELOW the host scope's own raw `kinds`, so the
|
|
562
|
-
* scope's config.json always overrides its plugins. */
|
|
563
|
-
function layerPluginKinds(scope, scopeRootPath, base) {
|
|
564
|
-
if (scopeRootPath === null)
|
|
565
|
-
return base;
|
|
566
|
-
const plugins = listInstalledPluginsInRoot(scope, scopeRootPath)
|
|
567
|
-
.filter((p) => p.enabled && p.manifest.kinds !== undefined)
|
|
568
|
-
.sort((a, b) => a.name.localeCompare(b.name));
|
|
569
|
-
let out = base;
|
|
570
|
-
for (const plugin of plugins)
|
|
571
|
-
out = mergeKinds(plugin.manifest.kinds, out);
|
|
572
|
-
return out;
|
|
573
|
-
}
|
|
574
|
-
/** The ACTIVE page-component catalog every authoring, validation, daemon,
|
|
575
|
-
* inbox, and TUI consumer resolves: the user scope's own `page_components`
|
|
576
|
-
* entries plus the contributions of every ENABLED plugin installed under that
|
|
577
|
-
* same root, plugin name-sorted for determinism (directory listing order is
|
|
578
|
-
* filesystem-dependent). Installing, updating, or removing a plugin therefore
|
|
579
|
-
* adds, changes, or retires its components with no config edit.
|
|
580
|
-
*
|
|
581
|
-
* User scope only, deliberately: this catalog is read from the daemon, the
|
|
582
|
-
* CLI, and the inbox TUI, whose ambient cwds differ, and a page slot whose
|
|
583
|
-
* validity depended on which directory a process happened to start in would
|
|
584
|
-
* validate in one surface and fail in another. `page_components` has always
|
|
585
|
-
* been a user-scope block (`readConfig('user')`); its plugin channel keeps
|
|
586
|
-
* that boundary.
|
|
587
|
-
*
|
|
588
|
-
* Throws on a duplicate kind or derived JSX tag across sources, and on a
|
|
589
|
-
* plugin whose block is malformed — matching the existing catalog validation
|
|
590
|
-
* style, where a bad `page_components` block already fails config read rather
|
|
591
|
-
* than silently dropping a component the product expects to be authorable.
|
|
592
|
-
* Install-time validation (`invalidPageComponentsReasons`) is what keeps a
|
|
593
|
-
* malformed block from ever reaching this path. */
|
|
594
|
-
export function resolvePageComponents() {
|
|
595
|
-
const layers = [{ origin: 'config.json', components: readConfig('user').page_components }];
|
|
596
|
-
const root = scopeRoot('user');
|
|
597
|
-
if (root !== null) {
|
|
598
|
-
const plugins = listInstalledPluginsInRoot('user', root)
|
|
599
|
-
.filter((plugin) => plugin.enabled && plugin.manifest.page_components !== undefined)
|
|
600
|
-
.sort((a, b) => a.name.localeCompare(b.name));
|
|
601
|
-
for (const plugin of plugins) {
|
|
602
|
-
const label = `plugin "${plugin.name}" page_components`;
|
|
603
|
-
layers.push({ origin: `plugin "${plugin.name}"`, components: normalizePageComponents(plugin.manifest.page_components, label) });
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
return mergePageComponentLayers(layers);
|
|
607
|
-
}
|
|
608
|
-
const KIND_CONFIG_KEYS = new Set(['whenToUse', 'model', 'orchestratorModel', 'tools', 'extensions', 'availableTo']);
|
|
609
|
-
/** STRICT install-time validation for a plugin-declared `kinds` block —
|
|
610
|
-
* the loud counterpart to `mergeKinds`'s silent read-time dropping. Read
|
|
611
|
-
* paths must never throw on bad config, but an INSTALL delivering a bad
|
|
612
|
-
* block must fail the install, not ship a kind that silently never
|
|
613
|
-
* registers. Returns one human-readable reason per defect; empty = valid.
|
|
614
|
-
* Used by the archive-bundle validator (`command-plugins/bundle.ts`) on
|
|
615
|
-
* `bundle.json`'s optional `kinds` member. */
|
|
616
|
-
export function invalidPluginKindsReasons(raw) {
|
|
617
|
-
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
618
|
-
return ['kinds must be a JSON object keyed by kind name'];
|
|
619
|
-
}
|
|
620
|
-
const reasons = [];
|
|
621
|
-
const isStringArray = (v) => Array.isArray(v) && v.every((item) => typeof item === 'string');
|
|
622
|
-
for (const [kind, value] of Object.entries(raw)) {
|
|
623
|
-
if (kind.trim() === '') {
|
|
624
|
-
reasons.push('kinds contains an empty kind name');
|
|
625
|
-
continue;
|
|
626
|
-
}
|
|
627
|
-
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
628
|
-
reasons.push(`kinds.${kind} must be a JSON object`);
|
|
629
|
-
continue;
|
|
630
|
-
}
|
|
631
|
-
const entry = value;
|
|
632
|
-
for (const key of Object.keys(entry)) {
|
|
633
|
-
if (!KIND_CONFIG_KEYS.has(key))
|
|
634
|
-
reasons.push(`kinds.${kind}.${key} is not a KindConfig field (expected one of: ${[...KIND_CONFIG_KEYS].join(', ')})`);
|
|
635
|
-
}
|
|
636
|
-
if (entry['whenToUse'] !== undefined && (typeof entry['whenToUse'] !== 'string' || entry['whenToUse'].trim() === '')) {
|
|
637
|
-
reasons.push(`kinds.${kind}.whenToUse must be a non-empty string`);
|
|
638
|
-
}
|
|
639
|
-
for (const field of ['model', 'orchestratorModel']) {
|
|
640
|
-
if (entry[field] !== undefined && (typeof entry[field] !== 'string' || entry[field].trim() === '')) {
|
|
641
|
-
reasons.push(`kinds.${kind}.${field} must be a non-empty string`);
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
for (const field of ['tools', 'extensions', 'availableTo']) {
|
|
645
|
-
if (entry[field] !== undefined && !isStringArray(entry[field])) {
|
|
646
|
-
reasons.push(`kinds.${kind}.${field} must be an array of strings`);
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
if (normalizeKindFields(value) === null) {
|
|
650
|
-
reasons.push(`kinds.${kind} has no valid KindConfig field — an entry must set at least one of: ${[...KIND_CONFIG_KEYS].join(', ')} (whenToUse is required when the kind exists in no lower layer)`);
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
return reasons;
|
|
654
|
-
}
|
|
655
|
-
/** Validate one raw `remoteCanvas.targets.<name>` entry, or drop it (return
|
|
656
|
-
* null) rather than throwing — same rule `normalizeKindFields` follows. A
|
|
657
|
-
* valid entry needs a non-empty `previewEndpoint` and `relayTokenRef`; the
|
|
658
|
-
* token itself is never stored here (see `RemoteCanvasTarget`). */
|
|
659
|
-
function normalizeRemoteCanvasTarget(raw) {
|
|
660
|
-
if (raw === null || typeof raw !== 'object')
|
|
661
|
-
return null;
|
|
662
|
-
const r = raw;
|
|
663
|
-
if (typeof r.previewEndpoint !== 'string' || r.previewEndpoint.trim() === '')
|
|
664
|
-
return null;
|
|
665
|
-
if (typeof r.relayTokenRef !== 'string' || r.relayTokenRef.trim() === '')
|
|
666
|
-
return null;
|
|
667
|
-
const out = { previewEndpoint: r.previewEndpoint, relayTokenRef: r.relayTokenRef };
|
|
668
|
-
if (typeof r.cpOrigin === 'string' && r.cpOrigin.trim() !== '')
|
|
669
|
-
out.cpOrigin = r.cpOrigin;
|
|
670
|
-
return out;
|
|
671
|
-
}
|
|
672
|
-
/** Merge a raw `remoteCanvas` block over the built-in defaults (no targets):
|
|
673
|
-
* each valid `targets.<name>` entry adds or shadows a target by name;
|
|
674
|
-
* invalid entries are dropped, never thrown. Mirrors `mergeKinds`'s
|
|
675
|
-
* layer-over-defaults shape. */
|
|
676
|
-
function mergeRemoteCanvas(raw, base = defaultRemoteCanvasConfig()) {
|
|
677
|
-
const out = { ...base.targets };
|
|
678
|
-
if (raw !== null && typeof raw === 'object') {
|
|
679
|
-
const r = raw;
|
|
680
|
-
if (r.targets !== null && typeof r.targets === 'object') {
|
|
681
|
-
for (const [name, value] of Object.entries(r.targets)) {
|
|
682
|
-
const normalized = normalizeRemoteCanvasTarget(value);
|
|
683
|
-
if (normalized !== null)
|
|
684
|
-
out[name] = normalized;
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
}
|
|
688
|
-
return { targets: out };
|
|
689
|
-
}
|
|
690
|
-
function normalizeMode(value, fallback) {
|
|
691
|
-
if (value === true)
|
|
692
|
-
return 'notify';
|
|
693
|
-
if (value === false)
|
|
694
|
-
return false;
|
|
695
|
-
if (value === 'notify' || value === 'apply')
|
|
696
|
-
return value;
|
|
697
|
-
return fallback;
|
|
698
|
-
}
|
|
699
|
-
function normalizePositiveInteger(value, fallback) {
|
|
700
|
-
return typeof value === 'number' && Number.isSafeInteger(value) && value >= 1
|
|
701
|
-
? value
|
|
702
|
-
: fallback;
|
|
703
|
-
}
|
|
704
|
-
function mergeBrokerThresholds(raw, defaults) {
|
|
705
|
-
const partial = raw !== null && typeof raw === 'object'
|
|
706
|
-
? raw
|
|
707
|
-
: {};
|
|
708
|
-
const warning = normalizePositiveInteger(partial.warning, defaults.warning);
|
|
709
|
-
const automaticReviveCap = normalizePositiveInteger(partial.automaticReviveCap, defaults.automaticReviveCap);
|
|
710
|
-
return warning <= automaticReviveCap
|
|
711
|
-
? { warning, automaticReviveCap }
|
|
712
|
-
: { ...defaults };
|
|
713
|
-
}
|
|
714
|
-
function mergeLifecycle(raw, defaults) {
|
|
715
|
-
const partial = raw !== null && typeof raw === 'object'
|
|
716
|
-
? raw
|
|
717
|
-
: {};
|
|
718
|
-
return { unattendedParkMs: normalizePositiveInteger(partial.unattendedParkMs, defaults.unattendedParkMs) };
|
|
719
|
-
}
|
|
720
|
-
function normalizeWhipMessages(raw) {
|
|
721
|
-
if (!Array.isArray(raw))
|
|
722
|
-
return [...DEFAULT_WHIP_MESSAGES];
|
|
723
|
-
const messages = raw.filter((message) => typeof message === 'string' && message.trim() !== '').map((message) => message.trim());
|
|
724
|
-
return messages.length > 0 ? messages : [...DEFAULT_WHIP_MESSAGES];
|
|
725
|
-
}
|
|
726
|
-
function mergeConfig(partial) {
|
|
727
|
-
const defaults = defaultScopeConfig();
|
|
728
|
-
const schema_version = defaults.schema_version;
|
|
729
|
-
const marketplaces = partial.marketplaces === undefined ? {} : partial.marketplaces;
|
|
730
|
-
const plugins = partial.plugins === undefined ? {} : partial.plugins;
|
|
731
|
-
const au = partial.auto_update;
|
|
732
|
-
const rawInterval = au && typeof au.interval_hours === 'number' ? au.interval_hours : undefined;
|
|
733
|
-
const interval_hours = rawInterval !== undefined && Number.isFinite(rawInterval) && rawInterval >= 0
|
|
734
|
-
? rawInterval
|
|
735
|
-
: defaults.auto_update.interval_hours;
|
|
736
|
-
const auto_update = {
|
|
737
|
-
crtr: normalizeMode(au?.crtr, defaults.auto_update.crtr),
|
|
738
|
-
content: normalizeMode(au?.content, defaults.auto_update.content),
|
|
739
|
-
interval_hours,
|
|
740
|
-
};
|
|
741
|
-
const rawMaxPanes = partial.max_panes_per_window;
|
|
742
|
-
const max_panes_per_window = normalizePositiveInteger(rawMaxPanes, defaults.max_panes_per_window);
|
|
743
|
-
const auto_open_child_viewers = typeof partial.auto_open_child_viewers === 'boolean'
|
|
744
|
-
? partial.auto_open_child_viewers
|
|
745
|
-
: defaults.auto_open_child_viewers;
|
|
746
|
-
const brokerThresholds = mergeBrokerThresholds(partial.brokerThresholds, defaults.brokerThresholds);
|
|
747
|
-
const lifecycle = mergeLifecycle(partial.lifecycle, defaults.lifecycle);
|
|
748
|
-
const completion_bell = typeof partial.completion_bell === 'boolean' ? partial.completion_bell : defaults.completion_bell;
|
|
749
|
-
const working_gerunds = partial.working_gerunds === undefined
|
|
750
|
-
? [...defaults.working_gerunds]
|
|
751
|
-
: normalizeWorkingGerunds(partial.working_gerunds);
|
|
752
|
-
const whip_mode = typeof partial.whip_mode === 'boolean' ? partial.whip_mode : defaults.whip_mode;
|
|
753
|
-
const page_components = normalizePageComponents(partial.page_components);
|
|
754
|
-
const page_surface = typeof partial.page_surface === 'boolean' ? partial.page_surface : defaults.page_surface;
|
|
755
|
-
const whip_messages = normalizeWhipMessages(partial.whip_messages);
|
|
756
|
-
const whip_message_mode = WHIP_MESSAGE_MODES.includes(partial.whip_message_mode)
|
|
757
|
-
? partial.whip_message_mode
|
|
758
|
-
: defaults.whip_message_mode;
|
|
759
|
-
const mouse_mode_default = MOUSE_MODE_DEFAULTS.includes(partial.mouse_mode_default)
|
|
760
|
-
? partial.mouse_mode_default
|
|
761
|
-
: defaults.mouse_mode_default;
|
|
762
|
-
const live_cycles = normalizePositiveInteger(partial.live_cycles, defaults.live_cycles);
|
|
763
|
-
const condensed_history = CONDENSED_HISTORY_MODES.includes(partial.condensed_history)
|
|
764
|
-
? partial.condensed_history
|
|
765
|
-
: defaults.condensed_history;
|
|
766
|
-
const bash_tool_purpose = typeof partial.bash_tool_purpose === 'boolean' ? partial.bash_tool_purpose : defaults.bash_tool_purpose;
|
|
767
|
-
const fold_finished_tools = typeof partial.fold_finished_tools === 'boolean' ? partial.fold_finished_tools : defaults.fold_finished_tools;
|
|
768
|
-
const summarize_tool_calls = typeof partial.summarize_tool_calls === 'boolean' ? partial.summarize_tool_calls : defaults.summarize_tool_calls;
|
|
769
|
-
const detailed_tool_recaps = typeof partial.detailed_tool_recaps === 'boolean' ? partial.detailed_tool_recaps : defaults.detailed_tool_recaps;
|
|
770
|
-
const keybindings = normalizeKeybindings(partial.keybindings);
|
|
771
|
-
const tmux_passthrough = normalizeTmuxPassthrough(partial.tmux_passthrough);
|
|
772
|
-
const modelLadders = mergeModelLadders(partial.modelLadders);
|
|
773
|
-
const providerOptions = mergeProviderOptions(partial.providerOptions, defaults.providerOptions);
|
|
774
|
-
const routes = resolveModelRoutes(mergeModelRoutePatches(partial.modelRoutes));
|
|
775
|
-
const modelRoutes = routes.complete;
|
|
776
|
-
const modelRouting = mergeModelRouting(partial.modelRouting, undefined);
|
|
777
|
-
const kinds = mergeKinds(partial.kinds);
|
|
778
|
-
const remoteCanvas = mergeRemoteCanvas(partial.remoteCanvas);
|
|
779
|
-
const spawnEnv = mergeSpawnEnv(partial.spawnEnv, defaults.spawnEnv?.allow);
|
|
780
|
-
const bin = normalizeBin(partial.bin);
|
|
781
|
-
const humanActions = normalizeHumanActions(partial.humanActions);
|
|
782
|
-
return { bin, humanActions, schema_version, marketplaces, plugins, auto_update, max_panes_per_window, auto_open_child_viewers, brokerThresholds, lifecycle, completion_bell, working_gerunds, whip_mode, page_components, page_surface, whip_messages, whip_message_mode, mouse_mode_default, live_cycles, condensed_history, bash_tool_purpose, fold_finished_tools, summarize_tool_calls, detailed_tool_recaps, keybindings, tmux_passthrough, modelLadders, providerOptions, ...(Object.keys(modelRoutes).length > 0 ? { modelRoutes } : {}), ...(Object.keys(routes.legacy).length > 0 ? { legacyModelRoutes: routes.legacy } : {}), ...(modelRouting !== undefined ? { modelRouting } : {}), kinds, remoteCanvas, spawnEnv };
|
|
783
|
-
}
|
|
784
|
-
/** Raw (un-defaulted) partial config for one scope, or null if the scope has
|
|
785
|
-
* no root or no config.json. Used by `readMergedLaunchConfig` to layer
|
|
786
|
-
* scopes onto each other WITHOUT each scope's own default-fill masking a
|
|
787
|
-
* lower-precedence scope's real customization (see that function's comment
|
|
788
|
-
* for why `readConfig(scope)`, which already defaults-fills, is unusable
|
|
789
|
-
* for cross-scope layering). */
|
|
790
|
-
export function readRawConfigAtRoot(root) {
|
|
791
|
-
return readRawAtRoot(root);
|
|
792
|
-
}
|
|
793
|
-
export function readRawScopeConfig(scope) {
|
|
794
|
-
const root = scopeRoot(scope);
|
|
795
|
-
return root ? readRawConfigAtRoot(root) : null;
|
|
796
|
-
}
|
|
797
|
-
/** Raw partial config at `<profileRoot(profileId)>/config.json`, or null when
|
|
798
|
-
* no profile is selected, the profile id no longer resolves (deleted/
|
|
799
|
-
* invalid), or it has no config.json. `profileRoot` centralizes the id-shape
|
|
800
|
-
* + containment checks (never a raw path join), and any resolution failure
|
|
801
|
-
* is swallowed here — launch config resolution is a hot path that must never
|
|
802
|
-
* throw on a stale `CRTR_PROFILE_ID`. */
|
|
803
|
-
function readRawProfileConfig(profileId) {
|
|
804
|
-
if (profileId === null || profileId === '')
|
|
805
|
-
return null;
|
|
806
|
-
try {
|
|
807
|
-
return readRawAtRoot(profileRoot(profileId));
|
|
808
|
-
}
|
|
809
|
-
catch {
|
|
810
|
-
return null;
|
|
811
|
-
}
|
|
812
|
-
}
|
|
813
|
-
/** Raw partial configs for the whole project-scope STACK (`findProjectScopeRoots`
|
|
814
|
-
* — every ancestor `.crouter/`, widened by a selected profile's `projects`),
|
|
815
|
-
* ordered FARTHEST-first so `readMergedLaunchConfig` can layer them on last
|
|
816
|
-
* and have the NEAREST root win — mirroring the resolver's nearest-project-
|
|
817
|
-
* strongest replacement precedence. Walks from `targetCwd`/`targetProfileId`
|
|
818
|
-
* — the SCOPE THE CONFIG IS FOR, not necessarily the calling process's own
|
|
819
|
-
* ambient cwd/profile (see `readMergedLaunchConfig`). */
|
|
820
|
-
function readRawProjectScopeConfigs(targetCwd, targetProfileId) {
|
|
821
|
-
const nearestFirst = findProjectScopeRoots(targetCwd, targetProfileId);
|
|
822
|
-
const farthestFirst = [...nearestFirst].reverse();
|
|
823
|
-
// A root with no config.json still contributes: its installed plugins may
|
|
824
|
-
// declare kinds, so the ROOT rides along and `raw` stays null.
|
|
825
|
-
return farthestFirst.map((root) => ({ root, raw: readRawAtRoot(root) }));
|
|
826
|
-
}
|
|
827
|
-
/** Merge launch knobs (`kinds`, `modelLadders`) across scopes in
|
|
828
|
-
* project stack > profile > user > builtin precedence — the same precedence
|
|
829
|
-
* order used for memory resolution. For `kinds` only, each plugin-bearing
|
|
830
|
-
* scope (user, each project root) additionally layers its enabled plugins'
|
|
831
|
-
* manifest `kinds` blocks directly BELOW that scope's own raw config — see
|
|
832
|
-
* `layerPluginKinds`. A kind or ladder cell declared at a
|
|
833
|
-
* more-specific scope shadows the same key from a less-specific scope; the
|
|
834
|
-
* project STACK (`findProjectScopeRoots` — every ancestor `.crouter/`,
|
|
835
|
-
* widened by a selected profile's `projects`) layers nearest-root-strongest;
|
|
836
|
-
* a key no scope declares falls through to the builtin default registry
|
|
837
|
-
* (`defaultScopeConfig().kinds` / `.modelLadders`).
|
|
838
|
-
*
|
|
839
|
-
* Layers RAW (un-defaulted) partial config per scope, not `readConfig(scope)`
|
|
840
|
-
* — `readConfig` already fills in every default kind for a scope that
|
|
841
|
-
* customizes even one, so naively overlaying two already-defaulted
|
|
842
|
-
* `ScopeConfig.kinds` objects would let an untouched project-scope kind
|
|
843
|
-
* (silently defaulted) clobber a real user-scope customization of that same
|
|
844
|
-
* kind. Layering the raw partials avoids that.
|
|
845
|
-
*
|
|
846
|
-
* Callers (launch, kind registry) go through this function rather than
|
|
847
|
-
* `readConfig` directly, so `ScopeConfig.kinds`/`modelLadders`/tools/
|
|
848
|
-
* extensions/`availableTo` all honor the same profile + multi-project
|
|
849
|
-
* precedence.
|
|
850
|
-
*
|
|
851
|
-
* `targetCwd`/`targetProfileId` default to this PROCESS's own ambient cwd
|
|
852
|
-
* and `CRTR_PROFILE_ID` — correct for a caller resolving config for itself
|
|
853
|
-
* (front-door commands, kind listing). A caller resolving config on behalf
|
|
854
|
-
* of a DIFFERENT node (the broker spawn-env boundary or cron executor — both
|
|
855
|
-
* run inside the daemon, whose ambient cwd/profile is the daemon's own, not
|
|
856
|
-
* the target node's) MUST pass the target's own cwd/profile explicitly, or
|
|
857
|
-
* `spawnEnv.allow` resolves from the wrong scope entirely (the C-1
|
|
858
|
-
* follow-up fix this parameterization exists for). */
|
|
859
|
-
export function readMergedLaunchConfig(targetCwd = process.cwd(), targetProfileId = envProfileId() || null) {
|
|
860
|
-
const defaults = defaultScopeConfig();
|
|
861
|
-
const userRaw = readRawScopeConfig('user');
|
|
862
|
-
const profileRaw = readRawProfileConfig(targetProfileId);
|
|
863
|
-
const projectLayersFarthestFirst = readRawProjectScopeConfigs(targetCwd, targetProfileId);
|
|
864
|
-
// Kinds layer per scope as: that scope's enabled PLUGINS first, then the
|
|
865
|
-
// scope's own raw config — so a plugin can add or shadow a kind (registry
|
|
866
|
-
// entry in its manifest + gated persona docs in its memory tree) and the
|
|
867
|
-
// scope's config.json still overrides its plugins. Other launch knobs
|
|
868
|
-
// (ladders/routes/spawnEnv) have no plugin channel.
|
|
869
|
-
let kinds = mergeKinds(userRaw?.kinds, layerPluginKinds('user', scopeRoot('user'), defaults.kinds));
|
|
870
|
-
let modelLadders = mergeModelLadders(userRaw?.modelLadders, defaults.modelLadders);
|
|
871
|
-
let providerOptions = mergeProviderOptions(userRaw?.providerOptions, defaults.providerOptions);
|
|
872
|
-
let modelRoutePatches = mergeModelRoutePatches(userRaw?.modelRoutes);
|
|
873
|
-
let modelRouting = mergeModelRouting(userRaw?.modelRouting, undefined);
|
|
874
|
-
let spawnEnv = mergeSpawnEnv(userRaw?.spawnEnv, defaults.spawnEnv?.allow);
|
|
875
|
-
if (profileRaw !== null) {
|
|
876
|
-
kinds = mergeKinds(profileRaw.kinds, kinds);
|
|
877
|
-
modelLadders = mergeModelLadders(profileRaw.modelLadders, modelLadders);
|
|
878
|
-
providerOptions = mergeProviderOptions(profileRaw.providerOptions, providerOptions);
|
|
879
|
-
modelRoutePatches = mergeModelRoutePatches(profileRaw.modelRoutes, modelRoutePatches);
|
|
880
|
-
modelRouting = mergeModelRouting(profileRaw.modelRouting, modelRouting);
|
|
881
|
-
spawnEnv = mergeSpawnEnv(profileRaw.spawnEnv, spawnEnv.allow);
|
|
882
|
-
}
|
|
883
|
-
for (const { root, raw } of projectLayersFarthestFirst) {
|
|
884
|
-
kinds = mergeKinds(raw?.kinds, layerPluginKinds('project', root, kinds));
|
|
885
|
-
if (raw === null)
|
|
886
|
-
continue;
|
|
887
|
-
modelLadders = mergeModelLadders(raw.modelLadders, modelLadders);
|
|
888
|
-
providerOptions = mergeProviderOptions(raw.providerOptions, providerOptions);
|
|
889
|
-
modelRoutePatches = mergeModelRoutePatches(raw.modelRoutes, modelRoutePatches);
|
|
890
|
-
modelRouting = mergeModelRouting(raw.modelRouting, modelRouting);
|
|
891
|
-
spawnEnv = mergeSpawnEnv(raw.spawnEnv, spawnEnv.allow);
|
|
892
|
-
}
|
|
893
|
-
const routes = resolveModelRoutes(modelRoutePatches);
|
|
894
|
-
return {
|
|
895
|
-
kinds,
|
|
896
|
-
modelLadders,
|
|
897
|
-
providerOptions,
|
|
898
|
-
...(Object.keys(routes.complete).length > 0 ? { modelRoutes: routes.complete } : {}),
|
|
899
|
-
...(Object.keys(routes.legacy).length > 0 ? { legacyModelRoutes: routes.legacy } : {}),
|
|
900
|
-
...(modelRouting !== undefined ? { modelRouting } : {}),
|
|
901
|
-
spawnEnv,
|
|
902
|
-
};
|
|
903
|
-
}
|
|
904
|
-
/** The effective `KindConfig` for one full kind string (top-level, e.g.
|
|
905
|
-
* `developer`, or sub-kind, e.g. `audit/security`), across
|
|
906
|
-
* project > user > builtin precedence. Returns `undefined` for a kind no
|
|
907
|
-
* scope registers — existence is deliberately NOT validated here (kind
|
|
908
|
-
* existence/launch-menu enumeration is a caller concern); this only
|
|
909
|
-
* resolves the config for a kind the caller already knows about. */
|
|
910
|
-
export function resolveKindConfig(kind) {
|
|
911
|
-
return readMergedLaunchConfig().kinds[kind];
|
|
912
|
-
}
|
|
913
|
-
/** Reject a kind no scope registers. The one validation gate for every
|
|
914
|
-
* surface that PERSISTS a kind (`profile new/kind`, the profile-ensure API
|
|
915
|
-
* route) — a stored unknown kind would poison future omitted-kind creates
|
|
916
|
-
* through `default_kind` resolution. */
|
|
917
|
-
export function assertInstalledKind(kind) {
|
|
918
|
-
const kinds = Object.keys(readMergedLaunchConfig().kinds).sort();
|
|
919
|
-
if (!kinds.includes(kind)) {
|
|
920
|
-
throw usage(`unknown kind: ${kind}`, {
|
|
921
|
-
received: kind,
|
|
922
|
-
field: 'kind',
|
|
923
|
-
next: `Valid kinds: ${kinds.join(', ')}.`,
|
|
924
|
-
});
|
|
925
|
-
}
|
|
926
|
-
}
|
|
927
|
-
/** The sub-kinds available to spawn FROM a given top-level kind — every
|
|
928
|
-
* registered sub-kind (full path contains `/`) whose `availableTo` (default:
|
|
929
|
-
* its own top-level ancestor, e.g. `audit/security` defaults to
|
|
930
|
-
* `['audit']`) includes `kind` or `'*'`. The single source both `sys
|
|
931
|
-
* prompt-review --list`'s `subPersonas` metadata and the live sub-persona
|
|
932
|
-
* spawn-menu splice (`core/substrate/render.ts`) read, so the two can never
|
|
933
|
-
* drift apart. Sorted by full kind name for stable rendering. */
|
|
934
|
-
export function subKindsAvailableTo(kind) {
|
|
935
|
-
const registry = readMergedLaunchConfig().kinds;
|
|
936
|
-
const out = [];
|
|
937
|
-
for (const [full, cfg] of Object.entries(registry)) {
|
|
938
|
-
const slash = full.indexOf('/');
|
|
939
|
-
if (slash === -1)
|
|
940
|
-
continue;
|
|
941
|
-
const topAncestor = full.slice(0, slash);
|
|
942
|
-
const availableTo = cfg.availableTo ?? [topAncestor];
|
|
943
|
-
if (!(availableTo.includes('*') || availableTo.includes(kind)))
|
|
944
|
-
continue;
|
|
945
|
-
out.push({ kind: full, whenToUse: cfg.whenToUse });
|
|
946
|
-
}
|
|
947
|
-
return out.sort((a, b) => a.kind.localeCompare(b.kind));
|
|
948
|
-
}
|
|
949
|
-
/** The SPARSE `modelLadders` to persist after a config mutation: the raw
|
|
950
|
-
* on-disk sparse ladder (absent rungs stay absent) plus ONLY the specific
|
|
951
|
-
* rungs / `defaultProvider` the mutation actually changed away from the
|
|
952
|
-
* merged baseline. Untouched default rungs are never materialized -- they
|
|
953
|
-
* hold concrete model ids that go stale across builds (the live-Hearth freeze
|
|
954
|
-
* bug). Returns undefined when nothing ladder-related is on disk and nothing
|
|
955
|
-
* was touched, so the key is omitted from config.json entirely. This is what
|
|
956
|
-
* makes a direct `sys config set modelLadders.<provider>.<strength>` persist
|
|
957
|
-
* only the touched rung through the SAME central write path as every other
|
|
958
|
-
* mutation, rather than a special case. */
|
|
959
|
-
function sparseModelLaddersToPersist(rawLadders, baseline, mutated) {
|
|
960
|
-
const out = { ...(rawLadders ?? {}) };
|
|
961
|
-
if (out.anthropic !== undefined)
|
|
962
|
-
out.anthropic = { ...out.anthropic };
|
|
963
|
-
if (out.openai !== undefined)
|
|
964
|
-
out.openai = { ...out.openai };
|
|
965
|
-
if (mutated.defaultProvider !== baseline.defaultProvider && mutated.defaultProvider !== undefined) {
|
|
966
|
-
out.defaultProvider = mutated.defaultProvider;
|
|
967
|
-
}
|
|
968
|
-
for (const provider of ['anthropic', 'openai']) {
|
|
969
|
-
for (const strength of ['ultra', 'strong', 'medium', 'light']) {
|
|
970
|
-
if (mutated[provider][strength] !== baseline[provider][strength]) {
|
|
971
|
-
out[provider] = { ...(out[provider] ?? {}), [strength]: mutated[provider][strength] };
|
|
972
|
-
}
|
|
973
|
-
}
|
|
974
|
-
}
|
|
975
|
-
const hasContent = out.defaultProvider !== undefined || out.anthropic !== undefined || out.openai !== undefined;
|
|
976
|
-
return hasContent ? out : undefined;
|
|
977
|
-
}
|
|
978
|
-
/** Apply `mutate` to a scope's MERGED config (so callers can read + write any
|
|
979
|
-
* field), then persist only a RAW PARTIAL: every top-level key the mutation
|
|
980
|
-
* left untouched keeps its exact on-disk raw value (absent stays absent, a
|
|
981
|
-
* sparse override stays sparse), and only keys the mutation actually changed
|
|
982
|
-
* are written. `modelLadders` gets sub-field-granular sparse handling via
|
|
983
|
-
* `sparseModelLaddersToPersist`. Result: a fresh bootstrap or any unrelated
|
|
984
|
-
* `sys config set` never freezes a full concrete `modelLadders` to disk,
|
|
985
|
-
* and a direct ladder-rung set still persists only the touched rung -- all
|
|
986
|
-
* through one lock-protected atomic update path. */
|
|
987
|
-
function mutateConfigAtRoot(root, mutate) {
|
|
988
|
-
return mutateRawAtRoot(root, (raw) => {
|
|
989
|
-
const baseline = mergeConfig(raw);
|
|
990
|
-
const cfg = mergeConfig(raw);
|
|
991
|
-
mutate(cfg);
|
|
992
|
-
const partial = { ...raw };
|
|
993
|
-
for (const key of SCOPE_CONFIG_KEYS)
|
|
994
|
-
if (key !== 'modelLadders' && !isDeepStrictEqual(cfg[key], baseline[key]))
|
|
995
|
-
partial[key] = cfg[key];
|
|
996
|
-
const ladders = sparseModelLaddersToPersist(raw.modelLadders, baseline.modelLadders, cfg.modelLadders);
|
|
997
|
-
if (ladders !== undefined)
|
|
998
|
-
partial.modelLadders = ladders;
|
|
999
|
-
else
|
|
1000
|
-
delete partial.modelLadders;
|
|
1001
|
-
return { value: cfg, next: partial };
|
|
1002
|
-
});
|
|
1003
|
-
}
|
|
1004
|
-
/** Persist an EXPLICIT sparse `modelLadders` intent at one config root: the
|
|
1005
|
-
* patch's rungs (and `defaultProvider`) are merged over whatever sparse ladder
|
|
1006
|
-
* is already on disk, and every untouched rung stays absent so it keeps
|
|
1007
|
-
* re-deriving from the running build's registry.
|
|
1008
|
-
*
|
|
1009
|
-
* Ladder edits must come through here rather than `updateConfig`, because that
|
|
1010
|
-
* path infers what to persist by diffing the mutated config against the merged
|
|
1011
|
-
* baseline: setting a rung to the value that happens to be today's compiled
|
|
1012
|
-
* default produces an empty diff and silently persists nothing, so the choice
|
|
1013
|
-
* evaporates as soon as the default moves. Explicit intent is recorded as
|
|
1014
|
-
* written. Mirrors `persistDefaultKindModel`. */
|
|
1015
|
-
export function persistModelLadders(root, patch) {
|
|
1016
|
-
mutateRawAtRoot(root, (raw) => { const current = (raw.modelLadders ?? {}); const next = { ...current }; if (patch.defaultProvider !== undefined)
|
|
1017
|
-
next.defaultProvider = patch.defaultProvider; for (const provider of ['anthropic', 'openai'])
|
|
1018
|
-
if (patch[provider] !== undefined)
|
|
1019
|
-
next[provider] = { ...(current[provider] ?? {}), ...patch[provider] }; return { value: undefined, next: { ...raw, modelLadders: next } }; });
|
|
1020
|
-
}
|
|
1021
|
-
/** Persist one complete route at one exact config root. The route is the only
|
|
1022
|
-
* raw route entry touched; unrelated routes and local ladder defaults remain
|
|
1023
|
-
* absent. Pass `undefined` to remove this scope's entry, which resumes lower
|
|
1024
|
-
* scope inheritance rather than introducing a tombstone. */
|
|
1025
|
-
export function persistModelRoute(root, routeId, route) {
|
|
1026
|
-
if (route !== undefined)
|
|
1027
|
-
assertCompleteModelRoute(routeId, route);
|
|
1028
|
-
else if (routeId.trim() === '')
|
|
1029
|
-
throw new Error('model route id must be a non-empty string');
|
|
1030
|
-
mutateRawAtRoot(root, (raw) => { const routes = copyRouteRecord((raw.modelRoutes ?? {})); if (route === undefined)
|
|
1031
|
-
delete routes[routeId];
|
|
1032
|
-
else
|
|
1033
|
-
setRouteRecord(routes, routeId, { ...route, models: { ...route.models } }); const next = { ...raw }; if (Object.keys(routes).length === 0)
|
|
1034
|
-
delete next.modelRoutes;
|
|
1035
|
-
else
|
|
1036
|
-
next.modelRoutes = routes; return { value: undefined, next }; });
|
|
1037
|
-
}
|
|
1038
|
-
/** Mutate one exact config root. Setup uses this for profile and explicit
|
|
1039
|
-
* project targets that cannot be represented by the user/project Scope enum. */
|
|
1040
|
-
export function updateConfigAtRoot(root, mutate) {
|
|
1041
|
-
return mutateConfigAtRoot(root, mutate);
|
|
1042
|
-
}
|
|
1043
|
-
export function updateConfig(scope, mutate) {
|
|
1044
|
-
return updateConfigAtRoot(requireScopeRoot(scope), mutate);
|
|
1045
|
-
}
|
|
1046
|
-
/** Persist one sparse kind-model field at an exact config root. The sparse
|
|
1047
|
-
* patch keeps every unrelated kind and launch knob inherited from lower
|
|
1048
|
-
* scopes instead of freezing a materialized registry snapshot. */
|
|
1049
|
-
export function persistDefaultKindModel(opts) {
|
|
1050
|
-
const field = opts.orchestrator === true ? 'orchestratorModel' : 'model';
|
|
1051
|
-
mutateRawAtRoot(opts.root, (raw) => { const kinds = { ...(raw.kinds ?? {}), [opts.kind]: { ...(raw.kinds ?? {})[opts.kind], [field]: opts.model } }; return { value: undefined, next: { ...raw, kinds: kinds } }; });
|
|
1052
|
-
return { path: configPathFor(opts.root), field };
|
|
1053
|
-
}
|
|
1054
|
-
export function updateState(scope, mutate) {
|
|
1055
|
-
const s = readState(scope);
|
|
1056
|
-
mutate(s);
|
|
1057
|
-
writeState(scope, s);
|
|
1058
|
-
return s;
|
|
1059
|
-
}
|
|
1
|
+
var Te=Object.defineProperty;var s=(e,n)=>Te(e,"name",{value:n,configurable:!0});import{envProfileId as $e}from"../shared/env.js";import{basename as Ce,dirname as Me,join as H}from"node:path";import{isDeepStrictEqual as Le}from"node:util";import{CONFIG_FILE as Ne,STATE_FILE as Fe,CONDENSED_HISTORY_MODES as ze,MOUSE_MODE_DEFAULTS as De,WHIP_MESSAGE_MODES as Ue,DEFAULT_WHIP_MESSAGES as J,defaultScopeConfig as b,defaultScopeState as Ke,defaultModelLaddersConfig as qe,defaultKindsConfig as Ge,defaultRemoteCanvasConfig as Be}from"../types.js";import{BINDING_CATALOG as He,BINDING_IDS as Je,isAttachPaneBinding as We}from"./keybindings/catalog.js";import{notFound as Ze,usage as Ye}from"./errors.js";import{emitEvent as Ve}from"./events/emit.js";import{atomicWriteJson as W,readJsonIfExists as M,ensureDir as Z}from"./fs-utils.js";import{scopeRoot as y,requireScopeRoot as _,findProjectScopeRoots as Qe,userScopeRoot as L}from"./scope.js";import{listInstalledPluginsInRoot as Y}from"./installed-plugins.js";import{profileRoot as N,listProfiles as V}from"./profiles/manifest.js";import{canonicalRoot as F,projectStore as Xe,userStore as Q}from"./scoped-state/paths.js";import{convertLegacyScopedStore as en,initializeFreshScopedStore as nn}from"./scoped-state/migrate.js";import{mutateRawSettings as on,readBookkeeping as tn,readRawSettings as rn,readRawSettingsWithRevision as sn,replaceRawSettings as dn,writeBookkeeping as cn,writeRawSettings as un}from"./scoped-state/settings.js";import{withExclusiveDirectoryLock as ln}from"./exclusive-lock.js";import{SCOPE_CONFIG_KEYS as fn}from"./user-settings.js";import{normalizeWorkingGerunds as an}from"../shared/working-activity.js";import{mergePageComponentLayers as mn,normalizePageComponents as X}from"./human/page-catalog.js";function h(e){return H(e,Ne)}s(h,"configPathFor");function ee(e,n){return Z(Me(e)),ln(`${e}.lock`,()=>n(e),{timeoutError:s(()=>new Error(`timed out waiting for config lock: ${e}`),"timeoutError")})}s(ee,"withConfigPathLock");function pn(e){return H(e,Fe)}s(pn,"statePathFor");function co(e){const n=y(e);return n?h(n):null}s(co,"configPath");function uo(e){const n=y(e);return n?pn(n):null}s(uo,"statePath");function g(e){const n=F(e),t=F(L());if(n===t)return{store:Q(t),key:"user",kind:"user",root:t};if(Ce(n)===".crouter")return en({kind:"project",root:n}),{store:Xe(n),key:"project",kind:"project",root:n};for(const o of V()){const r=F(N(o.profileId));if(n===r)return{store:Q(t),key:`profile:${o.profileId}`,kind:"profile",root:r,profileId:o.profileId}}throw new Error(`settings root is not a recognized owner: ${e}`)}s(g,"settingsOwnerForRoot");function j(e){const n=g(e);return n.kind==="project"?M(h(n.root)):rn(n)}s(j,"readRawAtRoot");function z(e,n){const t=g(e);if(t.kind==="project"){ee(h(t.root),o=>W(o,n));return}un(t,n)}s(z,"writeRawAtRoot");function v(e,n){const t=g(e);return t.kind==="project"?ee(h(t.root),o=>{const r=n(M(o)??{});return W(o,r.next),r.value}):on(t,o=>n(o))}s(v,"mutateRawAtRoot");function gn(e){const n=y(e);return n?yn(n):b()}s(gn,"readConfig");function yn(e){const n=j(e);return n?T(n):b()}s(yn,"readConfigAtRoot");function hn(e){const n=y(e);return n?tn(g(n)):Ke()}s(hn,"readState");class bn extends Error{static{s(this,"InvalidRawSettingsError")}constructor(n){super(`settings cannot be merged: ${n instanceof Error?n.message:String(n)}`),this.name="InvalidRawSettingsError"}}function ne(e){if(e.scope==="user")return g(L());if(!V().some(n=>n.profileId===e.profileId))throw Ze(`profile not found: ${e.profileId}`,{received:e.profileId,next:"Run `crtr profile list` to see available profiles."});return g(N(e.profileId))}s(ne,"rawSettingsOwnerForTarget");function lo(e){return sn(ne(e))}s(lo,"readRawSettingsForTarget");function fo(e,n,t){return dn(ne(e),n,t,o=>{try{T(o)}catch(r){throw new bn(r)}})}s(fo,"replaceRawSettingsForTarget");function ao(e,n){const t=_(e);return v(t,o=>{const r=n(o);return{value:r,next:r}})}s(ao,"updateRawConfigAtomically");function mo(e,n){z(_(e),n)}s(mo,"writeConfig");function po(e,n){z(_(e),n)}s(po,"writeRawConfig");function _n(e,n){const t=_(e);cn(g(t),n)}s(_n,"writeState");function go(e,n){Z(n);const t=g(e==="user"?L():n);if(nn({kind:t.kind==="user"?"user":"project",root:t.store.root}),t.kind==="project"&&M(h(t.root))===null){const{modelLadders:o,keybindings:r,tmux_passthrough:i,brokerThresholds:d,lifecycle:c,...u}=b();z(t.root,u)}}s(go,"ensureScopeInitialized");function vn(e){if(e===null||typeof e!="object"||Array.isArray(e))return{};const n={};for(const[t,o]of Object.entries(e))Array.isArray(o)&&o.every(r=>typeof r=="string")&&(n[t]=[...o]);return n}s(vn,"normalizeKeybindings");const kn=new Set(He.filter(We).map(e=>e.id));function wn(e){return Array.isArray(e)?[...new Set(e.filter(n=>typeof n=="string"&&Je.has(n)&&kn.has(n)))]:[]}s(wn,"normalizeTmuxPassthrough");function S(e,n=qe()){const t=n;if(e===null||typeof e!="object")return t;const o=e,r={anthropic:{...t.anthropic},openai:{...t.openai},...t.defaultProvider!==void 0?{defaultProvider:t.defaultProvider}:{}};(o.defaultProvider==="anthropic"||o.defaultProvider==="openai")&&(r.defaultProvider=o.defaultProvider);for(const i of["anthropic","openai"]){const d=o[i];if(!(d===null||typeof d!="object"))for(const[c,u]of Object.entries(d))(c==="ultra"||c==="strong"||c==="medium"||c==="light")&&typeof u=="string"&&(r[i][c]=u)}return r}s(S,"mergeModelLadders");function oe(e){return e==="ultra"||e==="strong"||e==="medium"||e==="light"}s(oe,"validStrength");const D=["ultra","strong","medium","light"];function U(){return Object.create(null)}s(U,"routeRecord");function k(e,n,t){Object.defineProperty(e,n,{value:t,writable:!0,enumerable:!0,configurable:!0})}s(k,"setRouteRecord");function te(e){const n=U();for(const[t,o]of Object.entries(e??{}))k(n,t,o);return n}s(te,"copyRouteRecord");function w(e,n){Ve({level:"warn",event:"config.model_routes.invalid",fields:{route_id:e,rule:n}})}s(w,"routeInvalid");function x(e,n={}){const t=te(n);if(e===null||typeof e!="object"||Array.isArray(e))return t;for(const[o,r]of Object.entries(e)){if(o.trim()===""){w(o,"route id must be a non-empty string");continue}if(r===null||typeof r!="object"||Array.isArray(r)){w(o,"route must be an object");continue}const i=r,d=t[o],c={...d};let u;for(const f of["family","credentialSource","providerId"]){const l=i[f];if(l!==void 0){if(typeof l!="string"||l.trim()===""){u=`${f} must be a non-empty string`;break}c[f]=l}}if(u===void 0&&i.models!==void 0)if(i.models===null||typeof i.models!="object"||Array.isArray(i.models))u="models must be an object";else{const f={...d?.models};for(const[l,a]of Object.entries(i.models)){if(!oe(l)){u=`models.${l} is not a model strength`;break}if(typeof a!="string"||a.trim()===""){u=`models.${l} must be a non-empty provider/id ref`;break}const m=a.indexOf("/");if(m<=0||m===a.length-1){u=`models.${l} must be provider/id`;break}f[l]=a}c.models=f}if(u===void 0&&c.models!==void 0&&c.providerId!==void 0){for(const[f,l]of Object.entries(c.models))if(l.slice(0,l.indexOf("/"))!==c.providerId){u=`models.${f} provider prefix must equal providerId`;break}}if(u!==void 0){w(o,u);continue}k(t,o,c)}return t}s(x,"mergeModelRoutePatches");function re(e){const n=U(),t=U();for(const[o,r]of Object.entries(e)){if(r.family===void 0||r.credentialSource===void 0||r.providerId===void 0||r.models===void 0){w(o,"route must include family, credentialSource, providerId, and models");continue}const i=D.filter(d=>r.models[d]===void 0);if(i.length>0){w(o,`incomplete route; missing strengths: ${i.join(", ")}`),k(t,o,{family:r.family,credentialSource:r.credentialSource,providerId:r.providerId,models:r.models});continue}k(n,o,{family:r.family,credentialSource:r.credentialSource,providerId:r.providerId,models:r.models})}return{complete:n,legacy:t}}s(re,"resolveModelRoutes");function An(e,n){if(e.trim()==="")throw new Error("model route id must be a non-empty string");for(const o of["family","credentialSource","providerId"])if(typeof n[o]!="string"||n[o].trim()==="")throw new Error(`model route "${e}" ${o} must be a non-empty string`);const t=D.filter(o=>n.models?.[o]===void 0);if(t.length>0)throw new Error(`model route "${e}" is incomplete; missing strengths: ${t.join(", ")}`);for(const o of D){const r=n.models[o];if(typeof r!="string"||r.trim()==="")throw new Error(`model route "${e}" models.${o} must be a non-empty provider/id ref`);const i=r.indexOf("/");if(i<=0||i===r.length-1)throw new Error(`model route "${e}" models.${o} must be provider/id`);if(r.slice(0,i)!==n.providerId)throw new Error(`model route "${e}" models.${o} provider prefix must equal providerId`)}}s(An,"assertCompleteModelRoute");function O(e,n){if(e===void 0||e===null||typeof e!="object"||Array.isArray(e))return n;const t=e,o=s(i=>Array.isArray(i)&&i.every(d=>typeof d=="string"&&d.trim()!=="")?[...i]:void 0,"strings"),r=Array.isArray(t.strengthFallback)&&t.strengthFallback.every(i=>oe(i))?[...t.strengthFallback]:void 0;return{...o(t.credentialSourceOrder)!==void 0?{credentialSourceOrder:o(t.credentialSourceOrder)}:{},...o(t.familyOrder)!==void 0?{familyOrder:o(t.familyOrder)}:{},...r!==void 0?{strengthFallback:r}:{}}}s(O,"mergeModelRouting");function Rn(e){return e!==""&&e.replace(/\*/g,"")===""}s(Rn,"isInheritAllGlob");function E(e,n=[]){const t=e,o=Array.isArray(t?.allow)?t.allow.filter(r=>typeof r=="string"):[];for(const r of o)if(Rn(r))throw new Error(`spawnEnv.allow: "${r}" matches every env var name (inherit-all) \u2014 this is exactly the leak the spawn-env boundary closes. Name the specific vars/prefixes you actually need instead (e.g. "AWS_*", "GIT_ASKPASS").`);return{allow:[...new Set([...n,...o])]}}s(E,"mergeSpawnEnv");function I(e,n={}){const t={};for(const[o,r]of Object.entries(n))t[o]={...r};if(e!==null&&typeof e=="object")for(const[o,r]of Object.entries(e)){if(r===null||typeof r!="object")continue;const i={...t[o]},d=r.fastMode;typeof d=="boolean"&&(i.fastMode=d),t[o]=i}return t}s(I,"mergeProviderOptions");const ie=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,jn=new Set(["crtr","crtrd"]);function P(e,n){if(n==="bin"&&jn.has(e))return`${n}.${e} is reserved by crouter \u2014 pick another bare command name`;if(!ie.test(e))return`${n}.${e} is not a safe bare command name (expected ${ie.source})`}s(P,"bareCommandNameIssue");function Sn(e){if(e===null||typeof e!="object"||Array.isArray(e))return[{name:"bin",message:"bin must be a JSON object mapping bare command name to a relative path"}];const n=[];for(const[t,o]of Object.entries(e)){const r=P(t,"bin");r!==void 0&&n.push({name:t,message:r}),(typeof o!="string"||o.trim()==="")&&n.push({name:t,message:`bin.${t} must be a non-empty relative path to an executable inside the contributor root`})}return n}s(Sn,"binDeclarationIssues");function xn(e){if(e===null||typeof e!="object"||Array.isArray(e))return{};const n={};for(const[t,o]of Object.entries(e))P(t,"bin")===void 0&&(typeof o!="string"||o.trim()===""||(n[t]=o));return n}s(xn,"normalizeBin");const se=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function On(e){if(e===null||typeof e!="object"||Array.isArray(e))return[{name:"humanActions",reason:"humanActions must be a JSON object mapping action names to {argv, cwd}",block:!0}];const n=[];for(const[t,o]of Object.entries(e)){const r=[];if(se.test(t)||r.push(`action name must match ${se.source}`),o===null||typeof o!="object"||Array.isArray(o))r.push("action must be an object with argv and cwd");else{const i=o,d=Object.keys(i).filter(c=>c!=="argv"&&c!=="cwd");d.length>0&&r.push(`action has unsupported field${d.length===1?"":"s"}: ${d.join(", ")}`),(!Array.isArray(i.argv)||i.argv.length===0||!i.argv.every(c=>typeof c=="string"&&c.length>0))&&r.push("argv must be a non-empty array of non-empty strings"),(typeof i.cwd!="string"||i.cwd.length===0)&&r.push("cwd is required and must be a non-empty string")}r.length>0&&n.push({name:t,reason:r.join("; ")})}return n}s(On,"humanActionDeclarationIssues");function En(e){if(e===null||typeof e!="object"||Array.isArray(e))return{};const n=new Set(On(e).map(o=>o.name)),t={};for(const[o,r]of Object.entries(e)){if(n.has(o))continue;const i=r;t[o]={argv:[...i.argv],cwd:i.cwd}}return t}s(En,"normalizeHumanActions");function yo(e){return Sn(e).map(n=>n.message)}s(yo,"invalidPluginBinReasons");function ho(e){if(e===null||typeof e!="object"||Array.isArray(e))return{};const n={};for(const[t,o]of Object.entries(e))P(t,"requires")===void 0&&(typeof o!="string"||o.trim()===""||/[\r\n]/.test(o)||(n[t]=o));return n}s(ho,"normalizeRequires");function bo(e){if(e===null||typeof e!="object"||Array.isArray(e))return["requires must be a JSON object mapping a bare executable name to a one-line install hint"];const n=[];for(const[t,o]of Object.entries(e)){const r=P(t,"requires");r!==void 0&&n.push(r),typeof o!="string"||o.trim()===""?n.push(`requires.${t} must be a non-empty one-line install hint`):/[\r\n]/.test(o)&&n.push(`requires.${t} must be a one-line install hint`)}return n}s(bo,"invalidPluginRequiresReasons");function de(e){if(e===null||typeof e!="object")return null;const n=e,t={};typeof n.whenToUse=="string"&&n.whenToUse.trim()!==""&&(t.whenToUse=n.whenToUse),typeof n.model=="string"&&n.model.trim()!==""&&(t.model=n.model),typeof n.orchestratorModel=="string"&&n.orchestratorModel.trim()!==""&&(t.orchestratorModel=n.orchestratorModel);const o=s(r=>Array.isArray(r)&&r.every(i=>typeof i=="string"),"isStringArray");return o(n.tools)&&(t.tools=n.tools),o(n.extensions)&&(t.extensions=n.extensions),o(n.availableTo)&&(t.availableTo=n.availableTo),Object.keys(t).length>0?t:null}s(de,"normalizeKindFields");function A(e,n=Ge()){const t={...n};if(e!==null&&typeof e=="object")for(const[o,r]of Object.entries(e)){const i=de(r);if(i===null)continue;const d=t[o];d!==void 0?t[o]={...d,...i}:i.whenToUse!==void 0&&(t[o]=i)}return t}s(A,"mergeKinds");function ce(e,n,t){if(n===null)return t;const o=Y(e,n).filter(i=>i.enabled&&i.manifest.kinds!==void 0).sort((i,d)=>i.name.localeCompare(d.name));let r=t;for(const i of o)r=A(i.manifest.kinds,r);return r}s(ce,"layerPluginKinds");function _o(){const e=[{origin:"config.json",components:gn("user").page_components}],n=y("user");if(n!==null){const t=Y("user",n).filter(o=>o.enabled&&o.manifest.page_components!==void 0).sort((o,r)=>o.name.localeCompare(r.name));for(const o of t){const r=`plugin "${o.name}" page_components`;e.push({origin:`plugin "${o.name}"`,components:X(o.manifest.page_components,r)})}}return mn(e)}s(_o,"resolvePageComponents");const K=new Set(["whenToUse","model","orchestratorModel","tools","extensions","availableTo"]);function vo(e){if(e===null||typeof e!="object"||Array.isArray(e))return["kinds must be a JSON object keyed by kind name"];const n=[],t=s(o=>Array.isArray(o)&&o.every(r=>typeof r=="string"),"isStringArray");for(const[o,r]of Object.entries(e)){if(o.trim()===""){n.push("kinds contains an empty kind name");continue}if(r===null||typeof r!="object"||Array.isArray(r)){n.push(`kinds.${o} must be a JSON object`);continue}const i=r;for(const d of Object.keys(i))K.has(d)||n.push(`kinds.${o}.${d} is not a KindConfig field (expected one of: ${[...K].join(", ")})`);i.whenToUse!==void 0&&(typeof i.whenToUse!="string"||i.whenToUse.trim()==="")&&n.push(`kinds.${o}.whenToUse must be a non-empty string`);for(const d of["model","orchestratorModel"])i[d]!==void 0&&(typeof i[d]!="string"||i[d].trim()==="")&&n.push(`kinds.${o}.${d} must be a non-empty string`);for(const d of["tools","extensions","availableTo"])i[d]!==void 0&&!t(i[d])&&n.push(`kinds.${o}.${d} must be an array of strings`);de(r)===null&&n.push(`kinds.${o} has no valid KindConfig field \u2014 an entry must set at least one of: ${[...K].join(", ")} (whenToUse is required when the kind exists in no lower layer)`)}return n}s(vo,"invalidPluginKindsReasons");function In(e){if(e===null||typeof e!="object")return null;const n=e;if(typeof n.previewEndpoint!="string"||n.previewEndpoint.trim()===""||typeof n.relayTokenRef!="string"||n.relayTokenRef.trim()==="")return null;const t={previewEndpoint:n.previewEndpoint,relayTokenRef:n.relayTokenRef};return typeof n.cpOrigin=="string"&&n.cpOrigin.trim()!==""&&(t.cpOrigin=n.cpOrigin),t}s(In,"normalizeRemoteCanvasTarget");function Pn(e,n=Be()){const t={...n.targets};if(e!==null&&typeof e=="object"){const o=e;if(o.targets!==null&&typeof o.targets=="object")for(const[r,i]of Object.entries(o.targets)){const d=In(i);d!==null&&(t[r]=d)}}return{targets:t}}s(Pn,"mergeRemoteCanvas");function ue(e,n){return e===!0?"notify":e===!1?!1:e==="notify"||e==="apply"?e:n}s(ue,"normalizeMode");function R(e,n){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=1?e:n}s(R,"normalizePositiveInteger");function Tn(e,n){const t=e!==null&&typeof e=="object"?e:{},o=R(t.warning,n.warning),r=R(t.automaticReviveCap,n.automaticReviveCap);return o<=r?{warning:o,automaticReviveCap:r}:{...n}}s(Tn,"mergeBrokerThresholds");function $n(e,n){return{unattendedParkMs:R((e!==null&&typeof e=="object"?e:{}).unattendedParkMs,n.unattendedParkMs)}}s($n,"mergeLifecycle");function Cn(e){if(!Array.isArray(e))return[...J];const n=e.filter(t=>typeof t=="string"&&t.trim()!=="").map(t=>t.trim());return n.length>0?n:[...J]}s(Cn,"normalizeWhipMessages");function T(e){const n=b(),t=n.schema_version,o=e.marketplaces===void 0?{}:e.marketplaces,r=e.plugins===void 0?{}:e.plugins,i=e.auto_update,d=i&&typeof i.interval_hours=="number"?i.interval_hours:void 0,c=d!==void 0&&Number.isFinite(d)&&d>=0?d:n.auto_update.interval_hours,u={crtr:ue(i?.crtr,n.auto_update.crtr),content:ue(i?.content,n.auto_update.content),interval_hours:c},f=e.max_panes_per_window,l=R(f,n.max_panes_per_window),a=typeof e.auto_open_child_viewers=="boolean"?e.auto_open_child_viewers:n.auto_open_child_viewers,m=Tn(e.brokerThresholds,n.brokerThresholds),$=$n(e.lifecycle,n.lifecycle),p=typeof e.completion_bell=="boolean"?e.completion_bell:n.completion_bell,le=e.working_gerunds===void 0?[...n.working_gerunds]:an(e.working_gerunds),fe=typeof e.whip_mode=="boolean"?e.whip_mode:n.whip_mode,ae=X(e.page_components),me=typeof e.page_surface=="boolean"?e.page_surface:n.page_surface,pe=Cn(e.whip_messages),ge=Ue.includes(e.whip_message_mode)?e.whip_message_mode:n.whip_message_mode,ye=De.includes(e.mouse_mode_default)?e.mouse_mode_default:n.mouse_mode_default,he=R(e.live_cycles,n.live_cycles),be=ze.includes(e.condensed_history)?e.condensed_history:n.condensed_history,_e=typeof e.bash_tool_purpose=="boolean"?e.bash_tool_purpose:n.bash_tool_purpose,ve=typeof e.fold_finished_tools=="boolean"?e.fold_finished_tools:n.fold_finished_tools,ke=typeof e.summarize_tool_calls=="boolean"?e.summarize_tool_calls:n.summarize_tool_calls,we=typeof e.detailed_tool_recaps=="boolean"?e.detailed_tool_recaps:n.detailed_tool_recaps,Ae=vn(e.keybindings),Re=wn(e.tmux_passthrough),je=S(e.modelLadders),Se=I(e.providerOptions,n.providerOptions),C=re(x(e.modelRoutes)),G=C.complete,B=O(e.modelRouting,void 0),xe=A(e.kinds),Oe=Pn(e.remoteCanvas),Ee=E(e.spawnEnv,n.spawnEnv?.allow),Ie=xn(e.bin),Pe=En(e.humanActions);return{bin:Ie,humanActions:Pe,schema_version:t,marketplaces:o,plugins:r,auto_update:u,max_panes_per_window:l,auto_open_child_viewers:a,brokerThresholds:m,lifecycle:$,completion_bell:p,working_gerunds:le,whip_mode:fe,page_components:ae,page_surface:me,whip_messages:pe,whip_message_mode:ge,mouse_mode_default:ye,live_cycles:he,condensed_history:be,bash_tool_purpose:_e,fold_finished_tools:ve,summarize_tool_calls:ke,detailed_tool_recaps:we,keybindings:Ae,tmux_passthrough:Re,modelLadders:je,providerOptions:Se,...Object.keys(G).length>0?{modelRoutes:G}:{},...Object.keys(C.legacy).length>0?{legacyModelRoutes:C.legacy}:{},...B!==void 0?{modelRouting:B}:{},kinds:xe,remoteCanvas:Oe,spawnEnv:Ee}}s(T,"mergeConfig");function Mn(e){return j(e)}s(Mn,"readRawConfigAtRoot");function Ln(e){const n=y(e);return n?Mn(n):null}s(Ln,"readRawScopeConfig");function Nn(e){if(e===null||e==="")return null;try{return j(N(e))}catch{return null}}s(Nn,"readRawProfileConfig");function Fn(e,n){return[...Qe(e,n)].reverse().map(r=>({root:r,raw:j(r)}))}s(Fn,"readRawProjectScopeConfigs");function q(e=process.cwd(),n=$e()||null){const t=b(),o=Ln("user"),r=Nn(n),i=Fn(e,n);let d=A(o?.kinds,ce("user",y("user"),t.kinds)),c=S(o?.modelLadders,t.modelLadders),u=I(o?.providerOptions,t.providerOptions),f=x(o?.modelRoutes),l=O(o?.modelRouting,void 0),a=E(o?.spawnEnv,t.spawnEnv?.allow);r!==null&&(d=A(r.kinds,d),c=S(r.modelLadders,c),u=I(r.providerOptions,u),f=x(r.modelRoutes,f),l=O(r.modelRouting,l),a=E(r.spawnEnv,a.allow));for(const{root:$,raw:p}of i)d=A(p?.kinds,ce("project",$,d)),p!==null&&(c=S(p.modelLadders,c),u=I(p.providerOptions,u),f=x(p.modelRoutes,f),l=O(p.modelRouting,l),a=E(p.spawnEnv,a.allow));const m=re(f);return{kinds:d,modelLadders:c,providerOptions:u,...Object.keys(m.complete).length>0?{modelRoutes:m.complete}:{},...Object.keys(m.legacy).length>0?{legacyModelRoutes:m.legacy}:{},...l!==void 0?{modelRouting:l}:{},spawnEnv:a}}s(q,"readMergedLaunchConfig");function ko(e){return q().kinds[e]}s(ko,"resolveKindConfig");function wo(e){const n=Object.keys(q().kinds).sort();if(!n.includes(e))throw Ye(`unknown kind: ${e}`,{received:e,field:"kind",next:`Valid kinds: ${n.join(", ")}.`})}s(wo,"assertInstalledKind");function Ao(e){const n=q().kinds,t=[];for(const[o,r]of Object.entries(n)){const i=o.indexOf("/");if(i===-1)continue;const d=o.slice(0,i),c=r.availableTo??[d];(c.includes("*")||c.includes(e))&&t.push({kind:o,whenToUse:r.whenToUse})}return t.sort((o,r)=>o.kind.localeCompare(r.kind))}s(Ao,"subKindsAvailableTo");function zn(e,n,t){const o={...e??{}};o.anthropic!==void 0&&(o.anthropic={...o.anthropic}),o.openai!==void 0&&(o.openai={...o.openai}),t.defaultProvider!==n.defaultProvider&&t.defaultProvider!==void 0&&(o.defaultProvider=t.defaultProvider);for(const i of["anthropic","openai"])for(const d of["ultra","strong","medium","light"])t[i][d]!==n[i][d]&&(o[i]={...o[i]??{},[d]:t[i][d]});return o.defaultProvider!==void 0||o.anthropic!==void 0||o.openai!==void 0?o:void 0}s(zn,"sparseModelLaddersToPersist");function Dn(e,n){return v(e,t=>{const o=T(t),r=T(t);n(r);const i={...t};for(const c of fn)c!=="modelLadders"&&!Le(r[c],o[c])&&(i[c]=r[c]);const d=zn(t.modelLadders,o.modelLadders,r.modelLadders);return d!==void 0?i.modelLadders=d:delete i.modelLadders,{value:r,next:i}})}s(Dn,"mutateConfigAtRoot");function Ro(e,n){v(e,t=>{const o=t.modelLadders??{},r={...o};n.defaultProvider!==void 0&&(r.defaultProvider=n.defaultProvider);for(const i of["anthropic","openai"])n[i]!==void 0&&(r[i]={...o[i]??{},...n[i]});return{value:void 0,next:{...t,modelLadders:r}}})}s(Ro,"persistModelLadders");function jo(e,n,t){if(t!==void 0)An(n,t);else if(n.trim()==="")throw new Error("model route id must be a non-empty string");v(e,o=>{const r=te(o.modelRoutes??{});t===void 0?delete r[n]:k(r,n,{...t,models:{...t.models}});const i={...o};return Object.keys(r).length===0?delete i.modelRoutes:i.modelRoutes=r,{value:void 0,next:i}})}s(jo,"persistModelRoute");function Un(e,n){return Dn(e,n)}s(Un,"updateConfigAtRoot");function So(e,n){return Un(_(e),n)}s(So,"updateConfig");function xo(e){const n=e.orchestrator===!0?"orchestratorModel":"model";return v(e.root,t=>{const o={...t.kinds??{},[e.kind]:{...(t.kinds??{})[e.kind],[n]:e.model}};return{value:void 0,next:{...t,kinds:o}}}),{path:h(e.root),field:n}}s(xo,"persistDefaultKindModel");function Oo(e,n){const t=hn(e);return n(t),_n(e,t),t}s(Oo,"updateState");export{bn as InvalidRawSettingsError,wo as assertInstalledKind,Sn as binDeclarationIssues,co as configPath,go as ensureScopeInitialized,On as humanActionDeclarationIssues,yo as invalidPluginBinReasons,vo as invalidPluginKindsReasons,bo as invalidPluginRequiresReasons,xn as normalizeBin,En as normalizeHumanActions,ho as normalizeRequires,wn as normalizeTmuxPassthrough,xo as persistDefaultKindModel,Ro as persistModelLadders,jo as persistModelRoute,gn as readConfig,yn as readConfigAtRoot,q as readMergedLaunchConfig,Mn as readRawConfigAtRoot,Ln as readRawScopeConfig,lo as readRawSettingsForTarget,hn as readState,fo as replaceRawSettingsForTarget,ko as resolveKindConfig,_o as resolvePageComponents,uo as statePath,Ao as subKindsAvailableTo,So as updateConfig,Un as updateConfigAtRoot,ao as updateRawConfigAtomically,Oo as updateState,mo as writeConfig,po as writeRawConfig,_n as writeState};
|