@timurproko/a1 0.2.6 → 0.2.7-dev.1221

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 (410) hide show
  1. package/README.md +41 -3
  2. package/bin/automatic-update.js +7 -0
  3. package/bin/cli.js +4 -0
  4. package/bin/guardian.js +5 -0
  5. package/bin/tab-launch-context.d.ts +27 -0
  6. package/bin/tab-launch-context.js +94 -0
  7. package/bin/ui.js +107 -59
  8. package/dist/app/session-shell/clipboard-diagnostics.js +1 -1
  9. package/dist/app/session-shell/dialog-coordinator.d.ts +42 -0
  10. package/dist/app/session-shell/dialog-coordinator.js +133 -0
  11. package/dist/app/session-shell/dock-chrome.d.ts +34 -0
  12. package/dist/app/session-shell/dock-chrome.js +109 -0
  13. package/dist/app/session-shell/exit-notice.d.ts +1 -1
  14. package/dist/app/session-shell/exit-notice.js +1 -1
  15. package/dist/app/session-shell/extension-surface.d.ts +30 -0
  16. package/dist/app/session-shell/extension-surface.js +105 -0
  17. package/dist/app/session-shell/helper-pool.d.ts +3 -5
  18. package/dist/app/session-shell/helper-pool.js +3 -5
  19. package/dist/app/session-shell/input-surface-switch.d.ts +36 -0
  20. package/dist/app/session-shell/input-surface-switch.js +85 -0
  21. package/dist/app/session-shell/login-interaction.d.ts +27 -0
  22. package/dist/app/session-shell/login-interaction.js +91 -0
  23. package/dist/app/session-shell/prompt-submission.d.ts +48 -0
  24. package/dist/app/session-shell/prompt-submission.js +276 -0
  25. package/dist/app/session-shell/resident-tab-coordinator.d.ts +38 -0
  26. package/dist/app/session-shell/resident-tab-coordinator.js +77 -0
  27. package/dist/app/session-shell/response-copy-helper.js +21 -6
  28. package/dist/app/session-shell/response-copy-protocol.d.ts +1 -1
  29. package/dist/app/session-shell/response-copy-transport.d.ts +16 -6
  30. package/dist/app/session-shell/response-copy-transport.js +69 -17
  31. package/dist/app/session-shell/session-concern.d.ts +22 -0
  32. package/dist/app/session-shell/session-concern.js +29 -0
  33. package/dist/app/session-shell/session-lifecycle.d.ts +29 -0
  34. package/dist/app/session-shell/session-lifecycle.js +49 -0
  35. package/dist/app/session-shell/session-shell-root.d.ts +42 -6
  36. package/dist/app/session-shell/session-shell-root.js +196 -908
  37. package/dist/app/session-shell/session-shell.d.ts +3 -8
  38. package/dist/app/session-shell/session-shell.js +324 -835
  39. package/dist/app/session-shell/session-viewport-controller.d.ts +2 -2
  40. package/dist/app/session-shell/session-viewport-controller.js +29 -15
  41. package/dist/app/session-shell/settings-bindings.d.ts +17 -0
  42. package/dist/app/session-shell/settings-bindings.js +91 -0
  43. package/dist/app/session-shell/shell-editor-factory.d.ts +27 -0
  44. package/dist/app/session-shell/shell-editor-factory.js +102 -0
  45. package/dist/app/session-shell/shell-host.d.ts +6 -0
  46. package/dist/app/session-shell/shell-host.js +34 -7
  47. package/dist/app/session-shell/shell-layout.d.ts +64 -0
  48. package/dist/app/session-shell/shell-layout.js +18 -0
  49. package/dist/app/session-shell/suggestion-surface.d.ts +25 -0
  50. package/dist/app/session-shell/suggestion-surface.js +63 -0
  51. package/dist/app/session-shell/transcript-document.d.ts +78 -0
  52. package/dist/app/session-shell/transcript-document.js +365 -0
  53. package/dist/app/session-shell/viewport-layout.d.ts +31 -0
  54. package/dist/app/session-shell/viewport-layout.js +160 -0
  55. package/dist/app/session-shell/workflow-output.d.ts +33 -0
  56. package/dist/app/session-shell/workflow-output.js +174 -0
  57. package/dist/app/session-shell/workflow-router.d.ts +25 -0
  58. package/dist/app/session-shell/workflow-router.js +39 -0
  59. package/dist/cli/dispatch.d.ts +11 -1
  60. package/dist/cli/dispatch.js +79 -5
  61. package/dist/cli/tabs-request.d.ts +7 -0
  62. package/dist/cli/tabs-request.js +1 -0
  63. package/dist/cli/tabs.d.ts +14 -0
  64. package/dist/cli/tabs.js +151 -0
  65. package/dist/cli/version-stats.js +38 -3
  66. package/dist/composition/owned-settings.d.ts +12 -0
  67. package/dist/composition/owned-settings.js +36 -0
  68. package/dist/composition/owned-ui.d.ts +27 -28
  69. package/dist/composition/owned-ui.js +205 -153
  70. package/dist/composition/resident-tab-bridge.d.ts +25 -0
  71. package/dist/composition/resident-tab-bridge.js +180 -0
  72. package/dist/composition/session-backend.d.ts +19 -0
  73. package/dist/composition/session-backend.js +1 -0
  74. package/dist/composition/session-runtime-registry.d.ts +20 -0
  75. package/dist/composition/session-runtime-registry.js +85 -0
  76. package/dist/composition/settings-route-host.d.ts +16 -1
  77. package/dist/composition/settings-route-host.js +29 -10
  78. package/dist/composition/settings-search-input.d.ts +9 -0
  79. package/dist/composition/settings-search-input.js +58 -0
  80. package/dist/composition/startup-route.d.ts +32 -0
  81. package/dist/composition/startup-route.js +72 -0
  82. package/dist/composition/utility-tab.d.ts +28 -0
  83. package/dist/composition/utility-tab.js +242 -0
  84. package/dist/contracts/owned-ui/index.d.ts +1 -1
  85. package/dist/contracts/owned-ui/model.d.ts +3 -0
  86. package/dist/contracts/owned-ui/session-backend.d.ts +3 -0
  87. package/dist/contracts/owned-ui/session-workflows.d.ts +11 -4
  88. package/dist/contracts/presentation/index.d.ts +11 -0
  89. package/dist/contracts/presentation/index.js +12 -0
  90. package/dist/features/launch/development-launch.js +6 -0
  91. package/dist/features/launch/index.d.ts +1 -1
  92. package/dist/features/launch/intent.d.ts +3 -1
  93. package/dist/features/launch/intent.js +7 -4
  94. package/dist/features/launch/profile-paths.js +4 -0
  95. package/dist/features/owned-ui/plus-menu-dialog.d.ts +22 -0
  96. package/dist/features/owned-ui/plus-menu-dialog.js +76 -0
  97. package/dist/features/owned-ui/project-trust-dialog.d.ts +1 -1
  98. package/dist/features/owned-ui/project-trust-dialog.js +6 -8
  99. package/dist/features/owned-ui/project-trust-prompt.d.ts +1 -0
  100. package/dist/features/owned-ui/project-trust-prompt.js +7 -3
  101. package/dist/features/owned-ui/reference-screen-app.d.ts +2 -0
  102. package/dist/features/owned-ui/reference-screen-app.js +12 -2
  103. package/dist/features/owned-ui/settings-app.d.ts +12 -2
  104. package/dist/features/owned-ui/settings-app.js +116 -81
  105. package/dist/features/owned-ui/settings-search-input.d.ts +29 -0
  106. package/dist/features/owned-ui/settings-search-input.js +1 -0
  107. package/dist/features/prompt-history/index.d.ts +1 -1
  108. package/dist/features/prompt-history/paths.d.ts +2 -1
  109. package/dist/features/prompt-history/paths.js +10 -2
  110. package/dist/features/prompt-history/service.d.ts +5 -0
  111. package/dist/features/prompt-history/service.js +1 -1
  112. package/dist/features/resident-tab/auto-name.d.ts +11 -0
  113. package/dist/features/resident-tab/auto-name.js +44 -0
  114. package/dist/features/resident-tab/index.d.ts +5 -0
  115. package/dist/features/resident-tab/index.js +7 -0
  116. package/dist/features/resident-tab/shortcut-bindings-file.d.ts +8 -0
  117. package/dist/features/resident-tab/shortcut-bindings-file.js +40 -0
  118. package/dist/features/resident-tab/shortcut-declarations.d.ts +13 -0
  119. package/dist/features/resident-tab/shortcut-declarations.js +26 -0
  120. package/dist/features/resident-tab/shortcut-projection.d.ts +29 -0
  121. package/dist/features/resident-tab/shortcut-projection.js +64 -0
  122. package/dist/features/resident-tab/status-deriver.d.ts +10 -0
  123. package/dist/features/resident-tab/status-deriver.js +12 -0
  124. package/dist/foundation/launch-context/index.d.ts +12 -0
  125. package/dist/foundation/launch-context/index.js +26 -0
  126. package/dist/foundation/launch-guardian/exit-watcher.d.ts +14 -0
  127. package/dist/foundation/launch-guardian/exit-watcher.js +94 -0
  128. package/dist/foundation/launch-guardian/main.d.ts +7 -1
  129. package/dist/foundation/launch-guardian/main.js +60 -7
  130. package/dist/foundation/lifecycle/session-repository-context.js +16 -2
  131. package/dist/foundation/process-containment/{native-guardian-containment.d.ts → addon-containment.d.ts} +7 -5
  132. package/dist/foundation/process-containment/addon-containment.js +139 -0
  133. package/dist/foundation/process-containment/addon-process-inspector.d.ts +11 -0
  134. package/dist/foundation/process-containment/addon-process-inspector.js +36 -0
  135. package/dist/foundation/process-containment/addon.d.ts +42 -0
  136. package/dist/foundation/process-containment/addon.js +57 -0
  137. package/dist/foundation/process-containment/artifact.d.ts +1 -1
  138. package/dist/foundation/process-containment/artifact.js +6 -5
  139. package/dist/foundation/process-containment/contracts.d.ts +2 -0
  140. package/dist/foundation/process-containment/index.d.ts +4 -4
  141. package/dist/foundation/process-containment/index.js +3 -3
  142. package/dist/foundation/process-containment/native-process-inspector.d.ts +2 -1
  143. package/dist/foundation/process-containment/native-process-inspector.js +10 -10
  144. package/dist/foundation/release/automatic-update.d.ts +37 -0
  145. package/dist/foundation/release/automatic-update.js +265 -0
  146. package/dist/foundation/release/bootstrap.d.ts +7 -9
  147. package/dist/foundation/release/bootstrap.js +107 -24
  148. package/dist/foundation/release/cohort-state.d.ts +1 -1
  149. package/dist/foundation/release/cohort-state.js +1 -1
  150. package/dist/foundation/release/dependency-certification.js +54 -19
  151. package/dist/foundation/release/early-accent.d.ts +12 -0
  152. package/dist/foundation/release/early-accent.js +59 -0
  153. package/dist/foundation/release/index.d.ts +2 -2
  154. package/dist/foundation/release/index.js +2 -2
  155. package/dist/foundation/release/latest-release.d.ts +24 -2
  156. package/dist/foundation/release/latest-release.js +51 -1
  157. package/dist/foundation/release/progress-palette.generated.d.ts +137 -3
  158. package/dist/foundation/release/progress-palette.generated.js +137 -3
  159. package/dist/foundation/release/release-gc.d.ts +3 -0
  160. package/dist/foundation/release/release-gc.js +59 -8
  161. package/dist/foundation/release/release-store.d.ts +12 -0
  162. package/dist/foundation/release/release-store.js +124 -2
  163. package/dist/foundation/release/update-execution-lease.d.ts +48 -0
  164. package/dist/foundation/release/update-execution-lease.js +161 -0
  165. package/dist/foundation/release/update.d.ts +12 -7
  166. package/dist/foundation/release/update.js +281 -196
  167. package/dist/foundation/resident-tabs/bounded-host-command.d.ts +18 -0
  168. package/dist/foundation/resident-tabs/bounded-host-command.js +39 -0
  169. package/dist/foundation/resident-tabs/bridge-client.d.ts +70 -0
  170. package/dist/foundation/resident-tabs/bridge-client.js +321 -0
  171. package/dist/foundation/resident-tabs/doctor.d.ts +28 -0
  172. package/dist/foundation/resident-tabs/doctor.js +166 -0
  173. package/dist/foundation/resident-tabs/draft-checkpoint.d.ts +27 -0
  174. package/dist/foundation/resident-tabs/draft-checkpoint.js +145 -0
  175. package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +36 -0
  176. package/dist/foundation/resident-tabs/ensure-terminal-host.js +151 -0
  177. package/dist/foundation/resident-tabs/fault-injection.d.ts +8 -0
  178. package/dist/foundation/resident-tabs/fault-injection.js +26 -0
  179. package/dist/foundation/resident-tabs/fixture-control.d.ts +7 -0
  180. package/dist/foundation/resident-tabs/fixture-control.js +35 -0
  181. package/dist/foundation/resident-tabs/host-entry.d.ts +1 -0
  182. package/dist/foundation/resident-tabs/host-entry.js +17 -0
  183. package/dist/foundation/resident-tabs/index.d.ts +12 -0
  184. package/dist/foundation/resident-tabs/index.js +6 -0
  185. package/dist/foundation/resident-tabs/maintenance.d.ts +39 -0
  186. package/dist/foundation/resident-tabs/maintenance.js +75 -0
  187. package/dist/foundation/resident-tabs/progress-observation-schema.d.ts +34 -0
  188. package/dist/foundation/resident-tabs/progress-observation-schema.js +1 -0
  189. package/dist/foundation/resident-tabs/progress-observation.d.ts +4 -0
  190. package/dist/foundation/resident-tabs/progress-observation.js +150 -0
  191. package/dist/foundation/resident-tabs/prompt-journal.d.ts +63 -0
  192. package/dist/foundation/resident-tabs/prompt-journal.js +213 -0
  193. package/dist/foundation/resident-tabs/protocol.d.ts +12 -0
  194. package/dist/foundation/resident-tabs/protocol.js +195 -0
  195. package/dist/foundation/resident-tabs/recovery.d.ts +26 -0
  196. package/dist/foundation/resident-tabs/recovery.js +205 -0
  197. package/dist/foundation/resident-tabs/release-holds.d.ts +28 -0
  198. package/dist/foundation/resident-tabs/release-holds.js +75 -0
  199. package/dist/foundation/resident-tabs/routes.d.ts +5 -0
  200. package/dist/foundation/resident-tabs/routes.js +5 -0
  201. package/dist/foundation/resident-tabs/routing.d.ts +11 -0
  202. package/dist/foundation/resident-tabs/routing.js +10 -0
  203. package/dist/foundation/resident-tabs/session-sync.d.ts +14 -0
  204. package/dist/foundation/resident-tabs/session-sync.js +37 -0
  205. package/dist/foundation/resident-tabs/settings.d.ts +12 -0
  206. package/dist/foundation/resident-tabs/settings.js +58 -0
  207. package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +14 -0
  208. package/dist/foundation/resident-tabs/terminal-host-artifact.js +78 -0
  209. package/dist/foundation/resident-tabs/zip-archive.d.ts +9 -0
  210. package/dist/foundation/resident-tabs/zip-archive.js +56 -0
  211. package/dist/foundation/session-writer-lock/index.d.ts +30 -0
  212. package/dist/foundation/session-writer-lock/index.js +203 -0
  213. package/dist/foundation/startup/startup-descriptor.js +2 -2
  214. package/dist/foundation/terminal-cleanup/index.d.ts +1 -1
  215. package/dist/foundation/terminal-cleanup/index.js +1 -1
  216. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +6 -0
  217. package/dist/foundation/terminal-cleanup/terminal-reset.js +6 -0
  218. package/dist/integrations/pi/components/editor-interaction.d.ts +2 -0
  219. package/dist/integrations/pi/components/modal-frame.d.ts +17 -1
  220. package/dist/integrations/pi/components/modal-frame.js +48 -9
  221. package/dist/integrations/pi/components/models-dialog.js +4 -52
  222. package/dist/integrations/pi/components/owned-editor-ux.d.ts +6 -1
  223. package/dist/integrations/pi/components/owned-editor-ux.js +90 -6
  224. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +4 -4
  225. package/dist/integrations/pi/components/resources/builtin-themes.js +4 -4
  226. package/dist/integrations/pi/components/share-operation-dialog.d.ts +2 -0
  227. package/dist/integrations/pi/components/share-operation-dialog.js +2 -1
  228. package/dist/integrations/pi/components/shell-editor-autocomplete.js +58 -36
  229. package/dist/integrations/pi/components/shell-extension-ui.js +79 -60
  230. package/dist/integrations/pi/components/shell-footer-status.d.ts +1 -1
  231. package/dist/integrations/pi/components/shell-footer-status.js +21 -5
  232. package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
  233. package/dist/integrations/pi/components/shell-presenters-info.d.ts +5 -2
  234. package/dist/integrations/pi/components/shell-presenters-info.js +18 -4
  235. package/dist/integrations/pi/components/shell-presenters-transcript.js +4 -1
  236. package/dist/integrations/pi/components/shell-selectors-dialogs.js +5 -1
  237. package/dist/integrations/pi/components/shell-shared-facade.d.ts +12 -1
  238. package/dist/integrations/pi/components/skills-dialog.js +2 -2
  239. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +1 -1
  240. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +17 -4
  241. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
  242. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
  243. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
  244. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +1 -1
  245. package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
  246. package/dist/integrations/pi/components/upstream/components/extension-input.js +1 -1
  247. package/dist/integrations/pi/components/upstream/components/extension-selector.js +1 -1
  248. package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
  249. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +8 -6
  250. package/dist/integrations/pi/components/upstream/components/owned-editor.js +16 -9
  251. package/dist/integrations/pi/components/upstream/components/pi-logo.js +1 -1
  252. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +4 -4
  253. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +2 -2
  254. package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +2 -1
  255. package/dist/integrations/pi/components/upstream/components/session-footer.js +31 -25
  256. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
  257. package/dist/integrations/pi/components/upstream/components/session-selector.js +8 -7
  258. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
  259. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
  260. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +2 -2
  261. package/dist/integrations/pi/components/upstream/components/status-indicator.js +3 -3
  262. package/dist/integrations/pi/components/upstream/components/themed-text.d.ts +1 -1
  263. package/dist/integrations/pi/components/upstream/components/themed-text.js +1 -1
  264. package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +8 -7
  265. package/dist/integrations/pi/components/upstream/components/thinking-selector.js +10 -9
  266. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +2 -6
  267. package/dist/integrations/pi/components/upstream/components/tool-execution.js +103 -101
  268. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +9 -9
  269. package/dist/integrations/pi/components/upstream/components/tree-selector.js +13 -21
  270. package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
  271. package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
  272. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +2 -2
  273. package/dist/integrations/pi/components/upstream/history/editor-core.js +7 -5
  274. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
  275. package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
  276. package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
  277. package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
  278. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
  279. package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
  280. package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
  281. package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
  282. package/dist/integrations/pi/components/upstream/program-status-reporter.d.ts +1 -1
  283. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +1 -1
  284. package/dist/integrations/pi/components/upstream/theme/theme.d.ts +5 -0
  285. package/dist/integrations/pi/components/upstream/theme/theme.js +29 -2
  286. package/dist/integrations/pi/engine/adapter.d.ts +5 -77
  287. package/dist/integrations/pi/engine/adapter.js +95 -394
  288. package/dist/integrations/pi/engine/command-dispatch.d.ts +13 -0
  289. package/dist/integrations/pi/engine/command-dispatch.js +57 -0
  290. package/dist/integrations/pi/engine/host.js +2 -2
  291. package/dist/integrations/pi/engine/offline-settings-port.d.ts +23 -0
  292. package/dist/integrations/pi/engine/offline-settings-port.js +53 -0
  293. package/dist/integrations/pi/engine/pi-settings-metadata.json +14 -2
  294. package/dist/integrations/pi/engine/ports.d.ts +56 -0
  295. package/dist/integrations/pi/engine/ports.js +93 -0
  296. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +1 -0
  297. package/dist/integrations/pi/engine/prompt-suggestions.js +40 -0
  298. package/dist/integrations/pi/engine/resources/changelog.json +4 -4
  299. package/dist/integrations/pi/engine/runtime-integration.js +102 -29
  300. package/dist/integrations/pi/engine/session-runtime.d.ts +0 -6
  301. package/dist/integrations/pi/engine/session-runtime.js +13 -5
  302. package/dist/integrations/pi/engine/session-selection.d.ts +3 -0
  303. package/dist/integrations/pi/engine/session-selection.js +45 -9
  304. package/dist/integrations/pi/engine/settings-bridge.d.ts +5 -0
  305. package/dist/integrations/pi/engine/settings-bridge.js +15 -0
  306. package/dist/integrations/pi/engine/settings-port.js +11 -15
  307. package/dist/integrations/pi/engine/view-state.d.ts +42 -0
  308. package/dist/integrations/pi/engine/view-state.js +126 -0
  309. package/dist/integrations/pi/engine/workflow-contexts.js +10 -1
  310. package/dist/integrations/pi/engine/workflow-runner.js +73 -4
  311. package/dist/integrations/pi/engine/workflow-support.d.ts +12 -0
  312. package/dist/integrations/pi/engine/workflow-support.js +36 -0
  313. package/dist/integrations/pi/engine/workflows.d.ts +3 -1
  314. package/dist/integrations/pi/engine/workflows.js +1 -0
  315. package/dist/integrations/pi/startup-public.js +257 -310
  316. package/dist/integrations/pi/startup-public.manifest.json +564 -440
  317. package/dist/integrations/pi/tui-runtime/adapter.d.ts +6 -0
  318. package/dist/integrations/pi/tui-runtime/adapter.js +32 -1
  319. package/dist/integrations/pi/tui-runtime/contracts.d.ts +5 -0
  320. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +12 -1
  321. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +31 -2
  322. package/dist/native/darwin-arm64/manifest.json +10 -7
  323. package/dist/native/darwin-arm64/process-guardian.node +0 -0
  324. package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +10500 -0
  325. package/dist/native/darwin-arm64/terminal-host.manifest.json +46 -0
  326. package/dist/native/darwin-arm64/terminal-host.node +0 -0
  327. package/dist/native/darwin-x64/manifest.json +23 -0
  328. package/dist/native/darwin-x64/process-guardian.node +0 -0
  329. package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10737 -0
  330. package/dist/native/darwin-x64/terminal-host.manifest.json +46 -0
  331. package/dist/native/darwin-x64/terminal-host.node +0 -0
  332. package/dist/native/linux-x64/manifest.json +10 -7
  333. package/dist/native/linux-x64/process-guardian.node +0 -0
  334. package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +11226 -0
  335. package/dist/native/linux-x64/terminal-host.manifest.json +46 -0
  336. package/dist/native/linux-x64/terminal-host.node +0 -0
  337. package/dist/native/win32-x64/manifest.json +10 -7
  338. package/dist/native/win32-x64/process-guardian.node +0 -0
  339. package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10757 -0
  340. package/dist/native/win32-x64/terminal-host.manifest.json +46 -0
  341. package/dist/native/win32-x64/terminal-host.node +0 -0
  342. package/dist/product-identity.d.ts +3 -3
  343. package/dist/product-identity.js +4 -4
  344. package/dist/product-identity.json +16 -2
  345. package/dist/runtime-payload-inventory.json +6330 -6677
  346. package/dist/ui/apps/host.d.ts +2 -0
  347. package/dist/ui/apps/host.js +7 -1
  348. package/dist/ui/components/dialog-panel.js +35 -30
  349. package/dist/ui/components/index.d.ts +2 -2
  350. package/dist/ui/components/index.js +1 -1
  351. package/dist/ui/components/line-input.d.ts +4 -1
  352. package/dist/ui/components/line-input.js +3 -1
  353. package/dist/ui/components/prompt-input.d.ts +11 -8
  354. package/dist/ui/components/prompt-input.js +15 -13
  355. package/dist/ui/components/selection-copy.d.ts +2 -0
  356. package/dist/ui/components/selection-copy.js +13 -0
  357. package/dist/ui/components/spans.js +2 -2
  358. package/dist/ui/components/submitted-prompt.d.ts +9 -6
  359. package/dist/ui/components/submitted-prompt.js +20 -12
  360. package/dist/ui/components/surface.js +4 -2
  361. package/dist/ui/components/text.d.ts +3 -6
  362. package/dist/ui/components/text.js +6 -8
  363. package/dist/ui/components/transcript-viewport.d.ts +9 -2
  364. package/dist/ui/components/transcript-viewport.js +176 -55
  365. package/dist/ui/settings/declarations.d.ts +90 -16
  366. package/dist/ui/settings/declarations.js +67 -14
  367. package/dist/ui/settings/early-accent.d.ts +81 -0
  368. package/dist/ui/settings/early-accent.js +50 -0
  369. package/dist/ui/settings/index.d.ts +4 -2
  370. package/dist/ui/settings/index.js +2 -1
  371. package/dist/ui/settings/manager.d.ts +16 -3
  372. package/dist/ui/settings/manager.js +122 -33
  373. package/dist/ui/settings/migrations.d.ts +6 -0
  374. package/dist/ui/settings/migrations.js +73 -0
  375. package/dist/ui/settings/profile-document.d.ts +26 -0
  376. package/dist/ui/settings/profile-document.js +164 -0
  377. package/dist/ui/settings/progress-palette.generated.d.ts +139 -0
  378. package/dist/ui/settings/progress-palette.generated.js +139 -0
  379. package/dist/ui/settings/sections.d.ts +4 -0
  380. package/dist/ui/settings/sections.js +9 -3
  381. package/docs/architecture/boundaries.md +24 -9
  382. package/docs/architecture/evidence/resident-tabs/linux-x64.md +37 -0
  383. package/docs/architecture/evidence/resident-tabs/macos-arm64.md +36 -0
  384. package/docs/architecture/evidence/resident-tabs/macos-x64.md +35 -0
  385. package/docs/architecture/evidence/resident-tabs/windows-x64.md +36 -0
  386. package/docs/architecture/internal-naming.md +3 -1
  387. package/docs/architecture/process-guardian-provenance.md +18 -10
  388. package/docs/architecture/project-structure.md +8 -0
  389. package/docs/architecture/resident-tabs-requirements.md +18 -0
  390. package/docs/architecture/resident-tabs.md +648 -0
  391. package/docs/architecture/response-copy-delivery.md +1 -1
  392. package/docs/architecture/terminal-host-proof-gate.md +2 -0
  393. package/docs/architecture/terminal-host-provenance.md +16 -4
  394. package/docs/architecture/tool-image-presentation.md +2 -1
  395. package/docs/architecture/toolchain.md +11 -9
  396. package/docs/ci-release-runbook.md +14 -7
  397. package/docs/features/launch-profiles.md +11 -8
  398. package/docs/features/prompt-history.md +41 -20
  399. package/docs/manual-resident-tabs-acceptance.md +51 -0
  400. package/docs/openspec-archive-automation.md +49 -22
  401. package/docs/validation.md +49 -9
  402. package/package.json +19 -6
  403. package/dist/foundation/process-containment/darwin-process-inspector.d.ts +0 -5
  404. package/dist/foundation/process-containment/darwin-process-inspector.js +0 -7
  405. package/dist/foundation/process-containment/native-guardian-containment.js +0 -152
  406. package/dist/foundation/process-containment/windows-process-inspector.d.ts +0 -19
  407. package/dist/foundation/process-containment/windows-process-inspector.js +0 -56
  408. package/dist/native/darwin-arm64/process-guardian +0 -0
  409. package/dist/native/linux-x64/process-guardian +0 -0
  410. package/dist/native/win32-x64/process-guardian.exe +0 -0
