@geohar/un-bien 0.7.0 → 0.9.0

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 (89) hide show
  1. package/README.md +237 -268
  2. package/dist/bin/launcher.js +38 -0
  3. package/dist/bin/launcher.js.map +1 -0
  4. package/dist/config.d.ts +41 -1
  5. package/dist/config.js.map +1 -1
  6. package/dist/daemon/install.d.ts +33 -35
  7. package/dist/daemon/install.js +43 -73
  8. package/dist/daemon/install.js.map +1 -1
  9. package/dist/enrich_tool_args.d.ts +9 -0
  10. package/dist/enrich_tool_args.js +171 -0
  11. package/dist/enrich_tool_args.js.map +1 -0
  12. package/dist/image_codec.d.ts +22 -0
  13. package/dist/image_codec.js +149 -0
  14. package/dist/image_codec.js.map +1 -0
  15. package/dist/index.d.ts +0 -26
  16. package/dist/index.js +235 -1237
  17. package/dist/index.js.map +1 -1
  18. package/dist/launch.d.ts +34 -0
  19. package/dist/launch.js +171 -0
  20. package/dist/launch.js.map +1 -0
  21. package/dist/launcher/launcher.d.ts +6 -0
  22. package/dist/launcher/launcher.js +188 -0
  23. package/dist/launcher/launcher.js.map +1 -0
  24. package/dist/pairing/crypto.d.ts +4 -0
  25. package/dist/pairing/crypto.js +10 -0
  26. package/dist/pairing/crypto.js.map +1 -1
  27. package/dist/pairing/peer_trust.d.ts +20 -0
  28. package/dist/pairing/peer_trust.js +82 -0
  29. package/dist/pairing/peer_trust.js.map +1 -0
  30. package/dist/pairing/storage.d.ts +51 -26
  31. package/dist/pairing/storage.js +346 -136
  32. package/dist/pairing/storage.js.map +1 -1
  33. package/dist/panel_bridge.d.ts +3 -1
  34. package/dist/panel_bridge.js +10 -10
  35. package/dist/panel_bridge.js.map +1 -1
  36. package/dist/rooms.d.ts +16 -0
  37. package/dist/rooms.js +22 -0
  38. package/dist/rooms.js.map +1 -1
  39. package/dist/session/debug_log.js +2 -2
  40. package/dist/session/debug_log.js.map +1 -1
  41. package/dist/session/local_config.js +2 -0
  42. package/dist/session/local_config.js.map +1 -1
  43. package/dist/session/rpc_envelope.d.ts +18 -0
  44. package/dist/session/rpc_envelope.js +1 -1
  45. package/dist/session/rpc_envelope.js.map +1 -1
  46. package/dist/session/rpc_inbound.d.ts +2 -2
  47. package/dist/session/rpc_inbound.js +1 -1
  48. package/dist/session/rpc_inbound.js.map +1 -1
  49. package/dist/subagent_rooms.d.ts +49 -0
  50. package/dist/subagent_rooms.js +787 -0
  51. package/dist/subagent_rooms.js.map +1 -0
  52. package/dist/transport/peer_channel.d.ts +7 -1
  53. package/dist/transport/peer_channel.js +8 -1
  54. package/dist/transport/peer_channel.js.map +1 -1
  55. package/dist/transport/relay_client.d.ts +19 -0
  56. package/dist/transport/relay_client.js.map +1 -1
  57. package/docs/daemon.md +65 -64
  58. package/package.json +13 -11
  59. package/service-templates/launchd.plist.template +5 -5
  60. package/service-templates/systemd.service.template +2 -2
  61. package/service-templates/task-launcher.vbs.template +5 -5
  62. package/service-templates/task-scheduler.xml.template +1 -1
  63. package/dist/bin/supervisord.js +0 -86
  64. package/dist/bin/supervisord.js.map +0 -1
  65. package/dist/daemon/client.d.ts +0 -20
  66. package/dist/daemon/client.js +0 -131
  67. package/dist/daemon/client.js.map +0 -1
  68. package/dist/daemon/control_protocol.d.ts +0 -176
  69. package/dist/daemon/control_protocol.js +0 -63
  70. package/dist/daemon/control_protocol.js.map +0 -1
  71. package/dist/daemon/cron_log.d.ts +0 -45
  72. package/dist/daemon/cron_log.js +0 -71
  73. package/dist/daemon/cron_log.js.map +0 -1
  74. package/dist/daemon/cron_registry.d.ts +0 -80
  75. package/dist/daemon/cron_registry.js +0 -198
  76. package/dist/daemon/cron_registry.js.map +0 -1
  77. package/dist/daemon/id.d.ts +0 -24
  78. package/dist/daemon/id.js +0 -36
  79. package/dist/daemon/id.js.map +0 -1
  80. package/dist/daemon/registry.d.ts +0 -63
  81. package/dist/daemon/registry.js +0 -153
  82. package/dist/daemon/registry.js.map +0 -1
  83. package/dist/daemon/rpc_child.d.ts +0 -194
  84. package/dist/daemon/rpc_child.js +0 -419
  85. package/dist/daemon/rpc_child.js.map +0 -1
  86. package/dist/daemon/supervisor.d.ts +0 -93
  87. package/dist/daemon/supervisor.js +0 -666
  88. package/dist/daemon/supervisor.js.map +0 -1
  89. /package/dist/bin/{supervisord.d.ts → launcher.d.ts} +0 -0
