@timurproko/a1 0.1.8-dev.282 → 0.1.8-dev.289

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 (45) hide show
  1. package/bin/ui.js +14 -2
  2. package/dist/contracts/owned-ui/image-attachments.d.ts +29 -0
  3. package/dist/contracts/owned-ui/image-attachments.js +60 -0
  4. package/dist/contracts/owned-ui/index.d.ts +1 -0
  5. package/dist/contracts/owned-ui/index.js +1 -0
  6. package/dist/contracts/owned-ui/validation.js +2 -9
  7. package/dist/features/owned-ui/run.js +16 -1
  8. package/dist/foundation/release/bootstrap.js +2 -1
  9. package/dist/foundation/terminal-cleanup/fatal-exit.d.ts +12 -0
  10. package/dist/foundation/terminal-cleanup/fatal-exit.js +85 -0
  11. package/dist/foundation/terminal-cleanup/index.d.ts +2 -0
  12. package/dist/foundation/terminal-cleanup/index.js +2 -0
  13. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +4 -0
  14. package/dist/foundation/terminal-cleanup/terminal-reset.js +40 -0
  15. package/dist/integrations/pi/components/owned-editor-ux.d.ts +6 -0
  16. package/dist/integrations/pi/components/owned-editor-ux.js +71 -0
  17. package/dist/integrations/pi/components/shell-editor-autocomplete.js +2 -0
  18. package/dist/integrations/pi/components/shell-shared-facade.d.ts +6 -1
  19. package/dist/integrations/pi/session-ui/clipboard-image.d.ts +2 -2
  20. package/dist/integrations/pi/session-ui/clipboard-image.js +13 -4
  21. package/dist/integrations/pi/session-ui/image-preparation-client.d.ts +20 -0
  22. package/dist/integrations/pi/session-ui/image-preparation-client.js +145 -0
  23. package/dist/integrations/pi/session-ui/image-preparation.d.ts +18 -0
  24. package/dist/integrations/pi/session-ui/image-preparation.js +126 -0
  25. package/dist/integrations/pi/session-ui/image-source.d.ts +13 -0
  26. package/dist/integrations/pi/session-ui/image-source.js +171 -0
  27. package/dist/integrations/pi/session-ui/image-worker.d.ts +17 -0
  28. package/dist/integrations/pi/session-ui/image-worker.js +23 -0
  29. package/dist/integrations/pi/session-ui/prompt-chips.d.ts +11 -2
  30. package/dist/integrations/pi/session-ui/prompt-chips.js +114 -4
  31. package/dist/integrations/pi/session-ui/session-shell-root.d.ts +8 -3
  32. package/dist/integrations/pi/session-ui/session-shell-root.js +27 -2
  33. package/dist/integrations/pi/session-ui/session-shell.js +179 -52
  34. package/dist/integrations/pi/session-ui/session-viewport-controller.js +17 -7
  35. package/dist/integrations/pi/session-ui/system-clipboard.d.ts +2 -2
  36. package/dist/integrations/pi/session-ui/system-clipboard.js +25 -14
  37. package/dist/integrations/pi/tui-runtime/adapter.js +13 -2
  38. package/dist/native/darwin-arm64/manifest.json +1 -1
  39. package/dist/native/linux-x64/manifest.json +3 -3
  40. package/dist/native/linux-x64/process-guardian +0 -0
  41. package/dist/native/win32-x64/manifest.json +2 -2
  42. package/dist/native/win32-x64/process-guardian.exe +0 -0
  43. package/dist/runtime-payload-inventory.json +22 -18
  44. package/docs/architecture/boundaries.md +2 -1
  45. package/package.json +2 -1
@@ -159,8 +159,16 @@ export class SessionViewportController {
159
159
  this.#requestHyperlinkCleanup();
160
160
  this.#requestRender(true);
161
161
  }