@@ -68,11 +68,14 @@ export interface PiShellHotkeysPresentation {
68
68
  readonly bindings?: KeybindingsConfig;
69
69
  readonly getShortcuts?: NonNullable<PiShellExtensionRendererResolver["getShortcuts"]>;
70
70
  readonly profile?: "pi" | "a1";
71
+ readonly residentTabs?: boolean;
71
72
  }
72
- export declare function createPiShellHotkeys(bindings?: KeybindingsConfig, getShortcuts?: NonNullable<PiShellExtensionRendererResolver["getShortcuts"]>, profile?: "pi" | "a1"): PiShellComponentPort;
73
+ export declare function createPiShellHotkeys(bindings?: KeybindingsConfig, getShortcuts?: NonNullable<PiShellExtensionRendererResolver["getShortcuts"]>, profile?: "pi" | "a1", residentTabs?: boolean): PiShellComponentPort;
73
74
  /** The keyboard-shortcut document rows the feed presenter shows, without its spacer, borders, and heading. */
74
75
  export declare function renderPiShellHotkeysLines(presentation: PiShellHotkeysPresentation, width: number): readonly string[];
75
- export declare function hotkeysMarkdown(bindings: KeybindingsConfig | undefined, getShortcuts: NonNullable<PiShellExtensionRendererResolver["getShortcuts"]>, profile: "pi" | "a1"): string;
76
+ /** The global tab declarations the hotkeys document lists, straight from the feature's declarations. */
77
+ export declare const TAB_HOTKEYS: readonly (readonly [string, string | null, string])[];
78
+ export declare function hotkeysMarkdown(bindings: KeybindingsConfig | undefined, getShortcuts: NonNullable<PiShellExtensionRendererResolver["getShortcuts"]>, profile: "pi" | "a1", residentTabs?: boolean): string;
76
79
  /**
77
80
  * Pinned Pi's `showPackageUpdateNotification` banner: warning-coloured dynamic
78
81
  * borders around a bold warning title, the muted update instruction with the
@@ -1,6 +1,7 @@
1
1
  import { DynamicBorder } from "../startup-public.js";
2
2
  import { Container, getCapabilities, hyperlink, Markdown, Spacer, Text, visibleWidth } from "@earendil-works/pi-tui";
3
3
  import { PRODUCT_TEXT } from "../../../product-identity.js";
4
+ import { projectResidentTabShortcuts, RESIDENT_TAB_GLOBAL_SHORTCUTS } from "../../../features/resident-tab/index.js";
4
5
  import { KeybindingsManager } from "./upstream/adjacent/core/keybindings.js";
5
6
  import { getPiHotkeysMarkdownTheme, getPiMarkdownTheme, paintPiBorder, PINNED_PI_LAYOUT, piTheme } from "./theme.js";
6
7
  import { componentPort, ensureTheme, formatSessionTokens } from "./shell-shared-facade.js";
@@ -147,9 +148,9 @@ function shortcutDisplay(key) {
147
148
  return label.charAt(0).toUpperCase() + label.slice(1);
148
149
  }).join("+")).join("/");
149
150
  }
150
- export function createPiShellHotkeys(bindings, getShortcuts = () => [], profile = "pi") {
151
+ export function createPiShellHotkeys(bindings, getShortcuts = () => [], profile = "pi", residentTabs = false) {
151
152
  ensureTheme();
152
- const markdown = hotkeysMarkdown(bindings, getShortcuts, profile);
153
+ const markdown = hotkeysMarkdown(bindings, getShortcuts, profile, residentTabs);
153
154
  const container = new Container();
154
155
  container.addChild(new Spacer(1));
155
156
  container.addChild(new DynamicBorder(paintPiBorder));
@@ -162,12 +163,14 @@ export function createPiShellHotkeys(bindings, getShortcuts = () => [], profile
162
163
  /** The keyboard-shortcut document rows the feed presenter shows, without its spacer, borders, and heading. */
