@timurproko/a1 0.1.8-dev.235df0e → 0.1.8-dev.259
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 +23 -6
- package/dist/{src/foundation → foundation}/release/bootstrap.js +120 -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 +78 -0
- package/dist/foundation/release/dependency-layer.js +488 -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 +4 -2
- package/dist/{src/foundation → foundation}/release/release-store.js +64 -12
- 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 +77 -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
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { canonicalizeClipboardImage } from "./clipboard-image.js";
|
|
3
|
+
const MAX_CLIPBOARD_BYTES = 16 * 1024 * 1024;
|
|
4
|
+
let nativeClipboardPromise;
|
|
5
|
+
let pendingClipboardWrite = Promise.resolve();
|
|
6
|
+
/** Load the native adapter during shell startup so the first paste is warm. */
|
|
7
|
+
export function preloadSystemClipboard() {
|
|
8
|
+
if (process.platform === "win32" || process.platform === "darwin")
|
|
9
|
+
void nativeClipboard();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Reads plain text through platform clipboard commands without importing Pi's
|
|
13
|
+
* private clipboard module. Failures are deliberately non-fatal: a denied or
|
|
14
|
+
* unavailable clipboard simply makes the paste action a no-op.
|
|
15
|
+
*/
|
|
16
|
+
export async function readSystemClipboardContent() {
|
|
17
|
+
await pendingClipboardWrite;
|
|
18
|
+
const native = await nativeClipboard();
|
|
19
|
+
if (native !== null) {
|
|
20
|
+
try {
|
|
21
|
+
if (process.platform === "win32" && native.availableFormats().some(isFileDropFormat)) {
|
|
22
|
+
const files = await readSystemClipboardText();
|
|
23
|
+
if (files !== null)
|
|
24
|
+
return { kind: "text", text: files };
|
|
25
|
+
}
|
|
26
|
+
const image = await readSystemClipboardImage(native);
|
|
27
|
+
if (image !== null)
|
|
28
|
+
return { kind: "image", ...image };
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Compatibility: fall through to text and platform readers.
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const text = await readSystemClipboardText();
|
|
35
|
+
return text === null ? null : { kind: "text", text };
|
|
36
|
+
}
|
|
37
|
+
export async function readSystemClipboardImage(reader) {
|
|
38
|
+
if (!reader.hasImage())
|
|
39
|
+
return null;
|
|
40
|
+
if (reader.getImageBinary !== undefined) {
|
|
41
|
+
try {
|
|
42
|
+
const bytes = await reader.getImageBinary();
|
|
43
|
+
if (bytes.length > 0 && bytes.every(byte => Number.isInteger(byte) && byte >= 0 && byte <= 255)) {
|
|
44
|
+
return canonicalizeClipboardImage({
|
|
45
|
+
data: Buffer.from(bytes).toString("base64"),
|
|
46
|
+
mimeType: "image/png",
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Compatibility: older or partially available native bindings may still expose base64.
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (reader.getImageBase64 !== undefined) {
|
|
55
|
+
try {
|
|
56
|
+
return canonicalizeClipboardImage({
|
|
57
|
+
data: await reader.getImageBase64(),
|
|
58
|
+
mimeType: "image/png",
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Compatibility: fall through to the caller's text path.
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
export async function readSystemClipboardText() {
|
|
68
|
+
// Concurrency: Ctrl+C/Ctrl+X and Ctrl+V can arrive in adjacent input turns. Serialize the
|
|
69
|
+
// read behind our native write so paste never observes the previous value.
|
|
70
|
+
await pendingClipboardWrite;
|
|
71
|
+
if (process.platform === "win32" || process.platform === "darwin") {
|
|
72
|
+
const native = await nativeClipboard();
|
|
73
|
+
if (native !== null) {
|
|
74
|
+
try {
|
|
75
|
+
const text = await native.getText();
|
|
76
|
+
if (text.length > 0)
|
|
77
|
+
return text;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Compatibility: fall through to the platform command.
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (process.platform === "win32") {
|
|
85
|
+
const script = [
|
|
86
|
+
"[Console]::OutputEncoding=[System.Text.Encoding]::UTF8",
|
|
87
|
+
"$t=Get-Clipboard -Raw -ErrorAction SilentlyContinue",
|
|
88
|
+
"if ($null -ne $t -and $t.Length -gt 0) {[Console]::Out.Write($t)} else {$f=Get-Clipboard -Format FileDropList -ErrorAction SilentlyContinue; if ($f) {[Console]::Out.Write(($f | ForEach-Object {$_.FullName}) -join [Environment]::NewLine)}}",
|
|
89
|
+
].join("; ");
|
|
90
|
+
return execClipboard("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", script]);
|
|
91
|
+
}
|
|
92
|
+
if (process.platform === "darwin")
|
|
93
|
+
return execClipboard("pbpaste", []);
|
|
94
|
+
return (await execClipboard("wl-paste", ["--no-newline", "--type", "text"]))
|
|
95
|
+
?? execClipboard("xclip", ["-selection", "clipboard", "-o"]);
|
|
96
|
+
}
|
|
97
|
+
export function writeSystemClipboardText(text) {
|
|
98
|
+
const write = async () => {
|
|
99
|
+
const native = await nativeClipboard();
|
|
100
|
+
if (native !== null) {
|
|
101
|
+
try {
|
|
102
|
+
await native.setText(text);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Compatibility: the caller still emits its terminal clipboard fallback.
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
const operation = pendingClipboardWrite.then(write, write);
|
|
111
|
+
pendingClipboardWrite = operation.catch(() => { });
|
|
112
|
+
return operation;
|
|
113
|
+
}
|
|
114
|
+
function nativeClipboard() {
|
|
115
|
+
nativeClipboardPromise ??= import("@mariozechner/clipboard").catch(() => null);
|
|
116
|
+
return nativeClipboardPromise;
|
|
117
|
+
}
|
|
118
|
+
function isFileDropFormat(format) {
|
|
119
|
+
return /(?:filedrop|hdrop|shell idlist)/iu.test(format);
|
|
120
|
+
}
|
|
121
|
+
function execClipboard(command, args) {
|
|
122
|
+
return new Promise(resolve => {
|
|
123
|
+
execFile(command, args, {
|
|
124
|
+
encoding: "utf8",
|
|
125
|
+
maxBuffer: MAX_CLIPBOARD_BYTES,
|
|
126
|
+
timeout: 5_000,
|
|
127
|
+
windowsHide: true,
|
|
128
|
+
}, (error, stdout) => resolve(error || stdout.length === 0 ? null : stdout));
|
|
129
|
+
});
|
|
130
|
+
}
|
package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.d.ts
RENAMED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import type { PiTuiComponentPort, PiTuiInputListener, PiTuiOverlayHandle, PiTuiOverlayOptions, PiTuiRuntimeAdapterOptions, PiTuiRuntimeState, PiTuiScrollState, PiTuiStopOptions, PiTuiViewport } from "./contracts.js";
|
|
1
|
+
import type { PiTuiComponentPort, PiTuiInputListener, PiTuiOverlayHandle, PiTuiOverlayOptions, PiTuiPreInputListener, PiTuiRuntimeAdapterOptions, PiTuiRuntimeState, PiTuiScrollState, PiTuiStopOptions, PiTuiViewport } from "./contracts.js";
|
|
2
2
|
export type PiTuiRuntimeErrorStage = "construction" | "start" | "input-drain" | "restoration";
|
|
3
|
+
/** Identifies the Pi TUI lifecycle stage that failed while preserving the original cause. */
|
|
3
4
|
export declare class PiTuiRuntimeError extends Error {
|
|
4
5
|
readonly stage: PiTuiRuntimeErrorStage;
|
|
5
6
|
constructor(stage: PiTuiRuntimeErrorStage, cause: unknown);
|
|
6
7
|
}
|
|
8
|
+
/** Bridges neutral presentation ports to one Pi TUI instance and owns terminal restoration on stop. */
|
|
7
9
|
export declare class PiTuiRuntimeAdapter {
|
|
8
10
|
#private;
|
|
9
11
|
constructor(options: PiTuiRuntimeAdapterOptions);
|
|
@@ -26,11 +28,16 @@ export declare class PiTuiRuntimeAdapter {
|
|
|
26
28
|
* the transparent and pinned paths never call it.
|
|
27
29
|
*/
|
|
28
30
|
writeControl(data: string): void;
|
|
31
|
+
addPreInputListener(listener: PiTuiPreInputListener): () => void;
|
|
29
32
|
addInputListener(listener: PiTuiInputListener): () => void;
|
|
30
33
|
switchMode(mode: "regular" | "fullscreen"): boolean;
|
|
31
34
|
setHardwareCursor(enabled: boolean): void;
|
|
32
35
|
getHardwareCursor(): boolean;
|
|
36
|
+
setClearOnShrink(enabled: boolean): void;
|
|
37
|
+
getClearOnShrink(): boolean;
|
|
38
|
+
setTerminalProgress(active: boolean): void;
|
|
33
39
|
setTitle(title: string): void;
|
|
40
|
+
writeAfterStop(text: string): void;
|
|
34
41
|
invalidate(): void;
|
|
35
42
|
requestRender(force?: boolean): void;
|
|
36
43
|
renderNow(force?: boolean): void;
|
package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/adapter.js
RENAMED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { HStack, ProcessTerminal, ScrollView, TuiAltScreen, TuiMainScreen, VStack, visibleWidth, } from "#pi-tui";
|
|
2
|
+
import { InputPresentationCoordinator, } from "./input-presentation-coordinator.js";
|
|
3
|
+
/** Identifies the Pi TUI lifecycle stage that failed while preserving the original cause. */
|
|
2
4
|
export class PiTuiRuntimeError extends Error {
|
|
3
5
|
stage;
|
|
4
6
|
constructor(stage, cause) {
|
|
@@ -9,9 +11,11 @@ export class PiTuiRuntimeError extends Error {
|
|
|
9
11
|
}
|
|
10
12
|
class ComponentBridge {
|
|
11
13
|
port;
|
|
14
|
+
traceComposition;
|
|
12
15
|
#focused = false;
|
|
13
|
-
constructor(port) {
|
|
16
|
+
constructor(port, traceComposition) {
|
|
14
17
|
this.port = port;
|
|
18
|
+
this.traceComposition = traceComposition;
|
|
15
19
|
}
|
|
16
20
|
get focused() {
|
|
17
21
|
return this.#focused;
|
|
@@ -24,12 +28,18 @@ class ComponentBridge {
|
|
|
24
28
|
return this.port.wantsKeyRelease ?? false;
|
|
25
29
|
}
|
|
26
30
|
render(width) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
this.traceComposition?.("composition-start");
|
|
32
|
+
try {
|
|
33
|
+
const lines = [...this.port.render(width)];
|
|
34
|
+
const overflow = lines.findIndex(line => visibleWidth(line) > width);
|
|
35
|
+
if (overflow >= 0) {
|
|
36
|
+
throw new RangeError(`Pi TUI component row ${overflow} exceeds available width ${width}`);
|
|
37
|
+
}
|
|
38
|
+
return lines;
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
this.traceComposition?.("composition-end");
|
|
31
42
|
}
|
|
32
|
-
return lines;
|
|
33
43
|
}
|
|
34
44
|
handleInput(data) {
|
|
35
45
|
this.port.handleInput?.(data);
|
|
@@ -79,8 +89,10 @@ class OverlayHandleBridge {
|
|
|
79
89
|
return !this.#disposed && this.handle.isFocused();
|
|
80
90
|
}
|
|
81
91
|
}
|
|
92
|
+
/** Bridges neutral presentation ports to one Pi TUI instance and owns terminal restoration on stop. */
|
|
82
93
|
export class PiTuiRuntimeAdapter {
|
|
83
94
|
#terminal;
|
|
95
|
+
#tuiTerminal;
|
|
84
96
|
#tui;
|
|
85
97
|
#root;
|
|
86
98
|
#layoutRoot;
|
|
@@ -91,16 +103,53 @@ export class PiTuiRuntimeAdapter {
|
|
|
91
103
|
#mountedComponents = new Set();
|
|
92
104
|
#scrollViews = new Map();
|
|
93
105
|
#overlayDisposers = new Set();
|
|
106
|
+
#overlayInputCoordination = new Map();
|
|
94
107
|
#inputListeners = new Map();
|
|
108
|
+
#preInputListeners = new Set();
|
|
109
|
+
#inputCoordinator;
|
|
110
|
+
#inputDiagnostics;
|
|
111
|
+
#diagnosticNow;
|
|
112
|
+
#inputSink;
|
|
95
113
|
#state = "idle";
|
|
96
114
|
#stopPromise;
|
|
97
115
|
#rootDisposed = false;
|
|
116
|
+
#terminalProgress = false;
|
|
98
117
|
constructor(options) {
|
|
99
118
|
this.#root = options.root;
|
|
100
119
|
this.#terminal = options.terminal ?? new ProcessTerminal();
|
|
120
|
+
this.#inputDiagnostics = options.inputDiagnostics;
|
|
121
|
+
this.#diagnosticNow = options.inputDiagnostics?.now ?? (() => performance.now());
|
|
122
|
+
const tracedTerminal = options.inputDiagnostics === undefined
|
|
123
|
+
? this.#terminal
|
|
124
|
+
: diagnosticTerminal(this.#terminal, phase => this.#traceRuntimePhase(phase));
|
|
125
|
+
const decoratedTerminal = options.decorateTerminal?.(tracedTerminal) ?? tracedTerminal;
|
|
126
|
+
const coordination = options.inputCoordination ?? (options.inputDiagnostics === undefined
|
|
127
|
+
? undefined
|
|
128
|
+
: { classify: () => "barrier" });
|
|
129
|
+
this.#inputCoordinator = coordination === undefined
|
|
130
|
+
? undefined
|
|
131
|
+
: new InputPresentationCoordinator({
|
|
132
|
+
classify: data => coordination.classify(data, this.#focusedOverlayInputCoordination()),
|
|
133
|
+
deliver: data => {
|
|
134
|
+
const routed = this.#routePreInput(data);
|
|
135
|
+
if (routed.length > 0)
|
|
136
|
+
this.#inputSink?.(routed);
|
|
137
|
+
},
|
|
138
|
+
...(coordination.onReceipt === undefined ? {} : { onReceipt: coordination.onReceipt }),
|
|
139
|
+
...(coordination.scheduler === undefined ? {} : { scheduler: coordination.scheduler }),
|
|
140
|
+
now: this.#diagnosticNow,
|
|
141
|
+
...(options.inputDiagnostics === undefined ? {} : {
|
|
142
|
+
onTrace: event => this.#traceInputCoordination(event),
|
|
143
|
+
}),
|
|
144
|
+
});
|
|
145
|
+
this.#tuiTerminal = this.#inputCoordinator === undefined
|
|
146
|
+
? preInputTerminal(decoratedTerminal, data => this.#routePreInput(data))
|
|
147
|
+
: coordinatedInputTerminal(decoratedTerminal, this.#inputCoordinator, sink => { this.#inputSink = sink; });
|
|
101
148
|
this.#layoutRoot = options.layoutRoot;
|
|
102
149
|
this.#logDirectory = options.logDirectory;
|
|
103
|
-
this.#rootBridge = new ComponentBridge(options.root
|
|
150
|
+
this.#rootBridge = new ComponentBridge(options.root, options.inputDiagnostics === undefined
|
|
151
|
+
? undefined
|
|
152
|
+
: phase => this.#traceRuntimePhase(phase));
|
|
104
153
|
this.#bridges.set(options.root, this.#rootBridge);
|
|
105
154
|
this.#mountedComponents.add(options.root);
|
|
106
155
|
try {
|
|
@@ -220,10 +269,12 @@ export class PiTuiRuntimeAdapter {
|
|
|
220
269
|
return;
|
|
221
270
|
hidden = true;
|
|
222
271
|
this.#overlayDisposers.delete(dispose);
|
|
272
|
+
this.#overlayInputCoordination.delete(bridge);
|
|
223
273
|
this.#bridges.delete(component);
|
|
224
274
|
component.dispose?.();
|
|
225
275
|
};
|
|
226
276
|
this.#overlayDisposers.add(dispose);
|
|
277
|
+
this.#overlayInputCoordination.set(bridge, options?.inputCoordination ?? "opaque");
|
|
227
278
|
const handle = this.#tui.showOverlay(bridge, toOverlayOptions(options));
|
|
228
279
|
return new OverlayHandleBridge(handle, target => this.#bridgeFor(target), dispose);
|
|
229
280
|
}
|
|
@@ -239,6 +290,12 @@ export class PiTuiRuntimeAdapter {
|
|
|
239
290
|
this.#assertRunning("control sequence");
|
|
240
291
|
this.#terminal.write(data);
|
|
241
292
|
}
|
|
293
|
+
addPreInputListener(listener) {
|
|
294
|
+
if (this.#preInputListeners.has(listener))
|
|
295
|
+
throw new TypeError("Pi TUI pre-input listener is already registered");
|
|
296
|
+
this.#preInputListeners.add(listener);
|
|
297
|
+
return () => this.#preInputListeners.delete(listener);
|
|
298
|
+
}
|
|
242
299
|
addInputListener(listener) {
|
|
243
300
|
this.#assertRunning("input listener");
|
|
244
301
|
if (this.#inputListeners.has(listener))
|
|
@@ -292,9 +349,26 @@ export class PiTuiRuntimeAdapter {
|
|
|
292
349
|
getHardwareCursor() {
|
|
293
350
|
return this.#tui.getShowHardwareCursor();
|
|
294
351
|
}
|
|
352
|
+
setClearOnShrink(enabled) {
|
|
353
|
+
this.#tui.setClearOnShrink(enabled);
|
|
354
|
+
}
|
|
355
|
+
getClearOnShrink() {
|
|
356
|
+
return this.#tui.getClearOnShrink();
|
|
357
|
+
}
|
|
358
|
+
setTerminalProgress(active) {
|
|
359
|
+
if (this.#terminalProgress === active)
|
|
360
|
+
return;
|
|
361
|
+
this.#terminal.setProgress(active);
|
|
362
|
+
this.#terminalProgress = active;
|
|
363
|
+
}
|
|
295
364
|
setTitle(title) {
|
|
296
365
|
this.#terminal.setTitle(title);
|
|
297
366
|
}
|
|
367
|
+
writeAfterStop(text) {
|
|
368
|
+
if (this.#state !== "stopped")
|
|
369
|
+
throw new Error("terminal output requires a stopped Pi TUI runtime");
|
|
370
|
+
this.#terminal.write(text);
|
|
371
|
+
}
|
|
298
372
|
invalidate() {
|
|
299
373
|
this.#tui.invalidate();
|
|
300
374
|
if (this.active)
|
|
@@ -313,6 +387,8 @@ export class PiTuiRuntimeAdapter {
|
|
|
313
387
|
return this.#stopPromise;
|
|
314
388
|
if (this.#state === "idle") {
|
|
315
389
|
this.#state = "stopped";
|
|
390
|
+
this.#clearTerminalProgress();
|
|
391
|
+
this.#preInputListeners.clear();
|
|
316
392
|
this.#disposeRoot();
|
|
317
393
|
return Promise.resolve();
|
|
318
394
|
}
|
|
@@ -326,6 +402,7 @@ export class PiTuiRuntimeAdapter {
|
|
|
326
402
|
}
|
|
327
403
|
async #stop(options) {
|
|
328
404
|
this.#state = "stopping";
|
|
405
|
+
this.#inputCoordinator?.flush();
|
|
329
406
|
let failure;
|
|
330
407
|
if (options.drainInput !== false) {
|
|
331
408
|
try {
|
|
@@ -344,6 +421,7 @@ export class PiTuiRuntimeAdapter {
|
|
|
344
421
|
this.#bestEffortTerminalRestore();
|
|
345
422
|
}
|
|
346
423
|
finally {
|
|
424
|
+
this.#clearTerminalProgress();
|
|
347
425
|
this.#disposeComponents();
|
|
348
426
|
}
|
|
349
427
|
this.#state = failure === undefined ? "stopped" : "failed";
|
|
@@ -352,8 +430,44 @@ export class PiTuiRuntimeAdapter {
|
|
|
352
430
|
}
|
|
353
431
|
#createTui(mode, hardwareCursor) {
|
|
354
432
|
return mode === "fullscreen"
|
|
355
|
-
? new TuiAltScreen(this.#
|
|
356
|
-
: new TuiMainScreen(this.#
|
|
433
|
+
? new TuiAltScreen(this.#tuiTerminal, hardwareCursor, this.#logDirectory, this.#tuiOptions)
|
|
434
|
+
: new TuiMainScreen(this.#tuiTerminal, hardwareCursor, this.#logDirectory);
|
|
435
|
+
}
|
|
436
|
+
#routePreInput(data) {
|
|
437
|
+
let current = data;
|
|
438
|
+
for (const listener of this.#preInputListeners) {
|
|
439
|
+
if (current.length === 0)
|
|
440
|
+
break;
|
|
441
|
+
const result = listener(current);
|
|
442
|
+
if (result?.data !== undefined)
|
|
443
|
+
current = result.data;
|
|
444
|
+
else if (result?.consume === true)
|
|
445
|
+
current = "";
|
|
446
|
+
}
|
|
447
|
+
return current;
|
|
448
|
+
}
|
|
449
|
+
#focusedOverlayInputCoordination() {
|
|
450
|
+
for (const [bridge, coordination] of this.#overlayInputCoordination) {
|
|
451
|
+
if (bridge.focused)
|
|
452
|
+
return coordination;
|
|
453
|
+
}
|
|
454
|
+
return undefined;
|
|
455
|
+
}
|
|
456
|
+
#traceInputCoordination(event) {
|
|
457
|
+
this.#inputDiagnostics?.onEvent(event);
|
|
458
|
+
}
|
|
459
|
+
#traceRuntimePhase(phase) {
|
|
460
|
+
if (this.#inputDiagnostics === undefined)
|
|
461
|
+
return;
|
|
462
|
+
const coordinator = this.#inputCoordinator;
|
|
463
|
+
this.#inputDiagnostics.onEvent({
|
|
464
|
+
phase,
|
|
465
|
+
revision: coordinator?.appliedRevision ?? 0,
|
|
466
|
+
atMs: this.#diagnosticNow(),
|
|
467
|
+
pendingDepth: coordinator?.pendingDepth ?? 0,
|
|
468
|
+
pendingPresentationDepth: coordinator?.pendingPresentation === true ? 1 : 0,
|
|
469
|
+
appliedRevision: coordinator?.appliedRevision ?? 0,
|
|
470
|
+
});
|
|
357
471
|
}
|
|
358
472
|
#mountTui(tui) {
|
|
359
473
|
tui.addChild(this.#rootBridge);
|
|
@@ -436,7 +550,15 @@ export class PiTuiRuntimeAdapter {
|
|
|
436
550
|
this.#bestEffortTerminalRestore();
|
|
437
551
|
}
|
|
438
552
|
}
|
|
553
|
+
#clearTerminalProgress() {
|
|
554
|
+
try {
|
|
555
|
+
this.#terminal.setProgress(false);
|
|
556
|
+
}
|
|
557
|
+
catch { }
|
|
558
|
+
this.#terminalProgress = false;
|
|
559
|
+
}
|
|
439
560
|
#bestEffortTerminalRestore() {
|
|
561
|
+
this.#clearTerminalProgress();
|
|
440
562
|
try {
|
|
441
563
|
this.#terminal.showCursor();
|
|
442
564
|
}
|
|
@@ -455,14 +577,99 @@ export class PiTuiRuntimeAdapter {
|
|
|
455
577
|
this.#mountedComponents.clear();
|
|
456
578
|
}
|
|
457
579
|
#disposeComponents() {
|
|
580
|
+
this.#inputCoordinator?.dispose(false);
|
|
581
|
+
this.#inputSink = undefined;
|
|
458
582
|
for (const remove of this.#inputListeners.values())
|
|
459
583
|
remove();
|
|
460
584
|
this.#inputListeners.clear();
|
|
585
|
+
this.#preInputListeners.clear();
|
|
461
586
|
for (const dispose of [...this.#overlayDisposers])
|
|
462
587
|
dispose();
|
|
588
|
+
this.#overlayInputCoordination.clear();
|
|
463
589
|
this.#disposeRoot();
|
|
464
590
|
}
|
|
465
591
|
}
|
|
592
|
+
function coordinatedInputTerminal(terminal, coordinator, setSink) {
|
|
593
|
+
return {
|
|
594
|
+
get columns() { return terminal.columns; },
|
|
595
|
+
get rows() { return terminal.rows; },
|
|
596
|
+
get kittyProtocolActive() { return terminal.kittyProtocolActive; },
|
|
597
|
+
start(onInput, onResize) {
|
|
598
|
+
setSink(onInput);
|
|
599
|
+
terminal.start(data => coordinator.accept(data), () => {
|
|
600
|
+
coordinator.flush();
|
|
601
|
+
onResize();
|
|
602
|
+
});
|
|
603
|
+
},
|
|
604
|
+
stop() {
|
|
605
|
+
coordinator.flush();
|
|
606
|
+
setSink(undefined);
|
|
607
|
+
terminal.stop();
|
|
608
|
+
},
|
|
609
|
+
drainInput: (maxMs, idleMs) => terminal.drainInput(maxMs, idleMs),
|
|
610
|
+
write: data => terminal.write(data),
|
|
611
|
+
moveBy: lines => terminal.moveBy(lines),
|
|
612
|
+
hideCursor: () => terminal.hideCursor(),
|
|
613
|
+
showCursor: () => terminal.showCursor(),
|
|
614
|
+
clearLine: () => terminal.clearLine(),
|
|
615
|
+
clearFromCursor: () => terminal.clearFromCursor(),
|
|
616
|
+
clearScreen: () => terminal.clearScreen(),
|
|
617
|
+
setTitle: title => terminal.setTitle(title),
|
|
618
|
+
setProgress: active => terminal.setProgress(active),
|
|
619
|
+
};
|
|
620
|
+
}
|
|
621
|
+
function diagnosticTerminal(terminal, trace) {
|
|
622
|
+
return {
|
|
623
|
+
get columns() { return terminal.columns; },
|
|
624
|
+
get rows() { return terminal.rows; },
|
|
625
|
+
get kittyProtocolActive() { return terminal.kittyProtocolActive; },
|
|
626
|
+
start: (onInput, onResize) => terminal.start(onInput, onResize),
|
|
627
|
+
stop: () => terminal.stop(),
|
|
628
|
+
drainInput: (maxMs, idleMs) => terminal.drainInput(maxMs, idleMs),
|
|
629
|
+
write(data) {
|
|
630
|
+
trace("write-start");
|
|
631
|
+
try {
|
|
632
|
+
terminal.write(data);
|
|
633
|
+
}
|
|
634
|
+
finally {
|
|
635
|
+
trace("write-end");
|
|
636
|
+
}
|
|
637
|
+
},
|
|
638
|
+
moveBy: lines => terminal.moveBy(lines),
|
|
639
|
+
hideCursor: () => terminal.hideCursor(),
|
|
640
|
+
showCursor: () => terminal.showCursor(),
|
|
641
|
+
clearLine: () => terminal.clearLine(),
|
|
642
|
+
clearFromCursor: () => terminal.clearFromCursor(),
|
|
643
|
+
clearScreen: () => terminal.clearScreen(),
|
|
644
|
+
setTitle: title => terminal.setTitle(title),
|
|
645
|
+
setProgress: active => terminal.setProgress(active),
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
function preInputTerminal(terminal, route) {
|
|
649
|
+
return {
|
|
650
|
+
get columns() { return terminal.columns; },
|
|
651
|
+
get rows() { return terminal.rows; },
|
|
652
|
+
get kittyProtocolActive() { return terminal.kittyProtocolActive; },
|
|
653
|
+
start(onInput, onResize) {
|
|
654
|
+
terminal.start(data => {
|
|
655
|
+
const routed = route(data);
|
|
656
|
+
if (routed.length > 0)
|
|
657
|
+
onInput(routed);
|
|
658
|
+
}, onResize);
|
|
659
|
+
},
|
|
660
|
+
stop: () => terminal.stop(),
|
|
661
|
+
drainInput: (maxMs, idleMs) => terminal.drainInput(maxMs, idleMs),
|
|
662
|
+
write: data => terminal.write(data),
|
|
663
|
+
moveBy: lines => terminal.moveBy(lines),
|
|
664
|
+
hideCursor: () => terminal.hideCursor(),
|
|
665
|
+
showCursor: () => terminal.showCursor(),
|
|
666
|
+
clearLine: () => terminal.clearLine(),
|
|
667
|
+
clearFromCursor: () => terminal.clearFromCursor(),
|
|
668
|
+
clearScreen: () => terminal.clearScreen(),
|
|
669
|
+
setTitle: title => terminal.setTitle(title),
|
|
670
|
+
setProgress: active => terminal.setProgress(active),
|
|
671
|
+
};
|
|
672
|
+
}
|
|
466
673
|
function toOverlayOptions(options) {
|
|
467
674
|
if (options === undefined)
|
|
468
675
|
return undefined;
|
package/dist/{src/foundation/pi-tui-runtime-adapter → integrations/pi/tui-runtime}/contracts.d.ts
RENAMED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { PresentationComponentPort } from "../../../contracts/presentation/index.js";
|
|
2
|
+
import type { PiTuiInputCoordinationDecision, PiTuiInputCoordinationScheduler, PiTuiInputSurfaceKind } from "./input-presentation-coordinator.js";
|
|
1
3
|
export type PiTuiRuntimeState = "idle" | "running" | "stopping" | "stopped" | "failed";
|
|
2
4
|
export interface PiTuiViewport {
|
|
3
5
|
readonly columns: number;
|
|
@@ -9,13 +11,8 @@ export interface PiTuiScrollState {
|
|
|
9
11
|
readonly followingEnd: boolean;
|
|
10
12
|
readonly scrollbarVisible: boolean;
|
|
11
13
|
}
|
|
12
|
-
export interface PiTuiComponentPort {
|
|
13
|
-
render(width: number): readonly string[];
|
|
14
|
-
invalidate(): void;
|
|
15
|
-
handleInput?(data: string): void;
|
|
14
|
+
export interface PiTuiComponentPort extends PresentationComponentPort {
|
|
16
15
|
readonly wantsKeyRelease?: boolean;
|
|
17
|
-
setFocused?(focused: boolean): void;
|
|
18
|
-
dispose?(): void;
|
|
19
16
|
}
|
|
20
17
|
export interface PiTuiTerminalPort {
|
|
21
18
|
start(onInput: (data: string) => void, onResize: () => void): void;
|
|
@@ -54,6 +51,8 @@ export interface PiTuiOverlayOptions {
|
|
|
54
51
|
readonly margin?: PiTuiOverlayMargin | number;
|
|
55
52
|
readonly visible?: (columns: number, rows: number) => boolean;
|
|
56
53
|
readonly nonCapturing?: boolean;
|
|
54
|
+
/** A1-owned input scheduling declaration; omitted extension overlays fail closed. */
|
|
55
|
+
readonly inputCoordination?: Exclude<PiTuiInputSurfaceKind, "editor">;
|
|
57
56
|
}
|
|
58
57
|
export interface PiTuiOverlayUnfocusOptions {
|
|
59
58
|
readonly target: PiTuiComponentPort | null;
|
|
@@ -71,6 +70,8 @@ export interface PiTuiInputListenerResult {
|
|
|
71
70
|
readonly data?: string;
|
|
72
71
|
}
|
|
73
72
|
export type PiTuiInputListener = (data: string) => PiTuiInputListenerResult | undefined;
|
|
73
|
+
/** Runs at the terminal bridge before Pi TUI receives physical input. */
|
|
74
|
+
export type PiTuiPreInputListener = PiTuiInputListener;
|
|
74
75
|
export interface PiTuiLayoutEntry {
|
|
75
76
|
readonly node: PiTuiLayoutNode;
|
|
76
77
|
readonly basis?: number | "auto";
|
|
@@ -100,11 +101,33 @@ export type PiTuiLayoutNode = {
|
|
|
100
101
|
readonly scrollbarStyle?: (text: string) => string;
|
|
101
102
|
readonly scrollbarHideDelayMs?: number;
|
|
102
103
|
};
|
|
104
|
+
export type PiTuiInputDiagnosticsPhase = "receipt" | "semantic-start" | "semantic-end" | "composition-start" | "composition-end" | "write-start" | "write-end";
|
|
105
|
+
export interface PiTuiInputDiagnosticsEvent {
|
|
106
|
+
readonly phase: PiTuiInputDiagnosticsPhase;
|
|
107
|
+
readonly revision: number;
|
|
108
|
+
readonly atMs: number;
|
|
109
|
+
readonly pendingDepth: number;
|
|
110
|
+
readonly pendingPresentationDepth: 0 | 1;
|
|
111
|
+
readonly appliedRevision: number;
|
|
112
|
+
}
|
|
103
113
|
export interface PiTuiRuntimeAdapterOptions {
|
|
104
114
|
readonly root: PiTuiComponentPort;
|
|
105
115
|
readonly mode?: "regular" | "fullscreen";
|
|
106
116
|
readonly layoutRoot?: PiTuiLayoutNode;
|
|
107
117
|
readonly terminal?: PiTuiTerminalPort;
|
|
118
|
+
/** A1-owned public-boundary decorator; comparison paths omit it. */
|
|
119
|
+
readonly decorateTerminal?: (terminal: PiTuiTerminalPort) => PiTuiTerminalPort;
|
|
120
|
+
/** Bare-custom-viewport scheduling policy; comparison paths omit it. */
|
|
121
|
+
readonly inputCoordination?: {
|
|
122
|
+
readonly classify: (data: string, focusedOverlay?: Exclude<PiTuiInputSurfaceKind, "editor">) => PiTuiInputCoordinationDecision;
|
|
123
|
+
readonly onReceipt?: () => void;
|
|
124
|
+
readonly scheduler?: PiTuiInputCoordinationScheduler;
|
|
125
|
+
};
|
|
126
|
+
/** Optional bounded evidence hook. Production composition omits it. */
|
|
127
|
+
readonly inputDiagnostics?: {
|
|
128
|
+
readonly onEvent: (event: PiTuiInputDiagnosticsEvent) => void;
|
|
129
|
+
readonly now?: () => number;
|
|
130
|
+
};
|
|
108
131
|
readonly hardwareCursor?: boolean;
|
|
109
132
|
readonly mouse?: boolean;
|
|
110
133
|
readonly wheelScrollLines?: number;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { PiTuiTerminalPort } from "./contracts.js";
|
|
2
|
+
export declare const PINNED_PI_TUI_DAMAGE_GRAMMAR = "@earendil-works/pi-tui@0.84.2:tui-alt-screen-one-write-v1";
|
|
3
|
+
export interface PiTuiDamageFrameDescriptor {
|
|
4
|
+
readonly frameId: number;
|
|
5
|
+
readonly width: number;
|
|
6
|
+
readonly height: number;
|
|
7
|
+
readonly transcript: {
|
|
8
|
+
readonly rowStart: number;
|
|
9
|
+
readonly rowEnd: number;
|
|
10
|
+
} | null;
|
|
11
|
+
readonly dock: {
|
|
12
|
+
readonly rowStart: number;
|
|
13
|
+
readonly rowEnd: number;
|
|
14
|
+
} | null;
|
|
15
|
+
readonly verticalShiftRows: number;
|
|
16
|
+
readonly safeVerticalShift: boolean;
|
|
17
|
+
readonly cause: string;
|
|
18
|
+
}
|
|
19
|
+
export interface PiTuiDamageFrameSafety {
|
|
20
|
+
readonly overlayActive: boolean;
|
|
21
|
+
readonly selectionActive: boolean;
|
|
22
|
+
readonly replacementSurfaceActive: boolean;
|
|
23
|
+
}
|
|
24
|
+
export type PiTuiDamageDecisionReason = "transformed" | "suppressed-redundant-clear" | "hyperlink-cleanup" | "pending-hyperlink-cleanup" | "not-armed" | "unsafe-frame" | "stale-frame" | "unsupported-region-scroll" | "geometry-mismatch" | "grammar-mismatch" | "unsafe-terminal-content" | "incomplete-prior-frame" | "excessive-real-damage";
|
|
25
|
+
export interface PiTuiDamageDecision {
|
|
26
|
+
readonly frameId: number | null;
|
|
27
|
+
readonly transformed: boolean;
|
|
28
|
+
readonly reason: PiTuiDamageDecisionReason;
|
|
29
|
+
readonly shiftRows: number;
|
|
30
|
+
readonly paintedRows: readonly number[];
|
|
31
|
+
}
|
|
32
|
+
export interface DamageAwareTerminalOptions {
|
|
33
|
+
readonly regionalScroll: boolean;
|
|
34
|
+
/** The shell supplies visible-row analysis; the terminal layer owns no UI parser. */
|
|
35
|
+
readonly inspectHyperlinks: (content: string) => {
|
|
36
|
+
readonly ranges: readonly unknown[];
|
|
37
|
+
readonly signature: string;
|
|
38
|
+
readonly replaySafe: boolean;
|
|
39
|
+
readonly width: number;
|
|
40
|
+
};
|
|
41
|
+
readonly onResize?: () => void;
|
|
42
|
+
readonly onHyperlinkCleanupRequired?: () => void;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* A fail-closed adapter for one pinned Pi fullscreen write grammar. Semantic
|
|
46
|
+
* viewport metadata authorizes a shift; bytes are inspected only to validate
|
|
47
|
+
* and preserve Pi's complete row paint and cursor syntax.
|
|
48
|
+
*/
|
|
49
|
+
export declare class DamageAwareTerminalAdapter implements PiTuiTerminalPort {
|
|
50
|
+
#private;
|
|
51
|
+
readonly inner: PiTuiTerminalPort;
|
|
52
|
+
readonly options: DamageAwareTerminalOptions;
|
|
53
|
+
constructor(inner: PiTuiTerminalPort, options: DamageAwareTerminalOptions);
|
|
54
|
+
get columns(): number;
|
|
55
|
+
get rows(): number;
|
|
56
|
+
get kittyProtocolActive(): boolean;
|
|
57
|
+
get lastDecision(): PiTuiDamageDecision;
|
|
58
|
+
get hyperlinkCleanupPending(): boolean;
|
|
59
|
+
/** Latches cleanup through composition/coalescing until a complete write covers it. */
|
|
60
|
+
requestHyperlinkCleanup(): void;
|
|
61
|
+
arm(descriptor: PiTuiDamageFrameDescriptor, safety: PiTuiDamageFrameSafety): void;
|
|
62
|
+
start(onInput: (data: string) => void, onResize: () => void): void;
|
|
63
|
+
stop(): void;
|
|
64
|
+
drainInput(maxMs?: number, idleMs?: number): Promise<void>;
|
|
65
|
+
write(data: string): void;
|
|
66
|
+
moveBy(lines: number): void;
|
|
67
|
+
hideCursor(): void;
|
|
68
|
+
showCursor(): void;
|
|
69
|
+
clearLine(): void;
|
|
70
|
+
clearFromCursor(): void;
|
|
71
|
+
clearScreen(): void;
|
|
72
|
+
setTitle(title: string): void;
|
|
73
|
+
setProgress(active: boolean): void;
|
|
74
|
+
}
|