@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.
- package/bin/ui.js +14 -2
- package/dist/contracts/owned-ui/image-attachments.d.ts +29 -0
- package/dist/contracts/owned-ui/image-attachments.js +60 -0
- package/dist/contracts/owned-ui/index.d.ts +1 -0
- package/dist/contracts/owned-ui/index.js +1 -0
- package/dist/contracts/owned-ui/validation.js +2 -9
- package/dist/features/owned-ui/run.js +16 -1
- package/dist/foundation/release/bootstrap.js +2 -1
- package/dist/foundation/terminal-cleanup/fatal-exit.d.ts +12 -0
- package/dist/foundation/terminal-cleanup/fatal-exit.js +85 -0
- package/dist/foundation/terminal-cleanup/index.d.ts +2 -0
- package/dist/foundation/terminal-cleanup/index.js +2 -0
- package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +4 -0
- package/dist/foundation/terminal-cleanup/terminal-reset.js +40 -0
- package/dist/integrations/pi/components/owned-editor-ux.d.ts +6 -0
- package/dist/integrations/pi/components/owned-editor-ux.js +71 -0
- package/dist/integrations/pi/components/shell-editor-autocomplete.js +2 -0
- package/dist/integrations/pi/components/shell-shared-facade.d.ts +6 -1
- package/dist/integrations/pi/session-ui/clipboard-image.d.ts +2 -2
- package/dist/integrations/pi/session-ui/clipboard-image.js +13 -4
- package/dist/integrations/pi/session-ui/image-preparation-client.d.ts +20 -0
- package/dist/integrations/pi/session-ui/image-preparation-client.js +145 -0
- package/dist/integrations/pi/session-ui/image-preparation.d.ts +18 -0
- package/dist/integrations/pi/session-ui/image-preparation.js +126 -0
- package/dist/integrations/pi/session-ui/image-source.d.ts +13 -0
- package/dist/integrations/pi/session-ui/image-source.js +171 -0
- package/dist/integrations/pi/session-ui/image-worker.d.ts +17 -0
- package/dist/integrations/pi/session-ui/image-worker.js +23 -0
- package/dist/integrations/pi/session-ui/prompt-chips.d.ts +11 -2
- package/dist/integrations/pi/session-ui/prompt-chips.js +114 -4
- package/dist/integrations/pi/session-ui/session-shell-root.d.ts +8 -3
- package/dist/integrations/pi/session-ui/session-shell-root.js +27 -2
- package/dist/integrations/pi/session-ui/session-shell.js +179 -52
- package/dist/integrations/pi/session-ui/session-viewport-controller.js +17 -7
- package/dist/integrations/pi/session-ui/system-clipboard.d.ts +2 -2
- package/dist/integrations/pi/session-ui/system-clipboard.js +25 -14
- package/dist/integrations/pi/tui-runtime/adapter.js +13 -2
- package/dist/native/darwin-arm64/manifest.json +1 -1
- package/dist/native/linux-x64/manifest.json +3 -3
- package/dist/native/linux-x64/process-guardian +0 -0
- package/dist/native/win32-x64/manifest.json +2 -2
- package/dist/native/win32-x64/process-guardian.exe +0 -0
- package/dist/runtime-payload-inventory.json +22 -18
- package/docs/architecture/boundaries.md +2 -1
- 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
|
-
|
|
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:
|
|
339
|
-
|
|
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
|
|
351
|
+
return true;
|
|
343
352
|
}
|
|
344
353
|
repaint = true;
|
|
345
354
|
return true;
|
|
346
355
|
}
|
|
347
|
-
|
|
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-
|
|
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-
|
|
8
|
+
"builtAt": "2026-09-10T06:03:35.868Z",
|
|
9
9
|
"artifact": {
|
|
10
10
|
"filename": "process-guardian",
|
|
11
|
-
"sha256": "
|
|
12
|
-
"size":
|
|
11
|
+
"sha256": "d8cda6b0c7cb36c0cc41e90802aceebf6c02eaebbc08a83d7d963d2e918dbd7a",
|
|
12
|
+
"size": 414536
|
|
13
13
|
},
|
|
14
14
|
"provenance": {
|
|
15
15
|
"language": "Rust",
|
|
Binary file
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
"platform": "win32",
|
|
6
6
|
"architecture": "x64",
|
|
7
7
|
"capability": "supported",
|
|
8
|
-
"builtAt": "2026-09-
|
|
8
|
+
"builtAt": "2026-09-10T06:04:05.737Z",
|
|
9
9
|
"artifact": {
|
|
10
10
|
"filename": "process-guardian.exe",
|
|
11
|
-
"sha256": "
|
|
11
|
+
"sha256": "d46f6641ceb7ef4fe2ab74d123f639f9ca6d5192a595d0660536ebc1e2237533",
|
|
12
12
|
"size": 177664
|
|
13
13
|
},
|
|
14
14
|
"provenance": {
|
|
Binary file
|
|
@@ -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": "
|
|
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":
|
|
93114
|
-
"includedBytes":
|
|
93115
|
-
"excludedFiles":
|
|
93116
|
-
"excludedBytes":
|
|
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.
|
|
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",
|