@timurproko/a1 0.2.7-dev.1252 → 0.2.7-dev.1264

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.
Files changed (296) hide show
  1. package/bin/ui.js +3 -3
  2. package/dist/app/session-shell/clipboard-diagnostics.d.ts +2 -2
  3. package/dist/app/session-shell/clipboard-image.d.ts +0 -1
  4. package/dist/app/session-shell/clipboard-image.js +1 -1
  5. package/dist/app/session-shell/dialog-coordinator.d.ts +6 -5
  6. package/dist/app/session-shell/dialog-coordinator.js +3 -4
  7. package/dist/app/session-shell/dock-chrome.d.ts +11 -6
  8. package/dist/app/session-shell/dock-chrome.js +5 -8
  9. package/dist/app/session-shell/editor-hyperlink-budget.d.ts +0 -2
  10. package/dist/app/session-shell/editor-hyperlink-budget.js +1 -1
  11. package/dist/app/session-shell/exit-notice.d.ts +2 -2
  12. package/dist/app/session-shell/exit-notice.js +1 -1
  13. package/dist/app/session-shell/extension-surface.d.ts +8 -7
  14. package/dist/app/session-shell/helper-pool.d.ts +3 -4
  15. package/dist/app/session-shell/helper-pool.js +1 -1
  16. package/dist/app/session-shell/image-preparation-client.d.ts +4 -3
  17. package/dist/app/session-shell/image-preparation.d.ts +0 -2
  18. package/dist/app/session-shell/image-preparation.js +2 -2
  19. package/dist/app/session-shell/image-source.d.ts +2 -3
  20. package/dist/app/session-shell/image-source.js +2 -2
  21. package/dist/app/session-shell/input-surface-switch.d.ts +9 -7
  22. package/dist/app/session-shell/input-surface-switch.js +1 -2
  23. package/dist/app/session-shell/login-interaction.d.ts +5 -4
  24. package/dist/app/session-shell/login-interaction.js +2 -3
  25. package/dist/app/session-shell/paste-executor.d.ts +4 -8
  26. package/dist/app/session-shell/paste-executor.js +2 -2
  27. package/dist/app/session-shell/paste-protocol.d.ts +2 -2
  28. package/dist/app/session-shell/path-chip-presentation.d.ts +0 -5
  29. package/dist/app/session-shell/path-chip-presentation.js +3 -3
  30. package/dist/app/session-shell/prompt-chips.d.ts +8 -7
  31. package/dist/app/session-shell/prompt-history-controller.d.ts +3 -3
  32. package/dist/app/session-shell/prompt-submission.d.ts +5 -2
  33. package/dist/app/session-shell/prompt-submission.js +13 -14
  34. package/dist/app/session-shell/quit-outro-effects.d.ts +3 -3
  35. package/dist/app/session-shell/quit-outro-effects.js +1 -4
  36. package/dist/app/session-shell/quit-outro.d.ts +9 -12
  37. package/dist/app/session-shell/quit-outro.js +11 -11
  38. package/dist/app/session-shell/resource-labels.d.ts +2 -0
  39. package/dist/app/session-shell/resource-labels.js +158 -0
  40. package/dist/app/session-shell/response-copy-protocol.d.ts +3 -2
  41. package/dist/app/session-shell/response-copy-transport.d.ts +2 -14
  42. package/dist/app/session-shell/response-copy-transport.js +1 -1
  43. package/dist/app/session-shell/session-lifecycle.d.ts +2 -1
  44. package/dist/app/session-shell/session-prompt-history.d.ts +29 -0
  45. package/dist/app/session-shell/session-prompt-history.js +80 -0
  46. package/dist/app/session-shell/session-selectors.d.ts +46 -0
  47. package/dist/app/session-shell/session-selectors.js +269 -0
  48. package/dist/app/session-shell/session-shell-root.d.ts +76 -113
  49. package/dist/app/session-shell/session-shell-root.js +103 -329
  50. package/dist/app/session-shell/session-shell.d.ts +14 -37
  51. package/dist/app/session-shell/session-shell.js +177 -612
  52. package/dist/app/session-shell/session-viewport-controller.d.ts +9 -16
  53. package/dist/app/session-shell/session-viewport-controller.js +42 -320
  54. package/dist/app/session-shell/settings-bindings.d.ts +25 -3
  55. package/dist/app/session-shell/settings-bindings.js +26 -2
  56. package/dist/app/session-shell/share-operation.d.ts +3 -3
  57. package/dist/app/session-shell/share-operation.js +4 -6
  58. package/dist/app/session-shell/shell-clipboard.d.ts +59 -0
  59. package/dist/app/session-shell/shell-clipboard.js +119 -0
  60. package/dist/app/session-shell/shell-editor-factory.d.ts +8 -4
  61. package/dist/app/session-shell/shell-editor-factory.js +13 -15
  62. package/dist/app/session-shell/shell-host.d.ts +16 -17
  63. package/dist/app/session-shell/shell-host.js +18 -19
  64. package/dist/app/session-shell/shell-layout.d.ts +2 -2
  65. package/dist/app/session-shell/shell-prompt-suggestions.d.ts +26 -0
  66. package/dist/app/session-shell/shell-prompt-suggestions.js +48 -0
  67. package/dist/app/session-shell/suggestion-surface.d.ts +1 -6
  68. package/dist/app/session-shell/suggestion-surface.js +1 -1
  69. package/dist/app/session-shell/system-clipboard.d.ts +2 -14
  70. package/dist/app/session-shell/system-clipboard.js +2 -7
  71. package/dist/app/session-shell/transcript-document.d.ts +11 -8
  72. package/dist/app/session-shell/transcript-document.js +13 -14
  73. package/dist/app/session-shell/viewport-layout.d.ts +2 -2
  74. package/dist/app/session-shell/viewport-pointer.d.ts +83 -0
  75. package/dist/app/session-shell/viewport-pointer.js +361 -0
  76. package/dist/app/session-shell/workflow-output.d.ts +5 -3
  77. package/dist/app/session-shell/workflow-output.js +13 -15
  78. package/dist/cli/package-messages.d.ts +0 -1
  79. package/dist/cli/package-messages.js +1 -1
  80. package/dist/cli/session-context.d.ts +1 -1
  81. package/dist/cli/uninstall.d.ts +3 -2
  82. package/dist/composition/owned-settings.d.ts +2 -1
  83. package/dist/composition/owned-settings.js +0 -3
  84. package/dist/composition/owned-ui.d.ts +1 -1
  85. package/dist/composition/owned-ui.js +77 -73
  86. package/dist/composition/reference-selection-options.d.ts +1 -1
  87. package/dist/composition/reference-selection-options.js +1 -1
  88. package/dist/composition/session-runtime-registry.d.ts +2 -1
  89. package/dist/composition/settings-route-host.js +3 -10
  90. package/dist/composition/settings-search-input.d.ts +2 -1
  91. package/dist/composition/startup-route.d.ts +2 -2
  92. package/dist/composition/startup-route.js +2 -2
  93. package/dist/contracts/owned-ui/extension-ui.d.ts +2 -1
  94. package/dist/contracts/owned-ui/index.d.ts +2 -1
  95. package/dist/contracts/owned-ui/index.js +1 -1
  96. package/dist/contracts/owned-ui/session-presenters.d.ts +3 -0
  97. package/dist/contracts/owned-ui/shell-components.d.ts +543 -0
  98. package/dist/contracts/owned-ui/validation.d.ts +1 -11
  99. package/dist/contracts/owned-ui/validation.js +8 -104
  100. package/dist/contracts/presentation/component.d.ts +17 -0
  101. package/dist/contracts/presentation/component.js +8 -0
  102. package/dist/contracts/presentation/index.d.ts +6 -15
  103. package/dist/contracts/presentation/index.js +2 -0
  104. package/dist/contracts/presentation/terminal.d.ts +284 -0
  105. package/dist/contracts/presentation/terminal.js +1 -0
  106. package/dist/contracts/presentation/theme.d.ts +46 -0
  107. package/dist/contracts/presentation/theme.js +1 -0
  108. package/dist/features/launch/development-launch.js +1 -1
  109. package/dist/features/launch/runtime-selection.d.ts +2 -2
  110. package/dist/features/launch/runtime-selection.js +2 -2
  111. package/dist/features/owned-ui/project-trust-prompt.d.ts +2 -2
  112. package/dist/features/owned-ui/project-trust-prompt.js +1 -1
  113. package/dist/features/owned-ui/release-note-state.d.ts +2 -1
  114. package/dist/features/owned-ui/settings-app.js +49 -425
  115. package/dist/features/owned-ui/settings-edits.d.ts +31 -0
  116. package/dist/features/owned-ui/settings-edits.js +139 -0
  117. package/dist/features/owned-ui/settings-model-dialog.d.ts +41 -0
  118. package/dist/features/owned-ui/settings-model-dialog.js +194 -0
  119. package/dist/features/owned-ui/settings-scroll-rail.d.ts +29 -0
  120. package/dist/features/owned-ui/settings-scroll-rail.js +79 -0
  121. package/dist/features/owned-ui/settings-search-input.d.ts +2 -1
  122. package/dist/features/prompt-history/service.d.ts +3 -2
  123. package/dist/foundation/lifecycle/claim-gate.d.ts +2 -1
  124. package/dist/foundation/release/automatic-update.d.ts +5 -14
  125. package/dist/foundation/release/automatic-update.js +15 -22
  126. package/dist/foundation/release/bootstrap.js +4 -4
  127. package/dist/foundation/release/dependency-certification.d.ts +0 -1
  128. package/dist/foundation/release/dependency-certification.js +1 -1
  129. package/dist/foundation/release/dependency-layer.js +3 -3
  130. package/dist/foundation/release/early-accent.d.ts +2 -2
  131. package/dist/foundation/release/early-accent.js +1 -1
  132. package/dist/foundation/release/index.d.ts +2 -2
  133. package/dist/foundation/release/index.js +1 -1
  134. package/dist/foundation/release/latest-release.d.ts +3 -18
  135. package/dist/foundation/release/latest-release.js +11 -11
  136. package/dist/foundation/release/managed-path.d.ts +10 -0
  137. package/dist/foundation/release/managed-path.js +26 -0
  138. package/dist/foundation/release/ordinary-launch-selection.d.ts +1 -1
  139. package/dist/foundation/release/ordinary-launch-selection.js +1 -1
  140. package/dist/foundation/release/release-gc.d.ts +3 -3
  141. package/dist/foundation/release/release-gc.js +10 -12
  142. package/dist/foundation/release/{cohort-state.d.ts → release-state.d.ts} +23 -23
  143. package/dist/foundation/release/{cohort-state.js → release-state.js} +8 -8
  144. package/dist/foundation/release/restart-certification.js +3 -4
  145. package/dist/foundation/release/update-activation.js +3 -3
  146. package/dist/foundation/release/update-execution-lease.d.ts +2 -3
  147. package/dist/foundation/release/update-execution-lease.js +2 -8
  148. package/dist/foundation/release/update-installer.d.ts +45 -0
  149. package/dist/foundation/release/update-installer.js +57 -0
  150. package/dist/foundation/release/update-launch.d.ts +2 -2
  151. package/dist/foundation/release/update-recovery.js +2 -9
  152. package/dist/foundation/release/update.d.ts +4 -25
  153. package/dist/foundation/release/update.js +164 -183
  154. package/dist/foundation/startup/startup-budget.d.ts +5 -5
  155. package/dist/foundation/startup/startup-budget.js +2 -2
  156. package/dist/integrations/pi/components/bracketed-paste.d.ts +33 -0
  157. package/dist/integrations/pi/components/bracketed-paste.js +123 -0
  158. package/dist/integrations/pi/components/editor-interaction.d.ts +4 -12
  159. package/dist/integrations/pi/components/index.d.ts +15 -9
  160. package/dist/integrations/pi/components/index.js +9 -5
  161. package/dist/integrations/pi/components/lazy-selectors.d.ts +2 -10
  162. package/dist/integrations/pi/components/lazy-selectors.js +1 -1
  163. package/dist/integrations/pi/components/modal-frame.d.ts +5 -22
  164. package/dist/integrations/pi/components/modal-frame.js +3 -23
  165. package/dist/integrations/pi/components/owned-editor-ux.d.ts +4 -3
  166. package/dist/integrations/pi/components/owned-editor-ux.js +46 -140
  167. package/dist/integrations/pi/components/prompt-input-port.d.ts +2 -19
  168. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +2 -1
  169. package/dist/integrations/pi/components/shell-editor-autocomplete.d.ts +3 -2
  170. package/dist/integrations/pi/components/shell-footer-status.d.ts +2 -2
  171. package/dist/integrations/pi/components/shell-footer-status.js +3 -2
  172. package/dist/integrations/pi/components/shell-presenters-info.d.ts +6 -5
  173. package/dist/integrations/pi/components/shell-presenters-info.js +2 -1
  174. package/dist/integrations/pi/components/shell-session-info-reference.d.ts +2 -1
  175. package/dist/integrations/pi/components/shell-shared-facade.d.ts +33 -227
  176. package/dist/integrations/pi/components/shell-shared-facade.js +8 -1
  177. package/dist/integrations/pi/components/skills-command.d.ts +1 -9
  178. package/dist/integrations/pi/components/skills-command.js +5 -5
  179. package/dist/integrations/pi/components/theme.d.ts +9 -2
  180. package/dist/integrations/pi/components/theme.js +17 -2
  181. package/dist/integrations/pi/components/thinking-selector-dialog.d.ts +2 -1
  182. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +2 -2
  183. package/dist/integrations/pi/engine/adapter.d.ts +4 -13
  184. package/dist/integrations/pi/engine/adapter.js +9 -61
  185. package/dist/integrations/pi/engine/changelog.d.ts +2 -2
  186. package/dist/integrations/pi/engine/changelog.js +3 -3
  187. package/dist/integrations/pi/engine/compaction-progress.d.ts +2 -3
  188. package/dist/integrations/pi/engine/compaction-progress.js +1 -1
  189. package/dist/integrations/pi/engine/conformance.d.ts +2 -1
  190. package/dist/integrations/pi/engine/default-model-setting.d.ts +0 -2
  191. package/dist/integrations/pi/engine/default-model-setting.js +1 -2
  192. package/dist/integrations/pi/engine/event-delivery.d.ts +2 -1
  193. package/dist/integrations/pi/engine/extension-ui-binding.d.ts +2 -1
  194. package/dist/integrations/pi/engine/host.js +3 -3
  195. package/dist/integrations/pi/engine/message-values.d.ts +0 -1
  196. package/dist/integrations/pi/engine/message-values.js +1 -1
  197. package/dist/integrations/pi/engine/pending-delivery.d.ts +0 -4
  198. package/dist/integrations/pi/engine/pending-delivery.js +3 -3
  199. package/dist/integrations/pi/engine/ports.d.ts +7 -1
  200. package/dist/integrations/pi/engine/ports.js +4 -0
  201. package/dist/integrations/pi/engine/project-trust-preflight.d.ts +2 -1
  202. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +3 -2
  203. package/dist/integrations/pi/engine/provider-authentication.d.ts +1 -1
  204. package/dist/integrations/pi/engine/public-main-entry.d.ts +1 -5
  205. package/dist/integrations/pi/engine/public-main-entry.js +1 -1
  206. package/dist/integrations/pi/engine/repository-metadata.d.ts +49 -0
  207. package/dist/integrations/pi/engine/repository-metadata.js +189 -0
  208. package/dist/integrations/pi/engine/repository-pr-rest.d.ts +1 -9
  209. package/dist/integrations/pi/engine/repository-pr-rest.js +2 -2
  210. package/dist/integrations/pi/engine/repository-pr.d.ts +1 -3
  211. package/dist/integrations/pi/engine/repository-pr.js +1 -1
  212. package/dist/integrations/pi/engine/resource-catalog.d.ts +2 -1
  213. package/dist/integrations/pi/engine/session-integration.d.ts +1 -1
  214. package/dist/integrations/pi/engine/session-runtime.d.ts +7 -12
  215. package/dist/integrations/pi/engine/session-runtime.js +21 -178
  216. package/dist/integrations/pi/engine/settings-bridge.d.ts +0 -2
  217. package/dist/integrations/pi/engine/settings-bridge.js +1 -1
  218. package/dist/integrations/pi/engine/settings-port.d.ts +3 -2
  219. package/dist/integrations/pi/engine/transcript-projection.d.ts +2 -1
  220. package/dist/integrations/pi/engine/view-state.d.ts +21 -2
  221. package/dist/integrations/pi/engine/view-state.js +129 -1
  222. package/dist/integrations/pi/engine/workflow-contexts.d.ts +1 -1
  223. package/dist/integrations/pi/engine/workflow-runner.d.ts +1 -2
  224. package/dist/integrations/pi/engine/workflow-runner.js +254 -365
  225. package/dist/integrations/pi/engine/workflow-share.d.ts +9 -0
  226. package/dist/integrations/pi/engine/workflow-share.js +168 -0
  227. package/dist/integrations/pi/engine/workflow-support.d.ts +0 -20
  228. package/dist/integrations/pi/engine/workflow-support.js +4 -65
  229. package/dist/integrations/pi/engine/workflows.d.ts +5 -5
  230. package/dist/integrations/pi/session-presenters/components.d.ts +3 -0
  231. package/dist/integrations/pi/session-presenters/components.js +75 -0
  232. package/dist/integrations/pi/session-presenters/index.d.ts +1 -0
  233. package/dist/integrations/pi/session-presenters/index.js +1 -0
  234. package/dist/integrations/pi/session-presenters/presentation.d.ts +3 -0
  235. package/dist/integrations/pi/session-presenters/presentation.js +10 -0
  236. package/dist/integrations/pi/session-presenters/presenters.d.ts +2 -1
  237. package/dist/integrations/pi/session-presenters/presenters.js +3 -1
  238. package/dist/integrations/pi/tui-runtime/adapter.d.ts +9 -19
  239. package/dist/integrations/pi/tui-runtime/adapter.js +56 -174
  240. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +9 -44
  241. package/dist/integrations/pi/tui-runtime/index.d.ts +1 -1
  242. package/dist/integrations/pi/tui-runtime/index.js +1 -0
  243. package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +4 -6
  244. package/dist/integrations/pi/tui-runtime/overlay-geometry.d.ts +4 -10
  245. package/dist/integrations/pi/tui-runtime/overlay-geometry.js +3 -9
  246. package/dist/integrations/pi/tui-runtime/presentation-adapter.d.ts +2 -2
  247. package/dist/integrations/pi/tui-runtime/runtime-factory.d.ts +3 -0
  248. package/dist/integrations/pi/tui-runtime/runtime-factory.js +11 -0
  249. package/dist/ui/components/index.d.ts +2 -2
  250. package/dist/ui/components/index.js +1 -1
  251. package/dist/ui/components/selection-copy.d.ts +0 -1
  252. package/dist/ui/components/selection-copy.js +0 -12
  253. package/dist/ui/components/theme.d.ts +4 -19
  254. package/dist/ui/components/theme.js +6 -0
  255. package/dist/ui/components/transcript-viewport-frame.d.ts +120 -0
  256. package/dist/ui/components/transcript-viewport-frame.js +314 -0
  257. package/dist/ui/components/transcript-viewport-types.d.ts +147 -0
  258. package/dist/ui/components/transcript-viewport-types.js +1 -0
  259. package/dist/ui/components/transcript-viewport.d.ts +2 -147
  260. package/dist/ui/components/transcript-viewport.js +87 -315
  261. package/dist/ui/settings/declarations.d.ts +2 -3
  262. package/dist/ui/settings/declarations.js +2 -3
  263. package/dist/ui/settings/early-accent.js +1 -1
  264. package/dist/ui/settings/index.d.ts +3 -5
  265. package/dist/ui/settings/index.js +2 -3
  266. package/dist/ui/settings/manager.d.ts +0 -4
  267. package/dist/ui/settings/manager.js +6 -62
  268. package/dist/ui/settings/resolution.d.ts +6 -18
  269. package/dist/ui/settings/resolution.js +4 -103
  270. package/dist/ui/settings/sections.d.ts +0 -4
  271. package/dist/ui/settings/sections.js +1 -1
  272. package/docs/architecture/boundaries.md +2 -2
  273. package/docs/architecture/internal-naming.md +2 -0
  274. package/docs/architecture/project-structure.md +4 -2
  275. package/docs/validation.md +1 -1
  276. package/package.json +3 -4
  277. package/dist/integrations/pi/components/components.d.ts +0 -4
  278. package/dist/integrations/pi/components/components.js +0 -48
  279. package/dist/integrations/pi/components/conformance.d.ts +0 -18
  280. package/dist/integrations/pi/components/conformance.js +0 -70
  281. package/dist/integrations/pi/components/shell-components.d.ts +0 -7
  282. package/dist/integrations/pi/components/shell-components.js +0 -7
  283. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +0 -33
  284. package/dist/integrations/pi/components/upstream/theme/theme-controller.js +0 -114
  285. package/dist/integrations/pi/engine/diagnostics-state.d.ts +0 -9
  286. package/dist/integrations/pi/engine/diagnostics-state.js +0 -34
  287. package/dist/integrations/pi/engine/usage-view.d.ts +0 -4
  288. package/dist/integrations/pi/engine/usage-view.js +0 -56
  289. package/dist/integrations/pi/tui-runtime/contracts.d.ts +0 -166
  290. package/dist/ui/settings/migrations.d.ts +0 -19
  291. package/dist/ui/settings/migrations.js +0 -225
  292. package/dist/ui/settings/progress-palette.generated.d.ts +0 -139
  293. package/dist/ui/settings/progress-palette.generated.js +0 -139
  294. /package/dist/{integrations/pi/tui-runtime/contracts.js → contracts/owned-ui/shell-components.js} +0 -0
  295. /package/dist/{foundation/release → contracts/presentation}/progress-palette.generated.d.ts +0 -0
  296. /package/dist/{foundation/release → contracts/presentation}/progress-palette.generated.js +0 -0
