@timurproko/a1 0.2.4-dev.673 → 0.2.5-dev.683

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 (95) hide show
  1. package/README.md +49 -38
  2. package/bin/pinned-pi-public.js +20 -2
  3. package/dist/app/session-shell/session-shell-root.d.ts +1 -1
  4. package/dist/app/session-shell/session-shell-root.js +6 -11
  5. package/dist/app/session-shell/session-shell.js +9 -17
  6. package/dist/composition/owned-ui.js +1 -0
  7. package/dist/composition/session-info-reference.d.ts +4 -0
  8. package/dist/composition/session-info-reference.js +20 -0
  9. package/dist/composition/settings-route-host.d.ts +2 -5
  10. package/dist/composition/settings-route-host.js +7 -11
  11. package/dist/features/owned-ui/reference-screen-app.d.ts +2 -0
  12. package/dist/features/owned-ui/reference-screen-app.js +7 -1
  13. package/dist/features/owned-ui/resources/release-notes.json +4 -0
  14. package/dist/foundation/release/progress-palette.generated.d.ts +2 -2
  15. package/dist/foundation/release/progress-palette.generated.js +2 -2
  16. package/dist/foundation/startup/startup-descriptor.js +2 -2
  17. package/dist/integrations/pi/components/index.d.ts +1 -1
  18. package/dist/integrations/pi/components/index.js +1 -1
  19. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +2 -2
  20. package/dist/integrations/pi/components/resources/builtin-themes.js +2 -2
  21. package/dist/integrations/pi/components/shell-presenters-info.d.ts +2 -0
  22. package/dist/integrations/pi/components/shell-presenters-info.js +1 -1
  23. package/dist/integrations/pi/components/shell-presenters-transcript.js +10 -6
  24. package/dist/integrations/pi/components/shell-selectors-dialogs.d.ts +0 -1
  25. package/dist/integrations/pi/components/shell-selectors-dialogs.js +0 -5
  26. package/dist/integrations/pi/components/shell-session-info-reference.d.ts +10 -0
  27. package/dist/integrations/pi/components/shell-session-info-reference.js +61 -0
  28. package/dist/integrations/pi/components/shell-shared-facade.d.ts +1 -1
  29. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +5 -5
  30. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +1 -1
  31. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
  32. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
  33. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
  34. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +1 -1
  35. package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
  36. package/dist/integrations/pi/components/upstream/components/extension-input.js +1 -1
  37. package/dist/integrations/pi/components/upstream/components/extension-selector.js +1 -1
  38. package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
  39. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +1 -1
  40. package/dist/integrations/pi/components/upstream/components/owned-editor.js +1 -1
  41. package/dist/integrations/pi/components/upstream/components/pi-logo.js +1 -1
  42. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +1 -1
  43. package/dist/integrations/pi/components/upstream/components/session-footer.js +1 -1
  44. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
  45. package/dist/integrations/pi/components/upstream/components/session-selector.js +1 -1
  46. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
  47. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
  48. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +1 -1
  49. package/dist/integrations/pi/components/upstream/components/status-indicator.js +1 -1
  50. package/dist/integrations/pi/components/upstream/components/themed-text.d.ts +1 -1
  51. package/dist/integrations/pi/components/upstream/components/themed-text.js +1 -1
  52. package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +1 -1
  53. package/dist/integrations/pi/components/upstream/components/thinking-selector.js +1 -1
  54. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +4 -3
  55. package/dist/integrations/pi/components/upstream/components/tool-execution.js +8 -7
  56. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +1 -1
  57. package/dist/integrations/pi/components/upstream/components/tree-selector.js +1 -1
  58. package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
  59. package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
  60. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +1 -1
  61. package/dist/integrations/pi/components/upstream/history/editor-core.js +1 -1
  62. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
  63. package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
  64. package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
  65. package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
  66. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
  67. package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
  68. package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
  69. package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
  70. package/dist/integrations/pi/components/upstream/theme/system-theme.d.ts +1 -1
  71. package/dist/integrations/pi/components/upstream/theme/system-theme.js +1 -1
  72. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +1 -1
  73. package/dist/integrations/pi/components/upstream/theme/theme.js +1 -1
  74. package/dist/integrations/pi/engine/adapter.d.ts +1 -1
  75. package/dist/integrations/pi/engine/adapter.js +8 -2
  76. package/dist/integrations/pi/engine/resources/changelog.json +4 -4
  77. package/dist/integrations/pi/startup-public.js +309 -206
  78. package/dist/integrations/pi/startup-public.manifest.json +3138 -3120
  79. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +1 -1
  80. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +1 -1
  81. package/dist/native/darwin-arm64/manifest.json +1 -1
  82. package/dist/native/linux-x64/manifest.json +1 -1
  83. package/dist/native/win32-x64/manifest.json +2 -2
  84. package/dist/native/win32-x64/process-guardian.exe +0 -0
  85. package/dist/runtime-payload-inventory.json +37027 -28855
  86. package/dist/ui/components/transcript-viewport.js +10 -7
  87. package/docs/architecture/project-structure.md +3 -1
  88. package/docs/assets/readme/separator-dark.svg +11 -0
  89. package/docs/assets/readme/separator.svg +11 -0
  90. package/docs/local-worktree-cleanup.md +3 -1
  91. package/docs/openspec-archive-automation.md +14 -5
  92. package/docs/releases/0.2.4.md +18 -0
  93. package/package.json +3 -3
  94. package/dist/integrations/pi/components/upstream/components/daxnuts.d.ts +0 -29
  95. package/dist/integrations/pi/components/upstream/components/daxnuts.js +0 -146
package/README.md CHANGED
@@ -12,187 +12,198 @@
12
12
  <a href="https://agentnumberone.dev"><img alt="Website" src="https://img.shields.io/badge/web-agentnumberone.dev-2638d2?style=flat-square"></a>
13
13
  </p>
14
14
 