@@ -0,0 +1,171 @@
1
+ import { resolve } from "node:path";
2
+ import { readFileSync } from "node:fs";
3
+ export function _enrichToolArgs(tool, args, cwd = process.cwd()) {
4
+ if (!args || typeof args !== "object")
5
+ return {};
6
+ const base = args;
7
+ switch (tool.toLowerCase()) {
8
+ case "edit":
9
+ return _enrichEditToolArgs(base, cwd);
10
+ default:
11
+ return base;
12
+ }
13
+ }
14
+ function _enrichEditToolArgs(base, cwd) {
15
+ const filePath = _stringArg(base, ["path", "file_path"]);
16
+ const rawEdits = base["edits"];
17
+ const edits = Array.isArray(rawEdits) ? rawEdits : [base];
18
+ const text = _readToolFile(filePath, cwd);
19
+ const hunks = [];
20
+ let searchFrom = 0;
21
+ for (const rawEdit of edits) {
22
+ if (!rawEdit || typeof rawEdit !== "object")
23
+ continue;
24
+ const edit = rawEdit;
25
+ const oldText = _stringArg(edit, [
26
+ "oldText",
27
+ "old_text",
28
+ "old_string",
29
+ "oldString",
30
+ ]);
31
+ const newText = _stringArg(edit, [
32
+ "newText",
33
+ "new_text",
34
+ "new_string",
35
+ "newString",
36
+ ]);
37
+ if (!oldText && !newText)
38
+ continue;
39
+ const matchAt = oldText && text !== null ? text.indexOf(oldText, searchFrom) : -1;
40
+ const fallbackAt = oldText && matchAt < 0 && text !== null ? text.indexOf(oldText) : matchAt;
41
+ const startOffset = fallbackAt >= 0 ? fallbackAt : searchFrom;
42
+ if (text === null)
43
+ continue;
44
+ const hunk = _buildEditHunk(text, startOffset, oldText, newText);
45
+ if (hunk.length > 0)
46
+ hunks.push({ lines: hunk });
47
+ searchFrom = startOffset + Math.max(oldText.length, 1);
48
+ }
49
+ return hunks.length === 0 ? base : { ...base, hunks };
50
+ }
51
+ function _readToolFile(filePath, cwd) {
52
+ if (!filePath)
53
+ return null;
54
+ const homePath = filePath.startsWith("~/") && process.env.HOME
55
+ ? resolve(process.env.HOME, filePath.slice(2))
56
+ : null;
57
+ const candidates = [
58
+ filePath,
59
+ resolve(cwd, filePath),
60
+ resolve(process.cwd(), filePath),
61
+ homePath,
62
+ ].filter((p) => typeof p === "string");
63
+ for (const candidate of candidates) {
64
+ try {
65
+ return readFileSync(candidate, "utf8");
66
+ }
67
+ catch {
68
+ // try next candidate
69
+ }
70
+ }
71
+ return null;
72
+ }
73
+ function _buildEditHunk(fileText, startOffset, oldText, newText) {
74
+ const context = 4;
75
+ const fileLines = fileText.split("\n");
76
+ const oldLines = _splitPreviewLines(oldText);
77
+ const newLines = _splitPreviewLines(newText);
78
+ const oldStart = _lineNumberAt(fileText, startOffset);
79
+ const newStart = oldStart;
80
+ const startIndex = oldStart - 1;
81
+ const beforeStart = Math.max(0, startIndex - context);
82
+ const afterStart = startIndex + oldLines.length;
83
+ const afterEnd = Math.min(fileLines.length, afterStart + context);
84
+ const out = [];
85
+ if (beforeStart > 0)
86
+ out.push({ kind: "ellipsis" });
87
+ for (let i = beforeStart; i < startIndex; i++) {
88
+ out.push({
89
+ kind: "context",
90
+ oldLine: i + 1,
91
+ newLine: i + 1,
92
+ text: fileLines[i] ?? "",
93
+ });
94
+ }
95
+ let commonPrefix = 0;
96
+ while (commonPrefix < oldLines.length &&
97
+ commonPrefix < newLines.length &&
98
+ oldLines[commonPrefix] === newLines[commonPrefix]) {
99
+ commonPrefix++;
100
+ }
101
+ let commonSuffix = 0;
102
+ while (commonSuffix < oldLines.length - commonPrefix &&
103
+ commonSuffix < newLines.length - commonPrefix &&
104
+ oldLines[oldLines.length - 1 - commonSuffix] ===
105
+ newLines[newLines.length - 1 - commonSuffix]) {
106
+ commonSuffix++;
107
+ }
108
+ for (let i = 0; i < commonPrefix; i++) {
109
+ out.push({
110
+ kind: "context",
111
+ oldLine: oldStart + i,
112
+ newLine: newStart + i,
113
+ text: oldLines[i] ?? "",
114
+ });
115
+ }
116
+ for (let i = commonPrefix; i < oldLines.length - commonSuffix; i++) {
117
+ out.push({
118
+ kind: "remove",
119
+ oldLine: oldStart + i,
120
+ text: oldLines[i] ?? "",
121
+ });
122
+ }
123
+ for (let i = commonPrefix; i < newLines.length - commonSuffix; i++) {
124
+ out.push({ kind: "add", newLine: newStart + i, text: newLines[i] ?? "" });
125
+ }
126
+ for (let i = oldLines.length - commonSuffix; i < oldLines.length; i++) {
127
+ const newLine = newStart + newLines.length - (oldLines.length - i);
128
+ out.push({
129
+ kind: "context",
130
+ oldLine: oldStart + i,
131
+ newLine,
132
+ text: oldLines[i] ?? "",
133
+ });
134
+ }
135
+ for (let i = afterStart; i < afterEnd; i++) {
136
+ const newLine = newStart + newLines.length + (i - afterStart);
137
+ out.push({
138
+ kind: "context",
139
+ oldLine: i + 1,
140
+ newLine,
141
+ text: fileLines[i] ?? "",
142
+ });
143
+ }
144
+ if (afterEnd < fileLines.length)
145
+ out.push({ kind: "ellipsis" });
146
+ return out;
147
+ }
148
+ function _lineNumberAt(text, offset) {
149
+ let line = 1;
150
+ for (let i = 0; i < Math.max(0, offset); i++)
151
+ if (text[i] === "\n")
152
+ line++;
153
+ return line;
154
+ }
155
+ function _splitPreviewLines(text) {
156
+ if (!text)
157
+ return [];
158
+ const lines = text.split("\n");
159
+ if (lines.length > 0 && lines[lines.length - 1] === "")
160
+ lines.pop();
161
+ return lines;
162
+ }
163
+ function _stringArg(args, keys) {
164
+ for (const key of keys) {
165
+ const value = args[key];
166
+ if (typeof value === "string")
167
+ return value;
168
+ }
169
+ return "";
170
+ }
171
+ //# sourceMappingURL=enrich_tool_args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrich_tool_args.js","sourceRoot":"","sources":["../src/enrich_tool_args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Image codec + on-disk preview paths for received images — the pure(ish)
3
+ * encode/decode/validate/path layer, split from the stateful preview-DELIVERY
4
+ * logic (queueing/broadcast) that stays in index.ts. Owns its own temp-dir
5
+ * cache. `convertToPng` normalizes any supported mime to a PNG preview.
6
+ */
7
+ export declare const RECEIVED_IMAGE_MAX_BYTES: number;
8
+ export declare const IMAGE_PREVIEW_MIME = "image/png";
9
+ export declare function _imageCacheRootDir(): string;
10
+ export declare function _imageExtension(mime: string): string | undefined;
11
+ export declare function _safeFilenameToken(value: string): string;
12
+ export declare function _safePreviewPath(dir: string, messageId: string, index: number): string;
13
+ export declare function _cleanupPreviewFile(previewPath: string): void;
14
+ export declare function _renderablePngPathFromImage(imageData: string, mime: string, previewPath: string): Promise<string | undefined>;
15
+ export declare function _decodeImagePayload(data: string, mime: string): {
16
+ ok: true;
17
+ decoded: Buffer;
18
+ size: number;
19
+ } | {
20
+ ok: false;
21
+ reason: string;
22
+ };
@@ -0,0 +1,149 @@
1
+ import { convertToPng } from "@earendil-works/pi-coding-agent";
2
+ import { chmodSync, existsSync, mkdirSync, mkdtempSync, unlinkSync, writeFileSync, } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ /**
6
+ * Image codec + on-disk preview paths for received images — the pure(ish)
7
+ * encode/decode/validate/path layer, split from the stateful preview-DELIVERY
8
+ * logic (queueing/broadcast) that stays in index.ts. Owns its own temp-dir
9
+ * cache. `convertToPng` normalizes any supported mime to a PNG preview.
10
+ */
11
+ export const RECEIVED_IMAGE_MAX_BYTES = 10 * 1024 * 1024;
12
+ export const IMAGE_PREVIEW_MIME = "image/png";
13
+ const IMAGE_CACHE_PREFIX = "pi-app-";
14
+ let _imageCacheDir;
15
+ function _isBase64Char(code) {
16
+ return ((code >= 48 && code <= 57) || // 0-9
17
+ (code >= 65 && code <= 90) || // A-Z
18
+ (code >= 97 && code <= 122) || // a-z
19
+ code === 43 || // +
20
+ code === 47); // /
21
+ }
22
+ function _isStrictBase64(data) {
23
+ if (data.length === 0 || data.length % 4 !== 0)
24
+ return false;
25
+ if (data.startsWith("="))
26
+ return false;
27
+ const padding = data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0;
28
+ for (let i = 0; i < data.length; i += 1) {
29
+ const code = data.charCodeAt(i);
30
+ if (i >= data.length - padding) {
31
+ if (code !== 61)
32
+ return false;
33
+ continue;
34
+ }
35
+ if (!_isBase64Char(code))
36
+ return false;
37
+ }
38
+ return true;
39
+ }
40
+ export function _imageCacheRootDir() {
41
+ if (_imageCacheDir) {
42
+ try {
43
+ mkdirSync(_imageCacheDir, { recursive: true, mode: 0o700 });
44
+ }
45
+ catch { }
46
+ try {
47
+ chmodSync(_imageCacheDir, 0o700);
48
+ }
49
+ catch {
50
+ /* best-effort permission hardening */
51
+ }
52
+ return _imageCacheDir;
53
+ }
54
+ const dir = mkdtempSync(join(tmpdir(), IMAGE_CACHE_PREFIX));
55
+ try {
56
+ chmodSync(dir, 0o700);
57
+ }
58
+ catch {
59
+ /* best-effort permission hardening */
60
+ }
61
+ _imageCacheDir = dir;
62
+ return dir;
63
+ }
64
+ export function _imageExtension(mime) {
65
+ if (mime === "image/jpeg")
66
+ return "jpg";
67
+ if (mime === "image/png")
68
+ return "png";
69
+ if (mime === "image/webp")
70
+ return "webp";
71
+ if (mime === "image/gif")
72
+ return "gif";
73
+ return undefined;
74
+ }
75
+ export function _safeFilenameToken(value) {
76
+ return (value
77
+ .trim()
78
+ .replace(/[^A-Za-z0-9._-]+/g, "-")
79
+ .replace(/-+/g, "-")
80
+ .replace(/^-+|-+$/g, "") || "message");
81
+ }
82
+ export function _safePreviewPath(dir, messageId, index) {
83
+ return join(dir, `${_safeFilenameToken(messageId)}-${index}.preview.png`);
84
+ }
85
+ export function _cleanupPreviewFile(previewPath) {
86
+ try {
87
+ if (existsSync(previewPath))
88
+ unlinkSync(previewPath);
89
+ }
90
+ catch {
91
+ // best effort
92
+ }
93
+ }
94
+ export async function _renderablePngPathFromImage(imageData, mime, previewPath) {
95
+ if (mime === IMAGE_PREVIEW_MIME)
96
+ return undefined;
97
+ try {
98
+ const converted = await convertToPng(imageData, mime);
99
+ if (!converted ||
100
+ converted.mimeType !== IMAGE_PREVIEW_MIME ||
101
+ !converted.data) {
102
+ return undefined;
103
+ }
104
+ const previewBytes = Buffer.from(converted.data, "base64");
105
+ if (previewBytes.length === 0 ||
106
+ previewBytes.length > RECEIVED_IMAGE_MAX_BYTES) {
107
+ return undefined;
108
+ }
109
+ try {
110
+ writeFileSync(previewPath, previewBytes, { mode: 0o600 });
111
+ try {
112
+ chmodSync(previewPath, 0o600);
113
+ }
114
+ catch {
115
+ /* best-effort permission hardening */
116
+ }
117
+ return previewPath;
118
+ }
119
+ catch {
120
+ _cleanupPreviewFile(previewPath);
121
+ }
122
+ }
123
+ catch {
124
+ _cleanupPreviewFile(previewPath);
125
+ }
126
+ return undefined;
127
+ }
128
+ export function _decodeImagePayload(data, mime) {
129
+ if (!_imageExtension(mime))
130
+ return { ok: false, reason: `unsupported mime: ${mime}` };
131
+ if (data.startsWith("data:"))
132
+ return { ok: false, reason: "data URI payloads are not supported" };
133
+ if (!_isStrictBase64(data))
134
+ return { ok: false, reason: "invalid base64 payload" };
135
+ const padding = data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0;
136
+ const estimate = (data.length / 4) * 3 - padding;
137
+ if (estimate > RECEIVED_IMAGE_MAX_BYTES) {
138
+ return { ok: false, reason: `image too large (${estimate} bytes)` };
139
+ }
140
+ const decoded = Buffer.from(data, "base64");
141
+ if (decoded.length === 0 || decoded.length > RECEIVED_IMAGE_MAX_BYTES) {
142
+ return {
143
+ ok: false,
144
+ reason: `invalid decoded image size (${decoded.length} bytes)`,
145
+ };
146
+ }
147
+ return { ok: true, decoded, size: decoded.length };
148
+ }
149
+ //# sourceMappingURL=image_codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image_codec.js","sourceRoot":"","sources":["../src/image_codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACzD,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAC9C,MAAM,kBAAkB,GAAG,SAAS,CAAC;AACrC,IAAI,cAAkC,CAAC;AAEvC,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,CACL,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,MAAM;QACpC,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,MAAM;QACpC,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,MAAM;QACrC,IAAI,KAAK,EAAE,IAAI,IAAI;QACnB,IAAI,KAAK,EAAE,CACZ,CAAC,CAAC,IAAI;AACT,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;YAC/B,IAAI,IAAI,KAAK,EAAE;gBAAE,OAAO,KAAK,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;IACzC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,IAAI,CAAC;YACH,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IACD,cAAc,GAAG,GAAG,CAAC;IACrB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IACvC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,CACL,KAAK;SACF,IAAI,EAAE;SACN,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC;SACjC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,SAAS,CACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,GAAW,EACX,SAAiB,EACjB,KAAa;IAEb,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,kBAAkB,CAAC,SAAS,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,WAAW,CAAC;YAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,SAAiB,EACjB,IAAY,EACZ,WAAmB;IAEnB,IAAI,IAAI,KAAK,kBAAkB;QAAE,OAAO,SAAS,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACtD,IACE,CAAC,SAAS;YACV,SAAS,CAAC,QAAQ,KAAK,kBAAkB;YACzC,CAAC,SAAS,CAAC,IAAI,EACf,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3D,IACE,YAAY,CAAC,MAAM,KAAK,CAAC;YACzB,YAAY,CAAC,MAAM,GAAG,wBAAwB,EAC9C,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC;YACH,aAAa,CAAC,WAAW,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC;gBACH,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,sCAAsC;YACxC,CAAC;YACD,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,IAAY;IAEZ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,IAAI,EAAE,EAAE,CAAC;IAC5D,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAC1B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC;IACtE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;IAEzD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;IACjD,IAAI,QAAQ,GAAG,wBAAwB,EAAE,CAAC;QACxC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,QAAQ,SAAS,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC;QACtE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,+BAA+B,OAAO,CAAC,MAAM,SAAS;SAC/D,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;AACrD,CAAC"}
package/dist/index.d.ts CHANGED
@@ -141,9 +141,6 @@ export declare function _handleControl(cmd: string): Promise<void>;
141
141
  * singleton semantics.
