@ai-ecoverse/slicc-agent 3.50.0 → 3.50.2
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 +6 -2
- package/dist/adobe.js +43 -13
- package/dist/adobe.js.map +2 -2
- package/dist/context.js +47 -0
- package/dist/context.js.map +7 -0
- package/dist/index.js +9 -1
- package/dist/index.js.map +2 -2
- package/dist/main.js +9 -3
- package/dist/main.js.map +2 -2
- package/dist/monitor/index.js +2 -8
- package/dist/monitor/index.js.map +2 -2
- package/dist/settings.js +9 -5
- package/dist/settings.js.map +2 -2
- package/dist/spectrum/agent-port.js +48 -14
- package/dist/spectrum/agent-port.js.map +2 -2
- package/dist/spectrum/messages.js +16 -2
- package/dist/spectrum/messages.js.map +2 -2
- package/dist/spectrum/monitor-port.js +6 -7
- package/dist/spectrum/monitor-port.js.map +2 -2
- package/dist/types/adobe.d.ts +13 -4
- package/dist/types/context.d.ts +4 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/settings.d.ts +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -135,7 +135,7 @@ const owner = await startAgent({
|
|
|
135
135
|
|
|
136
136
|
**Providers.** The first provider is AWS Bedrock with a Bedrock API key as the bearer token; the default model is `us.anthropic.claude-sonnet-5-5`. Requests go to `us-west-2` unless the stored credential names another region (`AWS_REGION`, set by `connect`'s `region`). The default applies when the credential is read, so keys stored earlier get it too. The settings UI has no region field yet. Bedrock sends no CORS headers, so it needs a CORS-free transport, and its account says so (`needs: 'cors-free-transport'`).
|
|
137
137
|
|
|
138
|
-
**Adobe.** `adobeProvider()` reaches Adobe's LLM proxy (`ADOBE_PROXY`) with the user's IMS token as a bearer. Its models come from the proxy's `/v1/config` once a token is stored: Anthropic-style models go through pi-ai's `anthropic-messages` API at the proxy root, `api: 'openai'` models through `openai-completions` under `/v1`, and hidden ones are skipped. Every request carries an `X-Session-Id` that is fixed for the worker. The account is a sign-in (`auth: 'oauth'`): `AgentSettings.signIn('adobe')` returns the IMS `clientId`, `scopes` and `imsEnvironment` from `/v1/config`, fetched in the worker through the transport. The page runs the IMS popup and passes the token to `connect`, so `createAgentModel(connection, { login })` takes a `login(providerId, signIn, { signal })` that returns a token. While it runs, the account shows as `signing-in` (spectrum ≥ 1.34.0), and `SettingsPort.cancel(id)` aborts the signal; a cancelled sign-in never connects, even if the login resolves late. The adapter calls `login` before anything else in the click's task, so the page can open its popup while it still has the user's gesture, and `signIn()` then fetches the IMS options lazily. The weekly budget from `/v1/usage` is in the settings state as `budget` (refreshed on connect and every five minutes), and the `tray` adapter shows it in spectrum's TrayStatus. Until the proxy allows `*.sliccy.ai` (vibemigration#228), Adobe needs a CORS-free transport like Bedrock. An expired session's error card offers **Log in**.
|
|
138
|
+
**Adobe.** `adobeProvider()` reaches Adobe's LLM proxy (`ADOBE_PROXY`) with the user's IMS token as a bearer. Its models come from the proxy's `/v1/config` once a token is stored: Anthropic-style models go through pi-ai's `anthropic-messages` API at the proxy root, `api: 'openai'` models through `openai-completions` under `/v1`, and hidden ones are skipped. Every request to the proxy (turns on either API, Clef, `/v1/config` and `/v1/usage`) carries an `X-Session-Id` that is fixed for the worker and an `X-Slicc-Version` (slicc-agent's version, `adobeProvider({ session, version })`); the proxy refuses turns without them. They're added where the request is built, over the caller's and the model's headers, because pi-ai 1.0.4 keeps a provider's `headers` but never sends them. The account is a sign-in (`auth: 'oauth'`): `AgentSettings.signIn('adobe')` returns the IMS `clientId`, `scopes` and `imsEnvironment` from `/v1/config`, fetched in the worker through the transport. The page runs the IMS popup and passes the token to `connect`, so `createAgentModel(connection, { login })` takes a `login(providerId, signIn, { signal })` that returns a token. While it runs, the account shows as `signing-in` (spectrum ≥ 1.34.0), and `SettingsPort.cancel(id)` aborts the signal; a cancelled sign-in never connects, even if the login resolves late. The adapter calls `login` before anything else in the click's task, so the page can open its popup while it still has the user's gesture, and `signIn()` then fetches the IMS options lazily. The weekly budget from `/v1/usage` is in the settings state as `budget` (refreshed on connect and every five minutes), and the `tray` adapter shows it in spectrum's TrayStatus. Until the proxy allows `*.sliccy.ai` (vibemigration#228), Adobe needs a CORS-free transport like Bedrock. An expired session's error card (a 401, or a refusal whose type or message says the token is invalid or expired) offers **Log in**; any other refusal, such as a 403 `missing_required_header`, shows the proxy's message, with the HTTP status and error type below it (`403 missing_required_header`) and **Retry**.
|
|
139
139
|
|
|
140
140
|
**Classifiers.** The Adobe provider also registers Cloudflare's Clef classifiers as `adobe/clef` and `adobe/clef-flash` (`adobeClassifiers()`): `type: 'classifier'` models on pi-ai's `cloudflare-workers-ai-system-one` API with `baseUrl: <proxy>/v1/ai`, so `models.classify(model, { state, questions })` posts `{ model: '@cf/cloudflare/clef', input }` to the proxy's `/v1/ai/run` with the IMS token as the bearer. The provider maps its short ids to the Workers AI names, and pi parses the answers and prices the usage ($0.24 per million input tokens for Clef, $0.09 for Clef Flash, nothing for output), which counts against the same weekly budget. They are classifiers only: `models.getModels()`, the settings `models` and the picker list chat models, and `models.getAvailableOfType('classifier', 'adobe')` returns them only while an Adobe token is stored.
|
|
141
141
|
|
|
@@ -160,6 +160,10 @@ The adapter keeps the replicated transcript and maps it on every update. User, a
|
|
|
160
160
|
|
|
161
161
|
Each cone's active conversation is in the session document `slicc.agents` (the root until the first rewind). The host's transcript follows it across forks. Rewinding is refused while the cone itself is running or has queued input, because a fork starts with an empty inbox, but never because its scoops are busy (see Cones and scoops). A background compaction still running on the old branch finishes there. A fork also starts with fresh `pi.usage`. Credential and model errors lead with a plain sentence ("Bedrock rejected the API key.", "This model isn't available with the current account.") and keep the provider's raw error as `detail`, which spectrum (≥ 1.11.0) shows underneath. `busy()` and `queue()` read durable's live and inbox documents. Steering is the default (#4): a send or a steer goes out with `whenBusy: 'steer'`, so while a run is going it joins after the current tool round, and a `queue` send is a follow-up. User messages carry `delivered` from the host's deliveries; entries the host didn't record (from before a reload) count as steered when they follow a tool result. Cones and scoops are below; the freezer and questions come later. Licks show as spectrum's lick cards (below). slicc-spectrum is an optional peer dependency (≥ 1.39.0, whose Freezer shows every conversation with its kind and Open, Thaw and Remove; 1.40.0 also shows each cone's `title`, the Freezer row's title, so same-named cones are told apart), used for types only, so package managers don't install it next to the agent.
|
|
162
162
|
|
|
163
|
+
Each agent in `list()` has a real `contextFill` and `unread`:
|
|
164
|
+
- **`contextFill`** is the context the agent uses, as a share of its model's `contextWindow` from the settings' model list. The tokens are those of the newest assistant's usage after the active head, counted the way pi-ai's `calculateContextTokens` does (`totalTokens`, or input, output and both cache counts). Aborted and failed turns don't count. After a compaction, the kept turns' usage no longer counts. Until the next turn reports its usage, the fill is estimated the way pi does it, at four characters a token, over the summary and the kept entries (without the system prompt and tools). An unknown model also reads 0. The Monitor's "Fullest context" and its context alerts use the same functions (`src/context.ts`).
|
|
165
|
+
- **`unread`** counts the assistant messages an agent finished while it wasn't the tab's `active()` agent. Answers already there when the page opened don't count, but an agent that appears later counts from its first answer. It's counted once the turn is done, and `select(id)` resets it to 0. Each change emits `agents`. It lives in the adapter, so each tab keeps its own, and it isn't stored.
|
|
166
|
+
|
|
163
167
|
Each tool call shows its input in the way that suits it:
|
|
164
168
|
- `bash`: its command, with a timeout as the card's `meta`;
|
|
165
169
|
- `read`: the path, with its line range as `meta`;
|
|
@@ -601,7 +605,7 @@ The agent never holds a secret's value. Values live in the vault (`vault.sliccy.
|
|
|
601
605
|
|
|
602
606
|
## The kernel
|
|
603
607
|
|
|
604
|
-
`@ai-ecoverse/slicc-kernel` is a peer dependency (`>=1.47.1 <2`, the first kernel with users and the H1 wasm commands; until 3.31.0 the floor was 1.26.3): the agent only calls `attachKernel`, the client end of the page kernel's port, so it must match the kernel the page runs. Seven chooses that version: slicc-bios pins the certified kernel next to the agent in `src/packages/agent/package.json`, and pnpm fills the peer from that pin. The devDependency is the lowest certified kernel the range allows (1.47.1), and the unit and integration tests run on it with the H1 wasm commands as devDependencies. A second CI job reruns the integration tests on the newest certified kernel (`NEWEST_CERTIFIED_KERNEL` in `.github/workflows/ci.yml`), with the wasm commands certified for it (`NEWEST_CERTIFIED_WASM`). Today the floor is 1.47.1 and the newest certified kernel 1.
|
|
608
|
+
`@ai-ecoverse/slicc-kernel` is a peer dependency (`>=1.47.1 <2`, the first kernel with users and the H1 wasm commands; until 3.31.0 the floor was 1.26.3): the agent only calls `attachKernel`, the client end of the page kernel's port, so it must match the kernel the page runs. Seven chooses that version: slicc-bios pins the certified kernel next to the agent in `src/packages/agent/package.json`, and pnpm fills the peer from that pin. The devDependency is the lowest certified kernel the range allows (1.47.1), and the unit and integration tests run on it with the H1 wasm commands as devDependencies. A second CI job reruns the integration tests on the newest certified kernel (`NEWEST_CERTIFIED_KERNEL` in `.github/workflows/ci.yml`), with the wasm commands certified for it (`NEWEST_CERTIFIED_WASM`). Today the floor is 1.47.1 and the newest certified kernel 1.81.0; the second job moves by hand to each newer certified kernel, so both ends of the range are tested. If the port protocol ever breaks within 1.x, a patch release narrows the upper bound. Renovate opens PRs for the kernel, `wasi-pnpm`, the `wasm-*` packages and `slicc-cdp` but never merges them, because they move only after the homescoop coordinator certifies them.
|
|
605
609
|
|
|
606
610
|
## Patched dependencies
|
|
607
611
|
|
package/dist/adobe.js
CHANGED
|
@@ -4,6 +4,29 @@ import { openAICompletionsApi } from "@earendil-works/pi-ai/api/openai-completio
|
|
|
4
4
|
import { createProvider } from "@earendil-works/pi-ai/models";
|
|
5
5
|
const ADOBE = "adobe";
|
|
6
6
|
const ADOBE_PROXY = "https://adobe-llm-proxy.paolo-moz.workers.dev";
|
|
7
|
+
const SESSION_HEADER = "X-Session-Id";
|
|
8
|
+
const VERSION_HEADER = "X-Slicc-Version";
|
|
9
|
+
function adobeIdentity({
|
|
10
|
+
session = crypto.randomUUID(),
|
|
11
|
+
version = "unknown"
|
|
12
|
+
} = {}) {
|
|
13
|
+
return { [SESSION_HEADER]: session, [VERSION_HEADER]: version };
|
|
14
|
+
}
|
|
15
|
+
function withAdobeIdentity(identity, headers = {}) {
|
|
16
|
+
const ours = new Set(Object.keys(identity).map((name) => name.toLowerCase()));
|
|
17
|
+
const kept = Object.entries(headers).filter(([name]) => !ours.has(name.toLowerCase()));
|
|
18
|
+
return { ...Object.fromEntries(kept), ...identity };
|
|
19
|
+
}
|
|
20
|
+
function identified(identity, options) {
|
|
21
|
+
return { ...options, headers: withAdobeIdentity(identity, options?.headers) };
|
|
22
|
+
}
|
|
23
|
+
function identifiedApi(api, identity) {
|
|
24
|
+
const calls = Object.entries(api).map(([name, call]) => [
|
|
25
|
+
name,
|
|
26
|
+
(model, input, options) => call(model, input, identified(identity, options))
|
|
27
|
+
]);
|
|
28
|
+
return Object.fromEntries(calls);
|
|
29
|
+
}
|
|
7
30
|
const free = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
|
|
8
31
|
const CLASSIFIER_API = "cloudflare-workers-ai-system-one";
|
|
9
32
|
const WORKERS_AI = "@cf/cloudflare/";
|
|
@@ -30,11 +53,11 @@ function bearer(headers = {}) {
|
|
|
30
53
|
)?.[1];
|
|
31
54
|
return value?.replace(/^Bearer\s+/i, "");
|
|
32
55
|
}
|
|
33
|
-
function clef(fetcher) {
|
|
56
|
+
function clef(fetcher, identity) {
|
|
34
57
|
const transport = cloudflareWorkersAISystemOneApi();
|
|
35
58
|
return {
|
|
36
59
|
classify: (model, context, options = {}) => transport.classify(model, context, {
|
|
37
|
-
...options,
|
|
60
|
+
...identified(identity, options),
|
|
38
61
|
fetch: options.fetch ?? fetcher,
|
|
39
62
|
apiKey: bearer(options.headers) ?? options.apiKey,
|
|
40
63
|
onPayload: async (payload, sent) => {
|
|
@@ -62,19 +85,20 @@ function adobeModel(info, endpoint) {
|
|
|
62
85
|
...openai ? { compat: { supportsStore: false, supportsDeveloperRole: false } } : {}
|
|
63
86
|
};
|
|
64
87
|
}
|
|
65
|
-
async function adobeConfig(endpoint, fetcher) {
|
|
88
|
+
async function adobeConfig(endpoint, fetcher, identity = adobeIdentity()) {
|
|
66
89
|
const response = await fetcher(`${endpoint}/v1/config`, {
|
|
67
|
-
headers: { Accept: "application/json" }
|
|
90
|
+
headers: { Accept: "application/json", ...identity }
|
|
68
91
|
});
|
|
69
92
|
if (!response.ok) throw new Error(`the Adobe proxy answered /v1/config with ${response.status}`);
|
|
70
93
|
return await response.json();
|
|
71
94
|
}
|
|
72
95
|
async function adobeUsage(token, {
|
|
73
96
|
endpoint = ADOBE_PROXY,
|
|
74
|
-
fetch: fetcher = globalThis.fetch
|
|
97
|
+
fetch: fetcher = globalThis.fetch,
|
|
98
|
+
identity = adobeIdentity()
|
|
75
99
|
} = {}) {
|
|
76
100
|
const response = await fetcher(`${endpoint}/v1/usage`, {
|
|
77
|
-
headers: { Accept: "application/json", Authorization: `Bearer ${token}` }
|
|
101
|
+
headers: { Accept: "application/json", ...identity, Authorization: `Bearer ${token}` }
|
|
78
102
|
});
|
|
79
103
|
if (!response.ok) return null;
|
|
80
104
|
const weekly = (await response.json()).usage?.weekly;
|
|
@@ -83,14 +107,16 @@ async function adobeUsage(token, {
|
|
|
83
107
|
}
|
|
84
108
|
function adobeProvider({
|
|
85
109
|
endpoint = ADOBE_PROXY,
|
|
86
|
-
session
|
|
110
|
+
session,
|
|
111
|
+
version,
|
|
87
112
|
fetch: fetcher = (input, init) => globalThis.fetch(input, init)
|
|
88
113
|
} = {}) {
|
|
114
|
+
const identity = adobeIdentity({ session, version });
|
|
89
115
|
return createProvider({
|
|
90
116
|
id: ADOBE,
|
|
91
117
|
name: "Adobe",
|
|
92
118
|
baseUrl: endpoint,
|
|
93
|
-
headers:
|
|
119
|
+
headers: identity,
|
|
94
120
|
auth: {
|
|
95
121
|
apiKey: {
|
|
96
122
|
name: "Adobe IMS",
|
|
@@ -105,22 +131,26 @@ function adobeProvider({
|
|
|
105
131
|
}
|
|
106
132
|
},
|
|
107
133
|
models: adobeClassifiers(endpoint),
|
|
108
|
-
fetchModels: async () => (await adobeConfig(endpoint, fetcher)).models.filter((info) => !info.hidden).map((info) => adobeModel(info, endpoint)),
|
|
134
|
+
fetchModels: async () => (await adobeConfig(endpoint, fetcher, identity)).models.filter((info) => !info.hidden).map((info) => adobeModel(info, endpoint)),
|
|
109
135
|
api: {
|
|
110
|
-
"anthropic-messages": anthropicMessagesApi(),
|
|
111
|
-
"openai-completions": openAICompletionsApi()
|
|
136
|
+
"anthropic-messages": identifiedApi(anthropicMessagesApi(), identity),
|
|
137
|
+
"openai-completions": identifiedApi(openAICompletionsApi(), identity)
|
|
112
138
|
},
|
|
113
|
-
classifiers: { [CLASSIFIER_API]: clef(fetcher) }
|
|
139
|
+
classifiers: { [CLASSIFIER_API]: clef(fetcher, identity) }
|
|
114
140
|
});
|
|
115
141
|
}
|
|
116
142
|
export {
|
|
117
143
|
ADOBE,
|
|
118
144
|
ADOBE_PROXY,
|
|
119
145
|
CLASSIFIER_API,
|
|
146
|
+
SESSION_HEADER,
|
|
147
|
+
VERSION_HEADER,
|
|
120
148
|
adobeClassifiers,
|
|
121
149
|
adobeConfig,
|
|
150
|
+
adobeIdentity,
|
|
122
151
|
adobeModel,
|
|
123
152
|
adobeProvider,
|
|
124
|
-
adobeUsage
|
|
153
|
+
adobeUsage,
|
|
154
|
+
withAdobeIdentity
|
|
125
155
|
};
|
|
126
156
|
//# sourceMappingURL=adobe.js.map
|
package/dist/adobe.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/adobe.ts"],
|
|
4
|
-
"sourcesContent": ["import type {
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import type {\n ClassifierModel,\n Provider,\n ProviderClassifier,\n ProviderHeaders,\n ProviderStreams,\n} from '@earendil-works/pi-ai';\nimport { anthropicMessagesApi } from '@earendil-works/pi-ai/api/anthropic-messages.lazy';\nimport { cloudflareWorkersAISystemOneApi } from '@earendil-works/pi-ai/api/cloudflare-workers-ai-system-one.lazy';\nimport { openAICompletionsApi } from '@earendil-works/pi-ai/api/openai-completions.lazy';\nimport { createProvider } from '@earendil-works/pi-ai/models';\n\nexport const ADOBE = 'adobe';\nexport const ADOBE_PROXY = 'https://adobe-llm-proxy.paolo-moz.workers.dev';\n\nexport interface AdobeModelInfo {\n id: string;\n name: string;\n api?: 'anthropic' | 'openai';\n context_window?: number;\n max_tokens?: number;\n reasoning?: boolean;\n input?: string[];\n cost?: { input: number; output: number; cacheRead: number; cacheWrite: number };\n hidden?: boolean;\n}\n\nexport interface AdobeConfig {\n clientId: string;\n scopes: string;\n imsEnvironment: string;\n models: AdobeModelInfo[];\n}\n\nexport interface Budget {\n percent: number;\n window: 'weekly';\n resets: string;\n}\n\ntype Fetch = typeof fetch;\n\nexport const SESSION_HEADER = 'X-Session-Id';\nexport const VERSION_HEADER = 'X-Slicc-Version';\n\nexport function adobeIdentity({\n session = crypto.randomUUID(),\n version = 'unknown',\n}: {\n session?: string;\n version?: string;\n} = {}): Record<string, string> {\n return { [SESSION_HEADER]: session, [VERSION_HEADER]: version };\n}\n\nexport function withAdobeIdentity(\n identity: Record<string, string>,\n headers: ProviderHeaders = {}\n): ProviderHeaders {\n const ours = new Set(Object.keys(identity).map((name) => name.toLowerCase()));\n const kept = Object.entries(headers).filter(([name]) => !ours.has(name.toLowerCase()));\n return { ...Object.fromEntries(kept), ...identity };\n}\n\nfunction identified<T extends { headers?: ProviderHeaders }>(\n identity: Record<string, string>,\n options: T | undefined\n): T {\n return { ...options, headers: withAdobeIdentity(identity, options?.headers) } as T;\n}\n\ntype Call = (model: unknown, input: unknown, options?: { headers?: ProviderHeaders }) => unknown;\n\nfunction identifiedApi(api: ProviderStreams, identity: Record<string, string>): ProviderStreams {\n const calls = Object.entries(api as unknown as Record<string, Call>).map(([name, call]) => [\n name,\n (model: unknown, input: unknown, options?: { headers?: ProviderHeaders }) =>\n call(model, input, identified(identity, options)),\n ]);\n return Object.fromEntries(calls) as ProviderStreams;\n}\n\nconst free = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n\nexport const CLASSIFIER_API = 'cloudflare-workers-ai-system-one';\nconst WORKERS_AI = '@cf/cloudflare/';\n\nconst CLEF = [\n { id: 'clef', name: 'Clef', input: 0.24 },\n { id: 'clef-flash', name: 'Clef Flash', input: 0.09 },\n];\n\nexport function adobeClassifiers(endpoint: string): ClassifierModel<typeof CLASSIFIER_API>[] {\n return CLEF.map(({ id, name, input }) => ({\n type: 'classifier',\n id,\n name,\n provider: ADOBE,\n api: CLASSIFIER_API,\n baseUrl: `${endpoint}/v1/ai`,\n input: ['text'],\n cost: { ...free, input },\n contextWindow: 65536,\n }));\n}\n\nfunction bearer(headers: Record<string, string | null> = {}): string | undefined {\n const value = Object.entries(headers).find(\n ([name]) => name.toLowerCase() === 'authorization'\n )?.[1];\n return value?.replace(/^Bearer\\s+/i, '');\n}\n\nfunction clef(fetcher: Fetch, identity: Record<string, string>): ProviderClassifier {\n const transport = cloudflareWorkersAISystemOneApi();\n return {\n classify: (model, context, options = {}) =>\n transport.classify(model, context, {\n ...identified(identity, options),\n fetch: options.fetch ?? fetcher,\n apiKey: bearer(options.headers) ?? options.apiKey,\n onPayload: async (payload, sent) => {\n const wire = { ...(payload as object), model: `${WORKERS_AI}${model.id}` };\n return (await options.onPayload?.(wire, sent)) ?? wire;\n },\n }),\n };\n}\n\nexport function adobeModel(info: AdobeModelInfo, endpoint: string) {\n const openai = info.api === 'openai';\n return {\n id: info.id,\n name: info.name,\n provider: ADOBE,\n api: openai ? ('openai-completions' as const) : ('anthropic-messages' as const),\n baseUrl: openai ? `${endpoint}/v1` : endpoint,\n reasoning: info.reasoning ?? !openai,\n input: (info.input ?? ['text']).filter(\n (kind): kind is 'text' | 'image' => kind === 'text' || kind === 'image'\n ),\n cost: info.cost ?? free,\n contextWindow: info.context_window ?? 200000,\n maxTokens: info.max_tokens ?? 8192,\n ...(openai ? { compat: { supportsStore: false, supportsDeveloperRole: false } } : {}),\n };\n}\n\nexport async function adobeConfig(\n endpoint: string,\n fetcher: Fetch,\n identity = adobeIdentity()\n): Promise<AdobeConfig> {\n const response = await fetcher(`${endpoint}/v1/config`, {\n headers: { Accept: 'application/json', ...identity },\n });\n if (!response.ok) throw new Error(`the Adobe proxy answered /v1/config with ${response.status}`);\n return (await response.json()) as AdobeConfig;\n}\n\nexport async function adobeUsage(\n token: string,\n {\n endpoint = ADOBE_PROXY,\n fetch: fetcher = globalThis.fetch,\n identity = adobeIdentity(),\n }: { endpoint?: string; fetch?: Fetch; identity?: Record<string, string> } = {}\n): Promise<Budget | null> {\n const response = await fetcher(`${endpoint}/v1/usage`, {\n headers: { Accept: 'application/json', ...identity, Authorization: `Bearer ${token}` },\n });\n if (!response.ok) return null;\n const weekly = (\n (await response.json()) as { usage?: { weekly?: { percent?: number; resetsAt?: string } } }\n ).usage?.weekly;\n if (typeof weekly?.percent !== 'number' || typeof weekly.resetsAt !== 'string') return null;\n return { percent: weekly.percent, window: 'weekly', resets: weekly.resetsAt };\n}\n\nexport function adobeProvider({\n endpoint = ADOBE_PROXY,\n session,\n version,\n fetch: fetcher = (input, init) => globalThis.fetch(input, init),\n}: {\n endpoint?: string;\n session?: string;\n version?: string;\n fetch?: Fetch;\n} = {}): Provider {\n const identity = adobeIdentity({ session, version });\n return createProvider({\n id: ADOBE,\n name: 'Adobe',\n baseUrl: endpoint,\n headers: identity,\n auth: {\n apiKey: {\n name: 'Adobe IMS',\n resolve: async ({ credential, signal }) => {\n signal.throwIfAborted();\n if (!credential?.key) return undefined;\n return {\n auth: { headers: { Authorization: `Bearer ${credential.key}` } },\n source: 'Adobe IMS',\n };\n },\n },\n },\n models: adobeClassifiers(endpoint),\n fetchModels: async () =>\n (await adobeConfig(endpoint, fetcher, identity)).models\n .filter((info) => !info.hidden)\n .map((info) => adobeModel(info, endpoint)),\n api: {\n 'anthropic-messages': identifiedApi(anthropicMessagesApi(), identity),\n 'openai-completions': identifiedApi(openAICompletionsApi(), identity),\n },\n classifiers: { [CLASSIFIER_API]: clef(fetcher, identity) },\n }) as Provider;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const CHARS_PER_TOKEN = 4;
|
|
2
|
+
const IMAGE_CHARS = 4800;
|
|
3
|
+
function tokensOf(usage) {
|
|
4
|
+
if (!usage) return 0;
|
|
5
|
+
const parts = [usage.input, usage.output, usage.cacheRead, usage.cacheWrite];
|
|
6
|
+
return usage.totalTokens || parts.reduce((sum, part) => sum + (part ?? 0), 0);
|
|
7
|
+
}
|
|
8
|
+
function valid(message) {
|
|
9
|
+
return message.role === "assistant" && message.stopReason !== "aborted" && message.stopReason !== "error" && tokensOf(message.usage) > 0;
|
|
10
|
+
}
|
|
11
|
+
function blockChars(block) {
|
|
12
|
+
if (block.type === "text") return block.text?.length ?? 0;
|
|
13
|
+
if (block.type === "thinking") return block.thinking?.length ?? 0;
|
|
14
|
+
if (block.type === "image") return IMAGE_CHARS;
|
|
15
|
+
return (block.name?.length ?? 0) + (JSON.stringify(block.arguments) ?? "").length;
|
|
16
|
+
}
|
|
17
|
+
function estimate(message) {
|
|
18
|
+
const content = message.content ?? "";
|
|
19
|
+
const sections = Object.values(message.sections ?? {}).filter((text) => text !== null);
|
|
20
|
+
const chars = typeof content === "string" ? content.length : content.reduce((sum, block) => sum + blockChars(block), 0);
|
|
21
|
+
const extra = sections.reduce((sum, text) => sum + text.length, 0);
|
|
22
|
+
return Math.ceil((chars + extra) / CHARS_PER_TOKEN);
|
|
23
|
+
}
|
|
24
|
+
function contextTokens(view) {
|
|
25
|
+
const entries = view?.entries ?? [];
|
|
26
|
+
const first = entries[0];
|
|
27
|
+
const head = first?.head === void 0 ? void 0 : first.id;
|
|
28
|
+
for (let at = entries.length - 1; at >= 0; at--) {
|
|
29
|
+
const entry = entries[at];
|
|
30
|
+
if (head !== void 0 && entry.id <= head) continue;
|
|
31
|
+
const measured = (entry.model ?? []).findLast(valid);
|
|
32
|
+
if (measured) return tokensOf(measured.usage);
|
|
33
|
+
}
|
|
34
|
+
if (head === void 0) return null;
|
|
35
|
+
const messages = entries.flatMap((entry) => entry.model ?? []);
|
|
36
|
+
return messages.reduce((sum, message) => sum + estimate(message), 0) || null;
|
|
37
|
+
}
|
|
38
|
+
function contextRatio(tokens, model, models) {
|
|
39
|
+
const window = models.find((choice) => choice.id === model)?.contextWindow;
|
|
40
|
+
if (!tokens || !window) return null;
|
|
41
|
+
return Math.min(1, tokens / window);
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
contextRatio,
|
|
45
|
+
contextTokens
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/context.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ConversationView } from '@earendil-works/pi-durable';\nimport type { ModelChoice } from './services.ts';\n\ninterface Usage {\n input?: number;\n output?: number;\n cacheRead?: number;\n cacheWrite?: number;\n totalTokens?: number;\n}\n\ninterface Block {\n type?: string;\n text?: string;\n thinking?: string;\n name?: string;\n arguments?: unknown;\n}\n\ninterface Measured {\n role?: string;\n stopReason?: string;\n usage?: Usage;\n content?: string | readonly Block[];\n sections?: Record<string, string | null>;\n}\n\nconst CHARS_PER_TOKEN = 4;\nconst IMAGE_CHARS = 4800;\n\nfunction tokensOf(usage: Usage | undefined): number {\n if (!usage) return 0;\n const parts = [usage.input, usage.output, usage.cacheRead, usage.cacheWrite];\n return usage.totalTokens || parts.reduce<number>((sum, part) => sum + (part ?? 0), 0);\n}\n\nfunction valid(message: Measured): boolean {\n return (\n message.role === 'assistant' &&\n message.stopReason !== 'aborted' &&\n message.stopReason !== 'error' &&\n tokensOf(message.usage) > 0\n );\n}\n\nfunction blockChars(block: Block): number {\n if (block.type === 'text') return block.text?.length ?? 0;\n if (block.type === 'thinking') return block.thinking?.length ?? 0;\n if (block.type === 'image') return IMAGE_CHARS;\n return (block.name?.length ?? 0) + (JSON.stringify(block.arguments) ?? '').length;\n}\n\nfunction estimate(message: Measured): number {\n const content = message.content ?? '';\n const sections = Object.values(message.sections ?? {}).filter((text) => text !== null);\n const chars =\n typeof content === 'string'\n ? content.length\n : content.reduce((sum, block) => sum + blockChars(block), 0);\n const extra = sections.reduce((sum, text) => sum + text.length, 0);\n return Math.ceil((chars + extra) / CHARS_PER_TOKEN);\n}\n\nexport function contextTokens(view: ConversationView | undefined): number | null {\n const entries = view?.entries ?? [];\n const first = entries[0];\n const head = first?.head === undefined ? undefined : first.id;\n for (let at = entries.length - 1; at >= 0; at--) {\n const entry = entries[at] as (typeof entries)[number];\n if (head !== undefined && entry.id <= head) continue;\n const measured = ((entry.model ?? []) as readonly Measured[]).findLast(valid);\n if (measured) return tokensOf(measured.usage);\n }\n if (head === undefined) return null;\n const messages = entries.flatMap((entry) => (entry.model ?? []) as readonly Measured[]);\n return messages.reduce((sum, message) => sum + estimate(message), 0) || null;\n}\n\nexport function contextRatio(\n tokens: number | null | undefined,\n model: string | null | undefined,\n models: readonly ModelChoice[]\n): number | null {\n const window = models.find((choice) => choice.id === model)?.contextWindow;\n if (!tokens || !window) return null;\n return Math.min(1, tokens / window);\n}\n"],
|
|
5
|
+
"mappings": "AA2BA,MAAM,kBAAkB;AACxB,MAAM,cAAc;AAEpB,SAAS,SAAS,OAAkC;AAClD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,QAAQ,CAAC,MAAM,OAAO,MAAM,QAAQ,MAAM,WAAW,MAAM,UAAU;AAC3E,SAAO,MAAM,eAAe,MAAM,OAAe,CAAC,KAAK,SAAS,OAAO,QAAQ,IAAI,CAAC;AACtF;AAEA,SAAS,MAAM,SAA4B;AACzC,SACE,QAAQ,SAAS,eACjB,QAAQ,eAAe,aACvB,QAAQ,eAAe,WACvB,SAAS,QAAQ,KAAK,IAAI;AAE9B;AAEA,SAAS,WAAW,OAAsB;AACxC,MAAI,MAAM,SAAS,OAAQ,QAAO,MAAM,MAAM,UAAU;AACxD,MAAI,MAAM,SAAS,WAAY,QAAO,MAAM,UAAU,UAAU;AAChE,MAAI,MAAM,SAAS,QAAS,QAAO;AACnC,UAAQ,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU,MAAM,SAAS,KAAK,IAAI;AAC7E;AAEA,SAAS,SAAS,SAA2B;AAC3C,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,WAAW,OAAO,OAAO,QAAQ,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,SAAS,IAAI;AACrF,QAAM,QACJ,OAAO,YAAY,WACf,QAAQ,SACR,QAAQ,OAAO,CAAC,KAAK,UAAU,MAAM,WAAW,KAAK,GAAG,CAAC;AAC/D,QAAM,QAAQ,SAAS,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,QAAQ,CAAC;AACjE,SAAO,KAAK,MAAM,QAAQ,SAAS,eAAe;AACpD;AAEO,SAAS,cAAc,MAAmD;AAC/E,QAAM,UAAU,MAAM,WAAW,CAAC;AAClC,QAAM,QAAQ,QAAQ,CAAC;AACvB,QAAM,OAAO,OAAO,SAAS,SAAY,SAAY,MAAM;AAC3D,WAAS,KAAK,QAAQ,SAAS,GAAG,MAAM,GAAG,MAAM;AAC/C,UAAM,QAAQ,QAAQ,EAAE;AACxB,QAAI,SAAS,UAAa,MAAM,MAAM,KAAM;AAC5C,UAAM,YAAa,MAAM,SAAS,CAAC,GAA2B,SAAS,KAAK;AAC5E,QAAI,SAAU,QAAO,SAAS,SAAS,KAAK;AAAA,EAC9C;AACA,MAAI,SAAS,OAAW,QAAO;AAC/B,QAAM,WAAW,QAAQ,QAAQ,CAAC,UAAW,MAAM,SAAS,CAAC,CAAyB;AACtF,SAAO,SAAS,OAAO,CAAC,KAAK,YAAY,MAAM,SAAS,OAAO,GAAG,CAAC,KAAK;AAC1E;AAEO,SAAS,aACd,QACA,OACA,QACe;AACf,QAAM,SAAS,OAAO,KAAK,CAAC,WAAW,OAAO,OAAO,KAAK,GAAG;AAC7D,MAAI,CAAC,UAAU,CAAC,OAAQ,QAAO;AAC/B,SAAO,KAAK,IAAI,GAAG,SAAS,MAAM;AACpC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -3,9 +3,13 @@ import {
|
|
|
3
3
|
ADOBE_PROXY,
|
|
4
4
|
adobeClassifiers,
|
|
5
5
|
adobeConfig,
|
|
6
|
+
adobeIdentity,
|
|
6
7
|
adobeModel,
|
|
7
8
|
adobeProvider,
|
|
8
|
-
adobeUsage
|
|
9
|
+
adobeUsage,
|
|
10
|
+
SESSION_HEADER,
|
|
11
|
+
VERSION_HEADER,
|
|
12
|
+
withAdobeIdentity
|
|
9
13
|
} from "./adobe.js";
|
|
10
14
|
import { answerText, openAgent } from "./agent.js";
|
|
11
15
|
import {
|
|
@@ -93,14 +97,17 @@ export {
|
|
|
93
97
|
IMAGE_LIMIT,
|
|
94
98
|
PortChannel,
|
|
95
99
|
PortListener,
|
|
100
|
+
SESSION_HEADER,
|
|
96
101
|
SliccKernelEnv,
|
|
97
102
|
SliccPrompt,
|
|
98
103
|
TOTAL_LIMIT,
|
|
99
104
|
UPLOADS,
|
|
105
|
+
VERSION_HEADER,
|
|
100
106
|
WasmSqliteDatabase,
|
|
101
107
|
adminOver,
|
|
102
108
|
adobeClassifiers,
|
|
103
109
|
adobeConfig,
|
|
110
|
+
adobeIdentity,
|
|
104
111
|
adobeModel,
|
|
105
112
|
adobeProvider,
|
|
106
113
|
adobeUsage,
|
|
@@ -131,6 +138,7 @@ export {
|
|
|
131
138
|
upload,
|
|
132
139
|
userClients,
|
|
133
140
|
userParts,
|
|
141
|
+
withAdobeIdentity,
|
|
134
142
|
withDefaultRegions,
|
|
135
143
|
withUnrefTimers
|
|
136
144
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["export {\n ADOBE,\n ADOBE_PROXY,\n type AdobeConfig,\n type AdobeModelInfo,\n adobeClassifiers,\n adobeConfig,\n adobeModel,\n adobeProvider,\n adobeUsage,\n type Budget,\n} from './adobe.ts';\nexport { type Agent, type AgentOptions, answerText, openAgent } from './agent.ts';\nexport {\n FILE_LIMIT,\n IMAGE_LIMIT,\n type SendAttachment,\n type ShownAttachment,\n splitUser,\n TOTAL_LIMIT,\n userParts,\n} from './attachments.ts';\nexport { type AgentConnection, connectAgent } from './client.ts';\nexport { createAgentControl } from './control.ts';\nexport { CREDENTIALS_DATABASE, EncryptedCredentialStore } from './credentials.ts';\nexport { type AgentHost, type ConnectOptions, hostAgent } from './host.ts';\nexport type {\n KernelClient,\n KernelFs,\n KernelProcess,\n KernelStat,\n SpawnOptions,\n} from './kernel/client.ts';\nexport { HOME, type KernelEnvOptions, kernelEnvironment, SliccKernelEnv } from './kernel/env.ts';\nexport {\n adminOver,\n type KernelAdmin,\n type KernelGroup,\n type KernelGroups,\n type KernelUser,\n type KernelUsers,\n serveAdmin,\n type UserClient,\n type UserClients,\n type UserConnect,\n type UserSpec,\n userClients,\n} from './kernel/users.ts';\nexport { PortListener } from './listener.ts';\nexport {\n type AgentWorkerOptions,\n type AgentWorkerScope,\n type KernelAttach,\n runAgentWorker,\n} from './main.ts';\nexport {\n type Loopback,\n type Transport,\n type TransportResponse,\n transportFetch,\n} from './net.ts';\nexport {\n AGENT_LOCK,\n type AgentOwner,\n type AgentWorker,\n type KernelSource,\n type OwnerOptions,\n startAgent,\n} from './owner.ts';\nexport { applyPatches, patchServerAccept } from './patches.ts';\nexport { SliccPrompt, sliccPrompt } from './prompt.ts';\nexport {\n type AgentPages,\n createPages,\n type PageBatch,\n type PageCaller,\n type PageRequest,\n type PageResult,\n type Pages,\n type PagesOpened,\n type PageTab,\n} from './remote/pages.ts';\nexport {\n type AccountState,\n AGENT_SESSION,\n AgentControl,\n AgentPagesService,\n AgentSessions,\n AgentSettings,\n type AgentSettingsChange,\n AgentTranscript,\n type BudgetState,\n type ModelChoice,\n type OperationError,\n type PromptResult,\n type SendMode,\n type SendRequest,\n type SendResponse,\n type SettingsState,\n type SignIn,\n} from './services.ts';\nexport {\n BEDROCK,\n createAgentSettings,\n createSliccModels,\n DEFAULT_MODEL,\n DEFAULT_REGIONS,\n sliccProviders,\n withDefaultRegions,\n} from './settings.ts';\nexport {\n AGENT_DIRECTORY,\n type OpfsSqliteOptions,\n openMemorySqliteStorage,\n openOpfsSqliteStorage,\n WasmSqliteDatabase,\n} from './sqlite.ts';\nexport { type SystemFacts, systemSection } from './system.ts';\nexport { UPLOADS, type Uploads, upload } from './uploads.ts';\nexport { PortChannel, type PortEndpoint, withUnrefTimers } from './wire.ts';\nexport {\n type KernelPorts,\n kernelPort,\n kernelPorts,\n serveConnections,\n type WorkerScope,\n} from './worker.ts';\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,
|
|
4
|
+
"sourcesContent": ["export {\n ADOBE,\n ADOBE_PROXY,\n type AdobeConfig,\n type AdobeModelInfo,\n adobeClassifiers,\n adobeConfig,\n adobeIdentity,\n adobeModel,\n adobeProvider,\n adobeUsage,\n type Budget,\n SESSION_HEADER,\n VERSION_HEADER,\n withAdobeIdentity,\n} from './adobe.ts';\nexport { type Agent, type AgentOptions, answerText, openAgent } from './agent.ts';\nexport {\n FILE_LIMIT,\n IMAGE_LIMIT,\n type SendAttachment,\n type ShownAttachment,\n splitUser,\n TOTAL_LIMIT,\n userParts,\n} from './attachments.ts';\nexport { type AgentConnection, connectAgent } from './client.ts';\nexport { createAgentControl } from './control.ts';\nexport { CREDENTIALS_DATABASE, EncryptedCredentialStore } from './credentials.ts';\nexport { type AgentHost, type ConnectOptions, hostAgent } from './host.ts';\nexport type {\n KernelClient,\n KernelFs,\n KernelProcess,\n KernelStat,\n SpawnOptions,\n} from './kernel/client.ts';\nexport { HOME, type KernelEnvOptions, kernelEnvironment, SliccKernelEnv } from './kernel/env.ts';\nexport {\n adminOver,\n type KernelAdmin,\n type KernelGroup,\n type KernelGroups,\n type KernelUser,\n type KernelUsers,\n serveAdmin,\n type UserClient,\n type UserClients,\n type UserConnect,\n type UserSpec,\n userClients,\n} from './kernel/users.ts';\nexport { PortListener } from './listener.ts';\nexport {\n type AgentWorkerOptions,\n type AgentWorkerScope,\n type KernelAttach,\n runAgentWorker,\n} from './main.ts';\nexport {\n type Loopback,\n type Transport,\n type TransportResponse,\n transportFetch,\n} from './net.ts';\nexport {\n AGENT_LOCK,\n type AgentOwner,\n type AgentWorker,\n type KernelSource,\n type OwnerOptions,\n startAgent,\n} from './owner.ts';\nexport { applyPatches, patchServerAccept } from './patches.ts';\nexport { SliccPrompt, sliccPrompt } from './prompt.ts';\nexport {\n type AgentPages,\n createPages,\n type PageBatch,\n type PageCaller,\n type PageRequest,\n type PageResult,\n type Pages,\n type PagesOpened,\n type PageTab,\n} from './remote/pages.ts';\nexport {\n type AccountState,\n AGENT_SESSION,\n AgentControl,\n AgentPagesService,\n AgentSessions,\n AgentSettings,\n type AgentSettingsChange,\n AgentTranscript,\n type BudgetState,\n type ModelChoice,\n type OperationError,\n type PromptResult,\n type SendMode,\n type SendRequest,\n type SendResponse,\n type SettingsState,\n type SignIn,\n} from './services.ts';\nexport {\n BEDROCK,\n createAgentSettings,\n createSliccModels,\n DEFAULT_MODEL,\n DEFAULT_REGIONS,\n sliccProviders,\n withDefaultRegions,\n} from './settings.ts';\nexport {\n AGENT_DIRECTORY,\n type OpfsSqliteOptions,\n openMemorySqliteStorage,\n openOpfsSqliteStorage,\n WasmSqliteDatabase,\n} from './sqlite.ts';\nexport { type SystemFacts, systemSection } from './system.ts';\nexport { UPLOADS, type Uploads, upload } from './uploads.ts';\nexport { PortChannel, type PortEndpoint, withUnrefTimers } from './wire.ts';\nexport {\n type KernelPorts,\n kernelPort,\n kernelPorts,\n serveConnections,\n type WorkerScope,\n} from './worker.ts';\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAwC,YAAY,iBAAiB;AACrE;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAA+B,oBAAoB;AACnD,SAAS,0BAA0B;AACnC,SAAS,sBAAsB,gCAAgC;AAC/D,SAA8C,iBAAiB;AAQ/D,SAAS,MAA6B,mBAAmB,sBAAsB;AAC/E;AAAA,EACE;AAAA,EAMA;AAAA,EAKA;AAAA,OACK;AACP,SAAS,oBAAoB;AAC7B;AAAA,EAIE;AAAA,OACK;AACP;AAAA,EAIE;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAKA;AAAA,OACK;AACP,SAAS,cAAc,yBAAyB;AAChD,SAAS,aAAa,mBAAmB;AACzC;AAAA,EAEE;AAAA,OAQK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OAUK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAA2B,qBAAqB;AAChD,SAAS,SAAuB,cAAc;AAC9C,SAAS,aAAgC,uBAAuB;AAChE;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/main.js
CHANGED
|
@@ -110,9 +110,9 @@ async function secretsFor(home, vault) {
|
|
|
110
110
|
await names.refresh(BACKGROUND_CONTEXT);
|
|
111
111
|
return names;
|
|
112
112
|
}
|
|
113
|
-
async function modelsOf(options) {
|
|
113
|
+
async function modelsOf(options, version) {
|
|
114
114
|
const credentials = await (options.credentials ?? (() => EncryptedCredentialStore.open()))();
|
|
115
|
-
const providers = options.providers ?? sliccProviders();
|
|
115
|
+
const providers = options.providers ?? sliccProviders(version);
|
|
116
116
|
return { credentials, providers, models: createSliccModels(credentials, providers) };
|
|
117
117
|
}
|
|
118
118
|
function baseRegistry(facts) {
|
|
@@ -143,7 +143,13 @@ async function prepare(scope, kernel, options) {
|
|
|
143
143
|
const names = await secretsFor(kernel.home, kernel.vault);
|
|
144
144
|
const native = routeFetch(scope, kernel.client);
|
|
145
145
|
const facts = await factsOf(kernel.client, native);
|
|
146
|
-
return {
|
|
146
|
+
return {
|
|
147
|
+
names,
|
|
148
|
+
native,
|
|
149
|
+
facts,
|
|
150
|
+
...await modelsOf(options, facts.version),
|
|
151
|
+
registry: baseRegistry(facts)
|
|
152
|
+
};
|
|
147
153
|
}
|
|
148
154
|
async function start(scope, ports, options, vault) {
|
|
149
155
|
const { client, users, home, at } = await attached(ports, options);
|
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 { CredentialStore, 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 { 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 { EncryptedCredentialStore } from './credentials.ts';\nimport { attachFreezer } from './freezer/index.ts';\nimport { settingsText, titler } from './freezer/title.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 { 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 { adminOver, type UserClient, type UserClients, userClients } from './kernel/users.ts';\nimport { AGENT_DIR, ROOT_HOME } from './layout.ts';\nimport { setupLicks } from './licks/index.ts';\nimport { lickTriage } from './licks/triage.ts';\nimport { setupMcp } from './mcp/index.ts';\nimport { setupMemory } from './memory/index.ts';\nimport { modelsCommand } from './models/index.ts';\nimport { pageOnly, type Transport, transportFetch } from './net.ts';\nimport { sliccPrompt } from './prompt.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 { repin, secretsExtension, shellGrants } from './secrets/extension.ts';\nimport { secretNames } from './secrets/names.ts';\nimport { scrubWith } from './secrets/scrub.ts';\nimport { listenVault, Vault } from './secrets/vault.ts';\nimport {\n createAgentSettings,\n createSliccModels,\n DEFAULT_MODEL,\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 { 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 credentials?: () => Promise<CredentialStore>;\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}\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';\n\nasync function attached(ports: Promise<KernelPorts>, options: AgentWorkerOptions) {\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 { client, users, home, at: { home: HOME, ...(users ? { agentDir: AGENT_DIR } : {}) } };\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 openRepinned(\n options: AgentWorkerOptions,\n base: Omit<AgentOptions, 'storage' | 'beforeResume'>\n): Promise<Agent> {\n const storage = await (options.storage ?? (() => openOpfsSqliteStorage()))();\n return openAgent({\n ...base,\n storage,\n beforeResume: (harness, using) => repin(harness, storage, 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\nasync function modelsOf(options: AgentWorkerOptions) {\n const credentials = await (options.credentials ?? (() => EncryptedCredentialStore.open()))();\n const providers = options.providers ?? sliccProviders();\n return { credentials, providers, models: createSliccModels(credentials, providers) };\n}\n\nfunction baseRegistry(facts: Awaited<ReturnType<typeof factsOf>>) {\n const registry = createRegistry();\n registry.install(CodingTools);\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 scope.fetch = transportFetch(client.transport, scope.location.origin, native, loopback);\n return native;\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 = routeFetch(scope, kernel.client);\n const facts = await factsOf(kernel.client, native);\n return { names, native, facts, ...(await modelsOf(options)), registry: baseRegistry(facts) };\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 } = await attached(ports, options);\n const ready = await prepare(scope, { client, home, vault }, options);\n const { names, native, facts, credentials, providers, models, registry } = ready;\n const memory = setupMemory(registry);\n const coding = CodingTools.tools as readonly ToolRegistration[];\n registry.install(browserGuard([scope.location.origin], coding));\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);\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 activity = createActivity();\n const groups = processGroups(client);\n const model = options.model ?? DEFAULT_MODEL;\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 identify: identity(() => opened?.agents, model),\n scrub: vault,\n spawn: shellGrants(names),\n ...(people ? { route: people.route } : {}),\n });\n const agent = await openRepinned(options, { 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 activity,\n ...(people ? { dirs: () => people.lickDirs() } : {}),\n });\n await sources.start(BACKGROUND_CONTEXT);\n await sources.boot(\n { version: facts.version, boot: await kernelBoot(client) },\n BACKGROUND_CONTEXT\n );\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 credentials,\n licks: licks.licks,\n fetch: scope.fetch,\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 = attachFreezer({\n harness: agent.harness,\n agents: agent.agents,\n env: home,\n extract: memory.extract,\n title: titler(models, settingsText(home, HOME, at.agentDir)),\n ...(people ? { layout: people.layout } : {}),\n });\n licks.licks.guard(freezer.frozenTarget);\n const settings = await createAgentSettings(models, credentials, providers, { mcp: mcpRuntime });\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 ...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: modelsCommand({ agents: agent.agents, settings, catalog: models }),\n panel: pages.command,\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 const changes = attachChanges({ agents: agent.agents, env: home, reloadMs: CHANGES_MS });\n return hostAgent(agent, {\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,\n pages,\n mcp: mcpRuntime,\n ...(users ? { users } : {}),\n secrets: { vault: vault.state, list: () => names.state.value, close: names.close },\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 secrets: () => mcpRuntime.secrets(),\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 { CredentialStore, 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 { 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 { EncryptedCredentialStore } from './credentials.ts';\nimport { attachFreezer } from './freezer/index.ts';\nimport { settingsText, titler } from './freezer/title.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 { 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 { adminOver, type UserClient, type UserClients, userClients } from './kernel/users.ts';\nimport { AGENT_DIR, ROOT_HOME } from './layout.ts';\nimport { setupLicks } from './licks/index.ts';\nimport { lickTriage } from './licks/triage.ts';\nimport { setupMcp } from './mcp/index.ts';\nimport { setupMemory } from './memory/index.ts';\nimport { modelsCommand } from './models/index.ts';\nimport { pageOnly, type Transport, transportFetch } from './net.ts';\nimport { sliccPrompt } from './prompt.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 { repin, secretsExtension, shellGrants } from './secrets/extension.ts';\nimport { secretNames } from './secrets/names.ts';\nimport { scrubWith } from './secrets/scrub.ts';\nimport { listenVault, Vault } from './secrets/vault.ts';\nimport {\n createAgentSettings,\n createSliccModels,\n DEFAULT_MODEL,\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 { 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 credentials?: () => Promise<CredentialStore>;\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}\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';\n\nasync function attached(ports: Promise<KernelPorts>, options: AgentWorkerOptions) {\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 { client, users, home, at: { home: HOME, ...(users ? { agentDir: AGENT_DIR } : {}) } };\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 openRepinned(\n options: AgentWorkerOptions,\n base: Omit<AgentOptions, 'storage' | 'beforeResume'>\n): Promise<Agent> {\n const storage = await (options.storage ?? (() => openOpfsSqliteStorage()))();\n return openAgent({\n ...base,\n storage,\n beforeResume: (harness, using) => repin(harness, storage, 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\nasync function modelsOf(options: AgentWorkerOptions, version: string) {\n const credentials = await (options.credentials ?? (() => EncryptedCredentialStore.open()))();\n const providers = options.providers ?? sliccProviders(version);\n return { credentials, providers, models: createSliccModels(credentials, providers) };\n}\n\nfunction baseRegistry(facts: Awaited<ReturnType<typeof factsOf>>) {\n const registry = createRegistry();\n registry.install(CodingTools);\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 scope.fetch = transportFetch(client.transport, scope.location.origin, native, loopback);\n return native;\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 = routeFetch(scope, kernel.client);\n const facts = await factsOf(kernel.client, native);\n return {\n names,\n native,\n facts,\n ...(await modelsOf(options, facts.version)),\n registry: baseRegistry(facts),\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 } = await attached(ports, options);\n const ready = await prepare(scope, { client, home, vault }, options);\n const { names, native, facts, credentials, providers, models, registry } = ready;\n const memory = setupMemory(registry);\n const coding = CodingTools.tools as readonly ToolRegistration[];\n registry.install(browserGuard([scope.location.origin], coding));\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);\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 activity = createActivity();\n const groups = processGroups(client);\n const model = options.model ?? DEFAULT_MODEL;\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 identify: identity(() => opened?.agents, model),\n scrub: vault,\n spawn: shellGrants(names),\n ...(people ? { route: people.route } : {}),\n });\n const agent = await openRepinned(options, { 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 activity,\n ...(people ? { dirs: () => people.lickDirs() } : {}),\n });\n await sources.start(BACKGROUND_CONTEXT);\n await sources.boot(\n { version: facts.version, boot: await kernelBoot(client) },\n BACKGROUND_CONTEXT\n );\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 credentials,\n licks: licks.licks,\n fetch: scope.fetch,\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 = attachFreezer({\n harness: agent.harness,\n agents: agent.agents,\n env: home,\n extract: memory.extract,\n title: titler(models, settingsText(home, HOME, at.agentDir)),\n ...(people ? { layout: people.layout } : {}),\n });\n licks.licks.guard(freezer.frozenTarget);\n const settings = await createAgentSettings(models, credentials, providers, { mcp: mcpRuntime });\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 ...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: modelsCommand({ agents: agent.agents, settings, catalog: models }),\n panel: pages.command,\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 const changes = attachChanges({ agents: agent.agents, env: home, reloadMs: CHANGES_MS });\n return hostAgent(agent, {\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,\n pages,\n mcp: mcpRuntime,\n ...(users ? { users } : {}),\n secrets: { vault: vault.state, list: () => names.state.value, close: names.close },\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 secrets: () => mcpRuntime.secrets(),\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
|
}
|
package/dist/monitor/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
} from "@earendil-works/chord";
|
|
4
4
|
import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
|
|
5
5
|
import { live } from "../agents.js";
|
|
6
|
+
import { contextTokens } from "../context.js";
|
|
6
7
|
import { commandLine, program, redacted } from "./redact.js";
|
|
7
8
|
function timed(entry) {
|
|
8
9
|
return typeof entry.utime === "number" && typeof entry.stime === "number";
|
|
@@ -64,13 +65,6 @@ function totals(usage) {
|
|
|
64
65
|
function phaseOf(node) {
|
|
65
66
|
return "phase" in node.state ? node.state.phase : node.state.outcome;
|
|
66
67
|
}
|
|
67
|
-
function contextOf(message) {
|
|
68
|
-
const usage = message.usage;
|
|
69
|
-
if (!usage) return null;
|
|
70
|
-
const parts = [usage.input, usage.output, usage.cacheRead, usage.cacheWrite];
|
|
71
|
-
const total = parts.reduce((sum, part) => sum + (part ?? 0), 0);
|
|
72
|
-
return total > 0 ? total : null;
|
|
73
|
-
}
|
|
74
68
|
function lastAssistant(view) {
|
|
75
69
|
const entries = view?.entries ?? [];
|
|
76
70
|
for (let at = entries.length - 1; at >= 0; at--) {
|
|
@@ -318,7 +312,7 @@ class Session {
|
|
|
318
312
|
tool: liveDoc?.tools?.find((slot) => slot.status === "running")?.name ?? null,
|
|
319
313
|
retry,
|
|
320
314
|
failed,
|
|
321
|
-
context:
|
|
315
|
+
context: contextTokens(view)
|
|
322
316
|
};
|
|
323
317
|
}
|
|
324
318
|
#task(node, owners, details) {
|