@timurproko/a1 0.1.8-dev.235df0e → 0.1.8-dev.260
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 +107 -67
- package/bin/cli.js +28 -10
- package/bin/guardian.js +8 -3
- package/bin/module-identity.js +69 -35
- package/bin/pi-tui.d.ts +6 -0
- package/bin/pi-tui.js +28 -0
- package/bin/release-cleanup.js +8 -0
- package/bin/supervisor.js +2 -2
- package/bin/sync-pi-tui-proxy.js +97 -0
- package/bin/ui.js +47 -20
- package/bin/warmup.js +27 -0
- package/dist/cli/capabilities.d.ts +6 -0
- package/dist/{src/cli → cli}/capabilities.js +1 -1
- package/dist/{src/cli → cli}/dispatch.d.ts +15 -1
- package/dist/cli/dispatch.js +261 -0
- package/dist/cli/package-messages.d.ts +26 -0
- package/dist/cli/package-messages.js +71 -0
- package/dist/{src/cli → cli}/packages.d.ts +11 -2
- package/dist/{src/cli → cli}/packages.js +24 -27
- package/dist/{src/cli → cli}/version-stats.d.ts +6 -0
- package/dist/cli/version-stats.js +112 -0
- package/dist/composition/agent-engine-bridge.d.ts +3 -0
- package/dist/composition/agent-engine-bridge.js +108 -0
- package/dist/composition/index.d.ts +3 -0
- package/dist/composition/index.js +3 -0
- package/dist/composition/owned-ui.d.ts +31 -0
- package/dist/composition/owned-ui.js +66 -0
- package/dist/composition/process.d.ts +16 -0
- package/dist/composition/process.js +45 -0
- package/dist/composition/settings-route-host.d.ts +8 -0
- package/dist/composition/settings-route-host.js +75 -0
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.d.ts +2 -2
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.js +22 -4
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.d.ts +17 -0
- package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.d.ts +6 -0
- package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.d.ts +36 -0
- package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.js +25 -0
- package/dist/{src/features → features}/launch/development-launch.js +11 -3
- package/dist/{src/features → features}/launch/index.d.ts +0 -1
- package/dist/{src/features → features}/launch/index.js +0 -1
- package/dist/features/launch/intent.d.ts +10 -0
- package/dist/features/launch/intent.js +8 -0
- package/dist/{src/features → features}/launch/prepare-launch.d.ts +0 -2
- package/dist/{src/features → features}/launch/prepare-launch.js +2 -9
- package/dist/{src/features → features}/launch/profile-paths.d.ts +1 -2
- package/dist/{src/features → features}/launch/profile-paths.js +2 -8
- package/dist/{src/features → features}/launch/runtime-selection.d.ts +2 -5
- package/dist/{src/features → features}/owned-ui/customization.d.ts +3 -1
- package/dist/{src/features → features}/owned-ui/customization.js +3 -1
- package/dist/{src/features → features}/owned-ui/diagnostics.d.ts +2 -1
- package/dist/{src/features → features}/owned-ui/diagnostics.js +1 -0
- package/dist/{src/features → features}/owned-ui/index.d.ts +2 -0
- package/dist/{src/features → features}/owned-ui/index.js +2 -0
- package/dist/features/owned-ui/project-trust-prompt.d.ts +25 -0
- package/dist/features/owned-ui/project-trust-prompt.js +149 -0
- package/dist/{src/features → features}/owned-ui/run.d.ts +2 -2
- package/dist/{src/features → features}/owned-ui/run.js +2 -0
- package/dist/features/owned-ui/session-fork-prompt.d.ts +8 -0
- package/dist/features/owned-ui/session-fork-prompt.js +34 -0
- package/dist/{src/features → features}/owned-ui/settings-app.d.ts +3 -3
- package/dist/{src/features → features}/owned-ui/settings-app.js +103 -54
- package/dist/{src/features → features}/workspace/capabilities.d.ts +1 -1
- package/dist/{src/features → features}/workspace/reducer.d.ts +2 -1
- package/dist/{src/features → features}/workspace/reducer.js +2 -1
- package/dist/{src/features → features}/workspace/router.d.ts +2 -1
- package/dist/{src/features → features}/workspace/router.js +1 -0
- package/dist/{src/features → features}/workspace/store.d.ts +2 -1
- package/dist/{src/features → features}/workspace/store.js +1 -0
- package/dist/{src/foundation → foundation}/launch-guardian/main.d.ts +2 -0
- package/dist/{src/foundation → foundation}/launch-guardian/main.js +18 -5
- package/dist/{src/foundation → foundation}/lifecycle/index.d.ts +2 -0
- package/dist/{src/foundation → foundation}/lifecycle/index.js +2 -0
- package/dist/{src/foundation → foundation}/lifecycle/model.d.ts +1 -1
- package/dist/{src/foundation → foundation}/lifecycle/model.js +1 -1
- package/dist/foundation/lifecycle/paths.d.ts +30 -0
- package/dist/{src/foundation → foundation}/lifecycle/paths.js +29 -1
- package/dist/foundation/lifecycle/session-selection.d.ts +9 -0
- package/dist/foundation/lifecycle/session-selection.js +39 -0
- package/dist/foundation/lifecycle/supervisor-startup.d.ts +30 -0
- package/dist/foundation/lifecycle/supervisor-startup.js +106 -0
- package/dist/{src/foundation → foundation}/native-host-protocol/codec.d.ts +2 -0
- package/dist/{src/foundation → foundation}/native-host-protocol/codec.js +2 -0
- package/dist/{src/foundation → foundation}/native-host-protocol/messages.d.ts +1 -1
- package/dist/{src/foundation → foundation}/native-host-protocol/messages.js +1 -1
- package/dist/foundation/process-containment/darwin-process-inspector.d.ts +5 -0
- package/dist/foundation/process-containment/darwin-process-inspector.js +7 -0
- package/dist/{src/foundation → foundation}/process-containment/index.d.ts +1 -0
- package/dist/{src/foundation → foundation}/process-containment/index.js +1 -0
- package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.d.ts +1 -0
- package/dist/{src/foundation → foundation}/process-containment/linux-process-inspector.js +1 -0
- package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.d.ts +1 -0
- package/dist/{src/foundation → foundation}/process-containment/native-guardian-containment.js +1 -0
- package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.d.ts +3 -1
- package/dist/{src/foundation → foundation}/process-containment/windows-process-inspector.js +5 -2
- package/dist/{src/foundation → foundation}/protocol/client.d.ts +1 -0
- package/dist/{src/foundation → foundation}/protocol/client.js +1 -0
- package/dist/{src/foundation → foundation}/protocol/messages.d.ts +1 -0
- package/dist/{src/foundation → foundation}/protocol/messages.js +1 -0
- package/dist/{src/foundation → foundation}/release/bootstrap.d.ts +25 -6
- package/dist/{src/foundation → foundation}/release/bootstrap.js +124 -34
- package/dist/foundation/release/cohort-state.d.ts +156 -0
- package/dist/foundation/release/cohort-state.js +471 -0
- package/dist/foundation/release/dependency-layer.d.ts +82 -0
- package/dist/foundation/release/dependency-layer.js +497 -0
- package/dist/foundation/release/endpoints.d.ts +20 -0
- package/dist/foundation/release/endpoints.js +50 -0
- package/dist/foundation/release/immutable-platform.d.ts +6 -0
- package/dist/foundation/release/immutable-platform.js +13 -0
- package/dist/{src/foundation → foundation}/release/index.d.ts +4 -0
- package/dist/{src/foundation → foundation}/release/index.js +4 -0
- package/dist/foundation/release/release-gc.d.ts +71 -0
- package/dist/foundation/release/release-gc.js +734 -0
- package/dist/{src/foundation → foundation}/release/release-store.d.ts +7 -3
- package/dist/{src/foundation → foundation}/release/release-store.js +65 -13
- package/dist/{src/foundation → foundation}/release/release.d.ts +4 -1
- package/dist/{src/foundation → foundation}/release/release.js +10 -3
- package/dist/foundation/release/restart-certification.d.ts +67 -0
- package/dist/foundation/release/restart-certification.js +211 -0
- package/dist/{src/foundation → foundation}/release/update-transaction.d.ts +1 -0
- package/dist/{src/foundation → foundation}/release/update-transaction.js +1 -0
- package/dist/{src/foundation → foundation}/release/update.d.ts +19 -3
- package/dist/{src/foundation → foundation}/release/update.js +116 -56
- package/dist/foundation/release/warmup.d.ts +3 -0
- package/dist/foundation/release/warmup.js +35 -0
- package/dist/foundation/startup/index.d.ts +1 -0
- package/dist/foundation/startup/index.js +1 -0
- package/dist/foundation/startup/startup-runtime.d.ts +36 -0
- package/dist/foundation/startup/startup-runtime.js +140 -0
- package/dist/{src/foundation → foundation}/storage/control-store.d.ts +2 -1
- package/dist/{src/foundation → foundation}/storage/control-store.js +39 -4
- package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/backpressure.js +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/commands.js +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.d.ts +1 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/handshake.js +1 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/reconnection.js +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/state.d.ts +2 -1
- package/dist/{src/foundation → foundation}/structured-agent-runtime/state.js +2 -1
- package/dist/foundation/supervision/index.d.ts +3 -0
- package/dist/foundation/supervision/index.js +3 -0
- package/dist/foundation/supervision/main.d.ts +1 -0
- package/dist/foundation/supervision/main.js +80 -0
- package/dist/foundation/supervision/paths.d.ts +1 -0
- package/dist/foundation/supervision/paths.js +1 -0
- package/dist/{src/foundation → foundation}/supervision/server.d.ts +19 -1
- package/dist/{src/foundation → foundation}/supervision/server.js +65 -3
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.d.ts +1 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.d.ts +1 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/conformance.js +3 -2
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.d.ts +1 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/index.js +1 -1
- package/dist/integrations/pi/components/owned-editor-ux.d.ts +55 -0
- package/dist/integrations/pi/components/owned-editor-ux.js +778 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.d.ts +1 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-components.js +1 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.js +54 -6
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.d.ts +1 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.d.ts +3 -3
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-footer-status.js +49 -18
- package/dist/integrations/pi/components/shell-presenters-info.d.ts +36 -0
- package/dist/integrations/pi/components/shell-presenters-info.js +78 -0
- package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +25 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-presenters-transcript.js +92 -131
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.d.ts +5 -2
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-selectors-dialogs.js +2 -1
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.d.ts +57 -8
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-shared-facade.js +4 -2
- package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +13 -0
- package/dist/integrations/pi/components/submitted-prompt-adapter.js +27 -0
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.d.ts +10 -2
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/adjacent/core/keybindings.js +36 -3
- package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.d.ts +1 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.d.ts +28 -4
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/adapter.js +714 -127
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.d.ts +2 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/conformance.js +4 -2
- package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
- package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.d.ts +4 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/index.js +4 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.d.ts +2 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/model-auth-integration.js +1 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.d.ts +1 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/package-integration.js +32 -26
- package/dist/integrations/pi/engine/project-trust-preflight.d.ts +22 -0
- package/dist/integrations/pi/engine/project-trust-preflight.js +50 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.d.ts +2 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/resource-extension-integration.js +1 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.d.ts +19 -1
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/runtime-integration.js +47 -5
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.d.ts +4 -2
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/session-integration.js +19 -4
- package/dist/integrations/pi/engine/session-selection.d.ts +28 -0
- package/dist/integrations/pi/engine/session-selection.js +90 -0
- package/dist/integrations/pi/engine/settings-effects.d.ts +66 -0
- package/dist/integrations/pi/engine/settings-effects.js +249 -0
- package/dist/integrations/pi/engine/settings-integration.d.ts +43 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/settings-integration.js +102 -108
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.d.ts +3 -2
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflow-controllers.js +1 -0
- package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.d.ts +18 -1
- package/dist/integrations/pi/session-ui/clipboard-image.d.ts +11 -0
- package/dist/integrations/pi/session-ui/clipboard-image.js +29 -0
- package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/index.d.ts +1 -0
- package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/index.js +1 -0
- package/dist/integrations/pi/session-ui/prompt-chips.d.ts +23 -0
- package/dist/integrations/pi/session-ui/prompt-chips.js +246 -0
- package/dist/integrations/pi/session-ui/route-host.d.ts +5 -0
- package/dist/integrations/pi/session-ui/session-shell-root.d.ts +141 -0
- package/dist/integrations/pi/session-ui/session-shell-root.js +1158 -0
- package/dist/integrations/pi/session-ui/session-shell.d.ts +55 -0
- package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/session-shell.js +479 -719
- package/dist/integrations/pi/session-ui/session-viewport-controller.d.ts +45 -0
- package/dist/integrations/pi/session-ui/session-viewport-controller.js +463 -0
- package/dist/integrations/pi/session-ui/stream-presentation-coalescer.d.ts +29 -0
- package/dist/integrations/pi/session-ui/stream-presentation-coalescer.js +79 -0
- package/dist/integrations/pi/session-ui/system-clipboard.d.ts +20 -0
- package/dist/integrations/pi/session-ui/system-clipboard.js +130 -0
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.d.ts +8 -1
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.js +216 -9
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.d.ts +29 -6
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +74 -0
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +380 -0
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/index.d.ts +2 -0
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/index.js +2 -0
- package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +39 -0
- package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.js +139 -0
- package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.d.ts +1 -1
- package/dist/native/darwin-arm64/manifest.json +4 -4
- package/dist/native/darwin-arm64/process-guardian +0 -0
- package/dist/native/linux-x64/manifest.json +3 -3
- package/dist/native/linux-x64/process-guardian +0 -0
- package/dist/native/win32-x64/manifest.json +3 -3
- package/dist/native/win32-x64/process-guardian.exe +0 -0
- package/dist/{src/product-identity.d.ts → product-identity.d.ts} +3 -3
- package/dist/{src/product-identity.js → product-identity.js} +7 -5
- package/dist/{src/product-identity.json → product-identity.json} +11 -6
- package/dist/runtime-payload-inventory.json +122328 -0
- package/dist/{src/foundation/ui-apps → ui/apps}/contracts.d.ts +23 -1
- package/dist/{src/foundation/ui-apps → ui/apps}/host.d.ts +1 -1
- package/dist/{src/foundation/ui-apps → ui/apps}/host.js +14 -10
- package/dist/{src/foundation/ui-apps → ui/apps}/registry.d.ts +1 -0
- package/dist/{src/foundation/ui-apps → ui/apps}/registry.js +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.js +5 -3
- package/dist/{src/foundation/ui-components → ui/components}/frame.d.ts +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/frame.js +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/index.d.ts +5 -0
- package/dist/{src/foundation/ui-components → ui/components}/index.js +5 -0
- package/dist/{src/foundation/ui-components → ui/components}/line-input.d.ts +1 -6
- package/dist/{src/foundation/ui-components → ui/components}/line-input.js +4 -9
- package/dist/{src/foundation/ui-components → ui/components}/list-view.d.ts +0 -6
- package/dist/{src/foundation/ui-components → ui/components}/list-view.js +14 -7
- package/dist/{src/foundation/ui-components → ui/components}/mouse.d.ts +10 -0
- package/dist/{src/foundation/ui-components → ui/components}/mouse.js +23 -0
- package/dist/ui/components/progress-status.d.ts +2 -0
- package/dist/ui/components/progress-status.js +4 -0
- package/dist/ui/components/prompt-row.d.ts +14 -0
- package/dist/ui/components/prompt-row.js +20 -0
- package/dist/{src/foundation/ui-components → ui/components}/scrollbar.d.ts +26 -0
- package/dist/{src/foundation/ui-components → ui/components}/scrollbar.js +35 -0
- package/dist/{src/foundation/ui-components → ui/components}/shortcuts.d.ts +1 -0
- package/dist/{src/foundation/ui-components → ui/components}/shortcuts.js +1 -0
- package/dist/ui/components/spans.d.ts +25 -0
- package/dist/ui/components/spans.js +257 -0
- package/dist/ui/components/submitted-prompt.d.ts +23 -0
- package/dist/ui/components/submitted-prompt.js +50 -0
- package/dist/{src/foundation/ui-components → ui/components}/surface.d.ts +0 -5
- package/dist/{src/foundation/ui-components → ui/components}/surface.js +1 -5
- package/dist/ui/components/text-selection.d.ts +62 -0
- package/dist/ui/components/text-selection.js +208 -0
- package/dist/{src/foundation/ui-components → ui/components}/text.d.ts +14 -0
- package/dist/{src/foundation/ui-components → ui/components}/text.js +66 -4
- package/dist/ui/components/transcript-viewport.d.ts +152 -0
- package/dist/ui/components/transcript-viewport.js +631 -0
- package/dist/ui/components/visible-hyperlinks.d.ts +19 -0
- package/dist/ui/components/visible-hyperlinks.js +64 -0
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/declarations.d.ts +8 -1
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/declarations.js +33 -5
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.d.ts +1 -1
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/migrations.js +21 -2
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.d.ts +6 -19
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/sections.js +32 -23
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/session.d.ts +9 -17
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/session.js +65 -55
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.d.ts +1 -0
- package/dist/{src/foundation/owned-ui-settings → ui/settings}/store.js +2 -1
- package/docs/architecture/boundaries.md +9 -9
- package/docs/architecture/code-documentation.md +77 -0
- package/docs/architecture/process-guardian-provenance.md +3 -1
- package/docs/architecture/project-structure.md +67 -30
- package/docs/architecture/resource-and-data-policy.md +1 -1
- package/docs/architecture/toolchain.md +10 -10
- package/docs/architecture/ui-reference-provenance.md +36 -5
- package/docs/ci-release-runbook.md +186 -79
- package/docs/features/launch-profiles.md +24 -17
- package/docs/manual-ghost-link-baseline.md +89 -0
- package/docs/manual-launch-instance-acceptance.md +12 -35
- package/docs/manual-owned-ui-checkpoint.md +78 -0
- package/docs/manual-pi-boundary-candidate.md +4 -5
- package/docs/manual-terminal-colour-check.md +4 -3
- package/docs/repository-governance-live-acceptance.md +77 -0
- package/package.json +37 -27
- package/dist/src/cli/capabilities.d.ts +0 -15
- package/dist/src/cli/dispatch.js +0 -177
- package/dist/src/cli/version-stats.js +0 -72
- package/dist/src/composition/index.d.ts +0 -48
- package/dist/src/composition/index.js +0 -258
- package/dist/src/features/launch/intent.d.ts +0 -7
- package/dist/src/features/launch/intent.js +0 -4
- package/dist/src/features/launch/profiles.d.ts +0 -12
- package/dist/src/features/launch/profiles.js +0 -26
- package/dist/src/foundation/lifecycle/paths.d.ts +0 -10
- package/dist/src/foundation/pi-component-adapter/shell-presenters-transcript.d.ts +0 -57
- package/dist/src/foundation/pi-engine-adapter/settings-integration.d.ts +0 -55
- package/dist/src/foundation/pi-owned-ui-integration/route-host.d.ts +0 -29
- package/dist/src/foundation/pi-owned-ui-integration/session-shell.d.ts +0 -106
- package/dist/src/foundation/release/cohort-state.d.ts +0 -70
- package/dist/src/foundation/release/cohort-state.js +0 -202
- package/dist/src/foundation/release/release-gc.d.ts +0 -5
- package/dist/src/foundation/release/release-gc.js +0 -16
- package/dist/src/foundation/supervision/index.d.ts +0 -3
- package/dist/src/foundation/supervision/index.js +0 -3
- package/dist/src/foundation/supervision/main.d.ts +0 -1
- package/dist/src/foundation/supervision/main.js +0 -41
- package/dist/src/foundation/supervision/paths.d.ts +0 -1
- package/dist/src/foundation/supervision/paths.js +0 -1
- package/dist/src/foundation/ui-components/spans.d.ts +0 -7
- package/dist/src/foundation/ui-components/spans.js +0 -59
- package/docs/manual-transparent-checkpoint.md +0 -53
- /package/dist/{src/cli → cli}/index.d.ts +0 -0
- /package/dist/{src/cli → cli}/index.js +0 -0
- /package/dist/{src/cli → cli}/version.d.ts +0 -0
- /package/dist/{src/cli → cli}/version.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/capability-ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain-validation.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/domain.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/index.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/model.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/package-ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/ports.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/serialization.js +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.d.ts +0 -0
- /package/dist/{src/foundation/agent-engine-contracts → contracts/agent-engine}/validation.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/extension-ui.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/index.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/index.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/model.js +0 -0
- /package/dist/{src/foundation/owned-ui-contracts → contracts/owned-ui}/validation.d.ts +0 -0
- /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.d.ts +0 -0
- /package/dist/{src/foundation/presentation-contracts → contracts/presentation}/index.js +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.d.ts +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/index.js +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.d.ts +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/model.js +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.d.ts +0 -0
- /package/dist/{src/foundation/workspace-contracts → contracts/workspace}/validation.js +0 -0
- /package/dist/{src/features → features}/launch/development-launch.d.ts +0 -0
- /package/dist/{src/features → features}/launch/initialize-profile.d.ts +0 -0
- /package/dist/{src/features → features}/launch/initialize-profile.js +0 -0
- /package/dist/{src/features → features}/launch/runtime-selection.js +0 -0
- /package/dist/{src/features → features}/workspace/capabilities.js +0 -0
- /package/dist/{src/features → features}/workspace/index.d.ts +0 -0
- /package/dist/{src/features → features}/workspace/index.js +0 -0
- /package/dist/{src/features → features}/workspace/presentation.d.ts +0 -0
- /package/dist/{src/features → features}/workspace/presentation.js +0 -0
- /package/dist/{src/features → features}/workspace/reconciliation.d.ts +0 -0
- /package/dist/{src/features → features}/workspace/reconciliation.js +0 -0
- /package/dist/{src/foundation → foundation}/launch-guardian/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/launch-guardian/index.js +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/commands.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/commands.js +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/lifecycle/launch-instance.js +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/evidence.js +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/index.js +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/native-host-protocol/proof-gate.js +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/artifact.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/artifact.js +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/contracts.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/process-containment/contracts.js +0 -0
- /package/dist/{src/foundation → foundation}/protocol/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/protocol/index.js +0 -0
- /package/dist/{src/foundation → foundation}/release/cohort-selection.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/cohort-selection.js +0 -0
- /package/dist/{src/foundation → foundation}/release/concurrency.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/concurrency.js +0 -0
- /package/dist/{src/foundation → foundation}/release/process-cleanup.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/process-cleanup.js +0 -0
- /package/dist/{src/foundation → foundation}/release/stable-release.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/release/stable-release.js +0 -0
- /package/dist/{src/foundation → foundation}/storage/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/storage/index.js +0 -0
- /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.d.ts +0 -0
- /package/dist/{src/foundation → foundation}/structured-agent-runtime/index.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/components.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/resources/builtin-themes.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-editor-autocomplete.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/shell-extension-ui.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/theme.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/countdown-timer.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/custom-entry.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/daxnuts.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/earendil-announcement.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/earendil-announcement.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/extension-editor.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/first-time-setup.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/markdown-transform.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/mermaid.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/owned-editor.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/owned-editor.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/scoped-models-selector.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-footer.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector-search.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/session-selector.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/skill-invocation-message.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/status-indicator.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/tree-selector.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/components/trust-selector.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/external-editor.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/model-search.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme-controller.js +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.d.ts +0 -0
- /package/dist/{src/foundation/pi-component-adapter → integrations/pi/components}/upstream/theme/theme.js +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/pi-settings-metadata.json +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.d.ts +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/public-main-entry.js +0 -0
- /package/dist/{src/foundation/pi-engine-adapter → integrations/pi/engine}/workflows.js +0 -0
- /package/dist/{src/foundation/pi-owned-ui-integration → integrations/pi/session-ui}/route-host.js +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.d.ts +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/conformance.js +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.js +0 -0
- /package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/presentation-adapter.js +0 -0
- /package/dist/{src/foundation/ui-apps → ui/apps}/contracts.js +0 -0
- /package/dist/{src/foundation/ui-apps → ui/apps}/index.d.ts +0 -0
- /package/dist/{src/foundation/ui-apps → ui/apps}/index.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/dialog-panel.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/label.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/label.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/list-block.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/list-block.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/pane.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/pane.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/revision.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/revision.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/status-line.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/status-line.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/stepper.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/stepper.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/theme.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/theme.js +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/value-menu.d.ts +0 -0
- /package/dist/{src/foundation/ui-components → ui/components}/value-menu.js +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/index.js +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.d.ts +0 -0
- /package/dist/{src/foundation/owned-ui-settings → ui/settings}/resolution.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PaneInputResult, PaneMouseEvent, PaneRect, UiTheme } from "../
|
|
1
|
+
import type { PaneInputResult, PaneMouseEvent, PaneRect, RenderCacheContract, UiTheme } from "../components/index.js";
|
|
2
2
|
export interface AppSize {
|
|
3
3
|
readonly width: number;
|
|
4
4
|
readonly height: number;
|
|
@@ -27,6 +27,8 @@ export interface AppHostServices {
|
|
|
27
27
|
}
|
|
28
28
|
export interface UiApp {
|
|
29
29
|
readonly id: string;
|
|
30
|
+
/** Optional declared revisions used by the host's shared frame cache. */
|
|
31
|
+
readonly renderCache?: RenderCacheContract;
|
|
30
32
|
render(rect: PaneRect, host: AppHostServices): readonly string[];
|
|
31
33
|
onInput?(data: string, host: AppHostServices): PaneInputResult;
|
|
32
34
|
onMouse?(event: PaneMouseEvent, host: AppHostServices): PaneInputResult;
|
|
@@ -39,4 +41,24 @@ export interface AppRegistration {
|
|
|
39
41
|
readonly route: string;
|
|
40
42
|
create(): UiApp;
|
|
41
43
|
}
|
|
44
|
+
/** A neutral owned-app surface mounted by a surrounding presentation runtime. */
|
|
45
|
+
export interface UiRouteSurface {
|
|
46
|
+
readonly id: string;
|
|
47
|
+
/** Renders exactly `height` rows of at most `width` columns. */
|
|
48
|
+
render(width: number, height: number): readonly string[];
|
|
49
|
+
/** True when the key was consumed; false leaves it to the surrounding shell. */
|
|
50
|
+
handleInput(data: string): boolean;
|
|
51
|
+
/** Mouse report in surface-local coordinates. True when consumed. */
|
|
52
|
+
handleMouse(event: PaneMouseEvent): boolean;
|
|
53
|
+
isClosed(): boolean;
|
|
54
|
+
close(): void;
|
|
55
|
+
onRenderRequested(listener: () => void): void;
|
|
56
|
+
/** The surface asks to leave A1 entirely, not merely to close itself. */
|
|
57
|
+
onExitRequested(listener: () => void): void;
|
|
58
|
+
}
|
|
59
|
+
/** Route lookup seam shared by owned apps and any presentation runtime hosting them. */
|
|
60
|
+
export interface UiRouteHost {
|
|
61
|
+
claims(route: string): boolean;
|
|
62
|
+
open(route: string): UiRouteSurface | null;
|
|
63
|
+
}
|
|
42
64
|
export declare function assertAppRegistration(registration: AppRegistration): void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type PaneInputResult, type PaneMouseEvent, type UiTheme } from "../
|
|
1
|
+
import { type PaneInputResult, type PaneMouseEvent, type UiTheme } from "../components/index.js";
|
|
2
2
|
import type { AppSize, UiApp } from "./contracts.js";
|
|
3
3
|
import type { UiAppRegistry } from "./registry.js";
|
|
4
4
|
export interface AppHostSurface {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { FrameCache, finalizeFrame, } from "../
|
|
2
|
-
//
|
|
1
|
+
import { FrameCache, finalizeFrame, } from "../components/index.js";
|
|
2
|
+
// Invariant: the interrupt byte is written as an escape: as a raw byte it is invisible to
|
|
3
3
|
// every text tool, and this constant had already been emptied by one.
|
|
4
4
|
const INTERRUPT = "";
|
|
5
5
|
/** How long the first interrupt of the chord stays armed. */
|
|
@@ -14,8 +14,9 @@ export class UiAppHost {
|
|
|
14
14
|
#surface;
|
|
15
15
|
#closeOnInterrupt;
|
|
16
16
|
#theme;
|
|
17
|
-
|
|
17
|
+
// Invariant: the first interrupt timestamp is null whenever the chord is disarmed.
|
|
18
18
|
#interruptArmedAt = null;
|
|
19
|
+
#renderedInterruptArmed;
|
|
19
20
|
#cache = new FrameCache();
|
|
20
21
|
#app = null;
|
|
21
22
|
constructor(options) {
|
|
@@ -58,7 +59,11 @@ export class UiAppHost {
|
|
|
58
59
|
}
|
|
59
60
|
const size = this.#surface.size();
|
|
60
61
|
const rect = { width: Math.max(0, size.width), height: Math.max(0, size.height) };
|
|
61
|
-
const
|
|
62
|
+
const interruptArmed = this.interruptArmed;
|
|
63
|
+
if (this.#renderedInterruptArmed !== interruptArmed)
|
|
64
|
+
this.#cache.invalidate();
|
|
65
|
+
this.#renderedInterruptArmed = interruptArmed;
|
|
66
|
+
const lines = this.#guard(() => this.#cache.render(app, rect, () => finalizeFrame(app.render(rect, this.#services()), rect, app.id)));
|
|
62
67
|
this.#surface.present(lines ?? null);
|
|
63
68
|
}
|
|
64
69
|
handleInput(data) {
|
|
@@ -86,11 +91,7 @@ export class UiAppHost {
|
|
|
86
91
|
this.render();
|
|
87
92
|
return result;
|
|
88
93
|
}
|
|
89
|
-
|
|
90
|
-
* Two interrupts leave A1, from any screen. One arms the chord and repaints so
|
|
91
|
-
* the screen can say so; a second within the window exits rather than merely
|
|
92
|
-
* closing the screen, which is what the chord means everywhere else.
|
|
93
|
-
*/
|
|
94
|
+
// Protocol: two interrupts within the chord window leave A1 from every screen.
|
|
94
95
|
#interrupt() {
|
|
95
96
|
const now = Date.now();
|
|
96
97
|
const armed = this.#interruptArmedAt;
|
|
@@ -101,6 +102,9 @@ export class UiAppHost {
|
|
|
101
102
|
return { consumed: true, render: true };
|
|
102
103
|
}
|
|
103
104
|
this.#interruptArmedAt = now;
|
|
105
|
+
// Invariant: host-owned state participates in the app's next frame independently of
|
|
106
|
+
// the app's own revision contract.
|
|
107
|
+
this.#cache.invalidate();
|
|
104
108
|
return { consumed: true, render: true };
|
|
105
109
|
}
|
|
106
110
|
get interruptArmed() {
|
|
@@ -135,7 +139,7 @@ export class UiAppHost {
|
|
|
135
139
|
...(this.#theme === undefined ? {} : { theme: this.#theme }),
|
|
136
140
|
};
|
|
137
141
|
}
|
|
138
|
-
|
|
142
|
+
// Security: an app failure closes its app and restores the surface.
|
|
139
143
|
#guard(work) {
|
|
140
144
|
try {
|
|
141
145
|
return work();
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type AppRegistration } from "./contracts.js";
|
|
2
|
+
/** Registers owned applications under unique routes and unregisters only the matching definition. */
|
|
2
3
|
export declare class UiAppRegistry {
|
|
3
4
|
#private;
|
|
4
5
|
/** Registering a known id replaces its definition rather than adding a second app. */
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { assertAppRegistration } from "./contracts.js";
|
|
2
|
+
/** Registers owned applications under unique routes and unregisters only the matching definition. */
|
|
2
3
|
export class UiAppRegistry {
|
|
3
4
|
#byId = new Map();
|
|
4
5
|
/** Registering a known id replaces its definition rather than adding a second app. */
|
|
@@ -17,9 +17,11 @@ export function renderDialogPanel(state, width, theme) {
|
|
|
17
17
|
const padded = `${row.label}${" ".repeat(Math.max(0, labelColumn - displayWidth(row.label)))}`;
|
|
18
18
|
const cursor = selected ? "→ " : " ";
|
|
19
19
|
const raw = `${cursor}${padded} ${row.value}`;
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
const painted =
|
|
20
|
+
// Compatibility: match pinned SettingsList: selected cursor, label, and value all use the
|
|
21
|
+
// accent role; an unselected label is plain and its value is muted.
|
|
22
|
+
const painted = selected
|
|
23
|
+
? `${theme.fg("accent", cursor)}${theme.fg("accent", padded)} ${theme.fg("accent", row.value)}`
|
|
24
|
+
: `${cursor}${padded} ${theme.fg("muted", row.value)}`;
|
|
23
25
|
return pad(truncateToWidth(painted, width), width, raw);
|
|
24
26
|
});
|
|
25
27
|
const description = state.rows[state.index]?.description ?? "";
|
|
@@ -2,6 +2,7 @@ export interface PaneRect {
|
|
|
2
2
|
readonly width: number;
|
|
3
3
|
readonly height: number;
|
|
4
4
|
}
|
|
5
|
+
/** Identifies the pane whose bounded frame geometry or rendered rows violated the contract. */
|
|
5
6
|
export declare class FrameContractError extends Error {
|
|
6
7
|
readonly pane: string;
|
|
7
8
|
constructor(pane: string, message: string);
|
|
@@ -6,13 +6,18 @@ export * from "./list-block.js";
|
|
|
6
6
|
export * from "./list-view.js";
|
|
7
7
|
export * from "./mouse.js";
|
|
8
8
|
export * from "./pane.js";
|
|
9
|
+
export * from "./progress-status.js";
|
|
9
10
|
export * from "./revision.js";
|
|
10
11
|
export * from "./scrollbar.js";
|
|
11
12
|
export * from "./shortcuts.js";
|
|
12
13
|
export * from "./spans.js";
|
|
14
|
+
export * from "./visible-hyperlinks.js";
|
|
13
15
|
export * from "./status-line.js";
|
|
16
|
+
export * from "./submitted-prompt.js";
|
|
14
17
|
export * from "./stepper.js";
|
|
18
|
+
export * from "./transcript-viewport.js";
|
|
15
19
|
export * from "./surface.js";
|
|
16
20
|
export * from "./text.js";
|
|
21
|
+
export * from "./text-selection.js";
|
|
17
22
|
export * from "./theme.js";
|
|
18
23
|
export * from "./value-menu.js";
|
|
@@ -6,13 +6,18 @@ export * from "./list-block.js";
|
|
|
6
6
|
export * from "./list-view.js";
|
|
7
7
|
export * from "./mouse.js";
|
|
8
8
|
export * from "./pane.js";
|
|
9
|
+
export * from "./progress-status.js";
|
|
9
10
|
export * from "./revision.js";
|
|
10
11
|
export * from "./scrollbar.js";
|
|
11
12
|
export * from "./shortcuts.js";
|
|
12
13
|
export * from "./spans.js";
|
|
14
|
+
export * from "./visible-hyperlinks.js";
|
|
13
15
|
export * from "./status-line.js";
|
|
16
|
+
export * from "./submitted-prompt.js";
|
|
14
17
|
export * from "./stepper.js";
|
|
18
|
+
export * from "./transcript-viewport.js";
|
|
15
19
|
export * from "./surface.js";
|
|
16
20
|
export * from "./text.js";
|
|
21
|
+
export * from "./text-selection.js";
|
|
17
22
|
export * from "./theme.js";
|
|
18
23
|
export * from "./value-menu.js";
|
|
@@ -47,12 +47,7 @@ export declare class LineInput {
|
|
|
47
47
|
}
|
|
48
48
|
/** Applies one key to the input and reports whether the caller should commit. */
|
|
49
49
|
export declare function handleLineInputKey(input: LineInput, data: string): LineInputOutcome;
|
|
50
|
-
/**
|
|
51
|
-
* The prompt the reference draws at the head of an input row, in the grey it
|
|
52
|
-
* uses for one (#9AA0A6), painted foreground-only so anything drawn behind the
|
|
53
|
-
* row survives.
|
|
54
|
-
*/
|
|
55
|
-
/** A rule drawn in the prompt's own grey, as the reference rules an input row. */
|
|
50
|
+
/** Draws the reference prompt rule foreground-only so underlying cells survive. */
|
|
56
51
|
export declare function promptRule(width: number): string;
|
|
57
52
|
export declare const PROMPT_GLYPH = "\u001B[38;2;154;160;166m\u276F\u001B[39m ";
|
|
58
53
|
/**
|
|
@@ -148,7 +148,7 @@ export function handleLineInputKey(input, data) {
|
|
|
148
148
|
return { kind: "accepted", value: input.value };
|
|
149
149
|
if (data === "\u001b" || data === "\u0003")
|
|
150
150
|
return { kind: "cancelled" };
|
|
151
|
-
//
|
|
151
|
+
// Platform: a word delete is decided before a plain one: on Windows Terminal the raw
|
|
152
152
|
// backspace byte IS ctrl+backspace, and the plain branch would swallow it.
|
|
153
153
|
if (data === "\b" || data === "\u001b\u007f" || data === "\u0017") {
|
|
154
154
|
input.deleteWordBefore();
|
|
@@ -190,7 +190,7 @@ export function handleLineInputKey(input, data) {
|
|
|
190
190
|
input.moveCaretToEnd();
|
|
191
191
|
return { kind: "editing" };
|
|
192
192
|
}
|
|
193
|
-
//
|
|
193
|
+
// Rationale: any other escape sequence is a key this input has no answer for - a page
|
|
194
194
|
// key, a function key, a chord. It is swallowed rather than typed, because the
|
|
195
195
|
// one thing it certainly is not is text the reader meant to enter.
|
|
196
196
|
if (data.startsWith("\u001b"))
|
|
@@ -198,12 +198,7 @@ export function handleLineInputKey(input, data) {
|
|
|
198
198
|
input.insert(data);
|
|
199
199
|
return { kind: "editing" };
|
|
200
200
|
}
|
|
201
|
-
/**
|
|
202
|
-
* The prompt the reference draws at the head of an input row, in the grey it
|
|
203
|
-
* uses for one (#9AA0A6), painted foreground-only so anything drawn behind the
|
|
204
|
-
* row survives.
|
|
205
|
-
*/
|
|
206
|
-
/** A rule drawn in the prompt's own grey, as the reference rules an input row. */
|
|
201
|
+
/** Draws the reference prompt rule foreground-only so underlying cells survive. */
|
|
207
202
|
export function promptRule(width) {
|
|
208
203
|
return `\u001b[38;2;154;160;166m${"─".repeat(Math.max(0, width))}\u001b[39m`;
|
|
209
204
|
}
|
|
@@ -224,7 +219,7 @@ export function renderInputRow(input, width, options = {}) {
|
|
|
224
219
|
const before = view.text.slice(0, view.caretColumn);
|
|
225
220
|
const under = view.text.slice(view.caretColumn, view.caretColumn + 1) || " ";
|
|
226
221
|
const after = view.text.slice(view.caretColumn + 1);
|
|
227
|
-
//
|
|
222
|
+
// Rationale: typed text is left unpainted, the caret reverses its cell, and the
|
|
228
223
|
// placeholder is quietened by weight rather than by a colour of its own.
|
|
229
224
|
const body = empty
|
|
230
225
|
? `${caretCell(placeholder.slice(0, 1))}${faint(placeholder.slice(1))}`
|
|
@@ -1,10 +1,4 @@
|
|
|
1
1
|
import type { UiTheme } from "./theme.js";
|
|
2
|
-
/**
|
|
3
|
-
* A list of things that each carry a label and a value. It owns where a value
|
|
4
|
-
* starts, how a row reads when it is selected or pointed at, and which part of a
|
|
5
|
-
* row the pointer is on — so a screen decides what a row means and this decides
|
|
6
|
-
* how it looks and where it can be touched.
|
|
7
|
-
*/
|
|
8
2
|
/** The part of a row the pointer is over. A label selects; a value acts. */
|
|
9
3
|
export type ListRegion = "label" | "value" | "minus" | "plus";
|
|
10
4
|
/** Columns a stepper's controls occupy on either side of the value. */
|
|
@@ -6,8 +6,8 @@ export const STEPPER_RESERVE = 2;
|
|
|
6
6
|
* and with the stepper's columns reserved for every row when any row has one, so
|
|
7
7
|
* a number does not shift its own value out of the column it shares.
|
|
8
8
|
*/
|
|
9
|
-
export function valueColumnFor(rows, indent =
|
|
10
|
-
const widest = Math.max(0, ...rows.map(row => displayWidth(row.label)));
|
|
9
|
+
export function valueColumnFor(rows, indent = 2, gap = 2) {
|
|
10
|
+
const widest = Math.min(30, Math.max(0, ...rows.map(row => displayWidth(row.label))));
|
|
11
11
|
const stepper = rows.some(row => row.stepper !== undefined) ? STEPPER_RESERVE : 0;
|
|
12
12
|
return indent + widest + gap + stepper;
|
|
13
13
|
}
|
|
@@ -22,14 +22,21 @@ export function renderGroupHeader(title, width, theme) {
|
|
|
22
22
|
*/
|
|
23
23
|
export function renderListRow(row, state, valueColumn, width, theme) {
|
|
24
24
|
const cursor = state.selected ? "→ " : " ";
|
|
25
|
-
const
|
|
26
|
-
const
|
|
25
|
+
const labelColumn = Math.max(displayWidth(row.label), valueColumn - 4 - (row.stepper === undefined ? 0 : STEPPER_RESERVE));
|
|
26
|
+
const labelPadded = `${row.label}${" ".repeat(Math.max(0, labelColumn - displayWidth(row.label)))}`;
|
|
27
|
+
const leftRaw = `${cursor}${labelPadded}`;
|
|
28
|
+
const left = state.selected
|
|
29
|
+
? `${theme.fg("accent", cursor)}${theme.fg("accent", labelPadded)}`
|
|
30
|
+
: `${cursor}${theme.plain(labelPadded)}`;
|
|
27
31
|
const gap = Math.max(2, valueColumn - displayWidth(leftRaw));
|
|
28
|
-
//
|
|
29
|
-
//
|
|
32
|
+
// Compatibility: pinned SettingsList gives the selected label and value the same accent
|
|
33
|
+
// role. Pointer hover may brighten an unselected value without changing the
|
|
34
|
+
// keyboard selection.
|
|
30
35
|
const valueHovered = state.hovered && state.region !== "label";
|
|
31
36
|
const stepper = row.stepper !== undefined && valueHovered;
|
|
32
|
-
const value =
|
|
37
|
+
const value = state.selected
|
|
38
|
+
? theme.fg("accent", row.value)
|
|
39
|
+
: valueHovered ? theme.plain(row.value) : theme.fg("muted", row.value);
|
|
33
40
|
const minus = stepper
|
|
34
41
|
? row.stepper?.lower === true
|
|
35
42
|
? state.region === "minus" ? theme.plain("- ") : theme.fg("dim", "- ")
|
|
@@ -13,3 +13,13 @@ export interface ParsedMouseInput {
|
|
|
13
13
|
}
|
|
14
14
|
/** Extracts SGR mouse reports, leaving any keyboard input untouched. */
|
|
15
15
|
export declare function parseMouseInput(data: string): ParsedMouseInput;
|
|
16
|
+
export interface RoutedMouseInput {
|
|
17
|
+
/** Input left for the TUI after only claimed reports were removed. */
|
|
18
|
+
readonly data: string;
|
|
19
|
+
readonly consumed: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Routes every SGR report independently, preserving keyboard bytes and mouse
|
|
23
|
+
* reports the caller does not claim even when they share one physical chunk.
|
|
24
|
+
*/
|
|
25
|
+
export declare function routeMouseInput(data: string, claim: (event: PaneMouseEvent) => boolean): RoutedMouseInput;
|
|
@@ -30,6 +30,29 @@ export function parseMouseInput(data) {
|
|
|
30
30
|
rest += data.slice(index);
|
|
31
31
|
return { events: Object.freeze(events), rest };
|
|
32
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Routes every SGR report independently, preserving keyboard bytes and mouse
|
|
35
|
+
* reports the caller does not claim even when they share one physical chunk.
|
|
36
|
+
*/
|
|
37
|
+
export function routeMouseInput(data, claim) {
|
|
38
|
+
if (!data.includes("\u001b[<"))
|
|
39
|
+
return { data, consumed: false };
|
|
40
|
+
let output = "";
|
|
41
|
+
let index = 0;
|
|
42
|
+
let consumed = false;
|
|
43
|
+
SGR_PATTERN.lastIndex = 0;
|
|
44
|
+
for (let match = SGR_PATTERN.exec(data); match !== null; match = SGR_PATTERN.exec(data)) {
|
|
45
|
+
output += data.slice(index, match.index);
|
|
46
|
+
index = match.index + match[0].length;
|
|
47
|
+
const event = toEvent(Number.parseInt(match[1] ?? "", 10), Number.parseInt(match[2] ?? "", 10), Number.parseInt(match[3] ?? "", 10), match[4] === "m");
|
|
48
|
+
if (event !== null && claim(event))
|
|
49
|
+
consumed = true;
|
|
50
|
+
else
|
|
51
|
+
output += match[0];
|
|
52
|
+
}
|
|
53
|
+
output += data.slice(index);
|
|
54
|
+
return { data: output, consumed };
|
|
55
|
+
}
|
|
33
56
|
function toEvent(code, column, row, released) {
|
|
34
57
|
if ((code & 64) !== 0) {
|
|
35
58
|
const kind = (code & 1) === 0 ? "wheel-up" : "wheel-down";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface TimestampedPromptRowsInput {
|
|
2
|
+
readonly width: number;
|
|
3
|
+
readonly sourceTimestamp: number | Date;
|
|
4
|
+
readonly render: (contentWidth: number) => readonly string[];
|
|
5
|
+
/** Styles the reserved suffix while keeping policy independent of a vendor theme. */
|
|
6
|
+
readonly decorateSuffix?: (text: string, firstRow: boolean) => string;
|
|
7
|
+
readonly minimumWidth?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function formatPromptTimestamp(source: number | Date): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* Reserves timestamp columns before wrapping, so the clock never overwrites
|
|
12
|
+
* prompt content. At narrow widths the same renderer is used without a clock.
|
|
13
|
+
*/
|
|
14
|
+
export declare function composeTimestampedPromptRows(input: TimestampedPromptRowsInput): readonly string[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { overlaySpan } from "./spans.js";
|
|
2
|
+
export function formatPromptTimestamp(source) {
|
|
3
|
+
const date = source instanceof Date ? source : new Date(source);
|
|
4
|
+
if (Number.isNaN(date.getTime()))
|
|
5
|
+
return null;
|
|
6
|
+
return `${String(date.getHours()).padStart(2, "0")}:${String(date.getMinutes()).padStart(2, "0")}`;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Reserves timestamp columns before wrapping, so the clock never overwrites
|
|
10
|
+
* prompt content. At narrow widths the same renderer is used without a clock.
|
|
11
|
+
*/
|
|
12
|
+
export function composeTimestampedPromptRows(input) {
|
|
13
|
+
const timestamp = formatPromptTimestamp(input.sourceTimestamp);
|
|
14
|
+
if (timestamp === null || input.width < (input.minimumWidth ?? 20))
|
|
15
|
+
return input.render(input.width);
|
|
16
|
+
const suffixWidth = timestamp.length + 2;
|
|
17
|
+
const contentWidth = Math.max(1, input.width - suffixWidth);
|
|
18
|
+
const decorate = input.decorateSuffix ?? ((text) => text);
|
|
19
|
+
return input.render(contentWidth).map((row, index) => overlaySpan(row, contentWidth, input.width, decorate(index === 0 ? ` ${timestamp}` : " ".repeat(suffixWidth), index === 0)));
|
|
20
|
+
}
|
|
@@ -19,6 +19,30 @@ export interface ScrollbarInput {
|
|
|
19
19
|
readonly scroll: number;
|
|
20
20
|
readonly trackHeight: number;
|
|
21
21
|
}
|
|
22
|
+
export type ScrollbarAppearance = "auto" | "always" | "hidden";
|
|
23
|
+
export type ScrollbarStyle = "thin" | "thick";
|
|
24
|
+
export type ScrollbarSpeed = "normal" | "fast" | "high";
|
|
25
|
+
/** Wheel distance: normal (3), fast (6), high as normal + fast (9). */
|
|
26
|
+
export declare function scrollbarWheelRows(speed: ScrollbarSpeed): number;
|
|
27
|
+
/** Selection edge distance uses the same configured rate as a wheel event. */
|
|
28
|
+
export declare function scrollbarSelectionRows(speed: ScrollbarSpeed): number;
|
|
29
|
+
export interface ScrollbarPresentationInput {
|
|
30
|
+
readonly geometry: ScrollbarGeometry | null;
|
|
31
|
+
readonly appearance: ScrollbarAppearance;
|
|
32
|
+
readonly style: ScrollbarStyle;
|
|
33
|
+
readonly hovered: boolean;
|
|
34
|
+
readonly dragging: boolean;
|
|
35
|
+
readonly activeUntil: number;
|
|
36
|
+
readonly now: number;
|
|
37
|
+
}
|
|
38
|
+
export interface ScrollbarPresentation {
|
|
39
|
+
readonly visible: boolean;
|
|
40
|
+
readonly reservesSpace: boolean;
|
|
41
|
+
readonly trackGlyph: "│" | "┃";
|
|
42
|
+
readonly thumbGlyph: "│" | "┃";
|
|
43
|
+
}
|
|
44
|
+
/** Pure appearance decision; activity time is supplied so tests own the clock. */
|
|
45
|
+
export declare function scrollbarPresentation(input: ScrollbarPresentationInput): ScrollbarPresentation;
|
|
22
46
|
/** Null when the content fits: no scrollbar is drawn and no width is reserved. */
|
|
23
47
|
export declare function scrollbarGeometry(input: ScrollbarInput): ScrollbarGeometry | null;
|
|
24
48
|
export declare function scrollbarReservesSpace(geometry: ScrollbarGeometry | null): boolean;
|
|
@@ -48,6 +72,8 @@ export interface RailPointer {
|
|
|
48
72
|
*/
|
|
49
73
|
export declare class ScrollbarRails {
|
|
50
74
|
#private;
|
|
75
|
+
noteActivity(key: string, now: number, lingerMs?: number): void;
|
|
76
|
+
isRecentlyActive(key: string, now: number): boolean;
|
|
51
77
|
isHovered(key: string): boolean;
|
|
52
78
|
isDragging(key: string): boolean;
|
|
53
79
|
get draggingKey(): string | null;
|
|
@@ -3,6 +3,33 @@
|
|
|
3
3
|
* rail rather than to a global, because two scrollable surfaces can be visible
|
|
4
4
|
* at once and a shared flag lights up the wrong one.
|
|
5
5
|
*/
|
|
6
|
+
/** Wheel distance: normal (3), fast (6), high as normal + fast (9). */
|
|
7
|
+
export function scrollbarWheelRows(speed) {
|
|
8
|
+
return speed === "high" ? 9 : speed === "fast" ? 6 : 3;
|
|
9
|
+
}
|
|
10
|
+
/** Selection edge distance uses the same configured rate as a wheel event. */
|
|
11
|
+
export function scrollbarSelectionRows(speed) {
|
|
12
|
+
return scrollbarWheelRows(speed);
|
|
13
|
+
}
|
|
14
|
+
/** Pure appearance decision; activity time is supplied so tests own the clock. */
|
|
15
|
+
export function scrollbarPresentation(input) {
|
|
16
|
+
const overflowing = input.geometry !== null;
|
|
17
|
+
// Invariant: auto/always reserve the final rail cell even while content fits.
|
|
18
|
+
// The blank gutter prevents prompt timestamps from touching the terminal edge
|
|
19
|
+
// and keeps later scrollbar appearance from reflowing the transcript.
|
|
20
|
+
const reservesSpace = input.appearance !== "hidden";
|
|
21
|
+
const visible = overflowing && reservesSpace && (input.appearance === "always"
|
|
22
|
+
|| input.hovered
|
|
23
|
+
|| input.dragging
|
|
24
|
+
|| (input.activeUntil > 0 && input.now <= input.activeUntil));
|
|
25
|
+
const thick = input.style === "thick";
|
|
26
|
+
return {
|
|
27
|
+
visible,
|
|
28
|
+
reservesSpace,
|
|
29
|
+
trackGlyph: thick ? "┃" : "│",
|
|
30
|
+
thumbGlyph: thick || input.hovered || input.dragging ? "┃" : "│",
|
|
31
|
+
};
|
|
32
|
+
}
|
|
6
33
|
/** Null when the content fits: no scrollbar is drawn and no width is reserved. */
|
|
7
34
|
export function scrollbarGeometry(input) {
|
|
8
35
|
const { contentLength, viewportHeight, trackHeight } = input;
|
|
@@ -51,7 +78,14 @@ export function scrollForTrackPage(geometry, trackRow, scroll, viewportHeight) {
|
|
|
51
78
|
*/
|
|
52
79
|
export class ScrollbarRails {
|
|
53
80
|
#hovered = new Set();
|
|
81
|
+
#activeUntil = new Map();
|
|
54
82
|
#dragging;
|
|
83
|
+
noteActivity(key, now, lingerMs = 900) {
|
|
84
|
+
this.#activeUntil.set(key, Math.max(this.#activeUntil.get(key) ?? 0, now + Math.max(0, lingerMs)));
|
|
85
|
+
}
|
|
86
|
+
isRecentlyActive(key, now) {
|
|
87
|
+
return now <= (this.#activeUntil.get(key) ?? 0);
|
|
88
|
+
}
|
|
55
89
|
isHovered(key) {
|
|
56
90
|
return this.#hovered.has(key);
|
|
57
91
|
}
|
|
@@ -97,6 +131,7 @@ export class ScrollbarRails {
|
|
|
97
131
|
}
|
|
98
132
|
clear() {
|
|
99
133
|
this.#hovered.clear();
|
|
134
|
+
this.#activeUntil.clear();
|
|
100
135
|
this.#dragging = undefined;
|
|
101
136
|
}
|
|
102
137
|
}
|
|
@@ -40,6 +40,7 @@ export interface ShortcutRegistryResult {
|
|
|
40
40
|
*/
|
|
41
41
|
export declare function assembleShortcuts(declarations: readonly ShortcutDeclaration[]): ShortcutRegistryResult;
|
|
42
42
|
export declare function assertNoShortcutConflicts(result: ShortcutRegistryResult): void;
|
|
43
|
+
/** Keeps shortcut dispatch and reader-facing listings derived from one ordered declaration set. */
|
|
43
44
|
export declare class ShortcutRegistry<Action extends string = string> {
|
|
44
45
|
#private;
|
|
45
46
|
declare(declaration: ShortcutDeclaration, action: Action): void;
|
|
@@ -40,6 +40,7 @@ export function assertNoShortcutConflicts(result) {
|
|
|
40
40
|
+ `"${duplicate.descriptions[0]}" and "${duplicate.descriptions[1]}"`);
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
+
/** Keeps shortcut dispatch and reader-facing listings derived from one ordered declaration set. */
|
|
43
44
|
export class ShortcutRegistry {
|
|
44
45
|
#declarations = [];
|
|
45
46
|
#actions = new Map();
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replaces the visible columns `[from, to)` of `line` with `span`, preserving
|
|
3
|
+
* the styling before it and re-asserting whatever was still open afterwards, so
|
|
4
|
+
* the tail keeps the colour it had. A wide character straddling either edge is
|
|
5
|
+
* replaced by spaces rather than split.
|
|
6
|
+
*/
|
|
7
|
+
export declare function overlaySpan(line: string, from: number, to: number, span: string): string;
|
|
8
|
+
/** Wraps visible columns `[from,to)` in an explicit OSC 8 hyperlink. */
|
|
9
|
+
export declare function hyperlinkSgrSpan(line: string, from: number, to: number, target: string, widthOf?: (text: string) => number): string;
|
|
10
|
+
/** Returns the OSC 8 target painted at a zero-based visible terminal column. */
|
|
11
|
+
export declare function hyperlinkTargetAtColumn(line: string, targetColumn: number, widthOf?: (text: string) => number): string | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Gives existing and bare web links explicit, tightly bounded OSC 8 regions so
|
|
14
|
+
* the terminal owns dotted-idle/solid-hover decoration without leaking hover
|
|
15
|
+
* state into cells repainted during scrolling.
|
|
16
|
+
*/
|
|
17
|
+
export declare function nativeHyperlinkStyle(line: string, color?: (text: string, target: string) => string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Held-button paint for terminal-native links. OSC 8 is removed so the terminal
|
|
20
|
+
* cannot switch a selected link to its solid hover underline. A dotted SGR
|
|
21
|
+
* underline preserves the idle appearance, and VS15 transiently breaks native
|
|
22
|
+
* plain-text URL detection without changing visible width.
|
|
23
|
+
*/
|
|
24
|
+
export declare function heldNativeHyperlinkStyle(line: string): string;
|
|
25
|
+
export declare function backgroundSgrSpan(line: string, from: number, to: number, on?: string, off?: string, widthOf?: (text: string) => number): string;
|