@@ -0,0 +1,9 @@
1
+ import type { AgentSession, AgentSessionRuntime } from "../startup-public.js";
2
+ import type { PiWorkflowHost, PiWorkflowRequest, PiWorkflowResult } from "./workflows.js";
3
+ export interface PiShareCall {
4
+ readonly request: PiWorkflowRequest;
5
+ readonly session: AgentSession;
6
+ readonly runtime: AgentSessionRuntime;
7
+ readonly host: PiWorkflowHost;
8
+ }
9
+ export declare function runShareWorkflow({ request, session, runtime, host }: PiShareCall): Promise<PiWorkflowResult>;
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Pinned Pi's `/share` workflow: the Radius artifact route with a gist fallback. The runner loads
3
+ * this module on the first `/share`, so its network clients stay off the startup path.
4
+ */
5
+ import { randomUUID } from "node:crypto";
6
+ import { readFile, rm } from "node:fs/promises";
7
+ import { tmpdir } from "node:os";
8
+ import { join } from "node:path";
9
+ import { PRODUCT_IDENTITY } from "../../../product-identity.js";
10
+ import { isRecord, requireCapability, stringProperty } from "./message-values.js";
11
+ import { commandMissing, errorMessage, isAbortError, workflowResult } from "./workflow-support.js";
12
+ // Provenance: the pinned engine's modes/interactive/session-share.ts Radius route and the model
13
+ // runtime's DEFAULT_RADIUS_GATEWAY; neither is in the public API, so each upgrade re-checks them.
14
+ const RADIUS_SHARE_GATEWAY = "https://radius.pi.dev";
15
+ const RADIUS_AUTH_MIN_VALIDITY_MS = 5 * 60_000;
16
+ export async function runShareWorkflow({ request, session, runtime, host }) {
17
+ const signal = request.signal;
18
+ if (signal?.aborted)
19
+ return shareCancelled(request);
20
+ const destination = runtime.services.settingsManager?.getSessionShareDestination?.() ?? "auto";
21
+ if (destination !== "gist") {
22
+ const radius = await shareViaRadius({ request, session, runtime, host });
23
+ if (radius !== undefined)
24
+ return radius;
25
+ if (destination === "radius")
26
+ return workflowResult(request.command, "failed", "Radius authentication is not configured. Run '/login radius' first.");
27
+ }
28
+ request.onProgress?.("Creating gist…");
29
+ try {
30
+ await host.runCommand("gh", ["auth", "status"], signal === undefined ? undefined : { signal });
31
+ }
32
+ catch (error) {
33
+ if (signal?.aborted || isAbortError(error))
34
+ return shareCancelled(request);
35
+ const message = commandMissing(error)
36
+ ? "GitHub CLI (gh) is not installed. Install it from https://cli.github.com/"
37
+ : "GitHub CLI is not logged in. Run 'gh auth login' first.";
38
+ return workflowResult(request.command, "failed", message);
39
+ }
40
+ const temporary = join(tmpdir(), `${PRODUCT_IDENTITY.filesystem.temporaryPrefix}pi-session-${process.pid}.html`);
41
+ try {
42
+ try {
43
+ await requireCapability(session.exportToHtml, "exportToHtml").call(session, temporary);
44
+ }
45
+ catch (error) {
46
+ return workflowResult(request.command, "failed", `Failed to export session: ${errorMessage(error, "Unknown error")}`);
47
+ }
48
+ if (signal?.aborted)
49
+ return shareCancelled(request);
50
+ let gist;
51
+ try {
52
+ gist = await host.runCommand("gh", ["gist", "create", "--public=false", temporary], signal === undefined ? undefined : { signal });
53
+ }
54
+ catch (error) {
55
+ if (signal?.aborted || isAbortError(error))
56
+ return shareCancelled(request);
57
+ return workflowResult(request.command, "failed", `Failed to create gist: ${shareCommandFailureDetail(error)}`);
58
+ }
59
+ if (signal?.aborted)
60
+ return shareCancelled(request);
61
+ const gistUrl = gist.stdout.trim();
62
+ const gistId = gistUrl.split("/").at(-1);
63
+ if (!gistId)
64
+ return workflowResult(request.command, "failed", "Failed to parse gist ID from gh output");
65
+ return workflowResult(request.command, "completed", `Share URL: ${shareViewerUrl(gistId)}`, gistUrl);
66
+ }
67
+ finally {
68
+ await rm(temporary, { force: true });
69
+ }
70
+ }
71
+ function shareCancelled(request) {
72
+ return workflowResult(request.command, "cancelled", "Share cancelled", undefined, "status");
73
+ }
74
+ // Protocol: the pinned Radius `/share` route. Undefined means Radius has no provider or credential,
75
+ // so the caller may fall back to a gist; any other outcome, including an upload failure, is final.
76
+ async function shareViaRadius({ request, session, runtime, host }) {
77
+ const signal = request.signal;
78
+ const models = runtime.services.modelRuntime;
79
+ if (models.getProvider?.("radius") === undefined)
80
+ return undefined;
81
+ const token = radiusAuthCredential(await models.getAuth("radius", { minOAuthValidityMs: RADIUS_AUTH_MIN_VALIDITY_MS }));
82
+ if (!token)
83
+ return undefined;
84
+ if (signal?.aborted)
85
+ return shareCancelled(request);
86
+ request.onProgress?.("Uploading to Radius…");
87
+ const temporary = join(tmpdir(), `${PRODUCT_IDENTITY.filesystem.temporaryPrefix}pi-session-${process.pid}.jsonl`);
88
+ let body;
89
+ try {
90
+ requireCapability(session.exportToJsonl, "exportToJsonl").call(session, temporary);
91
+ body = withRadiusShareTrailingEntry(await readFile(temporary, "utf8"), session.state ?? {}, randomUUID().slice(0, 8));
92
+ }
93
+ catch (error) {
94
+ return workflowResult(request.command, "failed", `Failed to export session: ${errorMessage(error, "Unknown error")}`);
95
+ }
96
+ finally {
97
+ await rm(temporary, { force: true });
98
+ }
99
+ const url = new URL("/v1/artifacts", RADIUS_SHARE_GATEWAY);
100
+ url.searchParams.set("visibility", "organization");
101
+ url.searchParams.set("title", "Pi session");
102
+ try {
103
+ const response = await (host.fetch ?? fetch)(url, {
104
+ method: "POST",
105
+ headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/x-ndjson" },
106
+ body,
107
+ ...(signal === undefined ? {} : { signal }),
108
+ });
109
+ const json = await response.json().catch(() => null);
110
+ if (signal?.aborted)
111
+ return shareCancelled(request);
112
+ const artifact = isRecord(json) && isRecord(json.artifact) ? json.artifact : undefined;
113
+ const shareUrl = artifact === undefined ? undefined : stringProperty(artifact, "canonical_url");
114
+ if (!response.ok || shareUrl === undefined) {
115
+ const detail = (isRecord(json) ? stringProperty(json, "error") : undefined) || response.statusText || String(response.status);
116
+ return workflowResult(request.command, "failed", `Failed to upload Radius artifact: ${detail}`);
117
+ }
118
+ return workflowResult(request.command, "completed", `Share URL: ${shareUrl}`);
119
+ }
120
+ catch (error) {
121
+ if (signal?.aborted || isAbortError(error))
122
+ return shareCancelled(request);
123
+ return workflowResult(request.command, "failed", `Failed to upload Radius artifact: ${errorMessage(error, "Unknown error")}`);
124
+ }
125
+ }
126
+ function shareCommandFailureDetail(error) {
127
+ // Compatibility: Pi reports a failed child's stderr, not execFile's command wrapper.
128
+ if (isRecord(error) && (typeof error.code === "number" || typeof error.signal === "string") && typeof error.stderr === "string") {
129
+ return error.stderr.trim() || "Unknown error";
130
+ }
131
+ return errorMessage(error, "Unknown error");
132
+ }
133
+ function shareViewerUrl(gistId) {
134
+ const baseUrl = process.env.PI_SHARE_VIEWER_URL || "https://pi.dev/session/";
135
+ return `${baseUrl}#${gistId}`;
136
+ }
137
+ /** The bearer token in a model-runtime auth result: an API key or an `Authorization: Bearer` header. */
138
+ function radiusAuthCredential(auth) {
139
+ const resolved = isRecord(auth) && isRecord(auth.auth) ? auth.auth : undefined;
140
+ if (resolved === undefined)
141
+ return undefined;
142
+ if (typeof resolved.apiKey === "string" && resolved.apiKey)
143
+ return resolved.apiKey;
144
+ const headers = isRecord(resolved.headers) ? resolved.headers : {};
145
+ const authorization = Object.entries(headers).find(([name]) => name.toLowerCase() === "authorization")?.[1];
146
+ return typeof authorization === "string" ? /^Bearer\s+(.+)$/iu.exec(authorization)?.[1] : undefined;
147
+ }
148
+ /**
149
+ * Append the pinned `pi.share` trailing entry (system prompt and tool schemas for the session viewer)
150
+ * to a branch JSONL export. It chains to the last exported entry and reuses the header timestamp.
151
+ */
152
+ function withRadiusShareTrailingEntry(jsonl, state, id) {
153
+ const lines = jsonl.split("\n").filter(line => line.length > 0);
154
+ const header = lines[0] === undefined ? undefined : JSON.parse(lines[0]);
155
+ const last = lines.length > 1 ? JSON.parse(lines.at(-1)) : undefined;
156
+ const entry = {
157
+ type: "custom",
158
+ customType: "pi.share",
159
+ id,
160
+ parentId: isRecord(last) && typeof last.id === "string" ? last.id : null,
161
+ timestamp: isRecord(header) && typeof header.timestamp === "string" ? header.timestamp : new Date().toISOString(),
162
+ data: {
163
+ systemPrompt: state.systemPrompt,
164
+ tools: (state.tools ?? []).filter(isRecord).map(tool => ({ name: tool.name, description: tool.description, parameters: tool.parameters })),
165
+ },
166
+ };
167
+ return `${[...lines, JSON.stringify(entry)].join("\n")}\n`;
168
+ }
@@ -7,33 +7,14 @@ export declare function pinnedSessionInfoPresentation(value: unknown, sessionNam
7
7
  readonly mode: unknown;
8
8
  readonly status: unknown;
9
9
  }): PiSessionInfoPresentation;
