@ai-ecoverse/slicc-agent 2.1.0 → 2.3.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.
- package/README.md +51 -1
- package/dist/agent-worker.js +6 -0
- package/dist/agent-worker.js.map +7 -0
- package/dist/agent.js +2 -1
- package/dist/agent.js.map +2 -2
- package/dist/client.js +4 -1
- package/dist/client.js.map +2 -2
- package/dist/credentials.js +100 -0
- package/dist/credentials.js.map +7 -0
- package/dist/host.js +14 -2
- package/dist/host.js.map +2 -2
- package/dist/index.js +31 -1
- package/dist/index.js.map +2 -2
- package/dist/kernel/client.js +1 -0
- package/dist/kernel/client.js.map +7 -0
- package/dist/kernel/env.js +204 -0
- package/dist/kernel/env.js.map +7 -0
- package/dist/kernel/exec.js +115 -0
- package/dist/kernel/exec.js.map +7 -0
- package/dist/kernel/files.js +153 -0
- package/dist/kernel/files.js.map +7 -0
- package/dist/kernel/paths.js +31 -0
- package/dist/kernel/paths.js.map +7 -0
- package/dist/kernel/watch.js +71 -0
- package/dist/kernel/watch.js.map +7 -0
- package/dist/main.js +46 -0
- package/dist/main.js.map +7 -0
- package/dist/net.js +39 -0
- package/dist/net.js.map +7 -0
- package/dist/owner.js +32 -9
- package/dist/owner.js.map +2 -2
- package/dist/prompt.js +18 -0
- package/dist/prompt.js.map +7 -0
- package/dist/settings.js +77 -0
- package/dist/settings.js.map +7 -0
- package/dist/spectrum/index.js +10 -2
- package/dist/spectrum/index.js.map +3 -3
- package/dist/spectrum/settings-port.js +73 -0
- package/dist/spectrum/settings-port.js.map +7 -0
- package/dist/types/agent-worker.d.ts +1 -0
- package/dist/types/agent.d.ts +1 -0
- package/dist/types/client.d.ts +2 -0
- package/dist/types/credentials.d.ts +12 -0
- package/dist/types/host.d.ts +2 -0
- package/dist/types/index.d.ts +8 -1
- package/dist/types/kernel/client.d.ts +39 -0
- package/dist/types/kernel/env.d.ts +57 -0
- package/dist/types/kernel/exec.d.ts +5 -0
- package/dist/types/kernel/files.d.ts +34 -0
- package/dist/types/kernel/paths.d.ts +4 -0
- package/dist/types/kernel/watch.d.ts +10 -0
- package/dist/types/main.d.ts +23 -0
- package/dist/types/net.d.ts +19 -0
- package/dist/types/owner.d.ts +6 -2
- package/dist/types/prompt.d.ts +1 -0
- package/dist/types/settings.d.ts +37 -0
- package/dist/types/spectrum/index.d.ts +6 -1
- package/dist/types/spectrum/settings-port.d.ts +17 -0
- package/dist/types/worker.d.ts +1 -0
- package/dist/worker.js +9 -0
- package/dist/worker.js.map +2 -2
- package/package.json +10 -2
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { dirname, resolve } from "./paths.js";
|
|
2
|
+
function excluded(name, target) {
|
|
3
|
+
const rule = target.exclude;
|
|
4
|
+
if (!rule) return false;
|
|
5
|
+
return rule.hidden === true && name.startsWith(".") || (rule.names?.includes(name) ?? false);
|
|
6
|
+
}
|
|
7
|
+
async function record(fs, path, into) {
|
|
8
|
+
const stat = await fs.stat(path).catch(() => void 0);
|
|
9
|
+
if (!stat) return false;
|
|
10
|
+
into.set(
|
|
11
|
+
path,
|
|
12
|
+
`${stat.isDirectory ? "d" : "f"}:${stat.ino}:${stat.size}:${new Date(stat.mtime).getTime()}`
|
|
13
|
+
);
|
|
14
|
+
return stat.isDirectory;
|
|
15
|
+
}
|
|
16
|
+
async function scan(fs, path, target, deep, into) {
|
|
17
|
+
const directory = await record(fs, path, into);
|
|
18
|
+
if (!directory || !deep) return;
|
|
19
|
+
const names = await fs.readdir(path).catch(() => []);
|
|
20
|
+
for (const name of names) {
|
|
21
|
+
if (excluded(name, target)) continue;
|
|
22
|
+
const child = `${path === "/" ? "" : path}/${name}`;
|
|
23
|
+
await scan(fs, child, target, target.recursive === true, into);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function snapshot(fs, cwd, targets) {
|
|
27
|
+
const all = /* @__PURE__ */ new Map();
|
|
28
|
+
for (const target of targets) await scan(fs, resolve(cwd, target.path), target, true, all);
|
|
29
|
+
return all;
|
|
30
|
+
}
|
|
31
|
+
function differences(before, after) {
|
|
32
|
+
const changed = /* @__PURE__ */ new Set();
|
|
33
|
+
const moved = (path) => {
|
|
34
|
+
changed.add(path);
|
|
35
|
+
changed.add(dirname(path));
|
|
36
|
+
};
|
|
37
|
+
for (const [path, value] of after) {
|
|
38
|
+
if (!before.has(path)) moved(path);
|
|
39
|
+
else if (before.get(path) !== value) changed.add(path);
|
|
40
|
+
}
|
|
41
|
+
for (const path of before.keys()) if (!after.has(path)) moved(path);
|
|
42
|
+
return [...changed];
|
|
43
|
+
}
|
|
44
|
+
async function pollWatch(fs, cwd, targets, onChange, options = {}) {
|
|
45
|
+
let current = await snapshot(fs, cwd, targets);
|
|
46
|
+
let open = true;
|
|
47
|
+
let running = Promise.resolve();
|
|
48
|
+
const tick = async () => {
|
|
49
|
+
const next = await snapshot(fs, cwd, targets);
|
|
50
|
+
const paths = differences(current, next);
|
|
51
|
+
current = next;
|
|
52
|
+
if (open && paths.length > 0) onChange({ paths });
|
|
53
|
+
};
|
|
54
|
+
const timer = setInterval(() => {
|
|
55
|
+
running = running.then(tick);
|
|
56
|
+
}, options.intervalMs ?? 100);
|
|
57
|
+
return {
|
|
58
|
+
mode: "polling",
|
|
59
|
+
async close(_context) {
|
|
60
|
+
open = false;
|
|
61
|
+
clearInterval(timer);
|
|
62
|
+
await running;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
differences,
|
|
68
|
+
pollWatch,
|
|
69
|
+
snapshot
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/kernel/watch.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Context } from '@earendil-works/chord';\nimport type { FileWatcher, WatchChange, WatchTarget } from '@earendil-works/pi-durable/env';\nimport type { KernelFs } from './client.ts';\nimport { dirname, resolve } from './paths.ts';\n\ntype Snapshot = Map<string, string>;\n\nfunction excluded(name: string, target: WatchTarget): boolean {\n const rule = target.exclude;\n if (!rule) return false;\n return (rule.hidden === true && name.startsWith('.')) || (rule.names?.includes(name) ?? false);\n}\n\nasync function record(fs: KernelFs, path: string, into: Snapshot): Promise<boolean> {\n const stat = await fs.stat(path).catch(() => undefined);\n if (!stat) return false;\n into.set(\n path,\n `${stat.isDirectory ? 'd' : 'f'}:${stat.ino}:${stat.size}:${new Date(stat.mtime).getTime()}`\n );\n return stat.isDirectory;\n}\n\nasync function scan(\n fs: KernelFs,\n path: string,\n target: WatchTarget,\n deep: boolean,\n into: Snapshot\n) {\n const directory = await record(fs, path, into);\n if (!directory || !deep) return;\n const names = await fs.readdir(path).catch(() => [] as string[]);\n for (const name of names) {\n if (excluded(name, target)) continue;\n const child = `${path === '/' ? '' : path}/${name}`;\n await scan(fs, child, target, target.recursive === true, into);\n }\n}\n\nexport async function snapshot(\n fs: KernelFs,\n cwd: string,\n targets: readonly WatchTarget[]\n): Promise<Snapshot> {\n const all: Snapshot = new Map();\n for (const target of targets) await scan(fs, resolve(cwd, target.path), target, true, all);\n return all;\n}\n\nexport function differences(before: Snapshot, after: Snapshot): string[] {\n const changed = new Set<string>();\n const moved = (path: string) => {\n changed.add(path);\n changed.add(dirname(path));\n };\n for (const [path, value] of after) {\n if (!before.has(path)) moved(path);\n else if (before.get(path) !== value) changed.add(path);\n }\n for (const path of before.keys()) if (!after.has(path)) moved(path);\n return [...changed];\n}\n\nexport interface PollOptions {\n intervalMs?: number;\n}\n\nexport async function pollWatch(\n fs: KernelFs,\n cwd: string,\n targets: readonly WatchTarget[],\n onChange: (change: WatchChange) => void,\n options: PollOptions = {}\n): Promise<FileWatcher> {\n let current = await snapshot(fs, cwd, targets);\n let open = true;\n let running = Promise.resolve();\n const tick = async () => {\n const next = await snapshot(fs, cwd, targets);\n const paths = differences(current, next);\n current = next;\n if (open && paths.length > 0) onChange({ paths });\n };\n const timer = setInterval(() => {\n running = running.then(tick);\n }, options.intervalMs ?? 100);\n return {\n mode: 'polling',\n async close(_context: Context) {\n open = false;\n clearInterval(timer);\n await running;\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "AAGA,SAAS,SAAS,eAAe;AAIjC,SAAS,SAAS,MAAc,QAA8B;AAC5D,QAAM,OAAO,OAAO;AACpB,MAAI,CAAC,KAAM,QAAO;AAClB,SAAQ,KAAK,WAAW,QAAQ,KAAK,WAAW,GAAG,MAAO,KAAK,OAAO,SAAS,IAAI,KAAK;AAC1F;AAEA,eAAe,OAAO,IAAc,MAAc,MAAkC;AAClF,QAAM,OAAO,MAAM,GAAG,KAAK,IAAI,EAAE,MAAM,MAAM,MAAS;AACtD,MAAI,CAAC,KAAM,QAAO;AAClB,OAAK;AAAA,IACH;AAAA,IACA,GAAG,KAAK,cAAc,MAAM,GAAG,IAAI,KAAK,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE,QAAQ,CAAC;AAAA,EAC5F;AACA,SAAO,KAAK;AACd;AAEA,eAAe,KACb,IACA,MACA,QACA,MACA,MACA;AACA,QAAM,YAAY,MAAM,OAAO,IAAI,MAAM,IAAI;AAC7C,MAAI,CAAC,aAAa,CAAC,KAAM;AACzB,QAAM,QAAQ,MAAM,GAAG,QAAQ,IAAI,EAAE,MAAM,MAAM,CAAC,CAAa;AAC/D,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,MAAM,MAAM,EAAG;AAC5B,UAAM,QAAQ,GAAG,SAAS,MAAM,KAAK,IAAI,IAAI,IAAI;AACjD,UAAM,KAAK,IAAI,OAAO,QAAQ,OAAO,cAAc,MAAM,IAAI;AAAA,EAC/D;AACF;AAEA,eAAsB,SACpB,IACA,KACA,SACmB;AACnB,QAAM,MAAgB,oBAAI,IAAI;AAC9B,aAAW,UAAU,QAAS,OAAM,KAAK,IAAI,QAAQ,KAAK,OAAO,IAAI,GAAG,QAAQ,MAAM,GAAG;AACzF,SAAO;AACT;AAEO,SAAS,YAAY,QAAkB,OAA2B;AACvE,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,QAAQ,CAAC,SAAiB;AAC9B,YAAQ,IAAI,IAAI;AAChB,YAAQ,IAAI,QAAQ,IAAI,CAAC;AAAA,EAC3B;AACA,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO;AACjC,QAAI,CAAC,OAAO,IAAI,IAAI,EAAG,OAAM,IAAI;AAAA,aACxB,OAAO,IAAI,IAAI,MAAM,MAAO,SAAQ,IAAI,IAAI;AAAA,EACvD;AACA,aAAW,QAAQ,OAAO,KAAK,EAAG,KAAI,CAAC,MAAM,IAAI,IAAI,EAAG,OAAM,IAAI;AAClE,SAAO,CAAC,GAAG,OAAO;AACpB;AAMA,eAAsB,UACpB,IACA,KACA,SACA,UACA,UAAuB,CAAC,GACF;AACtB,MAAI,UAAU,MAAM,SAAS,IAAI,KAAK,OAAO;AAC7C,MAAI,OAAO;AACX,MAAI,UAAU,QAAQ,QAAQ;AAC9B,QAAM,OAAO,YAAY;AACvB,UAAM,OAAO,MAAM,SAAS,IAAI,KAAK,OAAO;AAC5C,UAAM,QAAQ,YAAY,SAAS,IAAI;AACvC,cAAU;AACV,QAAI,QAAQ,MAAM,SAAS,EAAG,UAAS,EAAE,MAAM,CAAC;AAAA,EAClD;AACA,QAAM,QAAQ,YAAY,MAAM;AAC9B,cAAU,QAAQ,KAAK,IAAI;AAAA,EAC7B,GAAG,QAAQ,cAAc,GAAG;AAC5B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM,UAAmB;AAC7B,aAAO;AACP,oBAAc,KAAK;AACnB,YAAM;AAAA,IACR;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { attachKernel } from "@ai-ecoverse/slicc-kernel";
|
|
2
|
+
import { createRegistry } from "@earendil-works/pi-durable";
|
|
3
|
+
import { CodingTools } from "@earendil-works/pi-durable/tools";
|
|
4
|
+
import { openAgent } from "./agent.js";
|
|
5
|
+
import { EncryptedCredentialStore } from "./credentials.js";
|
|
6
|
+
import { hostAgent } from "./host.js";
|
|
7
|
+
import { kernelEnvironment } from "./kernel/env.js";
|
|
8
|
+
import { transportFetch } from "./net.js";
|
|
9
|
+
import { SliccPrompt } from "./prompt.js";
|
|
10
|
+
import {
|
|
11
|
+
createAgentSettings,
|
|
12
|
+
createSliccModels,
|
|
13
|
+
DEFAULT_MODEL,
|
|
14
|
+
sliccProviders
|
|
15
|
+
} from "./settings.js";
|
|
16
|
+
import { openOpfsSqliteStorage } from "./sqlite.js";
|
|
17
|
+
import { kernelPort, serveConnections } from "./worker.js";
|
|
18
|
+
async function start(scope, port, options) {
|
|
19
|
+
const attach = options.attach ?? attachKernel;
|
|
20
|
+
const client = await attach(await port);
|
|
21
|
+
scope.fetch = transportFetch(client.transport, scope.location.origin, scope.fetch.bind(scope));
|
|
22
|
+
const credentials = await (options.credentials ?? (() => EncryptedCredentialStore.open()))();
|
|
23
|
+
const providers = options.providers ?? sliccProviders();
|
|
24
|
+
const models = createSliccModels(credentials, providers);
|
|
25
|
+
const registry = createRegistry();
|
|
26
|
+
registry.install(CodingTools);
|
|
27
|
+
registry.install(SliccPrompt);
|
|
28
|
+
const agent = await openAgent({
|
|
29
|
+
models,
|
|
30
|
+
model: options.model ?? DEFAULT_MODEL,
|
|
31
|
+
storage: await (options.storage ?? (() => openOpfsSqliteStorage()))(),
|
|
32
|
+
registry,
|
|
33
|
+
env: kernelEnvironment(client)
|
|
34
|
+
});
|
|
35
|
+
return hostAgent(agent, { settings: await createAgentSettings(models, credentials, providers) });
|
|
36
|
+
}
|
|
37
|
+
function runAgentWorker(scope, options = {}) {
|
|
38
|
+
const host = start(scope, kernelPort(scope), options);
|
|
39
|
+
host.catch(() => void 0);
|
|
40
|
+
serveConnections(scope, host);
|
|
41
|
+
return host;
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
runAgentWorker
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/main.ts"],
|
|
4
|
+
"sourcesContent": ["import { attachKernel } from '@ai-ecoverse/slicc-kernel';\nimport type { CredentialStore, Provider } from '@earendil-works/pi-ai';\nimport { createRegistry, type ModelRef, type Storage } from '@earendil-works/pi-durable';\nimport { CodingTools } from '@earendil-works/pi-durable/tools';\nimport { openAgent } from './agent.ts';\nimport { EncryptedCredentialStore } from './credentials.ts';\nimport { type AgentHost, hostAgent } from './host.ts';\nimport type { KernelClient } from './kernel/client.ts';\nimport { kernelEnvironment } from './kernel/env.ts';\nimport { type Transport, transportFetch } from './net.ts';\nimport { SliccPrompt } from './prompt.ts';\nimport {\n createAgentSettings,\n createSliccModels,\n DEFAULT_MODEL,\n sliccProviders,\n} from './settings.ts';\nimport { openOpfsSqliteStorage } from './sqlite.ts';\nimport { kernelPort, 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 credentials?: () => Promise<CredentialStore>;\n storage?: () => Promise<Storage>;\n}\n\nasync function start(\n scope: AgentWorkerScope,\n port: Promise<MessagePort>,\n options: AgentWorkerOptions\n): Promise<AgentHost> {\n const attach: KernelAttach = options.attach ?? attachKernel;\n const client = await attach(await port);\n scope.fetch = transportFetch(client.transport, scope.location.origin, scope.fetch.bind(scope));\n const credentials = await (options.credentials ?? (() => EncryptedCredentialStore.open()))();\n const providers = options.providers ?? sliccProviders();\n const models = createSliccModels(credentials, providers);\n const registry = createRegistry();\n registry.install(CodingTools);\n registry.install(SliccPrompt);\n const agent = await openAgent({\n models,\n model: options.model ?? DEFAULT_MODEL,\n storage: await (options.storage ?? (() => openOpfsSqliteStorage()))(),\n registry,\n env: kernelEnvironment(client),\n });\n return hostAgent(agent, { settings: await createAgentSettings(models, credentials, providers) });\n}\n\nexport function runAgentWorker(\n scope: AgentWorkerScope,\n options: AgentWorkerOptions = {}\n): Promise<AgentHost> {\n const host = start(scope, kernelPort(scope), options);\n host.catch(() => undefined);\n serveConnections(scope, host);\n return host;\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,oBAAoB;AAE7B,SAAS,sBAAmD;AAC5D,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB;AAC1B,SAAS,gCAAgC;AACzC,SAAyB,iBAAiB;AAE1C,SAAS,yBAAyB;AAClC,SAAyB,sBAAsB;AAC/C,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,6BAA6B;AACtC,SAAS,YAAY,wBAA0C;AAiB/D,eAAe,MACb,OACA,MACA,SACoB;AACpB,QAAM,SAAuB,QAAQ,UAAU;AAC/C,QAAM,SAAS,MAAM,OAAO,MAAM,IAAI;AACtC,QAAM,QAAQ,eAAe,OAAO,WAAW,MAAM,SAAS,QAAQ,MAAM,MAAM,KAAK,KAAK,CAAC;AAC7F,QAAM,cAAc,OAAO,QAAQ,gBAAgB,MAAM,yBAAyB,KAAK,IAAI;AAC3F,QAAM,YAAY,QAAQ,aAAa,eAAe;AACtD,QAAM,SAAS,kBAAkB,aAAa,SAAS;AACvD,QAAM,WAAW,eAAe;AAChC,WAAS,QAAQ,WAAW;AAC5B,WAAS,QAAQ,WAAW;AAC5B,QAAM,QAAQ,MAAM,UAAU;AAAA,IAC5B;AAAA,IACA,OAAO,QAAQ,SAAS;AAAA,IACxB,SAAS,OAAO,QAAQ,YAAY,MAAM,sBAAsB,IAAI;AAAA,IACpE;AAAA,IACA,KAAK,kBAAkB,MAAM;AAAA,EAC/B,CAAC;AACD,SAAO,UAAU,OAAO,EAAE,UAAU,MAAM,oBAAoB,QAAQ,aAAa,SAAS,EAAE,CAAC;AACjG;AAEO,SAAS,eACd,OACA,UAA8B,CAAC,GACX;AACpB,QAAM,OAAO,MAAM,OAAO,WAAW,KAAK,GAAG,OAAO;AACpD,OAAK,MAAM,MAAM,MAAS;AAC1B,mBAAiB,OAAO,IAAI;AAC5B,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/net.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const empty = /* @__PURE__ */ new Set([101, 103, 204, 205, 304]);
|
|
2
|
+
function stream(body) {
|
|
3
|
+
const iterator = body[Symbol.asyncIterator]();
|
|
4
|
+
return new ReadableStream({
|
|
5
|
+
async pull(controller) {
|
|
6
|
+
const next = await iterator.next();
|
|
7
|
+
if (next.done) controller.close();
|
|
8
|
+
else controller.enqueue(next.value);
|
|
9
|
+
},
|
|
10
|
+
async cancel() {
|
|
11
|
+
await iterator.return?.();
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function transportFetch(transport, origin, native = globalThis.fetch.bind(globalThis)) {
|
|
16
|
+
return async (input, init) => {
|
|
17
|
+
const request = new Request(input, init);
|
|
18
|
+
if (new URL(request.url).origin === origin || transport.traits?.crossOrigin === "cors") {
|
|
19
|
+
return native(request);
|
|
20
|
+
}
|
|
21
|
+
const body = ["GET", "HEAD"].includes(request.method) ? void 0 : new Uint8Array(await request.arrayBuffer());
|
|
22
|
+
const response = await transport.fetch({
|
|
23
|
+
url: request.url,
|
|
24
|
+
method: request.method,
|
|
25
|
+
headers: [...request.headers],
|
|
26
|
+
...body ? { body } : {},
|
|
27
|
+
signal: request.signal
|
|
28
|
+
});
|
|
29
|
+
return new Response(empty.has(response.status) ? null : stream(response.body), {
|
|
30
|
+
status: response.status,
|
|
31
|
+
statusText: response.statusText ?? "",
|
|
32
|
+
headers: response.headers
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
transportFetch
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=net.js.map
|
package/dist/net.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/net.ts"],
|
|
4
|
+
"sourcesContent": ["export interface TransportResponse {\n status: number;\n statusText?: string;\n headers: HeadersInit;\n body: AsyncIterable<Uint8Array>;\n}\n\nexport interface Transport {\n traits?: { crossOrigin?: 'cors' | 'any' };\n fetch(request: {\n url: string;\n method: string;\n headers: [string, string][];\n body?: Uint8Array;\n signal?: AbortSignal;\n }): Promise<TransportResponse>;\n}\n\nconst empty = new Set([101, 103, 204, 205, 304]);\n\nfunction stream(body: AsyncIterable<Uint8Array>): ReadableStream<Uint8Array> {\n const iterator = body[Symbol.asyncIterator]();\n return new ReadableStream({\n async pull(controller) {\n const next = await iterator.next();\n if (next.done) controller.close();\n else controller.enqueue(next.value);\n },\n async cancel() {\n await iterator.return?.();\n },\n });\n}\n\nexport function transportFetch(\n transport: Transport,\n origin: string,\n native: typeof fetch = globalThis.fetch.bind(globalThis)\n): typeof fetch {\n return async (input, init) => {\n const request = new Request(input, init);\n if (new URL(request.url).origin === origin || transport.traits?.crossOrigin === 'cors') {\n return native(request);\n }\n const body = ['GET', 'HEAD'].includes(request.method)\n ? undefined\n : new Uint8Array(await request.arrayBuffer());\n const response = await transport.fetch({\n url: request.url,\n method: request.method,\n headers: [...request.headers],\n ...(body ? { body } : {}),\n signal: request.signal,\n });\n return new Response(empty.has(response.status) ? null : stream(response.body), {\n status: response.status,\n statusText: response.statusText ?? '',\n headers: response.headers,\n });\n };\n}\n"],
|
|
5
|
+
"mappings": "AAkBA,MAAM,QAAQ,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAE/C,SAAS,OAAO,MAA6D;AAC3E,QAAM,WAAW,KAAK,OAAO,aAAa,EAAE;AAC5C,SAAO,IAAI,eAAe;AAAA,IACxB,MAAM,KAAK,YAAY;AACrB,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAI,KAAK,KAAM,YAAW,MAAM;AAAA,UAC3B,YAAW,QAAQ,KAAK,KAAK;AAAA,IACpC;AAAA,IACA,MAAM,SAAS;AACb,YAAM,SAAS,SAAS;AAAA,IAC1B;AAAA,EACF,CAAC;AACH;AAEO,SAAS,eACd,WACA,QACA,SAAuB,WAAW,MAAM,KAAK,UAAU,GACzC;AACd,SAAO,OAAO,OAAO,SAAS;AAC5B,UAAM,UAAU,IAAI,QAAQ,OAAO,IAAI;AACvC,QAAI,IAAI,IAAI,QAAQ,GAAG,EAAE,WAAW,UAAU,UAAU,QAAQ,gBAAgB,QAAQ;AACtF,aAAO,OAAO,OAAO;AAAA,IACvB;AACA,UAAM,OAAO,CAAC,OAAO,MAAM,EAAE,SAAS,QAAQ,MAAM,IAChD,SACA,IAAI,WAAW,MAAM,QAAQ,YAAY,CAAC;AAC9C,UAAM,WAAW,MAAM,UAAU,MAAM;AAAA,MACrC,KAAK,QAAQ;AAAA,MACb,QAAQ,QAAQ;AAAA,MAChB,SAAS,CAAC,GAAG,QAAQ,OAAO;AAAA,MAC5B,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACvB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,WAAO,IAAI,SAAS,MAAM,IAAI,SAAS,MAAM,IAAI,OAAO,OAAO,SAAS,IAAI,GAAG;AAAA,MAC7E,QAAQ,SAAS;AAAA,MACjB,YAAY,SAAS,cAAc;AAAA,MACnC,SAAS,SAAS;AAAA,IACpB,CAAC;AAAA,EACH;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/owner.js
CHANGED
|
@@ -4,26 +4,49 @@ const AGENT_LOCK = "slicc-agent";
|
|
|
4
4
|
async function startAgent(options) {
|
|
5
5
|
const release = await holdLock(options.locks ?? navigator.locks, AGENT_LOCK);
|
|
6
6
|
const channel = options.channel ?? (() => new MessageChannel());
|
|
7
|
-
|
|
7
|
+
const spawn = async () => {
|
|
8
|
+
const created = options.worker();
|
|
9
|
+
try {
|
|
10
|
+
if (options.kernel) {
|
|
11
|
+
const port = await options.kernel.connect();
|
|
12
|
+
created.postMessage({ kernel: port }, [port]);
|
|
13
|
+
}
|
|
14
|
+
} catch (error) {
|
|
15
|
+
created.terminate();
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
return created;
|
|
19
|
+
};
|
|
20
|
+
let worker = Promise.resolve().then(spawn);
|
|
8
21
|
try {
|
|
9
|
-
|
|
22
|
+
await worker;
|
|
10
23
|
} catch (error) {
|
|
11
24
|
release();
|
|
12
25
|
throw error;
|
|
13
26
|
}
|
|
14
27
|
return {
|
|
15
|
-
connect() {
|
|
28
|
+
async connect() {
|
|
29
|
+
const ready = await worker;
|
|
30
|
+
if (!ready) throw new Error("the agent was released");
|
|
16
31
|
const { port1, port2 } = channel();
|
|
17
|
-
|
|
32
|
+
ready.postMessage({ connect: port2 }, [port2]);
|
|
18
33
|
return connectAgent(port1);
|
|
19
34
|
},
|
|
20
35
|
restart() {
|
|
21
|
-
worker.
|
|
22
|
-
|
|
36
|
+
worker = worker.catch(() => void 0).then((old) => {
|
|
37
|
+
old?.terminate();
|
|
38
|
+
return spawn();
|
|
39
|
+
});
|
|
40
|
+
return worker.then(() => void 0);
|
|
23
41
|
},
|
|
24
|
-
release() {
|
|
25
|
-
worker
|
|
26
|
-
|
|
42
|
+
async release() {
|
|
43
|
+
const previous = worker;
|
|
44
|
+
worker = Promise.resolve(void 0);
|
|
45
|
+
try {
|
|
46
|
+
(await previous.catch(() => void 0))?.terminate();
|
|
47
|
+
} finally {
|
|
48
|
+
release();
|
|
49
|
+
}
|
|
27
50
|
}
|
|
28
51
|
};
|
|
29
52
|
}
|
package/dist/owner.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/owner.ts"],
|
|
4
|
-
"sourcesContent": ["import { type AgentConnection, connectAgent } from './client.ts';\nimport { holdLock } from './opfs-pool.ts';\nimport type { PortEndpoint } from './wire.ts';\n\nexport const AGENT_LOCK = 'slicc-agent';\n\nexport interface AgentWorker {\n postMessage(message: unknown, transfer: Transferable[]): void;\n terminate(): void;\n}\n\nexport interface AgentOwner {\n connect(): Promise<AgentConnection>;\n restart(): void
|
|
5
|
-
"mappings": "AAAA,SAA+B,oBAAoB;AACnD,SAAS,gBAAgB;AAGlB,MAAM,aAAa;
|
|
4
|
+
"sourcesContent": ["import { type AgentConnection, connectAgent } from './client.ts';\nimport { holdLock } from './opfs-pool.ts';\nimport type { PortEndpoint } from './wire.ts';\n\nexport const AGENT_LOCK = 'slicc-agent';\n\nexport interface AgentWorker {\n postMessage(message: unknown, transfer: Transferable[]): void;\n terminate(): void;\n}\n\nexport interface AgentOwner {\n connect(): Promise<AgentConnection>;\n restart(): Promise<void>;\n release(): Promise<void>;\n}\n\nexport interface KernelSource {\n connect(): Promise<Transferable>;\n}\n\nexport interface OwnerOptions {\n worker: () => AgentWorker;\n kernel?: KernelSource;\n locks?: LockManager;\n channel?: () => { port1: PortEndpoint; port2: Transferable };\n}\n\nexport async function startAgent(options: OwnerOptions): Promise<AgentOwner> {\n const release = await holdLock(options.locks ?? navigator.locks, AGENT_LOCK);\n const channel = options.channel ?? (() => new MessageChannel());\n const spawn = async (): Promise<AgentWorker> => {\n const created = options.worker();\n try {\n if (options.kernel) {\n const port = await options.kernel.connect();\n created.postMessage({ kernel: port }, [port]);\n }\n } catch (error) {\n created.terminate();\n throw error;\n }\n return created;\n };\n let worker: Promise<AgentWorker | undefined> = Promise.resolve().then(spawn);\n try {\n await worker;\n } catch (error) {\n release();\n throw error;\n }\n return {\n async connect() {\n const ready = await worker;\n if (!ready) throw new Error('the agent was released');\n const { port1, port2 } = channel();\n ready.postMessage({ connect: port2 }, [port2]);\n return connectAgent(port1);\n },\n restart() {\n worker = worker\n .catch(() => undefined)\n .then((old) => {\n old?.terminate();\n return spawn();\n });\n return worker.then(() => undefined);\n },\n async release() {\n const previous = worker;\n worker = Promise.resolve(undefined);\n try {\n (await previous.catch(() => undefined))?.terminate();\n } finally {\n release();\n }\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAA+B,oBAAoB;AACnD,SAAS,gBAAgB;AAGlB,MAAM,aAAa;AAwB1B,eAAsB,WAAW,SAA4C;AAC3E,QAAM,UAAU,MAAM,SAAS,QAAQ,SAAS,UAAU,OAAO,UAAU;AAC3E,QAAM,UAAU,QAAQ,YAAY,MAAM,IAAI,eAAe;AAC7D,QAAM,QAAQ,YAAkC;AAC9C,UAAM,UAAU,QAAQ,OAAO;AAC/B,QAAI;AACF,UAAI,QAAQ,QAAQ;AAClB,cAAM,OAAO,MAAM,QAAQ,OAAO,QAAQ;AAC1C,gBAAQ,YAAY,EAAE,QAAQ,KAAK,GAAG,CAAC,IAAI,CAAC;AAAA,MAC9C;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,UAAU;AAClB,YAAM;AAAA,IACR;AACA,WAAO;AAAA,EACT;AACA,MAAI,SAA2C,QAAQ,QAAQ,EAAE,KAAK,KAAK;AAC3E,MAAI;AACF,UAAM;AAAA,EACR,SAAS,OAAO;AACd,YAAQ;AACR,UAAM;AAAA,EACR;AACA,SAAO;AAAA,IACL,MAAM,UAAU;AACd,YAAM,QAAQ,MAAM;AACpB,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,wBAAwB;AACpD,YAAM,EAAE,OAAO,MAAM,IAAI,QAAQ;AACjC,YAAM,YAAY,EAAE,SAAS,MAAM,GAAG,CAAC,KAAK,CAAC;AAC7C,aAAO,aAAa,KAAK;AAAA,IAC3B;AAAA,IACA,UAAU;AACR,eAAS,OACN,MAAM,MAAM,MAAS,EACrB,KAAK,CAAC,QAAQ;AACb,aAAK,UAAU;AACf,eAAO,MAAM;AAAA,MACf,CAAC;AACH,aAAO,OAAO,KAAK,MAAM,MAAS;AAAA,IACpC;AAAA,IACA,MAAM,UAAU;AACd,YAAM,WAAW;AACjB,eAAS,QAAQ,QAAQ,MAAS;AAClC,UAAI;AACF,SAAC,MAAM,SAAS,MAAM,MAAM,MAAS,IAAI,UAAU;AAAA,MACrD,UAAE;AACA,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/prompt.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { defineExtension, section } from "@earendil-works/pi-durable";
|
|
2
|
+
const PREAMBLE = [
|
|
3
|
+
"You are sliccy, the agent of SLICC. You run in a worker inside the user\u2019s browser tab.",
|
|
4
|
+
"Your tools work on slicc-kernel: bash and coreutils compiled to WebAssembly, on the browser\u2019s private file system.",
|
|
5
|
+
"The user can watch and stop your processes from a terminal next to this chat.",
|
|
6
|
+
"Be brief, do the work with your tools, and say what you changed."
|
|
7
|
+
].join("\n");
|
|
8
|
+
const SliccPrompt = defineExtension({
|
|
9
|
+
name: "slicc",
|
|
10
|
+
sections: [
|
|
11
|
+
section("preamble", () => PREAMBLE, { tag: false }),
|
|
12
|
+
section("cwd", (input) => input.env?.cwd)
|
|
13
|
+
]
|
|
14
|
+
});
|
|
15
|
+
export {
|
|
16
|
+
SliccPrompt
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/prompt.ts"],
|
|
4
|
+
"sourcesContent": ["import { defineExtension, section } from '@earendil-works/pi-durable';\n\nconst PREAMBLE = [\n 'You are sliccy, the agent of SLICC. You run in a worker inside the user\u2019s browser tab.',\n 'Your tools work on slicc-kernel: bash and coreutils compiled to WebAssembly, on the browser\u2019s private file system.',\n 'The user can watch and stop your processes from a terminal next to this chat.',\n 'Be brief, do the work with your tools, and say what you changed.',\n].join('\\n');\n\nexport const SliccPrompt = defineExtension({\n name: 'slicc',\n sections: [\n section('preamble', () => PREAMBLE, { tag: false }),\n section('cwd', (input) => input.env?.cwd),\n ],\n});\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,iBAAiB,eAAe;AAEzC,MAAM,WAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEJ,MAAM,cAAc,gBAAgB;AAAA,EACzC,MAAM;AAAA,EACN,UAAU;AAAA,IACR,QAAQ,YAAY,MAAM,UAAU,EAAE,KAAK,MAAM,CAAC;AAAA,IAClD,QAAQ,OAAO,CAAC,UAAU,MAAM,KAAK,GAAG;AAAA,EAC1C;AACF,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/settings.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineService,
|
|
3
|
+
replicatedState
|
|
4
|
+
} from "@earendil-works/chord";
|
|
5
|
+
import { createModels } from "@earendil-works/pi-ai/models";
|
|
6
|
+
import { amazonBedrockProvider } from "@earendil-works/pi-ai/providers/amazon-bedrock";
|
|
7
|
+
const BEDROCK = "amazon-bedrock";
|
|
8
|
+
const DEFAULT_MODEL = { provider: BEDROCK, modelId: "us.anthropic.claude-sonnet-5-5" };
|
|
9
|
+
const AgentSettings = defineService("slicc.agent.settings");
|
|
10
|
+
const corsFree = /* @__PURE__ */ new Set([BEDROCK]);
|
|
11
|
+
function sliccProviders() {
|
|
12
|
+
return [amazonBedrockProvider()];
|
|
13
|
+
}
|
|
14
|
+
function createSliccModels(credentials, providers = sliccProviders()) {
|
|
15
|
+
const models = createModels({ credentials });
|
|
16
|
+
for (const provider of providers) models.setProvider(provider);
|
|
17
|
+
return models;
|
|
18
|
+
}
|
|
19
|
+
function choices(models, providers) {
|
|
20
|
+
return providers.flatMap(
|
|
21
|
+
(provider) => models.getModels(provider.id).map((model) => ({
|
|
22
|
+
id: `${provider.id}/${model.id}`,
|
|
23
|
+
label: model.name,
|
|
24
|
+
provider: provider.name ?? provider.id,
|
|
25
|
+
kind: "chat",
|
|
26
|
+
reasoning: Boolean(model.reasoning),
|
|
27
|
+
contextWindow: model.contextWindow
|
|
28
|
+
}))
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
async function accounts(credentials, providers) {
|
|
32
|
+
const stored = new Set((await credentials.list()).map((info) => info.providerId));
|
|
33
|
+
return providers.map((provider) => ({
|
|
34
|
+
id: provider.id,
|
|
35
|
+
provider: provider.name ?? provider.id,
|
|
36
|
+
identity: stored.has(provider.id) ? "API key" : "",
|
|
37
|
+
status: stored.has(provider.id) ? "connected" : "disconnected",
|
|
38
|
+
auth: "api-key",
|
|
39
|
+
needs: corsFree.has(provider.id) ? "cors-free-transport" : null
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
async function createAgentSettings(models, credentials, providers = sliccProviders()) {
|
|
43
|
+
const state = replicatedState({
|
|
44
|
+
models: choices(models, providers),
|
|
45
|
+
accounts: await accounts(credentials, providers)
|
|
46
|
+
});
|
|
47
|
+
const refresh = async (context) => {
|
|
48
|
+
state.replace(context, {
|
|
49
|
+
models: choices(models, providers),
|
|
50
|
+
accounts: await accounts(credentials, providers)
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
return {
|
|
54
|
+
state,
|
|
55
|
+
async connect(providerId, secret, region, context) {
|
|
56
|
+
await credentials.modify(providerId, async () => ({
|
|
57
|
+
type: "api_key",
|
|
58
|
+
key: secret,
|
|
59
|
+
...region ? { env: { AWS_REGION: region } } : {}
|
|
60
|
+
}));
|
|
61
|
+
await refresh(context);
|
|
62
|
+
},
|
|
63
|
+
async disconnect(providerId, context) {
|
|
64
|
+
await credentials.delete(providerId);
|
|
65
|
+
await refresh(context);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
AgentSettings,
|
|
71
|
+
BEDROCK,
|
|
72
|
+
DEFAULT_MODEL,
|
|
73
|
+
createAgentSettings,
|
|
74
|
+
createSliccModels,
|
|
75
|
+
sliccProviders
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/settings.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type Context,\n defineService,\n type ReplicatedState,\n replicatedState,\n} from '@earendil-works/chord';\nimport type { CredentialStore, Provider } from '@earendil-works/pi-ai';\nimport { createModels, type MutableModels } from '@earendil-works/pi-ai/models';\nimport { amazonBedrockProvider } from '@earendil-works/pi-ai/providers/amazon-bedrock';\n\nexport const BEDROCK = 'amazon-bedrock';\nexport const DEFAULT_MODEL = { provider: BEDROCK, modelId: 'us.anthropic.claude-sonnet-5-5' };\n\nexport interface ModelChoice {\n id: string;\n label: string;\n provider: string;\n kind: 'chat' | 'classifier';\n reasoning: boolean;\n contextWindow: number;\n}\n\nexport interface AccountState {\n id: string;\n provider: string;\n identity: string;\n status: 'connected' | 'disconnected';\n auth: 'api-key';\n needs: 'cors-free-transport' | null;\n}\n\nexport interface SettingsState {\n models: ModelChoice[];\n accounts: AccountState[];\n}\n\nexport interface AgentSettings {\n readonly state: ReplicatedState<SettingsState>;\n connect(\n providerId: string,\n secret: string,\n region: string | null,\n context: Context\n ): Promise<void>;\n disconnect(providerId: string, context: Context): Promise<void>;\n}\n\nexport const AgentSettings = defineService<AgentSettings>('slicc.agent.settings');\n\nconst corsFree = new Set([BEDROCK]);\n\nexport function sliccProviders(): Provider[] {\n return [amazonBedrockProvider() as Provider];\n}\n\nexport function createSliccModels(\n credentials: CredentialStore,\n providers = sliccProviders()\n): MutableModels {\n const models = createModels({ credentials });\n for (const provider of providers) models.setProvider(provider);\n return models;\n}\n\nfunction choices(models: MutableModels, providers: Provider[]): ModelChoice[] {\n return providers.flatMap((provider) =>\n models.getModels(provider.id).map((model) => ({\n id: `${provider.id}/${model.id}`,\n label: model.name,\n provider: provider.name ?? provider.id,\n kind: 'chat' as const,\n reasoning: Boolean(model.reasoning),\n contextWindow: model.contextWindow,\n }))\n );\n}\n\nasync function accounts(\n credentials: CredentialStore,\n providers: Provider[]\n): Promise<AccountState[]> {\n const stored = new Set((await credentials.list()).map((info) => info.providerId));\n return providers.map((provider) => ({\n id: provider.id,\n provider: provider.name ?? provider.id,\n identity: stored.has(provider.id) ? 'API key' : '',\n status: stored.has(provider.id) ? 'connected' : 'disconnected',\n auth: 'api-key',\n needs: corsFree.has(provider.id) ? 'cors-free-transport' : null,\n }));\n}\n\nexport async function createAgentSettings(\n models: MutableModels,\n credentials: CredentialStore,\n providers = sliccProviders()\n): Promise<AgentSettings> {\n const state = replicatedState<SettingsState>({\n models: choices(models, providers),\n accounts: await accounts(credentials, providers),\n });\n const refresh = async (context: Context) => {\n state.replace(context, {\n models: choices(models, providers),\n accounts: await accounts(credentials, providers),\n });\n };\n return {\n state,\n async connect(providerId, secret, region, context) {\n await credentials.modify(providerId, async () => ({\n type: 'api_key',\n key: secret,\n ...(region ? { env: { AWS_REGION: region } } : {}),\n }));\n await refresh(context);\n },\n async disconnect(providerId, context) {\n await credentials.delete(providerId);\n await refresh(context);\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EAEE;AAAA,EAEA;AAAA,OACK;AAEP,SAAS,oBAAwC;AACjD,SAAS,6BAA6B;AAE/B,MAAM,UAAU;AAChB,MAAM,gBAAgB,EAAE,UAAU,SAAS,SAAS,iCAAiC;AAoCrF,MAAM,gBAAgB,cAA6B,sBAAsB;AAEhF,MAAM,WAAW,oBAAI,IAAI,CAAC,OAAO,CAAC;AAE3B,SAAS,iBAA6B;AAC3C,SAAO,CAAC,sBAAsB,CAAa;AAC7C;AAEO,SAAS,kBACd,aACA,YAAY,eAAe,GACZ;AACf,QAAM,SAAS,aAAa,EAAE,YAAY,CAAC;AAC3C,aAAW,YAAY,UAAW,QAAO,YAAY,QAAQ;AAC7D,SAAO;AACT;AAEA,SAAS,QAAQ,QAAuB,WAAsC;AAC5E,SAAO,UAAU;AAAA,IAAQ,CAAC,aACxB,OAAO,UAAU,SAAS,EAAE,EAAE,IAAI,CAAC,WAAW;AAAA,MAC5C,IAAI,GAAG,SAAS,EAAE,IAAI,MAAM,EAAE;AAAA,MAC9B,OAAO,MAAM;AAAA,MACb,UAAU,SAAS,QAAQ,SAAS;AAAA,MACpC,MAAM;AAAA,MACN,WAAW,QAAQ,MAAM,SAAS;AAAA,MAClC,eAAe,MAAM;AAAA,IACvB,EAAE;AAAA,EACJ;AACF;AAEA,eAAe,SACb,aACA,WACyB;AACzB,QAAM,SAAS,IAAI,KAAK,MAAM,YAAY,KAAK,GAAG,IAAI,CAAC,SAAS,KAAK,UAAU,CAAC;AAChF,SAAO,UAAU,IAAI,CAAC,cAAc;AAAA,IAClC,IAAI,SAAS;AAAA,IACb,UAAU,SAAS,QAAQ,SAAS;AAAA,IACpC,UAAU,OAAO,IAAI,SAAS,EAAE,IAAI,YAAY;AAAA,IAChD,QAAQ,OAAO,IAAI,SAAS,EAAE,IAAI,cAAc;AAAA,IAChD,MAAM;AAAA,IACN,OAAO,SAAS,IAAI,SAAS,EAAE,IAAI,wBAAwB;AAAA,EAC7D,EAAE;AACJ;AAEA,eAAsB,oBACpB,QACA,aACA,YAAY,eAAe,GACH;AACxB,QAAM,QAAQ,gBAA+B;AAAA,IAC3C,QAAQ,QAAQ,QAAQ,SAAS;AAAA,IACjC,UAAU,MAAM,SAAS,aAAa,SAAS;AAAA,EACjD,CAAC;AACD,QAAM,UAAU,OAAO,YAAqB;AAC1C,UAAM,QAAQ,SAAS;AAAA,MACrB,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACjC,UAAU,MAAM,SAAS,aAAa,SAAS;AAAA,IACjD,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,QAAQ,YAAY,QAAQ,QAAQ,SAAS;AACjD,YAAM,YAAY,OAAO,YAAY,aAAa;AAAA,QAChD,MAAM;AAAA,QACN,KAAK;AAAA,QACL,GAAI,SAAS,EAAE,KAAK,EAAE,YAAY,OAAO,EAAE,IAAI,CAAC;AAAA,MAClD,EAAE;AACF,YAAM,QAAQ,OAAO;AAAA,IACvB;AAAA,IACA,MAAM,WAAW,YAAY,SAAS;AACpC,YAAM,YAAY,OAAO,UAAU;AACnC,YAAM,QAAQ,OAAO;AAAA,IACvB;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/spectrum/index.js
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import { AgentAdapter } from "./agent-port.js";
|
|
2
|
+
import { SettingsAdapter } from "./settings-port.js";
|
|
2
3
|
import { AgentAdapter as AgentAdapter2, CONE } from "./agent-port.js";
|
|
3
4
|
import { assistant, isBusy, queued, textOf, toMessages } from "./messages.js";
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
import { SETTINGS_KEY, SettingsAdapter as SettingsAdapter2 } from "./settings-port.js";
|
|
6
|
+
function createAgentModel(connection, options = {}) {
|
|
7
|
+
const agent = new AgentAdapter(connection);
|
|
8
|
+
return {
|
|
9
|
+
agent,
|
|
10
|
+
settings: new SettingsAdapter(connection.settings, agent, options.storage ?? null)
|
|
11
|
+
};
|
|
6
12
|
}
|
|
7
13
|
export {
|
|
8
14
|
AgentAdapter2 as AgentAdapter,
|
|
9
15
|
CONE,
|
|
16
|
+
SETTINGS_KEY,
|
|
17
|
+
SettingsAdapter2 as SettingsAdapter,
|
|
10
18
|
assistant,
|
|
11
19
|
createAgentModel,
|
|
12
20
|
isBusy,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/spectrum/index.ts"],
|
|
4
|
-
"sourcesContent": ["import type { AgentConnection } from '../client.ts';\nimport { AgentAdapter } from './agent-port.ts';\n\nexport { AgentAdapter, CONE } from './agent-port.ts';\nexport { assistant, isBusy, queued, textOf, toMessages } from './messages.ts';\n\nexport function createAgentModel(connection: AgentConnection): { agent: AgentAdapter } {\n return {
|
|
5
|
-
"mappings": "AACA,SAAS,oBAAoB;
|
|
6
|
-
"names": ["AgentAdapter"]
|
|
4
|
+
"sourcesContent": ["import type { AgentConnection } from '../client.ts';\nimport { AgentAdapter } from './agent-port.ts';\nimport { SettingsAdapter } from './settings-port.ts';\n\nexport { AgentAdapter, CONE } from './agent-port.ts';\nexport { assistant, isBusy, queued, textOf, toMessages } from './messages.ts';\nexport { SETTINGS_KEY, SettingsAdapter } from './settings-port.ts';\n\nexport function createAgentModel(\n connection: AgentConnection,\n options: { storage?: Pick<Storage, 'getItem' | 'setItem'> | null } = {}\n): { agent: AgentAdapter; settings: SettingsAdapter } {\n const agent = new AgentAdapter(connection);\n return {\n agent,\n settings: new SettingsAdapter(connection.settings, agent, options.storage ?? null),\n };\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAEhC,SAAS,gBAAAA,eAAc,YAAY;AACnC,SAAS,WAAW,QAAQ,QAAQ,QAAQ,kBAAkB;AAC9D,SAAS,cAAc,mBAAAC,wBAAuB;AAEvC,SAAS,iBACd,YACA,UAAqE,CAAC,GAClB;AACpD,QAAM,QAAQ,IAAI,aAAa,UAAU;AACzC,SAAO;AAAA,IACL;AAAA,IACA,UAAU,IAAI,gBAAgB,WAAW,UAAU,OAAO,QAAQ,WAAW,IAAI;AAAA,EACnF;AACF;",
|
|
6
|
+
"names": ["AgentAdapter", "SettingsAdapter"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
|
|
2
|
+
import { Emitter } from "./emitter.js";
|
|
3
|
+
const SETTINGS_KEY = "slicc-agent.settings";
|
|
4
|
+
const defaults = {
|
|
5
|
+
color: "system",
|
|
6
|
+
model: "",
|
|
7
|
+
thinking: "off",
|
|
8
|
+
sendOnEnter: true,
|
|
9
|
+
showThinking: false,
|
|
10
|
+
diffStyle: "unified"
|
|
11
|
+
};
|
|
12
|
+
class SettingsAdapter extends Emitter {
|
|
13
|
+
#settings;
|
|
14
|
+
#agent;
|
|
15
|
+
#storage;
|
|
16
|
+
#local;
|
|
17
|
+
constructor(settings, agent, storage) {
|
|
18
|
+
super();
|
|
19
|
+
this.#settings = settings;
|
|
20
|
+
this.#agent = agent;
|
|
21
|
+
this.#storage = storage;
|
|
22
|
+
const saved = JSON.parse(storage?.getItem(SETTINGS_KEY) ?? "{}");
|
|
23
|
+
const { model: _model, thinking: _thinking, ...local } = { ...defaults, ...saved };
|
|
24
|
+
this.#local = local;
|
|
25
|
+
settings.state.subscribe(() => {
|
|
26
|
+
this.emit("accounts", this.accounts());
|
|
27
|
+
this.emit("settings", this.get());
|
|
28
|
+
});
|
|
29
|
+
agent.on("agents", () => this.emit("settings", this.get()));
|
|
30
|
+
}
|
|
31
|
+
#state() {
|
|
32
|
+
return this.#settings.state.value ?? { models: [], accounts: [] };
|
|
33
|
+
}
|
|
34
|
+
get() {
|
|
35
|
+
const cone = this.#agent.list()[0];
|
|
36
|
+
return { ...this.#local, model: cone?.model ?? "", thinking: cone?.thinking ?? "off" };
|
|
37
|
+
}
|
|
38
|
+
update(patch) {
|
|
39
|
+
const { model, thinking, ...local } = patch;
|
|
40
|
+
const id = this.#agent.active();
|
|
41
|
+
if (model !== void 0) this.#agent.setModel(id, model);
|
|
42
|
+
if (thinking !== void 0) this.#agent.setThinking(id, thinking);
|
|
43
|
+
this.#local = { ...this.#local, ...local };
|
|
44
|
+
this.#storage?.setItem(SETTINGS_KEY, JSON.stringify(this.#local));
|
|
45
|
+
this.emit("settings", this.get());
|
|
46
|
+
}
|
|
47
|
+
models() {
|
|
48
|
+
return this.#state().models.map(({ id, label, provider, kind, reasoning }) => ({
|
|
49
|
+
id,
|
|
50
|
+
label,
|
|
51
|
+
provider,
|
|
52
|
+
kind,
|
|
53
|
+
reasoning
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
accounts() {
|
|
57
|
+
return this.#state().accounts.map(
|
|
58
|
+
({ needs, ...account }) => needs ? { ...account, needs } : account
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
async connect(id, secret, options = {}) {
|
|
62
|
+
if (!secret) throw new Error(`${id} needs an API key`);
|
|
63
|
+
await this.#settings.connect(id, secret, options.region ?? null, BACKGROUND_CONTEXT);
|
|
64
|
+
}
|
|
65
|
+
disconnect(id) {
|
|
66
|
+
void this.#settings.disconnect(id, BACKGROUND_CONTEXT);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
SETTINGS_KEY,
|
|
71
|
+
SettingsAdapter
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=settings-port.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/spectrum/settings-port.ts"],
|
|
4
|
+
"sourcesContent": ["import type {\n Account,\n ModelOption,\n Settings,\n SettingsEvents,\n SettingsPort,\n} from '@ai-ecoverse/slicc-spectrum/ui';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { AgentSettings, SettingsState } from '../settings.ts';\nimport type { AgentAdapter } from './agent-port.ts';\nimport { Emitter } from './emitter.ts';\n\nexport const SETTINGS_KEY = 'slicc-agent.settings';\n\nconst defaults: Settings = {\n color: 'system',\n model: '',\n thinking: 'off',\n sendOnEnter: true,\n showThinking: false,\n diffStyle: 'unified',\n};\n\ntype Local = Omit<Settings, 'model' | 'thinking'>;\n\nexport class SettingsAdapter extends Emitter<SettingsEvents> implements SettingsPort {\n readonly #settings: AgentSettings;\n readonly #agent: AgentAdapter;\n readonly #storage: Pick<Storage, 'getItem' | 'setItem'> | null;\n #local: Local;\n\n constructor(\n settings: AgentSettings,\n agent: AgentAdapter,\n storage: Pick<Storage, 'getItem' | 'setItem'> | null\n ) {\n super();\n this.#settings = settings;\n this.#agent = agent;\n this.#storage = storage;\n const saved = JSON.parse(storage?.getItem(SETTINGS_KEY) ?? '{}') as Partial<Local>;\n const { model: _model, thinking: _thinking, ...local } = { ...defaults, ...saved };\n this.#local = local;\n settings.state.subscribe(() => {\n this.emit('accounts', this.accounts());\n this.emit('settings', this.get());\n });\n agent.on('agents', () => this.emit('settings', this.get()));\n }\n\n #state(): SettingsState {\n return this.#settings.state.value ?? { models: [], accounts: [] };\n }\n\n get(): Settings {\n const cone = this.#agent.list()[0];\n return { ...this.#local, model: cone?.model ?? '', thinking: cone?.thinking ?? 'off' };\n }\n\n update(patch: Partial<Settings>): void {\n const { model, thinking, ...local } = patch;\n const id = this.#agent.active();\n if (model !== undefined) this.#agent.setModel(id, model);\n if (thinking !== undefined) this.#agent.setThinking(id, thinking);\n this.#local = { ...this.#local, ...local };\n this.#storage?.setItem(SETTINGS_KEY, JSON.stringify(this.#local));\n this.emit('settings', this.get());\n }\n\n models(): readonly ModelOption[] {\n return this.#state().models.map(({ id, label, provider, kind, reasoning }) => ({\n id,\n label,\n provider,\n kind,\n reasoning,\n }));\n }\n\n accounts(): readonly Account[] {\n return this.#state().accounts.map(({ needs, ...account }) =>\n needs ? { ...account, needs } : account\n );\n }\n\n async connect(id: string, secret?: string, options: { region?: string } = {}): Promise<void> {\n if (!secret) throw new Error(`${id} needs an API key`);\n await this.#settings.connect(id, secret, options.region ?? null, BACKGROUND_CONTEXT);\n }\n\n disconnect(id: string): void {\n void this.#settings.disconnect(id, BACKGROUND_CONTEXT);\n }\n}\n"],
|
|
5
|
+
"mappings": "AAOA,SAAS,0BAA0B;AAGnC,SAAS,eAAe;AAEjB,MAAM,eAAe;AAE5B,MAAM,WAAqB;AAAA,EACzB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA,EACd,WAAW;AACb;AAIO,MAAM,wBAAwB,QAAgD;AAAA,EAC1E;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EAEA,YACE,UACA,OACA,SACA;AACA,UAAM;AACN,SAAK,YAAY;AACjB,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,UAAM,QAAQ,KAAK,MAAM,SAAS,QAAQ,YAAY,KAAK,IAAI;AAC/D,UAAM,EAAE,OAAO,QAAQ,UAAU,WAAW,GAAG,MAAM,IAAI,EAAE,GAAG,UAAU,GAAG,MAAM;AACjF,SAAK,SAAS;AACd,aAAS,MAAM,UAAU,MAAM;AAC7B,WAAK,KAAK,YAAY,KAAK,SAAS,CAAC;AACrC,WAAK,KAAK,YAAY,KAAK,IAAI,CAAC;AAAA,IAClC,CAAC;AACD,UAAM,GAAG,UAAU,MAAM,KAAK,KAAK,YAAY,KAAK,IAAI,CAAC,CAAC;AAAA,EAC5D;AAAA,EAEA,SAAwB;AACtB,WAAO,KAAK,UAAU,MAAM,SAAS,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EAClE;AAAA,EAEA,MAAgB;AACd,UAAM,OAAO,KAAK,OAAO,KAAK,EAAE,CAAC;AACjC,WAAO,EAAE,GAAG,KAAK,QAAQ,OAAO,MAAM,SAAS,IAAI,UAAU,MAAM,YAAY,MAAM;AAAA,EACvF;AAAA,EAEA,OAAO,OAAgC;AACrC,UAAM,EAAE,OAAO,UAAU,GAAG,MAAM,IAAI;AACtC,UAAM,KAAK,KAAK,OAAO,OAAO;AAC9B,QAAI,UAAU,OAAW,MAAK,OAAO,SAAS,IAAI,KAAK;AACvD,QAAI,aAAa,OAAW,MAAK,OAAO,YAAY,IAAI,QAAQ;AAChE,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,MAAM;AACzC,SAAK,UAAU,QAAQ,cAAc,KAAK,UAAU,KAAK,MAAM,CAAC;AAChE,SAAK,KAAK,YAAY,KAAK,IAAI,CAAC;AAAA,EAClC;AAAA,EAEA,SAAiC;AAC/B,WAAO,KAAK,OAAO,EAAE,OAAO,IAAI,CAAC,EAAE,IAAI,OAAO,UAAU,MAAM,UAAU,OAAO;AAAA,MAC7E;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE;AAAA,EACJ;AAAA,EAEA,WAA+B;AAC7B,WAAO,KAAK,OAAO,EAAE,SAAS;AAAA,MAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,MACrD,QAAQ,EAAE,GAAG,SAAS,MAAM,IAAI;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,IAAY,QAAiB,UAA+B,CAAC,GAAkB;AAC3F,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,GAAG,EAAE,mBAAmB;AACrD,UAAM,KAAK,UAAU,QAAQ,IAAI,QAAQ,QAAQ,UAAU,MAAM,kBAAkB;AAAA,EACrF;AAAA,EAEA,WAAW,IAAkB;AAC3B,SAAK,KAAK,UAAU,WAAW,IAAI,kBAAkB;AAAA,EACvD;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const host: Promise<import("./host.ts").AgentHost>;
|
package/dist/types/agent.d.ts
CHANGED
package/dist/types/client.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { type Context, type ReplicatedState } from '@earendil-works/chord';
|
|
2
2
|
import type { ConversationView } from '@earendil-works/pi-durable';
|
|
3
3
|
import { AgentControl, type SendMode } from './services.ts';
|
|
4
|
+
import { AgentSettings } from './settings.ts';
|
|
4
5
|
import { type PortEndpoint } from './wire.ts';
|
|
5
6
|
export interface AgentConnection {
|
|
6
7
|
readonly serverId: string;
|
|
7
8
|
readonly control: AgentControl;
|
|
8
9
|
readonly transcript: ReplicatedState<ConversationView>;
|
|
10
|
+
readonly settings: AgentSettings;
|
|
9
11
|
prompt(text: string, whenBusy?: SendMode): Promise<string>;
|
|
10
12
|
close(): Promise<void>;
|
|
11
13
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Credential, CredentialInfo, CredentialStore } from '@earendil-works/pi-ai';
|
|
2
|
+
export declare const CREDENTIALS_DATABASE = "slicc-agent-credentials";
|
|
3
|
+
export declare class EncryptedCredentialStore implements CredentialStore {
|
|
4
|
+
#private;
|
|
5
|
+
private constructor();
|
|
6
|
+
static open(name?: string): Promise<EncryptedCredentialStore>;
|
|
7
|
+
read(providerId: string): Promise<Credential | undefined>;
|
|
8
|
+
list(): Promise<readonly CredentialInfo[]>;
|
|
9
|
+
modify(providerId: string, fn: (current: Credential | undefined) => Promise<Credential | undefined>): Promise<Credential | undefined>;
|
|
10
|
+
delete(providerId: string): Promise<void>;
|
|
11
|
+
close(): void;
|
|
12
|
+
}
|
package/dist/types/host.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Context } from '@earendil-works/chord';
|
|
2
2
|
import type { Agent } from './agent.ts';
|
|
3
|
+
import { AgentSettings } from './settings.ts';
|
|
3
4
|
import { type PortEndpoint } from './wire.ts';
|
|
4
5
|
export interface AgentHost {
|
|
5
6
|
readonly serverId: string;
|
|
@@ -10,4 +11,5 @@ export interface AgentHost {
|
|
|
10
11
|
export declare function hostAgent(agent: Agent, options?: {
|
|
11
12
|
serverId?: string;
|
|
12
13
|
context?: Context;
|
|
14
|
+
settings?: AgentSettings;
|
|
13
15
|
}): Promise<AgentHost>;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
export { type Agent, type AgentOptions, answerText, openAgent } from './agent.ts';
|
|
2
2
|
export { type AgentConnection, connectAgent } from './client.ts';
|
|
3
3
|
export { createAgentControl } from './control.ts';
|
|
4
|
+
export { CREDENTIALS_DATABASE, EncryptedCredentialStore } from './credentials.ts';
|
|
4
5
|
export { type AgentHost, hostAgent } from './host.ts';
|
|
6
|
+
export type { KernelClient, KernelFs, KernelProcess, KernelStat, SpawnOptions, } from './kernel/client.ts';
|
|
7
|
+
export { HOME, type KernelEnvOptions, kernelEnvironment, SliccKernelEnv } from './kernel/env.ts';
|
|
8
|
+
export { type AgentWorkerOptions, type AgentWorkerScope, type KernelAttach, runAgentWorker, } from './main.ts';
|
|
9
|
+
export { type Transport, type TransportResponse, transportFetch } from './net.ts';
|
|
5
10
|
export { AGENT_LOCK, type AgentOwner, type AgentWorker, type OwnerOptions, startAgent, } from './owner.ts';
|
|
11
|
+
export { SliccPrompt } from './prompt.ts';
|
|
6
12
|
export { AGENT_SESSION, AgentControl, AgentSessions, type AgentSettingsChange, AgentTranscript, type OperationError, type PromptResult, type SendMode, type SendRequest, type SendResponse, } from './services.ts';
|
|
13
|
+
export { type AccountState, AgentSettings, BEDROCK, createAgentSettings, createSliccModels, DEFAULT_MODEL, type ModelChoice, type SettingsState, sliccProviders, } from './settings.ts';
|
|
7
14
|
export { AGENT_DIRECTORY, type OpfsSqliteOptions, openMemorySqliteStorage, openOpfsSqliteStorage, WasmSqliteDatabase, } from './sqlite.ts';
|
|
8
15
|
export { PortChannel, type PortEndpoint, PortListener, withUnrefTimers } from './wire.ts';
|
|
9
|
-
export { serveConnections, type WorkerScope } from './worker.ts';
|
|
16
|
+
export { kernelPort, serveConnections, type WorkerScope } from './worker.ts';
|