162
- if (this.#viewport.frame === null)
163
- return { data, consumed: false };
162
+ if (this.#viewport.frame === null) {
163
+ // Invariant: a not-yet-painted A1 screen is not Pi's selection surface.
164
+ return routeMouseInput(data, event => {
165
+ if (event.kind === "press" && event.button === 0)
166
+ this.#tailPointerSuppressed = true;
167
+ if (event.kind === "release")
168
+ this.#tailPointerSuppressed = false;
169
+ return event.kind === "motion" || event.kind === "release" || (event.kind === "press" && event.button === 0);
170
+ });
171
+ }
164
172
  if (data === "\u0003") {
165
173
  if (this.#editor.hasSelection()) {
166
174
  if (this.#viewport.clearSelection())
@@ -287,6 +295,8 @@ export class SessionViewportController {
287
295
  }
288
296
  if (event.button !== 0)
289
297
  return false;
298
+ this.#dockPointerSuppressed = false;
299
+ this.#tailPointerSuppressed = false;
290
300
  this.#stopSelectionAutoScroll();
291
301
  if (this.#viewport.clearSelection())
292
302
  repaint = true;
@@ -335,16 +345,16 @@ export class SessionViewportController {
335
345
  }
336
346
  if (event.row >= 1 && event.row <= hits.viewportHeight && event.column <= frame.contentWidth) {
337
347
  if (!this.#viewport.pressSelection(event.column, event.row, now)) {
338
- // Invariant: a full drag begun on transient tail rows cannot become transcript selection.
339
- if (hits.transientTail.includes(event.row))
340
- this.#tailPointerSuppressed = true;
348
+ // Invariant: empty rows and transient tail rows must never start Pi selection.
349
+ this.#tailPointerSuppressed = true;
341
350
  repaint = true;
342
- return this.#tailPointerSuppressed;
351
+ return true;
343
352
  }
344
353
  repaint = true;
345
354
  return true;
346
355
  }
347
- return false;
356
+ this.#tailPointerSuppressed = true;
357
+ return true;
348
358
  }
349
359
  if (event.kind === "release") {
350
360
  if (this.#editor.ownsPointer() && this.#editorPointerFrame !== undefined) {
@@ -11,10 +11,10 @@ export declare function preloadSystemClipboard(): void;
11
11
  * private clipboard module. Failures are deliberately non-fatal: a denied or
12
12
  * unavailable clipboard simply makes the paste action a no-op.
13
13
  */
14
- export declare function readSystemClipboardContent(): Promise<PiShellClipboardContent | null>;
14
+ export declare function readSystemClipboardContent(signal?: AbortSignal): Promise<PiShellClipboardContent | null>;
15
15
  export declare function readSystemClipboardImage(reader: SystemClipboardImageReader): Promise<{
16
16
  readonly data: string;
17
17
  readonly mimeType: string;
18
18
  } | null>;
19
- export declare function readSystemClipboardText(): Promise<string | null>;
19
+ export declare function readSystemClipboardText(signal?: AbortSignal): Promise<string | null>;
20
20
  export declare function writeSystemClipboardText(text: string): Promise<void>;
@@ -1,5 +1,7 @@
1
1
  import { execFile } from "node:child_process";
2
2
  import { canonicalizeClipboardImage } from "./clipboard-image.js";
3
+ import { ImageAttachmentError } from "../../../contracts/owned-ui/index.js";
4
+ import { assertSourceBytes } from "./image-source.js";
3
5
  const MAX_CLIPBOARD_BYTES = 16 * 1024 * 1024;
4
6
  let nativeClipboardPromise;
5
7
  let pendingClipboardWrite = Promise.resolve();
@@ -13,13 +15,13 @@ export function preloadSystemClipboard() {
13
15
  * private clipboard module. Failures are deliberately non-fatal: a denied or
14
16
  * unavailable clipboard simply makes the paste action a no-op.
15
17
  */
16
- export async function readSystemClipboardContent() {
18
+ export async function readSystemClipboardContent(signal) {
17
19
  await pendingClipboardWrite;
18
20
  const native = await nativeClipboard();
19
21
  if (native !== null) {
20
22
  try {
21
23
  if (process.platform === "win32" && native.availableFormats().some(isFileDropFormat)) {
22
- const files = await readSystemClipboardText();
24
+ const files = await readSystemClipboardText(signal);
23
25
  if (files !== null)
24
26
  return { kind: "text", text: files };
25
27
  }
@@ -27,11 +29,13 @@ export async function readSystemClipboardContent() {
27
29
  if (image !== null)
28
30
  return { kind: "image", ...image };
29
31
  }
30
- catch {
32
+ catch (error) {
33
+ if (error instanceof ImageAttachmentError)
34
+ throw error;
31
35
  // Compatibility: fall through to text and platform readers.
32
36
  }
33
37
  }
34
- const text = await readSystemClipboardText();
38
+ const text = await readSystemClipboardText(signal);
35
39
  return text === null ? null : { kind: "text", text };
36
40
  }
37
41
  export async function readSystemClipboardImage(reader) {
@@ -40,14 +44,18 @@ export async function readSystemClipboardImage(reader) {
40
44
  if (reader.getImageBinary !== undefined) {
41
45
  try {
42
46
  const bytes = await reader.getImageBinary();
47
+ if (bytes.length > 0)
48
+ assertSourceBytes(bytes.length);
43
49
  if (bytes.length > 0 && bytes.every(byte => Number.isInteger(byte) && byte >= 0 && byte <= 255)) {
44
50
  return canonicalizeClipboardImage({
45
51
  data: Buffer.from(bytes).toString("base64"),
46
52
  mimeType: "image/png",
47
- });
53
+ }, true);
48
54
  }
49
55
  }
50
- catch {
56
+ catch (error) {
57
+ if (error instanceof ImageAttachmentError)
58
+ throw error;
51
59
  // Compatibility: older or partially available native bindings may still expose base64.
52
60
  }
53
61
  }
@@ -56,15 +64,17 @@ export async function readSystemClipboardImage(reader) {
56
64
  return canonicalizeClipboardImage({
57
65
  data: await reader.getImageBase64(),
58
66
  mimeType: "image/png",
59
- });
67
+ }, true);
60
68
  }
61
- catch {
69
+ catch (error) {
70
+ if (error instanceof ImageAttachmentError)
71
+ throw error;
62
72
  // Compatibility: fall through to the caller's text path.
63
73
  }
64
74
  }
65
75
  return null;
66
76
  }
67
- export async function readSystemClipboardText() {
77
+ export async function readSystemClipboardText(signal) {
68
78
  // Concurrency: Ctrl+C/Ctrl+X and Ctrl+V can arrive in adjacent input turns. Serialize the
69
79
  // read behind our native write so paste never observes the previous value.
70
80
  await pendingClipboardWrite;
@@ -87,12 +97,12 @@ export async function readSystemClipboardText() {
87
97
  "$t=Get-Clipboard -Raw -ErrorAction SilentlyContinue",
88
98
  "if ($null -ne $t -and $t.Length -gt 0) {[Console]::Out.Write($t)} else {$f=Get-Clipboard -Format FileDropList -ErrorAction SilentlyContinue; if ($f) {[Console]::Out.Write(($f | ForEach-Object {$_.FullName}) -join [Environment]::NewLine)}}",
89
99
  ].join("; ");
90
- return execClipboard("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", script]);
100
+ return execClipboard("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", script], signal);
91
101
  }
92
102
  if (process.platform === "darwin")
93
- return execClipboard("pbpaste", []);
94
- return (await execClipboard("wl-paste", ["--no-newline", "--type", "text"]))
95
- ?? execClipboard("xclip", ["-selection", "clipboard", "-o"]);
103
+ return execClipboard("pbpaste", [], signal);
104
+ return (await execClipboard("wl-paste", ["--no-newline", "--type", "text"], signal))
105
+ ?? execClipboard("xclip", ["-selection", "clipboard", "-o"], signal);
96
106
  }
97
107
  export function writeSystemClipboardText(text) {
98
108
  const write = async () => {
@@ -118,13 +128,14 @@ function nativeClipboard() {
118
128
  function isFileDropFormat(format) {
119
129
  return /(?:filedrop|hdrop|shell idlist)/iu.test(format);
120
130
  }
121
- function execClipboard(command, args) {
131
+ function execClipboard(command, args, signal) {
122
132
  return new Promise(resolve => {
123
133
  execFile(command, args, {
124
134
  encoding: "utf8",
125
135
  maxBuffer: MAX_CLIPBOARD_BYTES,
126
136
  timeout: 5_000,
127
137
  windowsHide: true,
138
+ ...(signal === undefined ? {} : { signal }),
128
139
  }, (error, stdout) => resolve(error || stdout.length === 0 ? null : stdout));
129
140
  });
130
141
  }
@@ -1,4 +1,5 @@
1
1
  import { HStack, ProcessTerminal, ScrollView, TuiAltScreen, TuiMainScreen, VStack, visibleWidth, } from "#pi-tui";
2
+ import { boundedCleanup, EMERGENCY_TERMINAL_RESET } from "../../../foundation/terminal-cleanup/index.js";
2
3
  import { InputPresentationCoordinator, } from "./input-presentation-coordinator.js";
3
4
  /** Identifies the Pi TUI lifecycle stage that failed while preserving the original cause. */
4
5
  export class PiTuiRuntimeError extends Error {
@@ -402,11 +403,16 @@ export class PiTuiRuntimeAdapter {
402
403
  }
403
404
  async #stop(options) {
404
405
  this.#state = "stopping";
405
- this.#inputCoordinator?.flush();
406
406
  let failure;
407
+ try {
408
+ this.#inputCoordinator?.dispose(false);
409
+ }
410
+ catch (error) {
411
+ failure = new PiTuiRuntimeError("restoration", error);
412
+ }
407
413
  if (options.drainInput !== false) {
408
414
  try {
409
- await this.#terminal.drainInput(options.drainMaxMs, options.drainIdleMs);
415
+ await boundedCleanup(() => this.#terminal.drainInput(options.drainMaxMs, options.drainIdleMs));
410
416
  }
411
417
  catch (error) {
412
418
  failure = new PiTuiRuntimeError("input-drain", error);
@@ -559,6 +565,11 @@ export class PiTuiRuntimeAdapter {
559
565
  }
560
566
  #bestEffortTerminalRestore() {
561
567
  this.#clearTerminalProgress();
568
+ try {
569
+ if (this.mode === "fullscreen")
570
+ this.#terminal.write(EMERGENCY_TERMINAL_RESET);
571
+ }
572
+ catch { }
562
573
  try {
563
574
  this.#terminal.showCursor();
564
575
  }
@@ -5,7 +5,7 @@
5
5
  "platform": "darwin",
6
6
  "architecture": "arm64",
7
7
  "capability": "supported",
8
- "builtAt": "2026-09-08T08:10:40.090Z",
8
+ "builtAt": "2026-09-10T06:03:25.250Z",
9
9
  "artifact": {
10
10
  "filename": "process-guardian",
11
11
  "sha256": "dc03605e5780e2aeebb4ecafd62868dc673e22ddd38b024a369aff704ff136dc",
@@ -5,11 +5,11 @@
5
5
  "platform": "linux",
6
6
  "architecture": "x64",
7
7
  "capability": "supported",
8
- "builtAt": "2026-09-08T08:10:24.232Z",
8
+ "builtAt": "2026-09-10T06:03:35.868Z",
9
9
  "artifact": {
10
10
  "filename": "process-guardian",
11
- "sha256": "ee8a00eaaf79c707459bbbfb52518e9739314967049fbe5fa625f36ce33db9ee",
12
- "size": 414568
11
+ "sha256": "d8cda6b0c7cb36c0cc41e90802aceebf6c02eaebbc08a83d7d963d2e918dbd7a",
12
+ "size": 414536
13
13
  },
14
14
  "provenance": {
15
15
  "language": "Rust",
@@ -5,10 +5,10 @@
5
5
  "platform": "win32",
6
6
  "architecture": "x64",
7
7
  "capability": "supported",
8
- "builtAt": "2026-09-08T08:11:13.440Z",
8
+ "builtAt": "2026-09-10T06:04:05.737Z",
9
9
  "artifact": {
10
10
  "filename": "process-guardian.exe",
11
- "sha256": "b6daac4921fa900e544d9db45f85177267934415ecdf2935c2d6d1ae8bc59b0a",
11
+ "sha256": "d46f6641ceb7ef4fe2ab74d123f639f9ca6d5192a595d0660536ebc1e2237533",
12
12
  "size": 177664
13
13
  },
14
14
  "provenance": {
@@ -171,9 +171,6 @@
171
171
  "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/pool/package.json",
172
172
  "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/utf8/LICENSE",
173
173
  "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/utf8/package.json",
174
- "node_modules/@earendil-works/pi-coding-agent/node_modules/@silvia-odwyer/photon-node/LICENSE.md",
175
- "node_modules/@earendil-works/pi-coding-agent/node_modules/@silvia-odwyer/photon-node/package.json",
176
- "node_modules/@earendil-works/pi-coding-agent/node_modules/@silvia-odwyer/photon-node/photon_rs_bg.wasm",
177
174
  "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/core/LICENSE",
178
175
  "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/core/package.json",
179
176
  "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/credential-provider-imds/LICENSE",
@@ -495,6 +492,9 @@
495
492
  "node_modules/@mariozechner/clipboard-win32-x64-msvc/clipboard.win32-x64-msvc.node",
496
493
  "node_modules/@mariozechner/clipboard-win32-x64-msvc/package.json",
497
494
  "node_modules/@mariozechner/clipboard/package.json",
495
+ "node_modules/@silvia-odwyer/photon-node/LICENSE.md",
496
+ "node_modules/@silvia-odwyer/photon-node/package.json",
497
+ "node_modules/@silvia-odwyer/photon-node/photon_rs_bg.wasm",
498
498
  "node_modules/chalk/license",
499
499
  "node_modules/chalk/package.json",
500
500
  "node_modules/cross-spawn/LICENSE",
@@ -2693,12 +2693,6 @@
2693
2693
  "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/utf8/tests/data/surrogate_pair_bug.txt",
2694
2694
  "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/utf8/tests/data/utf8.txt",
2695
2695
  "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/utf8/tests/index.js",
2696
- "node_modules/@earendil-works/pi-coding-agent/node_modules/@silvia-odwyer/photon-node/LICENSE.md",
2697
- "node_modules/@earendil-works/pi-coding-agent/node_modules/@silvia-odwyer/photon-node/README.md",
2698
- "node_modules/@earendil-works/pi-coding-agent/node_modules/@silvia-odwyer/photon-node/package.json",
2699
- "node_modules/@earendil-works/pi-coding-agent/node_modules/@silvia-odwyer/photon-node/photon_rs.js",
2700
- "node_modules/@earendil-works/pi-coding-agent/node_modules/@silvia-odwyer/photon-node/photon_rs_bg.js",
2701
- "node_modules/@earendil-works/pi-coding-agent/node_modules/@silvia-odwyer/photon-node/photon_rs_bg.wasm",
2702
2696
  "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/core/LICENSE",
2703
2697
  "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/core/README.md",
2704
2698
  "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/core/cbor.js",
@@ -6455,6 +6449,11 @@
6455
6449
  "node_modules/@mariozechner/clipboard/src/clipboard_rs/platform/win.rs",
6456
6450
  "node_modules/@mariozechner/clipboard/src/clipboard_rs/platform/x11.rs",
6457
6451
  "node_modules/@mariozechner/clipboard/src/lib.rs",
6452
+ "node_modules/@silvia-odwyer/photon-node/LICENSE.md",
6453
+ "node_modules/@silvia-odwyer/photon-node/README.md",
6454
+ "node_modules/@silvia-odwyer/photon-node/package.json",
6455
+ "node_modules/@silvia-odwyer/photon-node/photon_rs.js",
6456
+ "node_modules/@silvia-odwyer/photon-node/photon_rs_bg.wasm",
6458
6457
  "node_modules/chalk/license",
6459
6458
  "node_modules/chalk/package.json",
6460
6459
  "node_modules/chalk/readme.md",
@@ -43342,7 +43341,8 @@
43342
43341
  "packageName": "@silvia-odwyer/photon-node",
43343
43342
  "packageVersion": "0.3.4",
43344
43343
  "packagePath": "photon_rs_bg.js",
43345
- "disposition": "include"
43344
+ "disposition": "exclude",
43345
+ "reason": "unreachable-development"
43346
43346
  },
43347
43347
  {
43348
43348
  "packageName": "@silvia-odwyer/photon-node",
@@ -93110,10 +93110,10 @@
93110
93110
  ],
93111
93111
  "inventory": {
93112
93112
  "schema": "a1-runtime-payload-v1",
93113
- "includedFiles": 6209,
93114
- "includedBytes": 44433595,
93115
- "excludedFiles": 7302,
93116
- "excludedBytes": 55378954,
93113
+ "includedFiles": 6208,
93114
+ "includedBytes": 44309189,
93115
+ "excludedFiles": 7303,
93116
+ "excludedBytes": 55503360,
93117
93117
  "uncertaintyRetainedFiles": 1082,
93118
93118
  "exclusions": [
93119
93119
  {
@@ -106564,10 +106564,6 @@
106564
106564
  "path": "node_modules/@earendil-works/pi-coding-agent/node_modules/@protobufjs/utf8/index.d.ts",
106565
106565
  "reason": "type-declaration"
106566
106566
  },
106567
- {
106568
- "path": "node_modules/@earendil-works/pi-coding-agent/node_modules/@silvia-odwyer/photon-node/photon_rs.d.ts",
106569
- "reason": "type-declaration"
106570
- },
106571
106567
  {
106572
106568
  "path": "node_modules/@earendil-works/pi-coding-agent/node_modules/@smithy/core/cbor.d.ts",
106573
106569
  "reason": "type-declaration"
@@ -121836,6 +121832,14 @@
121836
121832
  "path": "node_modules/@mariozechner/clipboard/index.d.ts",
121837
121833
  "reason": "type-declaration"
121838
121834
  },
121835
+ {
121836
+ "path": "node_modules/@silvia-odwyer/photon-node/photon_rs.d.ts",
121837
+ "reason": "type-declaration"
121838
+ },
121839
+ {
121840
+ "path": "node_modules/@silvia-odwyer/photon-node/photon_rs_bg.js",
121841
+ "reason": "unreachable-development"
121842
+ },
121839
121843
  {
121840
121844
  "path": "node_modules/chalk/source/index.d.ts",
121841
121845
  "reason": "type-declaration"
@@ -31,7 +31,8 @@ The owned Pi-backed surface is not an arbitrary-CLI terminal multiplexer. A feat
31
31
  - `storage`: SQLite migrations, prior-boot reconciliation, and plural launch-instance persistence. Legacy foreground rows are historical migration input and never authorize current ownership.
32
32
  - `supervisor`: endpoint identity, plural cohort ownership, per-instance reconciliation, and aggregate release shutdown coordination. It owns no terminal surface.
33
33
  - `pi-engine-adapter`, `pi-component-adapter`, `pi-tui-runtime-adapter`, and `pi-session-ui-integration`: isolate pinned Pi engine and presentation knowledge behind neutral contracts; product features do not import them directly. The session UI render root assembles semantic document and dock rows, while its focused viewport controller owns follow state, pointer routing, selection, and interaction timers. Owned-app route lifecycle belongs to the neutral `ui-apps` owner and is only hosted by the Pi session UI.
34
- - release/update/bootstrap: package-derived immutable release identity, process-guardian integrity, cohort selection, durable update transactions, rollback, and dependency-light command entry.
34
+ - release/update/bootstrap: package-derived immutable release identity, process-guardian integrity, cohort selection, durable update transactions, rollback, and dependency-light command entry. After an unsuccessful bare-A1 child exit, the bootstrap restores owned terminal modes; neither guardian emits terminal controls.
35
+ - `terminal-cleanup`: bounded, idempotent emergency restoration and fatal-exit diagnostics for an explicitly owned terminal. It does not inspect commands, relay terminal input/output, or emulate terminal state. The owned UI installs its fatal boundary before terminal activation; packaged bootstrap and checkout launch provide the surviving-owner fallback. Fatal records retain at most ten 16 KiB records with trusted classifications and code locations, never prompts, attachments, raw input, credentials, or arbitrary exception messages.
35
36
 
36
37
  ## Dependency direction
37
38
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@timurproko/a1",
3
- "version": "0.1.8-dev.282",
3
+ "version": "0.1.8-dev.289",
4
4
  "description": "Standalone terminal workspace for supervised native and managed agents",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.13.0",
@@ -62,6 +62,7 @@
62
62
  "dependencies": {
63
63
  "@earendil-works/pi-coding-agent": "0.84.2",
64
64
  "@earendil-works/pi-tui": "0.84.2",
65
+ "@silvia-odwyer/photon-node": "0.3.4",
65
66
  "chalk": "5.6.2",
66
67
  "cross-spawn": "7.0.6",
67
68
  "grok-mermaid": "0.2.2",