10
- /** The engine reports warming as a mode plus, once it has acted, the decision that produced the state. */
11
- export declare function pinnedCacheWarming(mode: unknown, status: unknown): PiSessionInfoPresentation["cacheWarming"];
12
- export declare function pinnedUsageCostBreakdown(entries: readonly unknown[]): PiSessionInfoPresentation["usageBreakdown"];
13
- export declare function pinnedCacheWaste(entries: readonly unknown[], modelRuntime: PiServicesApi["modelRuntime"]): PiSessionInfoPresentation["cacheWaste"];
14
10
  export declare function defaultWorkflowHost(): PiWorkflowHost;
15
11
  export declare function workflowLoginNotification(event: unknown): PiWorkflowLoginNotification | undefined;
16
12
  export declare function workflowResult(command: PiWorkflowRequest["command"], outcome: PiWorkflowResult["outcome"], message: string, detail?: string, messageKind?: PiWorkflowResult["messageKind"], messages?: readonly PiWorkflowMessage[]): PiWorkflowResult;
17
13
  export declare function workflowConfirmation(command: PiWorkflowRequest["command"], message: string, detail?: string): PiWorkflowResult;
18
14
  export declare function errorMessage(error: unknown, fallback: string): string;
19
- export declare function shareCommandFailureDetail(error: unknown): string;
20
15
  export declare function commandMissing(error: unknown): boolean;