163
164
  export function renderPiShellHotkeysLines(presentation, width) {
164
165
  ensureTheme();
165
- return hotkeysMarkdownComponent(hotkeysMarkdown(presentation.bindings, presentation.getShortcuts ?? (() => []), presentation.profile ?? "pi")).render(width);
166
+ return hotkeysMarkdownComponent(hotkeysMarkdown(presentation.bindings, presentation.getShortcuts ?? (() => []), presentation.profile ?? "pi", presentation.residentTabs)).render(width);
166
167
  }
167
168
  function hotkeysMarkdownComponent(markdown) {
168
169
  return new Markdown(markdown, 1, 1, getPiHotkeysMarkdownTheme());
169
170
  }
170
- export function hotkeysMarkdown(bindings, getShortcuts, profile) {
171
+ /** The global tab declarations the hotkeys document lists, straight from the feature's declarations. */
172
+ export const TAB_HOTKEYS = RESIDENT_TAB_GLOBAL_SHORTCUTS.map(shortcut => [shortcut.id, shortcut.defaultKey, shortcut.description]);
173
+ export function hotkeysMarkdown(bindings, getShortcuts, profile, residentTabs = false) {
171
174
  const keys = profile === "a1" ? KeybindingsManager.fromOwnedBindings(bindings) : new KeybindingsManager(bindings);
172
175
  // Compatibility: the owned viewport consumes these physical chords before editor actions.
173
176
  const display = (action) => keys.getKeys(action)
@@ -180,6 +183,17 @@ export function hotkeysMarkdown(bindings, getShortcuts, profile) {
180
183
  : `\`${label}\``;
181
184
  }).join(" / ")} | ${description} |`;
182
185
  let markdown = ["**Navigation**", "| Key | Action |", "|-----|--------|", row(["tui.editor.cursorUp", "tui.editor.cursorDown", "tui.editor.cursorLeft", "tui.editor.cursorRight"], "Move cursor / browse history"), row(["tui.editor.cursorWordLeft", "tui.editor.cursorWordRight"], "Move by word"), row(["tui.editor.cursorLineStart"], profile === "a1" ? "Start of prompt line" : "Start of line"), row(["tui.editor.cursorLineEnd"], profile === "a1" ? "End of prompt line" : "End of line"), ...(profile === "a1" ? ["| `Ctrl+Home` | Start of content |", "| `Ctrl+End` | End of content / follow output |"] : []), row(["tui.editor.jumpForward"], "Jump forward to character"), row(["tui.editor.jumpBackward"], "Jump backward to character"), row(["tui.editor.pageUp", "tui.editor.pageDown"], "Scroll by page"), "", "**Editing**", "| Key | Action |", "|-----|--------|", row(["tui.input.submit"], "Send message"), row(["tui.input.newLine"], `New line${process.platform === "win32" ? " (Ctrl+Enter on Windows Terminal)" : ""}`), row(["tui.editor.deleteWordBackward"], "Delete word backwards"), row(["tui.editor.deleteWordForward"], "Delete word forwards"), row(["tui.editor.deleteToLineStart"], "Delete to start of line"), row(["tui.editor.deleteToLineEnd"], "Delete to end of line"), row(["tui.editor.yank"], "Paste the most-recently-deleted text"), row(["tui.editor.yankPop"], "Cycle through the deleted text after pasting"), row(["tui.editor.undo"], "Undo"), "", "**Other**", "| Key | Action |", "|-----|--------|", row(["tui.input.tab"], "Path completion / accept autocomplete"), row(["app.interrupt"], "Cancel autocomplete / abort streaming"), row(["app.clear"], "Clear editor (first) / exit (second)"), row(["app.exit"], "Exit (when editor is empty)"), row(["app.suspend"], "Suspend to background"), row(["app.thinking.cycle"], "Cycle thinking level"), row(["app.model.cycleForward", "app.model.cycleBackward"], "Cycle models"), row(["app.model.select"], profile === "a1" ? "Open the Models dialog" : "Open model selector"), row(["app.tools.expand"], "Toggle tool output expansion"), row(["app.thinking.toggle"], "Toggle thinking block visibility"), row(["app.editor.external"], "Edit message in external editor"), row(["app.message.copy"], "Copy selection or last assistant message"), row(["app.message.followUp"], "Queue follow-up message"), row(["app.message.dequeue"], "Restore queued messages"), row(["app.clipboard.pasteImage"], profile === "a1" ? "Paste image or text from clipboard" : "Paste files on macOS, images, or text from clipboard"), "| `/` | Slash commands |", "| `!` | Run bash command |", "| `!!` | Run bash command (excluded from context) |", ...(profile === "a1" ? ["", "**Models dialog**", "| Key | Action |", "|-----|--------|", "| `Space` | Toggle the selected model in the cycling scope |", "| `Tab` | Switch the all/scoped filter |", row(["app.models.save"], "Save the scope to settings"), row(["app.models.enableAll"], "Scope every listed model"), row(["app.models.clearAll"], "Clear the listed models from the scope"), row(["app.models.toggleProvider"], "Toggle the selected model's provider"), row(["app.models.reorderUp", "app.models.reorderDown"], "Reorder the cycling scope")] : [])].join("\n");
186
+ if (profile === "a1" && residentTabs) {
187
+ // Invariant: the Tabs section shows the same projection the resident shell dispatches: the
188
+ // effective A1 declarations keep their keys and earlier tab declarations keep duplicates.
189
+ const projection = projectResidentTabShortcuts({ configured: bindings, reserved: keys.getEffectiveConfig() });
190
+ markdown += "\n\n**Tabs**\n| Key | Action |\n|-----|--------|\n";
191
+ markdown += RESIDENT_TAB_GLOBAL_SHORTCUTS.map(shortcut => {
192
+ const assigned = projection.assignments[shortcut.id];
193
+ const label = assigned === null ? "Unbound" : `\`${shortcutDisplay(assigned)}\``;
194
+ return `| ${label} | ${shortcut.description} |`;
195
+ }).join("\n");
196
+ }
183
197
  const shortcuts = getShortcuts(bindings ?? keys.getEffectiveConfig());
