@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
|
@@ -1,859 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
// 2. a border color that tracks the agent's thinking level (set by viewer.ts
|
|
6
|
-
// on each state update), mirroring pi's `getThinkingBorderColor`.
|
|
7
|
-
// Both are pure render-layer chrome; nothing here touches the socket or session.
|
|
8
|
-
import { statSync } from 'node:fs';
|
|
9
|
-
import { CustomEditor } from '@earendil-works/pi-coding-agent';
|
|
10
|
-
import { CURSOR_MARKER, truncateToWidth, visibleWidth, wrapTextWithAnsi, } from '@earendil-works/pi-tui';
|
|
11
|
-
// Deep import: `wordWrapLine` implements pi-tui's exact word-wrap algorithm but is
|
|
12
|
-
// not re-exported from the package root (only `Editor`/`EditorTheme`/`EditorOptions`
|
|
13
|
-
// are). The package has no `"exports"` field, so a deep subpath import is not
|
|
14
|
-
// blocked by Node's resolution. We need the EXACT wrap algorithm (not a
|
|
15
|
-
// reimplementation) to recompute layout for ref-highlight decoration below —
|
|
16
|
-
// see `buildRefLayoutChunks`.
|
|
17
|
-
import { wordWrapLine } from '@earendil-works/pi-tui/dist/components/editor.js';
|
|
18
|
-
import { findRefTokens } from '../../../core/memory/inline-ref-grammar.js';
|
|
19
|
-
import { findRefCompletionContext } from './ref-autocomplete.js';
|
|
20
|
-
const LOADED_COMMAND_PREVIEW_MAX_LINES = 8;
|
|
21
|
-
const LOADED_COMMAND_PREVIEW_MIN_WIDTH = 24;
|
|
22
|
-
const LOADED_COMMAND_PREVIEW_MAX_CHARS = 8_192;
|
|
23
|
-
/** Strip terminal controls from inline chrome only. The exact, unmodified
|
|
24
|
-
* prompt remains available through the inspector. */
|
|
25
|
-
function sanitizeLoadedCommandPreview(content, limit) {
|
|
26
|
-
const bounded = content.slice(0, limit);
|
|
27
|
-
const truncated = content.length > limit;
|
|
28
|
-
// CSI, OSC (BEL or ST terminated), and every remaining C0/C1 control other
|
|
29
|
-
// than newline are inert in a Text component, never terminal instructions.
|
|
30
|
-
const text = bounded
|
|
31
|
-
.replace(/\x1b\](?:[^\x07\x1b]*)(?:\x07|\x1b\\)?/g, '')
|
|
32
|
-
.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, '')
|
|
33
|
-
.replace(/[\x00-\x09\x0b-\x1f\x7f-\x9f]/g, '');
|
|
34
|
-
return { text, truncated };
|
|
35
|
-
}
|
|
36
|
-
/** Keep inline command disclosure compact and bounded before wrapping; the
|
|
37
|
-
* inspector remains the unbounded, exact-prompt surface. */
|
|
38
|
-
export function compactLoadedCommandPreview(content, width) {
|
|
39
|
-
if (width < LOADED_COMMAND_PREVIEW_MIN_WIDTH)
|
|
40
|
-
return [];
|
|
41
|
-
const limit = Math.min(LOADED_COMMAND_PREVIEW_MAX_CHARS, Math.max(256, width * LOADED_COMMAND_PREVIEW_MAX_LINES * 4));
|
|
42
|
-
const safe = sanitizeLoadedCommandPreview(content, limit);
|
|
43
|
-
const wrapped = wrapTextWithAnsi(safe.text, width);
|
|
44
|
-
if (!safe.truncated && wrapped.length <= LOADED_COMMAND_PREVIEW_MAX_LINES)
|
|
45
|
-
return wrapped;
|
|
46
|
-
const visible = wrapped.slice(0, LOADED_COMMAND_PREVIEW_MAX_LINES - 1);
|
|
47
|
-
visible.push(truncateToWidth('… truncated · inspect for full prompt', width));
|
|
48
|
-
return visible;
|
|
49
|
-
}
|
|
50
|
-
/** The standard thinking levels form a deliberate cool→warm ramp between blue
|
|
51
|
-
* and its orange complement. `max` is a distinct, intense cyan endpoint so it
|
|
52
|
-
* never falls back to the neutral default border. `off` alone falls back to
|
|
53
|
-
* the caller's default border color. The colors double as title-chip
|
|
54
|
-
* BACKGROUNDS under bold white text, so each must remain dark enough for the
|
|
55
|
-
* label to read clearly. */
|
|
56
|
-
const THINKING_START = [46, 92, 190]; // deep blue
|
|
57
|
-
const THINKING_END = [166, 98, 24]; // deep amber
|
|
58
|
-
const THINKING_MAX = [0, 145, 170]; // intense cyan
|
|
59
|
-
function interpolateRgb(start, end, t) {
|
|
60
|
-
return [
|
|
61
|
-
Math.round(start[0] + (end[0] - start[0]) * t),
|
|
62
|
-
Math.round(start[1] + (end[1] - start[1]) * t),
|
|
63
|
-
Math.round(start[2] + (end[2] - start[2]) * t),
|
|
64
|
-
];
|
|
65
|
-
}
|
|
66
|
-
const THINKING_RGB = {
|
|
67
|
-
off: undefined, // default border color
|
|
68
|
-
minimal: interpolateRgb(THINKING_START, THINKING_END, 0 / 4),
|
|
69
|
-
low: interpolateRgb(THINKING_START, THINKING_END, 1 / 4),
|
|
70
|
-
medium: interpolateRgb(THINKING_START, THINKING_END, 2 / 4),
|
|
71
|
-
high: interpolateRgb(THINKING_START, THINKING_END, 3 / 4),
|
|
72
|
-
xhigh: interpolateRgb(THINKING_START, THINKING_END, 4 / 4),
|
|
73
|
-
max: THINKING_MAX,
|
|
74
|
-
};
|
|
75
|
-
/** Named colours `/color` accepts, as RGB — mirrors the tmux colour-name table
|
|
76
|
-
* (so the chip and the pane border read as the same hue). */
|
|
77
|
-
const NAMED_RGB = {
|
|
78
|
-
black: [0, 0, 0],
|
|
79
|
-
red: [205, 49, 49],
|
|
80
|
-
green: [13, 188, 121],
|
|
81
|
-
yellow: [229, 229, 16],
|
|
82
|
-
blue: [36, 114, 200],
|
|
83
|
-
magenta: [188, 63, 188],
|
|
84
|
-
cyan: [17, 168, 205],
|
|
85
|
-
white: [229, 229, 229],
|
|
86
|
-
orange: [228, 152, 68],
|
|
87
|
-
grey: [128, 128, 128],
|
|
88
|
-
gray: [128, 128, 128],
|
|
89
|
-
brightred: [241, 76, 76],
|
|
90
|
-
brightgreen: [35, 209, 139],
|
|
91
|
-
brightyellow: [245, 245, 67],
|
|
92
|
-
brightblue: [59, 142, 234],
|
|
93
|
-
brightmagenta: [214, 112, 214],
|
|
94
|
-
brightcyan: [41, 184, 219],
|
|
95
|
-
};
|
|
96
|
-
/** Build a title-chip styler for a `/color` token (a tmux colour name, `#rrggbb`,
|
|
97
|
-
* or `colourN`): the colour as the chip BACKGROUND with contrast-picked bold
|
|
98
|
-
* text, matching the thinking-chip treatment. `undefined` for an unrenderable
|
|
99
|
-
* token (e.g. `default`) — the caller keeps its fallback style. */
|
|
100
|
-
export function colorChipStyle(token) {
|
|
101
|
-
const t = token.trim().toLowerCase();
|
|
102
|
-
const c256 = /^colour(\d{1,3})$/.exec(t);
|
|
103
|
-
if (c256 !== null)
|
|
104
|
-
return (s) => `\x1b[48;5;${c256[1]}m\x1b[97m\x1b[1m ${s} \x1b[0m`;
|
|
105
|
-
let rgb;
|
|
106
|
-
const hex = /^#([0-9a-f]{6})$/.exec(t);
|
|
107
|
-
if (hex !== null) {
|
|
108
|
-
const h = hex[1];
|
|
109
|
-
rgb = [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
rgb = NAMED_RGB[t];
|
|
113
|
-
}
|
|
114
|
-
if (rgb === undefined)
|
|
115
|
-
return undefined;
|
|
116
|
-
const [r, g, b] = rgb;
|
|
117
|
-
// Pick black-on-light / white-on-dark so the name stays readable on any hue.
|
|
118
|
-
const luma = 0.299 * r + 0.587 * g + 0.114 * b;
|
|
119
|
-
const fg = luma > 160 ? '\x1b[30m' : '\x1b[97m';
|
|
120
|
-
return (s) => `\x1b[48;2;${r};${g};${b}m${fg}\x1b[1m ${s} \x1b[0m`;
|
|
121
|
-
}
|
|
122
|
-
/** The default (thinking `off`) title chip: reverse video + a space of padding
|
|
123
|
-
* each side, so the name reads as a label sitting on the border rule. Used as
|
|
124
|
-
* the fallback when no thinking color applies. */
|
|
125
|
-
export const defaultTitleStyle = (s) => `\x1b[7m ${s} \x1b[27m`;
|
|
126
|
-
/** Resolve the editor border colorizer for a thinking level. Unknown / `off` →
|
|
127
|
-
* the supplied `fallback` (the theme's default border color). */
|
|
128
|
-
export function thinkingBorderColor(level, fallback) {
|
|
129
|
-
const rgb = level === undefined ? undefined : THINKING_RGB[level];
|
|
130
|
-
if (rgb === undefined)
|
|
131
|
-
return fallback;
|
|
132
|
-
const [r, g, b] = rgb;
|
|
133
|
-
return (s) => `\x1b[38;2;${r};${g};${b}m${s}\x1b[39m`;
|
|
134
|
-
}
|
|
135
|
-
/** Resolve the title-chip styler for a thinking level: the level's color as the
|
|
136
|
-
* chip BACKGROUND with bold white text (a space of padding each side), so the
|
|
137
|
-
* session name reads as a solid label in the same hue as the border. Unknown /
|
|
138
|
-
* `off` → the supplied `fallback` (the reverse-video default chip). */
|
|
139
|
-
export function thinkingTitleStyle(level, fallback) {
|
|
140
|
-
const rgb = level === undefined ? undefined : THINKING_RGB[level];
|
|
141
|
-
if (rgb === undefined)
|
|
142
|
-
return fallback;
|
|
143
|
-
const [r, g, b] = rgb;
|
|
144
|
-
return (s) => `\x1b[48;2;${r};${g};${b}m\x1b[97m\x1b[1m ${s} \x1b[0m`;
|
|
145
|
-
}
|
|
146
|
-
/** Compose the replacement top-border line: solid title chip + border rule +
|
|
147
|
-
* info chip, never wider than `width` (pi-tui hard-crashes on an over-wide
|
|
148
|
-
* line). The info chip yields entirely when the chip leaves it almost no room,
|
|
149
|
-
* and truncates when it only partially fits. Exported pure for the overflow
|
|
150
|
-
* regression test. */
|
|
151
|
-
export function composeTopBorder(width, title, info, titleStyle, borderColor) {
|
|
152
|
-
const chip = title ? titleStyle(truncateToWidth(title, Math.max(1, width - 4), '…')) : '';
|
|
153
|
-
const chipW = visibleWidth(chip);
|
|
154
|
-
const avail = width - chipW;
|
|
155
|
-
let infoChip = '';
|
|
156
|
-
if (info && avail > 4) {
|
|
157
|
-
infoChip = visibleWidth(info) <= avail ? info : truncateToWidth(info, avail, '…');
|
|
158
|
-
}
|
|
159
|
-
const fill = Math.max(0, width - chipW - visibleWidth(infoChip));
|
|
160
|
-
return chip + borderColor('─'.repeat(fill)) + infoChip;
|
|
161
|
-
}
|
|
162
|
-
/** The stock pi-tui editor paints its fake cursor as a solid reverse-video
|
|
163
|
-
* block (`\x1b[7m…\x1b[0m`) unconditionally — in a wall of attach panes every
|
|
164
|
-
* pane shows an identical solid white cursor, and nothing tells you which one
|
|
165
|
-
* keys actually go to. When the hosting pane/terminal is UNFOCUSED we rewrite
|
|
166
|
-
* that cell into a MUTED cursor, mirroring how real terminals de-emphasize
|
|
167
|
-
* the hardware cursor on blur. A pixel-true full-cell outline isn't possible
|
|
168
|
-
* in text cells, and hollow-box glyphs (▯/⍘/□) render undersized, so the
|
|
169
|
-
* muted form is a full-size block in a dim gray background — same footprint
|
|
170
|
-
* as the focused cursor, clearly not the bright active one (ruling: tried the
|
|
171
|
-
* glyphs, Silas preferred the dim block). The rewrite anchors on pi-tui's
|
|
172
|
-
* zero-width CURSOR_MARKER (emitted right before the fake cursor while the
|
|
173
|
-
* editor component has TUI focus) so it can never touch reverse video
|
|
174
|
-
* elsewhere in the line. Returns undefined when the line carries no cursor.
|
|
175
|
-
* Exported pure for tests. */
|
|
176
|
-
const SOLID_CURSOR_PREFIX = '\x1b[7m';
|
|
177
|
-
const SOLID_CURSOR_RESET = '\x1b[0m';
|
|
178
|
-
/** Dim gray bg, default fg — the char under the cursor stays readable. */
|
|
179
|
-
const MUTED_CURSOR_ON = '\x1b[48;5;240m';
|
|
180
|
-
export function outlineCursorLine(line) {
|
|
181
|
-
const m = line.indexOf(CURSOR_MARKER);
|
|
182
|
-
if (m === -1)
|
|
183
|
-
return undefined;
|
|
184
|
-
const start = m + CURSOR_MARKER.length;
|
|
185
|
-
if (!line.startsWith(SOLID_CURSOR_PREFIX, start))
|
|
186
|
-
return undefined;
|
|
187
|
-
const gStart = start + SOLID_CURSOR_PREFIX.length;
|
|
188
|
-
const end = line.indexOf(SOLID_CURSOR_RESET, gStart);
|
|
189
|
-
if (end === -1)
|
|
190
|
-
return undefined;
|
|
191
|
-
const grapheme = line.slice(gStart, end);
|
|
192
|
-
const replacement = `${MUTED_CURSOR_ON}${grapheme}\x1b[0m`;
|
|
193
|
-
return line.slice(0, start) + replacement + line.slice(end + SOLID_CURSOR_RESET.length);
|
|
194
|
-
}
|
|
195
|
-
/** Image file extensions a dragged path is recognized by. */
|
|
196
|
-
const IMAGE_PATH_RE = /\.(png|jpe?g|gif|webp|bmp)$/i;
|
|
197
|
-
/** Recognize a single input chunk as a filesystem path to an image file — how a
|
|
198
|
-
* terminal delivers a file DRAGGED into the pane (the escaped path pasted in
|
|
199
|
-
* bulk, optionally wrapped in bracketed-paste markers). Returns the resolved
|
|
200
|
-
* path, or null when the chunk isn't a lone image path (normal typing, multi-
|
|
201
|
-
* line text, a non-image path, or a path that doesn't point at a real file).
|
|
202
|
-
* Conservative on purpose: it must never transform ordinary typed input. */
|
|
203
|
-
export function detectDroppedImagePath(data) {
|
|
204
|
-
// Unwrap bracketed paste (\x1b[200~ … \x1b[201~) when the terminal uses it.
|
|
205
|
-
const bracketed = data.match(/\x1b\[200~([\s\S]*?)\x1b\[201~/);
|
|
206
|
-
let payload = (bracketed ? bracketed[1] : data).trim();
|
|
207
|
-
if (payload.length < 2)
|
|
208
|
-
return null; // a lone keystroke is never a drop
|
|
209
|
-
if (/[\u0000-\u0008\u000e-\u001f]/.test(payload))
|
|
210
|
-
return null; // control chars → not a path
|
|
211
|
-
// Terminals wrap a dropped path in quotes or backslash-escape its spaces.
|
|
212
|
-
if ((payload.startsWith("'") && payload.endsWith("'")) ||
|
|
213
|
-
(payload.startsWith('"') && payload.endsWith('"'))) {
|
|
214
|
-
payload = payload.slice(1, -1);
|
|
215
|
-
}
|
|
216
|
-
const path = payload.replace(/\\(.)/g, '$1');
|
|
217
|
-
if (/\n/.test(path) || !IMAGE_PATH_RE.test(path))
|
|
218
|
-
return null;
|
|
219
|
-
try {
|
|
220
|
-
if (!statSync(path).isFile())
|
|
221
|
-
return null;
|
|
222
|
-
}
|
|
223
|
-
catch {
|
|
224
|
-
return null; // not a real file → treat as ordinary pasted text
|
|
225
|
-
}
|
|
226
|
-
return path;
|
|
227
|
-
}
|
|
228
|
-
/** Recompute the exact layout pi-tui's `Editor.render` will produce for
|
|
229
|
-
* `lines` at `layoutWidth`, faithfully porting the private `layoutText`
|
|
230
|
-
* algorithm (empty-editor special case; per-line whole-fit vs `wordWrapLine`
|
|
231
|
-
* branch; cursor-in-chunk assignment for wrapped lines). `wordWrapLine` here
|
|
232
|
-
* is called WITHOUT the base editor's private paste-marker-aware
|
|
233
|
-
* presegmentation, so a wrapped line containing a paste marker can
|
|
234
|
-
* theoretically diverge from the real render's chunk boundaries — harmless,
|
|
235
|
-
* because `decorateRow`'s verify-before-splice check means any divergence
|
|
236
|
-
* simply drops that row's decoration rather than corrupting it. */
|
|
237
|
-
export function buildRefLayoutChunks(lines, layoutWidth, cursorLine, cursorCol) {
|
|
238
|
-
const chunks = [];
|
|
239
|
-
if (lines.length === 0 || (lines.length === 1 && lines[0] === '')) {
|
|
240
|
-
chunks.push({ logicalLine: 0, startIndex: 0, endIndex: 0, text: '', hasCursor: true, cursorPos: 0 });
|
|
241
|
-
return chunks;
|
|
242
|
-
}
|
|
243
|
-
for (let i = 0; i < lines.length; i++) {
|
|
244
|
-
const line = lines[i] ?? '';
|
|
245
|
-
const isCurrentLine = i === cursorLine;
|
|
246
|
-
if (visibleWidth(line) <= layoutWidth) {
|
|
247
|
-
chunks.push({
|
|
248
|
-
logicalLine: i,
|
|
249
|
-
startIndex: 0,
|
|
250
|
-
endIndex: line.length,
|
|
251
|
-
text: line,
|
|
252
|
-
hasCursor: isCurrentLine,
|
|
253
|
-
cursorPos: isCurrentLine ? cursorCol : 0,
|
|
254
|
-
});
|
|
255
|
-
continue;
|
|
256
|
-
}
|
|
257
|
-
const wrapped = wordWrapLine(line, layoutWidth);
|
|
258
|
-
for (let chunkIndex = 0; chunkIndex < wrapped.length; chunkIndex++) {
|
|
259
|
-
const chunk = wrapped[chunkIndex];
|
|
260
|
-
if (!chunk)
|
|
261
|
-
continue;
|
|
262
|
-
const isLastChunk = chunkIndex === wrapped.length - 1;
|
|
263
|
-
let hasCursorInChunk = false;
|
|
264
|
-
let adjustedCursorPos = 0;
|
|
265
|
-
if (isCurrentLine) {
|
|
266
|
-
if (isLastChunk) {
|
|
267
|
-
hasCursorInChunk = cursorCol >= chunk.startIndex;
|
|
268
|
-
adjustedCursorPos = cursorCol - chunk.startIndex;
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
hasCursorInChunk = cursorCol >= chunk.startIndex && cursorCol < chunk.endIndex;
|
|
272
|
-
if (hasCursorInChunk) {
|
|
273
|
-
adjustedCursorPos = cursorCol - chunk.startIndex;
|
|
274
|
-
if (adjustedCursorPos > chunk.text.length)
|
|
275
|
-
adjustedCursorPos = chunk.text.length;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
chunks.push({
|
|
280
|
-
logicalLine: i,
|
|
281
|
-
startIndex: chunk.startIndex,
|
|
282
|
-
endIndex: chunk.endIndex,
|
|
283
|
-
text: chunk.text,
|
|
284
|
-
hasCursor: hasCursorInChunk,
|
|
285
|
-
cursorPos: adjustedCursorPos,
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
return chunks;
|
|
290
|
-
}
|
|
291
|
-
/** Resolved-ref candidate spans in one logical line: exact, case-sensitive
|
|
292
|
-
* membership in `names` (the broker-supplied inventory of visible canonical
|
|
293
|
-
* names) — never a fuzzy or prefix match. */
|
|
294
|
-
function resolvedSpansForLine(line, names) {
|
|
295
|
-
return findRefTokens(line)
|
|
296
|
-
.filter((t) => names.has(t.candidate))
|
|
297
|
-
.map((t) => ({ start: t.start, end: t.end }));
|
|
298
|
-
}
|
|
299
|
-
/** Zero-width SGR for a resolved ref: underline + dim on, and ONLY those two
|
|
300
|
-
* attributes off again — never a blanket `\x1b[0m` reset, which would erase
|
|
301
|
-
* the cursor's own reverse-video/mute styling if a span ever abuts it. */
|
|
302
|
-
const REF_STYLE_ON = '\x1b[4m\x1b[2m';
|
|
303
|
-
const REF_STYLE_OFF = '\x1b[24m\x1b[22m';
|
|
304
|
-
const refGraphemeSegmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
|
|
305
|
-
/** Best-effort length (in UTF-16 code units) of the first grapheme of `text`.
|
|
306
|
-
* Not paste-marker aware (unlike the base editor's own segmenter) — doesn't
|
|
307
|
-
* need to be: any mismatch is caught by `decorateRow`'s verify-before-splice
|
|
308
|
-
* check, which only ever causes a span to be left undecorated. */
|
|
309
|
-
function firstGraphemeLength(text) {
|
|
310
|
-
for (const seg of refGraphemeSegmenter.segment(text))
|
|
311
|
-
return seg.segment.length;
|
|
312
|
-
return 0;
|
|
313
|
-
}
|
|
314
|
-
/** Locate the cursor's own reverse-video cell within a single rendered content
|
|
315
|
-
* row, so ref decoration can be positioned around it without ever touching
|
|
316
|
-
* its bytes. Handles both the focused form (`SOLID_CURSOR_PREFIX`) and the
|
|
317
|
-
* blurred, muted form `outlineCursorLine` rewrites it to (`MUTED_CURSOR_ON`)
|
|
318
|
-
* — decoration always runs AFTER that rewrite, so both must be recognized.
|
|
319
|
-
* Returns null when no cursor cell can be found (e.g. the row isn't the
|
|
320
|
-
* cursor's row after all, or the base editor changed its cursor markup). */
|
|
321
|
-
function locateCursorCell(row) {
|
|
322
|
-
const markerIdx = row.indexOf(CURSOR_MARKER);
|
|
323
|
-
const searchFrom = markerIdx === -1 ? 0 : markerIdx + CURSOR_MARKER.length;
|
|
324
|
-
let prefixIdx = row.indexOf(SOLID_CURSOR_PREFIX, searchFrom);
|
|
325
|
-
let prefixLen = SOLID_CURSOR_PREFIX.length;
|
|
326
|
-
if (prefixIdx === -1) {
|
|
327
|
-
prefixIdx = row.indexOf(MUTED_CURSOR_ON, searchFrom);
|
|
328
|
-
prefixLen = MUTED_CURSOR_ON.length;
|
|
329
|
-
}
|
|
330
|
-
if (prefixIdx === -1)
|
|
331
|
-
return null;
|
|
332
|
-
const resetIdx = row.indexOf(SOLID_CURSOR_RESET, prefixIdx + prefixLen);
|
|
333
|
-
if (resetIdx === -1)
|
|
334
|
-
return null;
|
|
335
|
-
return { start: markerIdx !== -1 ? markerIdx : prefixIdx, end: resetIdx + SOLID_CURSOR_RESET.length };
|
|
336
|
-
}
|
|
337
|
-
/** Splice underline/dim styling around every resolved-ref span that survives
|
|
338
|
-
* chrome-safety verification. `rowStr` is one already-rendered content row
|
|
339
|
-
* (plain, or carrying exactly the cursor's own cell markup); `chunk` is the
|
|
340
|
-
* layout entry it was built from; `spans` are candidate resolved-ref spans
|
|
341
|
-
* already filtered to lie within `chunk`'s logical range; `line` is the full
|
|
342
|
-
* logical line text (used only to verify a span's characters still match at
|
|
343
|
-
* the row offset we computed — never spliced in directly). Exported pure for
|
|
344
|
-
* direct testing. */
|
|
345
|
-
export function decorateRow(rowStr, chunk, spans, line, paddingX) {
|
|
346
|
-
const insertions = [];
|
|
347
|
-
if (!chunk.hasCursor) {
|
|
348
|
-
for (const span of spans) {
|
|
349
|
-
const absStart = paddingX + (span.start - chunk.startIndex);
|
|
350
|
-
const absEnd = paddingX + (span.end - chunk.startIndex);
|
|
351
|
-
if (rowStr.slice(absStart, absEnd) === line.slice(span.start, span.end)) {
|
|
352
|
-
insertions.push({ absStart, absEnd });
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
else {
|
|
357
|
-
const cell = locateCursorCell(rowStr);
|
|
358
|
-
if (cell === null)
|
|
359
|
-
return rowStr; // can't safely locate the cursor -> decorate nothing on this row
|
|
360
|
-
const afterChunkText = chunk.text.slice(chunk.cursorPos);
|
|
361
|
-
const graphemeLen = afterChunkText.length === 0 ? 0 : firstGraphemeLength(afterChunkText);
|
|
362
|
-
const consumedEnd = chunk.cursorPos + graphemeLen;
|
|
363
|
-
for (const span of spans) {
|
|
364
|
-
const localStart = span.start - chunk.startIndex;
|
|
365
|
-
const localEnd = span.end - chunk.startIndex;
|
|
366
|
-
if (localEnd <= chunk.cursorPos) {
|
|
367
|
-
const absStart = paddingX + localStart;
|
|
368
|
-
const absEnd = paddingX + localEnd;
|
|
369
|
-
if (absEnd <= cell.start && rowStr.slice(absStart, absEnd) === line.slice(span.start, span.end)) {
|
|
370
|
-
insertions.push({ absStart, absEnd });
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
else if (localStart >= consumedEnd) {
|
|
374
|
-
const absStart = cell.end + (localStart - consumedEnd);
|
|
375
|
-
const absEnd = cell.end + (localEnd - consumedEnd);
|
|
376
|
-
if (absStart >= cell.end && rowStr.slice(absStart, absEnd) === line.slice(span.start, span.end)) {
|
|
377
|
-
insertions.push({ absStart, absEnd });
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
// else: span overlaps the cursor cell itself -> leave plain (design-sanctioned degrade)
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
if (insertions.length === 0)
|
|
384
|
-
return rowStr;
|
|
385
|
-
insertions.sort((a, b) => b.absStart - a.absStart); // rightmost first so earlier offsets stay valid
|
|
386
|
-
let out = rowStr;
|
|
387
|
-
for (const ins of insertions) {
|
|
388
|
-
out = out.slice(0, ins.absStart) + REF_STYLE_ON + out.slice(ins.absStart, ins.absEnd) + REF_STYLE_OFF + out.slice(ins.absEnd);
|
|
389
|
-
}
|
|
390
|
-
return out;
|
|
391
|
-
}
|
|
392
|
-
/** Mirrors `dispatchSlashCommand`'s (`slash/dispatch.ts`) own leading-name
|
|
393
|
-
* parse EXACTLY — not a looser grammar-based extraction, since dispatch's
|
|
394
|
-
* name charset (`\S+`) differs from the ref grammar's (`[A-Za-z0-9_:-]`) and
|
|
395
|
-
* a grammar-based extraction would under-suppress for a command name
|
|
396
|
-
* containing e.g. `.`. Duplicated intentionally: input/titled-editor.ts owns only
|
|
397
|
-
* render/input, and this two-line regex is the whole surface of that
|
|
398
|
-
* contract. */
|
|
399
|
-
function extractLeadingCommandName(text) {
|
|
400
|
-
const m = /^\/(\S+)\s*([\s\S]*)$/.exec(text.trim());
|
|
401
|
-
return m ? m[1] : null;
|
|
402
|
-
}
|
|
403
|
-
/** Mirrors the broker's `isLeadingEngineCommand` (`core/runtime/broker.ts`)
|
|
404
|
-
* leading-token rule EXACTLY for classification purposes:
|
|
405
|
-
* the RAW, un-trimmed `text` must itself start with `/` — no `.trim()` — for
|
|
406
|
-
* ANY token to be a candidate, matching the broker's own untrimmed
|
|
407
|
-
* `text.startsWith('/')` checks byte-for-byte (space-based name split,
|
|
408
|
-
* `/skill:` 7-character prefix). `engineNames` is the broker's own
|
|
409
|
-
* `engineLeadingCommandNames` enumeration (`ListMemoryRefsData`, populated
|
|
410
|
-
* per `list_memory_refs` reply) — exact extension-command invocation names
|
|
411
|
-
* and prompt-template names bare, skills as `skill:<name>`, exactly what
|
|
412
|
-
* `engineLeadingCommandTokens` emits. This is viewer-side, best-effort
|
|
413
|
-
* classification for render suppression ONLY (see `decorateResolvedRefs`)
|
|
414
|
-
* — the broker remains the sole authority at actual submission time
|
|
415
|
-
* regardless of any viewer-side mismatch. */
|
|
416
|
-
function matchesEngineLeadingCommand(text, engineNames) {
|
|
417
|
-
if (!text.startsWith('/'))
|
|
418
|
-
return false;
|
|
419
|
-
const spaceIndex = text.indexOf(' ');
|
|
420
|
-
const commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);
|
|
421
|
-
if (engineNames.has(commandName))
|
|
422
|
-
return true;
|
|
423
|
-
if (text.startsWith('/skill:')) {
|
|
424
|
-
const skillName = spaceIndex === -1 ? text.slice(7) : text.slice(7, spaceIndex);
|
|
425
|
-
if (engineNames.has(`skill:${skillName}`))
|
|
426
|
-
return true;
|
|
427
|
-
}
|
|
428
|
-
return false;
|
|
429
|
-
}
|
|
430
|
-
export class TitledEditor extends CustomEditor {
|
|
431
|
-
/** crtr's OWN keybindings manager — the same one CustomEditor matches `app.*`
|
|
432
|
-
* against. We keep a reference so `handleInput` can resolve the newline chord
|
|
433
|
-
* here, independent of the editor's (possibly separate) pi-tui module global. */
|
|
434
|
-
km;
|
|
435
|
-
/** The raw (untrimmed) text `submitValue()` is ABOUT to trim away, captured by
|
|
436
|
-
* the `submitValue` monkeypatch just below it runs, and consumed exactly once
|
|
437
|
-
* by the `onSubmit` accessor wrapper. See the constructor for why. */
|
|
438
|
-
pendingRawSubmitText;
|
|
439
|
-
/** The REAL caller-supplied `onSubmit` handler (what `InputController` wires
|
|
440
|
-
* via `this.editor.onSubmit = ...`) — stored here because `onSubmit` itself is
|
|
441
|
-
* converted to an accessor below whose getter always returns our substitution
|
|
442
|
-
* wrapper, not this value directly. */
|
|
443
|
-
realOnSubmit;
|
|
444
|
-
/** A line ending held back to learn whether more input follows it within
|
|
445
|
-
* `PASTE_BURST_MS` — see `handleInput`'s unbracketed-paste rescue. More input
|
|
446
|
-
* means it was a line break inside a paste (insert a newline); silence means
|
|
447
|
-
* a human pressed Enter (submit). */
|
|
448
|
-
pendingReturn;
|
|
449
|
-
/** How long a line ending is held before it counts as a real Enter. An
|
|
450
|
-
* unbracketed paste floods `handleInput` within one event-loop tick, so its
|
|
451
|
-
* next character always lands far inside this window; a human's next
|
|
452
|
-
* keystroke after Enter is ~30ms+ away at the very fastest. Short enough that
|
|
453
|
-
* the added submit latency is imperceptible. */
|
|
454
|
-
static PASTE_BURST_MS = 10;
|
|
455
|
-
// CustomEditor's ctor signature; captured so we own the newline chord (see
|
|
456
|
-
// handleInput). The keybindings param is typed as pi's app-subclass manager,
|
|
457
|
-
// but the attach viewer feeds it pi-tui's base manager — hence the cast.
|
|
458
|
-
constructor(tui, theme, keybindings, options) {
|
|
459
|
-
super(tui, theme, keybindings, options);
|
|
460
|
-
this.km = keybindings;
|
|
461
|
-
// Preserve raw (untrimmed) submit text end-to-end. The base
|
|
462
|
-
// `Editor.submitValue()` — private in the `.d.ts` (blocking a normal TS
|
|
463
|
-
// `override`), hence the structural cast, same pattern as the other private-
|
|
464
|
-
// internals casts throughout this file (`scrollOffset`, `historyIndex`,
|
|
465
|
-
// `tryTriggerAutocomplete`) — computes `expandPasteMarkers(lines.join('\n'))`,
|
|
466
|
-
// `.trim()`s it, THEN calls `this.onSubmit(trimmed)`: the trimmed text is all
|
|
467
|
-
// any caller-supplied `onSubmit` handler ever sees today. `getExpandedText()`
|
|
468
|
-
// IS public and its implementation is byte-for-byte the same pre-`.trim()`
|
|
469
|
-
// computation, so calling it here — immediately before delegating to the real
|
|
470
|
-
// `submitValue` — captures the exact untrimmed text about to be lost, and
|
|
471
|
-
// must happen INSIDE this wrapper (not earlier in `handleInput`): a Tab/
|
|
472
|
-
// Enter-confirm command completion can mutate `state.lines` in the SAME
|
|
473
|
-
// `handleInput` call, in statements that run before `submitValue()` fires
|
|
474
|
-
// (pi-tui's `tui.select.confirm` leading-command fallthrough), so anything
|
|
475
|
-
// captured earlier could be stale pre-completion text.
|
|
476
|
-
const inheritedSubmitValue = this.submitValue.bind(this);
|
|
477
|
-
this.submitValue = () => {
|
|
478
|
-
const withExpanded = this;
|
|
479
|
-
this.pendingRawSubmitText = withExpanded.getExpandedText();
|
|
480
|
-
inheritedSubmitValue();
|
|
481
|
-
};
|
|
482
|
-
// `onSubmit` is a plain PUBLIC optional class field on the base `Editor`
|
|
483
|
-
// (`onSubmit?: (text: string) => void;`) — an own, configurable instance
|
|
484
|
-
// property installed during base field initialization, before this
|
|
485
|
-
// constructor body runs — so converting it to an accessor here is safe.
|
|
486
|
-
// `InputController` does `this.editor.onSubmit = (text) => ...`, which now
|
|
487
|
-
// goes through the setter below (stored as `realOnSubmit`); the value the
|
|
488
|
-
// base class actually reads and calls from inside `submitValue()` is ALWAYS
|
|
489
|
-
// this wrapper closure, which substitutes the captured raw text for
|
|
490
|
-
// whatever (trimmed) argument pi-tui passes.
|
|
491
|
-
Object.defineProperty(this, 'onSubmit', {
|
|
492
|
-
configurable: true,
|
|
493
|
-
get: () => {
|
|
494
|
-
return (text) => {
|
|
495
|
-
const raw = this.pendingRawSubmitText ?? text;
|
|
496
|
-
this.pendingRawSubmitText = undefined;
|
|
497
|
-
this.realOnSubmit?.(raw);
|
|
498
|
-
};
|
|
499
|
-
},
|
|
500
|
-
set: (handler) => {
|
|
501
|
-
this.realOnSubmit = handler;
|
|
502
|
-
},
|
|
503
|
-
});
|
|
504
|
-
}
|
|
505
|
-
/** Insert a newline on the newLine chord (Alt+Enter / Shift+Enter) using crtr's
|
|
506
|
-
* OWN keybindings manager, then defer everything else to the stock editor.
|
|
507
|
-
*
|
|
508
|
-
* The base `Editor` resolves newLine against `getKeybindings()` on ITS pi-tui
|
|
509
|
-
* instance, which in a non-deduped install is a DIFFERENT module than the one
|
|
510
|
-
* carrying crtr's `alt+enter` override — so the override can silently never
|
|
511
|
-
* reach it and Alt+Enter falls through to submit. crtr's `km` (the
|
|
512
|
-
* same manager CustomEditor matches `app.*` against) always carries the
|
|
513
|
-
* override, so matching the chord here makes the newline behavior independent
|
|
514
|
-
* of cross-instance keybinding mirroring. Skipped while the autocomplete popup
|
|
515
|
-
* is open so Enter-to-confirm keeps working. */
|
|
516
|
-
/** Set by the input controller: called when a bulk input chunk is recognized
|
|
517
|
-
* as a filesystem path to an image file (a file DRAGGED into the pane, which
|
|
518
|
-
* the terminal delivers as bracketed-paste TEXT, not an image event). Returns
|
|
519
|
-
* true when it consumed the drop, so the raw path is never inserted as text. */
|
|
520
|
-
onPasteImagePath;
|
|
521
|
-
/** Settle a line ending held by the unbracketed-paste rescue. `'newline'` (more
|
|
522
|
-
* input arrived, so it was a paste's own line break) inserts it in place;
|
|
523
|
-
* `'submit'` (the hold window expired in silence, so a human pressed Enter)
|
|
524
|
-
* replays it through the stock editor and repaints, because this runs outside
|
|
525
|
-
* the TUI's own post-`handleInput` render request. No-op when nothing is
|
|
526
|
-
* held. */
|
|
527
|
-
settleHeldReturn(as) {
|
|
528
|
-
const held = this.pendingReturn;
|
|
529
|
-
if (held === undefined)
|
|
530
|
-
return;
|
|
531
|
-
clearTimeout(held.timer);
|
|
532
|
-
this.pendingReturn = undefined;
|
|
533
|
-
if (as === 'newline') {
|
|
534
|
-
this.insertTextAtCursor('\n');
|
|
535
|
-
return;
|
|
536
|
-
}
|
|
537
|
-
super.handleInput(held.data);
|
|
538
|
-
this.tui.requestRender();
|
|
539
|
-
}
|
|
540
|
-
/** Width of an `[Image #N]` token sitting immediately before the cursor on the
|
|
541
|
-
* current line, or 0 when the cursor isn't at the end of such a token — used to
|
|
542
|
-
* delete/skip the token atomically. The token's separating space is a normal,
|
|
543
|
-
* reachable character, deliberately NOT part of the atom. */
|
|
544
|
-
imageTokenWidthBeforeCursor() {
|
|
545
|
-
const { line, col } = this.getCursor();
|
|
546
|
-
const text = this.getLines()[line];
|
|
547
|
-
if (text === undefined)
|
|
548
|
-
return 0;
|
|
549
|
-
const match = text.slice(0, col).match(/\[Image #\d+\]$/);
|
|
550
|
-
return match ? match[0].length : 0;
|
|
551
|
-
}
|
|
552
|
-
/** Width of an `[Image #N]` token sitting immediately after the cursor on the
|
|
553
|
-
* current line, or 0 when the cursor isn't at the start of such a token — used
|
|
554
|
-
* to skip the token with the right arrow. */
|
|
555
|
-
imageTokenWidthAfterCursor() {
|
|
556
|
-
const { line, col } = this.getCursor();
|
|
557
|
-
const text = this.getLines()[line];
|
|
558
|
-
if (text === undefined)
|
|
559
|
-
return 0;
|
|
560
|
-
const match = text.slice(col).match(/^\[Image #\d+\]/);
|
|
561
|
-
return match ? match[0].length : 0;
|
|
562
|
-
}
|
|
563
|
-
handleInput(data) {
|
|
564
|
-
// Any input arriving while a line ending is held settles it as a paste's own
|
|
565
|
-
// line break: insert it FIRST so this key lands after it, in typed order.
|
|
566
|
-
this.settleHeldReturn('newline');
|
|
567
|
-
// Keep ↓ on the editor's native focused-input path. Only when its own
|
|
568
|
-
// wrap-aware cursor and prompt-history navigation make no change does the
|
|
569
|
-
// adjacent roster get a chance to take over.
|
|
570
|
-
if (!this.isShowingAutocomplete() && this.km.matches(data, 'tui.editor.cursorDown')) {
|
|
571
|
-
const internals = this;
|
|
572
|
-
const beforeCursor = this.getCursor();
|
|
573
|
-
const beforeHistory = internals.historyIndex;
|
|
574
|
-
super.handleInput(data);
|
|
575
|
-
const afterCursor = this.getCursor();
|
|
576
|
-
if (internals.historyIndex === beforeHistory
|
|
577
|
-
&& afterCursor.line === beforeCursor.line
|
|
578
|
-
&& afterCursor.col === beforeCursor.col) {
|
|
579
|
-
this.onCursorDownAtBottom?.();
|
|
580
|
-
}
|
|
581
|
-
return;
|
|
582
|
-
}
|
|
583
|
-
if (!this.isShowingAutocomplete() && this.km.matches(data, 'tui.input.newLine')) {
|
|
584
|
-
this.insertTextAtCursor('\n');
|
|
585
|
-
return;
|
|
586
|
-
}
|
|
587
|
-
// Backspace over an `[Image #N]` token deletes the WHOLE token (and its
|
|
588
|
-
// trailing space) in one keypress, not one character at a time — the token is
|
|
589
|
-
// a single atom to the user. We replay the backspace across the token's full
|
|
590
|
-
// width so the base editor's cursor/undo bookkeeping stays correct.
|
|
591
|
-
if (!this.isShowingAutocomplete() && this.km.matches(data, 'tui.editor.deleteCharBackward')) {
|
|
592
|
-
const width = this.imageTokenWidthBeforeCursor();
|
|
593
|
-
if (width > 1) {
|
|
594
|
-
for (let i = 0; i < width; i++)
|
|
595
|
-
super.handleInput(data);
|
|
596
|
-
return;
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
// Left/right arrow steps OVER an `[Image #N]` token in one keypress — the
|
|
600
|
-
// token reads as a single character, so the caret never lands inside it. We
|
|
601
|
-
// replay the arrow across the token's full width so cursor bookkeeping stays
|
|
602
|
-
// correct.
|
|
603
|
-
if (!this.isShowingAutocomplete() && this.km.matches(data, 'tui.editor.cursorLeft')) {
|
|
604
|
-
const width = this.imageTokenWidthBeforeCursor();
|
|
605
|
-
if (width > 1) {
|
|
606
|
-
for (let i = 0; i < width; i++)
|
|
607
|
-
super.handleInput(data);
|
|
608
|
-
return;
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
if (!this.isShowingAutocomplete() && this.km.matches(data, 'tui.editor.cursorRight')) {
|
|
612
|
-
const width = this.imageTokenWidthAfterCursor();
|
|
613
|
-
if (width > 1) {
|
|
614
|
-
for (let i = 0; i < width; i++)
|
|
615
|
-
super.handleInput(data);
|
|
616
|
-
return;
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
// A file dragged into the pane arrives as a bulk paste of its (shell-escaped)
|
|
620
|
-
// path, NOT as an image on the clipboard, so onPasteImage never fires. Detect
|
|
621
|
-
// an image-file path here and hand it to the controller so it becomes an
|
|
622
|
-
// `[Image #N]` token like a clipboard paste, instead of the raw temp path.
|
|
623
|
-
const droppedPath = detectDroppedImagePath(data);
|
|
624
|
-
if (droppedPath && this.onPasteImagePath?.(droppedPath))
|
|
625
|
-
return;
|
|
626
|
-
// Unbracketed multi-line paste rescue. When the terminal delivers a paste
|
|
627
|
-
// WITHOUT bracketed-paste markers (\x1b[200~ … \x1b[201~) — the outer
|
|
628
|
-
// terminal may not support them, or tmux attached its client with a terminfo
|
|
629
|
-
// entry lacking the Enbp/Dsbp caps — pi-tui's StdinBuffer never enters paste
|
|
630
|
-
// mode and instead splits the paste into single sequences. Each embedded
|
|
631
|
-
// line ending then reaches us as a bare Enter, and the stock editor SUBMITS
|
|
632
|
-
// on it: line one becomes a prompt and every following line becomes its own
|
|
633
|
-
// turn, is queued as steering, or is lost to pi's "Agent is already
|
|
634
|
-
// processing" rejection when it lands inside prompt()'s async preflight. The
|
|
635
|
-
// bracketed path (when markers DO arrive) is a single `\x1b[200~…` sequence
|
|
636
|
-
// that never trips this branch, so it stays fully intact.
|
|
637
|
-
//
|
|
638
|
-
// A pasted line break is told from a pressed Enter by what FOLLOWS it, not
|
|
639
|
-
// by what precedes it: a paste floods handleInput with its next character
|
|
640
|
-
// microseconds later, while an Enter is followed by human-scale silence.
|
|
641
|
-
// Deciding on the following input (rather than the preceding gap) is what
|
|
642
|
-
// keeps `tmux send-keys <text> Enter` — one write, so its Enter arrives
|
|
643
|
-
// microseconds after the text — submitting as intended, since nothing
|
|
644
|
-
// follows it. A paste that ends in a trailing newline likewise submits, by
|
|
645
|
-
// then carrying its WHOLE text, so no line is ever split off or lost.
|
|
646
|
-
// Skipped while the autocomplete popup is open, where Enter confirms a
|
|
647
|
-
// completion and must stay immediate.
|
|
648
|
-
if ((data === '\r' || data === '\n') && !this.isShowingAutocomplete()) {
|
|
649
|
-
this.pendingReturn = {
|
|
650
|
-
data,
|
|
651
|
-
timer: setTimeout(() => this.settleHeldReturn('submit'), TitledEditor.PASTE_BURST_MS),
|
|
652
|
-
};
|
|
653
|
-
return;
|
|
654
|
-
}
|
|
655
|
-
const { line: beforeLine, col: beforeCol } = this.getCursor();
|
|
656
|
-
const beforeText = this.getLines()[beforeLine] ?? '';
|
|
657
|
-
super.handleInput(data);
|
|
658
|
-
this.maybeTriggerNonLeadingRefAutocomplete(beforeLine, beforeCol, beforeText);
|
|
659
|
-
}
|
|
660
|
-
/** The base editor auto-triggers autocomplete for a LEADING slash context
|
|
661
|
-
* (`isInSlashCommandContext`, `insertCharacter`) whenever the text before
|
|
662
|
-
* the cursor — from the very start of the line — begins with `/`. A
|
|
663
|
-
* non-leading ref elsewhere in ordinary text (`hey check /dev`) never
|
|
664
|
-
* satisfies that check, so it would otherwise require an explicit Tab.
|
|
665
|
-
* This bridges exactly that gap: after an ordinary single-character
|
|
666
|
-
* insertion, if the caret now sits in a non-leading ref token
|
|
667
|
-
* (`findRefCompletionContext` — T1's shared caret classifier, not
|
|
668
|
-
* reimplemented here), nudge the same private trigger the base editor uses
|
|
669
|
-
* for its own leading case. Detected purely by before/after cursor and
|
|
670
|
-
* text-length diffing, so it's mechanism-agnostic (typed key or decoded
|
|
671
|
-
* printable key alike) and naturally excludes multi-character paste
|
|
672
|
-
* (`handlePaste` already suppresses autocomplete itself, and the exact +1
|
|
673
|
-
* length-delta check here would reject it anyway). Leading context is
|
|
674
|
-
* deliberately left untouched — triggering it again here would double the
|
|
675
|
-
* base editor's own native trigger for that case. */
|
|
676
|
-
maybeTriggerNonLeadingRefAutocomplete(beforeLine, beforeCol, beforeText) {
|
|
677
|
-
if (this.isShowingAutocomplete())
|
|
678
|
-
return;
|
|
679
|
-
const cursor = this.getCursor();
|
|
680
|
-
if (cursor.line !== beforeLine || cursor.col !== beforeCol + 1)
|
|
681
|
-
return;
|
|
682
|
-
const afterText = this.getLines()[cursor.line] ?? '';
|
|
683
|
-
if (afterText.length !== beforeText.length + 1)
|
|
684
|
-
return;
|
|
685
|
-
const inserted = afterText[beforeCol];
|
|
686
|
-
if (inserted === undefined || (inserted !== '/' && !/[A-Za-z0-9_:-]/.test(inserted)))
|
|
687
|
-
return;
|
|
688
|
-
const context = findRefCompletionContext(this.getLines(), cursor.line, cursor.col);
|
|
689
|
-
if (!context || context.kind !== 'ref')
|
|
690
|
-
return;
|
|
691
|
-
this.tryTriggerAutocomplete();
|
|
692
|
-
}
|
|
693
|
-
/** Called after native ↓ navigation proves the editor and prompt history are
|
|
694
|
-
* both exhausted. Attach uses this boundary handoff to enter its node roster. */
|
|
695
|
-
onCursorDownAtBottom;
|
|
696
|
-
/** Fully-expanded prompt template currently loaded by the editor's leading
|
|
697
|
-
* slash token. It renders inside the editor outline before submission, so the
|
|
698
|
-
* user can inspect the exact payload while arguments are still editable. */
|
|
699
|
-
loadedCommand;
|
|
700
|
-
/** Session-name chip painted into the LEFT of the top border. Empty → plain. */
|
|
701
|
-
title = '';
|
|
702
|
-
/** Pre-styled context string painted into the RIGHT of the top border (cwd /
|
|
703
|
-
* branch / git status). Already colorized by the caller; empty → omitted. */
|
|
704
|
-
info = '';
|
|
705
|
-
/** Node and workspace badge painted at the far bottom-right of the outline. */
|
|
706
|
-
contextBadge = '';
|
|
707
|
-
/** Paint the chip solid so the name reads as a label sitting on the border
|
|
708
|
-
* rule. Defaults to the reverse-video chip; viewer.ts swaps in a
|
|
709
|
-
* thinking-colored background (bold white text) on each state update. */
|
|
710
|
-
titleStyle = defaultTitleStyle;
|
|
711
|
-
/** Node and workspace badge colorizer, matched to the editor frame. */
|
|
712
|
-
contextBadgeStyle = defaultTitleStyle;
|
|
713
|
-
/** Whether the hosting tmux pane / terminal window has FOCUS (terminal focus
|
|
714
|
-
* reporting, DECSET 1004 — viewer.ts flips this on `\x1b[I` / `\x1b[O`).
|
|
715
|
-
* Distinct from TUI component focus: the editor keeps component focus while
|
|
716
|
-
* its pane is blurred. False → the fake cursor renders as an outline. */
|
|
717
|
-
paneFocused = true;
|
|
718
|
-
/** Canonical names the broker currently resolves — the exact-membership set
|
|
719
|
-
* a candidate ref token must be in to render as a resolved highlight.
|
|
720
|
-
* Empty by default (no decoration) until the caller supplies the
|
|
721
|
-
* broker-supplied inventory. */
|
|
722
|
-
resolvedRefNames = new Set();
|
|
723
|
-
/** Command names the VIEWER dispatches ENTIRELY locally (never reach the
|
|
724
|
-
* engine as prose) — checked against the TRIMMED leading-name rule
|
|
725
|
-
* (`extractLeadingCommandName`, which mirrors `slash/dispatch.ts`'s own
|
|
726
|
-
* `text.trim()`-based dispatch parse). Exactly
|
|
727
|
-
* `locallyConsumedCommandNames()` from `slash/dispatch.ts` — independent
|
|
728
|
-
* of `remote` and of the broker's `get_commands` reply (see that
|
|
729
|
-
* function's doc comment). Deliberately NEVER the merged display/
|
|
730
|
-
* completion list (`slashCommandList` is a different, remote-filtered,
|
|
731
|
-
* broker-augmented list, not a dispatch predicate). */
|
|
732
|
-
localCommandNames = new Set();
|
|
733
|
-
/** Leading tokens the ENGINE (broker) independently consumes as a leading
|
|
734
|
-
* command/skill/template dispatch — the broker's own
|
|
735
|
-
* `engineLeadingCommandNames`, checked against the UNTRIMMED leading-name
|
|
736
|
-
* rule (`matchesEngineLeadingCommand`, mirroring the broker's own
|
|
737
|
-
* `isLeadingEngineCommand`). Populated from each
|
|
738
|
-
* `list_memory_refs` reply, alongside `resolvedRefNames`. */
|
|
739
|
-
engineCommandNames = new Set();
|
|
740
|
-
setResolvedRefNames(names) {
|
|
741
|
-
this.resolvedRefNames = new Set(names);
|
|
742
|
-
}
|
|
743
|
-
/** The canonical names of memory refs currently resolvable in this session —
|
|
744
|
-
* used to record ref usage on submit without counting non-ref slash tokens. */
|
|
745
|
-
getResolvedRefNames() {
|
|
746
|
-
return this.resolvedRefNames;
|
|
747
|
-
}
|
|
748
|
-
setLocalCommandNames(names) {
|
|
749
|
-
this.localCommandNames = new Set(names);
|
|
750
|
-
}
|
|
751
|
-
setEngineCommandNames(names) {
|
|
752
|
-
this.engineCommandNames = new Set(names);
|
|
753
|
-
}
|
|
754
|
-
/** Render-only decoration pass: underlines every resolved-ref span visible
|
|
755
|
-
* in the already-rendered content rows, using a from-scratch layout
|
|
756
|
-
* recompute (`buildRefLayoutChunks`) that mirrors the base editor's own
|
|
757
|
-
* private `layoutText`/`scrollOffset`/`maxVisibleLines` math so row/column
|
|
758
|
-
* offsets line up. Never mutates stored text; a span whose recomputed
|
|
759
|
-
* offset doesn't verify against the real rendered row (see `decorateRow`)
|
|
760
|
-
* is simply left undecorated. Suppressed entirely (command-wide) whenever
|
|
761
|
-
* the composer's own leading token dispatches — as a LOCAL viewer command
|
|
762
|
-
* (`localCommandNames`, TRIMMED rule) or as an ENGINE-consumed leading
|
|
763
|
-
* command/skill/template (`engineCommandNames`, UNTRIMMED rule) — the ref
|
|
764
|
-
* grammar and slash-dispatch's name charset differ, so
|
|
765
|
-
* highlighting a ref inside a command that's about to dispatch would be
|
|
766
|
-
* misleading chrome for text the command, not memory resolution, is about
|
|
767
|
-
* to consume. The two rules are kept deliberately SEPARATE rather than
|
|
768
|
-
* collapsed into one set/predicate: they classify against
|
|
769
|
-
* different text (trimmed vs. raw) and different authorities (this
|
|
770
|
-
* viewer's own dispatch vs. the broker's). */
|
|
771
|
-
decorateResolvedRefs(lines, width) {
|
|
772
|
-
if (this.resolvedRefNames.size === 0)
|
|
773
|
-
return;
|
|
774
|
-
const text = this.getText();
|
|
775
|
-
const trimmedLeadingName = extractLeadingCommandName(text);
|
|
776
|
-
if (trimmedLeadingName !== null && this.localCommandNames.has(trimmedLeadingName))
|
|
777
|
-
return;
|
|
778
|
-
if (matchesEngineLeadingCommand(text, this.engineCommandNames))
|
|
779
|
-
return;
|
|
780
|
-
const maxPadding = Math.max(0, Math.floor((width - 1) / 2));
|
|
781
|
-
const paddingX = Math.min(this.getPaddingX(), maxPadding);
|
|
782
|
-
const contentWidth = Math.max(1, width - paddingX * 2);
|
|
783
|
-
const layoutWidth = Math.max(1, contentWidth - (paddingX ? 0 : 1));
|
|
784
|
-
const logicalLines = this.getLines();
|
|
785
|
-
const cursor = this.getCursor();
|
|
786
|
-
const chunks = buildRefLayoutChunks(logicalLines, layoutWidth, cursor.line, cursor.col);
|
|
787
|
-
// Private on the base `Editor`; render() above has already called
|
|
788
|
-
// `super.render(width)`, so this reflects the scrollOffset THIS render
|
|
789
|
-
// settled on — the same structural-cast pattern used elsewhere in this
|
|
790
|
-
// file (e.g. the `historyIndex` cast in titled-editor-preview.test.ts).
|
|
791
|
-
const scrollOffset = this.scrollOffset;
|
|
792
|
-
const maxVisibleLines = Math.max(5, Math.floor(this.tui.terminal.rows * 0.3));
|
|
793
|
-
const visibleCount = Math.min(Math.max(0, chunks.length - scrollOffset), maxVisibleLines);
|
|
794
|
-
if (visibleCount <= 0 || lines.length < 1 + visibleCount)
|
|
795
|
-
return; // mismatch -> skip entirely
|
|
796
|
-
const spansByLine = new Map();
|
|
797
|
-
for (let r = 0; r < visibleCount; r++) {
|
|
798
|
-
const chunk = chunks[scrollOffset + r];
|
|
799
|
-
if (!chunk)
|
|
800
|
-
continue;
|
|
801
|
-
let spans = spansByLine.get(chunk.logicalLine);
|
|
802
|
-
if (spans === undefined) {
|
|
803
|
-
spans = resolvedSpansForLine(logicalLines[chunk.logicalLine] ?? '', this.resolvedRefNames);
|
|
804
|
-
spansByLine.set(chunk.logicalLine, spans);
|
|
805
|
-
}
|
|
806
|
-
const contained = spans.filter((s) => s.start >= chunk.startIndex && s.end <= chunk.endIndex);
|
|
807
|
-
if (contained.length === 0)
|
|
808
|
-
continue;
|
|
809
|
-
const rowStr = lines[1 + r];
|
|
810
|
-
if (rowStr === undefined)
|
|
811
|
-
continue;
|
|
812
|
-
lines[1 + r] = decorateRow(rowStr, chunk, contained, logicalLines[chunk.logicalLine] ?? '', paddingX);
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
render(width) {
|
|
816
|
-
const lines = super.render(width);
|
|
817
|
-
if (!this.paneFocused) {
|
|
818
|
-
for (let i = 0; i < lines.length; i++) {
|
|
819
|
-
const hollowed = outlineCursorLine(lines[i]);
|
|
820
|
-
if (hollowed !== undefined) {
|
|
821
|
-
lines[i] = hollowed;
|
|
822
|
-
break;
|
|
823
|
-
}
|
|
824
|
-
}
|
|
825
|
-
}
|
|
826
|
-
this.decorateResolvedRefs(lines, width);
|
|
827
|
-
if (this.loadedCommand !== undefined && lines.length >= 2 && width >= 8) {
|
|
828
|
-
const innerWidth = width - 4;
|
|
829
|
-
const body = compactLoadedCommandPreview(this.loadedCommand.content, innerWidth);
|
|
830
|
-
// At narrow widths the disclosure is suppressed rather than clipping away
|
|
831
|
-
// its inspect affordance. Put that affordance first when it does render.
|
|
832
|
-
if (body.length === 0)
|
|
833
|
-
return lines;
|
|
834
|
-
const label = ` ${this.loadedCommand.inspectHint} · /${this.loadedCommand.name} loaded `;
|
|
835
|
-
const framed = body.map((line) => {
|
|
836
|
-
const clipped = truncateToWidth(line, innerWidth);
|
|
837
|
-
return `${this.borderColor('│')} ${clipped}${' '.repeat(Math.max(0, innerWidth - visibleWidth(clipped)))} ${this.borderColor('│')}`;
|
|
838
|
-
});
|
|
839
|
-
const dividerText = truncateToWidth(label, width - 2);
|
|
840
|
-
const remaining = Math.max(0, width - 2 - visibleWidth(dividerText));
|
|
841
|
-
const divider = this.borderColor(`├${dividerText}${'─'.repeat(remaining)}┤`);
|
|
842
|
-
lines.splice(1, 0, divider, ...framed, this.borderColor(`├${'─'.repeat(width - 2)}┤`));
|
|
843
|
-
}
|
|
844
|
-
if ((this.title || this.info) && lines.length > 0) {
|
|
845
|
-
// Replace the stock top border; dashes in the current (thinking-aware)
|
|
846
|
-
// border color.
|
|
847
|
-
lines[0] = composeTopBorder(width, this.title, this.info, this.titleStyle, (s) => this.borderColor(s));
|
|
848
|
-
}
|
|
849
|
-
if (this.contextBadge && lines.length > 0) {
|
|
850
|
-
const badge = this.contextBadgeStyle(this.contextBadge);
|
|
851
|
-
const badgeWidth = visibleWidth(badge);
|
|
852
|
-
if (badgeWidth + 2 < width) {
|
|
853
|
-
const last = lines.length - 1;
|
|
854
|
-
lines[last] = truncateToWidth(lines[last], width - badgeWidth, '') + badge;
|
|
855
|
-
}
|
|
856
|
-
}
|
|
857
|
-
return lines;
|
|
858
|
-
}
|
|
859
|
-
}
|
|
1
|
+
var w=Object.defineProperty;var d=(s,e)=>w(s,"name",{value:e,configurable:!0});import{statSync as D}from"node:fs";import{CustomEditor as B}from"@earendil-works/pi-coding-agent";import{CURSOR_MARKER as E,truncateToWidth as C,visibleWidth as b,wrapTextWithAnsi as v}from"@earendil-works/pi-tui";import{wordWrapLine as H}from"@earendil-works/pi-tui/dist/components/editor.js";import{findRefTokens as F}from"../../../core/memory/inline-ref-grammar.js";import{findRefCompletionContext as G}from"./ref-autocomplete.js";const M=8,U=24,V=8192;function K(s,e){const t=s.slice(0,e),n=s.length>e;return{text:t.replace(/\x1b\](?:[^\x07\x1b]*)(?:\x07|\x1b\\)?/g,"").replace(/\x1b\[[0-?]*[ -/]*[@-~]/g,"").replace(/[\x00-\x09\x0b-\x1f\x7f-\x9f]/g,""),truncated:n}}d(K,"sanitizeLoadedCommandPreview");function j(s,e){if(e<U)return[];const t=Math.min(V,Math.max(256,e*M*4)),n=K(s,t),r=v(n.text,e);if(!n.truncated&&r.length<=M)return r;const c=r.slice(0,M-1);return c.push(C("\u2026 truncated \xB7 inspect for full prompt",e)),c}d(j,"compactLoadedCommandPreview");const S=[46,92,190],R=[166,98,24],z=[0,145,170];function L(s,e,t){return[Math.round(s[0]+(e[0]-s[0])*t),Math.round(s[1]+(e[1]-s[1])*t),Math.round(s[2]+(e[2]-s[2])*t)]}d(L,"interpolateRgb");const P={off:void 0,minimal:L(S,R,0/4),low:L(S,R,1/4),medium:L(S,R,2/4),high:L(S,R,3/4),xhigh:L(S,R,4/4),max:z},X={black:[0,0,0],red:[205,49,49],green:[13,188,121],yellow:[229,229,16],blue:[36,114,200],magenta:[188,63,188],cyan:[17,168,205],white:[229,229,229],orange:[228,152,68],grey:[128,128,128],gray:[128,128,128],brightred:[241,76,76],brightgreen:[35,209,139],brightyellow:[245,245,67],brightblue:[59,142,234],brightmagenta:[214,112,214],brightcyan:[41,184,219]};function xe(s){const e=s.trim().toLowerCase(),t=/^colour(\d{1,3})$/.exec(e);if(t!==null)return a=>`\x1B[48;5;${t[1]}m\x1B[97m\x1B[1m ${a} \x1B[0m`;let n;const r=/^#([0-9a-f]{6})$/.exec(e);if(r!==null){const a=r[1];n=[parseInt(a.slice(0,2),16),parseInt(a.slice(2,4),16),parseInt(a.slice(4,6),16)]}else n=X[e];if(n===void 0)return;const[c,i,o]=n,u=.299*c+.587*i+.114*o>160?"\x1B[30m":"\x1B[97m";return a=>`\x1B[48;2;${c};${i};${o}m${u}\x1B[1m ${a} \x1B[0m`}d(xe,"colorChipStyle");const k=d(s=>`\x1B[7m ${s} \x1B[27m`,"defaultTitleStyle");function pe(s,e){const t=s===void 0?void 0:P[s];if(t===void 0)return e;const[n,r,c]=t;return i=>`\x1B[38;2;${n};${r};${c}m${i}\x1B[39m`}d(pe,"thinkingBorderColor");function be(s,e){const t=s===void 0?void 0:P[s];if(t===void 0)return e;const[n,r,c]=t;return i=>`\x1B[48;2;${n};${r};${c}m\x1B[97m\x1B[1m ${i} \x1B[0m`}d(be,"thinkingTitleStyle");function Y(s,e,t,n,r){const c=e?n(C(e,Math.max(1,s-4),"\u2026")):"",i=b(c),o=s-i;let l="";t&&o>4&&(l=b(t)<=o?t:C(t,o,"\u2026"));const u=Math.max(0,s-i-b(l));return c+r("\u2500".repeat(u))+l}d(Y,"composeTopBorder");const N="\x1B[7m",A="\x1B[0m",_="\x1B[48;5;240m";function q(s){const e=s.indexOf(E);if(e===-1)return;const t=e+E.length;if(!s.startsWith(N,t))return;const n=t+N.length,r=s.indexOf(A,n);if(r===-1)return;const c=s.slice(n,r),i=`${_}${c}\x1B[0m`;return s.slice(0,t)+i+s.slice(r+A.length)}d(q,"outlineCursorLine");const Z=/\.(png|jpe?g|gif|webp|bmp)$/i;function J(s){const e=s.match(/\x1b\[200~([\s\S]*?)\x1b\[201~/);let t=(e?e[1]:s).trim();if(t.length<2||/[\u0000-\u0008\u000e-\u001f]/.test(t))return null;(t.startsWith("'")&&t.endsWith("'")||t.startsWith('"')&&t.endsWith('"'))&&(t=t.slice(1,-1));const n=t.replace(/\\(.)/g,"$1");if(/\n/.test(n)||!Z.test(n))return null;try{if(!D(n).isFile())return null}catch{return null}return n}d(J,"detectDroppedImagePath");function Q(s,e,t,n){const r=[];if(s.length===0||s.length===1&&s[0]==="")return r.push({logicalLine:0,startIndex:0,endIndex:0,text:"",hasCursor:!0,cursorPos:0}),r;for(let c=0;c<s.length;c++){const i=s[c]??"",o=c===t;if(b(i)<=e){r.push({logicalLine:c,startIndex:0,endIndex:i.length,text:i,hasCursor:o,cursorPos:o?n:0});continue}const l=H(i,e);for(let u=0;u<l.length;u++){const a=l[u];if(!a)continue;const h=u===l.length-1;let m=!1,f=0;o&&(h?(m=n>=a.startIndex,f=n-a.startIndex):(m=n>=a.startIndex&&n<a.endIndex,m&&(f=n-a.startIndex,f>a.text.length&&(f=a.text.length)))),r.push({logicalLine:c,startIndex:a.startIndex,endIndex:a.endIndex,text:a.text,hasCursor:m,cursorPos:f})}}return r}d(Q,"buildRefLayoutChunks");function ee(s,e){return F(s).filter(t=>e.has(t.candidate)).map(t=>({start:t.start,end:t.end}))}d(ee,"resolvedSpansForLine");const te="\x1B[4m\x1B[2m",ne="\x1B[24m\x1B[22m",se=new Intl.Segmenter(void 0,{granularity:"grapheme"});function re(s){for(const e of se.segment(s))return e.segment.length;return 0}d(re,"firstGraphemeLength");function ie(s){const e=s.indexOf(E),t=e===-1?0:e+E.length;let n=s.indexOf(N,t),r=N.length;if(n===-1&&(n=s.indexOf(_,t),r=_.length),n===-1)return null;const c=s.indexOf(A,n+r);return c===-1?null:{start:e!==-1?e:n,end:c+A.length}}d(ie,"locateCursorCell");function oe(s,e,t,n,r){const c=[];if(e.hasCursor){const o=ie(s);if(o===null)return s;const l=e.text.slice(e.cursorPos),u=l.length===0?0:re(l),a=e.cursorPos+u;for(const h of t){const m=h.start-e.startIndex,f=h.end-e.startIndex;if(f<=e.cursorPos){const g=r+m,x=r+f;x<=o.start&&s.slice(g,x)===n.slice(h.start,h.end)&&c.push({absStart:g,absEnd:x})}else if(m>=a){const g=o.end+(m-a),x=o.end+(f-a);g>=o.end&&s.slice(g,x)===n.slice(h.start,h.end)&&c.push({absStart:g,absEnd:x})}}}else for(const o of t){const l=r+(o.start-e.startIndex),u=r+(o.end-e.startIndex);s.slice(l,u)===n.slice(o.start,o.end)&&c.push({absStart:l,absEnd:u})}if(c.length===0)return s;c.sort((o,l)=>l.absStart-o.absStart);let i=s;for(const o of c)i=i.slice(0,o.absStart)+te+i.slice(o.absStart,o.absEnd)+ne+i.slice(o.absEnd);return i}d(oe,"decorateRow");function ce(s){const e=/^\/(\S+)\s*([\s\S]*)$/.exec(s.trim());return e?e[1]:null}d(ce,"extractLeadingCommandName");function ae(s,e){if(!s.startsWith("/"))return!1;const t=s.indexOf(" "),n=t===-1?s.slice(1):s.slice(1,t);if(e.has(n))return!0;if(s.startsWith("/skill:")){const r=t===-1?s.slice(7):s.slice(7,t);if(e.has(`skill:${r}`))return!0}return!1}d(ae,"matchesEngineLeadingCommand");class W extends B{static{d(this,"TitledEditor")}km;pendingRawSubmitText;realOnSubmit;pendingReturn;static PASTE_BURST_MS=10;constructor(e,t,n,r){super(e,t,n,r),this.km=n;const c=this.submitValue.bind(this);this.submitValue=()=>{const i=this;this.pendingRawSubmitText=i.getExpandedText(),c()},Object.defineProperty(this,"onSubmit",{configurable:!0,get:d(()=>i=>{const o=this.pendingRawSubmitText??i;this.pendingRawSubmitText=void 0,this.realOnSubmit?.(o)},"get"),set:d(i=>{this.realOnSubmit=i},"set")})}onPasteImagePath;settleHeldReturn(e){const t=this.pendingReturn;if(t!==void 0){if(clearTimeout(t.timer),this.pendingReturn=void 0,e==="newline"){this.insertTextAtCursor(`
|
|
2
|
+
`);return}super.handleInput(t.data),this.tui.requestRender()}}imageTokenWidthBeforeCursor(){const{line:e,col:t}=this.getCursor(),n=this.getLines()[e];if(n===void 0)return 0;const r=n.slice(0,t).match(/\[Image #\d+\]$/);return r?r[0].length:0}imageTokenWidthAfterCursor(){const{line:e,col:t}=this.getCursor(),n=this.getLines()[e];if(n===void 0)return 0;const r=n.slice(t).match(/^\[Image #\d+\]/);return r?r[0].length:0}handleInput(e){if(this.settleHeldReturn("newline"),!this.isShowingAutocomplete()&&this.km.matches(e,"tui.editor.cursorDown")){const i=this,o=this.getCursor(),l=i.historyIndex;super.handleInput(e);const u=this.getCursor();i.historyIndex===l&&u.line===o.line&&u.col===o.col&&this.onCursorDownAtBottom?.();return}if(!this.isShowingAutocomplete()&&this.km.matches(e,"tui.input.newLine")){this.insertTextAtCursor(`
|
|
3
|
+
`);return}if(!this.isShowingAutocomplete()&&this.km.matches(e,"tui.editor.deleteCharBackward")){const i=this.imageTokenWidthBeforeCursor();if(i>1){for(let o=0;o<i;o++)super.handleInput(e);return}}if(!this.isShowingAutocomplete()&&this.km.matches(e,"tui.editor.cursorLeft")){const i=this.imageTokenWidthBeforeCursor();if(i>1){for(let o=0;o<i;o++)super.handleInput(e);return}}if(!this.isShowingAutocomplete()&&this.km.matches(e,"tui.editor.cursorRight")){const i=this.imageTokenWidthAfterCursor();if(i>1){for(let o=0;o<i;o++)super.handleInput(e);return}}const t=J(e);if(t&&this.onPasteImagePath?.(t))return;if((e==="\r"||e===`
|
|
4
|
+
`)&&!this.isShowingAutocomplete()){this.pendingReturn={data:e,timer:setTimeout(()=>this.settleHeldReturn("submit"),W.PASTE_BURST_MS)};return}const{line:n,col:r}=this.getCursor(),c=this.getLines()[n]??"";super.handleInput(e),this.maybeTriggerNonLeadingRefAutocomplete(n,r,c)}maybeTriggerNonLeadingRefAutocomplete(e,t,n){if(this.isShowingAutocomplete())return;const r=this.getCursor();if(r.line!==e||r.col!==t+1)return;const c=this.getLines()[r.line]??"";if(c.length!==n.length+1)return;const i=c[t];if(i===void 0||i!=="/"&&!/[A-Za-z0-9_:-]/.test(i))return;const o=G(this.getLines(),r.line,r.col);!o||o.kind!=="ref"||this.tryTriggerAutocomplete()}onCursorDownAtBottom;loadedCommand;title="";info="";contextBadge="";titleStyle=k;contextBadgeStyle=k;paneFocused=!0;resolvedRefNames=new Set;localCommandNames=new Set;engineCommandNames=new Set;setResolvedRefNames(e){this.resolvedRefNames=new Set(e)}getResolvedRefNames(){return this.resolvedRefNames}setLocalCommandNames(e){this.localCommandNames=new Set(e)}setEngineCommandNames(e){this.engineCommandNames=new Set(e)}decorateResolvedRefs(e,t){if(this.resolvedRefNames.size===0)return;const n=this.getText(),r=ce(n);if(r!==null&&this.localCommandNames.has(r)||ae(n,this.engineCommandNames))return;const c=Math.max(0,Math.floor((t-1)/2)),i=Math.min(this.getPaddingX(),c),o=Math.max(1,t-i*2),l=Math.max(1,o-(i?0:1)),u=this.getLines(),a=this.getCursor(),h=Q(u,l,a.line,a.col),m=this.scrollOffset,f=Math.max(5,Math.floor(this.tui.terminal.rows*.3)),g=Math.min(Math.max(0,h.length-m),f);if(g<=0||e.length<1+g)return;const x=new Map;for(let I=0;I<g;I++){const p=h[m+I];if(!p)continue;let T=x.get(p.logicalLine);T===void 0&&(T=ee(u[p.logicalLine]??"",this.resolvedRefNames),x.set(p.logicalLine,T));const $=T.filter(y=>y.start>=p.startIndex&&y.end<=p.endIndex);if($.length===0)continue;const O=e[1+I];O!==void 0&&(e[1+I]=oe(O,p,$,u[p.logicalLine]??"",i))}}render(e){const t=super.render(e);if(!this.paneFocused)for(let n=0;n<t.length;n++){const r=q(t[n]);if(r!==void 0){t[n]=r;break}}if(this.decorateResolvedRefs(t,e),this.loadedCommand!==void 0&&t.length>=2&&e>=8){const n=e-4,r=j(this.loadedCommand.content,n);if(r.length===0)return t;const c=` ${this.loadedCommand.inspectHint} \xB7 /${this.loadedCommand.name} loaded `,i=r.map(a=>{const h=C(a,n);return`${this.borderColor("\u2502")} ${h}${" ".repeat(Math.max(0,n-b(h)))} ${this.borderColor("\u2502")}`}),o=C(c,e-2),l=Math.max(0,e-2-b(o)),u=this.borderColor(`\u251C${o}${"\u2500".repeat(l)}\u2524`);t.splice(1,0,u,...i,this.borderColor(`\u251C${"\u2500".repeat(e-2)}\u2524`))}if((this.title||this.info)&&t.length>0&&(t[0]=Y(e,this.title,this.info,this.titleStyle,n=>this.borderColor(n))),this.contextBadge&&t.length>0){const n=this.contextBadgeStyle(this.contextBadge),r=b(n);if(r+2<e){const c=t.length-1;t[c]=C(t[c],e-r,"")+n}}return t}}export{W as TitledEditor,Q as buildRefLayoutChunks,xe as colorChipStyle,j as compactLoadedCommandPreview,Y as composeTopBorder,oe as decorateRow,k as defaultTitleStyle,J as detectDroppedImagePath,q as outlineCursorLine,pe as thinkingBorderColor,be as thinkingTitleStyle};
|