21
16
  export declare function isAbortError(error: unknown): boolean;
22
- export declare function shareViewerUrl(gistId: string): string;
23
- export declare const RADIUS_SHARE_GATEWAY = "https://radius.pi.dev";
24
- export declare const RADIUS_AUTH_MIN_VALIDITY_MS: number;
25
- /** The bearer token in a model-runtime auth result: an API key or an `Authorization: Bearer` header. */
26
- export declare function radiusAuthCredential(auth: unknown): string | undefined;
27
- /**
28
- * Append the pinned `pi.share` trailing entry (system prompt and tool schemas for the session viewer)
29
- * to a branch JSONL export. It chains to the last exported entry and reuses the header timestamp.
30
- */
31
- export declare function withRadiusShareTrailingEntry(jsonl: string, state: {
32
- readonly systemPrompt?: unknown;
33
- readonly tools?: readonly unknown[];
34
- }, id: string): string;
35
17
  export declare function workflowOptions(value: unknown, idKey: string, labelKey: string): readonly PiWorkflowOption[];
36
- export declare function sessionInfoOptions(value: readonly unknown[]): readonly PiWorkflowOption[];
37
18
  export declare function pathArgument(value: string): string | undefined;
38
19
  export declare function pinnedHotkeySummary(): string;
39
20
  export declare function scopedModelRecords(modelRuntime: PiServicesApi["modelRuntime"]): readonly {
@@ -44,7 +25,6 @@ export declare function scopedModelReference(value: unknown): string | undefined
44
25
  export declare function resolveConfiguredModelIds(patterns: readonly string[], models: readonly {
45
26
  readonly descriptor: PiScopedModelDescriptor;
46
27
  }[]): readonly string[];
47
- export declare function wildcardMatcher(pattern: string): RegExp;
48
28
  export declare function isUnknownModel(value: unknown): boolean;
49
29
  export declare function findExactWorkflowModel<T>(reference: string, models: readonly T[]): T | undefined;
50
30
  export {};
@@ -80,7 +80,7 @@ export function pinnedSessionInfoPresentation(value, sessionName, entries, model
80
80
  };
81
81
  }