142
142
  */
143
143
  export declare function _onPeerDisconnect(appPeerId?: string): void;
144
- /** Build the argv for a detached tmux launch of `pi` in `cwd`. Args are an
145
- * ARRAY (never a shell string) so cwd/name can't inject. Exported for tests. */
146
- export declare function _buildTmuxLaunchArgs(name: string, cwd: string): string[];
147
144
  declare const extension: ExtensionFactory;
148
145
  export default extension;
149
146
  /** Test-only entry point for verifying mesh-to-agent delivery semantics. */
@@ -155,29 +152,6 @@ export declare function _routeClientMessageFrom(sender: PlainPeerChannel, msg: C
155
152
  * mirroring the pre-W2D singleton behavior.
156
153
  */
157
154
  export declare function routeClientMessage(msg: ClientMessage, ctx: Pick<ExtensionContext, "abort">): void;
158
- type ToolArgs = Record<string, unknown>;
159
- export declare function _enrichToolArgs(tool: string, args: unknown): ToolArgs;
160
- /**
161
- * `unbien restart-supervisor` — restarts the `pi-supervisord` PROCESS
162
- * (not the daemons). The supervisor is a long-running Node process with no
163
- * hot-reload, so after a `dist` rebuild the old code keeps running until the
164
- * process is restarted. The Cockpit "Restart supervisor" button shells out to
165
- * this; the OS-specific restart lives here so the app stays cross-platform.
166
- *
167
- * Restarting the supervisor re-spawns every daemon as a side effect. Exits 0
168
- * on success, non-zero on failure (the Cockpit detects failure by exit code).
169
- */
170
- /** One step of a restart sequence. `ignoreFailure` steps (e.g. `schtasks /End`
171
- * when the task isn't running) don't abort the sequence. */
172
- export interface RestartStep {
173
- cmd: string;
174
- args: string[];
175
- ignoreFailure?: boolean;
176
- }
177
- /** Pure: the OS command sequence that restarts the supervisor service, or null
178
- * when the platform isn't supported. Most platforms are 1 step; Windows is 2
179
- * (`schtasks /End` then `/Run`). Exported for tests. */
180
- export declare function _restartSupervisorCommand(platform: NodeJS.Platform, uid: number): RestartStep[] | null;
181
155
  /**
182
156
  * Read-only probe of the local UDS broker for the mesh roster, backing
183
157
  * `unbien peers`. Opens a raw connection to `sockPath`, sends a single