15
+ <p align="center">
16
+ <a href="#install">Install</a> ·
17
+ <a href="#launch">Launch</a> ·
18
+ <a href="#update">Update</a> ·
19
+ <a href="#extensions">Extensions</a> ·
20
+ <a href="#develop">Develop</a> ·
21
+ <a href="#publish">Publish</a>
22
+ </p>
23
+
15
24
  ## Install
16
25
 
17
26
  Release:
18
27
 
19
- ```sh
28
+ ```text
20
29
  npm x -y -- @timurproko/a1-install
21
30
  ```
22
31
 
23
32
  Develop:
24
33
 
25
- ```sh
34
+ ```text
26
35
  npm x -y -- @timurproko/a1-install --develop
27
36
  ```
28
37
 
29
38
  Preview number:
30
39
 
31
- ```sh
40
+ ```text
32
41
  npm x -y -- @timurproko/a1-install --develop 107
33
42
  ```
34
43
 
35
44
  Exact preview:
36
45
 
37
- ```sh
46
+ ```text
38
47
  npm x -y -- @timurproko/a1-install --develop 0.1.8-dev.107
39
48
  ```
40
49
 
41
- <p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/terminal-dark.svg"><img src="docs/assets/readme/terminal.svg" alt="" width="240"></picture></p>
50
+ <p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/separator-dark.svg"><img src="docs/assets/readme/separator.svg" alt="" width="280"></picture></p>
42
51
 
43
- ## Use
52
+ ## Launch
44
53
 
45
54
  Launch A1 (profile: `~/.a1/agent`):
46
55
 
47
- ```sh
56
+ ```text
48
57
  a1
49
58
  ```
50
59
 
51
60
  Show all commands:
52
61
 
53
- ```sh
62
+ ```text
54
63
  a1 help
55
64
  ```
56
65
 
57
66
  Show the current and latest versions:
58
67
 
59
- ```sh
68
+ ```text
60
69
  a1 version
61
70
  ```
62
71
 
63
72
  Vanilla Pi oracle (`~/.pi/agent`):
64
73
 
65
- ```sh
74
+ ```text
66
75
  a1 pi
67
76
  ```
68
77
 
69
- ### Update
78
+ <p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/separator-dark.svg"><img src="docs/assets/readme/separator.svg" alt="" width="280"></picture></p>
79
+
80
+ ## Update
70
81
 
71
82
  Install the release:
72
83
 
73
- ```sh
84
+ ```text
74
85
  a1 update
75
86
  ```
76
87
 
77
88
  Install develop:
78
89
 
79
- ```sh
90
+ ```text
80
91
  a1 update --develop
81
92
  ```
82
93
 
83
94
  Install preview 107:
84
95
 
85
- ```sh
96
+ ```text
86
97
  a1 update --develop 107
87
98
  ```
88
99
 
89
100
  Install that exact preview:
90
101
 
91
- ```sh
102
+ ```text
92
103
  a1 update --develop 0.1.8-dev.107
93
104
  ```
94
105
 
95
106
  Refresh A1's model catalogs:
96
107
 
97
- ```sh
108
+ ```text
98
109
  a1 update --models
99
110
  ```
100
111
 
101
112
  Stuck on `0.2.2` and `a1 update` fails? Run the installer once, then use `a1 update` as usual:
102
113
 
103
- ```sh
114
+ ```text
104
115
  npm x -y -- @timurproko/a1-install
105
116
  ```
106
117
 
107
118
  A1 shows an `Update Available` notice at most once a day and never installs anything by itself. Turn it off in Settings (`Update check`) or with `A1_SKIP_VERSION_CHECK=1`.
108
119
 
109
- <p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/plugins-dark.svg"><img src="docs/assets/readme/plugins.svg" alt="" width="240"></picture></p>
120
+ <p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/separator-dark.svg"><img src="docs/assets/readme/separator.svg" alt="" width="280"></picture></p>
110
121
 
111
122
  ## Extensions
112
123
 
113
124
  Install a package:
114
125
 
115
- ```sh
126
+ ```text
116
127
  a1 install npm:pi-mcp-adapter
117
128
  ```
118
129
 
119
130
  Remove it (alias: `a1 uninstall`):
120
131
 
121
- ```sh
132
+ ```text
122
133
  a1 remove npm:pi-mcp-adapter
123
134
  ```
124
135
 
125
136
  List installed packages:
126
137
 
127
- ```sh
138
+ ```text
128
139
  a1 list
129
140
  ```
130
141
 
131
142
  Update every installed package:
132
143
 
133
- ```sh
144
+ ```text
134
145
  a1 update --extensions
135
146
  ```
136
147
 
137
148
  Update one:
138
149
 
139
- ```sh
150
+ ```text
140
151
  a1 update npm:pi-mcp-adapter
141
152
  ```
142
153
 
143
- <p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/gears-dark.svg"><img src="docs/assets/readme/gears.svg" alt="" width="240"></picture></p>
154
+ <p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/separator-dark.svg"><img src="docs/assets/readme/separator.svg" alt="" width="280"></picture></p>
144
155
 
145
156
  ## Develop
146
157
 
147
158
  Install exact locked dependencies:
148
159
 
149
- ```sh
160
+ ```text
150
161
  npm ci
151
162
  ```
152
163
 
153
164
  Compile TypeScript and the process guardian into `dist`:
154
165
 
155
- ```sh
166
+ ```text
156
167
  npm run build
157
168
  ```
158
169
 
159
170
  Build and launch a source `a1`:
160
171
 
161
- ```sh
172
+ ```text
162
173
  npm start
163
174
  ```
164
175
 
165
176
  Build and launch a source `a1 pi`:
166
177
 
167
- ```sh
178
+ ```text
168
179
  npm run start:pi
169
180
  ```
170
181
 
171
182
  Typecheck + fast suite (alias: `npm test`):
172
183
 
173
- ```sh
184
+ ```text
174
185
  npm run test:fast
175
186
  ```
176
187
 
177
188
  Complete non-physical suite:
178
189
 