82
82
  /** The engine reports warming as a mode plus, once it has acted, the decision that produced the state. */
83
- export function pinnedCacheWarming(mode, status) {
83
+ function pinnedCacheWarming(mode, status) {
84
84
  const resolved = stringValue(mode) ?? "off";
85
85
  if (!isRecord(status))
86
86
  return { mode: resolved };
@@ -110,7 +110,7 @@ export function pinnedCacheWarming(mode, status) {
110
110
  },
111
111
  };
112
112
  }
113
- export function pinnedUsageCostBreakdown(entries) {
113
+ function pinnedUsageCostBreakdown(entries) {
114
114
  const totals = new Map();
115
115
  for (const entry of entries) {
116
116
  if (!isRecord(entry))
@@ -147,7 +147,7 @@ export function pinnedUsageCostBreakdown(entries) {
147
147
  .filter(entry => entry.cost > 0 || entry.tokens > 0)
148
148
  .sort((a, b) => b.cost - a.cost);
149
149
  }
150
- export function pinnedCacheWaste(entries, modelRuntime) {
150
+ function pinnedCacheWaste(entries, modelRuntime) {
151
151
  let previous;
152
152
  const totals = { missedTokens: 0, missedCost: 0, missCount: 0 };
153
153
  for (const entry of entries) {
@@ -262,59 +262,12 @@ export function workflowConfirmation(command, message, detail) {
262
262
  export function errorMessage(error, fallback) {
263
263
  return error instanceof Error ? error.message : fallback;
264
264
  }
265
- export function shareCommandFailureDetail(error) {
266
- // Compatibility: Pi reports a failed child's stderr, not execFile's command wrapper.
267
- if (isRecord(error) && (typeof error.code === "number" || typeof error.signal === "string") && typeof error.stderr === "string") {
268
- return error.stderr.trim() || "Unknown error";
269
- }
270
- return errorMessage(error, "Unknown error");
271
- }
272
265
  export function commandMissing(error) {
273
266
  return isRecord(error) && error.code === "ENOENT";
274
267
  }
275
268
  export function isAbortError(error) {
276
269
  return isRecord(error) && (error.name === "AbortError" || error.code === "ABORT_ERR");
277
270
  }
278
- export function shareViewerUrl(gistId) {
279
- const baseUrl = process.env.PI_SHARE_VIEWER_URL || "https://pi.dev/session/";
280
- return `${baseUrl}#${gistId}`;
281
- }
282
- // Provenance: the pinned engine's modes/interactive/session-share.ts Radius route and the model
283
- // runtime's DEFAULT_RADIUS_GATEWAY; neither is in the public API, so each upgrade re-checks them.
284
- export const RADIUS_SHARE_GATEWAY = "https://radius.pi.dev";
285
- export const RADIUS_AUTH_MIN_VALIDITY_MS = 5 * 60_000;
286
- /** The bearer token in a model-runtime auth result: an API key or an `Authorization: Bearer` header. */
287
- export function radiusAuthCredential(auth) {
288
- const resolved = isRecord(auth) && isRecord(auth.auth) ? auth.auth : undefined;
289
- if (resolved === undefined)
290
- return undefined;
291
- if (typeof resolved.apiKey === "string" && resolved.apiKey)
292
- return resolved.apiKey;
293
- const headers = isRecord(resolved.headers) ? resolved.headers : {};
294
- const authorization = Object.entries(headers).find(([name]) => name.toLowerCase() === "authorization")?.[1];
295
- return typeof authorization === "string" ? /^Bearer\s+(.+)$/iu.exec(authorization)?.[1] : undefined;
296
- }
297
- /**
298
- * Append the pinned `pi.share` trailing entry (system prompt and tool schemas for the session viewer)
299
- * to a branch JSONL export. It chains to the last exported entry and reuses the header timestamp.
300
- */
301
- export function withRadiusShareTrailingEntry(jsonl, state, id) {
302
- const lines = jsonl.split("\n").filter(line => line.length > 0);
303
- const header = lines[0] === undefined ? undefined : JSON.parse(lines[0]);
304
- const last = lines.length > 1 ? JSON.parse(lines.at(-1)) : undefined;
305
- const entry = {
306
- type: "custom",
307
- customType: "pi.share",
308
- id,
309
- parentId: isRecord(last) && typeof last.id === "string" ? last.id : null,
310
- timestamp: isRecord(header) && typeof header.timestamp === "string" ? header.timestamp : new Date().toISOString(),
311
- data: {
312
- systemPrompt: state.systemPrompt,
313
- tools: (state.tools ?? []).filter(isRecord).map(tool => ({ name: tool.name, description: tool.description, parameters: tool.parameters })),
314
- },
315
- };
316
- return `${[...lines, JSON.stringify(entry)].join("\n")}\n`;
317
- }
318
271
  export function workflowOptions(value, idKey, labelKey) {
319
272
  if (!Array.isArray(value))
320
273
  return [];
@@ -325,20 +278,6 @@ export function workflowOptions(value, idKey, labelKey) {
325
278
  return [{ id, label: stringProperty(item, labelKey) ?? id }];
326
279
  });
327
280
  }
328
- export function sessionInfoOptions(value) {
329
- return value.filter(isRecord).flatMap(info => {
330
- const path = stringProperty(info, "path");
331
- if (!path)
332
- return [];
333
- const modified = info.modified instanceof Date ? info.modified.toISOString() : stringProperty(info, "modified") ?? "unknown time";
334
- const messageCount = typeof info.messageCount === "number" ? info.messageCount : 0;
335
- return [{
336
- id: path,
337
- label: stringProperty(info, "name") ?? stringProperty(info, "firstMessage") ?? stringProperty(info, "id") ?? path,
338
- description: `${messageCount} messages · ${modified}`,
339
- }];
340
- });
341
- }
342
281
  export function pathArgument(value) {
343
282
  if (!value)
344
283
  return undefined;
@@ -390,7 +329,7 @@ export function resolveConfiguredModelIds(patterns, models) {
390
329
  }
391
330
  return resolved;
392
331
  }
393
- export function wildcardMatcher(pattern) {
332
+ function wildcardMatcher(pattern) {
394
333
  let source = "";
395
334
  for (const character of pattern) {
396
335
  if (character === "*")
@@ -1,5 +1,5 @@
1
1
  import type { SessionInfo } from "../startup-public.js";
2
- import { type OwnedUiAuthenticationProviderOption, type OwnedUiAuthenticationProviderStatus, type OwnedUiBashWorkflowResult, type OwnedUiCacheWarmingPresentation, type OwnedUiHiddenWorkflowCommandName, type OwnedUiModelsCommandName, type OwnedUiModelsContext, type OwnedUiModelsRefreshResult, type OwnedUiProjectTrustContext, type OwnedUiProjectTrustUpdate, type OwnedUiScopedModelDescriptor, type OwnedUiScopedModelsContext, type OwnedUiScopedModelsRefreshResult, type OwnedUiSessionInfoPresentation, type OwnedUiSessionProductMode, type OwnedUiSessionResumeMetadata, type OwnedUiSessionSettingsSnapshot, type OwnedUiWorkflowAutocompleteCommand, type OwnedUiWorkflowCommandName, type OwnedUiWorkflowInteractionHost, type OwnedUiWorkflowInteractionRequest, type OwnedUiWorkflowLoginNotification, type OwnedUiWorkflowLoginStart, type OwnedUiWorkflowMessage, type OwnedUiWorkflowMessageKind, type OwnedUiWorkflowOption, type OwnedUiWorkflowOutcome, type OwnedUiWorkflowPresentation, type OwnedUiWorkflowRequest, type OwnedUiWorkflowResult, type OwnedUiWorkflowRoute } from "../../../contracts/owned-ui/index.js";
2
+ import { type OwnedUiAuthenticationProviderOption, type OwnedUiAuthenticationProviderStatus, type OwnedUiBashWorkflowResult, type OwnedUiHiddenWorkflowCommandName, type OwnedUiModelsCommandName, type OwnedUiModelsContext, type OwnedUiModelsRefreshResult, type OwnedUiProjectTrustContext, type OwnedUiProjectTrustUpdate, type OwnedUiScopedModelDescriptor, type OwnedUiScopedModelsContext, type OwnedUiScopedModelsRefreshResult, type OwnedUiSessionInfoPresentation, type OwnedUiSessionProductMode, type OwnedUiSessionResumeMetadata, type OwnedUiSessionSettingsSnapshot, type OwnedUiWorkflowAutocompleteCommand, type OwnedUiWorkflowCommandName, type OwnedUiWorkflowInteractionHost, type OwnedUiWorkflowInteractionRequest, type OwnedUiWorkflowLoginNotification, type OwnedUiWorkflowLoginStart, type OwnedUiWorkflowMessage, type OwnedUiWorkflowMessageKind, type OwnedUiWorkflowOption, type OwnedUiWorkflowOutcome, type OwnedUiWorkflowPresentation, type OwnedUiWorkflowRequest, type OwnedUiWorkflowResult, type OwnedUiWorkflowRoute } from "../../../contracts/owned-ui/index.js";
3
3
  export declare const PINNED_PI_WORKFLOW_COMMAND_NAMES: readonly ["settings", "model", "tree", "thinking", "scoped-models", "export", "import", "share", "copy", "name", "session", "changelog", "hotkeys", "fork", "clone", "trust", "login", "logout", "new", "compact", "resume", "reload", "quit"];
4
4
  export declare const PINNED_PI_HIDDEN_COMMAND_NAMES: readonly ["debug", "arminsayshi", "dementedelves"];
5
5
  /**
@@ -12,8 +12,8 @@ export declare const PINNED_PI_DECLINED_COMMAND_NAMES: readonly ["bug"];
12
12
  export type PiWorkflowCommandName = OwnedUiWorkflowCommandName;
13
13
  export type PiHiddenWorkflowCommandName = OwnedUiHiddenWorkflowCommandName;
14
14
  export declare const OWNED_MODELS_COMMAND_NAME: "models";
15
- export type OwnedModelsCommandName = OwnedUiModelsCommandName;
16
- export type OwnedWorkflowCommandName = Exclude<PiWorkflowCommandName, "model" | "scoped-models"> | OwnedModelsCommandName;
15
+ type OwnedModelsCommandName = OwnedUiModelsCommandName;
16
+ type OwnedWorkflowCommandName = Exclude<PiWorkflowCommandName, "model" | "scoped-models"> | OwnedModelsCommandName;
17
17
  /** Bare A1's advertised catalog: `models` replaces the pinned pair and is followed by `thinking`. */
18
18
  export declare const OWNED_WORKFLOW_COMMAND_NAMES: readonly OwnedWorkflowCommandName[];
19
19
  export type PiProductMode = OwnedUiSessionProductMode;
@@ -33,7 +33,6 @@ export type PiAuthenticationProviderOption = OwnedUiAuthenticationProviderOption
33
33
  export type PiWorkflowRequest = OwnedUiWorkflowRequest;
34
34
  export type PiWorkflowOutcome = OwnedUiWorkflowOutcome;
35
35
  export type PiSessionInfoPresentation = OwnedUiSessionInfoPresentation;
36
- export type PiCacheWarmingPresentation = OwnedUiCacheWarmingPresentation;
37
36
  export type PiWorkflowPresentation = OwnedUiWorkflowPresentation;
38
37
  export type PiWorkflowMessageKind = OwnedUiWorkflowMessageKind;
39
38
  export type PiWorkflowMessage = OwnedUiWorkflowMessage;
@@ -75,10 +74,11 @@ export interface PiTreeSelectorContext {
75
74
  * Progress a session listing reports. `partialSessions` carries what the pinned manager has
76
75
  * loaded so far, so the selector can show results before the listing finishes.
77
76
  */
78
- export type PiSessionListProgress = (loaded: number, total: number, partialSessions?: readonly SessionInfo[]) => void;
77
+ type PiSessionListProgress = (loaded: number, total: number, partialSessions?: readonly SessionInfo[]) => void;
79
78
  export interface PiSessionSelectorContext {
80
79
  readonly currentSessionFilePath: string | undefined;
81
80
  readonly loadCurrentSessions: (onProgress?: PiSessionListProgress) => Promise<SessionInfo[]>;
82
81
  readonly loadAllSessions: (onProgress?: PiSessionListProgress) => Promise<SessionInfo[]>;
83
82
  readonly renameSession: (sessionFilePath: string, nextName: string | undefined) => Promise<void>;
84
83
  }
84
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { OwnedUiShellComponents, OwnedUiShellLazySelectorLoader } from "../../../contracts/owned-ui/index.js";
2
+ /** The Pi components and helpers behind the shell's neutral component record. */
3
+ export declare function createPiShellComponents(loadLazySelectors: () => Promise<OwnedUiShellLazySelectorLoader>): OwnedUiShellComponents;
@@ -0,0 +1,75 @@
1
+ import { createPiShellEditor } from "../components/shell-editor-autocomplete.js";
2
+ import { createPiExtensionUiBridge } from "../components/shell-extension-ui.js";
3
+ import { createPiQueuedInputStatus, createPiShellFooter, createPiShellHeader, createPiShellLoadedResources, createPiShellStatus, } from "../components/shell-footer-status.js";
4
+ import { createPiShellChangelog, createPiShellCollapsedChangelog, createPiShellHotkeys, createPiShellSessionInfo, renderPiShellCommandMessage, renderPiShellPackageUpdateNotice, renderPiShellReleaseUpdateBanner, renderPiShellReleaseUpdateNotice, renderPiShellStatusText, } from "../components/shell-presenters-info.js";
5
+ import { createPiShellTranscriptComponent, isPiPromptStyleCompaction, renderPiShellStartupDiagnostic, renderPiShellTranscriptBlock, } from "../components/shell-presenters-transcript.js";
6
+ import { createPiShellArmin, createPiShellAuthProviderSelector, createPiShellDialog, createPiShellEarendilAnnouncement, createPiShellExtensionSelector, createPiShellLoginDialog, createPiShellReloadBox, createPiShellSelector, createPiShellSkillsSelector, createPiShellTrustSelector, createPiShellUserMessageSelector, } from "../components/shell-selectors-dialogs.js";
7
+ import { piShellHyperlink, piShellTruncateToWidth, piShellVisibleWidth, renderPiShellInstalledUpdateStatus, } from "../components/shell-shared-facade.js";
8
+ import { SKILLS_COMMAND_NAME, findSkillByArgument, rewriteSkillsTunnelSubmission, skillPrompt, skillsFromCommands, } from "../components/skills-command.js";
9
+ import { ProgramStatusReporter } from "../components/upstream/program-status-reporter.js";
10
+ import { workflowCommandNames } from "../engine/workflows.js";
11
+ /** The Pi components and helpers behind the shell's neutral component record. */
12
+ export function createPiShellComponents(loadLazySelectors) {
13
+ return {
14
+ editor: { create: createPiShellEditor },
15
+ chrome: {
16
+ header: createPiShellHeader,
17
+ status: createPiShellStatus,
18
+ footer: createPiShellFooter,
19
+ queuedInput: createPiQueuedInputStatus,
20
+ loadedResources: createPiShellLoadedResources,
21
+ installedUpdateStatus: renderPiShellInstalledUpdateStatus,
22
+ releaseUpdateBanner: renderPiShellReleaseUpdateBanner,
23
+ programStatusReporter: (report, getSessionName, app) => new ProgramStatusReporter(report, getSessionName, app),
24
+ },
25
+ transcript: {
26
+ component: createPiShellTranscriptComponent,
27
+ renderBlock: renderPiShellTranscriptBlock,
28
+ renderStartupDiagnostic: renderPiShellStartupDiagnostic,
29
+ isPromptStyleCompaction: isPiPromptStyleCompaction,
30
+ },
31
+ info: {
32
+ changelog: createPiShellChangelog,
33
+ collapsedChangelog: createPiShellCollapsedChangelog,
34
+ hotkeys: createPiShellHotkeys,
35
+ sessionInfo: createPiShellSessionInfo,
36
+ commandMessage: renderPiShellCommandMessage,
37
+ statusText: renderPiShellStatusText,
38
+ packageUpdateNotice: renderPiShellPackageUpdateNotice,
39
+ releaseUpdateNotice: renderPiShellReleaseUpdateNotice,
40
+ armin: createPiShellArmin,
41
+ earendilAnnouncement: createPiShellEarendilAnnouncement,
42
+ reloadBox: createPiShellReloadBox,
43
+ },
44
+ dialogs: {
45
+ dialog: createPiShellDialog,
46
+ selector: createPiShellSelector,
47
+ extensionSelector: createPiShellExtensionSelector,
48
+ authProviderSelector: createPiShellAuthProviderSelector,
49
+ loginDialog: createPiShellLoginDialog,
50
+ skillsSelector: createPiShellSkillsSelector,
51
+ trustSelector: createPiShellTrustSelector,
52
+ userMessageSelector: createPiShellUserMessageSelector,
53
+ async shareProgress(runtime, message, style) {
54
+ // Rationale: sharing is rare, so its progress surfaces stay off the startup graph.
55
+ const surfaces = await import("../components/share-operation-dialog.js");
56
+ return (style === "dialog" ? surfaces.createPiShellShareOperationDialog : surfaces.createPiShellOperationLoader)(runtime, message);
57
+ },
58
+ extensionUiBridge: createPiExtensionUiBridge,
59
+ lazySelectors: loadLazySelectors,
60
+ },
61
+ text: {
62
+ visibleWidth: piShellVisibleWidth,
63
+ truncateToWidth: piShellTruncateToWidth,
64
+ hyperlink: piShellHyperlink,
65
+ },
66
+ workflows: { commandNames: workflowCommandNames },
67
+ skills: {
68
+ commandName: SKILLS_COMMAND_NAME,
69
+ fromCommands: skillsFromCommands,
70
+ findByArgument: findSkillByArgument,
71
+ rewriteTunnelSubmission: rewriteSkillsTunnelSubmission,
72
+ prompt: skillPrompt,
73
+ },
74
+ };
75
+ }
@@ -1,2 +1,3 @@
1
+ export { PI_SHELL_PRESENTATION } from "./presentation.js";
1
2
  export { createPiSessionPresenters } from "./presenters.js";
2
3
  export type { PiSessionPresenterBackend, PiSessionPresentersOptions } from "./presenters.js";
@@ -1 +1,2 @@
1
+ export { PI_SHELL_PRESENTATION } from "./presentation.js";
1
2
  export { createPiSessionPresenters } from "./presenters.js";
@@ -0,0 +1,3 @@
1
+ import type { ShellPresentationPorts } from "../../../contracts/presentation/index.js";
2
+ /** Everything the shell takes from Pi's presentation, assembled once from the component and TUI adapters. */
3
+ export declare const PI_SHELL_PRESENTATION: ShellPresentationPorts;
@@ -0,0 +1,10 @@
1
+ import { PI_THEME_SOURCE } from "../components/theme.js";
2
+ import { piCanvasBackgroundAnsi, PINNED_PI_LAYOUT } from "../components/upstream/theme/theme.js";
3
+ import { PI_TERMINAL_RUNTIME } from "../tui-runtime/runtime-factory.js";
4
+ /** Everything the shell takes from Pi's presentation, assembled once from the component and TUI adapters. */
5
+ export const PI_SHELL_PRESENTATION = Object.freeze({
6
+ theme: PI_THEME_SOURCE,
7
+ canvasBackground: (style) => piCanvasBackgroundAnsi(style),
8
+ pinnedOutputPad: PINNED_PI_LAYOUT.outputPad,
9
+ terminalRuntime: PI_TERMINAL_RUNTIME,
10
+ });
@@ -1,4 +1,5 @@
1
1
  import type { OwnedUiSessionBackend, OwnedUiSessionPresenters } from "../../../contracts/owned-ui/index.js";
2
+ import type { ShellPresentationPorts } from "../../../contracts/presentation/index.js";
2
3
  import type { PiSessionPresentationSource } from "../engine/adapter.js";
3
4
  import type { PiShellLazySelectorLoader } from "../components/lazy-selectors.js";
4
5
  /** The session backend plus the Pi objects its selectors are built from; the Pi engine adapter is one. */
@@ -13,4 +14,4 @@ export interface PiSessionPresentersOptions {
13
14
  * Builds the selectors and transcript renderers whose inputs are Pi engine objects. This owner is the one place
14
15
  * that sees both the engine adapter and the Pi components, so the shell only ever holds the neutral port.
15
16
  */
16
- export declare function createPiSessionPresenters(adapter: PiSessionPresenterBackend, options?: PiSessionPresentersOptions): OwnedUiSessionPresenters;
17
+ export declare function createPiSessionPresenters(adapter: PiSessionPresenterBackend, options?: PiSessionPresentersOptions): OwnedUiSessionPresenters & ShellPresentationPorts;
@@ -1,4 +1,6 @@
1
1
  import { createPiShellModelSelector, createPiShellModelsDialog, createPiShellScopedModelsSelector, createPiShellSessionSelector, createPiShellSettingsSelector, } from "../components/shell-selectors-dialogs.js";
2
+ import { PI_SHELL_PRESENTATION } from "./presentation.js";
3
+ import { createPiShellComponents } from "./components.js";
2
4
  const MODEL_REFRESH_TIMEOUT_MS = 15_000;
3
5
  const MODEL_REFRESH_TIMED_OUT = "Model refresh timed out; showing cached models.";
4
6
  /**
@@ -24,7 +26,7 @@ export function createPiSessionPresenters(adapter, options = {}) {
24
26
  // Compatibility: the component adapter passes Pi's own keybinding config through the neutral port.
25
27
  getShortcuts: bindings => source().pinnedShortcutDescriptions(bindings),
26
28
  };
27
- return {
29
+ return { ...PI_SHELL_PRESENTATION, components: createPiShellComponents(loadLazySelectors),
28
30
  transcriptRenderers: () => renderers,
29
31
  openModelSelector(host, initialSearchInput) {
30
32
  const context = source().pinnedModelSelectorContext();
@@ -1,5 +1,5 @@
1
1
  import { type ProgramStatus, type WheelScrollLines } from "@earendil-works/pi-tui";
2
- import type { PiTuiComponentPort, PiTuiInputListener, PiTuiOverlayHandle, PiTuiOverlayOptions, PiTuiPreInputListener, PiTuiRuntimeAdapterOptions, PiTuiRuntimeState, PiTuiScrollState, PiTuiStopOptions, PiTuiViewport } from "./contracts.js";
2
+ import type { TerminalComponentPort, TerminalInputListener, TerminalOverlayHandle, TerminalOverlayOptions, TerminalPreInputListener, TerminalRuntimeOptions, TerminalRuntimeState, TerminalStopOptions, TerminalViewport } from "../../../contracts/presentation/index.js";
3
3
  /**
4
4
  * Re-encodes one key report decoded by pi-tui in the legacy form, so a kitty-keyboard terminal
5
5
  * and a legacy terminal produce the same owned-screen action. Releases decode
@@ -15,19 +15,14 @@ export declare class PiTuiRuntimeError extends Error {
15
15
  /** Bridges neutral presentation ports to one Pi TUI instance and owns terminal restoration on stop. */
16
16
  export declare class PiTuiRuntimeAdapter {
17
17
  #private;
18
- constructor(options: PiTuiRuntimeAdapterOptions);
19
- get state(): PiTuiRuntimeState;
18
+ constructor(options: TerminalRuntimeOptions);
19
+ get state(): TerminalRuntimeState;
20
20
  get active(): boolean;
21
21
  get mode(): "regular" | "fullscreen";
22
22
  get fullRedraws(): number;
23
- viewport(): PiTuiViewport;
24
- scrollState(id?: string): PiTuiScrollState;
25
- scrollBy(lines: number, id?: string): void;
26
- scrollToTop(id?: string): void;
27
- scrollToBottom(id?: string): void;
23
+ viewport(): TerminalViewport;
28
24
  start(): void;
29
- setFocus(component: PiTuiComponentPort | null): void;
30
- showOverlay(component: PiTuiComponentPort, options?: PiTuiOverlayOptions): PiTuiOverlayHandle;
25
+ showOverlay(component: TerminalComponentPort, options?: TerminalOverlayOptions): TerminalOverlayHandle;
31
26
  hasOverlay(): boolean;
32
27
  /** Keyboard capture is independent of a passive overlay's visible pointer region. */
33
28
  hasFocusedOverlay(): boolean;
@@ -44,30 +39,25 @@ export declare class PiTuiRuntimeAdapter {
44
39
  * renderer keeps scheduling but nothing it paints reaches the terminal.
45
40
  */
46
41
  freezePresentation(): void;
47
- get presentationFrozen(): boolean;
48
42
  /**
49
43
  * Keeps asynchronous replacement-surface construction atomic at the terminal. Renderers may
50
44
  * compose while held, but their writes are dropped until the final forced repaint on release.
51
45
  */
52
46
  beginPresentationHold(): () => void;
53
47
  get presentationHeld(): boolean;
54
- addPreInputListener(listener: PiTuiPreInputListener): () => void;
55
- addInputListener(listener: PiTuiInputListener): () => void;
48
+ addPreInputListener(listener: TerminalPreInputListener): () => void;
49
+ addInputListener(listener: TerminalInputListener): () => void;
56
50
  switchMode(mode: "regular" | "fullscreen"): boolean;
57
51
  setHardwareCursor(enabled: boolean): void;
58
- getHardwareCursor(): boolean;
59
52
  setClearOnShrink(enabled: boolean): void;
60
53
  setWheelScrollLines(lines: WheelScrollLines): void;
61
- getClearOnShrink(): boolean;
62
54
  setTerminalProgress(active: boolean): void;
63
55
  setProgramStatus(status: ProgramStatus): void;
64
56
  setTitle(title: string): void;
65
- /** Shows a bounded fullscreen acknowledgement without changing root layout geometry. */
66
- showFlash(message: string, durationMs?: number): void;
67
57
  writeAfterStop(text: string): void;
68
58
  invalidate(): void;
69
59
  requestRender(force?: boolean): void;
70
60
  renderNow(force?: boolean): void;
71
- stop(options?: PiTuiStopOptions): Promise<void>;
72
- dispose(options?: PiTuiStopOptions): Promise<void>;
61
+ stop(options?: TerminalStopOptions): Promise<void>;
62
+ dispose(options?: TerminalStopOptions): Promise<void>;
73
63
  }