184
198
  if (shortcuts.length > 0) {
185
199
  markdown += "\n\n**Extensions**\n| Key | Action |\n|-----|--------|\n";
@@ -4,7 +4,7 @@ import { SkillInvocationMessageComponent } from "./upstream/components/skill-inv
4
4
  import { piToolArguments as toolArguments, updatePiToolResult as updateToolResult } from "./tool-result-adapter.js";
5
5
  import { createTranscriptImageResolver } from "./transcript-image-resolver.js";
6
6
  import { createMermaidMarkdownTransformer } from "./upstream/components/mermaid.js";
7
- import { Container, Image, Spacer, Text, } from "@earendil-works/pi-tui";
7
+ import { Container, getCapabilities, Image, Spacer, Text, } from "@earendil-works/pi-tui";
8
8
  import { createPiSubmittedPromptComponent, isPiPromptStyleCompaction, } from "./submitted-prompt-adapter.js";
9
9
  export { isPiPromptStyleCompaction, paintPiSubmittedPromptTimestamp } from "./submitted-prompt-adapter.js";
10
10
  import { getPiMarkdownTheme, PINNED_PI_LAYOUT, piTheme, } from "./theme.js";
@@ -127,7 +127,10 @@ function withTranscriptImages(component, block, assets, showImages, imageWidthCe
127
127
  return component;
128
128
  const container = new Container();
129
129
  container.addChild(component);
130
+ const imageProtocolUnavailable = getCapabilities().images === null;
130
131
  for (const reference of references) {
132
+ if (showImages && imageProtocolUnavailable)
133
+ continue;
131
134
  container.addChild(new Spacer(1));
132
135
  const asset = assets?.resolve(reference.assetId) ?? null;
133
136
  if (!showImages) {
@@ -3,7 +3,7 @@ import { EarendilAnnouncementComponent } from "./upstream/components/earendil-an
3
3
  import { ExtensionSelectorComponent } from "./upstream/components/extension-selector.js";
4
4
  import { Box, Container, SelectList, Spacer, Text, } from "@earendil-works/pi-tui";
5
5
  import { ScopedModelsSelectorComponent } from "./upstream/components/scoped-models-selector.js";
6
- import { addPiModalSelectFooter, adoptPiModalFrame, adoptPiModalHeader } from "./modal-frame.js";
6
+ import { addPiModalSelectFooter, adoptPiModalFrame, adoptPiModalHeader, adoptPiModalSearchInput } from "./modal-frame.js";
7
7
  import { ModelsDialogComponent } from "./models-dialog.js";
8
8
  import { TrustSelectorComponent } from "./upstream/components/trust-selector.js";
9
9
  import { canonicalizePiSettingsHint, DIALOG_CLOSE_SHORTCUT_HINT, PINNED_PI_LAYOUT, getPiSelectListTheme, paintPiBorder, piTheme, renderPiModalShortcutHints, } from "./theme.js";
@@ -66,6 +66,7 @@ export function createPiShellSettingsSelector(options) {
66
66
  onAutocompleteMaxVisibleChange: change("onAutocompleteMaxVisibleChange"),
67
67
  onQuietStartupChange: change("onQuietStartupChange"),
68
68
  onDefaultProjectTrustChange: change("onDefaultProjectTrustChange"),
69
+ onSessionShareDestinationChange: change("onSessionShareDestinationChange"),
69
70
  onClearOnShrinkChange: change("onClearOnShrinkChange"),
70
71
  onShowTerminalProgressChange: change("onShowTerminalProgressChange"),
71
72
  onTuiModeChange: change("onTuiModeChange"),
@@ -95,6 +96,7 @@ export function createPiShellSettingsSelector(options) {
95
96
  export function createPiShellModelSelector(options) {
96
97
  ensureTheme();
97
98
  const selector = new ModelSelectorComponent(createTuiFacade(options.runtime), options.currentModel, options.modelRuntime, options.scopedModels, options.onSelect, options.onCancel, options.initialSearchInput, options.onSelectAsDefault, options.defaultModel);
99
+ adoptPiModalSearchInput(selector, selector.getSearchInput());
98
100
  adoptPiModalFrame(selector, { topIndex: 0, bottomIndex: selector.children.length - 1 });
99
101
  return componentPort(selector);
100
102
  }
@@ -234,6 +236,8 @@ export function createPiShellAuthProviderSelector(mode, providers, onSelect, onC
234
236
  if (selected)
235
237
  onSelect(selected.id);
236
238
  }, onCancel, initialSearchInput);
239
+ // Provenance: OAuth selector slot is top rule, spacer, title, spacer, then its search Input.
240
+ adoptPiModalSearchInput(selector, selector.children[4]);
237
241
  addPiModalSelectFooter(selector);
238
242
  const preInsetContent = [selector.children[2], selector.children[6]];
239
243
  const header = adoptPiModalHeader(selector, 0, 2);
@@ -64,6 +64,8 @@ export interface PiShellEditorPort extends PiShellComponentPort {
64
64
  canPresentPromptSuggestion(): boolean;
65
65
  promptSuggestionBlockReason?(): SuggestionDecision;
66
66
  hasSelection(): boolean;
67
+ /** Exact expanded semantic editor selection without mutating or collapsing it. */
68
+ selectedText?(): string | undefined;
67
69
  ownsPointer(): boolean;
68
70
  handlePointer(event: PiShellEditorPointerEvent): boolean;
69
71
  pasteClipboard(): boolean;
@@ -159,9 +161,18 @@ export interface PiShellPasteReservation {
159
161
  }
160
162
  export interface PiShellEditorOptions {
161
163
  readonly persistentHistory?: boolean;
164
+ /** Configures the shared interactive input for a caller narrower than the agent prompt. */
165
+ readonly inputCapabilities?: {
166
+ readonly singleLine?: boolean;
167
+ readonly paste?: boolean;
168
+ readonly autocomplete?: boolean;
169
+ readonly placeholder?: string;
170
+ };
162
171
  readonly historyEditor?: HistoryEditorConstructor;
163
172
  /** Bare A1 adds ergonomic aliases while comparison profiles retain Pi defaults. */
164
173
  readonly keybindingProfile?: "pi" | "a1";
174
+ /** Resident Agents expose Settings and the changelog as utility tabs instead of slash commands. */
175
+ readonly hideUtilityTabCommands?: boolean;
165
176
  /** The process's shared keybindings; its profile must match `keybindingProfile`. */
166
177
  readonly keybindings?: PiKeybindingsHost;
167
178
  readonly getColumns: () => number;
@@ -185,7 +196,7 @@ export interface PiShellEditorOptions {
185
196
  readonly onFollowUp?: (() => void) | undefined;
186
197
  readonly onDequeue?: (() => void) | undefined;
187
198
  readonly onPromptSuggestionAccepted?: (text: string) => void;
188
- readonly onCopyText?: (text: string) => void;
199
+ readonly onCopyText?: (text: string, cut: boolean) => void;
189
200
  readonly readClipboardContent?: (signal?: AbortSignal) => Promise<PiShellClipboardContent | null>;
190
201
  readonly beginClipboardPaste?: () => PiShellPasteReservation;
191
202
  readonly beginTextPaste?: (text: string) => PiShellPasteReservation;
@@ -1,6 +1,6 @@
1
1
  import { DynamicBorder } from "../startup-public.js";
2
2
  import { Container, getKeybindings, Input, Spacer, Text } from "@earendil-works/pi-tui";
3
- import { addPiModalHeader, adoptPiModalFrame } from "./modal-frame.js";
3
+ import { addPiModalHeader, addPiModalSearchInput, adoptPiModalFrame } from "./modal-frame.js";
4
4
  import { DIALOG_CLOSE_SHORTCUT_HINT, paintPiBorder, PINNED_PI_LAYOUT, piTheme, renderPiModalListRow, renderPiModalShortcutHints, } from "./theme.js";
5
5
  import { componentPort, ensureTheme, piShellTruncateToWidth, piShellVisibleWidth } from "./shell-shared-facade.js";
6
6
  import { skillMatchesQuery } from "./skills-command.js";
@@ -50,7 +50,7 @@ class SkillsSelectorComponent extends Container {
50
50
  this.#searchInput.onSubmit = () => this.#selectCurrent();
51
51
  const header = addPiModalHeader(this, new DynamicBorder(paintPiBorder), new Text(piTheme().fg("accent", piTheme().bold("Skills")), 0, 0));
52
52
  this.addChild(new Spacer(1));
53
- this.addChild(this.#searchInput);
53
+ addPiModalSearchInput(this, this.#searchInput);
54
54
  this.addChild(new Spacer(1));
55
55
  this.addChild(this.#listContainer);
56
56
  this.addChild(new Spacer(1));
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/core/keybindings.ts.
4
4
  * Modifications: Mechanical source port with Node import prefixes, public package-root agent-directory
5
5
  * resolution, and an opt-in bare-A1 input profile including Ctrl+L level cycling, unbound model
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/core/keybindings.ts.
4
4
  * Modifications: Mechanical source port with Node import prefixes, public package-root agent-directory
5
5
  * resolution, and an opt-in bare-A1 input profile including Ctrl+L level cycling, unbound model
@@ -9,7 +9,7 @@
9
9
  * Deviations: keybindings-public-config-boundary, owned-level-cycle-shortcut,
10
10
  * owned-input-keybinding-aliases, owned-session-tree-dialog, owned-dialog-ctrl-c-cancel.
11
11
  */
12
- import { matchesKey, TUI_KEYBINDINGS, KeybindingsManager as TuiKeybindingsManager, } from "@earendil-works/pi-tui";
12
+ import { Key, matchesKey, TUI_KEYBINDINGS, KeybindingsManager as TuiKeybindingsManager, } from "@earendil-works/pi-tui";
13
13
  import { existsSync, readFileSync } from "node:fs";
14
14
  import { join } from "node:path";
15
15
  import { getAgentDir } from "../../../../startup-public.js";
@@ -278,14 +278,27 @@ const KEYBINDING_NAME_MIGRATIONS = {
278
278
  function isLegacyKeybindingName(key) {
279
279
  return key in KEYBINDING_NAME_MIGRATIONS;
280
280
  }
281
+ const KEYBINDING_MODIFIERS = ["ctrl", "shift", "alt", "super"];
282
+ const BASE_KEY_PATTERN = `(?:[a-z0-9]|${Object.values(Key)
283
+ .flatMap((value) => (typeof value === "string" ? [value.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&")] : []))
284
+ .join("|")})`;
285
+ const DUPLICATE_MODIFIER_PATTERN = KEYBINDING_MODIFIERS
286
+ .map((modifier) => `${modifier}\\+.*${modifier}\\+`)
287
+ .join("|");
288
+ const KEY_ID_PATTERN = new RegExp(`^(?!.*(?:${DUPLICATE_MODIFIER_PATTERN}))(?:(?:${KEYBINDING_MODIFIERS.join("|")})\\+){0,4}${BASE_KEY_PATTERN}$`);
289
+ function isKeyId(value) {
290
+ return typeof value === "string" && KEY_ID_PATTERN.test(value);
291
+ }
281
292
  function toKeybindingsConfig(value) {
282
293
  const config = {};
283
294
  for (const [key, binding] of Object.entries(value)) {
284
- if (typeof binding === "string") {
295
+ if (key === "$schema")
296
+ continue;
297
+ if (isKeyId(binding)) {
285
298
  config[key] = binding;
286
299
  continue;
287
300
  }
288
- if (Array.isArray(binding) && binding.every((entry) => typeof entry === "string")) {
301
+ if (Array.isArray(binding) && binding.every(isKeyId)) {
289
302
  config[key] = binding;
290
303
  }
291
304
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "sourcePackage": "@earendil-works/pi-coding-agent",
3
- "sourceVersion": "1.1.0",
3
+ "sourceVersion": "1.4.0",
4
4
  "upstreamRepository": "https://github.com/earendil-works/pi.git",
5
- "upstreamCommit": "abe508e1b89912adde45528136c3221eb69acdd7",
5
+ "upstreamCommit": "4a080252f06caf63a525d7873c5d94d3c23887e0",
6
6
  "sourcePath": "dist/modes/interactive/assets/clankolas.png",
7
7
  "sourceSha256": "169acd0dfe6fbb8d8742ed24a3fc654fd0b2e2d4223c733249c5493723f1b72d",
8
8
  "license": "MIT",
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/modes/interactive/components/countdown-timer.ts.
4
4
  * Modifications: Mechanical source port with ECMAScript private fields; imports remain on the public
5
5
  * Pi TUI package root.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/modes/interactive/components/earendil-announcement.ts.
4
4
  * Modifications: Mechanical pinned source port with private imports remapped to public package-root
5
5
  * types/APIs and A1-owned theme boundaries. The unchanged image is loaded lazily from its attributed,
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/modes/interactive/components/extension-editor.ts.
4
4
  * Modifications: Mechanical port: remap pi-tui to the root public singleton, use owned
5
5
  * keybindings/theme and external-editor seams, preserve editor layout, hints, focus, submission,
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/modes/interactive/components/extension-editor.ts.
4
4
  * Modifications: Mechanical port: remap pi-tui to the root public singleton, use owned
5
5
  * keybindings/theme and external-editor seams, preserve editor layout, hints, focus, submission,
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/modes/interactive/components/extension-input.ts.
4
4
  * Modifications: Mechanical port: remap public imports, use ECMAScript private fields, and route the
5
5
  * bare-A1 instruction row and chrome through the shared semantic shortcut and compact padded
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/modes/interactive/components/extension-selector.ts.
4
4
  * Modifications: Mechanical port: remap public imports, use ECMAScript private fields, and route the
5
5
  * bare-A1 instruction row and chrome through the shared semantic shortcut and compact padded
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/modes/interactive/components/mermaid.ts.
4
4
  * Modifications: Mechanical pinned source port with private imports remapped to public package-root
5
5
  * types/APIs and A1-owned theme boundaries; behavior remains acceptance-tested.
@@ -1,13 +1,13 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/modes/interactive/components/custom-editor.ts.
4
4
  * Modifications: A1-owned class name and synchronized A1 keybinding contract replace the nominal
5
5
  * private upstream keybinding constructor dependency; bare A1 injects the shared Settings/agent input
6
- * frame, transient contextual-suggestion branch, and explicit body geometry for selection and
7
- * above-prompt autocomplete with a one-cell outer gutter. Bare A1 also clears a sole top-level
8
- * slash-command search on Escape and completes a selected or exact completed tunnel command with `:`
9
- * and reopens the menu on its tunnel rows, and synchronously retains then refreshes an exact top-level
10
- * command menu after Tab applies its row.
6
+ * frame, configurable empty-input placeholder branch, transient contextual-suggestion branch, and
7
+ * explicit body geometry for selection and above-prompt autocomplete with a one-cell outer gutter.
8
+ * Bare A1 also clears a sole top-level slash-command search on Escape and completes a selected or
9
+ * exact completed tunnel command with `:` and reopens the menu on its tunnel rows, and synchronously
10
+ * retains then refreshes an exact top-level command menu after Tab applies its row.
11
11
  * Deviations: owned-shared-input-frame, above-prompt-autocomplete-placement,
12
12
  * clear-command-search-on-escape, command-tunnel-colon-completion, keep-command-menu-open-after-tab.
13
13
  */
@@ -21,6 +21,8 @@ export interface OwnedEditorOptions extends EditorOptions {
21
21
  readonly inputPresentation?: PiShellPromptInputPresentation;
22
22
  readonly styleSuggestion?: (text: string) => string;
23
23
  readonly styleSuggestionCaret?: (text: string) => string;
24
+ /** Non-accepting empty-input guidance rendered through the shared suggestion presentation. */
25
+ readonly placeholder?: string;
24
26
  readonly terminalRows?: () => number;
25
27
  /** Reuses the editor's established atomic-aware visual layout when available. */
26
28
  readonly getVisualLineCount?: (width: number) => number | undefined;
@@ -1,13 +1,13 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/modes/interactive/components/custom-editor.ts.
4
4
  * Modifications: A1-owned class name and synchronized A1 keybinding contract replace the nominal
5
5
  * private upstream keybinding constructor dependency; bare A1 injects the shared Settings/agent input
6
- * frame, transient contextual-suggestion branch, and explicit body geometry for selection and
7
- * above-prompt autocomplete with a one-cell outer gutter. Bare A1 also clears a sole top-level
8
- * slash-command search on Escape and completes a selected or exact completed tunnel command with `:`
9
- * and reopens the menu on its tunnel rows, and synchronously retains then refreshes an exact top-level
10
- * command menu after Tab applies its row.
6
+ * frame, configurable empty-input placeholder branch, transient contextual-suggestion branch, and
7
+ * explicit body geometry for selection and above-prompt autocomplete with a one-cell outer gutter.
8
+ * Bare A1 also clears a sole top-level slash-command search on Escape and completes a selected or
9
+ * exact completed tunnel command with `:` and reopens the menu on its tunnel rows, and synchronously
10
+ * retains then refreshes an exact top-level command menu after Tab applies its row.
11
11
  * Deviations: owned-shared-input-frame, above-prompt-autocomplete-placement,
12
12
  * clear-command-search-on-escape, command-tunnel-colon-completion, keep-command-menu-open-after-tab.
13
13
  */
@@ -25,6 +25,7 @@ export function createOwnedEditorClass(Base) {
25
25
  #inputPresentation;
26
26
  #styleSuggestion;
27
27
  #styleSuggestionCaret;
28
+ #placeholder;
28
29
  #terminalRows;
29
30
  #getVisualLineCount;
30
31
  #clearCommandSearchOnEscape;
@@ -37,6 +38,7 @@ export function createOwnedEditorClass(Base) {
37
38
  this.#inputPresentation = options.inputPresentation;
38
39
  this.#styleSuggestion = options.styleSuggestion ?? (text => text);
39
40
  this.#styleSuggestionCaret = options.styleSuggestionCaret ?? (text => `\u001b[7m${text}\u001b[27m`);
41
+ this.#placeholder = options.placeholder ?? null;
40
42
  this.#terminalRows = options.terminalRows ?? (() => 24);
41
43
  this.#getVisualLineCount = options.getVisualLineCount;
42
44
  this.#clearCommandSearchOnEscape = options.clearCommandSearchOnEscape === true;
@@ -70,7 +72,12 @@ export function createOwnedEditorClass(Base) {
70
72
  return rows;
71
73
  }
72
74
  if (this.#promptSuggestion !== null && this.canPresentPromptSuggestion()) {
73
- const rows = this.#renderSuggestion(width);
75
+ const rows = this.#renderSuggestion(width, this.#promptSuggestion);
76
+ this.#renderedBodyRowCount = rows.length;
77
+ return rows;
78
+ }
79
+ if (this.#placeholder !== null && this.focused && this.getText().length === 0 && !this.isShowingAutocomplete()) {
80
+ const rows = this.#renderSuggestion(width, this.#placeholder);
74
81
  this.#renderedBodyRowCount = rows.length;
75
82
  return rows;
76
83
  }
@@ -176,10 +183,10 @@ export function createOwnedEditorClass(Base) {
176
183
  triggerAutocomplete(this);
177
184
  return true;
178
185
  }
179
- #renderSuggestion(width) {
186
+ #renderSuggestion(width, suggestion) {
180
187
  const presentation = this.#inputPresentation;
181
188
  const { paddingX, contentWidth, layoutWidth } = presentation.geometry(width, this.getPaddingX());
182
- const chunks = wrapTextWithAnsi(this.#promptSuggestion ?? "", layoutWidth).map(text => ({ text }));
189
+ const chunks = wrapTextWithAnsi(suggestion, layoutWidth).map(text => ({ text }));
183
190
  const maxVisible = Math.max(5, Math.floor(this.#terminalRows() * 0.3));
184
191
  const visible = chunks.slice(0, maxVisible);
185
192
  const leftPadding = " ".repeat(paddingX);
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/modes/interactive/components/pi-logo.ts.
4
4
  * Modifications: Remapped the private theme import to A1's public-backed adapter and composed the
5
5
  * fixed-color logo into the owned startup header.
@@ -1,13 +1,13 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/modes/interactive/components/scoped-models-selector.ts.
4
4
  * Modifications: Source-synchronized scoped-model selector port: preserve session-only toggles,
5
5
  * search, bulk/provider/reorder actions, dirty state, Ctrl+S persistence, refresh status,
6
6
  * cancellation, and focus while remapping theme and public helper imports; local key labels preserve
7
7
  * pinned platform formatting before layout without changing binding identities, and bare A1 uses the
8
- * shared semantic modal shortcut row and compact padded modal frame while immediately closing on the
9
- * implicit Ctrl+C selection-cancel alias without advertising it.
10
- * Deviations: owned-modal-shortcut-hints, owned-dialog-ctrl-c-cancel.
8
+ * shared semantic modal shortcut row, accent search marker, and compact padded modal frame while
9
+ * immediately closing on the implicit Ctrl+C selection-cancel alias without advertising it.
10
+ * Deviations: owned-modal-shortcut-hints, owned-dialog-ctrl-c-cancel, owned-dialog-search-marker.
11
11
  */
12
12
  interface ScopedModel {
13
13
  readonly provider: string;
@@ -1,7 +1,7 @@
1
1
  import { Container, fuzzyFilter, getKeybindings, Input, Spacer, Text, } from "@earendil-works/pi-tui";
2
2
  import { DynamicBorder } from "../../../startup-public.js";
3
3
  import { getModelSearchText } from "../model-search.js";
4
- import { addPiModalHeader, adoptPiModalFrame } from "../../modal-frame.js";
4
+ import { addPiModalHeader, addPiModalSearchInput, adoptPiModalFrame } from "../../modal-frame.js";
5
5
  import { DIALOG_CLOSE_SHORTCUT_HINT, paintPiBorder, piTheme, renderPiModalShortcutHints } from "../../theme.js";
6
6
  // Rationale: upstream's capitalized hint formatter is private to the package; the same mapping lives here.
7
7
  function keyDisplayText(keybinding) {
@@ -118,7 +118,7 @@ export class ScopedModelsSelectorComponent extends Container {
118
118
  this.addChild(new Spacer(1));
119
119
  // Search input
120
120
  this.searchInput = new Input();
121
- this.addChild(this.searchInput);
121
+ addPiModalSearchInput(this, this.searchInput);
122
122
  this.addChild(new Spacer(1));
123
123
  // List container
124
124
  this.listContainer = new Container();
@@ -5,7 +5,8 @@ export declare class SessionFooter implements Component {
5
5
  private readonly cwd;
6
6
  private readonly profile;
7
7
  private readonly show;
8
- constructor(getView: () => OwnedUiSessionViewModel, cwd: string, profile?: "pi" | "a1", show?: () => boolean);
8
+ private readonly showSessionName;
9
+ constructor(getView: () => OwnedUiSessionViewModel, cwd: string, profile?: "pi" | "a1", show?: () => boolean, showSessionName?: boolean);
9
10
  invalidate(): void;
10
11
  dispose(): void;
11
12
  render(width: number): string[];
@@ -1,12 +1,10 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/modes/interactive/components/footer.ts.
4
- * Modifications: Consumes neutral owned-UI view data instead of a fabricated concrete AgentSession;
5
- * preserves the latest physical route for virtual models; an explicit bare-A1 profile colors the
6
- * thinking-level name, renders its repository-context path, and reserves its linked pull-request badge
7
- * before path truncation while preserving the remaining footer layout and formatting; replacement
8
- * surfaces may suppress a thinking level they already present.
9
- * Deviations: owned-status-level-color, owned-pull-request-badge.
4
+ * Modifications: Owned UI/routing; A1 level color, linked PRs, resident names, dim ellipsis and model
5
+ * priority; Pi unchanged.
6
+ * Deviations: owned-status-level-color, owned-pull-request-badge, owned-resident-session-name,
7
+ * owned-footer-ellipsis, owned-footer-model-priority.
10
8
  */
11
9
  import { isAbsolute, relative, resolve, sep } from "node:path";
12
10
  import { hyperlink, truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
@@ -16,11 +14,13 @@ export class SessionFooter {
16
14
  cwd;
17
15
  profile;
18
16
  show;
19
- constructor(getView, cwd, profile = "pi", show = () => true) {
17
+ showSessionName;
18
+ constructor(getView, cwd, profile = "pi", show = () => true, showSessionName = true) {
20
19
  this.getView = getView;
21
20
  this.cwd = cwd;
22
21
  this.profile = profile;
23
22
  this.show = show;
23
+ this.showSessionName = showSessionName;
24
24
  }
25
25
  invalidate() { }
26
26
  dispose() { }
@@ -28,6 +28,7 @@ export class SessionFooter {
28
28
  const view = this.getView();
29
29
  const usage = view.status.usage;
30
30
  const theme = piTheme();
31
+ const dimEllipsis = theme.fg("dim", this.profile === "a1" ? "…" : "...");
31
32
  const input = usage?.input ?? 0;
32
33
  const output = usage?.output ?? 0;
33
34
  const cacheRead = usage?.cacheRead ?? 0;
@@ -35,17 +36,17 @@ export class SessionFooter {
35
36
  const cost = usage?.cost ?? 0;
36
37
  const contextWindow = usage?.contextWindow ?? 0;
37
38
  const contextPercentValue = usage?.contextPercent ?? 0;
38
- const contextPercentSource = usage?.contextAvailable === false ? undefined : usage?.contextPercent;
39
- const contextPercent = contextPercentSource !== null ? contextPercentValue.toFixed(1) : "?";
39
+ const contextPercent = usage?.contextAvailable !== false && usage?.contextPercent === null
40
+ ? "?" : contextPercentValue.toFixed(1);
40
41
  const repositoryPath = this.profile === "a1" ? view.status.footer?.repositoryPath ?? this.cwd : this.cwd;
41
42
  let pwd = formatCwd(repositoryPath, process.env.HOME || process.env.USERPROFILE);
42
43
  const branch = view.status.footer?.branch;
43
44
  if (branch)
44
45
  pwd = `${pwd} (${branch})`;
45
- const sessionName = view.status.footer?.sessionName;
46
+ const sessionName = this.showSessionName ? view.status.footer?.sessionName : null;
46
47
  const pullRequest = this.profile === "a1" ? view.status.footer?.pullRequest : null;
47
48
  let pathRow;
48
- if (pullRequest === undefined || pullRequest === null) {
49
+ if (pullRequest == null) {
49
50
  pathRow = theme.fg("dim", sessionName ? `${pwd} • ${sessionName}` : pwd);
50
51
  }
51
52
  else {
@@ -56,12 +57,10 @@ export class SessionFooter {
56
57
  if (visibleWidth(full) <= width)
57
58
  pathRow = full;
58
59
  else if (visibleWidth(badge) <= width) {
59
- const pathWidth = Math.max(0, width - visibleWidth(badge));
60
- const path = pathWidth === 0 ? "" : truncateToWidth(theme.fg("dim", pwd), pathWidth, theme.fg("dim", "..."));
61
- pathRow = path + badge;
60
+ pathRow = truncateToWidth(theme.fg("dim", pwd), width - visibleWidth(badge), dimEllipsis) + badge;
62
61
  }
63
62
  else {
64
- pathRow = truncateToWidth(badge, width, theme.fg("dim", "..."));
63
+ pathRow = truncateToWidth(badge, width, dimEllipsis);
65
64
  }
66
65
  }
67
66
  const parts = [];
@@ -85,7 +84,7 @@ export class SessionFooter {
85
84
  let left = parts.join(" ");
86
85
  let leftWidth = visibleWidth(left);
87
86
  if (leftWidth > width) {
88
- left = truncateToWidth(left, width, "...");
87
+ left = truncateToWidth(left, width, this.profile === "a1" ? dimEllipsis : "...");
89
88
  leftWidth = visibleWidth(left);
90
89
  }
91
90
  const modelName = view.activeModel?.modelId ?? "no-model";
@@ -93,6 +92,7 @@ export class SessionFooter {
93
92
  ? view.activeModel === null || !this.show() ? theme.fg("dim", modelName)
94
93
  : theme.fg("dim", `${modelName} • `) + theme.getThinkingBorderColor(view.thinkingLevel)(view.thinkingLevel)
95
94
  : view.activeModel === null || view.thinkingLevel === "off" || !this.show() ? modelName : `${modelName} • ${view.thinkingLevel}`;
95
+ const modelLevel = rightWithoutProvider;
96
96
  const routed = view.routedModel;
97
97
  if (routed) {
98
98
  const level = routed.thinkingLevel === undefined ? "" : ` • ${routed.thinkingLevel}`;
@@ -106,9 +106,18 @@ export class SessionFooter {
106
106
  if (leftWidth + 2 + visibleWidth(right) > width)
107
107
  right = rightWithoutProvider;
108
108
  }
109
+ if (this.profile === "a1" && leftWidth + 2 + visibleWidth(right) > width) {
110
+ right = [rightWithoutProvider, modelLevel].find(value => visibleWidth(value) + 2 <= width)
111
+ ?? truncateToWidth(theme.fg("dim", modelName), width, dimEllipsis);
112
+ left = truncateToWidth(left, Math.max(0, width - visibleWidth(right) - 2), dimEllipsis);
113
+ leftWidth = visibleWidth(left);
114
+ }
109
115
  const rightWidth = visibleWidth(right);
110
116
  let line;
111
- if (leftWidth + 2 + rightWidth <= width) {
117
+ if (this.profile === "a1" && leftWidth === 0) {
118
+ line = " ".repeat(Math.max(0, width - rightWidth)) + right;
119
+ }
120
+ else if (leftWidth + 2 + rightWidth <= width) {
112
121
  line = left + " ".repeat(width - leftWidth - rightWidth) + right;
113
122
  }
114
123
  else {
@@ -121,13 +130,13 @@ export class SessionFooter {
121
130
  line = left;
122
131
  }
123
132
  const lines = [
124
- truncateToWidth(pathRow, width, theme.fg("dim", "...")),
133
+ truncateToWidth(pathRow, width, dimEllipsis),
125
134
  theme.fg("dim", left) + (this.profile === "a1" ? line.slice(left.length) : theme.fg("dim", line.slice(left.length))),
126
135
  ];
127
136
  const statuses = view.status.footer?.extensionStatuses ?? [];
128
137
  if (statuses.length > 0) {
129
138
  const status = [...statuses].sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey)).map(([, text]) => sanitize(text)).join(" ");
130
- lines.push(truncateToWidth(status, width, theme.fg("dim", "...")));
139
+ lines.push(truncateToWidth(status, width, dimEllipsis));
131
140
  }
132
141
  return lines;
133
142
  }
@@ -147,11 +156,8 @@ function formatTokens(count) {
147
156
  function formatCwd(cwd, home) {
148
157
  if (!home)
149
158
  return cwd;
150
- const resolvedCwd = resolve(cwd);
151
- const resolvedHome = resolve(home);
152
- const relativeToHome = relative(resolvedHome, resolvedCwd);
153
- const inside = relativeToHome === "" || (relativeToHome !== ".." && !relativeToHome.startsWith(`..${sep}`) && !isAbsolute(relativeToHome));
154
- if (!inside)
159
+ const relativeToHome = relative(resolve(home), resolve(cwd));
160
+ if (isAbsolute(relativeToHome) || relativeToHome === ".." || relativeToHome.startsWith(`..${sep}`))
155
161
  return cwd;
156
162
  return relativeToHome === "" ? "~" : `~${sep}${relativeToHome}`;
157
163
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 1.1.0 (MIT), commit abe508e1b89912adde45528136c3221eb69acdd7,
2
+ * Provenance: @earendil-works/pi-coding-agent 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0,
3
3
  * packages/coding-agent/src/modes/interactive/components/session-selector-search.ts.
4
4
  * Modifications: Source-synchronized session search port with only the public SessionInfo type import
5
5
  * remapped.