179
- ```sh
190
+ ```text
180
191
  npm run test:full
181
192
  ```
182
193
 
183
194
  Report Node, npm, git, Rust, and dependency readiness:
184
195
 
185
- ```sh
196
+ ```text
186
197
  npm run doctor
187
198
  ```
188
199
 
189
200
  Preview the README as GitHub renders it, in your browser (needs `gh`):
190
201
 
191
- ```sh
202
+ ```text
192
203
  npm run preview:readme
193
204
  ```
194
205
 
195
- <p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/rocket-dark.svg"><img src="docs/assets/readme/rocket.svg" alt="" width="240"></picture></p>
206
+ <p align="center"><picture><source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme/separator-dark.svg"><img src="docs/assets/readme/separator.svg" alt="" width="280"></picture></p>
196
207
 
197
208
  ## Publish
198
209
 
@@ -200,25 +211,25 @@ npm run preview:readme
200
211
 
201
212
  Request the preview publish:
202
213
 
203
- ```sh
214
+ ```text
204
215
  npm run develop
205
216
  ```
206
217
 
207
218
  ### Release
208
219
 
209
- ```sh
220
+ ```text
210
221
  npm run release -- patch # 0.1.8-dev -> 0.1.8
211
222
  ```
212
223
 
213
- ```sh
224
+ ```text
214
225
  npm run release -- minor # 0.1.8-dev -> 0.2.0
215
226
  ```
216
227
 
217
- ```sh
228
+ ```text
218
229
  npm run release -- major # 0.1.8-dev -> 1.0.0
219
230
  ```
220
231
 
221
- ```sh
232
+ ```text
222
233
  npm run release -- 0.4.0 # prepare an exact stable version
223
234
  ```
224
235
 
