@ai-ecoverse/slicc-agent 6.18.11 → 6.18.13
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/dist/changes/git.js +52 -0
- package/dist/changes/git.js.map +2 -2
- package/dist/changes/index.js +95 -28
- package/dist/changes/index.js.map +2 -2
- package/dist/main.js +5 -3
- package/dist/main.js.map +2 -2
- package/dist/types/changes/git.d.ts +9 -0
- package/package.json +1 -1
package/dist/changes/git.js
CHANGED
|
@@ -26,6 +26,54 @@ function parseStatus(out) {
|
|
|
26
26
|
}
|
|
27
27
|
return found;
|
|
28
28
|
}
|
|
29
|
+
const STATUS = [
|
|
30
|
+
"git",
|
|
31
|
+
"--no-optional-locks",
|
|
32
|
+
"status",
|
|
33
|
+
"--porcelain=v1",
|
|
34
|
+
"-z",
|
|
35
|
+
"--untracked-files=all",
|
|
36
|
+
"--ignore-submodules=all"
|
|
37
|
+
];
|
|
38
|
+
const BATCH_BYTES = 4 * MAX_TEXT;
|
|
39
|
+
const CHECKED = /^([0-9a-f]+) (\S+) (\d+)$/;
|
|
40
|
+
function parseCheck(out, paths) {
|
|
41
|
+
const lines = out.split("\n");
|
|
42
|
+
if (lines.length !== paths.length + 1 || lines.at(-1) !== "") return null;
|
|
43
|
+
const found = [];
|
|
44
|
+
for (const [i, path] of paths.entries()) {
|
|
45
|
+
const line = lines[i];
|
|
46
|
+
const match = CHECKED.exec(line);
|
|
47
|
+
if (match?.[2] === "blob")
|
|
48
|
+
found.push({ path, oid: match[1], size: Number(match[3]) });
|
|
49
|
+
else if (!match && !line.endsWith(" missing") && !line.endsWith(" ambiguous")) return null;
|
|
50
|
+
}
|
|
51
|
+
return found;
|
|
52
|
+
}
|
|
53
|
+
const NEWLINE = 10;
|
|
54
|
+
const HEADER = /^[0-9a-f]+ (\S+) (\d+)$/;
|
|
55
|
+
function parseBatch(bytes, count) {
|
|
56
|
+
const decoder = new TextDecoder();
|
|
57
|
+
const out = [];
|
|
58
|
+
let at = 0;
|
|
59
|
+
while (out.length < count) {
|
|
60
|
+
const end = bytes.indexOf(NEWLINE, at);
|
|
61
|
+
if (end < 0) return null;
|
|
62
|
+
const header = decoder.decode(bytes.subarray(at, end));
|
|
63
|
+
at = end + 1;
|
|
64
|
+
if (header.endsWith(" missing") || header.endsWith(" ambiguous")) {
|
|
65
|
+
out.push(null);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const match = HEADER.exec(header);
|
|
69
|
+
if (!match) return null;
|
|
70
|
+
const size = Number(match[2]);
|
|
71
|
+
if (bytes[at + size] !== NEWLINE) return null;
|
|
72
|
+
out.push(match[1] === "blob" ? bytes.slice(at, at + size) : null);
|
|
73
|
+
at += size + 1;
|
|
74
|
+
}
|
|
75
|
+
return at === bytes.length ? out : null;
|
|
76
|
+
}
|
|
29
77
|
function textOf(bytes) {
|
|
30
78
|
if (bytes.length > MAX_TEXT || bytes.includes(0)) return null;
|
|
31
79
|
try {
|
|
@@ -70,6 +118,7 @@ function failure(ran, what) {
|
|
|
70
118
|
return new Error(ran.err.trim() || ran.out.trim() || `${what} failed`);
|
|
71
119
|
}
|
|
72
120
|
export {
|
|
121
|
+
BATCH_BYTES,
|
|
73
122
|
CLONE_COMMAND,
|
|
74
123
|
MAX_FILES,
|
|
75
124
|
MAX_TEXT,
|
|
@@ -77,8 +126,11 @@ export {
|
|
|
77
126
|
NO_REPO,
|
|
78
127
|
SCAN_DEPTH,
|
|
79
128
|
SCAN_ENTRIES,
|
|
129
|
+
STATUS,
|
|
80
130
|
failure,
|
|
81
131
|
joined,
|
|
132
|
+
parseBatch,
|
|
133
|
+
parseCheck,
|
|
82
134
|
parseStatus,
|
|
83
135
|
quote,
|
|
84
136
|
relative,
|
package/dist/changes/git.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/changes/git.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Context } from '@earendil-works/chord';\nimport type { ExecutionEnv } from '@earendil-works/pi-durable/env';\n\nexport const MAX_TEXT = 1024 * 1024;\nexport const MAX_FILES = 200;\nexport const SCAN_DEPTH = 3;\nexport const SCAN_ENTRIES = 200;\nexport const CLONE_COMMAND = 'curl -fsSL https://get.sliccy.ai/slicc | sh';\nexport const NO_GIT =\n \"Changes needs git, and git isn't installed. Install it with `pnpm add -g @ai-ecoverse/wasm-git`, then run `git init` in a folder under /home. To clone from the internet, link slicc or the SLICC extension.\";\nexport const NO_REPO =\n 'Changes lists the changes in git repositories, and there are none here yet. Run `git init` in a folder under /home. To clone from the internet, link slicc or the SLICC extension.';\n\nexport type ChangeStatus = 'added' | 'modified' | 'deleted';\nexport type ChangeKind = 'tracked' | 'untracked' | 'conflict';\n\nconst UNMERGED = ['DD', 'AU', 'UD', 'UA', 'DU', 'AA', 'UU'];\n\nexport interface FileChange {\n path: string;\n repo: string;\n status: ChangeStatus;\n kind: ChangeKind;\n before: string | null;\n after: string | null;\n}\n\nexport interface ChangesView {\n unavailable: string | null;\n changes: FileChange[];\n}\n\nexport interface Pending {\n path: string;\n status: ChangeStatus;\n kind: ChangeKind;\n}\n\nexport function parseStatus(out: string): Pending[] {\n const parts = out.split('\\0');\n const found: Pending[] = [];\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i] as string;\n if (part.length < 4) continue;\n const index = part[0] as string;\n const tree = part[1] as string;\n const path = part.slice(3);\n if (index === 'R' || index === 'C') i++;\n if (UNMERGED.includes(index + tree)) found.push({ path, status: 'modified', kind: 'conflict' });\n else if (index === '?' && tree === '?')\n found.push({ path, status: 'added', kind: 'untracked' });\n else if (tree === 'D') found.push({ path, status: 'deleted', kind: 'tracked' });\n else if (tree === 'A') found.push({ path, status: 'added', kind: 'tracked' });\n else if (tree !== ' ' && tree !== '!')\n found.push({ path, status: 'modified', kind: 'tracked' });\n }\n return found;\n}\n\nexport function textOf(bytes: Uint8Array): string | null {\n if (bytes.length > MAX_TEXT || bytes.includes(0)) return null;\n try {\n return new TextDecoder('utf-8', { fatal: true }).decode(bytes);\n } catch {\n return null;\n }\n}\n\nexport function shown(text: string): string | null {\n return text.length > MAX_TEXT || text.includes('\\0') || text.includes('\uFFFD') ? null : text;\n}\n\nexport function scanned(name: string): boolean {\n return name !== 'node_modules' && !name.startsWith('.');\n}\n\nexport function within(path: string, root: string): boolean {\n return root === '/' || path === root || path.startsWith(`${root}/`);\n}\n\nexport function relative(path: string, root: string): string {\n return root === '/' ? path.slice(1) : path.slice(root.length + 1);\n}\n\nexport function joined(root: string, rel: string): string {\n return root === '/' ? `/${rel}` : `${root}/${rel}`;\n}\n\nexport type Ran = { code: number; out: string; err: string };\n\nexport const quote = (word: string): string => `'${word.replaceAll(\"'\", \"'\\\\''\")}'`;\n\nexport async function run(\n env: Pick<ExecutionEnv, 'exec'>,\n command: string | readonly string[],\n cwd: string,\n context: Context\n): Promise<Ran> {\n let out = '';\n let err = '';\n const ran = await env.exec(\n typeof command === 'string' ? command : command.map(quote).join(' '),\n {\n cwd,\n onOutput: (text, _context, info) => {\n if (info.stream === 'stdout') out += text;\n else err += text;\n },\n },\n context\n );\n return ran.ok\n ? { code: ran.value.exitCode, out, err }\n : { code: -1, out, err: ran.error.message };\n}\n\nexport function failure(ran: Ran, what: string): Error {\n return new Error(ran.err.trim() || ran.out.trim() || `${what} failed`);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { Context } from '@earendil-works/chord';\nimport type { ExecutionEnv } from '@earendil-works/pi-durable/env';\n\nexport const MAX_TEXT = 1024 * 1024;\nexport const MAX_FILES = 200;\nexport const SCAN_DEPTH = 3;\nexport const SCAN_ENTRIES = 200;\nexport const CLONE_COMMAND = 'curl -fsSL https://get.sliccy.ai/slicc | sh';\nexport const NO_GIT =\n \"Changes needs git, and git isn't installed. Install it with `pnpm add -g @ai-ecoverse/wasm-git`, then run `git init` in a folder under /home. To clone from the internet, link slicc or the SLICC extension.\";\nexport const NO_REPO =\n 'Changes lists the changes in git repositories, and there are none here yet. Run `git init` in a folder under /home. To clone from the internet, link slicc or the SLICC extension.';\n\nexport type ChangeStatus = 'added' | 'modified' | 'deleted';\nexport type ChangeKind = 'tracked' | 'untracked' | 'conflict';\n\nconst UNMERGED = ['DD', 'AU', 'UD', 'UA', 'DU', 'AA', 'UU'];\n\nexport interface FileChange {\n path: string;\n repo: string;\n status: ChangeStatus;\n kind: ChangeKind;\n before: string | null;\n after: string | null;\n}\n\nexport interface ChangesView {\n unavailable: string | null;\n changes: FileChange[];\n}\n\nexport interface Pending {\n path: string;\n status: ChangeStatus;\n kind: ChangeKind;\n}\n\nexport function parseStatus(out: string): Pending[] {\n const parts = out.split('\\0');\n const found: Pending[] = [];\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i] as string;\n if (part.length < 4) continue;\n const index = part[0] as string;\n const tree = part[1] as string;\n const path = part.slice(3);\n if (index === 'R' || index === 'C') i++;\n if (UNMERGED.includes(index + tree)) found.push({ path, status: 'modified', kind: 'conflict' });\n else if (index === '?' && tree === '?')\n found.push({ path, status: 'added', kind: 'untracked' });\n else if (tree === 'D') found.push({ path, status: 'deleted', kind: 'tracked' });\n else if (tree === 'A') found.push({ path, status: 'added', kind: 'tracked' });\n else if (tree !== ' ' && tree !== '!')\n found.push({ path, status: 'modified', kind: 'tracked' });\n }\n return found;\n}\n\nexport const STATUS = [\n 'git',\n '--no-optional-locks',\n 'status',\n '--porcelain=v1',\n '-z',\n '--untracked-files=all',\n '--ignore-submodules=all',\n];\n\nexport const BATCH_BYTES = 4 * MAX_TEXT;\n\nexport interface Stored {\n path: string;\n oid: string;\n size: number;\n}\n\nconst CHECKED = /^([0-9a-f]+) (\\S+) (\\d+)$/;\n\nexport function parseCheck(out: string, paths: readonly string[]): Stored[] | null {\n const lines = out.split('\\n');\n if (lines.length !== paths.length + 1 || lines.at(-1) !== '') return null;\n const found: Stored[] = [];\n for (const [i, path] of paths.entries()) {\n const line = lines[i] as string;\n const match = CHECKED.exec(line);\n if (match?.[2] === 'blob')\n found.push({ path, oid: match[1] as string, size: Number(match[3]) });\n else if (!match && !line.endsWith(' missing') && !line.endsWith(' ambiguous')) return null;\n }\n return found;\n}\n\nconst NEWLINE = 10;\nconst HEADER = /^[0-9a-f]+ (\\S+) (\\d+)$/;\n\nexport function parseBatch(bytes: Uint8Array, count: number): (Uint8Array | null)[] | null {\n const decoder = new TextDecoder();\n const out: (Uint8Array | null)[] = [];\n let at = 0;\n while (out.length < count) {\n const end = bytes.indexOf(NEWLINE, at);\n if (end < 0) return null;\n const header = decoder.decode(bytes.subarray(at, end));\n at = end + 1;\n if (header.endsWith(' missing') || header.endsWith(' ambiguous')) {\n out.push(null);\n continue;\n }\n const match = HEADER.exec(header);\n if (!match) return null;\n const size = Number(match[2]);\n if (bytes[at + size] !== NEWLINE) return null;\n out.push(match[1] === 'blob' ? bytes.slice(at, at + size) : null);\n at += size + 1;\n }\n return at === bytes.length ? out : null;\n}\n\nexport function textOf(bytes: Uint8Array): string | null {\n if (bytes.length > MAX_TEXT || bytes.includes(0)) return null;\n try {\n return new TextDecoder('utf-8', { fatal: true }).decode(bytes);\n } catch {\n return null;\n }\n}\n\nexport function shown(text: string): string | null {\n return text.length > MAX_TEXT || text.includes('\\0') || text.includes('\uFFFD') ? null : text;\n}\n\nexport function scanned(name: string): boolean {\n return name !== 'node_modules' && !name.startsWith('.');\n}\n\nexport function within(path: string, root: string): boolean {\n return root === '/' || path === root || path.startsWith(`${root}/`);\n}\n\nexport function relative(path: string, root: string): string {\n return root === '/' ? path.slice(1) : path.slice(root.length + 1);\n}\n\nexport function joined(root: string, rel: string): string {\n return root === '/' ? `/${rel}` : `${root}/${rel}`;\n}\n\nexport type Ran = { code: number; out: string; err: string };\n\nexport const quote = (word: string): string => `'${word.replaceAll(\"'\", \"'\\\\''\")}'`;\n\nexport async function run(\n env: Pick<ExecutionEnv, 'exec'>,\n command: string | readonly string[],\n cwd: string,\n context: Context\n): Promise<Ran> {\n let out = '';\n let err = '';\n const ran = await env.exec(\n typeof command === 'string' ? command : command.map(quote).join(' '),\n {\n cwd,\n onOutput: (text, _context, info) => {\n if (info.stream === 'stdout') out += text;\n else err += text;\n },\n },\n context\n );\n return ran.ok\n ? { code: ran.value.exitCode, out, err }\n : { code: -1, out, err: ran.error.message };\n}\n\nexport function failure(ran: Ran, what: string): Error {\n return new Error(ran.err.trim() || ran.out.trim() || `${what} failed`);\n}\n"],
|
|
5
|
+
"mappings": "AAGO,MAAM,WAAW,OAAO;AACxB,MAAM,YAAY;AAClB,MAAM,aAAa;AACnB,MAAM,eAAe;AACrB,MAAM,gBAAgB;AACtB,MAAM,SACX;AACK,MAAM,UACX;AAKF,MAAM,WAAW,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAsBnD,SAAS,YAAY,KAAwB;AAClD,QAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,QAAM,QAAmB,CAAC;AAC1B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,KAAK,SAAS,EAAG;AACrB,UAAM,QAAQ,KAAK,CAAC;AACpB,UAAM,OAAO,KAAK,CAAC;AACnB,UAAM,OAAO,KAAK,MAAM,CAAC;AACzB,QAAI,UAAU,OAAO,UAAU,IAAK;AACpC,QAAI,SAAS,SAAS,QAAQ,IAAI,EAAG,OAAM,KAAK,EAAE,MAAM,QAAQ,YAAY,MAAM,WAAW,CAAC;AAAA,aACrF,UAAU,OAAO,SAAS;AACjC,YAAM,KAAK,EAAE,MAAM,QAAQ,SAAS,MAAM,YAAY,CAAC;AAAA,aAChD,SAAS,IAAK,OAAM,KAAK,EAAE,MAAM,QAAQ,WAAW,MAAM,UAAU,CAAC;AAAA,aACrE,SAAS,IAAK,OAAM,KAAK,EAAE,MAAM,QAAQ,SAAS,MAAM,UAAU,CAAC;AAAA,aACnE,SAAS,OAAO,SAAS;AAChC,YAAM,KAAK,EAAE,MAAM,QAAQ,YAAY,MAAM,UAAU,CAAC;AAAA,EAC5D;AACA,SAAO;AACT;AAEO,MAAM,SAAS;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,cAAc,IAAI;AAQ/B,MAAM,UAAU;AAET,SAAS,WAAW,KAAa,OAA2C;AACjF,QAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,MAAI,MAAM,WAAW,MAAM,SAAS,KAAK,MAAM,GAAG,EAAE,MAAM,GAAI,QAAO;AACrE,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,GAAG,IAAI,KAAK,MAAM,QAAQ,GAAG;AACvC,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,QAAQ,QAAQ,KAAK,IAAI;AAC/B,QAAI,QAAQ,CAAC,MAAM;AACjB,YAAM,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,GAAa,MAAM,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC;AAAA,aAC7D,CAAC,SAAS,CAAC,KAAK,SAAS,UAAU,KAAK,CAAC,KAAK,SAAS,YAAY,EAAG,QAAO;AAAA,EACxF;AACA,SAAO;AACT;AAEA,MAAM,UAAU;AAChB,MAAM,SAAS;AAER,SAAS,WAAW,OAAmB,OAA6C;AACzF,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,MAA6B,CAAC;AACpC,MAAI,KAAK;AACT,SAAO,IAAI,SAAS,OAAO;AACzB,UAAM,MAAM,MAAM,QAAQ,SAAS,EAAE;AACrC,QAAI,MAAM,EAAG,QAAO;AACpB,UAAM,SAAS,QAAQ,OAAO,MAAM,SAAS,IAAI,GAAG,CAAC;AACrD,SAAK,MAAM;AACX,QAAI,OAAO,SAAS,UAAU,KAAK,OAAO,SAAS,YAAY,GAAG;AAChE,UAAI,KAAK,IAAI;AACb;AAAA,IACF;AACA,UAAM,QAAQ,OAAO,KAAK,MAAM;AAChC,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,OAAO,OAAO,MAAM,CAAC,CAAC;AAC5B,QAAI,MAAM,KAAK,IAAI,MAAM,QAAS,QAAO;AACzC,QAAI,KAAK,MAAM,CAAC,MAAM,SAAS,MAAM,MAAM,IAAI,KAAK,IAAI,IAAI,IAAI;AAChE,UAAM,OAAO;AAAA,EACf;AACA,SAAO,OAAO,MAAM,SAAS,MAAM;AACrC;AAEO,SAAS,OAAO,OAAkC;AACvD,MAAI,MAAM,SAAS,YAAY,MAAM,SAAS,CAAC,EAAG,QAAO;AACzD,MAAI;AACF,WAAO,IAAI,YAAY,SAAS,EAAE,OAAO,KAAK,CAAC,EAAE,OAAO,KAAK;AAAA,EAC/D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,MAAM,MAA6B;AACjD,SAAO,KAAK,SAAS,YAAY,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,QAAG,IAAI,OAAO;AACtF;AAEO,SAAS,QAAQ,MAAuB;AAC7C,SAAO,SAAS,kBAAkB,CAAC,KAAK,WAAW,GAAG;AACxD;AAEO,SAAS,OAAO,MAAc,MAAuB;AAC1D,SAAO,SAAS,OAAO,SAAS,QAAQ,KAAK,WAAW,GAAG,IAAI,GAAG;AACpE;AAEO,SAAS,SAAS,MAAc,MAAsB;AAC3D,SAAO,SAAS,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,KAAK,SAAS,CAAC;AAClE;AAEO,SAAS,OAAO,MAAc,KAAqB;AACxD,SAAO,SAAS,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,IAAI,GAAG;AAClD;AAIO,MAAM,QAAQ,CAAC,SAAyB,IAAI,KAAK,WAAW,KAAK,OAAO,CAAC;AAEhF,eAAsB,IACpB,KACA,SACA,KACA,SACc;AACd,MAAI,MAAM;AACV,MAAI,MAAM;AACV,QAAM,MAAM,MAAM,IAAI;AAAA,IACpB,OAAO,YAAY,WAAW,UAAU,QAAQ,IAAI,KAAK,EAAE,KAAK,GAAG;AAAA,IACnE;AAAA,MACE;AAAA,MACA,UAAU,CAAC,MAAM,UAAU,SAAS;AAClC,YAAI,KAAK,WAAW,SAAU,QAAO;AAAA,YAChC,QAAO;AAAA,MACd;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACA,SAAO,IAAI,KACP,EAAE,MAAM,IAAI,MAAM,UAAU,KAAK,IAAI,IACrC,EAAE,MAAM,IAAI,KAAK,KAAK,IAAI,MAAM,QAAQ;AAC9C;AAEO,SAAS,QAAQ,KAAU,MAAqB;AACrD,SAAO,IAAI,MAAM,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI,SAAS;AACvE;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/changes/index.js
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import { replicatedState } from "@earendil-works/chord";
|
|
2
2
|
import { HOME } from "../kernel/env.js";
|
|
3
3
|
import {
|
|
4
|
+
BATCH_BYTES,
|
|
4
5
|
failure,
|
|
5
6
|
joined,
|
|
6
7
|
MAX_FILES,
|
|
8
|
+
MAX_TEXT,
|
|
7
9
|
NO_GIT,
|
|
8
10
|
NO_REPO,
|
|
11
|
+
parseBatch,
|
|
12
|
+
parseCheck,
|
|
9
13
|
parseStatus,
|
|
14
|
+
quote,
|
|
10
15
|
relative,
|
|
11
16
|
run,
|
|
12
17
|
SCAN_DEPTH,
|
|
13
18
|
SCAN_ENTRIES,
|
|
19
|
+
STATUS,
|
|
14
20
|
scanned,
|
|
15
21
|
shown,
|
|
16
22
|
textOf,
|
|
@@ -63,36 +69,81 @@ async function discover(options, context) {
|
|
|
63
69
|
(root) => !EXCLUDED.some((excluded) => within(root, excluded))
|
|
64
70
|
);
|
|
65
71
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const
|
|
69
|
-
|
|
72
|
+
const piped = (words, command) => `printf '%s\\n' ${words.map(quote).join(" ")} | ${command}`;
|
|
73
|
+
async function shownOne(env, repo, path, context) {
|
|
74
|
+
const ran = await run(env, ["git", "show", `:${path}`], repo, context);
|
|
75
|
+
return ran.code === 0 ? shown(ran.out) : null;
|
|
76
|
+
}
|
|
77
|
+
function chunked(items) {
|
|
78
|
+
const out = [];
|
|
79
|
+
let bytes = Infinity;
|
|
80
|
+
for (const item of items) {
|
|
81
|
+
if (bytes + item.size > BATCH_BYTES) {
|
|
82
|
+
out.push([]);
|
|
83
|
+
bytes = 0;
|
|
84
|
+
}
|
|
85
|
+
out.at(-1)?.push(item);
|
|
86
|
+
bytes += item.size;
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
async function befores(env, repo, pending, context) {
|
|
91
|
+
const paths = pending.filter((item) => item.status !== "added").map((item) => item.path);
|
|
92
|
+
const out = /* @__PURE__ */ new Map();
|
|
93
|
+
if (!paths.length) return out;
|
|
94
|
+
const listing = paths.some((path) => path.includes("\n")) ? null : await run(
|
|
95
|
+
env,
|
|
96
|
+
piped(
|
|
97
|
+
paths.map((path) => `:${path}`),
|
|
98
|
+
"git cat-file --batch-check"
|
|
99
|
+
),
|
|
100
|
+
repo,
|
|
101
|
+
context
|
|
70
102
|
);
|
|
103
|
+
const checked = listing?.code === 0 ? parseCheck(listing.out, paths) : null;
|
|
104
|
+
if (!checked) {
|
|
105
|
+
for (const path of paths) out.set(path, await shownOne(env, repo, path, context));
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
for (const path of paths) out.set(path, null);
|
|
109
|
+
const small = checked.filter((item) => item.size <= MAX_TEXT);
|
|
110
|
+
for (const chunk of chunked(small)) {
|
|
111
|
+
const batch = await run(
|
|
112
|
+
env,
|
|
113
|
+
piped(
|
|
114
|
+
chunk.map((item) => item.oid),
|
|
115
|
+
"git cat-file --batch"
|
|
116
|
+
),
|
|
117
|
+
repo,
|
|
118
|
+
context
|
|
119
|
+
);
|
|
120
|
+
const parsed = batch.code === 0 && !batch.out.includes("\uFFFD") ? parseBatch(new TextEncoder().encode(batch.out), chunk.length) : null;
|
|
121
|
+
for (const [i, item] of chunk.entries()) {
|
|
122
|
+
const bytes = parsed?.[i];
|
|
123
|
+
out.set(
|
|
124
|
+
item.path,
|
|
125
|
+
parsed ? bytes ? textOf(bytes) : null : await shownOne(env, repo, item.path, context)
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return out;
|
|
130
|
+
}
|
|
131
|
+
async function sideOf(env, repo, pending, before, context) {
|
|
132
|
+
const path = joined(repo, pending.path);
|
|
71
133
|
const read = pending.status === "deleted" ? null : await env.readBinaryFile(path, context);
|
|
72
134
|
const after = read?.ok ? textOf(read.value) : null;
|
|
73
135
|
const opaque = pending.status !== "added" && before === null || pending.status !== "deleted" && after === null;
|
|
74
136
|
return { path, before: opaque ? null : before, after: opaque ? null : after };
|
|
75
137
|
}
|
|
76
138
|
async function statusOf(env, repo, context) {
|
|
77
|
-
const ran = await run(
|
|
78
|
-
env,
|
|
79
|
-
[
|
|
80
|
-
"git",
|
|
81
|
-
"--no-optional-locks",
|
|
82
|
-
"status",
|
|
83
|
-
"--porcelain=v1",
|
|
84
|
-
"-z",
|
|
85
|
-
"--untracked-files=all",
|
|
86
|
-
"--ignore-submodules=all"
|
|
87
|
-
],
|
|
88
|
-
repo,
|
|
89
|
-
context
|
|
90
|
-
);
|
|
139
|
+
const ran = await run(env, STATUS, repo, context);
|
|
91
140
|
if (ran.code !== 0) return null;
|
|
141
|
+
const pending = parseStatus(ran.out).slice(0, MAX_FILES);
|
|
142
|
+
const before = await befores(env, repo, pending, context);
|
|
92
143
|
const out = [];
|
|
93
|
-
for (const
|
|
94
|
-
const side = await sideOf(env, repo,
|
|
95
|
-
out.push({ ...side, repo, status:
|
|
144
|
+
for (const item of pending) {
|
|
145
|
+
const side = await sideOf(env, repo, item, before.get(item.path) ?? null, context);
|
|
146
|
+
out.push({ ...side, repo, status: item.status, kind: item.kind });
|
|
96
147
|
}
|
|
97
148
|
return out.sort((a, b) => a.path.localeCompare(b.path));
|
|
98
149
|
}
|
|
@@ -126,18 +177,22 @@ function attachChanges(options) {
|
|
|
126
177
|
lock = next.catch(() => void 0);
|
|
127
178
|
return next;
|
|
128
179
|
};
|
|
180
|
+
const hasGit = async (context) => (await run(env, "command -v git", HOME, context)).code === 0;
|
|
181
|
+
const missing = (context) => {
|
|
182
|
+
repos = null;
|
|
183
|
+
view.replace(context, { unavailable: NO_GIT, changes: [] });
|
|
184
|
+
};
|
|
129
185
|
const scan = async (context) => {
|
|
130
|
-
|
|
131
|
-
if (git.code !== 0) {
|
|
132
|
-
view.replace(context, { unavailable: NO_GIT, changes: [] });
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
186
|
+
if (!repos?.length && !await hasGit(context)) return missing(context);
|
|
135
187
|
repos ??= await discover(options, context);
|
|
136
188
|
const changes = [];
|
|
137
189
|
const live = [];
|
|
190
|
+
let checked = false;
|
|
138
191
|
for (const repo of repos) {
|
|
139
192
|
const found = await statusOf(env, repo, context);
|
|
140
193
|
if (!found) {
|
|
194
|
+
if (!checked && !await hasGit(context)) return missing(context);
|
|
195
|
+
checked = true;
|
|
141
196
|
const still = await env.exists(joined(repo, ".git"), context);
|
|
142
197
|
if (!still.ok || !still.value) continue;
|
|
143
198
|
}
|
|
@@ -147,6 +202,19 @@ function attachChanges(options) {
|
|
|
147
202
|
repos = live;
|
|
148
203
|
view.replace(context, { unavailable: live.length ? null : NO_REPO, changes });
|
|
149
204
|
};
|
|
205
|
+
const pendingOf = async (path, context) => {
|
|
206
|
+
const listed = () => view.value.changes.find((item) => item.path === path);
|
|
207
|
+
if (!listed()) await scan(context);
|
|
208
|
+
const repo = listed()?.repo;
|
|
209
|
+
if (!repo) return null;
|
|
210
|
+
const rel = relative(path, repo);
|
|
211
|
+
const ran = await run(env, [...STATUS, "--", `:(literal)${rel}`], repo, context);
|
|
212
|
+
if (ran.code !== 0) throw failure(ran, `git status ${rel}`);
|
|
213
|
+
const fresh = parseStatus(ran.out).find((item) => item.path === rel);
|
|
214
|
+
if (fresh) return { path, repo, kind: fresh.kind };
|
|
215
|
+
await scan(context);
|
|
216
|
+
return null;
|
|
217
|
+
};
|
|
150
218
|
const refresh = (context) => serial(() => scan(context));
|
|
151
219
|
let running = false;
|
|
152
220
|
let again = false;
|
|
@@ -167,8 +235,7 @@ function attachChanges(options) {
|
|
|
167
235
|
timer = setTimeout(() => void kick(context), options.reloadMs);
|
|
168
236
|
};
|
|
169
237
|
const change = (path, context, act) => serial(async () => {
|
|
170
|
-
await
|
|
171
|
-
const found = view.value.changes.find((item) => item.path === path);
|
|
238
|
+
const found = await pendingOf(path, context);
|
|
172
239
|
if (!found) throw new Error(`${path} has no pending change`);
|
|
173
240
|
await act(found);
|
|
174
241
|
await scan(context);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/changes/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { type Context, type MutableReplicatedState, replicatedState } from '@earendil-works/chord';\nimport type { ExecutionEnv, FileWatcher } from '@earendil-works/pi-durable/env';\nimport type { Agents } from '../agents.ts';\nimport { HOME } from '../kernel/env.ts';\nimport {\n type ChangesView,\n type FileChange,\n failure,\n joined,\n MAX_FILES,\n NO_GIT,\n NO_REPO,\n type Pending,\n parseStatus,\n relative,\n run,\n SCAN_DEPTH,\n SCAN_ENTRIES,\n scanned,\n shown,\n textOf,\n within,\n} from './git.ts';\n\nexport interface ChangesRuntime {\n readonly view: MutableReplicatedState<ChangesView>;\n open(context: Context): Promise<void>;\n accept(path: string, context: Context): Promise<void>;\n revert(path: string, context: Context): Promise<void>;\n refresh(context: Context): Promise<void>;\n close(context: Context): Promise<void>;\n}\n\nexport const CHANGES_MS = 500;\n\nexport interface ChangesOptions {\n env: ExecutionEnv;\n agents: Agents;\n reloadMs: number;\n}\n\nconst WATCHED = [HOME, '/mnt', '/scoops'];\nconst EXCLUDED = ['/tmp', '/var/lib/slicc'];\n\ntype Env = ChangesOptions['env'];\n\nasync function walk(env: Env, dir: string, depth: number, out: Set<string>, context: Context) {\n const listed = await env.listDir(dir, context);\n if (!listed.ok) return;\n if (listed.value.some((entry) => entry.name === '.git')) {\n out.add(dir);\n return;\n }\n if (depth >= SCAN_DEPTH) return;\n const dirs = listed.value\n .filter((entry) => entry.kind === 'directory' && scanned(entry.name))\n .slice(0, SCAN_ENTRIES);\n for (const entry of dirs) await walk(env, entry.path, depth + 1, out, context);\n}\n\nasync function cwds(agents: Agents, context: Context): Promise<string[]> {\n const state = agents.state();\n const ids = [\n state.active,\n ...Object.keys(state.cones).filter((id) => id !== state.active),\n ...Object.entries(state.scoops)\n .filter(([, scoop]) => !scoop.gone && !scoop.dropped && !scoop.frozen)\n .map(([id]) => id),\n ];\n const out: string[] = [];\n for (const id of ids) {\n const conversation = await agents.conversation(id, context);\n if (conversation) out.push((await conversation.agent(context)).cwd ?? HOME);\n }\n return out;\n}\n\nasync function discover(options: ChangesOptions, context: Context): Promise<string[]> {\n const { env } = options;\n const found: string[] = [];\n for (const cwd of await cwds(options.agents, context)) {\n const top = await run(env, ['git', 'rev-parse', '--show-toplevel'], cwd, context);\n if (top.code === 0 && top.out.trim()) found.push(top.out.trim());\n }\n const walked = new Set<string>();\n await walk(env, HOME, 0, walked, context);\n const mounts = await env.listDir('/mnt', context);\n if (mounts.ok)\n for (const mount of mounts.value)\n if (mount.kind === 'directory') await walk(env, mount.path, 0, walked, context);\n const ordered = [...found, ...[...walked].sort()];\n return [...new Set(ordered)].filter(\n (root) => !EXCLUDED.some((excluded) => within(root, excluded))\n );\n}\n\nasync function sideOf(env: Env, repo: string, pending: Pending, context: Context) {\n const path = joined(repo, pending.path);\n const before =\n pending.status === 'added'\n ? null\n : await run(env, ['git', 'show', `:${pending.path}`], repo, context).then((ran) =>\n ran.code === 0 ? shown(ran.out) : null\n );\n const read = pending.status === 'deleted' ? null : await env.readBinaryFile(path, context);\n const after = read?.ok ? textOf(read.value) : null;\n const opaque =\n (pending.status !== 'added' && before === null) ||\n (pending.status !== 'deleted' && after === null);\n return { path, before: opaque ? null : before, after: opaque ? null : after };\n}\n\nasync function statusOf(env: Env, repo: string, context: Context): Promise<FileChange[] | null> {\n const ran = await run(\n env,\n [\n 'git',\n '--no-optional-locks',\n 'status',\n '--porcelain=v1',\n '-z',\n '--untracked-files=all',\n '--ignore-submodules=all',\n ],\n repo,\n context\n );\n if (ran.code !== 0) return null;\n const out: FileChange[] = [];\n for (const pending of parseStatus(ran.out).slice(0, MAX_FILES)) {\n const side = await sideOf(env, repo, pending, context);\n out.push({ ...side, repo, status: pending.status, kind: pending.kind });\n }\n return out.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nconst STATE = ['index', 'HEAD', 'refs'];\n\nfunction noise(path: string, repos: readonly string[]): boolean {\n return repos.some((repo) => {\n const git = joined(repo, '.git');\n return (\n within(path, git) &&\n path !== git &&\n !STATE.includes(relative(path, git).split('/')[0] as string)\n );\n });\n}\n\nfunction rediscovers(paths: readonly string[], repos: readonly string[]): boolean {\n return paths.some((path) => {\n const parts = path.split('/');\n const git = parts.indexOf('.git');\n if (git > 0) return !repos.includes(parts.slice(0, git).join('/') || '/');\n if (parts.some((part) => part && !scanned(part))) return false;\n return !repos.some((repo) => within(path, repo));\n });\n}\n\nexport function attachChanges(options: ChangesOptions): ChangesRuntime {\n const { env } = options;\n const view = replicatedState<ChangesView>({ unavailable: null, changes: [] });\n let repos: string[] | null = null;\n let opened: Promise<void> | null = null;\n let watcher: FileWatcher | undefined;\n let stop = () => undefined as void;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let lock: Promise<unknown> = Promise.resolve();\n const serial = <T>(work: () => Promise<T>): Promise<T> => {\n const next = lock.then(work, work);\n lock = next.catch(() => undefined);\n return next;\n };\n const scan = async (context: Context) => {\n const git = await run(env, 'command -v git', HOME, context);\n if (git.code !== 0) {\n view.replace(context, { unavailable: NO_GIT, changes: [] });\n return;\n }\n repos ??= await discover(options, context);\n const changes: FileChange[] = [];\n const live: string[] = [];\n for (const repo of repos) {\n const found = await statusOf(env, repo, context);\n if (!found) {\n const still = await env.exists(joined(repo, '.git'), context);\n if (!still.ok || !still.value) continue;\n }\n live.push(repo);\n changes.push(...(found ?? view.value.changes.filter((change) => change.repo === repo)));\n }\n repos = live;\n view.replace(context, { unavailable: live.length ? null : NO_REPO, changes });\n };\n const refresh = (context: Context) => serial(() => scan(context));\n let running = false;\n let again = false;\n const kick = async (context: Context) => {\n if (running) {\n again = true;\n return;\n }\n running = true;\n do {\n again = false;\n await refresh(context).catch(() => undefined);\n } while (again);\n running = false;\n };\n const later = (context: Context) => {\n clearTimeout(timer);\n timer = setTimeout(() => void kick(context), options.reloadMs);\n };\n const change = (path: string, context: Context, act: (found: FileChange) => Promise<void>) =>\n serial(async () => {\n await scan(context);\n const found = view.value.changes.find((item) => item.path === path);\n if (!found) throw new Error(`${path} has no pending change`);\n await act(found);\n await scan(context);\n });\n const start = async (context: Context) => {\n await refresh(context);\n const watched = await env.watch(\n WATCHED.map((path) => ({ path, recursive: true, exclude: { names: ['node_modules'] } })),\n (change) => {\n const known = repos ?? [];\n const paths = 'paths' in change ? change.paths.filter((path) => !noise(path, known)) : null;\n if (paths?.length === 0) return;\n if (!paths || rediscovers(paths, known)) repos = null;\n later(context);\n },\n context\n );\n watcher = watched.ok ? watched.value : undefined;\n stop = options.agents.onChange(() => {\n repos = null;\n later(context);\n });\n };\n return {\n view,\n open(context) {\n opened ??= start(context);\n return opened;\n },\n accept: (path, context) =>\n change(path, context, async (found) => {\n const rel = relative(found.path, found.repo);\n const ran = await run(env, ['git', 'add', '-A', '--', rel], found.repo, context);\n if (ran.code !== 0) throw failure(ran, `git add ${rel}`);\n }),\n revert: (path, context) =>\n change(path, context, async (found) => {\n const rel = relative(found.path, found.repo);\n if (found.kind === 'conflict')\n throw new Error(`${found.path} has a merge conflict; resolve it with git first.`);\n if (found.kind === 'untracked') {\n const removed = await env.remove(found.path, { force: true }, context);\n if (!removed.ok) throw removed.error;\n } else {\n const ran = await run(env, ['git', 'restore', '--', rel], found.repo, context);\n if (ran.code !== 0) throw failure(ran, `git restore ${rel}`);\n }\n }),\n refresh,\n async close(context) {\n clearTimeout(timer);\n stop();\n await watcher?.close(context);\n },\n };\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAoD,uBAAuB;AAG3E,SAAS,YAAY;AACrB;AAAA,
|
|
4
|
+
"sourcesContent": ["import { type Context, type MutableReplicatedState, replicatedState } from '@earendil-works/chord';\nimport type { ExecutionEnv, FileWatcher } from '@earendil-works/pi-durable/env';\nimport type { Agents } from '../agents.ts';\nimport { HOME } from '../kernel/env.ts';\nimport {\n BATCH_BYTES,\n type ChangesView,\n type FileChange,\n failure,\n joined,\n MAX_FILES,\n MAX_TEXT,\n NO_GIT,\n NO_REPO,\n type Pending,\n parseBatch,\n parseCheck,\n parseStatus,\n quote,\n relative,\n run,\n SCAN_DEPTH,\n SCAN_ENTRIES,\n STATUS,\n type Stored,\n scanned,\n shown,\n textOf,\n within,\n} from './git.ts';\n\nexport interface ChangesRuntime {\n readonly view: MutableReplicatedState<ChangesView>;\n open(context: Context): Promise<void>;\n accept(path: string, context: Context): Promise<void>;\n revert(path: string, context: Context): Promise<void>;\n refresh(context: Context): Promise<void>;\n close(context: Context): Promise<void>;\n}\n\nexport const CHANGES_MS = 500;\n\nexport interface ChangesOptions {\n env: ExecutionEnv;\n agents: Agents;\n reloadMs: number;\n}\n\nconst WATCHED = [HOME, '/mnt', '/scoops'];\nconst EXCLUDED = ['/tmp', '/var/lib/slicc'];\n\ntype Env = ChangesOptions['env'];\n\nasync function walk(env: Env, dir: string, depth: number, out: Set<string>, context: Context) {\n const listed = await env.listDir(dir, context);\n if (!listed.ok) return;\n if (listed.value.some((entry) => entry.name === '.git')) {\n out.add(dir);\n return;\n }\n if (depth >= SCAN_DEPTH) return;\n const dirs = listed.value\n .filter((entry) => entry.kind === 'directory' && scanned(entry.name))\n .slice(0, SCAN_ENTRIES);\n for (const entry of dirs) await walk(env, entry.path, depth + 1, out, context);\n}\n\nasync function cwds(agents: Agents, context: Context): Promise<string[]> {\n const state = agents.state();\n const ids = [\n state.active,\n ...Object.keys(state.cones).filter((id) => id !== state.active),\n ...Object.entries(state.scoops)\n .filter(([, scoop]) => !scoop.gone && !scoop.dropped && !scoop.frozen)\n .map(([id]) => id),\n ];\n const out: string[] = [];\n for (const id of ids) {\n const conversation = await agents.conversation(id, context);\n if (conversation) out.push((await conversation.agent(context)).cwd ?? HOME);\n }\n return out;\n}\n\nasync function discover(options: ChangesOptions, context: Context): Promise<string[]> {\n const { env } = options;\n const found: string[] = [];\n for (const cwd of await cwds(options.agents, context)) {\n const top = await run(env, ['git', 'rev-parse', '--show-toplevel'], cwd, context);\n if (top.code === 0 && top.out.trim()) found.push(top.out.trim());\n }\n const walked = new Set<string>();\n await walk(env, HOME, 0, walked, context);\n const mounts = await env.listDir('/mnt', context);\n if (mounts.ok)\n for (const mount of mounts.value)\n if (mount.kind === 'directory') await walk(env, mount.path, 0, walked, context);\n const ordered = [...found, ...[...walked].sort()];\n return [...new Set(ordered)].filter(\n (root) => !EXCLUDED.some((excluded) => within(root, excluded))\n );\n}\n\nconst piped = (words: readonly string[], command: string) =>\n `printf '%s\\\\n' ${words.map(quote).join(' ')} | ${command}`;\n\nasync function shownOne(env: Env, repo: string, path: string, context: Context) {\n const ran = await run(env, ['git', 'show', `:${path}`], repo, context);\n return ran.code === 0 ? shown(ran.out) : null;\n}\n\nfunction chunked(items: readonly Stored[]): Stored[][] {\n const out: Stored[][] = [];\n let bytes = Infinity;\n for (const item of items) {\n if (bytes + item.size > BATCH_BYTES) {\n out.push([]);\n bytes = 0;\n }\n out.at(-1)?.push(item);\n bytes += item.size;\n }\n return out;\n}\n\nasync function befores(\n env: Env,\n repo: string,\n pending: readonly Pending[],\n context: Context\n): Promise<Map<string, string | null>> {\n const paths = pending.filter((item) => item.status !== 'added').map((item) => item.path);\n const out = new Map<string, string | null>();\n if (!paths.length) return out;\n const listing = paths.some((path) => path.includes('\\n'))\n ? null\n : await run(\n env,\n piped(\n paths.map((path) => `:${path}`),\n 'git cat-file --batch-check'\n ),\n repo,\n context\n );\n const checked = listing?.code === 0 ? parseCheck(listing.out, paths) : null;\n if (!checked) {\n for (const path of paths) out.set(path, await shownOne(env, repo, path, context));\n return out;\n }\n for (const path of paths) out.set(path, null);\n const small = checked.filter((item) => item.size <= MAX_TEXT);\n for (const chunk of chunked(small)) {\n const batch = await run(\n env,\n piped(\n chunk.map((item) => item.oid),\n 'git cat-file --batch'\n ),\n repo,\n context\n );\n const parsed =\n batch.code === 0 && !batch.out.includes('\\uFFFD')\n ? parseBatch(new TextEncoder().encode(batch.out), chunk.length)\n : null;\n for (const [i, item] of chunk.entries()) {\n const bytes = parsed?.[i];\n out.set(\n item.path,\n parsed ? (bytes ? textOf(bytes) : null) : await shownOne(env, repo, item.path, context)\n );\n }\n }\n return out;\n}\n\nasync function sideOf(\n env: Env,\n repo: string,\n pending: Pending,\n before: string | null,\n context: Context\n) {\n const path = joined(repo, pending.path);\n const read = pending.status === 'deleted' ? null : await env.readBinaryFile(path, context);\n const after = read?.ok ? textOf(read.value) : null;\n const opaque =\n (pending.status !== 'added' && before === null) ||\n (pending.status !== 'deleted' && after === null);\n return { path, before: opaque ? null : before, after: opaque ? null : after };\n}\n\nasync function statusOf(env: Env, repo: string, context: Context): Promise<FileChange[] | null> {\n const ran = await run(env, STATUS, repo, context);\n if (ran.code !== 0) return null;\n const pending = parseStatus(ran.out).slice(0, MAX_FILES);\n const before = await befores(env, repo, pending, context);\n const out: FileChange[] = [];\n for (const item of pending) {\n const side = await sideOf(env, repo, item, before.get(item.path) ?? null, context);\n out.push({ ...side, repo, status: item.status, kind: item.kind });\n }\n return out.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nconst STATE = ['index', 'HEAD', 'refs'];\n\ntype Target = Pick<FileChange, 'path' | 'repo' | 'kind'>;\n\nfunction noise(path: string, repos: readonly string[]): boolean {\n return repos.some((repo) => {\n const git = joined(repo, '.git');\n return (\n within(path, git) &&\n path !== git &&\n !STATE.includes(relative(path, git).split('/')[0] as string)\n );\n });\n}\n\nfunction rediscovers(paths: readonly string[], repos: readonly string[]): boolean {\n return paths.some((path) => {\n const parts = path.split('/');\n const git = parts.indexOf('.git');\n if (git > 0) return !repos.includes(parts.slice(0, git).join('/') || '/');\n if (parts.some((part) => part && !scanned(part))) return false;\n return !repos.some((repo) => within(path, repo));\n });\n}\n\nexport function attachChanges(options: ChangesOptions): ChangesRuntime {\n const { env } = options;\n const view = replicatedState<ChangesView>({ unavailable: null, changes: [] });\n let repos: string[] | null = null;\n let opened: Promise<void> | null = null;\n let watcher: FileWatcher | undefined;\n let stop = () => undefined as void;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let lock: Promise<unknown> = Promise.resolve();\n const serial = <T>(work: () => Promise<T>): Promise<T> => {\n const next = lock.then(work, work);\n lock = next.catch(() => undefined);\n return next;\n };\n const hasGit = async (context: Context) =>\n (await run(env, 'command -v git', HOME, context)).code === 0;\n const missing = (context: Context) => {\n repos = null;\n view.replace(context, { unavailable: NO_GIT, changes: [] });\n };\n const scan = async (context: Context) => {\n if (!repos?.length && !(await hasGit(context))) return missing(context);\n repos ??= await discover(options, context);\n const changes: FileChange[] = [];\n const live: string[] = [];\n let checked = false;\n for (const repo of repos) {\n const found = await statusOf(env, repo, context);\n if (!found) {\n if (!checked && !(await hasGit(context))) return missing(context);\n checked = true;\n const still = await env.exists(joined(repo, '.git'), context);\n if (!still.ok || !still.value) continue;\n }\n live.push(repo);\n changes.push(...(found ?? view.value.changes.filter((change) => change.repo === repo)));\n }\n repos = live;\n view.replace(context, { unavailable: live.length ? null : NO_REPO, changes });\n };\n const pendingOf = async (path: string, context: Context): Promise<Target | null> => {\n const listed = () => view.value.changes.find((item) => item.path === path);\n if (!listed()) await scan(context);\n const repo = listed()?.repo;\n if (!repo) return null;\n const rel = relative(path, repo);\n const ran = await run(env, [...STATUS, '--', `:(literal)${rel}`], repo, context);\n if (ran.code !== 0) throw failure(ran, `git status ${rel}`);\n const fresh = parseStatus(ran.out).find((item) => item.path === rel);\n if (fresh) return { path, repo, kind: fresh.kind };\n await scan(context);\n return null;\n };\n const refresh = (context: Context) => serial(() => scan(context));\n let running = false;\n let again = false;\n const kick = async (context: Context) => {\n if (running) {\n again = true;\n return;\n }\n running = true;\n do {\n again = false;\n await refresh(context).catch(() => undefined);\n } while (again);\n running = false;\n };\n const later = (context: Context) => {\n clearTimeout(timer);\n timer = setTimeout(() => void kick(context), options.reloadMs);\n };\n const change = (path: string, context: Context, act: (found: Target) => Promise<void>) =>\n serial(async () => {\n const found = await pendingOf(path, context);\n if (!found) throw new Error(`${path} has no pending change`);\n await act(found);\n await scan(context);\n });\n const start = async (context: Context) => {\n await refresh(context);\n const watched = await env.watch(\n WATCHED.map((path) => ({ path, recursive: true, exclude: { names: ['node_modules'] } })),\n (change) => {\n const known = repos ?? [];\n const paths = 'paths' in change ? change.paths.filter((path) => !noise(path, known)) : null;\n if (paths?.length === 0) return;\n if (!paths || rediscovers(paths, known)) repos = null;\n later(context);\n },\n context\n );\n watcher = watched.ok ? watched.value : undefined;\n stop = options.agents.onChange(() => {\n repos = null;\n later(context);\n });\n };\n return {\n view,\n open(context) {\n opened ??= start(context);\n return opened;\n },\n accept: (path, context) =>\n change(path, context, async (found) => {\n const rel = relative(found.path, found.repo);\n const ran = await run(env, ['git', 'add', '-A', '--', rel], found.repo, context);\n if (ran.code !== 0) throw failure(ran, `git add ${rel}`);\n }),\n revert: (path, context) =>\n change(path, context, async (found) => {\n const rel = relative(found.path, found.repo);\n if (found.kind === 'conflict')\n throw new Error(`${found.path} has a merge conflict; resolve it with git first.`);\n if (found.kind === 'untracked') {\n const removed = await env.remove(found.path, { force: true }, context);\n if (!removed.ok) throw removed.error;\n } else {\n const ran = await run(env, ['git', 'restore', '--', rel], found.repo, context);\n if (ran.code !== 0) throw failure(ran, `git restore ${rel}`);\n }\n }),\n refresh,\n async close(context) {\n clearTimeout(timer);\n stop();\n await watcher?.close(context);\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["change"]
|
|
7
7
|
}
|
package/dist/main.js
CHANGED
|
@@ -305,7 +305,7 @@ function setupTitles(registry, models, home, at, opened) {
|
|
|
305
305
|
}
|
|
306
306
|
function freezerOf(agent, parts) {
|
|
307
307
|
const { home, memory, titles, people, users, ready } = parts;
|
|
308
|
-
|
|
308
|
+
const freezer = attachFreezer({
|
|
309
309
|
harness: agent.harness,
|
|
310
310
|
agents: agent.agents,
|
|
311
311
|
env: home,
|
|
@@ -322,6 +322,8 @@ function freezerOf(agent, parts) {
|
|
|
322
322
|
...people ? { envOf: (cone) => people.envOfAgent(`cone:${cone}`) } : {}
|
|
323
323
|
}
|
|
324
324
|
});
|
|
325
|
+
parts.licks.licks.guard(freezer.frozenTarget);
|
|
326
|
+
return freezer;
|
|
325
327
|
}
|
|
326
328
|
async function start(scope, ports, options, vault) {
|
|
327
329
|
const { client, users, home, at, wiped } = await attached(ports, options);
|
|
@@ -358,6 +360,8 @@ async function start(scope, ports, options, vault) {
|
|
|
358
360
|
const agent = await openUnfrozen(options, scoops, { models, model, registry, env: environment });
|
|
359
361
|
opened = agent;
|
|
360
362
|
await people?.start(agent.agents);
|
|
363
|
+
const freezer = freezerOf(agent, { home, memory, titles, people, users, ready, licks });
|
|
364
|
+
await freezer.swept;
|
|
361
365
|
const sources = licks.attach(agent, {
|
|
362
366
|
env: home,
|
|
363
367
|
home: HOME,
|
|
@@ -422,8 +426,6 @@ async function start(scope, ports, options, vault) {
|
|
|
422
426
|
},
|
|
423
427
|
BACKGROUND_CONTEXT
|
|
424
428
|
);
|
|
425
|
-
const freezer = freezerOf(agent, { home, memory, titles, people, users, ready });
|
|
426
|
-
licks.licks.guard(freezer.frozenTarget);
|
|
427
429
|
const settings = await settingsOf(ready, mcpRuntime, { agent, vault, wiped, licks: licks.licks });
|
|
428
430
|
const pages = createPages({ claim: sprinkles.claim });
|
|
429
431
|
const runtime = await scoops.attach(
|
package/dist/main.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.ts"],
|
|
4
|
-
"sourcesContent": ["import { attachKernel } from '@ai-ecoverse/slicc-kernel';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { Provider } from '@earendil-works/pi-ai';\nimport type { Models } from '@earendil-works/pi-ai/models';\nimport {\n createRegistry,\n type ModelRef,\n type Storage,\n type ToolRegistration,\n} from '@earendil-works/pi-durable';\nimport { CodingTools } from '@earendil-works/pi-durable/tools';\nimport { type Agent, type AgentOptions, openAgent } from './agent.ts';\nimport {\n type ApprovalJudge,\n approvalJudge,\n judgeModelOf,\n judgeSpender,\n ownerIntent,\n seedPolicy,\n verdictRecorder,\n} from './approvals/index.ts';\nimport { browserGuard } from './browser/guard.ts';\nimport { attachChanges, CHANGES_MS } from './changes/index.ts';\nimport {\n codemodeExtension,\n codemodeTool,\n disabledBySettings,\n locateWasm,\n sandboxFactory,\n} from './codemode/index.ts';\nimport { codexFetch } from './codex.ts';\nimport { attachFreezer } from './freezer/index.ts';\nimport { lateGelatiere } from './gelatiere/index.ts';\nimport { type AgentHost, hostAgent } from './host.ts';\nimport { imageReads } from './images/index.ts';\nimport { createActivity } from './kernel/activity.ts';\nimport { type AgentUsers, agentUsers, warnSupport } from './kernel/agent-users.ts';\nimport type { KernelClient } from './kernel/client.ts';\nimport { HOME, kernelEnvironment, SliccKernelEnv } from './kernel/env.ts';\nimport { processGroups } from './kernel/groups.ts';\nimport { backgroundJobs } from './kernel/jobs.ts';\nimport { adminOver, type UserClient, type UserClients, userClients } from './kernel/users.ts';\nimport { AGENT_DIR, ROOT_HOME } from './layout.ts';\nimport { type Licks, setupLicks } from './licks/index.ts';\nimport { lickTriage } from './licks/triage.ts';\nimport { type McpAccounts, setupMcp } from './mcp/index.ts';\nimport type { MemoryEntry } from './memory/format.ts';\nimport { setupMemory } from './memory/index.ts';\nimport { modelsCommand } from './models/index.ts';\nimport { pageOnly, type Reach, type Transport, transportFetch, transportReach } from './net.ts';\nimport { sliccPrompt } from './prompt.ts';\nimport { AZURE, azureBase } from './providers.ts';\nimport { createPages } from './remote/pages.ts';\nimport { identity } from './scoops/identity.ts';\nimport { type Assets, packageAssets, type ScoopsRuntime, setupScoops } from './scoops/index.ts';\nimport { vaultCredentials } from './secrets/credentials.ts';\nimport {\n BEDROCK_ENDPOINTS,\n type ModelBases,\n modelRoute,\n vaultEndpoints,\n} from './secrets/endpoints.ts';\nimport { secretsExtension, shellGrants } from './secrets/extension.ts';\nimport { grantFetch, mcpFetch, vaultFetch } from './secrets/fetch.ts';\nimport { keysMoved, type Wiped, wipeLegacy } from './secrets/legacy.ts';\nimport { secretNames } from './secrets/names.ts';\nimport { type VaultRecords, vaultRecords } from './secrets/records.ts';\nimport { scrubWith } from './secrets/scrub.ts';\nimport { fileStore, type PlainStore } from './secrets/store.ts';\nimport { listenVault, Vault, WAITING_MS } from './secrets/vault.ts';\nimport { type Choosable, unfreeze, unfreezeCreated } from './selection.ts';\nimport {\n BEDROCK,\n catalogStore,\n createAgentSettings,\n createSliccModels,\n providerFields,\n resolveDefaultModel,\n sliccProviders,\n} from './settings.ts';\nimport { RELOAD_MS, setupSkills } from './skills/index.ts';\nimport { setupSprinkles } from './sprinkles/index.ts';\nimport { openOpfsSqliteStorage } from './sqlite.ts';\nimport {\n agentVersion,\n browserConnected,\n commandsOnPath,\n kernelBoot,\n transportName,\n} from './system.ts';\nimport { titlesExtension } from './titles/extension.ts';\nimport { labeler, settingsText, titler } from './titles/generate.ts';\nimport { attachLabels } from './titles/labels.ts';\nimport { type KernelPorts, kernelPorts, serveConnections, type WorkerScope } from './worker.ts';\n\nexport interface AgentWorkerScope extends WorkerScope {\n fetch: typeof fetch;\n location: { origin: string };\n}\n\nexport type KernelAttach = (port: MessagePort) => Promise<KernelClient & { transport: Transport }>;\n\nexport interface AgentWorkerOptions {\n model?: ModelRef;\n providers?: Provider[];\n attach?: KernelAttach;\n store?: () => Promise<PlainStore>;\n storage?: () => Promise<Storage>;\n assets?: Assets;\n codemodeWasm?: () => Promise<WebAssembly.Module | undefined>;\n codemodeWorker?: string | URL;\n catalog?: string;\n users?: boolean;\n mcpRedirect?: string;\n approvalMs?: number;\n}\n\nexport function usersOf(\n admin: MessagePort | undefined,\n wanted: boolean | undefined,\n attach: KernelAttach\n): UserClients | undefined {\n if (!admin) return undefined;\n if (wanted === false) {\n admin.close();\n return undefined;\n }\n return userClients(adminOver(admin), attach as (port: MessagePort) => Promise<UserClient>);\n}\n\nexport const STORE_DIR = '/.slicc';\nexport const ACCOUNTS_FILE = `${STORE_DIR}/accounts.json`;\nexport const MODELS_FILE = `${STORE_DIR}/models.json`;\n\nasync function attached(ports: Promise<KernelPorts>, options: AgentWorkerOptions) {\n const wiped = await wipeLegacy();\n const attach: KernelAttach = options.attach ?? attachKernel;\n const { kernel, admin } = await ports;\n const client = await attach(kernel);\n const users = usersOf(admin, options.users, attach);\n await warnSupport(users, client, options.users);\n const home = new SliccKernelEnv(client, { cwd: HOME });\n await privateStore(home);\n return {\n client,\n users,\n home,\n wiped,\n at: { home: HOME, ...(users ? { agentDir: AGENT_DIR } : {}) },\n };\n}\n\nfunction privateStore(env: SliccKernelEnv): Promise<unknown> {\n return env.exec(`mkdir -p ${STORE_DIR} && chmod 700 ${STORE_DIR}`, undefined, BACKGROUND_CONTEXT);\n}\n\nasync function codemodeTools(\n client: KernelClient,\n options: AgentWorkerOptions,\n native: typeof fetch,\n extra: Parameters<typeof codemodeTool>[0]['extra'],\n dir = `${HOME}/.pi/agent`\n) {\n const settings = await client.fs.readFile(`${dir}/settings.json`).catch(() => undefined);\n if (disabledBySettings(settings === undefined ? undefined : new TextDecoder().decode(settings)))\n return [];\n const sandbox = sandboxFactory(\n options.codemodeWasm ?? (() => locateWasm(native, new URL(import.meta.url))),\n options.codemodeWorker\n );\n return [\n codemodeTool({ declared: CodingTools.tools as readonly ToolRegistration[], sandbox, extra }),\n ];\n}\n\nexport function seesImages(models: Pick<Models, 'getModel'>, ref: ModelRef | undefined): boolean {\n const found = ref && models.getModel(ref.provider, ref.modelId);\n return found ? found.input.includes('image') : true;\n}\n\nexport const MCP_CALLBACK = '/oauth/mcp-callback';\n\nasync function openUnfrozen(\n options: AgentWorkerOptions,\n { choosable: chosen }: { choosable: Choosable },\n base: Omit<AgentOptions, 'storage' | 'beforeResume' | 'conversationCreated'>\n): Promise<Agent> {\n const storage = await (options.storage ?? (() => openOpfsSqliteStorage()))();\n return openAgent({\n ...base,\n storage,\n conversationCreated: unfreezeCreated(chosen),\n beforeResume: (harness, using) => unfreeze(harness, storage, chosen, using),\n });\n}\n\nasync function secretsFor(home: SliccKernelEnv, vault: Vault) {\n scrubWith(vault);\n const names = secretNames(home, vault);\n await names.refresh(BACKGROUND_CONTEXT);\n return names;\n}\n\nexport function modelBases(\n providers: readonly Provider[],\n models: Pick<ReturnType<typeof createSliccModels>, 'getModels'>,\n env: (providerId: string) => Readonly<Record<string, string>> | undefined = () => undefined\n): ModelBases[] {\n return providers.map((provider) => ({\n provider: provider.id,\n urls: [\n ...new Set(\n [\n provider.baseUrl,\n ...models.getModels(provider.id).map((model) => model.baseUrl),\n ...(provider.id === BEDROCK ? BEDROCK_ENDPOINTS : []),\n ...(provider.id === AZURE ? [azureBase(env(provider.id) ?? {})] : []),\n ].filter((url): url is string => typeof url === 'string' && url !== '')\n ),\n ],\n }));\n}\n\nfunction mcpVault(\n vault: Vault,\n made: { store: PlainStore; records: VaultRecords; endpoints: ReturnType<typeof vaultEndpoints> }\n) {\n const { store, records, endpoints } = made;\n return {\n store,\n vault: {\n records,\n fetch: (server: string, base: typeof fetch) => mcpFetch(vault, base, server),\n grant: (server: string, base: typeof fetch) => grantFetch(vault, server, base),\n servers: endpoints.servers,\n token: endpoints.token,\n },\n };\n}\n\nfunction hostSecrets(\n vault: Vault,\n names: Awaited<ReturnType<typeof secretsFor>>,\n parts: readonly { close(): void }[]\n) {\n return {\n vault: vault.state,\n list: () => names.state.value,\n close: () => {\n for (const part of parts) part.close();\n },\n };\n}\n\nasync function modelsOf(\n scope: AgentWorkerScope,\n options: AgentWorkerOptions,\n given: { vault: Vault; home: SliccKernelEnv; transport: typeof fetch; version: string }\n) {\n const { vault, home, transport, version } = given;\n const store = await (options.store ?? (async () => fileStore(home, ACCOUNTS_FILE)))();\n const records = vaultRecords(vault);\n const loaded = records.refresh(BACKGROUND_CONTEXT).catch(() => undefined);\n const providers = options.providers ?? sliccProviders(version);\n const fields = await providerFields(store, providers);\n const credentials = vaultCredentials(records, fields.env, fields.ready);\n const models = createSliccModels(\n credentials,\n providers,\n catalogStore(fileStore(home, MODELS_FILE))\n );\n await models.refresh({ allowNetwork: false }).catch(() => undefined);\n const bases = () => modelBases(providers, models, fields.env);\n scope.fetch = codexFetch(\n vaultFetch(\n vault,\n transport,\n modelRoute(bases, () => records.state.value),\n records.rejecting\n )\n );\n const endpoints = vaultEndpoints(vault);\n const defaultModel = async () => {\n await Promise.race([loaded, new Promise((resolve) => setTimeout(resolve, WAITING_MS))]);\n return resolveDefaultModel(credentials, providers, models);\n };\n return { store, records, providers, fields, models, bases, endpoints, defaultModel };\n}\n\nfunction baseRegistry(facts: Awaited<ReturnType<typeof factsOf>>, origin: string) {\n const registry = createRegistry();\n registry.install(CodingTools);\n registry.install(browserGuard([origin]));\n registry.install(sliccPrompt(facts));\n const read = (CodingTools.tools as readonly ToolRegistration[]).find(\n (tool) => tool.name === 'read'\n ) as ToolRegistration;\n registry.install(imageReads(read));\n return registry;\n}\n\nasync function factsOf(client: KernelClient & { transport: Transport }, native: typeof fetch) {\n return {\n version: await agentVersion((url) => native(url)),\n commands: await commandsOnPath(client),\n transport: transportName(client.transport),\n browser: await browserConnected(client),\n };\n}\n\nfunction routeFetch(scope: AgentWorkerScope, client: KernelClient & { transport: Transport }) {\n const native = scope.fetch.bind(scope);\n const loopback = client.loopbackFetch?.bind(client);\n const transport = transportFetch(client.transport, scope.location.origin, native, loopback);\n scope.fetch = transport;\n return { native, transport };\n}\n\nasync function prepare(\n scope: AgentWorkerScope,\n kernel: { client: KernelClient & { transport: Transport }; home: SliccKernelEnv; vault: Vault },\n options: AgentWorkerOptions\n) {\n const names = await secretsFor(kernel.home, kernel.vault);\n const { native, transport } = routeFetch(scope, kernel.client);\n const facts = await factsOf(kernel.client, native);\n const made = await modelsOf(scope, options, {\n vault: kernel.vault,\n home: kernel.home,\n transport,\n version: facts.version,\n });\n return {\n names,\n native,\n transport,\n facts,\n ...made,\n reach: transportReach(kernel.client),\n registry: baseRegistry(facts, scope.location.origin),\n };\n}\n\nfunction modelsOfAgent(\n agent: Agent,\n settings: Awaited<ReturnType<typeof createAgentSettings>>,\n catalog: Models,\n vault: Vault\n) {\n const locked = () => vault.state.value.locked !== 'no';\n return modelsCommand({ agents: agent.agents, settings, catalog, locked });\n}\n\nasync function settingsOf(\n made: Awaited<ReturnType<typeof modelsOf>> & { reach: Reach },\n mcp: McpAccounts,\n moved: { agent: Agent; vault: Vault; wiped: Wiped; licks: Licks }\n) {\n const { models, records, fields, providers, reach } = made;\n const keys = await keysMoved(moved.agent.harness, { records, vault: moved.vault }, moved.wiped);\n const settings = await createAgentSettings(models, { records, fields }, providers, {\n mcp,\n moved: keys,\n reach,\n vault: moved.vault,\n });\n settings.state.subscribe(() => void moved.licks.flush(BACKGROUND_CONTEXT).catch(() => undefined));\n return settings;\n}\n\nasync function setupApprovals(\n models: Models,\n home: SliccKernelEnv,\n at: { home: string; agentDir?: string },\n agent: Agent,\n stored: { readonly value: readonly MemoryEntry[] | undefined },\n options: Pick<AgentWorkerOptions, 'approvalMs'>\n) {\n const memories = () => stored.value;\n const { approvalMs } = options;\n await seedPolicy(home, BACKGROUND_CONTEXT).catch(() => false);\n const settings = settingsText(home, HOME, at.agentDir);\n const intent = ownerIntent({ env: home, agents: agent.agents, memories });\n const judge: ApprovalJudge = {\n judge: approvalJudge({\n models,\n model: async (context) => judgeModelOf(await settings(context)),\n intent,\n spend: judgeSpender((agentId, context) => agent.agents.conversation(agentId, context)),\n }),\n record: verdictRecorder((agentId, context) => agent.agents.conversation(agentId, context)),\n };\n return { judge, intent, ...(approvalMs ? { approvalMs } : {}) };\n}\n\nfunction setupTitles(\n registry: ReturnType<typeof createRegistry>,\n models: Models,\n home: SliccKernelEnv,\n at: { home: string; agentDir?: string },\n opened: () => Agent | undefined\n) {\n const settings = settingsText(home, HOME, at.agentDir);\n const titleFn = titler(models, settings);\n const titles = titlesExtension({\n agents: () => opened()?.agents,\n harness: () => opened()?.harness,\n title: () => titleFn,\n });\n registry.install(titles.extension);\n return { titleFn, cancel: titles.cancel, label: labeler(models, settings) };\n}\n\nfunction freezerOf(\n agent: Agent,\n parts: {\n home: SliccKernelEnv;\n memory: ReturnType<typeof setupMemory>;\n titles: ReturnType<typeof setupTitles>;\n people: AgentUsers | undefined;\n users: UserClients | undefined;\n ready: { providers: readonly Provider[]; models: ReturnType<typeof createSliccModels> };\n }\n) {\n const { home, memory, titles, people, users, ready } = parts;\n return attachFreezer({\n harness: agent.harness,\n agents: agent.agents,\n env: home,\n extract: memory.extract,\n title: titles.titleFn,\n cancelTitle: titles.cancel,\n ...(people ? { layout: people.layout } : {}),\n imports: {\n env: home,\n memoryHome: people ? ROOT_HOME : HOME,\n catalog: ready.models,\n providers: ready.providers,\n ...(users ? { users: users.users } : {}),\n ...(people ? { envOf: (cone: string) => people.envOfAgent(`cone:${cone}`) } : {}),\n },\n });\n}\n\nasync function start(\n scope: AgentWorkerScope,\n ports: Promise<KernelPorts>,\n options: AgentWorkerOptions,\n vault: Vault\n): Promise<AgentHost> {\n const { client, users, home, at, wiped } = await attached(ports, options);\n const ready = await prepare(scope, { client, home, vault }, options);\n const { names, native, transport, facts, models, registry, records, endpoints } = ready;\n const memory = setupMemory(registry);\n const coding = CodingTools.tools as readonly ToolRegistration[];\n const mcp = setupMcp(registry);\n const codemode = await codemodeTools(client, options, native, mcp.codemode, at.agentDir);\n registry.install(codemodeExtension(codemode));\n const licks = setupLicks(registry, transport);\n licks.licks.triage(lickTriage(models));\n const scoops = setupScoops(registry, licks.licks, [...coding, ...codemode, ...memory.tools]);\n const skills = setupSkills(registry, licks.licks);\n registry.install(secretsExtension({ names, vault }));\n const titles = setupTitles(registry, models, home, at, () => opened);\n const [activity, groups, jobs] = [\n createActivity(),\n processGroups(client),\n backgroundJobs(client),\n ];\n const model = options.model ?? (await ready.defaultModel());\n let opened: Agent | undefined;\n const people = users ? agentUsers(users, client, home, () => opened?.agents) : undefined;\n const environment = kernelEnvironment(client, {\n activity,\n groups,\n jobs,\n identify: identity(() => opened?.agents, model),\n scrub: vault,\n spawn: shellGrants(names),\n ...(people ? { route: people.route } : {}),\n });\n const agent = await openUnfrozen(options, scoops, { models, model, registry, env: environment });\n opened = agent;\n await people?.start(agent.agents);\n const sources = licks.attach(agent, {\n env: home,\n home: HOME,\n models,\n activity,\n jobs,\n ...(people ? { dirs: () => people.lickDirs(), cronUser: people.cronUser.bind(people) } : {}),\n });\n await sources.start(BACKGROUND_CONTEXT);\n const booted = { version: facts.version, boot: await kernelBoot(client) };\n await sources.boot(booted, BACKGROUND_CONTEXT);\n const skillsRuntime = await skills.attach(\n {\n env: home,\n ...at,\n assets: options.assets ?? packageAssets(),\n reloadMs: RELOAD_MS,\n ...(people ? { people: people.people } : {}),\n },\n BACKGROUND_CONTEXT\n );\n const mcpRuntime = await mcp.attach(\n {\n env: home,\n ...at,\n ...mcpVault(vault, ready),\n licks: licks.licks,\n fetch: transport,\n version: facts.version,\n reloadMs: RELOAD_MS,\n codemode: codemode.length > 0,\n cors: pageOnly(client.transport),\n redirect: options.mcpRedirect ?? new URL(MCP_CALLBACK, scope.location.origin).href,\n },\n BACKGROUND_CONTEXT\n );\n const gelatiere = lateGelatiere();\n const sprinkles = await setupSprinkles().attach(\n {\n intercept: gelatiere.intercept,\n harness: agent.harness,\n agents: agent.agents,\n licks: licks.licks,\n env: home,\n assets: options.assets ?? packageAssets(),\n reloadMs: RELOAD_MS,\n ...(people?.sprinkles() ?? {}),\n },\n BACKGROUND_CONTEXT\n );\n people?.follow([sources, skillsRuntime, sprinkles]);\n let roles: ScoopsRuntime | undefined;\n const memoryRuntime = await memory.attach(\n {\n harness: agent.harness,\n agents: agent.agents,\n env: home,\n ...at,\n ...(people ? { home: ROOT_HOME } : {}),\n reloadMs: RELOAD_MS,\n roles: async (using) => roles?.roles(using),\n },\n BACKGROUND_CONTEXT\n );\n const freezer = freezerOf(agent, { home, memory, titles, people, users, ready });\n licks.licks.guard(freezer.frozenTarget);\n const settings = await settingsOf(ready, mcpRuntime, { agent, vault, wiped, licks: licks.licks });\n const pages = createPages({ claim: sprinkles.claim });\n const runtime = await scoops.attach(\n {\n harness: agent.harness,\n agents: agent.agents,\n groups,\n env: home,\n envOf: async (conversationId, context) => environment({ conversationId }, context),\n ...at,\n ...(people\n ? { layout: people.layout, spools: people.spools, enforced: people.enforced }\n : {}),\n alive: alive(client),\n reads: skillsRuntime.dirs,\n memory: memoryRuntime.command,\n gelatiere: gelatiere.command,\n freezer: freezer.command,\n models: modelsOfAgent(agent, settings, models, vault),\n panel: pages.command,\n webhook: sources.webhook,\n mcp: mcp.direct,\n ...(options.assets ? { assets: options.assets } : {}),\n },\n BACKGROUND_CONTEXT\n );\n roles = runtime;\n gelatiere.attach({\n agents: agent.agents,\n licks: licks.licks,\n env: home,\n home: HOME,\n ...(await people?.gelatiere(home)),\n scoops: scoops.scoops,\n roles: runtime.roles,\n assets: options.assets ?? packageAssets(),\n fetch: scope.fetch,\n skills: skillsRuntime.skills,\n ...(options.catalog ? { catalog: options.catalog } : {}),\n });\n await memoryRuntime.reload(BACKGROUND_CONTEXT).catch(() => undefined);\n return hostAgent(agent, {\n ...(await setupApprovals(models, home, at, agent, memoryRuntime.memories, options)),\n settings,\n licks: { licks: licks.licks, sources },\n scoops: { scoops: scoops.scoops, runtime },\n skills: skillsRuntime,\n sprinkles,\n memory: memoryRuntime,\n freezer,\n changes: attachChanges({ agents: agent.agents, env: home, reloadMs: CHANGES_MS }),\n pages,\n labels: await attachLabels({ ...agent, label: titles.label, vault: vault.state }),\n mcp: mcpRuntime,\n ...(users ? { users } : {}),\n secrets: hostSecrets(vault, names, [names, records, endpoints]),\n uploads: {\n env: environment,\n sees: (ref) => seesImages(models, ref),\n },\n monitor: {\n kernel: client,\n groups,\n ...(users ? { users: () => users.users.list() } : {}),\n },\n });\n}\n\nexport function alive(client: KernelClient) {\n return async (pid: number): Promise<boolean> => {\n if (!client.ps) return true;\n return (await client.ps()).some((process) => process.pid === pid);\n };\n}\n\nexport function runAgentWorker(\n scope: AgentWorkerScope,\n options: AgentWorkerOptions = {}\n): Promise<AgentHost> {\n const vault = new Vault();\n listenVault(scope, vault);\n const host = start(scope, kernelPorts(scope), options, vault);\n host.catch(() => undefined);\n serveConnections(scope, host);\n return host;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { attachKernel } from '@ai-ecoverse/slicc-kernel';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { Provider } from '@earendil-works/pi-ai';\nimport type { Models } from '@earendil-works/pi-ai/models';\nimport {\n createRegistry,\n type ModelRef,\n type Storage,\n type ToolRegistration,\n} from '@earendil-works/pi-durable';\nimport { CodingTools } from '@earendil-works/pi-durable/tools';\nimport { type Agent, type AgentOptions, openAgent } from './agent.ts';\nimport {\n type ApprovalJudge,\n approvalJudge,\n judgeModelOf,\n judgeSpender,\n ownerIntent,\n seedPolicy,\n verdictRecorder,\n} from './approvals/index.ts';\nimport { browserGuard } from './browser/guard.ts';\nimport { attachChanges, CHANGES_MS } from './changes/index.ts';\nimport {\n codemodeExtension,\n codemodeTool,\n disabledBySettings,\n locateWasm,\n sandboxFactory,\n} from './codemode/index.ts';\nimport { codexFetch } from './codex.ts';\nimport { attachFreezer } from './freezer/index.ts';\nimport { lateGelatiere } from './gelatiere/index.ts';\nimport { type AgentHost, hostAgent } from './host.ts';\nimport { imageReads } from './images/index.ts';\nimport { createActivity } from './kernel/activity.ts';\nimport { type AgentUsers, agentUsers, warnSupport } from './kernel/agent-users.ts';\nimport type { KernelClient } from './kernel/client.ts';\nimport { HOME, kernelEnvironment, SliccKernelEnv } from './kernel/env.ts';\nimport { processGroups } from './kernel/groups.ts';\nimport { backgroundJobs } from './kernel/jobs.ts';\nimport { adminOver, type UserClient, type UserClients, userClients } from './kernel/users.ts';\nimport { AGENT_DIR, ROOT_HOME } from './layout.ts';\nimport { type Licks, setupLicks } from './licks/index.ts';\nimport { lickTriage } from './licks/triage.ts';\nimport { type McpAccounts, setupMcp } from './mcp/index.ts';\nimport type { MemoryEntry } from './memory/format.ts';\nimport { setupMemory } from './memory/index.ts';\nimport { modelsCommand } from './models/index.ts';\nimport { pageOnly, type Reach, type Transport, transportFetch, transportReach } from './net.ts';\nimport { sliccPrompt } from './prompt.ts';\nimport { AZURE, azureBase } from './providers.ts';\nimport { createPages } from './remote/pages.ts';\nimport { identity } from './scoops/identity.ts';\nimport { type Assets, packageAssets, type ScoopsRuntime, setupScoops } from './scoops/index.ts';\nimport { vaultCredentials } from './secrets/credentials.ts';\nimport {\n BEDROCK_ENDPOINTS,\n type ModelBases,\n modelRoute,\n vaultEndpoints,\n} from './secrets/endpoints.ts';\nimport { secretsExtension, shellGrants } from './secrets/extension.ts';\nimport { grantFetch, mcpFetch, vaultFetch } from './secrets/fetch.ts';\nimport { keysMoved, type Wiped, wipeLegacy } from './secrets/legacy.ts';\nimport { secretNames } from './secrets/names.ts';\nimport { type VaultRecords, vaultRecords } from './secrets/records.ts';\nimport { scrubWith } from './secrets/scrub.ts';\nimport { fileStore, type PlainStore } from './secrets/store.ts';\nimport { listenVault, Vault, WAITING_MS } from './secrets/vault.ts';\nimport { type Choosable, unfreeze, unfreezeCreated } from './selection.ts';\nimport {\n BEDROCK,\n catalogStore,\n createAgentSettings,\n createSliccModels,\n providerFields,\n resolveDefaultModel,\n sliccProviders,\n} from './settings.ts';\nimport { RELOAD_MS, setupSkills } from './skills/index.ts';\nimport { setupSprinkles } from './sprinkles/index.ts';\nimport { openOpfsSqliteStorage } from './sqlite.ts';\nimport {\n agentVersion,\n browserConnected,\n commandsOnPath,\n kernelBoot,\n transportName,\n} from './system.ts';\nimport { titlesExtension } from './titles/extension.ts';\nimport { labeler, settingsText, titler } from './titles/generate.ts';\nimport { attachLabels } from './titles/labels.ts';\nimport { type KernelPorts, kernelPorts, serveConnections, type WorkerScope } from './worker.ts';\n\nexport interface AgentWorkerScope extends WorkerScope {\n fetch: typeof fetch;\n location: { origin: string };\n}\n\nexport type KernelAttach = (port: MessagePort) => Promise<KernelClient & { transport: Transport }>;\n\nexport interface AgentWorkerOptions {\n model?: ModelRef;\n providers?: Provider[];\n attach?: KernelAttach;\n store?: () => Promise<PlainStore>;\n storage?: () => Promise<Storage>;\n assets?: Assets;\n codemodeWasm?: () => Promise<WebAssembly.Module | undefined>;\n codemodeWorker?: string | URL;\n catalog?: string;\n users?: boolean;\n mcpRedirect?: string;\n approvalMs?: number;\n}\n\nexport function usersOf(\n admin: MessagePort | undefined,\n wanted: boolean | undefined,\n attach: KernelAttach\n): UserClients | undefined {\n if (!admin) return undefined;\n if (wanted === false) {\n admin.close();\n return undefined;\n }\n return userClients(adminOver(admin), attach as (port: MessagePort) => Promise<UserClient>);\n}\n\nexport const STORE_DIR = '/.slicc';\nexport const ACCOUNTS_FILE = `${STORE_DIR}/accounts.json`;\nexport const MODELS_FILE = `${STORE_DIR}/models.json`;\n\nasync function attached(ports: Promise<KernelPorts>, options: AgentWorkerOptions) {\n const wiped = await wipeLegacy();\n const attach: KernelAttach = options.attach ?? attachKernel;\n const { kernel, admin } = await ports;\n const client = await attach(kernel);\n const users = usersOf(admin, options.users, attach);\n await warnSupport(users, client, options.users);\n const home = new SliccKernelEnv(client, { cwd: HOME });\n await privateStore(home);\n return {\n client,\n users,\n home,\n wiped,\n at: { home: HOME, ...(users ? { agentDir: AGENT_DIR } : {}) },\n };\n}\n\nfunction privateStore(env: SliccKernelEnv): Promise<unknown> {\n return env.exec(`mkdir -p ${STORE_DIR} && chmod 700 ${STORE_DIR}`, undefined, BACKGROUND_CONTEXT);\n}\n\nasync function codemodeTools(\n client: KernelClient,\n options: AgentWorkerOptions,\n native: typeof fetch,\n extra: Parameters<typeof codemodeTool>[0]['extra'],\n dir = `${HOME}/.pi/agent`\n) {\n const settings = await client.fs.readFile(`${dir}/settings.json`).catch(() => undefined);\n if (disabledBySettings(settings === undefined ? undefined : new TextDecoder().decode(settings)))\n return [];\n const sandbox = sandboxFactory(\n options.codemodeWasm ?? (() => locateWasm(native, new URL(import.meta.url))),\n options.codemodeWorker\n );\n return [\n codemodeTool({ declared: CodingTools.tools as readonly ToolRegistration[], sandbox, extra }),\n ];\n}\n\nexport function seesImages(models: Pick<Models, 'getModel'>, ref: ModelRef | undefined): boolean {\n const found = ref && models.getModel(ref.provider, ref.modelId);\n return found ? found.input.includes('image') : true;\n}\n\nexport const MCP_CALLBACK = '/oauth/mcp-callback';\n\nasync function openUnfrozen(\n options: AgentWorkerOptions,\n { choosable: chosen }: { choosable: Choosable },\n base: Omit<AgentOptions, 'storage' | 'beforeResume' | 'conversationCreated'>\n): Promise<Agent> {\n const storage = await (options.storage ?? (() => openOpfsSqliteStorage()))();\n return openAgent({\n ...base,\n storage,\n conversationCreated: unfreezeCreated(chosen),\n beforeResume: (harness, using) => unfreeze(harness, storage, chosen, using),\n });\n}\n\nasync function secretsFor(home: SliccKernelEnv, vault: Vault) {\n scrubWith(vault);\n const names = secretNames(home, vault);\n await names.refresh(BACKGROUND_CONTEXT);\n return names;\n}\n\nexport function modelBases(\n providers: readonly Provider[],\n models: Pick<ReturnType<typeof createSliccModels>, 'getModels'>,\n env: (providerId: string) => Readonly<Record<string, string>> | undefined = () => undefined\n): ModelBases[] {\n return providers.map((provider) => ({\n provider: provider.id,\n urls: [\n ...new Set(\n [\n provider.baseUrl,\n ...models.getModels(provider.id).map((model) => model.baseUrl),\n ...(provider.id === BEDROCK ? BEDROCK_ENDPOINTS : []),\n ...(provider.id === AZURE ? [azureBase(env(provider.id) ?? {})] : []),\n ].filter((url): url is string => typeof url === 'string' && url !== '')\n ),\n ],\n }));\n}\n\nfunction mcpVault(\n vault: Vault,\n made: { store: PlainStore; records: VaultRecords; endpoints: ReturnType<typeof vaultEndpoints> }\n) {\n const { store, records, endpoints } = made;\n return {\n store,\n vault: {\n records,\n fetch: (server: string, base: typeof fetch) => mcpFetch(vault, base, server),\n grant: (server: string, base: typeof fetch) => grantFetch(vault, server, base),\n servers: endpoints.servers,\n token: endpoints.token,\n },\n };\n}\n\nfunction hostSecrets(\n vault: Vault,\n names: Awaited<ReturnType<typeof secretsFor>>,\n parts: readonly { close(): void }[]\n) {\n return {\n vault: vault.state,\n list: () => names.state.value,\n close: () => {\n for (const part of parts) part.close();\n },\n };\n}\n\nasync function modelsOf(\n scope: AgentWorkerScope,\n options: AgentWorkerOptions,\n given: { vault: Vault; home: SliccKernelEnv; transport: typeof fetch; version: string }\n) {\n const { vault, home, transport, version } = given;\n const store = await (options.store ?? (async () => fileStore(home, ACCOUNTS_FILE)))();\n const records = vaultRecords(vault);\n const loaded = records.refresh(BACKGROUND_CONTEXT).catch(() => undefined);\n const providers = options.providers ?? sliccProviders(version);\n const fields = await providerFields(store, providers);\n const credentials = vaultCredentials(records, fields.env, fields.ready);\n const models = createSliccModels(\n credentials,\n providers,\n catalogStore(fileStore(home, MODELS_FILE))\n );\n await models.refresh({ allowNetwork: false }).catch(() => undefined);\n const bases = () => modelBases(providers, models, fields.env);\n scope.fetch = codexFetch(\n vaultFetch(\n vault,\n transport,\n modelRoute(bases, () => records.state.value),\n records.rejecting\n )\n );\n const endpoints = vaultEndpoints(vault);\n const defaultModel = async () => {\n await Promise.race([loaded, new Promise((resolve) => setTimeout(resolve, WAITING_MS))]);\n return resolveDefaultModel(credentials, providers, models);\n };\n return { store, records, providers, fields, models, bases, endpoints, defaultModel };\n}\n\nfunction baseRegistry(facts: Awaited<ReturnType<typeof factsOf>>, origin: string) {\n const registry = createRegistry();\n registry.install(CodingTools);\n registry.install(browserGuard([origin]));\n registry.install(sliccPrompt(facts));\n const read = (CodingTools.tools as readonly ToolRegistration[]).find(\n (tool) => tool.name === 'read'\n ) as ToolRegistration;\n registry.install(imageReads(read));\n return registry;\n}\n\nasync function factsOf(client: KernelClient & { transport: Transport }, native: typeof fetch) {\n return {\n version: await agentVersion((url) => native(url)),\n commands: await commandsOnPath(client),\n transport: transportName(client.transport),\n browser: await browserConnected(client),\n };\n}\n\nfunction routeFetch(scope: AgentWorkerScope, client: KernelClient & { transport: Transport }) {\n const native = scope.fetch.bind(scope);\n const loopback = client.loopbackFetch?.bind(client);\n const transport = transportFetch(client.transport, scope.location.origin, native, loopback);\n scope.fetch = transport;\n return { native, transport };\n}\n\nasync function prepare(\n scope: AgentWorkerScope,\n kernel: { client: KernelClient & { transport: Transport }; home: SliccKernelEnv; vault: Vault },\n options: AgentWorkerOptions\n) {\n const names = await secretsFor(kernel.home, kernel.vault);\n const { native, transport } = routeFetch(scope, kernel.client);\n const facts = await factsOf(kernel.client, native);\n const made = await modelsOf(scope, options, {\n vault: kernel.vault,\n home: kernel.home,\n transport,\n version: facts.version,\n });\n return {\n names,\n native,\n transport,\n facts,\n ...made,\n reach: transportReach(kernel.client),\n registry: baseRegistry(facts, scope.location.origin),\n };\n}\n\nfunction modelsOfAgent(\n agent: Agent,\n settings: Awaited<ReturnType<typeof createAgentSettings>>,\n catalog: Models,\n vault: Vault\n) {\n const locked = () => vault.state.value.locked !== 'no';\n return modelsCommand({ agents: agent.agents, settings, catalog, locked });\n}\n\nasync function settingsOf(\n made: Awaited<ReturnType<typeof modelsOf>> & { reach: Reach },\n mcp: McpAccounts,\n moved: { agent: Agent; vault: Vault; wiped: Wiped; licks: Licks }\n) {\n const { models, records, fields, providers, reach } = made;\n const keys = await keysMoved(moved.agent.harness, { records, vault: moved.vault }, moved.wiped);\n const settings = await createAgentSettings(models, { records, fields }, providers, {\n mcp,\n moved: keys,\n reach,\n vault: moved.vault,\n });\n settings.state.subscribe(() => void moved.licks.flush(BACKGROUND_CONTEXT).catch(() => undefined));\n return settings;\n}\n\nasync function setupApprovals(\n models: Models,\n home: SliccKernelEnv,\n at: { home: string; agentDir?: string },\n agent: Agent,\n stored: { readonly value: readonly MemoryEntry[] | undefined },\n options: Pick<AgentWorkerOptions, 'approvalMs'>\n) {\n const memories = () => stored.value;\n const { approvalMs } = options;\n await seedPolicy(home, BACKGROUND_CONTEXT).catch(() => false);\n const settings = settingsText(home, HOME, at.agentDir);\n const intent = ownerIntent({ env: home, agents: agent.agents, memories });\n const judge: ApprovalJudge = {\n judge: approvalJudge({\n models,\n model: async (context) => judgeModelOf(await settings(context)),\n intent,\n spend: judgeSpender((agentId, context) => agent.agents.conversation(agentId, context)),\n }),\n record: verdictRecorder((agentId, context) => agent.agents.conversation(agentId, context)),\n };\n return { judge, intent, ...(approvalMs ? { approvalMs } : {}) };\n}\n\nfunction setupTitles(\n registry: ReturnType<typeof createRegistry>,\n models: Models,\n home: SliccKernelEnv,\n at: { home: string; agentDir?: string },\n opened: () => Agent | undefined\n) {\n const settings = settingsText(home, HOME, at.agentDir);\n const titleFn = titler(models, settings);\n const titles = titlesExtension({\n agents: () => opened()?.agents,\n harness: () => opened()?.harness,\n title: () => titleFn,\n });\n registry.install(titles.extension);\n return { titleFn, cancel: titles.cancel, label: labeler(models, settings) };\n}\n\nfunction freezerOf(\n agent: Agent,\n parts: {\n home: SliccKernelEnv;\n memory: ReturnType<typeof setupMemory>;\n titles: ReturnType<typeof setupTitles>;\n people: AgentUsers | undefined;\n users: UserClients | undefined;\n ready: { providers: readonly Provider[]; models: ReturnType<typeof createSliccModels> };\n licks: ReturnType<typeof setupLicks>;\n }\n) {\n const { home, memory, titles, people, users, ready } = parts;\n const freezer = attachFreezer({\n harness: agent.harness,\n agents: agent.agents,\n env: home,\n extract: memory.extract,\n title: titles.titleFn,\n cancelTitle: titles.cancel,\n ...(people ? { layout: people.layout } : {}),\n imports: {\n env: home,\n memoryHome: people ? ROOT_HOME : HOME,\n catalog: ready.models,\n providers: ready.providers,\n ...(users ? { users: users.users } : {}),\n ...(people ? { envOf: (cone: string) => people.envOfAgent(`cone:${cone}`) } : {}),\n },\n });\n parts.licks.licks.guard(freezer.frozenTarget);\n return freezer;\n}\n\nasync function start(\n scope: AgentWorkerScope,\n ports: Promise<KernelPorts>,\n options: AgentWorkerOptions,\n vault: Vault\n): Promise<AgentHost> {\n const { client, users, home, at, wiped } = await attached(ports, options);\n const ready = await prepare(scope, { client, home, vault }, options);\n const { names, native, transport, facts, models, registry, records, endpoints } = ready;\n const memory = setupMemory(registry);\n const coding = CodingTools.tools as readonly ToolRegistration[];\n const mcp = setupMcp(registry);\n const codemode = await codemodeTools(client, options, native, mcp.codemode, at.agentDir);\n registry.install(codemodeExtension(codemode));\n const licks = setupLicks(registry, transport);\n licks.licks.triage(lickTriage(models));\n const scoops = setupScoops(registry, licks.licks, [...coding, ...codemode, ...memory.tools]);\n const skills = setupSkills(registry, licks.licks);\n registry.install(secretsExtension({ names, vault }));\n const titles = setupTitles(registry, models, home, at, () => opened);\n const [activity, groups, jobs] = [\n createActivity(),\n processGroups(client),\n backgroundJobs(client),\n ];\n const model = options.model ?? (await ready.defaultModel());\n let opened: Agent | undefined;\n const people = users ? agentUsers(users, client, home, () => opened?.agents) : undefined;\n const environment = kernelEnvironment(client, {\n activity,\n groups,\n jobs,\n identify: identity(() => opened?.agents, model),\n scrub: vault,\n spawn: shellGrants(names),\n ...(people ? { route: people.route } : {}),\n });\n const agent = await openUnfrozen(options, scoops, { models, model, registry, env: environment });\n opened = agent;\n await people?.start(agent.agents);\n const freezer = freezerOf(agent, { home, memory, titles, people, users, ready, licks });\n await freezer.swept;\n const sources = licks.attach(agent, {\n env: home,\n home: HOME,\n models,\n activity,\n jobs,\n ...(people ? { dirs: () => people.lickDirs(), cronUser: people.cronUser.bind(people) } : {}),\n });\n await sources.start(BACKGROUND_CONTEXT);\n const booted = { version: facts.version, boot: await kernelBoot(client) };\n await sources.boot(booted, BACKGROUND_CONTEXT);\n const skillsRuntime = await skills.attach(\n {\n env: home,\n ...at,\n assets: options.assets ?? packageAssets(),\n reloadMs: RELOAD_MS,\n ...(people ? { people: people.people } : {}),\n },\n BACKGROUND_CONTEXT\n );\n const mcpRuntime = await mcp.attach(\n {\n env: home,\n ...at,\n ...mcpVault(vault, ready),\n licks: licks.licks,\n fetch: transport,\n version: facts.version,\n reloadMs: RELOAD_MS,\n codemode: codemode.length > 0,\n cors: pageOnly(client.transport),\n redirect: options.mcpRedirect ?? new URL(MCP_CALLBACK, scope.location.origin).href,\n },\n BACKGROUND_CONTEXT\n );\n const gelatiere = lateGelatiere();\n const sprinkles = await setupSprinkles().attach(\n {\n intercept: gelatiere.intercept,\n harness: agent.harness,\n agents: agent.agents,\n licks: licks.licks,\n env: home,\n assets: options.assets ?? packageAssets(),\n reloadMs: RELOAD_MS,\n ...(people?.sprinkles() ?? {}),\n },\n BACKGROUND_CONTEXT\n );\n people?.follow([sources, skillsRuntime, sprinkles]);\n let roles: ScoopsRuntime | undefined;\n const memoryRuntime = await memory.attach(\n {\n harness: agent.harness,\n agents: agent.agents,\n env: home,\n ...at,\n ...(people ? { home: ROOT_HOME } : {}),\n reloadMs: RELOAD_MS,\n roles: async (using) => roles?.roles(using),\n },\n BACKGROUND_CONTEXT\n );\n const settings = await settingsOf(ready, mcpRuntime, { agent, vault, wiped, licks: licks.licks });\n const pages = createPages({ claim: sprinkles.claim });\n const runtime = await scoops.attach(\n {\n harness: agent.harness,\n agents: agent.agents,\n groups,\n env: home,\n envOf: async (conversationId, context) => environment({ conversationId }, context),\n ...at,\n ...(people\n ? { layout: people.layout, spools: people.spools, enforced: people.enforced }\n : {}),\n alive: alive(client),\n reads: skillsRuntime.dirs,\n memory: memoryRuntime.command,\n gelatiere: gelatiere.command,\n freezer: freezer.command,\n models: modelsOfAgent(agent, settings, models, vault),\n panel: pages.command,\n webhook: sources.webhook,\n mcp: mcp.direct,\n ...(options.assets ? { assets: options.assets } : {}),\n },\n BACKGROUND_CONTEXT\n );\n roles = runtime;\n gelatiere.attach({\n agents: agent.agents,\n licks: licks.licks,\n env: home,\n home: HOME,\n ...(await people?.gelatiere(home)),\n scoops: scoops.scoops,\n roles: runtime.roles,\n assets: options.assets ?? packageAssets(),\n fetch: scope.fetch,\n skills: skillsRuntime.skills,\n ...(options.catalog ? { catalog: options.catalog } : {}),\n });\n await memoryRuntime.reload(BACKGROUND_CONTEXT).catch(() => undefined);\n return hostAgent(agent, {\n ...(await setupApprovals(models, home, at, agent, memoryRuntime.memories, options)),\n settings,\n licks: { licks: licks.licks, sources },\n scoops: { scoops: scoops.scoops, runtime },\n skills: skillsRuntime,\n sprinkles,\n memory: memoryRuntime,\n freezer,\n changes: attachChanges({ agents: agent.agents, env: home, reloadMs: CHANGES_MS }),\n pages,\n labels: await attachLabels({ ...agent, label: titles.label, vault: vault.state }),\n mcp: mcpRuntime,\n ...(users ? { users } : {}),\n secrets: hostSecrets(vault, names, [names, records, endpoints]),\n uploads: {\n env: environment,\n sees: (ref) => seesImages(models, ref),\n },\n monitor: {\n kernel: client,\n groups,\n ...(users ? { users: () => users.users.list() } : {}),\n },\n });\n}\n\nexport function alive(client: KernelClient) {\n return async (pid: number): Promise<boolean> => {\n if (!client.ps) return true;\n return (await client.ps()).some((process) => process.pid === pid);\n };\n}\n\nexport function runAgentWorker(\n scope: AgentWorkerScope,\n options: AgentWorkerOptions = {}\n): Promise<AgentHost> {\n const vault = new Vault();\n listenVault(scope, vault);\n const host = start(scope, kernelPorts(scope), options, vault);\n host.catch(() => undefined);\n serveConnections(scope, host);\n return host;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -27,6 +27,15 @@ export interface Pending {
|
|
|
27
27
|
kind: ChangeKind;
|
|
28
28
|
}
|
|
29
29
|
export declare function parseStatus(out: string): Pending[];
|
|
30
|
+
export declare const STATUS: string[];
|
|
31
|
+
export declare const BATCH_BYTES: number;
|
|
32
|
+
export interface Stored {
|
|
33
|
+
path: string;
|
|
34
|
+
oid: string;
|
|
35
|
+
size: number;
|
|
36
|
+
}
|
|
37
|
+
export declare function parseCheck(out: string, paths: readonly string[]): Stored[] | null;
|
|
38
|
+
export declare function parseBatch(bytes: Uint8Array, count: number): (Uint8Array | null)[] | null;
|
|
30
39
|
export declare function textOf(bytes: Uint8Array): string | null;
|
|
31
40
|
export declare function shown(text: string): string | null;
|
|
32
41
|
export declare function scanned(name: string): boolean;
|
package/package.json
CHANGED