@@ -49,9 +49,9 @@ export function resolvePinnedPiImport(specifier) {
49
49
  if (match === null) throw new Error(`pinned Pi import is invalid: ${specifier}`);
50
50
  const packageName = match[1] ?? "";
51
51
  const subpath = match[2]?.slice(1) ?? "";
52
- const packageRoot = resolve(root, "node_modules", ...packageName.split("/"));
52
+ const packageRoot = findDependencyRoot(root, packageName);
53
+ if (packageRoot === undefined) throw new Error(`pinned Pi dependency is unavailable: ${packageName}`);
53
54
  const manifestPath = resolve(packageRoot, "package.json");
54
- if (!existsSync(manifestPath)) throw new Error(`pinned Pi dependency is unavailable: ${packageName}`);
55
55
  const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
56
56
  const declaredTarget = exportedTarget(manifest.exports, subpath) ?? (subpath.length === 0 ? manifest.module ?? manifest.main : undefined);
57
57
  const target = typeof declaredTarget === "string" && !declaredTarget.startsWith(".") ? `./${declaredTarget}` : declaredTarget;
@@ -61,6 +61,24 @@ export function resolvePinnedPiImport(specifier) {
61
61
  return pathToFileURL(path).href;
62
62
  }
63
63
 
64
+ /**
65
+ * Follow Node's package lookup shape so npm may either nest a Pi dependency or
66
+ * deduplicate it into an ancestor node_modules directory.
67
+ * @param {string} root
68
+ * @param {string} packageName
69
+ * @returns {string | undefined}
70
+ */
71
+ function findDependencyRoot(root, packageName) {
72
+ let current = root;
73
+ while (true) {
74
+ const candidate = resolve(current, "node_modules", ...packageName.split("/"));
75
+ if (existsSync(resolve(candidate, "package.json"))) return candidate;
76
+ const parent = dirname(current);
77
+ if (parent === current) return undefined;
78
+ current = parent;
79
+ }
80
+ }
81
+
64
82
  function pinnedRoot() {
65
83
  if (configuredRoot === undefined) throw new Error("pinned Pi public package directory is not configured");
66
84
  if (!existsSync(resolve(configuredRoot, "package.json"))) throw new Error("pinned Pi public package directory is unavailable");
@@ -257,13 +257,13 @@ export declare class OwnedUiSessionShellRoot implements PiTuiComponentPort {
257
257
  setViewportOverlaySurfaces(surfaces: readonly PiTuiPointerSurface[] | null): void;
258
258
  viewportInputGeometryReady(width: number, height: number): boolean;
259
259
  handleViewportPreInput(data: string, allowWheel?: boolean, now?: number, editorActive?: boolean): SessionViewportInputResult;
260
+ dismissNotice(): void;
260
261
  layoutRoot(): PiTuiLayoutNode;
261
262
  transcriptComponent(id: string): PiShellTranscriptComponentPort | undefined;
262
263
  exitTranscript(width: number): string;
263
264
  appendWorkflowStatus(message: string): void;
264
265
  appendWorkflowMessage(message: PiWorkflowMessage, errorCode?: ImageAttachmentError["code"]): void;
265
266
  appendWorkflowResult(result: PiWorkflowResult, errorCode?: ImageAttachmentError["code"]): void;
266
- appendDaxnuts(): void;
267
267
  toggleThinkingVisibility(): void;
268
268
  get toolsExpanded(): boolean;
269
269
  setToolsExpanded(expanded: boolean): void;
@@ -9,7 +9,7 @@ import { PINNED_PI_HIDDEN_COMMAND_NAMES, PINNED_PI_WORKFLOW_COMMAND_NAMES } from
9
9
  import { createPiExtensionUiBridge } from "../../integrations/pi/components/shell-extension-ui.js";
10
10
  import { createPiShellEditor } from "../../integrations/pi/components/shell-editor-autocomplete.js";
11
11
  import { createPiQueuedInputStatus, createPiShellFooter, createPiShellHeader, createPiShellLoadedResources, createPiShellStatus, } from "../../integrations/pi/components/shell-footer-status.js";
12
- import { createPiShellArmin, createPiShellAuthProviderSelector, createPiShellDaxnuts, createPiShellDialog, createPiShellEarendilAnnouncement, createPiShellExtensionSelector, createPiShellLoginDialog, createPiShellModelSelector, createPiShellOperationLoader, createPiShellReloadBox, createPiShellScopedModelsSelector, createPiShellSelector, createPiShellSessionSelector, createPiShellSettingsSelector, createPiShellTreeSelector, createPiShellTrustSelector, createPiShellUserMessageSelector, } from "../../integrations/pi/components/shell-selectors-dialogs.js";
12
+ import { createPiShellArmin, createPiShellAuthProviderSelector, createPiShellDialog, createPiShellEarendilAnnouncement, createPiShellExtensionSelector, createPiShellLoginDialog, createPiShellModelSelector, createPiShellOperationLoader, createPiShellReloadBox, createPiShellScopedModelsSelector, createPiShellSelector, createPiShellSessionSelector, createPiShellSettingsSelector, createPiShellTreeSelector, createPiShellTrustSelector, createPiShellUserMessageSelector, } from "../../integrations/pi/components/shell-selectors-dialogs.js";
13
13
  import { createPiShellChangelog, createPiShellCollapsedChangelog, createPiShellHotkeys, createPiShellSessionInfo, renderPiShellCommandMessage, renderPiShellPackageUpdateNotice, renderPiShellReleaseUpdateBanner, renderPiShellReleaseUpdateNotice, renderPiShellStatusText, } from "../../integrations/pi/components/shell-presenters-info.js";
14
14
  import { createPiShellTranscriptComponent, isPiPromptStyleCompaction, paintPiSubmittedPromptTimestamp, renderPiShellStartupDiagnostic, renderPiShellTranscriptBlock, } from "../../integrations/pi/components/shell-presenters-transcript.js";
15
15
  import { onPiThemeChange, PINNED_PI_LAYOUT, piTheme } from "../../integrations/pi/components/upstream/theme/theme.js";
@@ -86,7 +86,7 @@ export class OwnedUiSessionShellRoot {
86
86
  #imageSubmissionsSending = 0;
87
87
  constructor(view, cwd, handlers, startup = {}, agentDir, extensionRenderers = {
88
88
  getMessageRenderer: () => undefined,
89
- getToolDefinition: () => undefined,
89
+ getToolRenderers: () => undefined,
90
90
  }, sessionLayout = "pinned", imageAssets) {
91
91
  this.#view = view;
92
92
  this.#customViewport = sessionLayout === "custom-viewport";
@@ -286,7 +286,7 @@ export class OwnedUiSessionShellRoot {
286
286
  reconcilePromptImageLimitNotice(text = this.editor.getText()) {
287
287
  if (this.#dockNotice?.errorCode !== "image-count" || !this.#promptChips.imageLimitState(text).corrected)
288
288
  return false;
289
- this.#dismissDockNotice();
289
+ this.dismissNotice();
290
290
  return true;
291
291
  }
292
292
  hasPendingPastes(text) { return this.#promptChips.hasPending(text); }
@@ -375,7 +375,7 @@ export class OwnedUiSessionShellRoot {
375
375
  // Invariant: the notice answers the reader's last command, so only their next prompt or
376
376
  // shell command retires it; assistant, tool, and compaction blocks streaming in keep it.
377
377
  if (block.kind === "user" || block.kind === "bash")
378
- this.#dismissDockNotice();
378
+ this.dismissNotice();
379
379
  const created = createPiShellTranscriptComponent(block, this.#cwd, this.#extensionRenderers, this.#submittedPromptComposer, this.#outputPad, !this.#thinkingVisible, this.#mermaidRenderingMode, this.#showImages, this.#imageWidthCells, this.#imageAssets, { ...this.#componentRuntime, changed: () => {
380
380
  if (this.#transcript.get(block.id) !== created)
381
381
  return;
@@ -659,7 +659,7 @@ export class OwnedUiSessionShellRoot {
659
659
  }
660
660
  return renderPiShellCommandMessage({ kind: notice.kind, message: notice.message }, width, this.#outputPad);
661
661
  }
662
- #dismissDockNotice() {
662
+ dismissNotice() {
663
663
  if (this.#dockNotice === undefined)
664
664
  return;
665
665
  this.#dockNotice = undefined;
@@ -984,11 +984,6 @@ export class OwnedUiSessionShellRoot {
984
984
  : result.message;
985
985
  this.appendWorkflowStatus(message);
986
986
  }
987
- appendDaxnuts() {
988
- this.#lastWorkflowStatusId = undefined;
989
- const daxnuts = createPiShellDaxnuts(this.#componentRuntime);
990
- this.#appendAnchoredWorkflowComponent(width => ["", ...daxnuts.render(width)], () => daxnuts.dispose?.());
991
- }
992
987
  toggleThinkingVisibility() {
993
988
  this.setHideThinkingBlock(this.#thinkingVisible);
994
989
  }
@@ -1252,7 +1247,7 @@ export class OwnedUiSessionShellRoot {
1252
1247
  }
1253
1248
  #appendAnchoredWorkflowComponent(render, dispose) {
1254
1249
  // Invariant: transcript-bound workflow output supersedes a pending acknowledgement.
1255
- this.#dismissDockNotice();
1250
+ this.dismissNotice();
1256
1251
  this.#workflowTranscriptSequence += 1;
1257
1252
  const id = `workflow-status-${this.#workflowTranscriptSequence}`;
1258
1253
  const component = {
@@ -14,7 +14,7 @@ import { createPiExtensionUiBridge } from "../../integrations/pi/components/shel
14
14
  import { createPiShellEditor } from "../../integrations/pi/components/shell-editor-autocomplete.js";
15
15
  import { SKILLS_COMMAND_NAME, findSkillByArgument, rewriteSkillsTunnelSubmission, skillPrompt, skillsFromCommands, } from "../../integrations/pi/components/skills-command.js";
16
16
  import { createPiQueuedInputStatus, createPiShellFooter, createPiShellHeader, createPiShellLoadedResources, createPiShellStatus, } from "../../integrations/pi/components/shell-footer-status.js";
17
- import { createPiShellArmin, createPiShellAuthProviderSelector, createPiShellDaxnuts, createPiShellDialog, createPiShellEarendilAnnouncement, createPiShellExtensionSelector, createPiShellLoginDialog, createPiShellModelSelector, createPiShellModelsDialog, createPiShellOperationLoader, createPiShellReloadBox, createPiShellScopedModelsSelector, createPiShellSelector, createPiShellSessionSelector, createPiShellSettingsSelector, createPiShellSkillsSelector, createPiShellTreeSelector, createPiShellTrustSelector, createPiShellUserMessageSelector, } from "../../integrations/pi/components/shell-selectors-dialogs.js";
17
+ import { createPiShellArmin, createPiShellAuthProviderSelector, createPiShellDialog, createPiShellEarendilAnnouncement, createPiShellExtensionSelector, createPiShellLoginDialog, createPiShellModelSelector, createPiShellModelsDialog, createPiShellOperationLoader, createPiShellReloadBox, createPiShellScopedModelsSelector, createPiShellSelector, createPiShellSessionSelector, createPiShellSettingsSelector, createPiShellSkillsSelector, createPiShellTreeSelector, createPiShellTrustSelector, createPiShellUserMessageSelector, } from "../../integrations/pi/components/shell-selectors-dialogs.js";
18
18
  import { createPiShellChangelog, createPiShellHotkeys, createPiShellSessionInfo, renderPiShellPackageUpdateNotice, renderPiShellStatusText, } from "../../integrations/pi/components/shell-presenters-info.js";
19
19
  import { createPiShellTranscriptComponent, renderPiShellStartupDiagnostic, renderPiShellTranscriptBlock, } from "../../integrations/pi/components/shell-presenters-transcript.js";
20
20
  import { onPiThemeChange, piTheme } from "../../integrations/pi/components/upstream/theme/theme.js";
@@ -233,7 +233,7 @@ export class OwnedUiSessionShell {
233
233
  resources: startup?.resources ?? shellResourceEntries(this.backend),
234
234
  }, this.backend.agentDir, {
235
235
  getMessageRenderer: customType => this.backend.pinnedMessageRenderer(customType),
236
- getToolDefinition: toolName => this.backend.pinnedToolDefinition(toolName),
236
+ getToolRenderers: toolName => this.backend.pinnedToolRenderers(toolName),
237
237
  getShortcuts: bindings => this.backend.pinnedShortcutDescriptions(bindings),
238
238
  }, sessionLayout, {
239
239
  resolve: assetId => this.backend.resolveTranscriptImage(assetId),
@@ -358,12 +358,13 @@ export class OwnedUiSessionShell {
358
358
  ? this.runtime.addPreInputListener(data => {
359
359
  if (inputPresentation?.coordination === false)
360
360
  this.#streamPresentation.noteImmediatePresentation();
361
- // Compatibility: Pi's fullscreen renderer also intercepts plain Home/End.
362
- // Deliver them to the focused owned input before that outer scroll handler;
363
- // overlays retain Pi's normal dispatch, and comparison profiles never enter here.
361
+ // Compatibility: route boundary keys before Pi.
362
+ const isDefault = this.root.usesDefaultInputSurface();
364
363
  if (!this.runtime.hasOverlay() && (this.root.editor.matchesTerminalKey(data, "home")
365
- || this.root.editor.matchesTerminalKey(data, "end"))) {
366
- if (this.root.usesDefaultInputSurface())
364
+ || this.root.editor.matchesTerminalKey(data, "end")
365
+ || !isDefault && (this.root.editor.matchesTerminalKey(data, "ctrl+home")
366
+ || this.root.editor.matchesTerminalKey(data, "ctrl+end")))) {
367
+ if (isDefault)
367
368
  this.root.handleViewportPreInput(data, true);
368
369
  this.root.handleInput(data);
369
370
  this.runtime.requestRender();
@@ -823,8 +824,6 @@ export class OwnedUiSessionShell {
823
824
  async cycleModel(direction) {
824
825
  const result = await this.backend.cycleModelWorkflow(direction);
825
826
  this.root.appendWorkflowResult(result);
826
- if (result.outcome === "completed")
827
- this.#showDaxnutsForActiveModel();
828
827
  this.runtime.requestRender();
829
828
  return workflowAdapterResult(result);
830
829
  }
@@ -1345,8 +1344,6 @@ export class OwnedUiSessionShell {
1345
1344
  this.#installAutocompleteCommands();
1346
1345
  }
1347
1346
  this.root.appendWorkflowResult(result);
1348
- if ((request.command === "model" || request.command === "models") && result.outcome === "completed")
1349
- this.#showDaxnutsForActiveModel();
1350
1347
  this.runtime.requestRender();
1351
1348
  return workflowAdapterResult(result);
1352
1349
  }
@@ -1536,12 +1533,6 @@ export class OwnedUiSessionShell {
1536
1533
  this.runtime.requestRender();
1537
1534
  }).finally(() => clearTimeout(timeout));
1538
1535
  }
1539
- #showDaxnutsForActiveModel() {
1540
- const model = this.view().activeModel;
1541
- if (model?.providerId === "opencode" && model.modelId.toLowerCase().includes("kimi-k2.5")) {
1542
- this.root.appendDaxnuts();
1543
- }
1544
- }
1545
1536
  // Invariant: pointer reporting is disabled on every path that ends the owning screen.
1546
1537
  #setPointerReporting(enabled, forceOff = false) {
1547
1538
  const effective = forceOff ? false : this.#customViewport || enabled;
@@ -1778,6 +1769,7 @@ export class OwnedUiSessionShell {
1778
1769
  return { outcome: "failed", diagnostic: `route is unavailable: ${route}` };
1779
1770
  if (!this.runtime.active)
1780
1771
  return { outcome: "failed", diagnostic: "runtime is not active" };
1772
+ this.root.dismissNotice();
1781
1773
  this.#dialogHandle?.hide();
1782
1774
  this.#dialogSource = "route";
1783
1775
  // Protocol: any-event reporting: hover and drag are what the screen is driven by, and
@@ -82,6 +82,7 @@ export async function composeOwnedUi(options = {}) {
82
82
  const { renderPiShellHotkeySections } = await import("../integrations/pi/components/shell-hotkey-sections.js");
83
83
  return { sections: width => renderPiShellHotkeySections(presentation, width) };
84
84
  },
85
+ session: () => import("./session-info-reference.js").then(m => m.loadSessionInfoReference(adapter)),
85
86
  };
86
87
  const routeHost = settings === null || !ownedSurfaces ? null : createOwnedRouteHost(settings, references);
87
88
  const viewportSettings = settings === null || !ownedSurfaces ? null : {
@@ -0,0 +1,4 @@
1
+ import type { ReferenceDocumentProvider } from "../features/owned-ui/reference-screen-app.js";
2
+ import type { PiEngineAdapter } from "../integrations/pi/engine/adapter.js";
3
+ /** Captures one current session snapshot and adapts it to the neutral reference document. */
4
+ export declare function loadSessionInfoReference(adapter: PiEngineAdapter): Promise<ReferenceDocumentProvider>;
@@ -0,0 +1,20 @@
1
+ import { renderPiShellSessionInfoReferenceDocument } from "../integrations/pi/components/shell-session-info-reference.js";
2
+ /** Captures one current session snapshot and adapts it to the neutral reference document. */
3
+ export async function loadSessionInfoReference(adapter) {
4
+ const result = await adapter.executeWorkflow({ command: "session", argument: "" });
5
+ if (result.outcome !== "completed")
6
+ throw new Error(result.message);
7
+ if (result.presentation?.kind !== "session-info")
8
+ throw new Error("Session workflow returned no structured information");
9
+ const presentation = result.presentation;
10
+ let cached = null;
11
+ const document = (width) => {
12
+ if (cached?.width !== width)
13
+ cached = { width, document: renderPiShellSessionInfoReferenceDocument(presentation, width) };
14
+ return cached.document;
15
+ };
16
+ return {
17
+ preamble: width => document(width).preamble,
18
+ sections: width => document(width).sections,
19
+ };
20
+ }
@@ -7,10 +7,7 @@ export type OwnedReferenceRows = NonNullable<ReferenceDocumentProvider["rows"]>;
7
7
  export interface OwnedReferenceProviders {
8
8
  changelog(input?: UiRouteInput): Promise<ReferenceDocumentProvider>;
9
9
  hotkeys(): Promise<ReferenceDocumentProvider>;
10
+ session(): Promise<ReferenceDocumentProvider>;
10
11
  }
11
- /**
12
- * Declares the A1-owned settings route, and the changelog and hotkeys reference
13
- * routes when their documents are supplied, without evaluating their presentation
14
- * graphs during startup. Opening a route retains input while the optional module loads.
15
- */
12
+ /** Declares settings and lazy document routes. */
16
13
  export declare function createOwnedRouteHost(settings: OwnedSettingsManager, references?: OwnedReferenceProviders): UiRouteHost;
@@ -1,14 +1,10 @@
1
- import { CHANGELOG_APP_ID, CHANGELOG_ROUTE, CHANGELOG_TITLE, HOTKEYS_APP_ID, HOTKEYS_ROUTE, HOTKEYS_TITLE, } from "../features/owned-ui/reference-routes.js";
1
+ import { CHANGELOG_ROUTE, CHANGELOG_TITLE, HOTKEYS_ROUTE, HOTKEYS_TITLE, } from "../features/owned-ui/reference-routes.js";
2
2
  import { SETTINGS_APP_ID, SETTINGS_ROUTE } from "../features/owned-ui/settings-route.js";
3
3
  import { piTheme } from "../integrations/pi/components/upstream/theme/theme.js";
4
4
  import { faint } from "../ui/components/text.js";
5
- /**
6
- * Declares the A1-owned settings route, and the changelog and hotkeys reference
7
- * routes when their documents are supplied, without evaluating their presentation
8
- * graphs during startup. Opening a route retains input while the optional module loads.
9
- */
5
+ /** Declares settings and lazy document routes. */
10
6
  export function createOwnedRouteHost(settings, references) {
11
- const routes = new Set([SETTINGS_ROUTE, ...(references === undefined ? [] : [CHANGELOG_ROUTE, HOTKEYS_ROUTE])]);
7
+ const routes = new Set([SETTINGS_ROUTE, ...(references === undefined ? [] : [CHANGELOG_ROUTE, HOTKEYS_ROUTE, "session"])]);
12
8
  return {
13
9
  claims: route => routes.has(route),
14
10
  open: (route, input) => {
@@ -18,10 +14,10 @@ export function createOwnedRouteHost(settings, references) {
18
14
  return deferredSurface(SETTINGS_APP_ID, "settings", () => loadSettingsSurface(settings));
19
15
  }
20
16
  const changelog = route === CHANGELOG_ROUTE;
21
- const id = changelog ? CHANGELOG_APP_ID : HOTKEYS_APP_ID;
22
- const title = changelog ? CHANGELOG_TITLE : HOTKEYS_TITLE;
23
- const document = changelog ? references.changelog(input) : references.hotkeys();
24
- return deferredSurface(id, title, () => loadReferenceSurface(settings, id, route, title, document));
17
+ const session = route === "session";
18
+ const title = session ? "Session Info" : changelog ? CHANGELOG_TITLE : HOTKEYS_TITLE;
19
+ const document = session ? references.session() : changelog ? references.changelog(input) : references.hotkeys();
20
+ return deferredSurface(route, title, () => loadReferenceSurface(settings, route, route, title, document));
25
21
  },
26
22
  };
27
23
  }
@@ -11,6 +11,8 @@ export interface ReferenceDocumentSection {
11
11
  export interface ReferenceDocumentProvider {
12
12
  /** Flat rows for this width, or null while the document is not available yet. */
13
13
  readonly rows?: (width: number) => readonly string[] | null;
14
+ /** Rows between the screen title and structured groups, absent for group-only documents. */
15
+ readonly preamble?: (width: number) => readonly string[] | null;
14
16
  /** Structured groups opt into shared Settings-style headers and pinning. */
15
17
  readonly sections?: (width: number) => readonly ReferenceDocumentSection[] | null;
16
18
  /** Settles once the selected content provider answers; absent when available at once. */
@@ -222,10 +222,16 @@ export class ReferenceScreenApp {
222
222
  if (cached !== null && cached.width === width)
223
223
  return this.#withTitle(cached.content, title);
224
224
  const sections = this.#document.sections?.(width);
225
- if (sections === null)
225
+ const preamble = sections === undefined ? undefined : this.#document.preamble?.(width);
226
+ if (sections === null || preamble === null)
226
227
  return { kind: "flat", rows: [title, "", LOADING_NOTICE] };
227
228
  if (sections !== undefined) {
228
229
  const rows = [];
230
+ if (preamble !== undefined && preamble.length > 0) {
231
+ for (const row of preamble)
232
+ rows.push({ kind: "note", group: "", text: row });
233
+ rows.push({ kind: "spacer" });
234
+ }
229
235
  sections.forEach((section, sectionIndex) => {
230
236
  if (sectionIndex > 0)
231
237
  rows.push({ kind: "spacer" });
@@ -1,6 +1,10 @@
1
1
  {
2
2
  "schema": "a1-release-notes-v1",
3
3
  "releases": [
4
+ {
5
+ "version": "0.2.4",
6
+ "markdown": "## [0.2.4] - 2026-10-05\n\n### Changed\n\n- upgrade pinned Pi to 1.0.0 ([#658](https://github.com/timurproko/a1/pull/658))\n- upgrade pinned Pi to 1.0.2 ([#669](https://github.com/timurproko/a1/pull/669))\n- add animated mark, section art, and browser preview ([#665](https://github.com/timurproko/a1/pull/665))\n- keep the hero mark still and link only it to the site ([#666](https://github.com/timurproko/a1/pull/666))\n- pick dark-mode art via picture sources ([#668](https://github.com/timurproko/a1/pull/668))\n\n### Fixed\n\n- make self-update upgrades reliable ([#664](https://github.com/timurproko/a1/pull/664))\n- restore the terminal and print a resume hint when a1 is killed ([#667](https://github.com/timurproko/a1/pull/667))\n- align progress with Pi accent ([#671](https://github.com/timurproko/a1/pull/671))\n- support Git URL rewrites ([#673](https://github.com/timurproko/a1/pull/673))\n- support repository relocation ([#675](https://github.com/timurproko/a1/pull/675))\n- prevent bottom control gutter bleed ([#677](https://github.com/timurproko/a1/pull/677))\n"
7
+ },
4
8
  {
5
9
  "version": "0.2.3",
6
10
  "markdown": "## [0.2.3] - 2026-10-03\n\n### Changed\n\n- upgrade pinned Pi to 0.99.1 ([#642](https://github.com/timurproko/a1/pull/642))\n- upgrade pinned Pi to 0.99.2 ([#652](https://github.com/timurproko/a1/pull/652))\n- match changelog link decoration ([#649](https://github.com/timurproko/a1/pull/649))\n- rename stable wrapper ([#655](https://github.com/timurproko/a1/pull/655))\n\n### Fixed\n\n- restore documentation auto-merge ([#653](https://github.com/timurproko/a1/pull/653))\n- allow development publication startup ([#654](https://github.com/timurproko/a1/pull/654))\n- bound Windows backlog setup ([#656](https://github.com/timurproko/a1/pull/656))\n- resolve bundled npm entry ([#657](https://github.com/timurproko/a1/pull/657))\n- verify exact npm resources ([#659](https://github.com/timurproko/a1/pull/659))\n"
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Generated by scripts/pi/sync-progress-palette.ts from @earendil-works/pi-coding-agent 1.0.0
3
- * (MIT), commit a13d35a742c6ef8462812a28fbe1d8c8b7431c32. Do not edit directly.
2
+ * Generated by scripts/pi/sync-progress-palette.ts from @earendil-works/pi-coding-agent 1.0.4
3
+ * (MIT), commit 7c10bd4337495ee613f2224843ecdf349b80d1df. Do not edit directly.
4
4
  */
5
5
  export declare const SHARED_PROGRESS_ACCENT_ANSI = "\u001B[38;2;167;152;215m";
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Generated by scripts/pi/sync-progress-palette.ts from @earendil-works/pi-coding-agent 1.0.0
3
- * (MIT), commit a13d35a742c6ef8462812a28fbe1d8c8b7431c32. Do not edit directly.
2
+ * Generated by scripts/pi/sync-progress-palette.ts from @earendil-works/pi-coding-agent 1.0.4
3
+ * (MIT), commit 7c10bd4337495ee613f2224843ecdf349b80d1df. Do not edit directly.
4
4
  */
5
5
  export const SHARED_PROGRESS_ACCENT_ANSI = "\u001b[38;2;167;152;215m";
@@ -10,7 +10,7 @@ export const STARTUP_DESCRIPTOR = Object.freeze({
10
10
  ],
11
11
  "generatedArtifact": {
12
12
  "path": "dist/integrations/pi/startup-public.js",
13
- "sha256": "cb2331c550009704bce2614f2f7fb6e1b45ed00403be804da3b83c1ea90a17c4"
13
+ "sha256": "2adac500d8cebd5f7805c18a549ec0c6b23f13bd10ee5f3f463a6758f489e410"
14
14
  },
15
15
  "dependencyLayerIdentity": {
16
16
  "source": "A1_RELEASE_LAYERS",
@@ -19,7 +19,7 @@ export const STARTUP_DESCRIPTOR = Object.freeze({
19
19
  "compileCacheNamespace": {
20
20
  "strategy": "node-abi-version-and-ordered-layer-sha256-v1"
21
21
  },
22
- "identity": "54cea64be46c7a0d36ab6a1889206f79813dba6b9884387b391440fe30a1fdee"
22
+ "identity": "b010b97970c6c40fe160224121793bf0b26d7c77e7860d8e787aaeb912333100"
23
23
  });
24
24
 
25
25
  export function loadDeclaredStartupGraph() {
@@ -2,7 +2,7 @@ export { adaptPiAssistantMessage, adaptPiToolExecution, adaptPiUserMessage } fro
2
2
  export { loadHistoryEditor, type HistoryEditorConstructor } from "./history-editor-loader.js";
3
3
  export { PiComponentConformanceError, runPiComponentConformance } from "./conformance.js";
4
4
  export type { PiComponentConformanceReport, PiComponentConformanceResult } from "./conformance.js";
5
- export { OWNED_BUILTIN_SLASH_COMMANDS, PINNED_PI_BUILTIN_SLASH_COMMANDS, componentFromPort, componentPort, createPiExtensionUiBridge, createPiQueuedInputStatus, createPiShellArmin, createPiShellAuthProviderSelector, createPiShellChangelog, createPiShellCollapsedChangelog, createPiShellDaxnuts, createPiShellDialog, createPiShellEarendilAnnouncement, createPiShellEditor, createPiShellExtensionSelector, createPiShellFooter, createPiShellHeader, createPiShellHotkeys, createPiShellLoadedResources, createPiShellLoginDialog, createPiShellModelSelector, createPiShellModelsDialog, createPiShellOperationLoader, createPiShellReloadBox, createPiShellScopedModelsSelector, createPiShellSelector, createPiShellSessionInfo, createPiShellSessionSelector, createPiShellSettingsSelector, createPiShellShowImagesSelector, createPiShellSkillsSelector, createPiShellStatus, createPiShellThemeSelector, createPiShellTranscriptComponent, createPiShellTreeSelector, createPiShellTrustSelector, createPiShellUserMessageSelector, createTuiFacade, ensureTheme, formatSessionTokens, isAutocompleteProvider, isPiPromptStyleCompaction, isRecord, paintPiSubmittedPromptTimestamp, piShellHyperlink, piShellTruncateToWidth, piShellVisibleWidth, renderPiShellChangelogLines, renderPiShellCommandMessage, renderPiShellHotkeysLines, renderPiShellPackageUpdateNotice, renderPiShellReleaseUpdateBanner, renderPiShellReleaseUpdateNotice, renderPiShellStartupDiagnostic, renderPiShellStatusText, renderPiShellTranscriptBlock, validatedAssistantMessage, } from "./shell-components.js";
5
+ export { OWNED_BUILTIN_SLASH_COMMANDS, PINNED_PI_BUILTIN_SLASH_COMMANDS, componentFromPort, componentPort, createPiExtensionUiBridge, createPiQueuedInputStatus, createPiShellArmin, createPiShellAuthProviderSelector, createPiShellChangelog, createPiShellCollapsedChangelog, createPiShellDialog, createPiShellEarendilAnnouncement, createPiShellEditor, createPiShellExtensionSelector, createPiShellFooter, createPiShellHeader, createPiShellHotkeys, createPiShellLoadedResources, createPiShellLoginDialog, createPiShellModelSelector, createPiShellModelsDialog, createPiShellOperationLoader, createPiShellReloadBox, createPiShellScopedModelsSelector, createPiShellSelector, createPiShellSessionInfo, createPiShellSessionSelector, createPiShellSettingsSelector, createPiShellShowImagesSelector, createPiShellSkillsSelector, createPiShellStatus, createPiShellThemeSelector, createPiShellTranscriptComponent, createPiShellTreeSelector, createPiShellTrustSelector, createPiShellUserMessageSelector, createTuiFacade, ensureTheme, formatSessionTokens, isAutocompleteProvider, isPiPromptStyleCompaction, isRecord, paintPiSubmittedPromptTimestamp, piShellHyperlink, piShellTruncateToWidth, piShellVisibleWidth, renderPiShellChangelogLines, renderPiShellCommandMessage, renderPiShellHotkeysLines, renderPiShellPackageUpdateNotice, renderPiShellReleaseUpdateBanner, renderPiShellReleaseUpdateNotice, renderPiShellStartupDiagnostic, renderPiShellStatusText, renderPiShellTranscriptBlock, validatedAssistantMessage, } from "./shell-components.js";
6
6
  export { renderPiShellHotkeySections } from "./shell-hotkey-sections.js";
7
7
  export type { PiShellHotkeySection } from "./shell-hotkey-sections.js";
8
8
  export type { PiExtensionUiBridge, PiExtensionUiBridgeHost, PiShellAuthProviderOption, PiShellAutocompleteCommand, PiShellClipboardContent, PiShellCommandMessagePresentation, PiShellComponentPort, PiShellEditorBodyGeometry, PiShellEditorOptions, PiShellEditorPointerEvent, PiShellEditorPort, PiShellEditorTextRange, PiShellExtensionRendererResolver, PiShellHeaderOptions, PiShellHeaderPort, PiShellHotkeysPresentation, PiShellImageAssetResolver, PiShellLoadedResourcesPort, PiShellLoginDialogPort, PiShellModelSelectorOptions, PiShellModelsDialogOptions, PiShellModelsDialogPort, PiShellOperationLoaderPort, PiShellPasteReservation, PiShellQueuedInputPort, PiShellResourceEntry, PiShellResourceSection, PiShellScopedModelDescriptor, PiShellScopedModelsSelectorOptions, PiShellScopedModelsSelectorPort, PiShellSelectorOption, PiShellSelectorOptions, PiShellSessionInfoPresentation, PiShellSettingsSelectorOptions, PiShellStartupNotice, PiShellStatusPlacement, PiShellStatusPort, PiShellSubmittedPromptComposer, PiShellTranscriptComponentPort, PiShellViewComponentPort, } from "./shell-components.js";