@ai-ecoverse/slicc-agent 6.13.4 → 6.14.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 +3 -3
- package/dist/main.js +3 -6
- package/dist/main.js.map +2 -2
- package/dist/providers.js +3 -4
- package/dist/providers.js.map +2 -2
- package/dist/secrets/endpoints.js +1 -18
- package/dist/secrets/endpoints.js.map +2 -2
- package/dist/secrets/vault.js +1 -1
- package/dist/secrets/vault.js.map +2 -2
- package/dist/services.js.map +2 -2
- package/dist/types/providers.d.ts +1 -1
- package/dist/types/secrets/endpoints.d.ts +1 -3
- package/dist/types/secrets/vault.d.ts +1 -2
- package/dist/types/services.d.ts +1 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -140,7 +140,7 @@ const owner = await startAgent({
|
|
|
140
140
|
|
|
141
141
|
**Providers.** `sliccProviders()` registers Bedrock, Adobe and every pi-ai provider that takes a plain API key: Anthropic, OpenAI, Mistral, Groq, DeepSeek, Together, Hugging Face, Xiaomi and its three token plans, Cerebras, OpenRouter, Fireworks, Baseten, Moonshot AI and its China platform, xAI, Meta, Vercel AI Gateway, MiniMax and MiniMax CN, Z.AI and Z.AI Coding CN, NVIDIA, Kimi For Coding, Ant Ling, OpenCode Zen and Go, and the three Qwen token plans (`KEY_PROVIDERS` in `src/providers.ts`, each with its id, pi-ai factory, pi-ai env name, a description, a key URL and whether it answers browsers). Three more take a key and non-secret fields (`auth: 'fields'`), each checked in `connect` and mapped to pi-ai's env: Azure (`endpoint`, required: a resource name becomes `AZURE_OPENAI_RESOURCE_NAME`, an `https:` URL without a port or user name `AZURE_OPENAI_BASE_URL`; `deployments`, optional `model=deployment` pairs, `AZURE_OPENAI_DEPLOYMENT_NAME_MAP`), Cloudflare Workers AI (`account`, 32 hex characters, `CLOUDFLARE_ACCOUNT_ID`) and Cloudflare AI Gateway (`account` and `gateway`, `CLOUDFLARE_GATEWAY_ID`). Bedrock's `region` is on the same mechanism. A bad value rejects `connect` with a sentence, a required field left out keeps its stored value or rejects with “{label} can’t be empty.”, and a stored value that no longer passes is left out of the env. A fields provider whose required fields are missing or no longer pass shows as not connected, gives pi-ai no credential and offers no models, even with its key already in the vault (spectrum puts the key before `connect` checks the fields). Bedrock's region is any AWS region name (`eusc-de-east-1` and `us-gov-west-1` included), and stored values are trimmed. OpenCode Zen and OpenCode Go need seven's vault 1.12.2 or later, whose built-in table has their `/inference` endpoints; their descriptions say so. Azure's `endpoint` field says `customBase: true`: when its value is a full URL, spectrum registers it with the vault (the page's `endpoints`) before `connect`, since the agent never registers model endpoints for pi-ai providers; a resource name needs nothing, as `*.openai.azure.com` is built into the vault. The worker routes requests to an Azure account's base URL as Azure's. Google and Google Vertex wait for slicc-bios to stop removing `@google/genai`; the sign-ins come later. A provider's preferred model is pi-coding-agent 1.3.0's `defaultModelPerProvider` (Bedrock keeps `us.anthropic.claude-sonnet-5-5`), and the first model when that one is missing. Providers that don't answer a browser from `https://seven.sliccy.ai` with the headers pi-ai and the AWS SDK send say `needs: 'cors-free-transport'`; the direct ones are Bedrock, Adobe, Anthropic, OpenAI, Azure, Mistral, Groq, DeepSeek, Together, Hugging Face, Baseten, both Moonshot AI platforms, xAI, Meta and the four Xiaomi providers. Chrome accepts `Authorization` under a bare `Access-Control-Allow-Headers: *` (as xAI, Meta and Adobe's proxy answer), checked in Chrome 156. The worker's transport fetch drops the Stainless SDKs' `x-stainless-*` telemetry headers from every request it sends, which is what Baseten's and Moonshot AI's preflights refuse.
|
|
142
142
|
|
|
143
|
-
**Reachability, nightly.** `npm run reach` (`scripts/reach.mjs`, through `verdict.mjs`) checks every listing from `https://seven.sliccy.ai`. It captures the request pi-ai builds for each of the provider's APIs (with a dummy key and dummy fields, and the fetch faked; Bedrock's from the AWS SDK's own request, caught at its Node HTTP handler, which carries the same headers as in a browser: `amz-sdk-invocation-id`, `amz-sdk-request`, `authorization`, `content-type`, `x-amz-user-agent`). Then it sends that request's preflight and, when the preflight passes, the request itself with dummy credentials, whose answer must carry `Access-Control-Allow-Origin` too. Besides each chat API it probes what the provider's models need beyond a turn: the requests its model discovery sends under its base URL (Adobe's `/v1/config`), one classifier call per classifier API (Adobe's `/v1/ai/run`, OpenAI's `/v1/decisions`, OpenRouter's and Cloudflare's), and Adobe's `/v1/usage`. It prints `reach: <id> direct|cors-free|unknown|unprobed` per provider (`unknown` when the network gave no answer; `unprobed` when it captured no request at all, which counts as a disagreement, so a provider can't silently drop out of the check) and one `reach: PASS` line. `.github/workflows/reach.yml` runs it every night on `ubuntu-latest`, never on pull requests, and opens or updates the issue titled “Provider reachability disagrees with the listings” when a provider's verdict isn't its `needs`, and closes it with a comment once every provider's verdict matches its listing again (a run with an `unknown` provider leaves it open); a run without the PASS line fails.
|
|
143
|
+
**Reachability, nightly.** `npm run reach` (`scripts/reach.mjs`, through `verdict.mjs`) checks every listing from `https://seven.sliccy.ai`. It captures the request pi-ai builds for each of the provider's APIs (with a dummy key and dummy fields, and the fetch faked; Bedrock's from the AWS SDK's own request, caught at its Node HTTP handler, which carries the same headers as in a browser: `amz-sdk-invocation-id`, `amz-sdk-request`, `authorization`, `content-type`, `x-amz-user-agent`). Then it sends that request's preflight and, when the preflight passes, the request itself with dummy credentials, whose answer must carry `Access-Control-Allow-Origin` too. Besides each chat API it probes what the provider's models need beyond a turn: the requests its model discovery sends under its base URL (Adobe's `/v1/config`), one classifier call per classifier API (Adobe's `/v1/ai/run`, OpenAI's `/v1/decisions`, OpenRouter's and Cloudflare's), and Adobe's `/v1/usage`. It prints `reach: <id> direct|cors-free|unknown|unprobed` per provider (`unknown` when the network gave no answer; `unprobed` when it captured no request at all, which counts as a disagreement, so a provider can't silently drop out of the check) and one `reach: PASS` line. A provider that stays `unknown` three runs in a row counts as a disagreement too: the workflow keeps the streaks in the Actions cache (`REACH_HISTORY`), and the line says how many runs in a row. A direct provider that passes only because Chrome lets `Authorization` through under a bare `Access-Control-Allow-Headers: *` reads `direct (wildcard auth)` (today Adobe, xAI and Meta); the PASS line, the run's summary and the issue body list them, without failing, so we know at once which break if Chrome ever enforces the Fetch spec. `.github/workflows/reach.yml` runs it every night on `ubuntu-latest`, never on pull requests, and opens or updates the issue titled “Provider reachability disagrees with the listings” when a provider's verdict isn't its `needs`, and closes it with a comment once every provider's verdict matches its listing again (a run with an `unknown` provider leaves it open); a run without the PASS line fails.
|
|
144
144
|
|
|
145
145
|
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 account's `region` field names another one (`AWS_REGION`). The account publishes that field as `fields: [{ name: 'region', label: 'Region', help, options, value }]`, and `connect` takes it. Bedrock's runtime endpoints answer browsers (`Access-Control-Allow-Origin: *`, allowing the AWS SDK's headers), so it needs no CORS-free transport.
|
|
146
146
|
|
|
@@ -154,7 +154,7 @@ The first provider is AWS Bedrock with a Bedrock API key as the bearer token; th
|
|
|
154
154
|
|
|
155
155
|
**Blocked providers.** `needs: 'cors-free-transport'` is the static fact; `blocked: 'cors-free-transport'`, on both `ProviderOption` and the account, says the current transport can't reach that provider right now: the worker's kernel transport is unavailable, or it is the page's own fetch without a linked exit (`transportReach(client)` in `src/net.ts`, from the transport's traits). The worker follows `client.onTraits`, so a provider unblocks as soon as an extension or a linked slicc gives a CORS-free route, and blocks again when it goes, with no reload. A blocked provider is still offered and can be added; a connected one keeps its key and its row, but its models are left out of `models` and `labels`, so the picker offers none until the route is back.
|
|
156
156
|
|
|
157
|
-
**Adding providers.** The settings state's `providers` lists every provider seven can add (`ProviderOption`: `id`, `name`, `description`, `auth`, `keyUrl`, `needs`, `fields` and `vaultName`, sorted by name), and the spectrum adapter serves it as `providers()` with a `providers` event when it changes. `accounts` then lists only the added ones: Bedrock and Adobe start as added, `connect` adds a provider, and one with a vault record or stored fields counts as added too. The added list is `providers` in `/.slicc/accounts.json`. `vaultName` is the record name spectrum `put`s the key under: pi-ai's env name, or `<ID>_API_KEY` for providers that share one (Moonshot AI, OpenCode and the Qwen token plans), since a `put` under another provider's name would rebind that record; Bedrock's is `AWS_BEARER_TOKEN_BEDROCK` and Adobe's `ADOBE_IMS_TOKEN`. The agent finds a provider's record by its `provider`, never by name. Each provider has at most one secret, its key; `fields` are the non-secret inputs (`name`, `label`, `required`, `placeholder`, `help`, `customBase`, `options` and `value`). On an added account each field's `value` is its stored value, trimmed, so Settings can show it and knows a custom base URL to unregister after a reload; a field with a default carries that instead (Bedrock's `us-west-2`). Bedrock's `region` has `options`, the 21 regions where AWS supports Bedrock API keys (the bearer token seven uses; AWS's “Supported Regions … for Amazon Bedrock API keys”), labelled with AWS's names (`Europe (Frankfurt), eu-central-1`); a stored region outside the list comes first, under its own name, so a select never shows a region the account doesn't use. `disconnect(id)` keeps the row and its fields, so connecting again needs only the key, and `remove(id)` drops the row and its fields; for both, spectrum removes the vault record first. On an MCP row, `remove` disconnects it. `connect` with a secret is refused for every model account ("API keys are kept in seven's vault: update seven"); the only secret it still takes is an MCP sign-in's callback answer.
|
|
157
|
+
**Adding providers.** The settings state's `providers` lists every provider seven can add (`ProviderOption`: `id`, `name`, `description`, `auth`, `keyUrl`, `needs`, `fields` and `vaultName`, sorted by name), and the spectrum adapter serves it as `providers()` with a `providers` event when it changes. `accounts` then lists only the added ones: Bedrock and Adobe start as added, `connect` adds a provider, and one with a vault record or stored fields counts as added too. The added list is `providers` in `/.slicc/accounts.json`. `vaultName` is the record name spectrum `put`s the key under: pi-ai's env name, or `<ID>_API_KEY` for providers that share one (Moonshot AI, OpenCode and the Qwen token plans), since a `put` under another provider's name would rebind that record; Bedrock's is `AWS_BEARER_TOKEN_BEDROCK` and Adobe's `ADOBE_IMS_TOKEN`. The agent finds a provider's record by its `provider`, never by name. Each provider has at most one secret, its key; `fields` are the non-secret inputs (`name`, `label`, `required`, `placeholder`, `help`, `customBase`, `vaultSetting`, `options` and `value`). `vaultSetting` names the vault record setting a field fills (slicc-vault's tenant-bound wildcards, V3), so the vault can bind a provider's wildcard endpoints to the user's own tenant: Cloudflare's `account` is `CLOUDFLARE_ACCOUNT_ID` and `gateway` `CLOUDFLARE_GATEWAY_ID`, and Azure's `endpoint` is `AZURE_OPENAI_RESOURCE_NAME` (spectrum applies it only to a bare resource name; an `https:` value stays a `customBase`). On an added account each field's `value` is its stored value, trimmed, so Settings can show it and knows a custom base URL to unregister after a reload; a field with a default carries that instead (Bedrock's `us-west-2`). Bedrock's `region` has `options`, the 21 regions where AWS supports Bedrock API keys (the bearer token seven uses; AWS's “Supported Regions … for Amazon Bedrock API keys”), labelled with AWS's names (`Europe (Frankfurt), eu-central-1`); a stored region outside the list comes first, under its own name, so a select never shows a region the account doesn't use. `disconnect(id)` keeps the row and its fields, so connecting again needs only the key, and `remove(id)` drops the row and its fields; for both, spectrum removes the vault record first. On an MCP row, `remove` disconnects it. `connect` with a secret is refused for every model account ("API keys are kept in seven's vault: update seven"); the only secret it still takes is an MCP sign-in's callback answer.
|
|
158
158
|
|
|
159
159
|
### In slicc-spectrum
|
|
160
160
|
|
|
@@ -758,7 +758,7 @@ The agent never holds a secret's value. Values live in the vault (`vault.sliccy.
|
|
|
758
758
|
- **The wire** is slicc-vault's `AgentOp`/`AgentReply` (`@ai-ecoverse/slicc-vault`, types only). Requests are `{ v: 1, id, op, ... }` and answers `{ v: 1, id, op, ... }` or `{ v: 1, id, error: { code, message } }`, in request order: `redact { texts }` (strings and `Uint8Array`s, answered in the same order and types, with `version`), the stream ops `redactStream`, `push { chunk }`, `end` and `drop` with the worker's string `stream` id, and `model`, `mcp`, `records`, `grant`, `refresh` and `endpoints`. The vault's first message, `welcome`, carries `status.scrub` and `status.locked`; version bumps come only from bios's `{ scrub }` posts and the `version` in answers.
|
|
759
759
|
- **Credentials by placeholder.** `records()` lists the `model` and `mcp` records (names, placeholders, states, never values). It is read at start, whenever `version` changes, and after `connect`, `disconnect` and `remove`. The read-only `CredentialStore` behind pi-ai returns a model record's placeholder as the API key (found by `kind: 'model'` and `provider`), with the account's non-secret fields as its env (Bedrock's `region` as `AWS_REGION`); writing to it throws.
|
|
760
760
|
- **The transport.** The worker's `fetch` is `vaultFetch`: a request to a configured provider's base URL (Bedrock's standard `bedrock-runtime.*.amazonaws.com` and `-fips` endpoints included, so the AWS SDK's bearer requests are covered), or one carrying a model placeholder in its URL or headers, goes out as `model { provider?, request }`; MCP requests go out as `mcp { server, request }`, discovery and client registration included. The vault returns the request scrubbed over every value and with the credential filled in its headers or URL, and the existing transport sends it (`loopbackFetch` for a server on `http://<port>.kernel.localhost`); the response comes back directly. `EAGAIN` prepares the request once more; a refusal becomes a response (403 for `EACCES`, with the vault's sentence); a 401 calls `refresh { provider | server }` once and sends again. Anything else passes through, and without a vault every request does. Transport errors name only the method and origin, never a prepared URL or header.
|
|
761
|
-
- **Endpoints.** `endpoints {
|
|
761
|
+
- **Endpoints.** `endpoints { mcp: [{ server, url, names?, tokenUrl? }] }` is sent when the port opens and whenever `mcp.json` changes: every server URL with the `${NAME}`s its headers use. Registrations only add. The agent registers no model URL at all: from slicc-vault 1.13.0 every model provider's endpoints are built into the vault (pi-ai's catalog, Bedrock's regions and Adobe's proxy as `adobe`), and a custom base URL a user types (Azure's `customBase`) is registered by the page; the agent port's `{ provider, url }` would be a no-op anyway.
|
|
762
762
|
- **`slicc-secrets`**, a built-in extension modelled on [pi-fnox](https://github.com/Bucurenciu-Cristian/pi-fnox) (MIT, © 2026 Kicky), with its hooks mapped to pi-durable. fnox ([`@ai-ecoverse/wasi-fnox`](https://www.npmjs.com/package/@ai-ecoverse/wasi-fnox) 1.39, built by homescoop and used unpatched here) is seven's only secrets CLI; the agent adapts to its own commands and needs `fnox` on `PATH` in the home env.
|
|
763
763
|
- **The listing**, read in the home env at start and whenever `version` changes (pi-fnox's `fnox export`; nothing goes into the worker's environment), joins three commands by name, none of which prints a value:
|
|
764
764
|
- `fnox env --json --describe` gives the fnox config's keys (`kind: "secret"`), which are the `$NAME`s bash sees. It runs only with `--describe`: without it fnox prints values, so every command goes through one guard that refuses `fnox env` without `--describe`. `--for exec|shell` isn't passed, since fnox 1.39 ignores it when describing (both print the same keys).
|
package/dist/main.js
CHANGED
|
@@ -40,7 +40,7 @@ import { setupMemory } from "./memory/index.js";
|
|
|
40
40
|
import { modelsCommand } from "./models/index.js";
|
|
41
41
|
import { pageOnly, transportFetch, transportReach } from "./net.js";
|
|
42
42
|
import { sliccPrompt } from "./prompt.js";
|
|
43
|
-
import { AZURE, azureBase
|
|
43
|
+
import { AZURE, azureBase } from "./providers.js";
|
|
44
44
|
import { createPages } from "./remote/pages.js";
|
|
45
45
|
import { identity } from "./scoops/identity.js";
|
|
46
46
|
import { packageAssets, setupScoops } from "./scoops/index.js";
|
|
@@ -197,7 +197,6 @@ async function modelsOf(scope, options, given) {
|
|
|
197
197
|
);
|
|
198
198
|
await models.refresh({ allowNetwork: false }).catch(() => void 0);
|
|
199
199
|
const bases = () => modelBases(providers, models, fields.env);
|
|
200
|
-
const own = () => bases().filter(({ provider }) => !VAULT_KNOWN.has(provider));
|
|
201
200
|
scope.fetch = vaultFetch(
|
|
202
201
|
vault,
|
|
203
202
|
transport,
|
|
@@ -205,12 +204,11 @@ async function modelsOf(scope, options, given) {
|
|
|
205
204
|
records.rejecting
|
|
206
205
|
);
|
|
207
206
|
const endpoints = vaultEndpoints(vault);
|
|
208
|
-
void endpoints.models(own()).catch(() => void 0);
|
|
209
207
|
const defaultModel = async () => {
|
|
210
208
|
await Promise.race([loaded, new Promise((resolve) => setTimeout(resolve, WAITING_MS))]);
|
|
211
209
|
return resolveDefaultModel(credentials, providers, models);
|
|
212
210
|
};
|
|
213
|
-
return { store, records, providers, fields, models, bases,
|
|
211
|
+
return { store, records, providers, fields, models, bases, endpoints, defaultModel };
|
|
214
212
|
}
|
|
215
213
|
function baseRegistry(facts, origin) {
|
|
216
214
|
const registry = createRegistry();
|
|
@@ -263,14 +261,13 @@ function modelsOfAgent(agent, settings, catalog, vault) {
|
|
|
263
261
|
return modelsCommand({ agents: agent.agents, settings, catalog, locked });
|
|
264
262
|
}
|
|
265
263
|
async function settingsOf(made, mcp, moved) {
|
|
266
|
-
const { models, records, fields, providers,
|
|
264
|
+
const { models, records, fields, providers, reach } = made;
|
|
267
265
|
const keys = await keysMoved(moved.agent.harness, { records, vault: moved.vault }, moved.wiped);
|
|
268
266
|
const settings = await createAgentSettings(models, { records, fields }, providers, {
|
|
269
267
|
mcp,
|
|
270
268
|
moved: keys,
|
|
271
269
|
reach
|
|
272
270
|
});
|
|
273
|
-
settings.state.subscribe(() => void endpoints.models(own()).catch(() => void 0));
|
|
274
271
|
settings.state.subscribe(() => void moved.licks.flush(BACKGROUND_CONTEXT).catch(() => void 0));
|
|
275
272
|
return settings;
|
|
276
273
|
}
|
package/dist/main.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.ts"],
|
|
4
|
-
"sourcesContent": ["import { attachKernel } from '@ai-ecoverse/slicc-kernel';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { Provider } from '@earendil-works/pi-ai';\nimport type { Models } from '@earendil-works/pi-ai/models';\nimport {\n createRegistry,\n type ModelRef,\n type Storage,\n type ToolRegistration,\n} from '@earendil-works/pi-durable';\nimport { CodingTools } from '@earendil-works/pi-durable/tools';\nimport { type Agent, type AgentOptions, openAgent } from './agent.ts';\nimport {\n type ApprovalJudge,\n approvalJudge,\n judgeModelOf,\n judgeSpender,\n ownerIntent,\n seedPolicy,\n verdictRecorder,\n} from './approvals/index.ts';\nimport { browserGuard } from './browser/guard.ts';\nimport { attachChanges, CHANGES_MS } from './changes/index.ts';\nimport {\n codemodeExtension,\n codemodeTool,\n disabledBySettings,\n locateWasm,\n sandboxFactory,\n} from './codemode/index.ts';\nimport { attachFreezer } from './freezer/index.ts';\nimport { lateGelatiere } from './gelatiere/index.ts';\nimport { type AgentHost, hostAgent } from './host.ts';\nimport { imageReads } from './images/index.ts';\nimport { createActivity } from './kernel/activity.ts';\nimport { type AgentUsers, agentUsers, warnSupport } from './kernel/agent-users.ts';\nimport type { KernelClient } from './kernel/client.ts';\nimport { HOME, kernelEnvironment, SliccKernelEnv } from './kernel/env.ts';\nimport { processGroups } from './kernel/groups.ts';\nimport { backgroundJobs } from './kernel/jobs.ts';\nimport { adminOver, type UserClient, type UserClients, userClients } from './kernel/users.ts';\nimport { AGENT_DIR, ROOT_HOME } from './layout.ts';\nimport { type Licks, setupLicks } from './licks/index.ts';\nimport { lickTriage } from './licks/triage.ts';\nimport { type McpAccounts, setupMcp } from './mcp/index.ts';\nimport type { MemoryEntry } from './memory/format.ts';\nimport { setupMemory } from './memory/index.ts';\nimport { modelsCommand } from './models/index.ts';\nimport { pageOnly, type Reach, type Transport, transportFetch, transportReach } from './net.ts';\nimport { sliccPrompt } from './prompt.ts';\nimport { AZURE, azureBase, VAULT_KNOWN } from './providers.ts';\nimport { createPages } from './remote/pages.ts';\nimport { identity } from './scoops/identity.ts';\nimport { type Assets, packageAssets, type ScoopsRuntime, setupScoops } from './scoops/index.ts';\nimport { vaultCredentials } from './secrets/credentials.ts';\nimport {\n BEDROCK_ENDPOINTS,\n type ModelBases,\n modelRoute,\n vaultEndpoints,\n} from './secrets/endpoints.ts';\nimport { secretsExtension, shellGrants } from './secrets/extension.ts';\nimport { grantFetch, mcpFetch, vaultFetch } from './secrets/fetch.ts';\nimport { keysMoved, type Wiped, wipeLegacy } from './secrets/legacy.ts';\nimport { secretNames } from './secrets/names.ts';\nimport { type VaultRecords, vaultRecords } from './secrets/records.ts';\nimport { scrubWith } from './secrets/scrub.ts';\nimport { fileStore, type PlainStore } from './secrets/store.ts';\nimport { listenVault, Vault, WAITING_MS } from './secrets/vault.ts';\nimport { type Choosable, unfreeze, unfreezeCreated } from './selection.ts';\nimport {\n BEDROCK,\n catalogStore,\n createAgentSettings,\n createSliccModels,\n providerFields,\n resolveDefaultModel,\n sliccProviders,\n} from './settings.ts';\nimport { RELOAD_MS, setupSkills } from './skills/index.ts';\nimport { setupSprinkles } from './sprinkles/index.ts';\nimport { openOpfsSqliteStorage } from './sqlite.ts';\nimport {\n agentVersion,\n browserConnected,\n commandsOnPath,\n kernelBoot,\n transportName,\n} from './system.ts';\nimport { titlesExtension } from './titles/extension.ts';\nimport { labeler, settingsText, titler } from './titles/generate.ts';\nimport { attachLabels } from './titles/labels.ts';\nimport { type KernelPorts, kernelPorts, serveConnections, type WorkerScope } from './worker.ts';\n\nexport interface AgentWorkerScope extends WorkerScope {\n fetch: typeof fetch;\n location: { origin: string };\n}\n\nexport type KernelAttach = (port: MessagePort) => Promise<KernelClient & { transport: Transport }>;\n\nexport interface AgentWorkerOptions {\n model?: ModelRef;\n providers?: Provider[];\n attach?: KernelAttach;\n store?: () => Promise<PlainStore>;\n storage?: () => Promise<Storage>;\n assets?: Assets;\n codemodeWasm?: () => Promise<WebAssembly.Module | undefined>;\n codemodeWorker?: string | URL;\n catalog?: string;\n users?: boolean;\n mcpRedirect?: string;\n approvalMs?: number;\n}\n\nexport function usersOf(\n admin: MessagePort | undefined,\n wanted: boolean | undefined,\n attach: KernelAttach\n): UserClients | undefined {\n if (!admin) return undefined;\n if (wanted === false) {\n admin.close();\n return undefined;\n }\n return userClients(adminOver(admin), attach as (port: MessagePort) => Promise<UserClient>);\n}\n\nexport const STORE_DIR = '/.slicc';\nexport const ACCOUNTS_FILE = `${STORE_DIR}/accounts.json`;\nexport const MODELS_FILE = `${STORE_DIR}/models.json`;\n\nasync function attached(ports: Promise<KernelPorts>, options: AgentWorkerOptions) {\n const wiped = await wipeLegacy();\n const attach: KernelAttach = options.attach ?? attachKernel;\n const { kernel, admin } = await ports;\n const client = await attach(kernel);\n const users = usersOf(admin, options.users, attach);\n await warnSupport(users, client, options.users);\n const home = new SliccKernelEnv(client, { cwd: HOME });\n await privateStore(home);\n return {\n client,\n users,\n home,\n wiped,\n at: { home: HOME, ...(users ? { agentDir: AGENT_DIR } : {}) },\n };\n}\n\nfunction privateStore(env: SliccKernelEnv): Promise<unknown> {\n return env.exec(`mkdir -p ${STORE_DIR} && chmod 700 ${STORE_DIR}`, undefined, BACKGROUND_CONTEXT);\n}\n\nasync function codemodeTools(\n client: KernelClient,\n options: AgentWorkerOptions,\n native: typeof fetch,\n extra: Parameters<typeof codemodeTool>[0]['extra'],\n dir = `${HOME}/.pi/agent`\n) {\n const settings = await client.fs.readFile(`${dir}/settings.json`).catch(() => undefined);\n if (disabledBySettings(settings === undefined ? undefined : new TextDecoder().decode(settings)))\n return [];\n const sandbox = sandboxFactory(\n options.codemodeWasm ?? (() => locateWasm(native, new URL(import.meta.url))),\n options.codemodeWorker\n );\n return [\n codemodeTool({ declared: CodingTools.tools as readonly ToolRegistration[], sandbox, extra }),\n ];\n}\n\nexport function seesImages(models: Pick<Models, 'getModel'>, ref: ModelRef | undefined): boolean {\n const found = ref && models.getModel(ref.provider, ref.modelId);\n return found ? found.input.includes('image') : true;\n}\n\nexport const MCP_CALLBACK = '/oauth/mcp-callback';\n\nasync function openUnfrozen(\n options: AgentWorkerOptions,\n { choosable: chosen }: { choosable: Choosable },\n base: Omit<AgentOptions, 'storage' | 'beforeResume' | 'conversationCreated'>\n): Promise<Agent> {\n const storage = await (options.storage ?? (() => openOpfsSqliteStorage()))();\n return openAgent({\n ...base,\n storage,\n conversationCreated: unfreezeCreated(chosen),\n beforeResume: (harness, using) => unfreeze(harness, storage, chosen, using),\n });\n}\n\nasync function secretsFor(home: SliccKernelEnv, vault: Vault) {\n scrubWith(vault);\n const names = secretNames(home, vault);\n await names.refresh(BACKGROUND_CONTEXT);\n return names;\n}\n\nexport function modelBases(\n providers: readonly Provider[],\n models: Pick<ReturnType<typeof createSliccModels>, 'getModels'>,\n env: (providerId: string) => Readonly<Record<string, string>> | undefined = () => undefined\n): ModelBases[] {\n return providers.map((provider) => ({\n provider: provider.id,\n urls: [\n ...new Set(\n [\n provider.baseUrl,\n ...models.getModels(provider.id).map((model) => model.baseUrl),\n ...(provider.id === BEDROCK ? BEDROCK_ENDPOINTS : []),\n ...(provider.id === AZURE ? [azureBase(env(provider.id) ?? {})] : []),\n ].filter((url): url is string => typeof url === 'string' && url !== '')\n ),\n ],\n }));\n}\n\nfunction mcpVault(\n vault: Vault,\n made: { store: PlainStore; records: VaultRecords; endpoints: ReturnType<typeof vaultEndpoints> }\n) {\n const { store, records, endpoints } = made;\n return {\n store,\n vault: {\n records,\n fetch: (server: string, base: typeof fetch) => mcpFetch(vault, base, server),\n grant: (server: string, base: typeof fetch) => grantFetch(vault, server, base),\n servers: endpoints.servers,\n token: endpoints.token,\n },\n };\n}\n\nfunction hostSecrets(\n vault: Vault,\n names: Awaited<ReturnType<typeof secretsFor>>,\n parts: readonly { close(): void }[]\n) {\n return {\n vault: vault.state,\n list: () => names.state.value,\n close: () => {\n for (const part of parts) part.close();\n },\n };\n}\n\nasync function modelsOf(\n scope: AgentWorkerScope,\n options: AgentWorkerOptions,\n given: { vault: Vault; home: SliccKernelEnv; transport: typeof fetch; version: string }\n) {\n const { vault, home, transport, version } = given;\n const store = await (options.store ?? (async () => fileStore(home, ACCOUNTS_FILE)))();\n const records = vaultRecords(vault);\n const loaded = records.refresh(BACKGROUND_CONTEXT).catch(() => undefined);\n const providers = options.providers ?? sliccProviders(version);\n const fields = await providerFields(store, providers);\n const credentials = vaultCredentials(records, fields.env, fields.ready);\n const models = createSliccModels(\n credentials,\n providers,\n catalogStore(fileStore(home, MODELS_FILE))\n );\n await models.refresh({ allowNetwork: false }).catch(() => undefined);\n const bases = () => modelBases(providers, models, fields.env);\n const own = () => bases().filter(({ provider }) => !VAULT_KNOWN.has(provider));\n scope.fetch = vaultFetch(\n vault,\n transport,\n modelRoute(bases, () => records.state.value),\n records.rejecting\n );\n const endpoints = vaultEndpoints(vault);\n void endpoints.models(own()).catch(() => undefined);\n const defaultModel = async () => {\n await Promise.race([loaded, new Promise((resolve) => setTimeout(resolve, WAITING_MS))]);\n return resolveDefaultModel(credentials, providers, models);\n };\n return { store, records, providers, fields, models, bases, own, endpoints, defaultModel };\n}\n\nfunction baseRegistry(facts: Awaited<ReturnType<typeof factsOf>>, origin: string) {\n const registry = createRegistry();\n registry.install(CodingTools);\n registry.install(browserGuard([origin]));\n registry.install(sliccPrompt(facts));\n const read = (CodingTools.tools as readonly ToolRegistration[]).find(\n (tool) => tool.name === 'read'\n ) as ToolRegistration;\n registry.install(imageReads(read));\n return registry;\n}\n\nasync function factsOf(client: KernelClient & { transport: Transport }, native: typeof fetch) {\n return {\n version: await agentVersion((url) => native(url)),\n commands: await commandsOnPath(client),\n transport: transportName(client.transport),\n browser: await browserConnected(client),\n };\n}\n\nfunction routeFetch(scope: AgentWorkerScope, client: KernelClient & { transport: Transport }) {\n const native = scope.fetch.bind(scope);\n const loopback = client.loopbackFetch?.bind(client);\n const transport = transportFetch(client.transport, scope.location.origin, native, loopback);\n scope.fetch = transport;\n return { native, transport };\n}\n\nasync function prepare(\n scope: AgentWorkerScope,\n kernel: { client: KernelClient & { transport: Transport }; home: SliccKernelEnv; vault: Vault },\n options: AgentWorkerOptions\n) {\n const names = await secretsFor(kernel.home, kernel.vault);\n const { native, transport } = routeFetch(scope, kernel.client);\n const facts = await factsOf(kernel.client, native);\n const made = await modelsOf(scope, options, {\n vault: kernel.vault,\n home: kernel.home,\n transport,\n version: facts.version,\n });\n return {\n names,\n native,\n transport,\n facts,\n ...made,\n reach: transportReach(kernel.client),\n registry: baseRegistry(facts, scope.location.origin),\n };\n}\n\nfunction modelsOfAgent(\n agent: Agent,\n settings: Awaited<ReturnType<typeof createAgentSettings>>,\n catalog: Models,\n vault: Vault\n) {\n const locked = () => vault.state.value.locked !== 'no';\n return modelsCommand({ agents: agent.agents, settings, catalog, locked });\n}\n\nasync function settingsOf(\n made: Awaited<ReturnType<typeof modelsOf>> & { reach: Reach },\n mcp: McpAccounts,\n moved: { agent: Agent; vault: Vault; wiped: Wiped; licks: Licks }\n) {\n const { models, records, fields, providers, own, endpoints, reach } = made;\n const keys = await keysMoved(moved.agent.harness, { records, vault: moved.vault }, moved.wiped);\n const settings = await createAgentSettings(models, { records, fields }, providers, {\n mcp,\n moved: keys,\n reach,\n });\n settings.state.subscribe(() => void endpoints.models(own()).catch(() => undefined));\n settings.state.subscribe(() => void moved.licks.flush(BACKGROUND_CONTEXT).catch(() => undefined));\n return settings;\n}\n\nasync function setupApprovals(\n models: Models,\n home: SliccKernelEnv,\n at: { home: string; agentDir?: string },\n agent: Agent,\n stored: { readonly value: readonly MemoryEntry[] | undefined },\n options: Pick<AgentWorkerOptions, 'approvalMs'>\n) {\n const memories = () => stored.value;\n const { approvalMs } = options;\n await seedPolicy(home, BACKGROUND_CONTEXT).catch(() => false);\n const settings = settingsText(home, HOME, at.agentDir);\n const intent = ownerIntent({ env: home, agents: agent.agents, memories });\n const judge: ApprovalJudge = {\n judge: approvalJudge({\n models,\n model: async (context) => judgeModelOf(await settings(context)),\n intent,\n spend: judgeSpender((agentId, context) => agent.agents.conversation(agentId, context)),\n }),\n record: verdictRecorder((agentId, context) => agent.agents.conversation(agentId, context)),\n };\n return { judge, intent, ...(approvalMs ? { approvalMs } : {}) };\n}\n\nfunction setupTitles(\n registry: ReturnType<typeof createRegistry>,\n models: Models,\n home: SliccKernelEnv,\n at: { home: string; agentDir?: string },\n opened: () => Agent | undefined\n) {\n const settings = settingsText(home, HOME, at.agentDir);\n const titleFn = titler(models, settings);\n const titles = titlesExtension({\n agents: () => opened()?.agents,\n harness: () => opened()?.harness,\n title: () => titleFn,\n });\n registry.install(titles.extension);\n return { titleFn, cancel: titles.cancel, label: labeler(models, settings) };\n}\n\nfunction freezerOf(\n agent: Agent,\n parts: {\n home: SliccKernelEnv;\n memory: ReturnType<typeof setupMemory>;\n titles: ReturnType<typeof setupTitles>;\n people: AgentUsers | undefined;\n users: UserClients | undefined;\n ready: { providers: readonly Provider[]; models: ReturnType<typeof createSliccModels> };\n }\n) {\n const { home, memory, titles, people, users, ready } = parts;\n return attachFreezer({\n harness: agent.harness,\n agents: agent.agents,\n env: home,\n extract: memory.extract,\n title: titles.titleFn,\n cancelTitle: titles.cancel,\n ...(people ? { layout: people.layout } : {}),\n imports: {\n env: home,\n memoryHome: people ? ROOT_HOME : HOME,\n catalog: ready.models,\n providers: ready.providers,\n ...(users ? { users: users.users } : {}),\n ...(people ? { envOf: (cone: string) => people.envOfAgent(`cone:${cone}`) } : {}),\n },\n });\n}\n\nasync function start(\n scope: AgentWorkerScope,\n ports: Promise<KernelPorts>,\n options: AgentWorkerOptions,\n vault: Vault\n): Promise<AgentHost> {\n const { client, users, home, at, wiped } = await attached(ports, options);\n const ready = await prepare(scope, { client, home, vault }, options);\n const { names, native, transport, facts, models, registry, records, endpoints } = ready;\n const memory = setupMemory(registry);\n const coding = CodingTools.tools as readonly ToolRegistration[];\n const mcp = setupMcp(registry);\n const codemode = await codemodeTools(client, options, native, mcp.codemode, at.agentDir);\n registry.install(codemodeExtension(codemode));\n const licks = setupLicks(registry, transport);\n licks.licks.triage(lickTriage(models));\n const scoops = setupScoops(registry, licks.licks, [...coding, ...codemode, ...memory.tools]);\n const skills = setupSkills(registry, licks.licks);\n registry.install(secretsExtension({ names, vault }));\n const titles = setupTitles(registry, models, home, at, () => opened);\n const [activity, groups, jobs] = [\n createActivity(),\n processGroups(client),\n backgroundJobs(client),\n ];\n const model = options.model ?? (await ready.defaultModel());\n let opened: Agent | undefined;\n const people = users ? agentUsers(users, client, home, () => opened?.agents) : undefined;\n const environment = kernelEnvironment(client, {\n activity,\n groups,\n jobs,\n identify: identity(() => opened?.agents, model),\n scrub: vault,\n spawn: shellGrants(names),\n ...(people ? { route: people.route } : {}),\n });\n const agent = await openUnfrozen(options, scoops, { models, model, registry, env: environment });\n opened = agent;\n await people?.start(agent.agents);\n const sources = licks.attach(agent, {\n env: home,\n home: HOME,\n models,\n activity,\n jobs,\n ...(people ? { dirs: () => people.lickDirs(), cronUser: people.cronUser.bind(people) } : {}),\n });\n await sources.start(BACKGROUND_CONTEXT);\n const booted = { version: facts.version, boot: await kernelBoot(client) };\n await sources.boot(booted, BACKGROUND_CONTEXT);\n const skillsRuntime = await skills.attach(\n {\n env: home,\n ...at,\n assets: options.assets ?? packageAssets(),\n reloadMs: RELOAD_MS,\n ...(people ? { people: people.people } : {}),\n },\n BACKGROUND_CONTEXT\n );\n const mcpRuntime = await mcp.attach(\n {\n env: home,\n ...at,\n ...mcpVault(vault, ready),\n licks: licks.licks,\n fetch: transport,\n version: facts.version,\n reloadMs: RELOAD_MS,\n codemode: codemode.length > 0,\n cors: pageOnly(client.transport),\n redirect: options.mcpRedirect ?? new URL(MCP_CALLBACK, scope.location.origin).href,\n },\n BACKGROUND_CONTEXT\n );\n const gelatiere = lateGelatiere();\n const sprinkles = await setupSprinkles().attach(\n {\n intercept: gelatiere.intercept,\n harness: agent.harness,\n agents: agent.agents,\n licks: licks.licks,\n env: home,\n assets: options.assets ?? packageAssets(),\n reloadMs: RELOAD_MS,\n ...(people?.sprinkles() ?? {}),\n },\n BACKGROUND_CONTEXT\n );\n people?.follow([sources, skillsRuntime, sprinkles]);\n let roles: ScoopsRuntime | undefined;\n const memoryRuntime = await memory.attach(\n {\n harness: agent.harness,\n agents: agent.agents,\n env: home,\n ...at,\n ...(people ? { home: ROOT_HOME } : {}),\n reloadMs: RELOAD_MS,\n roles: async (using) => roles?.roles(using),\n },\n BACKGROUND_CONTEXT\n );\n const freezer = freezerOf(agent, { home, memory, titles, people, users, ready });\n licks.licks.guard(freezer.frozenTarget);\n const settings = await settingsOf(ready, mcpRuntime, { agent, vault, wiped, licks: licks.licks });\n const pages = createPages({ claim: sprinkles.claim });\n const runtime = await scoops.attach(\n {\n harness: agent.harness,\n agents: agent.agents,\n groups,\n env: home,\n envOf: async (conversationId, context) => environment({ conversationId }, context),\n ...at,\n ...(people\n ? { layout: people.layout, spools: people.spools, enforced: people.enforced }\n : {}),\n alive: alive(client),\n reads: skillsRuntime.dirs,\n memory: memoryRuntime.command,\n gelatiere: gelatiere.command,\n freezer: freezer.command,\n models: modelsOfAgent(agent, settings, models, vault),\n panel: pages.command,\n webhook: sources.webhook,\n mcp: mcp.direct,\n ...(options.assets ? { assets: options.assets } : {}),\n },\n BACKGROUND_CONTEXT\n );\n roles = runtime;\n gelatiere.attach({\n agents: agent.agents,\n licks: licks.licks,\n env: home,\n home: HOME,\n ...(await people?.gelatiere(home)),\n scoops: scoops.scoops,\n roles: runtime.roles,\n assets: options.assets ?? packageAssets(),\n fetch: scope.fetch,\n skills: skillsRuntime.skills,\n ...(options.catalog ? { catalog: options.catalog } : {}),\n });\n await memoryRuntime.reload(BACKGROUND_CONTEXT).catch(() => undefined);\n return hostAgent(agent, {\n ...(await setupApprovals(models, home, at, agent, memoryRuntime.memories, options)),\n settings,\n licks: { licks: licks.licks, sources },\n scoops: { scoops: scoops.scoops, runtime },\n skills: skillsRuntime,\n sprinkles,\n memory: memoryRuntime,\n freezer,\n changes: attachChanges({ agents: agent.agents, env: home, reloadMs: CHANGES_MS }),\n pages,\n labels: await attachLabels({ ...agent, label: titles.label, vault: vault.state }),\n mcp: mcpRuntime,\n ...(users ? { users } : {}),\n secrets: hostSecrets(vault, names, [names, records, endpoints]),\n uploads: {\n env: environment,\n sees: (ref) => seesImages(models, ref),\n },\n monitor: {\n kernel: client,\n groups,\n ...(users ? { users: () => users.users.list() } : {}),\n },\n });\n}\n\nexport function alive(client: KernelClient) {\n return async (pid: number): Promise<boolean> => {\n if (!client.ps) return true;\n return (await client.ps()).some((process) => process.pid === pid);\n };\n}\n\nexport function runAgentWorker(\n scope: AgentWorkerScope,\n options: AgentWorkerOptions = {}\n): Promise<AgentHost> {\n const vault = new Vault();\n listenVault(scope, vault);\n const host = start(scope, kernelPorts(scope), options, vault);\n host.catch(() => undefined);\n serveConnections(scope, host);\n return host;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { attachKernel } from '@ai-ecoverse/slicc-kernel';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { Provider } from '@earendil-works/pi-ai';\nimport type { Models } from '@earendil-works/pi-ai/models';\nimport {\n createRegistry,\n type ModelRef,\n type Storage,\n type ToolRegistration,\n} from '@earendil-works/pi-durable';\nimport { CodingTools } from '@earendil-works/pi-durable/tools';\nimport { type Agent, type AgentOptions, openAgent } from './agent.ts';\nimport {\n type ApprovalJudge,\n approvalJudge,\n judgeModelOf,\n judgeSpender,\n ownerIntent,\n seedPolicy,\n verdictRecorder,\n} from './approvals/index.ts';\nimport { browserGuard } from './browser/guard.ts';\nimport { attachChanges, CHANGES_MS } from './changes/index.ts';\nimport {\n codemodeExtension,\n codemodeTool,\n disabledBySettings,\n locateWasm,\n sandboxFactory,\n} from './codemode/index.ts';\nimport { attachFreezer } from './freezer/index.ts';\nimport { lateGelatiere } from './gelatiere/index.ts';\nimport { type AgentHost, hostAgent } from './host.ts';\nimport { imageReads } from './images/index.ts';\nimport { createActivity } from './kernel/activity.ts';\nimport { type AgentUsers, agentUsers, warnSupport } from './kernel/agent-users.ts';\nimport type { KernelClient } from './kernel/client.ts';\nimport { HOME, kernelEnvironment, SliccKernelEnv } from './kernel/env.ts';\nimport { processGroups } from './kernel/groups.ts';\nimport { backgroundJobs } from './kernel/jobs.ts';\nimport { adminOver, type UserClient, type UserClients, userClients } from './kernel/users.ts';\nimport { AGENT_DIR, ROOT_HOME } from './layout.ts';\nimport { type Licks, setupLicks } from './licks/index.ts';\nimport { lickTriage } from './licks/triage.ts';\nimport { type McpAccounts, setupMcp } from './mcp/index.ts';\nimport type { MemoryEntry } from './memory/format.ts';\nimport { setupMemory } from './memory/index.ts';\nimport { modelsCommand } from './models/index.ts';\nimport { pageOnly, type Reach, type Transport, transportFetch, transportReach } from './net.ts';\nimport { sliccPrompt } from './prompt.ts';\nimport { AZURE, azureBase } from './providers.ts';\nimport { createPages } from './remote/pages.ts';\nimport { identity } from './scoops/identity.ts';\nimport { type Assets, packageAssets, type ScoopsRuntime, setupScoops } from './scoops/index.ts';\nimport { vaultCredentials } from './secrets/credentials.ts';\nimport {\n BEDROCK_ENDPOINTS,\n type ModelBases,\n modelRoute,\n vaultEndpoints,\n} from './secrets/endpoints.ts';\nimport { secretsExtension, shellGrants } from './secrets/extension.ts';\nimport { grantFetch, mcpFetch, vaultFetch } from './secrets/fetch.ts';\nimport { keysMoved, type Wiped, wipeLegacy } from './secrets/legacy.ts';\nimport { secretNames } from './secrets/names.ts';\nimport { type VaultRecords, vaultRecords } from './secrets/records.ts';\nimport { scrubWith } from './secrets/scrub.ts';\nimport { fileStore, type PlainStore } from './secrets/store.ts';\nimport { listenVault, Vault, WAITING_MS } from './secrets/vault.ts';\nimport { type Choosable, unfreeze, unfreezeCreated } from './selection.ts';\nimport {\n BEDROCK,\n catalogStore,\n createAgentSettings,\n createSliccModels,\n providerFields,\n resolveDefaultModel,\n sliccProviders,\n} from './settings.ts';\nimport { RELOAD_MS, setupSkills } from './skills/index.ts';\nimport { setupSprinkles } from './sprinkles/index.ts';\nimport { openOpfsSqliteStorage } from './sqlite.ts';\nimport {\n agentVersion,\n browserConnected,\n commandsOnPath,\n kernelBoot,\n transportName,\n} from './system.ts';\nimport { titlesExtension } from './titles/extension.ts';\nimport { labeler, settingsText, titler } from './titles/generate.ts';\nimport { attachLabels } from './titles/labels.ts';\nimport { type KernelPorts, kernelPorts, serveConnections, type WorkerScope } from './worker.ts';\n\nexport interface AgentWorkerScope extends WorkerScope {\n fetch: typeof fetch;\n location: { origin: string };\n}\n\nexport type KernelAttach = (port: MessagePort) => Promise<KernelClient & { transport: Transport }>;\n\nexport interface AgentWorkerOptions {\n model?: ModelRef;\n providers?: Provider[];\n attach?: KernelAttach;\n store?: () => Promise<PlainStore>;\n storage?: () => Promise<Storage>;\n assets?: Assets;\n codemodeWasm?: () => Promise<WebAssembly.Module | undefined>;\n codemodeWorker?: string | URL;\n catalog?: string;\n users?: boolean;\n mcpRedirect?: string;\n approvalMs?: number;\n}\n\nexport function usersOf(\n admin: MessagePort | undefined,\n wanted: boolean | undefined,\n attach: KernelAttach\n): UserClients | undefined {\n if (!admin) return undefined;\n if (wanted === false) {\n admin.close();\n return undefined;\n }\n return userClients(adminOver(admin), attach as (port: MessagePort) => Promise<UserClient>);\n}\n\nexport const STORE_DIR = '/.slicc';\nexport const ACCOUNTS_FILE = `${STORE_DIR}/accounts.json`;\nexport const MODELS_FILE = `${STORE_DIR}/models.json`;\n\nasync function attached(ports: Promise<KernelPorts>, options: AgentWorkerOptions) {\n const wiped = await wipeLegacy();\n const attach: KernelAttach = options.attach ?? attachKernel;\n const { kernel, admin } = await ports;\n const client = await attach(kernel);\n const users = usersOf(admin, options.users, attach);\n await warnSupport(users, client, options.users);\n const home = new SliccKernelEnv(client, { cwd: HOME });\n await privateStore(home);\n return {\n client,\n users,\n home,\n wiped,\n at: { home: HOME, ...(users ? { agentDir: AGENT_DIR } : {}) },\n };\n}\n\nfunction privateStore(env: SliccKernelEnv): Promise<unknown> {\n return env.exec(`mkdir -p ${STORE_DIR} && chmod 700 ${STORE_DIR}`, undefined, BACKGROUND_CONTEXT);\n}\n\nasync function codemodeTools(\n client: KernelClient,\n options: AgentWorkerOptions,\n native: typeof fetch,\n extra: Parameters<typeof codemodeTool>[0]['extra'],\n dir = `${HOME}/.pi/agent`\n) {\n const settings = await client.fs.readFile(`${dir}/settings.json`).catch(() => undefined);\n if (disabledBySettings(settings === undefined ? undefined : new TextDecoder().decode(settings)))\n return [];\n const sandbox = sandboxFactory(\n options.codemodeWasm ?? (() => locateWasm(native, new URL(import.meta.url))),\n options.codemodeWorker\n );\n return [\n codemodeTool({ declared: CodingTools.tools as readonly ToolRegistration[], sandbox, extra }),\n ];\n}\n\nexport function seesImages(models: Pick<Models, 'getModel'>, ref: ModelRef | undefined): boolean {\n const found = ref && models.getModel(ref.provider, ref.modelId);\n return found ? found.input.includes('image') : true;\n}\n\nexport const MCP_CALLBACK = '/oauth/mcp-callback';\n\nasync function openUnfrozen(\n options: AgentWorkerOptions,\n { choosable: chosen }: { choosable: Choosable },\n base: Omit<AgentOptions, 'storage' | 'beforeResume' | 'conversationCreated'>\n): Promise<Agent> {\n const storage = await (options.storage ?? (() => openOpfsSqliteStorage()))();\n return openAgent({\n ...base,\n storage,\n conversationCreated: unfreezeCreated(chosen),\n beforeResume: (harness, using) => unfreeze(harness, storage, chosen, using),\n });\n}\n\nasync function secretsFor(home: SliccKernelEnv, vault: Vault) {\n scrubWith(vault);\n const names = secretNames(home, vault);\n await names.refresh(BACKGROUND_CONTEXT);\n return names;\n}\n\nexport function modelBases(\n providers: readonly Provider[],\n models: Pick<ReturnType<typeof createSliccModels>, 'getModels'>,\n env: (providerId: string) => Readonly<Record<string, string>> | undefined = () => undefined\n): ModelBases[] {\n return providers.map((provider) => ({\n provider: provider.id,\n urls: [\n ...new Set(\n [\n provider.baseUrl,\n ...models.getModels(provider.id).map((model) => model.baseUrl),\n ...(provider.id === BEDROCK ? BEDROCK_ENDPOINTS : []),\n ...(provider.id === AZURE ? [azureBase(env(provider.id) ?? {})] : []),\n ].filter((url): url is string => typeof url === 'string' && url !== '')\n ),\n ],\n }));\n}\n\nfunction mcpVault(\n vault: Vault,\n made: { store: PlainStore; records: VaultRecords; endpoints: ReturnType<typeof vaultEndpoints> }\n) {\n const { store, records, endpoints } = made;\n return {\n store,\n vault: {\n records,\n fetch: (server: string, base: typeof fetch) => mcpFetch(vault, base, server),\n grant: (server: string, base: typeof fetch) => grantFetch(vault, server, base),\n servers: endpoints.servers,\n token: endpoints.token,\n },\n };\n}\n\nfunction hostSecrets(\n vault: Vault,\n names: Awaited<ReturnType<typeof secretsFor>>,\n parts: readonly { close(): void }[]\n) {\n return {\n vault: vault.state,\n list: () => names.state.value,\n close: () => {\n for (const part of parts) part.close();\n },\n };\n}\n\nasync function modelsOf(\n scope: AgentWorkerScope,\n options: AgentWorkerOptions,\n given: { vault: Vault; home: SliccKernelEnv; transport: typeof fetch; version: string }\n) {\n const { vault, home, transport, version } = given;\n const store = await (options.store ?? (async () => fileStore(home, ACCOUNTS_FILE)))();\n const records = vaultRecords(vault);\n const loaded = records.refresh(BACKGROUND_CONTEXT).catch(() => undefined);\n const providers = options.providers ?? sliccProviders(version);\n const fields = await providerFields(store, providers);\n const credentials = vaultCredentials(records, fields.env, fields.ready);\n const models = createSliccModels(\n credentials,\n providers,\n catalogStore(fileStore(home, MODELS_FILE))\n );\n await models.refresh({ allowNetwork: false }).catch(() => undefined);\n const bases = () => modelBases(providers, models, fields.env);\n scope.fetch = vaultFetch(\n vault,\n transport,\n modelRoute(bases, () => records.state.value),\n records.rejecting\n );\n const endpoints = vaultEndpoints(vault);\n const defaultModel = async () => {\n await Promise.race([loaded, new Promise((resolve) => setTimeout(resolve, WAITING_MS))]);\n return resolveDefaultModel(credentials, providers, models);\n };\n return { store, records, providers, fields, models, bases, endpoints, defaultModel };\n}\n\nfunction baseRegistry(facts: Awaited<ReturnType<typeof factsOf>>, origin: string) {\n const registry = createRegistry();\n registry.install(CodingTools);\n registry.install(browserGuard([origin]));\n registry.install(sliccPrompt(facts));\n const read = (CodingTools.tools as readonly ToolRegistration[]).find(\n (tool) => tool.name === 'read'\n ) as ToolRegistration;\n registry.install(imageReads(read));\n return registry;\n}\n\nasync function factsOf(client: KernelClient & { transport: Transport }, native: typeof fetch) {\n return {\n version: await agentVersion((url) => native(url)),\n commands: await commandsOnPath(client),\n transport: transportName(client.transport),\n browser: await browserConnected(client),\n };\n}\n\nfunction routeFetch(scope: AgentWorkerScope, client: KernelClient & { transport: Transport }) {\n const native = scope.fetch.bind(scope);\n const loopback = client.loopbackFetch?.bind(client);\n const transport = transportFetch(client.transport, scope.location.origin, native, loopback);\n scope.fetch = transport;\n return { native, transport };\n}\n\nasync function prepare(\n scope: AgentWorkerScope,\n kernel: { client: KernelClient & { transport: Transport }; home: SliccKernelEnv; vault: Vault },\n options: AgentWorkerOptions\n) {\n const names = await secretsFor(kernel.home, kernel.vault);\n const { native, transport } = routeFetch(scope, kernel.client);\n const facts = await factsOf(kernel.client, native);\n const made = await modelsOf(scope, options, {\n vault: kernel.vault,\n home: kernel.home,\n transport,\n version: facts.version,\n });\n return {\n names,\n native,\n transport,\n facts,\n ...made,\n reach: transportReach(kernel.client),\n registry: baseRegistry(facts, scope.location.origin),\n };\n}\n\nfunction modelsOfAgent(\n agent: Agent,\n settings: Awaited<ReturnType<typeof createAgentSettings>>,\n catalog: Models,\n vault: Vault\n) {\n const locked = () => vault.state.value.locked !== 'no';\n return modelsCommand({ agents: agent.agents, settings, catalog, locked });\n}\n\nasync function settingsOf(\n made: Awaited<ReturnType<typeof modelsOf>> & { reach: Reach },\n mcp: McpAccounts,\n moved: { agent: Agent; vault: Vault; wiped: Wiped; licks: Licks }\n) {\n const { models, records, fields, providers, reach } = made;\n const keys = await keysMoved(moved.agent.harness, { records, vault: moved.vault }, moved.wiped);\n const settings = await createAgentSettings(models, { records, fields }, providers, {\n mcp,\n moved: keys,\n reach,\n });\n settings.state.subscribe(() => void moved.licks.flush(BACKGROUND_CONTEXT).catch(() => undefined));\n return settings;\n}\n\nasync function setupApprovals(\n models: Models,\n home: SliccKernelEnv,\n at: { home: string; agentDir?: string },\n agent: Agent,\n stored: { readonly value: readonly MemoryEntry[] | undefined },\n options: Pick<AgentWorkerOptions, 'approvalMs'>\n) {\n const memories = () => stored.value;\n const { approvalMs } = options;\n await seedPolicy(home, BACKGROUND_CONTEXT).catch(() => false);\n const settings = settingsText(home, HOME, at.agentDir);\n const intent = ownerIntent({ env: home, agents: agent.agents, memories });\n const judge: ApprovalJudge = {\n judge: approvalJudge({\n models,\n model: async (context) => judgeModelOf(await settings(context)),\n intent,\n spend: judgeSpender((agentId, context) => agent.agents.conversation(agentId, context)),\n }),\n record: verdictRecorder((agentId, context) => agent.agents.conversation(agentId, context)),\n };\n return { judge, intent, ...(approvalMs ? { approvalMs } : {}) };\n}\n\nfunction setupTitles(\n registry: ReturnType<typeof createRegistry>,\n models: Models,\n home: SliccKernelEnv,\n at: { home: string; agentDir?: string },\n opened: () => Agent | undefined\n) {\n const settings = settingsText(home, HOME, at.agentDir);\n const titleFn = titler(models, settings);\n const titles = titlesExtension({\n agents: () => opened()?.agents,\n harness: () => opened()?.harness,\n title: () => titleFn,\n });\n registry.install(titles.extension);\n return { titleFn, cancel: titles.cancel, label: labeler(models, settings) };\n}\n\nfunction freezerOf(\n agent: Agent,\n parts: {\n home: SliccKernelEnv;\n memory: ReturnType<typeof setupMemory>;\n titles: ReturnType<typeof setupTitles>;\n people: AgentUsers | undefined;\n users: UserClients | undefined;\n ready: { providers: readonly Provider[]; models: ReturnType<typeof createSliccModels> };\n }\n) {\n const { home, memory, titles, people, users, ready } = parts;\n return attachFreezer({\n harness: agent.harness,\n agents: agent.agents,\n env: home,\n extract: memory.extract,\n title: titles.titleFn,\n cancelTitle: titles.cancel,\n ...(people ? { layout: people.layout } : {}),\n imports: {\n env: home,\n memoryHome: people ? ROOT_HOME : HOME,\n catalog: ready.models,\n providers: ready.providers,\n ...(users ? { users: users.users } : {}),\n ...(people ? { envOf: (cone: string) => people.envOfAgent(`cone:${cone}`) } : {}),\n },\n });\n}\n\nasync function start(\n scope: AgentWorkerScope,\n ports: Promise<KernelPorts>,\n options: AgentWorkerOptions,\n vault: Vault\n): Promise<AgentHost> {\n const { client, users, home, at, wiped } = await attached(ports, options);\n const ready = await prepare(scope, { client, home, vault }, options);\n const { names, native, transport, facts, models, registry, records, endpoints } = ready;\n const memory = setupMemory(registry);\n const coding = CodingTools.tools as readonly ToolRegistration[];\n const mcp = setupMcp(registry);\n const codemode = await codemodeTools(client, options, native, mcp.codemode, at.agentDir);\n registry.install(codemodeExtension(codemode));\n const licks = setupLicks(registry, transport);\n licks.licks.triage(lickTriage(models));\n const scoops = setupScoops(registry, licks.licks, [...coding, ...codemode, ...memory.tools]);\n const skills = setupSkills(registry, licks.licks);\n registry.install(secretsExtension({ names, vault }));\n const titles = setupTitles(registry, models, home, at, () => opened);\n const [activity, groups, jobs] = [\n createActivity(),\n processGroups(client),\n backgroundJobs(client),\n ];\n const model = options.model ?? (await ready.defaultModel());\n let opened: Agent | undefined;\n const people = users ? agentUsers(users, client, home, () => opened?.agents) : undefined;\n const environment = kernelEnvironment(client, {\n activity,\n groups,\n jobs,\n identify: identity(() => opened?.agents, model),\n scrub: vault,\n spawn: shellGrants(names),\n ...(people ? { route: people.route } : {}),\n });\n const agent = await openUnfrozen(options, scoops, { models, model, registry, env: environment });\n opened = agent;\n await people?.start(agent.agents);\n const sources = licks.attach(agent, {\n env: home,\n home: HOME,\n models,\n activity,\n jobs,\n ...(people ? { dirs: () => people.lickDirs(), cronUser: people.cronUser.bind(people) } : {}),\n });\n await sources.start(BACKGROUND_CONTEXT);\n const booted = { version: facts.version, boot: await kernelBoot(client) };\n await sources.boot(booted, BACKGROUND_CONTEXT);\n const skillsRuntime = await skills.attach(\n {\n env: home,\n ...at,\n assets: options.assets ?? packageAssets(),\n reloadMs: RELOAD_MS,\n ...(people ? { people: people.people } : {}),\n },\n BACKGROUND_CONTEXT\n );\n const mcpRuntime = await mcp.attach(\n {\n env: home,\n ...at,\n ...mcpVault(vault, ready),\n licks: licks.licks,\n fetch: transport,\n version: facts.version,\n reloadMs: RELOAD_MS,\n codemode: codemode.length > 0,\n cors: pageOnly(client.transport),\n redirect: options.mcpRedirect ?? new URL(MCP_CALLBACK, scope.location.origin).href,\n },\n BACKGROUND_CONTEXT\n );\n const gelatiere = lateGelatiere();\n const sprinkles = await setupSprinkles().attach(\n {\n intercept: gelatiere.intercept,\n harness: agent.harness,\n agents: agent.agents,\n licks: licks.licks,\n env: home,\n assets: options.assets ?? packageAssets(),\n reloadMs: RELOAD_MS,\n ...(people?.sprinkles() ?? {}),\n },\n BACKGROUND_CONTEXT\n );\n people?.follow([sources, skillsRuntime, sprinkles]);\n let roles: ScoopsRuntime | undefined;\n const memoryRuntime = await memory.attach(\n {\n harness: agent.harness,\n agents: agent.agents,\n env: home,\n ...at,\n ...(people ? { home: ROOT_HOME } : {}),\n reloadMs: RELOAD_MS,\n roles: async (using) => roles?.roles(using),\n },\n BACKGROUND_CONTEXT\n );\n const freezer = freezerOf(agent, { home, memory, titles, people, users, ready });\n licks.licks.guard(freezer.frozenTarget);\n const settings = await settingsOf(ready, mcpRuntime, { agent, vault, wiped, licks: licks.licks });\n const pages = createPages({ claim: sprinkles.claim });\n const runtime = await scoops.attach(\n {\n harness: agent.harness,\n agents: agent.agents,\n groups,\n env: home,\n envOf: async (conversationId, context) => environment({ conversationId }, context),\n ...at,\n ...(people\n ? { layout: people.layout, spools: people.spools, enforced: people.enforced }\n : {}),\n alive: alive(client),\n reads: skillsRuntime.dirs,\n memory: memoryRuntime.command,\n gelatiere: gelatiere.command,\n freezer: freezer.command,\n models: modelsOfAgent(agent, settings, models, vault),\n panel: pages.command,\n webhook: sources.webhook,\n mcp: mcp.direct,\n ...(options.assets ? { assets: options.assets } : {}),\n },\n BACKGROUND_CONTEXT\n );\n roles = runtime;\n gelatiere.attach({\n agents: agent.agents,\n licks: licks.licks,\n env: home,\n home: HOME,\n ...(await people?.gelatiere(home)),\n scoops: scoops.scoops,\n roles: runtime.roles,\n assets: options.assets ?? packageAssets(),\n fetch: scope.fetch,\n skills: skillsRuntime.skills,\n ...(options.catalog ? { catalog: options.catalog } : {}),\n });\n await memoryRuntime.reload(BACKGROUND_CONTEXT).catch(() => undefined);\n return hostAgent(agent, {\n ...(await setupApprovals(models, home, at, agent, memoryRuntime.memories, options)),\n settings,\n licks: { licks: licks.licks, sources },\n scoops: { scoops: scoops.scoops, runtime },\n skills: skillsRuntime,\n sprinkles,\n memory: memoryRuntime,\n freezer,\n changes: attachChanges({ agents: agent.agents, env: home, reloadMs: CHANGES_MS }),\n pages,\n labels: await attachLabels({ ...agent, label: titles.label, vault: vault.state }),\n mcp: mcpRuntime,\n ...(users ? { users } : {}),\n secrets: hostSecrets(vault, names, [names, records, endpoints]),\n uploads: {\n env: environment,\n sees: (ref) => seesImages(models, ref),\n },\n monitor: {\n kernel: client,\n groups,\n ...(users ? { users: () => users.users.list() } : {}),\n },\n });\n}\n\nexport function alive(client: KernelClient) {\n return async (pid: number): Promise<boolean> => {\n if (!client.ps) return true;\n return (await client.ps()).some((process) => process.pid === pid);\n };\n}\n\nexport function runAgentWorker(\n scope: AgentWorkerScope,\n options: AgentWorkerOptions = {}\n): Promise<AgentHost> {\n const vault = new Vault();\n listenVault(scope, vault);\n const host = start(scope, kernelPorts(scope), options, vault);\n host.catch(() => undefined);\n serveConnections(scope, host);\n return host;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/providers.js
CHANGED
|
@@ -95,6 +95,7 @@ const ACCOUNT_FIELD = {
|
|
|
95
95
|
required: true,
|
|
96
96
|
placeholder: "0123456789abcdef0123456789abcdef",
|
|
97
97
|
help: "The 32-character ID on your Cloudflare dashboard\u2019s account overview.",
|
|
98
|
+
vaultSetting: "CLOUDFLARE_ACCOUNT_ID",
|
|
98
99
|
env: checked(
|
|
99
100
|
ACCOUNT,
|
|
100
101
|
"CLOUDFLARE_ACCOUNT_ID",
|
|
@@ -117,6 +118,7 @@ const KEY_PROVIDERS = [
|
|
|
117
118
|
placeholder: "my-resource or https://my-resource.openai.azure.com",
|
|
118
119
|
help: "Your resource\u2019s name, or its endpoint address from Keys and Endpoint.",
|
|
119
120
|
customBase: true,
|
|
121
|
+
vaultSetting: "AZURE_OPENAI_RESOURCE_NAME",
|
|
120
122
|
env: azureEndpoint
|
|
121
123
|
},
|
|
122
124
|
{
|
|
@@ -152,6 +154,7 @@ const KEY_PROVIDERS = [
|
|
|
152
154
|
required: true,
|
|
153
155
|
placeholder: "my-gateway",
|
|
154
156
|
help: "The name of your gateway under AI \u203A AI Gateway.",
|
|
157
|
+
vaultSetting: "CLOUDFLARE_GATEWAY_ID",
|
|
155
158
|
env: checked(
|
|
156
159
|
GATEWAY,
|
|
157
160
|
"CLOUDFLARE_GATEWAY_ID",
|
|
@@ -462,9 +465,6 @@ const LISTINGS = new Map([
|
|
|
462
465
|
])
|
|
463
466
|
]);
|
|
464
467
|
const ADDED_FIRST = ["amazon-bedrock", "adobe"];
|
|
465
|
-
const VAULT_KNOWN = new Set(
|
|
466
|
-
[...LISTINGS.keys()].filter((id) => id !== "adobe")
|
|
467
|
-
);
|
|
468
468
|
export {
|
|
469
469
|
ADDED_FIRST,
|
|
470
470
|
AZURE,
|
|
@@ -472,7 +472,6 @@ export {
|
|
|
472
472
|
KEY_PROVIDERS,
|
|
473
473
|
LISTINGS,
|
|
474
474
|
REGION_FIELD,
|
|
475
|
-
VAULT_KNOWN,
|
|
476
475
|
azureBase,
|
|
477
476
|
httpsBase
|
|
478
477
|
};
|
package/dist/providers.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/providers.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Provider } from '@earendil-works/pi-ai';\nimport { antLingProvider } from '@earendil-works/pi-ai/providers/ant-ling';\nimport { anthropicProvider } from '@earendil-works/pi-ai/providers/anthropic';\nimport { azureProvider } from '@earendil-works/pi-ai/providers/azure';\nimport { basetenProvider } from '@earendil-works/pi-ai/providers/baseten';\nimport { cerebrasProvider } from '@earendil-works/pi-ai/providers/cerebras';\nimport { cloudflareAIGatewayProvider } from '@earendil-works/pi-ai/providers/cloudflare-ai-gateway';\nimport { cloudflareWorkersAIProvider } from '@earendil-works/pi-ai/providers/cloudflare-workers-ai';\nimport { deepseekProvider } from '@earendil-works/pi-ai/providers/deepseek';\nimport { fireworksProvider } from '@earendil-works/pi-ai/providers/fireworks';\nimport { groqProvider } from '@earendil-works/pi-ai/providers/groq';\nimport { huggingfaceProvider } from '@earendil-works/pi-ai/providers/huggingface';\nimport { kimiCodingProvider } from '@earendil-works/pi-ai/providers/kimi-coding';\nimport { metaProvider } from '@earendil-works/pi-ai/providers/meta';\nimport { minimaxProvider } from '@earendil-works/pi-ai/providers/minimax';\nimport { minimaxCnProvider } from '@earendil-works/pi-ai/providers/minimax-cn';\nimport { mistralProvider } from '@earendil-works/pi-ai/providers/mistral';\nimport { moonshotaiProvider } from '@earendil-works/pi-ai/providers/moonshotai';\nimport { moonshotaiCnProvider } from '@earendil-works/pi-ai/providers/moonshotai-cn';\nimport { nvidiaProvider } from '@earendil-works/pi-ai/providers/nvidia';\nimport { openaiProvider } from '@earendil-works/pi-ai/providers/openai';\nimport { opencodeProvider } from '@earendil-works/pi-ai/providers/opencode';\nimport { opencodeGoProvider } from '@earendil-works/pi-ai/providers/opencode-go';\nimport { openrouterProvider } from '@earendil-works/pi-ai/providers/openrouter';\nimport { qwenTokenPlanProvider } from '@earendil-works/pi-ai/providers/qwen-token-plan';\nimport { qwenTokenPlanCnProvider } from '@earendil-works/pi-ai/providers/qwen-token-plan-cn';\nimport { qwenTokenPlanIndividualProvider } from '@earendil-works/pi-ai/providers/qwen-token-plan-individual';\nimport { togetherProvider } from '@earendil-works/pi-ai/providers/together';\nimport { vercelAIGatewayProvider } from '@earendil-works/pi-ai/providers/vercel-ai-gateway';\nimport { xaiProvider } from '@earendil-works/pi-ai/providers/xai';\nimport { xiaomiProvider } from '@earendil-works/pi-ai/providers/xiaomi';\nimport { xiaomiTokenPlanAmsProvider } from '@earendil-works/pi-ai/providers/xiaomi-token-plan-ams';\nimport { xiaomiTokenPlanCnProvider } from '@earendil-works/pi-ai/providers/xiaomi-token-plan-cn';\nimport { xiaomiTokenPlanSgpProvider } from '@earendil-works/pi-ai/providers/xiaomi-token-plan-sgp';\nimport { zaiProvider } from '@earendil-works/pi-ai/providers/zai';\nimport { zaiCodingCnProvider } from '@earendil-works/pi-ai/providers/zai-coding-cn';\n\nexport interface FieldOption {\n value: string;\n label: string;\n}\n\nexport interface FieldInput {\n name: string;\n label: string;\n required?: boolean;\n placeholder?: string;\n help?: string;\n customBase?: true;\n options?: readonly FieldOption[];\n value?: string;\n}\n\nexport interface FieldSpec extends FieldInput {\n env(value: string): Record<string, string> | string;\n}\n\nexport interface KeyProvider {\n id: string;\n make: () => Provider;\n env: string;\n description: string;\n keyUrl: string;\n cors: boolean;\n fields?: readonly FieldSpec[];\n}\n\nconst RESOURCE = /^[a-z0-9][a-z0-9-]{0,62}$/i;\nconst DEPLOYMENTS = /^[^=,\\s]+\\s*=\\s*[^=,\\s]+(\\s*,\\s*[^=,\\s]+\\s*=\\s*[^=,\\s]+)*$/;\n\nexport function httpsBase(value: string): URL | undefined {\n const url = URL.parse(value);\n if (url?.protocol !== 'https:' || url.username || url.password) return undefined;\n return url.port === '' || url.port === '443' ? url : undefined;\n}\n\nfunction azureEndpoint(value: string): Record<string, string> | string {\n if (RESOURCE.test(value)) return { AZURE_OPENAI_RESOURCE_NAME: value };\n const url = httpsBase(value);\n if (!url)\n return 'Enter your Azure resource name, or its endpoint as an https:// address without a port or a user name.';\n return { AZURE_OPENAI_BASE_URL: url.href.replace(/\\/+$/, '') };\n}\n\nexport const AZURE = 'azure';\n\nexport function azureBase(env: Readonly<Record<string, string>>): string | undefined {\n if (env.AZURE_OPENAI_BASE_URL) return env.AZURE_OPENAI_BASE_URL;\n const name = env.AZURE_OPENAI_RESOURCE_NAME;\n return name ? `https://${name}.openai.azure.com/openai/v1` : undefined;\n}\n\nconst REGION = /^[a-z]{2,}(-[a-z]+)+-\\d{1,2}$/;\nconst ACCOUNT = /^[0-9a-f]{32}$/i;\nconst GATEWAY = /^[A-Za-z0-9_-]{1,64}$/;\n\nconst checked =\n (pattern: RegExp, env: string, problem: string) =>\n (value: string): Record<string, string> | string =>\n pattern.test(value) ? { [env]: value } : problem;\n\nconst BEDROCK_REGIONS: readonly (readonly [string, string])[] = [\n ['ap-northeast-1', 'Asia Pacific (Tokyo)'],\n ['ap-northeast-2', 'Asia Pacific (Seoul)'],\n ['ap-northeast-3', 'Asia Pacific (Osaka)'],\n ['ap-south-1', 'Asia Pacific (Mumbai)'],\n ['ap-south-2', 'Asia Pacific (Hyderabad)'],\n ['ap-southeast-1', 'Asia Pacific (Singapore)'],\n ['ap-southeast-2', 'Asia Pacific (Sydney)'],\n ['ca-central-1', 'Canada (Central)'],\n ['eu-central-1', 'Europe (Frankfurt)'],\n ['eu-central-2', 'Europe (Zurich)'],\n ['eu-north-1', 'Europe (Stockholm)'],\n ['eu-south-1', 'Europe (Milan)'],\n ['eu-south-2', 'Europe (Spain)'],\n ['eu-west-1', 'Europe (Ireland)'],\n ['eu-west-2', 'Europe (London)'],\n ['eu-west-3', 'Europe (Paris)'],\n ['sa-east-1', 'South America (S\u00E3o Paulo)'],\n ['us-east-1', 'US East (N. Virginia)'],\n ['us-gov-east-1', 'AWS GovCloud (US-East)'],\n ['us-gov-west-1', 'AWS GovCloud (US-West)'],\n ['us-west-2', 'US West (Oregon)'],\n];\n\nexport const DEFAULT_REGION = 'us-west-2';\n\nexport const REGION_FIELD: FieldSpec = {\n name: 'region',\n label: 'Region',\n help: 'The AWS region your Bedrock models run in.',\n options: BEDROCK_REGIONS.map(([value, label]) => ({ value, label: `${label}, ${value}` })),\n value: DEFAULT_REGION,\n env: checked(REGION, 'AWS_REGION', 'Enter an AWS region such as us-west-2.'),\n};\n\nconst ACCOUNT_FIELD: FieldSpec = {\n name: 'account',\n label: 'Account ID',\n required: true,\n placeholder: '0123456789abcdef0123456789abcdef',\n help: 'The 32-character ID on your Cloudflare dashboard\u2019s account overview.',\n env: checked(\n ACCOUNT,\n 'CLOUDFLARE_ACCOUNT_ID',\n 'A Cloudflare account ID is 32 characters of 0\u20139 and a\u2013f.'\n ),\n};\n\nexport const KEY_PROVIDERS: readonly KeyProvider[] = [\n {\n id: 'azure',\n make: azureProvider,\n env: 'AZURE_OPENAI_API_KEY',\n description: 'OpenAI models deployed in your own Azure OpenAI or AI Foundry resource.',\n keyUrl: 'https://portal.azure.com',\n cors: true,\n fields: [\n {\n name: 'endpoint',\n label: 'Endpoint',\n required: true,\n placeholder: 'my-resource or https://my-resource.openai.azure.com',\n help: 'Your resource\u2019s name, or its endpoint address from Keys and Endpoint.',\n customBase: true,\n env: azureEndpoint,\n },\n {\n name: 'deployments',\n label: 'Deployments',\n placeholder: 'gpt-5.4=my-gpt',\n help: 'Only for deployments named differently from their model, as model=deployment, separated by commas.',\n env: (value) =>\n DEPLOYMENTS.test(value)\n ? { AZURE_OPENAI_DEPLOYMENT_NAME_MAP: value }\n : 'Write each deployment as model=deployment, separated by commas.',\n },\n ],\n },\n {\n id: 'cloudflare-workers-ai',\n make: cloudflareWorkersAIProvider,\n env: 'CLOUDFLARE_API_KEY',\n description: 'Open models on Cloudflare Workers AI, in your Cloudflare account.',\n keyUrl: 'https://dash.cloudflare.com/profile/api-tokens',\n cors: false,\n fields: [ACCOUNT_FIELD],\n },\n {\n id: 'cloudflare-ai-gateway',\n make: cloudflareAIGatewayProvider,\n env: 'CLOUDFLARE_API_KEY',\n description: 'Models from many labs through your Cloudflare AI Gateway.',\n keyUrl: 'https://dash.cloudflare.com/profile/api-tokens',\n cors: false,\n fields: [\n ACCOUNT_FIELD,\n {\n name: 'gateway',\n label: 'Gateway ID',\n required: true,\n placeholder: 'my-gateway',\n help: 'The name of your gateway under AI \u203A AI Gateway.',\n env: checked(\n GATEWAY,\n 'CLOUDFLARE_GATEWAY_ID',\n 'A gateway ID is letters, digits, - and _, up to 64 characters.'\n ),\n },\n ],\n },\n {\n id: 'anthropic',\n make: anthropicProvider,\n env: 'ANTHROPIC_API_KEY',\n description: 'Claude models, with an API key from the Claude Console.',\n keyUrl: 'https://console.anthropic.com/settings/keys',\n cors: true,\n },\n {\n id: 'openai',\n make: openaiProvider,\n env: 'OPENAI_API_KEY',\n description: 'GPT models, with an API key from the OpenAI platform.',\n keyUrl: 'https://platform.openai.com/api-keys',\n cors: true,\n },\n {\n id: 'mistral',\n make: mistralProvider,\n env: 'MISTRAL_API_KEY',\n description: 'Mistral and Devstral models from La Plateforme.',\n keyUrl: 'https://console.mistral.ai/api-keys',\n cors: true,\n },\n {\n id: 'groq',\n make: groqProvider,\n env: 'GROQ_API_KEY',\n description: 'Open models on Groq\u2019s fast inference.',\n keyUrl: 'https://console.groq.com/keys',\n cors: true,\n },\n {\n id: 'deepseek',\n make: deepseekProvider,\n env: 'DEEPSEEK_API_KEY',\n description: 'DeepSeek\u2019s own models.',\n keyUrl: 'https://platform.deepseek.com/api_keys',\n cors: true,\n },\n {\n id: 'together',\n make: togetherProvider,\n env: 'TOGETHER_API_KEY',\n description: 'Open models hosted by Together AI.',\n keyUrl: 'https://api.together.ai/settings/api-keys',\n cors: true,\n },\n {\n id: 'huggingface',\n make: huggingfaceProvider,\n env: 'HF_TOKEN',\n description: 'Open models through Hugging Face\u2019s inference router.',\n keyUrl: 'https://huggingface.co/settings/tokens',\n cors: true,\n },\n {\n id: 'xiaomi',\n make: xiaomiProvider,\n env: 'XIAOMI_API_KEY',\n description: 'Xiaomi\u2019s MiMo models.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'xiaomi-token-plan-ams',\n make: xiaomiTokenPlanAmsProvider,\n env: 'XIAOMI_TOKEN_PLAN_AMS_API_KEY',\n description: 'MiMo models on a Xiaomi token plan, served from Amsterdam.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'xiaomi-token-plan-cn',\n make: xiaomiTokenPlanCnProvider,\n env: 'XIAOMI_TOKEN_PLAN_CN_API_KEY',\n description: 'MiMo models on a Xiaomi token plan, served from China.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'xiaomi-token-plan-sgp',\n make: xiaomiTokenPlanSgpProvider,\n env: 'XIAOMI_TOKEN_PLAN_SGP_API_KEY',\n description: 'MiMo models on a Xiaomi token plan, served from Singapore.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'cerebras',\n make: cerebrasProvider,\n env: 'CEREBRAS_API_KEY',\n description: 'Open models on Cerebras inference.',\n keyUrl: 'https://cloud.cerebras.ai',\n cors: false,\n },\n {\n id: 'openrouter',\n make: openrouterProvider,\n env: 'OPENROUTER_API_KEY',\n description: 'Hundreds of models from many labs through one key.',\n keyUrl: 'https://openrouter.ai/settings/keys',\n cors: false,\n },\n {\n id: 'fireworks',\n make: fireworksProvider,\n env: 'FIREWORKS_API_KEY',\n description: 'Open models hosted by Fireworks AI.',\n keyUrl: 'https://app.fireworks.ai/settings/users/api-keys',\n cors: false,\n },\n {\n id: 'baseten',\n make: basetenProvider,\n env: 'BASETEN_API_KEY',\n description: 'Open models hosted by Baseten.',\n keyUrl: 'https://app.baseten.co/settings/api_keys',\n cors: true,\n },\n {\n id: 'moonshotai',\n make: moonshotaiProvider,\n env: 'MOONSHOT_API_KEY',\n description: 'Kimi models from Moonshot AI.',\n keyUrl: 'https://platform.moonshot.ai/console/api-keys',\n cors: true,\n },\n {\n id: 'moonshotai-cn',\n make: moonshotaiCnProvider,\n env: 'MOONSHOT_API_KEY',\n description: 'Kimi models from Moonshot AI\u2019s China platform.',\n keyUrl: 'https://platform.moonshot.cn/console/api-keys',\n cors: true,\n },\n {\n id: 'xai',\n make: xaiProvider,\n env: 'XAI_API_KEY',\n description: 'Grok models from xAI.',\n keyUrl: 'https://console.x.ai',\n cors: true,\n },\n {\n id: 'meta',\n make: metaProvider,\n env: 'META_API_KEY',\n description: 'Meta\u2019s Muse models.',\n keyUrl: 'https://developer.meta.ai',\n cors: true,\n },\n {\n id: 'vercel-ai-gateway',\n make: vercelAIGatewayProvider,\n env: 'AI_GATEWAY_API_KEY',\n description: 'Models from many labs through Vercel\u2019s AI Gateway.',\n keyUrl: 'https://vercel.com/docs/ai-gateway/authentication',\n cors: false,\n },\n {\n id: 'minimax',\n make: minimaxProvider,\n env: 'MINIMAX_API_KEY',\n description: 'MiniMax\u2019s models.',\n keyUrl: 'https://platform.minimax.io/user-center/basic-information/interface-key',\n cors: false,\n },\n {\n id: 'minimax-cn',\n make: minimaxCnProvider,\n env: 'MINIMAX_CN_API_KEY',\n description: 'MiniMax\u2019s models from its China platform.',\n keyUrl: 'https://platform.minimaxi.com/user-center/basic-information/interface-key',\n cors: false,\n },\n {\n id: 'zai',\n make: zaiProvider,\n env: 'ZAI_API_KEY',\n description: 'GLM models on Z.AI\u2019s coding plan.',\n keyUrl: 'https://z.ai/manage-apikey/apikey-list',\n cors: false,\n },\n {\n id: 'zai-coding-cn',\n make: zaiCodingCnProvider,\n env: 'ZAI_CODING_CN_API_KEY',\n description: 'GLM models on Zhipu\u2019s coding plan in China.',\n keyUrl: 'https://open.bigmodel.cn/usercenter/apikeys',\n cors: false,\n },\n {\n id: 'nvidia',\n make: nvidiaProvider,\n env: 'NVIDIA_API_KEY',\n description: 'Open models on NVIDIA\u2019s API catalog.',\n keyUrl: 'https://build.nvidia.com/settings/api-keys',\n cors: false,\n },\n {\n id: 'kimi-coding',\n make: kimiCodingProvider,\n env: 'KIMI_API_KEY',\n description: 'Kimi models on the Kimi Code subscription.',\n keyUrl: 'https://www.kimi.com/code/console',\n cors: false,\n },\n {\n id: 'ant-ling',\n make: antLingProvider,\n env: 'ANT_LING_API_KEY',\n description: 'Ling and Ring models from Ant Group.',\n keyUrl: 'https://www.ant-ling.com',\n cors: false,\n },\n {\n id: 'opencode',\n make: opencodeProvider,\n env: 'OPENCODE_API_KEY',\n description:\n 'Models curated for coding agents by OpenCode Zen. Needs seven\u2019s vault 1.12.2 or later.',\n keyUrl: 'https://opencode.ai/auth',\n cors: false,\n },\n {\n id: 'opencode-go',\n make: opencodeGoProvider,\n env: 'OPENCODE_API_KEY',\n description:\n 'Open models on the OpenCode Go subscription. Needs seven\u2019s vault 1.12.2 or later.',\n keyUrl: 'https://opencode.ai/auth',\n cors: false,\n },\n {\n id: 'qwen-token-plan',\n make: qwenTokenPlanProvider,\n env: 'QWEN_TOKEN_PLAN_API_KEY',\n description: 'Qwen models on an Alibaba Cloud token plan.',\n keyUrl: 'https://modelstudio.console.alibabacloud.com',\n cors: false,\n },\n {\n id: 'qwen-token-plan-cn',\n make: qwenTokenPlanCnProvider,\n env: 'QWEN_TOKEN_PLAN_CN_API_KEY',\n description: 'Qwen models on an Alibaba Cloud token plan in China.',\n keyUrl: 'https://bailian.console.aliyun.com',\n cors: false,\n },\n {\n id: 'qwen-token-plan-individual',\n make: qwenTokenPlanIndividualProvider,\n env: 'QWEN_TOKEN_PLAN_API_KEY',\n description: 'Qwen models on an individual Alibaba Cloud token plan.',\n keyUrl: 'https://modelstudio.console.alibabacloud.com',\n cors: false,\n },\n];\n\nexport type ProviderAuth = 'api-key' | 'oauth' | 'fields' | 'local';\n\nexport interface Listing {\n description: string;\n keyUrl?: string;\n auth: ProviderAuth;\n corsFree: boolean;\n vaultName: string;\n fields?: readonly FieldSpec[];\n}\n\nconst upper = (text: string) => text.toUpperCase().replace(/[^A-Z0-9]/g, '_');\n\nfunction vaultNames(entries: readonly KeyProvider[]): Map<string, string> {\n const uses = Map.groupBy(entries, (entry) => entry.env);\n return new Map(\n entries.map((entry) => [\n entry.id,\n (uses.get(entry.env) as KeyProvider[]).length > 1 ? `${upper(entry.id)}_API_KEY` : entry.env,\n ])\n );\n}\n\nconst named = vaultNames(KEY_PROVIDERS);\n\nexport const LISTINGS: ReadonlyMap<string, Listing> = new Map<string, Listing>([\n [\n 'amazon-bedrock',\n {\n description: 'Claude and other models on AWS, with a Bedrock API key.',\n keyUrl: 'https://console.aws.amazon.com/bedrock/home#/api-keys',\n auth: 'fields',\n corsFree: false,\n vaultName: 'AWS_BEARER_TOKEN_BEDROCK',\n fields: [REGION_FIELD],\n },\n ],\n [\n 'adobe',\n {\n description: 'Models through Adobe\u2019s LLM proxy, with your Adobe ID.',\n auth: 'oauth',\n corsFree: false,\n vaultName: 'ADOBE_IMS_TOKEN',\n },\n ],\n ...KEY_PROVIDERS.map((entry): [string, Listing] => [\n entry.id,\n {\n description: entry.description,\n keyUrl: entry.keyUrl,\n auth: entry.fields ? 'fields' : 'api-key',\n corsFree: !entry.cors,\n vaultName: named.get(entry.id) as string,\n ...(entry.fields ? { fields: entry.fields } : {}),\n },\n ]),\n]);\n\nexport const ADDED_FIRST: readonly string[] = ['amazon-bedrock', 'adobe'];\n\nexport const VAULT_KNOWN: ReadonlySet<string> = new Set(\n [...LISTINGS.keys()].filter((id) => id !== 'adobe')\n);\n"],
|
|
5
|
-
"mappings": "AACA,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAClC,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AACjC,SAAS,mCAAmC;AAC5C,SAAS,mCAAmC;AAC5C,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AACpC,SAAS,0BAA0B;AACnC,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AACnC,SAAS,4BAA4B;AACrC,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,0BAA0B;AACnC,SAAS,0BAA0B;AACnC,SAAS,6BAA6B;AACtC,SAAS,+BAA+B;AACxC,SAAS,uCAAuC;AAChD,SAAS,wBAAwB;AACjC,SAAS,+BAA+B;AACxC,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAC/B,SAAS,kCAAkC;AAC3C,SAAS,iCAAiC;AAC1C,SAAS,kCAAkC;AAC3C,SAAS,mBAAmB;AAC5B,SAAS,2BAA2B;
|
|
4
|
+
"sourcesContent": ["import type { Provider } from '@earendil-works/pi-ai';\nimport { antLingProvider } from '@earendil-works/pi-ai/providers/ant-ling';\nimport { anthropicProvider } from '@earendil-works/pi-ai/providers/anthropic';\nimport { azureProvider } from '@earendil-works/pi-ai/providers/azure';\nimport { basetenProvider } from '@earendil-works/pi-ai/providers/baseten';\nimport { cerebrasProvider } from '@earendil-works/pi-ai/providers/cerebras';\nimport { cloudflareAIGatewayProvider } from '@earendil-works/pi-ai/providers/cloudflare-ai-gateway';\nimport { cloudflareWorkersAIProvider } from '@earendil-works/pi-ai/providers/cloudflare-workers-ai';\nimport { deepseekProvider } from '@earendil-works/pi-ai/providers/deepseek';\nimport { fireworksProvider } from '@earendil-works/pi-ai/providers/fireworks';\nimport { groqProvider } from '@earendil-works/pi-ai/providers/groq';\nimport { huggingfaceProvider } from '@earendil-works/pi-ai/providers/huggingface';\nimport { kimiCodingProvider } from '@earendil-works/pi-ai/providers/kimi-coding';\nimport { metaProvider } from '@earendil-works/pi-ai/providers/meta';\nimport { minimaxProvider } from '@earendil-works/pi-ai/providers/minimax';\nimport { minimaxCnProvider } from '@earendil-works/pi-ai/providers/minimax-cn';\nimport { mistralProvider } from '@earendil-works/pi-ai/providers/mistral';\nimport { moonshotaiProvider } from '@earendil-works/pi-ai/providers/moonshotai';\nimport { moonshotaiCnProvider } from '@earendil-works/pi-ai/providers/moonshotai-cn';\nimport { nvidiaProvider } from '@earendil-works/pi-ai/providers/nvidia';\nimport { openaiProvider } from '@earendil-works/pi-ai/providers/openai';\nimport { opencodeProvider } from '@earendil-works/pi-ai/providers/opencode';\nimport { opencodeGoProvider } from '@earendil-works/pi-ai/providers/opencode-go';\nimport { openrouterProvider } from '@earendil-works/pi-ai/providers/openrouter';\nimport { qwenTokenPlanProvider } from '@earendil-works/pi-ai/providers/qwen-token-plan';\nimport { qwenTokenPlanCnProvider } from '@earendil-works/pi-ai/providers/qwen-token-plan-cn';\nimport { qwenTokenPlanIndividualProvider } from '@earendil-works/pi-ai/providers/qwen-token-plan-individual';\nimport { togetherProvider } from '@earendil-works/pi-ai/providers/together';\nimport { vercelAIGatewayProvider } from '@earendil-works/pi-ai/providers/vercel-ai-gateway';\nimport { xaiProvider } from '@earendil-works/pi-ai/providers/xai';\nimport { xiaomiProvider } from '@earendil-works/pi-ai/providers/xiaomi';\nimport { xiaomiTokenPlanAmsProvider } from '@earendil-works/pi-ai/providers/xiaomi-token-plan-ams';\nimport { xiaomiTokenPlanCnProvider } from '@earendil-works/pi-ai/providers/xiaomi-token-plan-cn';\nimport { xiaomiTokenPlanSgpProvider } from '@earendil-works/pi-ai/providers/xiaomi-token-plan-sgp';\nimport { zaiProvider } from '@earendil-works/pi-ai/providers/zai';\nimport { zaiCodingCnProvider } from '@earendil-works/pi-ai/providers/zai-coding-cn';\n\nexport interface FieldOption {\n value: string;\n label: string;\n}\n\nexport interface FieldInput {\n name: string;\n label: string;\n required?: boolean;\n placeholder?: string;\n help?: string;\n customBase?: true;\n vaultSetting?: string;\n options?: readonly FieldOption[];\n value?: string;\n}\n\nexport interface FieldSpec extends FieldInput {\n env(value: string): Record<string, string> | string;\n}\n\nexport interface KeyProvider {\n id: string;\n make: () => Provider;\n env: string;\n description: string;\n keyUrl: string;\n cors: boolean;\n fields?: readonly FieldSpec[];\n}\n\nconst RESOURCE = /^[a-z0-9][a-z0-9-]{0,62}$/i;\nconst DEPLOYMENTS = /^[^=,\\s]+\\s*=\\s*[^=,\\s]+(\\s*,\\s*[^=,\\s]+\\s*=\\s*[^=,\\s]+)*$/;\n\nexport function httpsBase(value: string): URL | undefined {\n const url = URL.parse(value);\n if (url?.protocol !== 'https:' || url.username || url.password) return undefined;\n return url.port === '' || url.port === '443' ? url : undefined;\n}\n\nfunction azureEndpoint(value: string): Record<string, string> | string {\n if (RESOURCE.test(value)) return { AZURE_OPENAI_RESOURCE_NAME: value };\n const url = httpsBase(value);\n if (!url)\n return 'Enter your Azure resource name, or its endpoint as an https:// address without a port or a user name.';\n return { AZURE_OPENAI_BASE_URL: url.href.replace(/\\/+$/, '') };\n}\n\nexport const AZURE = 'azure';\n\nexport function azureBase(env: Readonly<Record<string, string>>): string | undefined {\n if (env.AZURE_OPENAI_BASE_URL) return env.AZURE_OPENAI_BASE_URL;\n const name = env.AZURE_OPENAI_RESOURCE_NAME;\n return name ? `https://${name}.openai.azure.com/openai/v1` : undefined;\n}\n\nconst REGION = /^[a-z]{2,}(-[a-z]+)+-\\d{1,2}$/;\nconst ACCOUNT = /^[0-9a-f]{32}$/i;\nconst GATEWAY = /^[A-Za-z0-9_-]{1,64}$/;\n\nconst checked =\n (pattern: RegExp, env: string, problem: string) =>\n (value: string): Record<string, string> | string =>\n pattern.test(value) ? { [env]: value } : problem;\n\nconst BEDROCK_REGIONS: readonly (readonly [string, string])[] = [\n ['ap-northeast-1', 'Asia Pacific (Tokyo)'],\n ['ap-northeast-2', 'Asia Pacific (Seoul)'],\n ['ap-northeast-3', 'Asia Pacific (Osaka)'],\n ['ap-south-1', 'Asia Pacific (Mumbai)'],\n ['ap-south-2', 'Asia Pacific (Hyderabad)'],\n ['ap-southeast-1', 'Asia Pacific (Singapore)'],\n ['ap-southeast-2', 'Asia Pacific (Sydney)'],\n ['ca-central-1', 'Canada (Central)'],\n ['eu-central-1', 'Europe (Frankfurt)'],\n ['eu-central-2', 'Europe (Zurich)'],\n ['eu-north-1', 'Europe (Stockholm)'],\n ['eu-south-1', 'Europe (Milan)'],\n ['eu-south-2', 'Europe (Spain)'],\n ['eu-west-1', 'Europe (Ireland)'],\n ['eu-west-2', 'Europe (London)'],\n ['eu-west-3', 'Europe (Paris)'],\n ['sa-east-1', 'South America (S\u00E3o Paulo)'],\n ['us-east-1', 'US East (N. Virginia)'],\n ['us-gov-east-1', 'AWS GovCloud (US-East)'],\n ['us-gov-west-1', 'AWS GovCloud (US-West)'],\n ['us-west-2', 'US West (Oregon)'],\n];\n\nexport const DEFAULT_REGION = 'us-west-2';\n\nexport const REGION_FIELD: FieldSpec = {\n name: 'region',\n label: 'Region',\n help: 'The AWS region your Bedrock models run in.',\n options: BEDROCK_REGIONS.map(([value, label]) => ({ value, label: `${label}, ${value}` })),\n value: DEFAULT_REGION,\n env: checked(REGION, 'AWS_REGION', 'Enter an AWS region such as us-west-2.'),\n};\n\nconst ACCOUNT_FIELD: FieldSpec = {\n name: 'account',\n label: 'Account ID',\n required: true,\n placeholder: '0123456789abcdef0123456789abcdef',\n help: 'The 32-character ID on your Cloudflare dashboard\u2019s account overview.',\n vaultSetting: 'CLOUDFLARE_ACCOUNT_ID',\n env: checked(\n ACCOUNT,\n 'CLOUDFLARE_ACCOUNT_ID',\n 'A Cloudflare account ID is 32 characters of 0\u20139 and a\u2013f.'\n ),\n};\n\nexport const KEY_PROVIDERS: readonly KeyProvider[] = [\n {\n id: 'azure',\n make: azureProvider,\n env: 'AZURE_OPENAI_API_KEY',\n description: 'OpenAI models deployed in your own Azure OpenAI or AI Foundry resource.',\n keyUrl: 'https://portal.azure.com',\n cors: true,\n fields: [\n {\n name: 'endpoint',\n label: 'Endpoint',\n required: true,\n placeholder: 'my-resource or https://my-resource.openai.azure.com',\n help: 'Your resource\u2019s name, or its endpoint address from Keys and Endpoint.',\n customBase: true,\n vaultSetting: 'AZURE_OPENAI_RESOURCE_NAME',\n env: azureEndpoint,\n },\n {\n name: 'deployments',\n label: 'Deployments',\n placeholder: 'gpt-5.4=my-gpt',\n help: 'Only for deployments named differently from their model, as model=deployment, separated by commas.',\n env: (value) =>\n DEPLOYMENTS.test(value)\n ? { AZURE_OPENAI_DEPLOYMENT_NAME_MAP: value }\n : 'Write each deployment as model=deployment, separated by commas.',\n },\n ],\n },\n {\n id: 'cloudflare-workers-ai',\n make: cloudflareWorkersAIProvider,\n env: 'CLOUDFLARE_API_KEY',\n description: 'Open models on Cloudflare Workers AI, in your Cloudflare account.',\n keyUrl: 'https://dash.cloudflare.com/profile/api-tokens',\n cors: false,\n fields: [ACCOUNT_FIELD],\n },\n {\n id: 'cloudflare-ai-gateway',\n make: cloudflareAIGatewayProvider,\n env: 'CLOUDFLARE_API_KEY',\n description: 'Models from many labs through your Cloudflare AI Gateway.',\n keyUrl: 'https://dash.cloudflare.com/profile/api-tokens',\n cors: false,\n fields: [\n ACCOUNT_FIELD,\n {\n name: 'gateway',\n label: 'Gateway ID',\n required: true,\n placeholder: 'my-gateway',\n help: 'The name of your gateway under AI \u203A AI Gateway.',\n vaultSetting: 'CLOUDFLARE_GATEWAY_ID',\n env: checked(\n GATEWAY,\n 'CLOUDFLARE_GATEWAY_ID',\n 'A gateway ID is letters, digits, - and _, up to 64 characters.'\n ),\n },\n ],\n },\n {\n id: 'anthropic',\n make: anthropicProvider,\n env: 'ANTHROPIC_API_KEY',\n description: 'Claude models, with an API key from the Claude Console.',\n keyUrl: 'https://console.anthropic.com/settings/keys',\n cors: true,\n },\n {\n id: 'openai',\n make: openaiProvider,\n env: 'OPENAI_API_KEY',\n description: 'GPT models, with an API key from the OpenAI platform.',\n keyUrl: 'https://platform.openai.com/api-keys',\n cors: true,\n },\n {\n id: 'mistral',\n make: mistralProvider,\n env: 'MISTRAL_API_KEY',\n description: 'Mistral and Devstral models from La Plateforme.',\n keyUrl: 'https://console.mistral.ai/api-keys',\n cors: true,\n },\n {\n id: 'groq',\n make: groqProvider,\n env: 'GROQ_API_KEY',\n description: 'Open models on Groq\u2019s fast inference.',\n keyUrl: 'https://console.groq.com/keys',\n cors: true,\n },\n {\n id: 'deepseek',\n make: deepseekProvider,\n env: 'DEEPSEEK_API_KEY',\n description: 'DeepSeek\u2019s own models.',\n keyUrl: 'https://platform.deepseek.com/api_keys',\n cors: true,\n },\n {\n id: 'together',\n make: togetherProvider,\n env: 'TOGETHER_API_KEY',\n description: 'Open models hosted by Together AI.',\n keyUrl: 'https://api.together.ai/settings/api-keys',\n cors: true,\n },\n {\n id: 'huggingface',\n make: huggingfaceProvider,\n env: 'HF_TOKEN',\n description: 'Open models through Hugging Face\u2019s inference router.',\n keyUrl: 'https://huggingface.co/settings/tokens',\n cors: true,\n },\n {\n id: 'xiaomi',\n make: xiaomiProvider,\n env: 'XIAOMI_API_KEY',\n description: 'Xiaomi\u2019s MiMo models.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'xiaomi-token-plan-ams',\n make: xiaomiTokenPlanAmsProvider,\n env: 'XIAOMI_TOKEN_PLAN_AMS_API_KEY',\n description: 'MiMo models on a Xiaomi token plan, served from Amsterdam.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'xiaomi-token-plan-cn',\n make: xiaomiTokenPlanCnProvider,\n env: 'XIAOMI_TOKEN_PLAN_CN_API_KEY',\n description: 'MiMo models on a Xiaomi token plan, served from China.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'xiaomi-token-plan-sgp',\n make: xiaomiTokenPlanSgpProvider,\n env: 'XIAOMI_TOKEN_PLAN_SGP_API_KEY',\n description: 'MiMo models on a Xiaomi token plan, served from Singapore.',\n keyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n cors: true,\n },\n {\n id: 'cerebras',\n make: cerebrasProvider,\n env: 'CEREBRAS_API_KEY',\n description: 'Open models on Cerebras inference.',\n keyUrl: 'https://cloud.cerebras.ai',\n cors: false,\n },\n {\n id: 'openrouter',\n make: openrouterProvider,\n env: 'OPENROUTER_API_KEY',\n description: 'Hundreds of models from many labs through one key.',\n keyUrl: 'https://openrouter.ai/settings/keys',\n cors: false,\n },\n {\n id: 'fireworks',\n make: fireworksProvider,\n env: 'FIREWORKS_API_KEY',\n description: 'Open models hosted by Fireworks AI.',\n keyUrl: 'https://app.fireworks.ai/settings/users/api-keys',\n cors: false,\n },\n {\n id: 'baseten',\n make: basetenProvider,\n env: 'BASETEN_API_KEY',\n description: 'Open models hosted by Baseten.',\n keyUrl: 'https://app.baseten.co/settings/api_keys',\n cors: true,\n },\n {\n id: 'moonshotai',\n make: moonshotaiProvider,\n env: 'MOONSHOT_API_KEY',\n description: 'Kimi models from Moonshot AI.',\n keyUrl: 'https://platform.moonshot.ai/console/api-keys',\n cors: true,\n },\n {\n id: 'moonshotai-cn',\n make: moonshotaiCnProvider,\n env: 'MOONSHOT_API_KEY',\n description: 'Kimi models from Moonshot AI\u2019s China platform.',\n keyUrl: 'https://platform.moonshot.cn/console/api-keys',\n cors: true,\n },\n {\n id: 'xai',\n make: xaiProvider,\n env: 'XAI_API_KEY',\n description: 'Grok models from xAI.',\n keyUrl: 'https://console.x.ai',\n cors: true,\n },\n {\n id: 'meta',\n make: metaProvider,\n env: 'META_API_KEY',\n description: 'Meta\u2019s Muse models.',\n keyUrl: 'https://developer.meta.ai',\n cors: true,\n },\n {\n id: 'vercel-ai-gateway',\n make: vercelAIGatewayProvider,\n env: 'AI_GATEWAY_API_KEY',\n description: 'Models from many labs through Vercel\u2019s AI Gateway.',\n keyUrl: 'https://vercel.com/docs/ai-gateway/authentication',\n cors: false,\n },\n {\n id: 'minimax',\n make: minimaxProvider,\n env: 'MINIMAX_API_KEY',\n description: 'MiniMax\u2019s models.',\n keyUrl: 'https://platform.minimax.io/user-center/basic-information/interface-key',\n cors: false,\n },\n {\n id: 'minimax-cn',\n make: minimaxCnProvider,\n env: 'MINIMAX_CN_API_KEY',\n description: 'MiniMax\u2019s models from its China platform.',\n keyUrl: 'https://platform.minimaxi.com/user-center/basic-information/interface-key',\n cors: false,\n },\n {\n id: 'zai',\n make: zaiProvider,\n env: 'ZAI_API_KEY',\n description: 'GLM models on Z.AI\u2019s coding plan.',\n keyUrl: 'https://z.ai/manage-apikey/apikey-list',\n cors: false,\n },\n {\n id: 'zai-coding-cn',\n make: zaiCodingCnProvider,\n env: 'ZAI_CODING_CN_API_KEY',\n description: 'GLM models on Zhipu\u2019s coding plan in China.',\n keyUrl: 'https://open.bigmodel.cn/usercenter/apikeys',\n cors: false,\n },\n {\n id: 'nvidia',\n make: nvidiaProvider,\n env: 'NVIDIA_API_KEY',\n description: 'Open models on NVIDIA\u2019s API catalog.',\n keyUrl: 'https://build.nvidia.com/settings/api-keys',\n cors: false,\n },\n {\n id: 'kimi-coding',\n make: kimiCodingProvider,\n env: 'KIMI_API_KEY',\n description: 'Kimi models on the Kimi Code subscription.',\n keyUrl: 'https://www.kimi.com/code/console',\n cors: false,\n },\n {\n id: 'ant-ling',\n make: antLingProvider,\n env: 'ANT_LING_API_KEY',\n description: 'Ling and Ring models from Ant Group.',\n keyUrl: 'https://www.ant-ling.com',\n cors: false,\n },\n {\n id: 'opencode',\n make: opencodeProvider,\n env: 'OPENCODE_API_KEY',\n description:\n 'Models curated for coding agents by OpenCode Zen. Needs seven\u2019s vault 1.12.2 or later.',\n keyUrl: 'https://opencode.ai/auth',\n cors: false,\n },\n {\n id: 'opencode-go',\n make: opencodeGoProvider,\n env: 'OPENCODE_API_KEY',\n description:\n 'Open models on the OpenCode Go subscription. Needs seven\u2019s vault 1.12.2 or later.',\n keyUrl: 'https://opencode.ai/auth',\n cors: false,\n },\n {\n id: 'qwen-token-plan',\n make: qwenTokenPlanProvider,\n env: 'QWEN_TOKEN_PLAN_API_KEY',\n description: 'Qwen models on an Alibaba Cloud token plan.',\n keyUrl: 'https://modelstudio.console.alibabacloud.com',\n cors: false,\n },\n {\n id: 'qwen-token-plan-cn',\n make: qwenTokenPlanCnProvider,\n env: 'QWEN_TOKEN_PLAN_CN_API_KEY',\n description: 'Qwen models on an Alibaba Cloud token plan in China.',\n keyUrl: 'https://bailian.console.aliyun.com',\n cors: false,\n },\n {\n id: 'qwen-token-plan-individual',\n make: qwenTokenPlanIndividualProvider,\n env: 'QWEN_TOKEN_PLAN_API_KEY',\n description: 'Qwen models on an individual Alibaba Cloud token plan.',\n keyUrl: 'https://modelstudio.console.alibabacloud.com',\n cors: false,\n },\n];\n\nexport type ProviderAuth = 'api-key' | 'oauth' | 'fields' | 'local';\n\nexport interface Listing {\n description: string;\n keyUrl?: string;\n auth: ProviderAuth;\n corsFree: boolean;\n vaultName: string;\n fields?: readonly FieldSpec[];\n}\n\nconst upper = (text: string) => text.toUpperCase().replace(/[^A-Z0-9]/g, '_');\n\nfunction vaultNames(entries: readonly KeyProvider[]): Map<string, string> {\n const uses = Map.groupBy(entries, (entry) => entry.env);\n return new Map(\n entries.map((entry) => [\n entry.id,\n (uses.get(entry.env) as KeyProvider[]).length > 1 ? `${upper(entry.id)}_API_KEY` : entry.env,\n ])\n );\n}\n\nconst named = vaultNames(KEY_PROVIDERS);\n\nexport const LISTINGS: ReadonlyMap<string, Listing> = new Map<string, Listing>([\n [\n 'amazon-bedrock',\n {\n description: 'Claude and other models on AWS, with a Bedrock API key.',\n keyUrl: 'https://console.aws.amazon.com/bedrock/home#/api-keys',\n auth: 'fields',\n corsFree: false,\n vaultName: 'AWS_BEARER_TOKEN_BEDROCK',\n fields: [REGION_FIELD],\n },\n ],\n [\n 'adobe',\n {\n description: 'Models through Adobe\u2019s LLM proxy, with your Adobe ID.',\n auth: 'oauth',\n corsFree: false,\n vaultName: 'ADOBE_IMS_TOKEN',\n },\n ],\n ...KEY_PROVIDERS.map((entry): [string, Listing] => [\n entry.id,\n {\n description: entry.description,\n keyUrl: entry.keyUrl,\n auth: entry.fields ? 'fields' : 'api-key',\n corsFree: !entry.cors,\n vaultName: named.get(entry.id) as string,\n ...(entry.fields ? { fields: entry.fields } : {}),\n },\n ]),\n]);\n\nexport const ADDED_FIRST: readonly string[] = ['amazon-bedrock', 'adobe'];\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -38,17 +38,6 @@ function modelRoute(bases, records) {
|
|
|
38
38
|
return matched.length || held.length ? null : void 0;
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
|
-
function modelEndpoints(bases) {
|
|
42
|
-
const seen = /* @__PURE__ */ new Set();
|
|
43
|
-
return bases.flatMap(
|
|
44
|
-
({ provider, urls }) => urls.filter(modelUrl).flatMap((url) => {
|
|
45
|
-
const key = `${provider} ${url}`;
|
|
46
|
-
if (seen.has(key)) return [];
|
|
47
|
-
seen.add(key);
|
|
48
|
-
return [{ provider, url }];
|
|
49
|
-
})
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
41
|
function mcpEndpoints(servers, tokens) {
|
|
53
42
|
return servers.filter((entry) => mcpUrl(entry.url)).map(({ server, url, names }) => {
|
|
54
43
|
const tokenUrl = tokens.get(server);
|
|
@@ -62,12 +51,11 @@ function mcpEndpoints(servers, tokens) {
|
|
|
62
51
|
});
|
|
63
52
|
}
|
|
64
53
|
function vaultEndpoints(vault) {
|
|
65
|
-
let model = [];
|
|
66
54
|
let servers = [];
|
|
67
55
|
const tokens = /* @__PURE__ */ new Map();
|
|
68
56
|
let last = "";
|
|
69
57
|
const send = async (force = false) => {
|
|
70
|
-
const set = {
|
|
58
|
+
const set = { mcp: mcpEndpoints(servers, tokens) };
|
|
71
59
|
const key = JSON.stringify(set);
|
|
72
60
|
if (!vault.connected || !force && key === last) return;
|
|
73
61
|
last = key;
|
|
@@ -83,10 +71,6 @@ function vaultEndpoints(vault) {
|
|
|
83
71
|
if (opened) void send(true).catch(() => void 0);
|
|
84
72
|
});
|
|
85
73
|
return {
|
|
86
|
-
models(bases) {
|
|
87
|
-
model = modelEndpoints(bases);
|
|
88
|
-
return send();
|
|
89
|
-
},
|
|
90
74
|
servers(next) {
|
|
91
75
|
servers = next;
|
|
92
76
|
return send();
|
|
@@ -102,7 +86,6 @@ export {
|
|
|
102
86
|
BEDROCK_ENDPOINTS,
|
|
103
87
|
mcpEndpoints,
|
|
104
88
|
mcpUrl,
|
|
105
|
-
modelEndpoints,
|
|
106
89
|
modelRoute,
|
|
107
90
|
modelUrl,
|
|
108
91
|
pattern,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/secrets/endpoints.ts"],
|
|
4
|
-
"sourcesContent": ["import type { McpServerEntry
|
|
5
|
-
"mappings": "AAKO,MAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AACF;AAEA,MAAM,OAAO;AACb,MAAM,SAAS;AACf,MAAM,SAAS;AAEf,SAAS,MAAM,KAAmB;AAChC,SAAO,CAAC,IAAI,YAAY,CAAC,IAAI,aAAa,IAAI,SAAS,MAAM,IAAI,SAAS;AAC5E;AAEO,SAAS,SAAS,KAAsB;AAC7C,QAAM,MAAM,IAAI,MAAM,GAAG;AACzB,SAAO,CAAC,CAAC,OAAO,IAAI,aAAa,YAAY,MAAM,GAAG,KAAK,CAAC,IAAI,SAAS,GAAG;AAC9E;AAEA,SAAS,UAAU,KAAmB;AACpC,QAAM,OAAO,OAAO,OAAO,KAAK,IAAI,QAAQ,IAAI,CAAC,KAAK,CAAC;AACvD,SACE,IAAI,aAAa,WAAW,IAAI,SAAS,MAAM,QAAQ,KAAK,QAAQ,SAAS,SAAS;AAE1F;AAEO,SAAS,OAAO,KAAsB;AAC3C,QAAM,MAAM,IAAI,MAAM,GAAG;AACzB,SACE,CAAC,CAAC,OACF,CAAC,IAAI,YACL,CAAC,IAAI,aACJ,UAAU,GAAG,KAAM,IAAI,aAAa,YAAY,MAAM,GAAG;AAE9D;AAEA,MAAM,UAAU,CAAC,SAAiB,KAAK,QAAQ,qBAAqB,MAAM;AAEnE,SAAS,QAAQ,MAAsB;AAC5C,QAAM,UAAU,KAAK,QAAQ,QAAQ,EAAE;AACvC,QAAM,SAAS,QACZ,MAAM,aAAa,EACnB,IAAI,CAAC,SAAU,cAAc,KAAK,IAAI,IAAI,WAAW,QAAQ,IAAI,CAAE,EACnE,KAAK,EAAE;AACV,SAAO,IAAI,OAAO,IAAI,MAAM,eAAe,GAAG;AAChD;AAOO,SAAS,WACd,OACA,SACY;AACZ,SAAO,CAAC,YAAY;AAClB,UAAM,MAAM,QAAQ;AACpB,UAAM,UAAU,MAAM,EACnB,OAAO,CAAC,EAAE,KAAK,MAAM,KAAK,KAAK,CAAC,SAAS,QAAQ,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EACjE,IAAI,CAAC,EAAE,SAAS,MAAM,QAAQ;AACjC,UAAM,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK,IAAI;AAC/E,UAAM,OAAO,QAAQ,EAClB,OAAO,CAAC,WAAW,OAAO,SAAS,WAAW,KAAK,SAAS,OAAO,WAAW,CAAC,EAC/E,IAAI,CAAC,WAAW,OAAO,QAAQ;AAClC,UAAM,QAAQ,QAAQ,OAAO,CAAC,aAAa,KAAK,SAAS,QAAQ,CAAC;AAClE,QAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC;AACtC,QAAI,QAAQ,WAAW,KAAK,CAAC,KAAK,OAAQ,QAAO,QAAQ,CAAC;AAC1D,WAAO,QAAQ,UAAU,KAAK,SAAS,OAAO;AAAA,EAChD;AACF;
|
|
4
|
+
"sourcesContent": ["import type { McpServerEntry } from '@ai-ecoverse/slicc-vault';\nimport type { ModelRoute } from './fetch.ts';\nimport type { AgentRecord } from './records.ts';\nimport type { Vault } from './vault.ts';\n\nexport const BEDROCK_ENDPOINTS = [\n 'https://bedrock-runtime.{region}.amazonaws.com',\n 'https://bedrock-runtime-fips.{region}.amazonaws.com',\n];\n\nconst NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst KERNEL = /^(\\d{1,5})\\.kernel\\.localhost$/;\nconst FACADE = 9222;\n\nfunction plain(url: URL): boolean {\n return !url.username && !url.password && (url.port === '' || url.port === '443');\n}\n\nexport function modelUrl(raw: string): boolean {\n const url = URL.parse(raw);\n return !!url && url.protocol === 'https:' && plain(url) && !raw.includes('{');\n}\n\nfunction kernelUrl(url: URL): boolean {\n const port = Number(KERNEL.exec(url.hostname)?.[1] ?? 0);\n return (\n url.protocol === 'http:' && url.port === '' && port >= 1 && port <= 65535 && port !== FACADE\n );\n}\n\nexport function mcpUrl(raw: string): boolean {\n const url = URL.parse(raw);\n return (\n !!url &&\n !url.username &&\n !url.password &&\n (kernelUrl(url) || (url.protocol === 'https:' && plain(url)))\n );\n}\n\nconst escaped = (text: string) => text.replace(/[.*+?^$()|[\\]\\\\]/g, '\\\\$&');\n\nexport function pattern(base: string): RegExp {\n const trimmed = base.replace(/\\/+$/, '');\n const source = trimmed\n .split(/(\\{[^}]+\\})/)\n .map((part) => (/^\\{[^}]+\\}$/.test(part) ? '[^./]+' : escaped(part)))\n .join('');\n return new RegExp(`^${source}(?:[/?#]|$)`, 'i');\n}\n\nexport interface ModelBases {\n provider: string;\n urls: readonly string[];\n}\n\nexport function modelRoute(\n bases: () => readonly ModelBases[],\n records: () => readonly AgentRecord[]\n): ModelRoute {\n return (request) => {\n const url = request.url;\n const matched = bases()\n .filter(({ urls }) => urls.some((base) => pattern(base).test(url)))\n .map(({ provider }) => provider);\n const head = [url, ...[...request.headers].map(([, value]) => value)].join('\\n');\n const held = records()\n .filter((record) => record.kind === 'model' && head.includes(record.placeholder))\n .map((record) => record.provider);\n const owned = matched.filter((provider) => held.includes(provider));\n if (owned.length === 1) return owned[0];\n if (matched.length === 1 && !held.length) return matched[0];\n return matched.length || held.length ? null : undefined;\n };\n}\n\nexport interface McpServerSource {\n server: string;\n url: string;\n names: readonly string[];\n}\n\nexport function mcpEndpoints(\n servers: readonly McpServerSource[],\n tokens: ReadonlyMap<string, string>\n): McpServerEntry[] {\n return servers\n .filter((entry) => mcpUrl(entry.url))\n .map(({ server, url, names }) => {\n const tokenUrl = tokens.get(server);\n const valid = names.filter((name) => NAME.test(name));\n return {\n server,\n url,\n ...(valid.length ? { names: valid } : {}),\n ...(tokenUrl && modelUrl(tokenUrl) ? { tokenUrl } : {}),\n };\n });\n}\n\nexport interface Endpoints {\n servers(servers: readonly McpServerSource[]): Promise<void>;\n token(server: string, url: string): Promise<void>;\n close(): void;\n}\n\nexport function vaultEndpoints(vault: Pick<Vault, 'state' | 'connected' | 'endpoints'>): Endpoints {\n let servers: readonly McpServerSource[] = [];\n const tokens = new Map<string, string>();\n let last = '';\n const send = async (force = false) => {\n const set = { mcp: mcpEndpoints(servers, tokens) };\n const key = JSON.stringify(set);\n if (!vault.connected || (!force && key === last)) return;\n last = key;\n await vault.endpoints(set).catch((error: unknown) => {\n if (last === key) last = '';\n throw error;\n });\n };\n let port = vault.state.value.port;\n const off = vault.state.subscribe((value) => {\n const opened = port === 'none' && value.port !== 'none';\n port = value.port;\n if (opened) void send(true).catch(() => undefined);\n });\n return {\n servers(next) {\n servers = next;\n return send();\n },\n token(server, url) {\n if (!tokens.has(server)) tokens.set(server, new URL(url).href);\n return send();\n },\n close: off,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/secrets/vault.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/secrets/vault.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Hit } from '@ai-ecoverse/slicc-scrub';\nimport type {\n AgentRecord,\n ErrorCode,\n McpServerEntry,\n ModelEndpoint,\n OAuthConfig,\n OutgoingRequest,\n} from '@ai-ecoverse/slicc-vault';\nimport { type MutableReplicatedState, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { Scrub, Scrubbable, ScrubStream } from './scrub.ts';\nimport { vaultHold } from './view.ts';\n\nexport type ScrubPair = { needed: boolean; version: number };\nexport type Locked = 'no' | 'scrubbing' | 'passkey';\n\nexport interface VaultState {\n port: 'none' | 'ready' | 'waiting';\n needed: boolean;\n version: number;\n locked: Locked;\n held: number;\n}\n\nexport const WAITING_MS = 2000;\nexport const WAITING = 'waiting for the vault';\n\ntype Message = Record<string, unknown> & { v: 1; id: number; op: string };\n\nexport class VaultRefusal extends Error {\n readonly code: ErrorCode | undefined;\n\n constructor(code: ErrorCode | undefined, message: string) {\n super(message);\n this.name = 'VaultRefusal';\n this.code = code;\n }\n}\n\nexport type RefreshTarget = { server: string } | { provider: string };\n\nexport interface Granted {\n response: string | Uint8Array;\n records: { kind: string; name: string; placeholder: string }[];\n expiresAt?: number;\n}\n\nexport interface EndpointSet {\n model: ModelEndpoint[];\n mcp: McpServerEntry[];\n}\n\ninterface Pending {\n message: Message;\n at: number;\n resolve(value: unknown): void;\n reject(error: Error): void;\n}\n\ntype Answer = Record<string, unknown> & {\n id?: unknown;\n error?: { code?: ErrorCode; message?: string };\n scrub?: unknown;\n locked?: unknown;\n version?: unknown;\n};\n\nconst LOCKS: readonly unknown[] = ['no', 'scrubbing', 'passkey'];\n\nconst EMPTY = new Uint8Array();\n\nfunction pairOf(value: unknown): ScrubPair | undefined {\n const pair = value as Partial<ScrubPair> | null;\n if (pair === null) return { needed: false, version: 0 };\n if (typeof pair?.needed !== 'boolean' || typeof pair.version !== 'number') return undefined;\n return { needed: pair.needed, version: pair.version };\n}\n\nexport class Vault implements Scrub {\n readonly state: MutableReplicatedState<VaultState>;\n readonly #pending = new Map<number, Pending>();\n readonly #streams = new Set<string>();\n readonly #waiters = new Set<() => void>();\n readonly #now: () => number;\n #port: MessagePort | undefined;\n #pair: ScrubPair = { needed: false, version: 0 };\n #locked: Locked = 'no';\n #seen = 0;\n #serial = 0;\n #streamSerial = 0;\n readonly #tag = Math.random().toString(36).slice(2, 10);\n\n constructor(now: () => number = Date.now) {\n this.#now = now;\n this.state = replicatedState<VaultState>(this.#snapshot());\n }\n\n get needed(): boolean {\n return this.#pair.needed || this.#seen > this.#pair.version;\n }\n\n get connected(): boolean {\n return this.#port !== undefined;\n }\n\n connect(port: MessagePort | undefined, scrub: unknown, locked?: unknown): void {\n const pair = scrub === undefined ? undefined : pairOf(scrub);\n if (pair) this.#pair = pair;\n if (typeof locked === 'boolean') this.#locked = locked ? 'passkey' : 'no';\n if (port && port !== this.#port) {\n if (this.#port) this.#port.onmessage = null;\n this.#port = port;\n port.onmessage = (event) => this.#answer(event.data as Answer);\n port.start?.();\n const resend = [...this.#pending.values()];\n const opening = new Set(\n resend\n .filter((item) => item.message.op === 'redactStream')\n .map((item) => item.message.stream)\n );\n for (const stream of this.#streams)\n if (!opening.has(stream)) void this.#call('redactStream', { stream });\n for (const item of resend) port.postMessage(item.message);\n }\n this.#refresh();\n }\n\n ready(): Promise<void> {\n if (!this.#holding()) return Promise.resolve();\n return new Promise((resolve) => this.#waiters.add(resolve));\n }\n\n async texts<T extends Scrubbable>(texts: readonly T[]): Promise<T[]> {\n if (!this.needed) return [...texts];\n const answer = (await this.#call('redact', { texts: [...texts] })) as {\n texts: T[];\n hits: Hit[];\n version: number;\n };\n return answer.texts;\n }\n\n async model(provider: string | undefined, request: OutgoingRequest): Promise<OutgoingRequest> {\n const fields = provider === undefined ? { request } : { provider, request };\n return ((await this.#call('model', fields)) as { request: OutgoingRequest }).request;\n }\n\n async mcp(server: string, request: OutgoingRequest): Promise<OutgoingRequest> {\n return ((await this.#call('mcp', { server, request })) as { request: OutgoingRequest }).request;\n }\n\n async records(): Promise<AgentRecord[]> {\n return ((await this.#call('records', {})) as { records: AgentRecord[] }).records;\n }\n\n async grant(\n server: string,\n response: string | Uint8Array,\n oauth: OAuthConfig,\n name?: string\n ): Promise<Granted> {\n const fields = { server, response, oauth, ...(name === undefined ? {} : { name }) };\n const { response: shown, records, expiresAt } = (await this.#call('grant', fields)) as Granted;\n return { response: shown, records, ...(expiresAt === undefined ? {} : { expiresAt }) };\n }\n\n async refresh(target: RefreshTarget, name?: string): Promise<string> {\n const fields = { ...target, ...(name === undefined ? {} : { name }) };\n return ((await this.#call('refresh', fields)) as { state: string }).state;\n }\n\n async endpoints(set: EndpointSet): Promise<void> {\n await this.#call('endpoints', { model: set.model, mcp: set.mcp });\n }\n\n stream(): ScrubStream {\n let stream: string | undefined;\n return {\n push: (chunk) => {\n if (stream === undefined && !this.needed) return Promise.resolve(chunk);\n if (stream === undefined) {\n stream = `${this.#tag}-${++this.#streamSerial}`;\n this.#streams.add(stream);\n void this.#call('redactStream', { stream });\n }\n return this.#call('push', { stream, chunk }).then(\n (answer) => (answer as { chunk: Uint8Array }).chunk\n );\n },\n end: async () => {\n if (stream === undefined) return EMPTY;\n const { chunk: tail } = (await this.#call('end', { stream })) as { chunk: Uint8Array };\n this.#streams.delete(stream);\n return tail;\n },\n drop: () => {\n if (stream === undefined) return;\n const dropped = stream;\n this.#streams.delete(dropped);\n for (const [id, item] of this.#pending)\n if (item.message.stream === dropped && item.message.op !== 'redactStream') {\n this.#pending.delete(id);\n item.resolve({ chunk: EMPTY });\n }\n void this.#call('drop', { stream: dropped });\n },\n };\n }\n\n #call(op: string, fields: Record<string, unknown>): Promise<unknown> {\n const message: Message = { v: 1, id: ++this.#serial, op, ...fields };\n const result = new Promise((resolve, reject) => {\n this.#pending.set(message.id, { message, at: this.#now(), resolve, reject });\n });\n this.#port?.postMessage(message);\n setTimeout(() => this.#refresh(), WAITING_MS);\n this.#refresh();\n return result;\n }\n\n #answer(data: Answer): void {\n if (!data || typeof data !== 'object') return;\n const pair = 'scrub' in data ? pairOf(data.scrub) : undefined;\n if (pair) this.#pair = pair;\n if (LOCKS.includes(data.locked)) this.#locked = data.locked as Locked;\n if (data.op === 'welcome') this.#welcome(data.status);\n const item = typeof data.id === 'number' ? this.#pending.get(data.id) : undefined;\n if (item) {\n this.#pending.delete(data.id as number);\n if (typeof data.version === 'number') this.#seen = Math.max(this.#seen, data.version);\n if (data.error)\n item.reject(new VaultRefusal(data.error.code, data.error.message ?? 'the vault refused'));\n else item.resolve(data);\n }\n this.#refresh();\n }\n\n #welcome(status: unknown): void {\n const given = status as { scrub?: unknown; locked?: unknown } | null;\n const pair = given && 'scrub' in given ? pairOf(given.scrub) : undefined;\n if (pair) this.#pair = pair;\n if (typeof given?.locked === 'boolean') this.#locked = given.locked ? 'passkey' : 'no';\n }\n\n #waiting(): boolean {\n const now = this.#now();\n return [...this.#pending.values()].some((item) => now - item.at >= WAITING_MS);\n }\n\n #holding(): boolean {\n return this.needed && (!this.#port || this.#waiting() || this.#locked === 'passkey');\n }\n\n #snapshot(): VaultState {\n return {\n port: !this.#port ? 'none' : this.#waiting() ? 'waiting' : 'ready',\n needed: this.needed,\n version: this.#pair.version,\n locked: this.#locked,\n held: this.#pending.size,\n };\n }\n\n #refresh(): void {\n const next = this.#snapshot();\n const before = this.state.value;\n if (Object.entries(next).some(([key, value]) => before[key as keyof VaultState] !== value))\n this.state.replace(BACKGROUND_CONTEXT, next);\n if (this.#holding()) return;\n for (const resolve of this.#waiters) resolve();\n this.#waiters.clear();\n }\n}\n\nexport function holdText(state: VaultState): string | undefined {\n const hold = vaultHold(state);\n if (!hold) return undefined;\n return hold.reason === 'locked' ? 'unlock the vault to continue' : WAITING;\n}\n\nexport function listenVault(\n scope: { addEventListener(type: 'message', listener: (event: MessageEvent) => void): void },\n vault: Vault\n): void {\n scope.addEventListener('message', ({ data }) => {\n const message = data as { vault?: MessagePort; scrub?: unknown; locked?: unknown } | null;\n if (!message || typeof message !== 'object') return;\n if (!('vault' in message || 'scrub' in message || 'locked' in message)) return;\n vault.connect(message.vault, message.scrub, message.locked);\n });\n}\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import type { Hit } from '@ai-ecoverse/slicc-scrub';\nimport type {\n AgentRecord,\n ErrorCode,\n McpServerEntry,\n OAuthConfig,\n OutgoingRequest,\n} from '@ai-ecoverse/slicc-vault';\nimport { type MutableReplicatedState, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { Scrub, Scrubbable, ScrubStream } from './scrub.ts';\nimport { vaultHold } from './view.ts';\n\nexport type ScrubPair = { needed: boolean; version: number };\nexport type Locked = 'no' | 'scrubbing' | 'passkey';\n\nexport interface VaultState {\n port: 'none' | 'ready' | 'waiting';\n needed: boolean;\n version: number;\n locked: Locked;\n held: number;\n}\n\nexport const WAITING_MS = 2000;\nexport const WAITING = 'waiting for the vault';\n\ntype Message = Record<string, unknown> & { v: 1; id: number; op: string };\n\nexport class VaultRefusal extends Error {\n readonly code: ErrorCode | undefined;\n\n constructor(code: ErrorCode | undefined, message: string) {\n super(message);\n this.name = 'VaultRefusal';\n this.code = code;\n }\n}\n\nexport type RefreshTarget = { server: string } | { provider: string };\n\nexport interface Granted {\n response: string | Uint8Array;\n records: { kind: string; name: string; placeholder: string }[];\n expiresAt?: number;\n}\n\nexport interface EndpointSet {\n mcp: McpServerEntry[];\n}\n\ninterface Pending {\n message: Message;\n at: number;\n resolve(value: unknown): void;\n reject(error: Error): void;\n}\n\ntype Answer = Record<string, unknown> & {\n id?: unknown;\n error?: { code?: ErrorCode; message?: string };\n scrub?: unknown;\n locked?: unknown;\n version?: unknown;\n};\n\nconst LOCKS: readonly unknown[] = ['no', 'scrubbing', 'passkey'];\n\nconst EMPTY = new Uint8Array();\n\nfunction pairOf(value: unknown): ScrubPair | undefined {\n const pair = value as Partial<ScrubPair> | null;\n if (pair === null) return { needed: false, version: 0 };\n if (typeof pair?.needed !== 'boolean' || typeof pair.version !== 'number') return undefined;\n return { needed: pair.needed, version: pair.version };\n}\n\nexport class Vault implements Scrub {\n readonly state: MutableReplicatedState<VaultState>;\n readonly #pending = new Map<number, Pending>();\n readonly #streams = new Set<string>();\n readonly #waiters = new Set<() => void>();\n readonly #now: () => number;\n #port: MessagePort | undefined;\n #pair: ScrubPair = { needed: false, version: 0 };\n #locked: Locked = 'no';\n #seen = 0;\n #serial = 0;\n #streamSerial = 0;\n readonly #tag = Math.random().toString(36).slice(2, 10);\n\n constructor(now: () => number = Date.now) {\n this.#now = now;\n this.state = replicatedState<VaultState>(this.#snapshot());\n }\n\n get needed(): boolean {\n return this.#pair.needed || this.#seen > this.#pair.version;\n }\n\n get connected(): boolean {\n return this.#port !== undefined;\n }\n\n connect(port: MessagePort | undefined, scrub: unknown, locked?: unknown): void {\n const pair = scrub === undefined ? undefined : pairOf(scrub);\n if (pair) this.#pair = pair;\n if (typeof locked === 'boolean') this.#locked = locked ? 'passkey' : 'no';\n if (port && port !== this.#port) {\n if (this.#port) this.#port.onmessage = null;\n this.#port = port;\n port.onmessage = (event) => this.#answer(event.data as Answer);\n port.start?.();\n const resend = [...this.#pending.values()];\n const opening = new Set(\n resend\n .filter((item) => item.message.op === 'redactStream')\n .map((item) => item.message.stream)\n );\n for (const stream of this.#streams)\n if (!opening.has(stream)) void this.#call('redactStream', { stream });\n for (const item of resend) port.postMessage(item.message);\n }\n this.#refresh();\n }\n\n ready(): Promise<void> {\n if (!this.#holding()) return Promise.resolve();\n return new Promise((resolve) => this.#waiters.add(resolve));\n }\n\n async texts<T extends Scrubbable>(texts: readonly T[]): Promise<T[]> {\n if (!this.needed) return [...texts];\n const answer = (await this.#call('redact', { texts: [...texts] })) as {\n texts: T[];\n hits: Hit[];\n version: number;\n };\n return answer.texts;\n }\n\n async model(provider: string | undefined, request: OutgoingRequest): Promise<OutgoingRequest> {\n const fields = provider === undefined ? { request } : { provider, request };\n return ((await this.#call('model', fields)) as { request: OutgoingRequest }).request;\n }\n\n async mcp(server: string, request: OutgoingRequest): Promise<OutgoingRequest> {\n return ((await this.#call('mcp', { server, request })) as { request: OutgoingRequest }).request;\n }\n\n async records(): Promise<AgentRecord[]> {\n return ((await this.#call('records', {})) as { records: AgentRecord[] }).records;\n }\n\n async grant(\n server: string,\n response: string | Uint8Array,\n oauth: OAuthConfig,\n name?: string\n ): Promise<Granted> {\n const fields = { server, response, oauth, ...(name === undefined ? {} : { name }) };\n const { response: shown, records, expiresAt } = (await this.#call('grant', fields)) as Granted;\n return { response: shown, records, ...(expiresAt === undefined ? {} : { expiresAt }) };\n }\n\n async refresh(target: RefreshTarget, name?: string): Promise<string> {\n const fields = { ...target, ...(name === undefined ? {} : { name }) };\n return ((await this.#call('refresh', fields)) as { state: string }).state;\n }\n\n async endpoints(set: EndpointSet): Promise<void> {\n await this.#call('endpoints', { mcp: set.mcp });\n }\n\n stream(): ScrubStream {\n let stream: string | undefined;\n return {\n push: (chunk) => {\n if (stream === undefined && !this.needed) return Promise.resolve(chunk);\n if (stream === undefined) {\n stream = `${this.#tag}-${++this.#streamSerial}`;\n this.#streams.add(stream);\n void this.#call('redactStream', { stream });\n }\n return this.#call('push', { stream, chunk }).then(\n (answer) => (answer as { chunk: Uint8Array }).chunk\n );\n },\n end: async () => {\n if (stream === undefined) return EMPTY;\n const { chunk: tail } = (await this.#call('end', { stream })) as { chunk: Uint8Array };\n this.#streams.delete(stream);\n return tail;\n },\n drop: () => {\n if (stream === undefined) return;\n const dropped = stream;\n this.#streams.delete(dropped);\n for (const [id, item] of this.#pending)\n if (item.message.stream === dropped && item.message.op !== 'redactStream') {\n this.#pending.delete(id);\n item.resolve({ chunk: EMPTY });\n }\n void this.#call('drop', { stream: dropped });\n },\n };\n }\n\n #call(op: string, fields: Record<string, unknown>): Promise<unknown> {\n const message: Message = { v: 1, id: ++this.#serial, op, ...fields };\n const result = new Promise((resolve, reject) => {\n this.#pending.set(message.id, { message, at: this.#now(), resolve, reject });\n });\n this.#port?.postMessage(message);\n setTimeout(() => this.#refresh(), WAITING_MS);\n this.#refresh();\n return result;\n }\n\n #answer(data: Answer): void {\n if (!data || typeof data !== 'object') return;\n const pair = 'scrub' in data ? pairOf(data.scrub) : undefined;\n if (pair) this.#pair = pair;\n if (LOCKS.includes(data.locked)) this.#locked = data.locked as Locked;\n if (data.op === 'welcome') this.#welcome(data.status);\n const item = typeof data.id === 'number' ? this.#pending.get(data.id) : undefined;\n if (item) {\n this.#pending.delete(data.id as number);\n if (typeof data.version === 'number') this.#seen = Math.max(this.#seen, data.version);\n if (data.error)\n item.reject(new VaultRefusal(data.error.code, data.error.message ?? 'the vault refused'));\n else item.resolve(data);\n }\n this.#refresh();\n }\n\n #welcome(status: unknown): void {\n const given = status as { scrub?: unknown; locked?: unknown } | null;\n const pair = given && 'scrub' in given ? pairOf(given.scrub) : undefined;\n if (pair) this.#pair = pair;\n if (typeof given?.locked === 'boolean') this.#locked = given.locked ? 'passkey' : 'no';\n }\n\n #waiting(): boolean {\n const now = this.#now();\n return [...this.#pending.values()].some((item) => now - item.at >= WAITING_MS);\n }\n\n #holding(): boolean {\n return this.needed && (!this.#port || this.#waiting() || this.#locked === 'passkey');\n }\n\n #snapshot(): VaultState {\n return {\n port: !this.#port ? 'none' : this.#waiting() ? 'waiting' : 'ready',\n needed: this.needed,\n version: this.#pair.version,\n locked: this.#locked,\n held: this.#pending.size,\n };\n }\n\n #refresh(): void {\n const next = this.#snapshot();\n const before = this.state.value;\n if (Object.entries(next).some(([key, value]) => before[key as keyof VaultState] !== value))\n this.state.replace(BACKGROUND_CONTEXT, next);\n if (this.#holding()) return;\n for (const resolve of this.#waiters) resolve();\n this.#waiters.clear();\n }\n}\n\nexport function holdText(state: VaultState): string | undefined {\n const hold = vaultHold(state);\n if (!hold) return undefined;\n return hold.reason === 'locked' ? 'unlock the vault to continue' : WAITING;\n}\n\nexport function listenVault(\n scope: { addEventListener(type: 'message', listener: (event: MessageEvent) => void): void },\n vault: Vault\n): void {\n scope.addEventListener('message', ({ data }) => {\n const message = data as { vault?: MessagePort; scrub?: unknown; locked?: unknown } | null;\n if (!message || typeof message !== 'object') return;\n if (!('vault' in message || 'scrub' in message || 'locked' in message)) return;\n vault.connect(message.vault, message.scrub, message.locked);\n });\n}\n"],
|
|
5
|
+
"mappings": "AAQA,SAAsC,uBAAuB;AAC7D,SAAS,0BAA0B;AAEnC,SAAS,iBAAiB;AAanB,MAAM,aAAa;AACnB,MAAM,UAAU;AAIhB,MAAM,qBAAqB,MAAM;AAAA,EAC7B;AAAA,EAET,YAAY,MAA6B,SAAiB;AACxD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AA6BA,MAAM,QAA4B,CAAC,MAAM,aAAa,SAAS;AAE/D,MAAM,QAAQ,IAAI,WAAW;AAE7B,SAAS,OAAO,OAAuC;AACrD,QAAM,OAAO;AACb,MAAI,SAAS,KAAM,QAAO,EAAE,QAAQ,OAAO,SAAS,EAAE;AACtD,MAAI,OAAO,MAAM,WAAW,aAAa,OAAO,KAAK,YAAY,SAAU,QAAO;AAClF,SAAO,EAAE,QAAQ,KAAK,QAAQ,SAAS,KAAK,QAAQ;AACtD;AAEO,MAAM,MAAuB;AAAA,EACzB;AAAA,EACA,WAAW,oBAAI,IAAqB;AAAA,EACpC,WAAW,oBAAI,IAAY;AAAA,EAC3B,WAAW,oBAAI,IAAgB;AAAA,EAC/B;AAAA,EACT;AAAA,EACA,QAAmB,EAAE,QAAQ,OAAO,SAAS,EAAE;AAAA,EAC/C,UAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,gBAAgB;AAAA,EACP,OAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE;AAAA,EAEtD,YAAY,MAAoB,KAAK,KAAK;AACxC,SAAK,OAAO;AACZ,SAAK,QAAQ,gBAA4B,KAAK,UAAU,CAAC;AAAA,EAC3D;AAAA,EAEA,IAAI,SAAkB;AACpB,WAAO,KAAK,MAAM,UAAU,KAAK,QAAQ,KAAK,MAAM;AAAA,EACtD;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,QAAQ,MAA+B,OAAgB,QAAwB;AAC7E,UAAM,OAAO,UAAU,SAAY,SAAY,OAAO,KAAK;AAC3D,QAAI,KAAM,MAAK,QAAQ;AACvB,QAAI,OAAO,WAAW,UAAW,MAAK,UAAU,SAAS,YAAY;AACrE,QAAI,QAAQ,SAAS,KAAK,OAAO;AAC/B,UAAI,KAAK,MAAO,MAAK,MAAM,YAAY;AACvC,WAAK,QAAQ;AACb,WAAK,YAAY,CAAC,UAAU,KAAK,QAAQ,MAAM,IAAc;AAC7D,WAAK,QAAQ;AACb,YAAM,SAAS,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC;AACzC,YAAM,UAAU,IAAI;AAAA,QAClB,OACG,OAAO,CAAC,SAAS,KAAK,QAAQ,OAAO,cAAc,EACnD,IAAI,CAAC,SAAS,KAAK,QAAQ,MAAM;AAAA,MACtC;AACA,iBAAW,UAAU,KAAK;AACxB,YAAI,CAAC,QAAQ,IAAI,MAAM,EAAG,MAAK,KAAK,MAAM,gBAAgB,EAAE,OAAO,CAAC;AACtE,iBAAW,QAAQ,OAAQ,MAAK,YAAY,KAAK,OAAO;AAAA,IAC1D;AACA,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAuB;AACrB,QAAI,CAAC,KAAK,SAAS,EAAG,QAAO,QAAQ,QAAQ;AAC7C,WAAO,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS,IAAI,OAAO,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAM,MAA4B,OAAmC;AACnE,QAAI,CAAC,KAAK,OAAQ,QAAO,CAAC,GAAG,KAAK;AAClC,UAAM,SAAU,MAAM,KAAK,MAAM,UAAU,EAAE,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC;AAKhE,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,MAAM,UAA8B,SAAoD;AAC5F,UAAM,SAAS,aAAa,SAAY,EAAE,QAAQ,IAAI,EAAE,UAAU,QAAQ;AAC1E,YAAS,MAAM,KAAK,MAAM,SAAS,MAAM,GAAoC;AAAA,EAC/E;AAAA,EAEA,MAAM,IAAI,QAAgB,SAAoD;AAC5E,YAAS,MAAM,KAAK,MAAM,OAAO,EAAE,QAAQ,QAAQ,CAAC,GAAoC;AAAA,EAC1F;AAAA,EAEA,MAAM,UAAkC;AACtC,YAAS,MAAM,KAAK,MAAM,WAAW,CAAC,CAAC,GAAkC;AAAA,EAC3E;AAAA,EAEA,MAAM,MACJ,QACA,UACA,OACA,MACkB;AAClB,UAAM,SAAS,EAAE,QAAQ,UAAU,OAAO,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK,EAAG;AAClF,UAAM,EAAE,UAAU,OAAO,SAAS,UAAU,IAAK,MAAM,KAAK,MAAM,SAAS,MAAM;AACjF,WAAO,EAAE,UAAU,OAAO,SAAS,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU,EAAG;AAAA,EACvF;AAAA,EAEA,MAAM,QAAQ,QAAuB,MAAgC;AACnE,UAAM,SAAS,EAAE,GAAG,QAAQ,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK,EAAG;AACpE,YAAS,MAAM,KAAK,MAAM,WAAW,MAAM,GAAyB;AAAA,EACtE;AAAA,EAEA,MAAM,UAAU,KAAiC;AAC/C,UAAM,KAAK,MAAM,aAAa,EAAE,KAAK,IAAI,IAAI,CAAC;AAAA,EAChD;AAAA,EAEA,SAAsB;AACpB,QAAI;AACJ,WAAO;AAAA,MACL,MAAM,CAAC,UAAU;AACf,YAAI,WAAW,UAAa,CAAC,KAAK,OAAQ,QAAO,QAAQ,QAAQ,KAAK;AACtE,YAAI,WAAW,QAAW;AACxB,mBAAS,GAAG,KAAK,IAAI,IAAI,EAAE,KAAK,aAAa;AAC7C,eAAK,SAAS,IAAI,MAAM;AACxB,eAAK,KAAK,MAAM,gBAAgB,EAAE,OAAO,CAAC;AAAA,QAC5C;AACA,eAAO,KAAK,MAAM,QAAQ,EAAE,QAAQ,MAAM,CAAC,EAAE;AAAA,UAC3C,CAAC,WAAY,OAAiC;AAAA,QAChD;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AACf,YAAI,WAAW,OAAW,QAAO;AACjC,cAAM,EAAE,OAAO,KAAK,IAAK,MAAM,KAAK,MAAM,OAAO,EAAE,OAAO,CAAC;AAC3D,aAAK,SAAS,OAAO,MAAM;AAC3B,eAAO;AAAA,MACT;AAAA,MACA,MAAM,MAAM;AACV,YAAI,WAAW,OAAW;AAC1B,cAAM,UAAU;AAChB,aAAK,SAAS,OAAO,OAAO;AAC5B,mBAAW,CAAC,IAAI,IAAI,KAAK,KAAK;AAC5B,cAAI,KAAK,QAAQ,WAAW,WAAW,KAAK,QAAQ,OAAO,gBAAgB;AACzE,iBAAK,SAAS,OAAO,EAAE;AACvB,iBAAK,QAAQ,EAAE,OAAO,MAAM,CAAC;AAAA,UAC/B;AACF,aAAK,KAAK,MAAM,QAAQ,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,IAAY,QAAmD;AACnE,UAAM,UAAmB,EAAE,GAAG,GAAG,IAAI,EAAE,KAAK,SAAS,IAAI,GAAG,OAAO;AACnE,UAAM,SAAS,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC9C,WAAK,SAAS,IAAI,QAAQ,IAAI,EAAE,SAAS,IAAI,KAAK,KAAK,GAAG,SAAS,OAAO,CAAC;AAAA,IAC7E,CAAC;AACD,SAAK,OAAO,YAAY,OAAO;AAC/B,eAAW,MAAM,KAAK,SAAS,GAAG,UAAU;AAC5C,SAAK,SAAS;AACd,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,MAAoB;AAC1B,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,UAAM,OAAO,WAAW,OAAO,OAAO,KAAK,KAAK,IAAI;AACpD,QAAI,KAAM,MAAK,QAAQ;AACvB,QAAI,MAAM,SAAS,KAAK,MAAM,EAAG,MAAK,UAAU,KAAK;AACrD,QAAI,KAAK,OAAO,UAAW,MAAK,SAAS,KAAK,MAAM;AACpD,UAAM,OAAO,OAAO,KAAK,OAAO,WAAW,KAAK,SAAS,IAAI,KAAK,EAAE,IAAI;AACxE,QAAI,MAAM;AACR,WAAK,SAAS,OAAO,KAAK,EAAY;AACtC,UAAI,OAAO,KAAK,YAAY,SAAU,MAAK,QAAQ,KAAK,IAAI,KAAK,OAAO,KAAK,OAAO;AACpF,UAAI,KAAK;AACP,aAAK,OAAO,IAAI,aAAa,KAAK,MAAM,MAAM,KAAK,MAAM,WAAW,mBAAmB,CAAC;AAAA,UACrF,MAAK,QAAQ,IAAI;AAAA,IACxB;AACA,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,SAAS,QAAuB;AAC9B,UAAM,QAAQ;AACd,UAAM,OAAO,SAAS,WAAW,QAAQ,OAAO,MAAM,KAAK,IAAI;AAC/D,QAAI,KAAM,MAAK,QAAQ;AACvB,QAAI,OAAO,OAAO,WAAW,UAAW,MAAK,UAAU,MAAM,SAAS,YAAY;AAAA,EACpF;AAAA,EAEA,WAAoB;AAClB,UAAM,MAAM,KAAK,KAAK;AACtB,WAAO,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,MAAM,KAAK,MAAM,UAAU;AAAA,EAC/E;AAAA,EAEA,WAAoB;AAClB,WAAO,KAAK,WAAW,CAAC,KAAK,SAAS,KAAK,SAAS,KAAK,KAAK,YAAY;AAAA,EAC5E;AAAA,EAEA,YAAwB;AACtB,WAAO;AAAA,MACL,MAAM,CAAC,KAAK,QAAQ,SAAS,KAAK,SAAS,IAAI,YAAY;AAAA,MAC3D,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK,MAAM;AAAA,MACpB,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,WAAiB;AACf,UAAM,OAAO,KAAK,UAAU;AAC5B,UAAM,SAAS,KAAK,MAAM;AAC1B,QAAI,OAAO,QAAQ,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,GAAuB,MAAM,KAAK;AACvF,WAAK,MAAM,QAAQ,oBAAoB,IAAI;AAC7C,QAAI,KAAK,SAAS,EAAG;AACrB,eAAW,WAAW,KAAK,SAAU,SAAQ;AAC7C,SAAK,SAAS,MAAM;AAAA,EACtB;AACF;AAEO,SAAS,SAAS,OAAuC;AAC9D,QAAM,OAAO,UAAU,KAAK;AAC5B,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,WAAW,WAAW,iCAAiC;AACrE;AAEO,SAAS,YACd,OACA,OACM;AACN,QAAM,iBAAiB,WAAW,CAAC,EAAE,KAAK,MAAM;AAC9C,UAAM,UAAU;AAChB,QAAI,CAAC,WAAW,OAAO,YAAY,SAAU;AAC7C,QAAI,EAAE,WAAW,WAAW,WAAW,WAAW,YAAY,SAAU;AACxE,UAAM,QAAQ,QAAQ,OAAO,QAAQ,OAAO,QAAQ,MAAM;AAAA,EAC5D,CAAC;AACH;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/services.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/services.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Context, JsonValue, RemoteContract, ReplicatedState } from '@earendil-works/chord';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { Approval, ApprovalAnswer, ApprovalDecided } from './approvals/index.ts';\nimport type {\n ApprovalPolicy,\n ApprovalPolicyChange,\n ApprovalPolicySet,\n} from './approvals/policy.ts';\nimport type { AgentSudo } from './approvals/sudo.ts';\nimport type { SendAttachment, ShownAttachment } from './attachments.ts';\nimport type { ChangesView } from './changes/git.ts';\nimport type { FrozenCone } from './freezer/index.ts';\nimport type { ImportProgress, ImportResult } from './freezer/v6.ts';\nimport type { GuestOpened, Proposed, ProposeRequest } from './guests/index.ts';\nimport type { GuestDraft, GuestGates, GuestSeat } from './guests/seats.ts';\nimport type { MemoryEntry, MemoryScope, MemoryTag } from './memory/format.ts';\nimport type { AgentRemote } from './remote/host.ts';\nimport type { AgentPages } from './remote/pages.ts';\nimport type { VaultState } from './secrets/vault.ts';\nimport { contract } from './serving.ts';\nimport type { SkillPackage, SkillSource } from './skills/skills.ts';\nimport type { Sprinkle } from './sprinkles/kind.ts';\n\nexport type SendMode = 'steer' | 'followUp' | 'reject';\n\nexport interface SendRequest {\n text: string;\n whenBusy: SendMode;\n requestId: string | null;\n agentId?: string | null;\n attachments?: SendAttachment[];\n}\n\nexport interface OperationError {\n code: string;\n message: string;\n}\n\nexport type SendResponse =\n | { accepted: true; submissionId: string; error: null }\n | { accepted: false; submissionId: null; error: OperationError };\n\nexport type PromptResult =\n | { status: 'done'; text: string; reason: null }\n | { status: 'unanswered'; text: null; reason: string };\n\nexport interface AgentControl {\n send(request: SendRequest, context: Context): Promise<SendResponse>;\n wait(submissionId: string, context: Context): Promise<PromptResult>;\n withdraw(\n submissionId: string,\n context: Context\n ): Promise<{ outcome: 'withdrawn' | 'already_placed' | 'not_found' }>;\n abort(context: Context): Promise<void>;\n compact(instructions: string | null, context: Context): Promise<SendResponse>;\n compactAgent(\n agentId: string,\n instructions: string | null,\n context: Context\n ): Promise<SendResponse>;\n reset(handoff: string | null, context: Context): Promise<void>;\n configure(change: AgentSettingsChange, context: Context): Promise<void>;\n rewind(messageId: string | null, context: Context): Promise<Rewound>;\n rewindAgent(agentId: string, messageId: string | null, context: Context): Promise<Rewound>;\n resolveLick(\n lickId: string,\n state: 'confirmed' | 'dismissed',\n context: Context\n ): Promise<LickResolved>;\n resolveAgentLick(\n agentId: string,\n lickId: string,\n state: 'confirmed' | 'dismissed',\n context: Context\n ): Promise<LickResolved>;\n webhook(\n name: string,\n delivery: WebhookRequest,\n context: Context\n ): Promise<{ delivered: boolean }>;\n stopAgent(agentId: string, context: Context): Promise<void>;\n selectCone(agentId: string, context: Context): Promise<void>;\n createCone(name: string, context: Context): Promise<Created>;\n createScoop(parentId: string, name: string, context: Context): Promise<Created>;\n drop(agentId: string, context: Context): Promise<Created>;\n unqueue(\n agentId: string | null,\n submissionId: string,\n context: Context\n ): Promise<{ outcome: 'withdrawn' | 'already_placed' | 'not_found' }>;\n sprinkleSend(\n sprinkleId: string,\n payload: { action: string; data: JsonValue | null; target: string | null },\n context: Context\n ): Promise<{ delivered: boolean }>;\n sprinkleCall(\n sprinkleId: string,\n method: string,\n args: JsonValue[],\n context: Context\n ): Promise<JsonValue>;\n memorySave(draft: MemoryDraft, context: Context): Promise<MemoryEntry>;\n memoryRemove(id: string, context: Context): Promise<{ removed: boolean }>;\n freeze(agentId: string, context: Context): Promise<Created>;\n newChat(agentId: string, context: Context): Promise<Created>;\n thaw(frozenId: string, context: Context): Promise<Created>;\n discard(frozenId: string, context: Context): Promise<Created>;\n importProfile(request: ImportRequest, context: Context): Promise<ImportResult>;\n importCancel(context: Context): Promise<void>;\n changesOpen(context: Context): Promise<void>;\n changeAccept(path: string, context: Context): Promise<Created>;\n changeRevert(path: string, context: Context): Promise<Created>;\n monitorOpen(lease: string | null, resync: boolean, context: Context): Promise<MonitorLease>;\n monitorClose(lease: string, context: Context): Promise<void>;\n image(ref: ImageRef, context: Context): Promise<StoredImage>;\n agentCommands(agentId: string, context: Context): Promise<Command[]>;\n toolLabel(agentId: string, callIds: string[], context: Context): Promise<string | null>;\n guestOpen(draft: GuestDraft, context: Context): Promise<GuestOpened>;\n guestRevoke(id: string, context: Context): Promise<{ revoked: boolean }>;\n guestAlwaysForget(\n seat: string,\n approval: string,\n context: Context\n ): Promise<{ removed: boolean }>;\n approvalPolicySet(change: ApprovalPolicyChange, context: Context): Promise<ApprovalPolicySet>;\n decide(\n id: string,\n decision: ApprovalAnswer,\n reason: string | null,\n context: Context\n ): Promise<ApprovalDecided>;\n}\n\nexport interface ImportRequest {\n upload: string | null;\n data: string | null;\n again: boolean;\n preview: boolean;\n}\n\nexport interface ImageRef {\n entry: number;\n message: number;\n part: number;\n}\n\nexport type StoredImage = { data: string; mimeType: string } | { data: null; mimeType: null };\n\nexport interface MonitorLease {\n lease: string;\n ttlMs: number;\n}\n\nexport interface MonitorAgent {\n id: string;\n name: string;\n kind: 'cone' | 'scoop';\n parentId: string | null;\n model: string | null;\n running: boolean;\n queued: number;\n tool: string | null;\n retry: { attempt: number; since: number; error: string } | null;\n failed: string | null;\n context: number | null;\n cpu?: number | null;\n}\n\nexport interface MonitorTask {\n id: string;\n kind: string;\n detail: string | null;\n agentId: string | null;\n owner: string | null;\n status: 'pending' | 'running' | 'waiting' | 'completing';\n phase: string;\n background: boolean;\n aborting: number | null;\n since: number;\n waits: number;\n}\n\nexport interface MonitorProcess {\n pid: number;\n ppid: number;\n pgid: number;\n user: string | null;\n agentId: string | null;\n command: string;\n state: 'S' | 'Z';\n started: number;\n zombie: number | null;\n tty: boolean;\n rss: number | null;\n utime?: number;\n stime?: number;\n cpu?: number | null;\n}\n\nexport interface MonitorProblem {\n id: string;\n at: number;\n agentId: string | null;\n kind: 'task' | 'retry' | 'turn';\n message: string;\n}\n\nexport interface MonitorFeed {\n open: boolean;\n at: number;\n usage: { tokens: number; cost: number; free: boolean } | null;\n agents: MonitorAgent[];\n tasks: MonitorTask[];\n processes: MonitorProcess[] | null;\n kernel: 'checking' | 'ok' | 'unreachable';\n problems: MonitorProblem[];\n paused: boolean;\n}\n\nexport interface MemoryDraft {\n id: string | null;\n scope: string;\n section: string;\n title: string;\n body: string;\n tag: MemoryTag | null;\n}\n\nexport type Created = { id: string; error: null } | { id: null; error: string };\n\nexport interface AgentSummary {\n id: string;\n name: string;\n kind: 'cone' | 'scoop';\n parentId: string | null;\n role: string | null;\n}\n\nexport interface AgentsSummary {\n active: string;\n agents: AgentSummary[];\n}\n\nexport type LickResolved =\n | { done: true; text: string; error: null }\n | { done: false; text: null; error: string };\n\nexport interface WebhookRequest {\n id: string | null;\n headers: Record<string, string>;\n body: string;\n}\n\nexport type Rewound =\n | { done: true; text: string; reason: null; attachments?: ShownAttachment[] }\n | { done: false; text: null; reason: 'busy' | 'no-turn' };\n\nexport interface AgentSettingsChange {\n model: { provider: string; modelId: string } | null;\n thinkingLevel: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max' | null;\n agentId?: string | null;\n}\n\nconst keys = <T>(record: Record<keyof T, true>) => Object.keys(record) as (keyof T & string)[];\n\nexport const CONTROL_METHODS = keys<AgentControl>({\n send: true,\n wait: true,\n withdraw: true,\n abort: true,\n compact: true,\n compactAgent: true,\n reset: true,\n configure: true,\n rewind: true,\n rewindAgent: true,\n resolveLick: true,\n resolveAgentLick: true,\n webhook: true,\n stopAgent: true,\n selectCone: true,\n createCone: true,\n createScoop: true,\n drop: true,\n unqueue: true,\n sprinkleSend: true,\n sprinkleCall: true,\n memorySave: true,\n memoryRemove: true,\n freeze: true,\n newChat: true,\n thaw: true,\n discard: true,\n importProfile: true,\n importCancel: true,\n changesOpen: true,\n changeAccept: true,\n changeRevert: true,\n monitorOpen: true,\n monitorClose: true,\n image: true,\n agentCommands: true,\n toolLabel: true,\n guestOpen: true,\n guestRevoke: true,\n guestAlwaysForget: true,\n approvalPolicySet: true,\n decide: true,\n});\n\nexport const OWNER_DEVICE_METHODS: readonly (keyof AgentControl & string)[] = [\n 'decide',\n 'guestOpen',\n 'guestRevoke',\n 'guestAlwaysForget',\n 'approvalPolicySet',\n];\n\nexport const CONTROL_READS: readonly (keyof AgentControl & string)[] = [\n 'wait',\n 'changesOpen',\n 'monitorOpen',\n 'monitorClose',\n 'image',\n 'toolLabel',\n];\n\nexport const AgentControl: RemoteContract = contract('slicc.agent.control', {\n control: { methods: CONTROL_METHODS },\n view: { methods: [...CONTROL_READS, ...OWNER_DEVICE_METHODS] },\n});\n\nexport type Delivered = 'run' | 'steer' | 'follow-up';\n\nexport interface AgentTranscript {\n readonly state: ReplicatedState<ConversationView>;\n readonly deliveries: ReplicatedState<Record<string, Delivered>>;\n readonly agents: ReplicatedState<AgentsSummary>;\n readonly views: ReplicatedState<Record<string, ConversationView>>;\n readonly commands: ReplicatedState<Command[]>;\n readonly privateRevision: ReplicatedState<PrivateRevision>;\n readonly sprinkles: ReplicatedState<Sprinkle[]>;\n readonly memories: ReplicatedState<MemoryEntry[]>;\n readonly memoryScopes: ReplicatedState<MemoryScope[]>;\n readonly frozen: ReplicatedState<FrozenCone[]>;\n readonly importing: ReplicatedState<ImportProgress>;\n readonly changes: ReplicatedState<ChangesView>;\n readonly monitor: ReplicatedState<MonitorFeed>;\n readonly vault: ReplicatedState<VaultState>;\n readonly labels: ReplicatedState<Record<string, string>>;\n readonly guests: ReplicatedState<GuestSeat[]>;\n readonly approvals: ReplicatedState<Approval[]>;\n readonly approvalPolicy: ReplicatedState<ApprovalPolicy>;\n}\n\nexport interface PrivateRevision {\n revision: number;\n}\n\nexport interface Command {\n name: string;\n description: string;\n kind: 'prompt' | 'skill' | 'action';\n source?: SkillSource;\n package?: SkillPackage;\n}\n\nexport const TRANSCRIPT_STATES = keys<AgentTranscript>({\n state: true,\n deliveries: true,\n agents: true,\n views: true,\n commands: true,\n privateRevision: true,\n sprinkles: true,\n memories: true,\n memoryScopes: true,\n frozen: true,\n importing: true,\n changes: true,\n monitor: true,\n vault: true,\n labels: true,\n guests: true,\n approvals: true,\n approvalPolicy: true,\n});\n\nexport const AgentTranscript: RemoteContract = contract('slicc.agent.transcript', {\n transcript: { state: TRANSCRIPT_STATES },\n});\n\nexport const REMOTE_METHODS = keys<AgentRemote>({\n prompt: true,\n watch: true,\n next: true,\n close: true,\n abort: true,\n});\n\nexport const REMOTE_READS: readonly (keyof AgentRemote & string)[] = ['watch', 'next', 'close'];\n\nexport interface GuestShown {\n id: string;\n label: string;\n agentId: string;\n name: string;\n expiresAt: number | null;\n gates: GuestGates;\n}\n\nexport interface GuestProposal {\n id: string;\n text: string;\n state: 'queued' | 'pending' | 'approved' | 'rejected' | 'unanswered' | 'withdrawn';\n reason: string | null;\n createdAt: number;\n decidedAt: number | null;\n}\n\nexport interface AgentGuest {\n readonly transcript: ReplicatedState<ConversationView>;\n readonly seat: ReplicatedState<GuestShown>;\n readonly proposals: ReplicatedState<GuestProposal[]>;\n propose(request: ProposeRequest, context: Context): Promise<Proposed>;\n guestOpen(draft: GuestDraft, context: Context): Promise<GuestOpened>;\n guestRevoke(id: string, context: Context): Promise<{ revoked: boolean }>;\n}\n\nexport const GUEST_STATES = ['transcript', 'seat', 'proposals'] as const;\n\nexport const GUEST_METHODS = ['propose', 'guestOpen', 'guestRevoke'] as const;\n\nexport const AgentGuestService: RemoteContract = contract('slicc.agent.guest', {\n guest: { state: GUEST_STATES, methods: GUEST_METHODS },\n none: {},\n});\n\nexport const AgentRemoteService: RemoteContract = contract('slicc.agent.remote', {\n remote: { methods: REMOTE_METHODS },\n watch: { methods: REMOTE_READS },\n});\n\nexport const PAGE_METHODS = keys<AgentPages>({\n open: true,\n report: true,\n next: true,\n answer: true,\n close: true,\n});\n\nexport const AgentPagesService: RemoteContract = contract('slicc.agent.pages', {\n pages: { methods: PAGE_METHODS },\n none: {},\n});\n\nexport const SUDO_METHODS = keys<Omit<AgentSudo, 'approvals'>>({\n request: true,\n withdraw: true,\n});\n\nexport const AgentSudoService: RemoteContract = contract('slicc.agent.sudo', {\n sudo: { state: ['approvals'], methods: SUDO_METHODS },\n none: {},\n});\n\nexport interface ModelChoice {\n id: string;\n label: string;\n provider: string;\n kind: 'chat' | 'classifier';\n reasoning: boolean;\n images?: boolean;\n contextWindow: number;\n}\n\nexport interface AccountState {\n id: string;\n provider: string;\n identity: string;\n status: 'connected' | 'disconnected' | 'expired';\n auth: 'api-key' | 'oauth';\n needs: 'cors-free-transport' | null;\n blocked?: 'cors-free-transport';\n group?: 'providers' | 'mcp';\n secret?: 'api-key' | 'token';\n store?: 'vault';\n fields?: AccountField[];\n description?: string;\n keyUrl?: string;\n vaultName?: string;\n}\n\nexport interface AccountField {\n name: string;\n label: string;\n required?: boolean;\n placeholder?: string;\n help?: string;\n customBase?: true;\n options?: readonly { value: string; label: string }[];\n value?: string;\n}\n\nexport interface ProviderOption {\n id: string;\n name: string;\n description?: string;\n auth: 'api-key' | 'oauth' | 'fields' | 'local';\n fields?: AccountField[];\n keyUrl?: string;\n needs?: 'cors-free-transport';\n blocked?: 'cors-free-transport';\n vaultName?: string;\n}\n\nexport interface BudgetState {\n provider: string;\n percent: number;\n window: 'weekly';\n resets: string;\n}\n\nexport interface SignIn {\n clientId: string;\n scopes: string;\n imsEnvironment: string;\n}\n\nexport interface McpSignIn {\n url: string;\n state: string;\n}\n\nexport interface SettingsState {\n models: ModelChoice[];\n accounts: AccountState[];\n providers?: ProviderOption[];\n budget?: BudgetState | null;\n moved?: { kind: 'model' | 'mcp'; label: string }[];\n labels?: Record<string, string>;\n}\n\nexport interface AgentSettings {\n readonly state: ReplicatedState<SettingsState>;\n connect(\n providerId: string,\n secret: string | null,\n fields: Record<string, string> | null,\n context: Context\n ): Promise<void>;\n disconnect(providerId: string, context: Context): Promise<void>;\n remove(providerId: string, context: Context): Promise<void>;\n serverUrl(providerId: string, context: Context): Promise<string | null>;\n signIn(providerId: string, context: Context): Promise<SignIn | McpSignIn | null>;\n dismissMoved(context: Context): Promise<void>;\n}\n\nexport const SETTINGS_METHODS = keys<Omit<AgentSettings, 'state'>>({\n connect: true,\n disconnect: true,\n remove: true,\n serverUrl: true,\n signIn: true,\n dismissMoved: true,\n});\n\nexport const AgentSettings: RemoteContract = contract('slicc.agent.settings', {\n settings: { state: ['state'], methods: SETTINGS_METHODS },\n view: { state: ['state'] },\n});\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import type { Context, JsonValue, RemoteContract, ReplicatedState } from '@earendil-works/chord';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { Approval, ApprovalAnswer, ApprovalDecided } from './approvals/index.ts';\nimport type {\n ApprovalPolicy,\n ApprovalPolicyChange,\n ApprovalPolicySet,\n} from './approvals/policy.ts';\nimport type { AgentSudo } from './approvals/sudo.ts';\nimport type { SendAttachment, ShownAttachment } from './attachments.ts';\nimport type { ChangesView } from './changes/git.ts';\nimport type { FrozenCone } from './freezer/index.ts';\nimport type { ImportProgress, ImportResult } from './freezer/v6.ts';\nimport type { GuestOpened, Proposed, ProposeRequest } from './guests/index.ts';\nimport type { GuestDraft, GuestGates, GuestSeat } from './guests/seats.ts';\nimport type { MemoryEntry, MemoryScope, MemoryTag } from './memory/format.ts';\nimport type { AgentRemote } from './remote/host.ts';\nimport type { AgentPages } from './remote/pages.ts';\nimport type { VaultState } from './secrets/vault.ts';\nimport { contract } from './serving.ts';\nimport type { SkillPackage, SkillSource } from './skills/skills.ts';\nimport type { Sprinkle } from './sprinkles/kind.ts';\n\nexport type SendMode = 'steer' | 'followUp' | 'reject';\n\nexport interface SendRequest {\n text: string;\n whenBusy: SendMode;\n requestId: string | null;\n agentId?: string | null;\n attachments?: SendAttachment[];\n}\n\nexport interface OperationError {\n code: string;\n message: string;\n}\n\nexport type SendResponse =\n | { accepted: true; submissionId: string; error: null }\n | { accepted: false; submissionId: null; error: OperationError };\n\nexport type PromptResult =\n | { status: 'done'; text: string; reason: null }\n | { status: 'unanswered'; text: null; reason: string };\n\nexport interface AgentControl {\n send(request: SendRequest, context: Context): Promise<SendResponse>;\n wait(submissionId: string, context: Context): Promise<PromptResult>;\n withdraw(\n submissionId: string,\n context: Context\n ): Promise<{ outcome: 'withdrawn' | 'already_placed' | 'not_found' }>;\n abort(context: Context): Promise<void>;\n compact(instructions: string | null, context: Context): Promise<SendResponse>;\n compactAgent(\n agentId: string,\n instructions: string | null,\n context: Context\n ): Promise<SendResponse>;\n reset(handoff: string | null, context: Context): Promise<void>;\n configure(change: AgentSettingsChange, context: Context): Promise<void>;\n rewind(messageId: string | null, context: Context): Promise<Rewound>;\n rewindAgent(agentId: string, messageId: string | null, context: Context): Promise<Rewound>;\n resolveLick(\n lickId: string,\n state: 'confirmed' | 'dismissed',\n context: Context\n ): Promise<LickResolved>;\n resolveAgentLick(\n agentId: string,\n lickId: string,\n state: 'confirmed' | 'dismissed',\n context: Context\n ): Promise<LickResolved>;\n webhook(\n name: string,\n delivery: WebhookRequest,\n context: Context\n ): Promise<{ delivered: boolean }>;\n stopAgent(agentId: string, context: Context): Promise<void>;\n selectCone(agentId: string, context: Context): Promise<void>;\n createCone(name: string, context: Context): Promise<Created>;\n createScoop(parentId: string, name: string, context: Context): Promise<Created>;\n drop(agentId: string, context: Context): Promise<Created>;\n unqueue(\n agentId: string | null,\n submissionId: string,\n context: Context\n ): Promise<{ outcome: 'withdrawn' | 'already_placed' | 'not_found' }>;\n sprinkleSend(\n sprinkleId: string,\n payload: { action: string; data: JsonValue | null; target: string | null },\n context: Context\n ): Promise<{ delivered: boolean }>;\n sprinkleCall(\n sprinkleId: string,\n method: string,\n args: JsonValue[],\n context: Context\n ): Promise<JsonValue>;\n memorySave(draft: MemoryDraft, context: Context): Promise<MemoryEntry>;\n memoryRemove(id: string, context: Context): Promise<{ removed: boolean }>;\n freeze(agentId: string, context: Context): Promise<Created>;\n newChat(agentId: string, context: Context): Promise<Created>;\n thaw(frozenId: string, context: Context): Promise<Created>;\n discard(frozenId: string, context: Context): Promise<Created>;\n importProfile(request: ImportRequest, context: Context): Promise<ImportResult>;\n importCancel(context: Context): Promise<void>;\n changesOpen(context: Context): Promise<void>;\n changeAccept(path: string, context: Context): Promise<Created>;\n changeRevert(path: string, context: Context): Promise<Created>;\n monitorOpen(lease: string | null, resync: boolean, context: Context): Promise<MonitorLease>;\n monitorClose(lease: string, context: Context): Promise<void>;\n image(ref: ImageRef, context: Context): Promise<StoredImage>;\n agentCommands(agentId: string, context: Context): Promise<Command[]>;\n toolLabel(agentId: string, callIds: string[], context: Context): Promise<string | null>;\n guestOpen(draft: GuestDraft, context: Context): Promise<GuestOpened>;\n guestRevoke(id: string, context: Context): Promise<{ revoked: boolean }>;\n guestAlwaysForget(\n seat: string,\n approval: string,\n context: Context\n ): Promise<{ removed: boolean }>;\n approvalPolicySet(change: ApprovalPolicyChange, context: Context): Promise<ApprovalPolicySet>;\n decide(\n id: string,\n decision: ApprovalAnswer,\n reason: string | null,\n context: Context\n ): Promise<ApprovalDecided>;\n}\n\nexport interface ImportRequest {\n upload: string | null;\n data: string | null;\n again: boolean;\n preview: boolean;\n}\n\nexport interface ImageRef {\n entry: number;\n message: number;\n part: number;\n}\n\nexport type StoredImage = { data: string; mimeType: string } | { data: null; mimeType: null };\n\nexport interface MonitorLease {\n lease: string;\n ttlMs: number;\n}\n\nexport interface MonitorAgent {\n id: string;\n name: string;\n kind: 'cone' | 'scoop';\n parentId: string | null;\n model: string | null;\n running: boolean;\n queued: number;\n tool: string | null;\n retry: { attempt: number; since: number; error: string } | null;\n failed: string | null;\n context: number | null;\n cpu?: number | null;\n}\n\nexport interface MonitorTask {\n id: string;\n kind: string;\n detail: string | null;\n agentId: string | null;\n owner: string | null;\n status: 'pending' | 'running' | 'waiting' | 'completing';\n phase: string;\n background: boolean;\n aborting: number | null;\n since: number;\n waits: number;\n}\n\nexport interface MonitorProcess {\n pid: number;\n ppid: number;\n pgid: number;\n user: string | null;\n agentId: string | null;\n command: string;\n state: 'S' | 'Z';\n started: number;\n zombie: number | null;\n tty: boolean;\n rss: number | null;\n utime?: number;\n stime?: number;\n cpu?: number | null;\n}\n\nexport interface MonitorProblem {\n id: string;\n at: number;\n agentId: string | null;\n kind: 'task' | 'retry' | 'turn';\n message: string;\n}\n\nexport interface MonitorFeed {\n open: boolean;\n at: number;\n usage: { tokens: number; cost: number; free: boolean } | null;\n agents: MonitorAgent[];\n tasks: MonitorTask[];\n processes: MonitorProcess[] | null;\n kernel: 'checking' | 'ok' | 'unreachable';\n problems: MonitorProblem[];\n paused: boolean;\n}\n\nexport interface MemoryDraft {\n id: string | null;\n scope: string;\n section: string;\n title: string;\n body: string;\n tag: MemoryTag | null;\n}\n\nexport type Created = { id: string; error: null } | { id: null; error: string };\n\nexport interface AgentSummary {\n id: string;\n name: string;\n kind: 'cone' | 'scoop';\n parentId: string | null;\n role: string | null;\n}\n\nexport interface AgentsSummary {\n active: string;\n agents: AgentSummary[];\n}\n\nexport type LickResolved =\n | { done: true; text: string; error: null }\n | { done: false; text: null; error: string };\n\nexport interface WebhookRequest {\n id: string | null;\n headers: Record<string, string>;\n body: string;\n}\n\nexport type Rewound =\n | { done: true; text: string; reason: null; attachments?: ShownAttachment[] }\n | { done: false; text: null; reason: 'busy' | 'no-turn' };\n\nexport interface AgentSettingsChange {\n model: { provider: string; modelId: string } | null;\n thinkingLevel: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max' | null;\n agentId?: string | null;\n}\n\nconst keys = <T>(record: Record<keyof T, true>) => Object.keys(record) as (keyof T & string)[];\n\nexport const CONTROL_METHODS = keys<AgentControl>({\n send: true,\n wait: true,\n withdraw: true,\n abort: true,\n compact: true,\n compactAgent: true,\n reset: true,\n configure: true,\n rewind: true,\n rewindAgent: true,\n resolveLick: true,\n resolveAgentLick: true,\n webhook: true,\n stopAgent: true,\n selectCone: true,\n createCone: true,\n createScoop: true,\n drop: true,\n unqueue: true,\n sprinkleSend: true,\n sprinkleCall: true,\n memorySave: true,\n memoryRemove: true,\n freeze: true,\n newChat: true,\n thaw: true,\n discard: true,\n importProfile: true,\n importCancel: true,\n changesOpen: true,\n changeAccept: true,\n changeRevert: true,\n monitorOpen: true,\n monitorClose: true,\n image: true,\n agentCommands: true,\n toolLabel: true,\n guestOpen: true,\n guestRevoke: true,\n guestAlwaysForget: true,\n approvalPolicySet: true,\n decide: true,\n});\n\nexport const OWNER_DEVICE_METHODS: readonly (keyof AgentControl & string)[] = [\n 'decide',\n 'guestOpen',\n 'guestRevoke',\n 'guestAlwaysForget',\n 'approvalPolicySet',\n];\n\nexport const CONTROL_READS: readonly (keyof AgentControl & string)[] = [\n 'wait',\n 'changesOpen',\n 'monitorOpen',\n 'monitorClose',\n 'image',\n 'toolLabel',\n];\n\nexport const AgentControl: RemoteContract = contract('slicc.agent.control', {\n control: { methods: CONTROL_METHODS },\n view: { methods: [...CONTROL_READS, ...OWNER_DEVICE_METHODS] },\n});\n\nexport type Delivered = 'run' | 'steer' | 'follow-up';\n\nexport interface AgentTranscript {\n readonly state: ReplicatedState<ConversationView>;\n readonly deliveries: ReplicatedState<Record<string, Delivered>>;\n readonly agents: ReplicatedState<AgentsSummary>;\n readonly views: ReplicatedState<Record<string, ConversationView>>;\n readonly commands: ReplicatedState<Command[]>;\n readonly privateRevision: ReplicatedState<PrivateRevision>;\n readonly sprinkles: ReplicatedState<Sprinkle[]>;\n readonly memories: ReplicatedState<MemoryEntry[]>;\n readonly memoryScopes: ReplicatedState<MemoryScope[]>;\n readonly frozen: ReplicatedState<FrozenCone[]>;\n readonly importing: ReplicatedState<ImportProgress>;\n readonly changes: ReplicatedState<ChangesView>;\n readonly monitor: ReplicatedState<MonitorFeed>;\n readonly vault: ReplicatedState<VaultState>;\n readonly labels: ReplicatedState<Record<string, string>>;\n readonly guests: ReplicatedState<GuestSeat[]>;\n readonly approvals: ReplicatedState<Approval[]>;\n readonly approvalPolicy: ReplicatedState<ApprovalPolicy>;\n}\n\nexport interface PrivateRevision {\n revision: number;\n}\n\nexport interface Command {\n name: string;\n description: string;\n kind: 'prompt' | 'skill' | 'action';\n source?: SkillSource;\n package?: SkillPackage;\n}\n\nexport const TRANSCRIPT_STATES = keys<AgentTranscript>({\n state: true,\n deliveries: true,\n agents: true,\n views: true,\n commands: true,\n privateRevision: true,\n sprinkles: true,\n memories: true,\n memoryScopes: true,\n frozen: true,\n importing: true,\n changes: true,\n monitor: true,\n vault: true,\n labels: true,\n guests: true,\n approvals: true,\n approvalPolicy: true,\n});\n\nexport const AgentTranscript: RemoteContract = contract('slicc.agent.transcript', {\n transcript: { state: TRANSCRIPT_STATES },\n});\n\nexport const REMOTE_METHODS = keys<AgentRemote>({\n prompt: true,\n watch: true,\n next: true,\n close: true,\n abort: true,\n});\n\nexport const REMOTE_READS: readonly (keyof AgentRemote & string)[] = ['watch', 'next', 'close'];\n\nexport interface GuestShown {\n id: string;\n label: string;\n agentId: string;\n name: string;\n expiresAt: number | null;\n gates: GuestGates;\n}\n\nexport interface GuestProposal {\n id: string;\n text: string;\n state: 'queued' | 'pending' | 'approved' | 'rejected' | 'unanswered' | 'withdrawn';\n reason: string | null;\n createdAt: number;\n decidedAt: number | null;\n}\n\nexport interface AgentGuest {\n readonly transcript: ReplicatedState<ConversationView>;\n readonly seat: ReplicatedState<GuestShown>;\n readonly proposals: ReplicatedState<GuestProposal[]>;\n propose(request: ProposeRequest, context: Context): Promise<Proposed>;\n guestOpen(draft: GuestDraft, context: Context): Promise<GuestOpened>;\n guestRevoke(id: string, context: Context): Promise<{ revoked: boolean }>;\n}\n\nexport const GUEST_STATES = ['transcript', 'seat', 'proposals'] as const;\n\nexport const GUEST_METHODS = ['propose', 'guestOpen', 'guestRevoke'] as const;\n\nexport const AgentGuestService: RemoteContract = contract('slicc.agent.guest', {\n guest: { state: GUEST_STATES, methods: GUEST_METHODS },\n none: {},\n});\n\nexport const AgentRemoteService: RemoteContract = contract('slicc.agent.remote', {\n remote: { methods: REMOTE_METHODS },\n watch: { methods: REMOTE_READS },\n});\n\nexport const PAGE_METHODS = keys<AgentPages>({\n open: true,\n report: true,\n next: true,\n answer: true,\n close: true,\n});\n\nexport const AgentPagesService: RemoteContract = contract('slicc.agent.pages', {\n pages: { methods: PAGE_METHODS },\n none: {},\n});\n\nexport const SUDO_METHODS = keys<Omit<AgentSudo, 'approvals'>>({\n request: true,\n withdraw: true,\n});\n\nexport const AgentSudoService: RemoteContract = contract('slicc.agent.sudo', {\n sudo: { state: ['approvals'], methods: SUDO_METHODS },\n none: {},\n});\n\nexport interface ModelChoice {\n id: string;\n label: string;\n provider: string;\n kind: 'chat' | 'classifier';\n reasoning: boolean;\n images?: boolean;\n contextWindow: number;\n}\n\nexport interface AccountState {\n id: string;\n provider: string;\n identity: string;\n status: 'connected' | 'disconnected' | 'expired';\n auth: 'api-key' | 'oauth';\n needs: 'cors-free-transport' | null;\n blocked?: 'cors-free-transport';\n group?: 'providers' | 'mcp';\n secret?: 'api-key' | 'token';\n store?: 'vault';\n fields?: AccountField[];\n description?: string;\n keyUrl?: string;\n vaultName?: string;\n}\n\nexport interface AccountField {\n name: string;\n label: string;\n required?: boolean;\n placeholder?: string;\n help?: string;\n customBase?: true;\n vaultSetting?: string;\n options?: readonly { value: string; label: string }[];\n value?: string;\n}\n\nexport interface ProviderOption {\n id: string;\n name: string;\n description?: string;\n auth: 'api-key' | 'oauth' | 'fields' | 'local';\n fields?: AccountField[];\n keyUrl?: string;\n needs?: 'cors-free-transport';\n blocked?: 'cors-free-transport';\n vaultName?: string;\n}\n\nexport interface BudgetState {\n provider: string;\n percent: number;\n window: 'weekly';\n resets: string;\n}\n\nexport interface SignIn {\n clientId: string;\n scopes: string;\n imsEnvironment: string;\n}\n\nexport interface McpSignIn {\n url: string;\n state: string;\n}\n\nexport interface SettingsState {\n models: ModelChoice[];\n accounts: AccountState[];\n providers?: ProviderOption[];\n budget?: BudgetState | null;\n moved?: { kind: 'model' | 'mcp'; label: string }[];\n labels?: Record<string, string>;\n}\n\nexport interface AgentSettings {\n readonly state: ReplicatedState<SettingsState>;\n connect(\n providerId: string,\n secret: string | null,\n fields: Record<string, string> | null,\n context: Context\n ): Promise<void>;\n disconnect(providerId: string, context: Context): Promise<void>;\n remove(providerId: string, context: Context): Promise<void>;\n serverUrl(providerId: string, context: Context): Promise<string | null>;\n signIn(providerId: string, context: Context): Promise<SignIn | McpSignIn | null>;\n dismissMoved(context: Context): Promise<void>;\n}\n\nexport const SETTINGS_METHODS = keys<Omit<AgentSettings, 'state'>>({\n connect: true,\n disconnect: true,\n remove: true,\n serverUrl: true,\n signIn: true,\n dismissMoved: true,\n});\n\nexport const AgentSettings: RemoteContract = contract('slicc.agent.settings', {\n settings: { state: ['state'], methods: SETTINGS_METHODS },\n view: { state: ['state'] },\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -10,6 +10,7 @@ export interface FieldInput {
|
|
|
10
10
|
placeholder?: string;
|
|
11
11
|
help?: string;
|
|
12
12
|
customBase?: true;
|
|
13
|
+
vaultSetting?: string;
|
|
13
14
|
options?: readonly FieldOption[];
|
|
14
15
|
value?: string;
|
|
15
16
|
}
|
|
@@ -42,4 +43,3 @@ export interface Listing {
|
|
|
42
43
|
}
|
|
43
44
|
export declare const LISTINGS: ReadonlyMap<string, Listing>;
|
|
44
45
|
export declare const ADDED_FIRST: readonly string[];
|
|
45
|
-
export declare const VAULT_KNOWN: ReadonlySet<string>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { McpServerEntry
|
|
1
|
+
import type { McpServerEntry } from '@ai-ecoverse/slicc-vault';
|
|
2
2
|
import type { ModelRoute } from './fetch.ts';
|
|
3
3
|
import type { AgentRecord } from './records.ts';
|
|
4
4
|
import type { Vault } from './vault.ts';
|
|
@@ -11,7 +11,6 @@ export interface ModelBases {
|
|
|
11
11
|
urls: readonly string[];
|
|
12
12
|
}
|
|
13
13
|
export declare function modelRoute(bases: () => readonly ModelBases[], records: () => readonly AgentRecord[]): ModelRoute;
|
|
14
|
-
export declare function modelEndpoints(bases: readonly ModelBases[]): ModelEndpoint[];
|
|
15
14
|
export interface McpServerSource {
|
|
16
15
|
server: string;
|
|
17
16
|
url: string;
|
|
@@ -19,7 +18,6 @@ export interface McpServerSource {
|
|
|
19
18
|
}
|
|
20
19
|
export declare function mcpEndpoints(servers: readonly McpServerSource[], tokens: ReadonlyMap<string, string>): McpServerEntry[];
|
|
21
20
|
export interface Endpoints {
|
|
22
|
-
models(bases: readonly ModelBases[]): Promise<void>;
|
|
23
21
|
servers(servers: readonly McpServerSource[]): Promise<void>;
|
|
24
22
|
token(server: string, url: string): Promise<void>;
|
|
25
23
|
close(): void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentRecord, ErrorCode, McpServerEntry,
|
|
1
|
+
import type { AgentRecord, ErrorCode, McpServerEntry, OAuthConfig, OutgoingRequest } from '@ai-ecoverse/slicc-vault';
|
|
2
2
|
import { type MutableReplicatedState } from '@earendil-works/chord';
|
|
3
3
|
import type { Scrub, Scrubbable, ScrubStream } from './scrub.ts';
|
|
4
4
|
export type ScrubPair = {
|
|
@@ -34,7 +34,6 @@ export interface Granted {
|
|
|
34
34
|
expiresAt?: number;
|
|
35
35
|
}
|
|
36
36
|
export interface EndpointSet {
|
|
37
|
-
model: ModelEndpoint[];
|
|
38
37
|
mcp: McpServerEntry[];
|
|
39
38
|
}
|
|
40
39
|
export declare class Vault implements Scrub {
|
package/dist/types/services.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-ecoverse/slicc-agent",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.14.0",
|
|
4
4
|
"description": "SLICC's agent core on pi durable: an agent worker, session storage, remoting and pi extensions",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -65,10 +65,10 @@
|
|
|
65
65
|
"release": "semantic-release"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
|
-
"@ai-ecoverse/slicc-kernel": "1.
|
|
68
|
+
"@ai-ecoverse/slicc-kernel": "1.132.0",
|
|
69
69
|
"@ai-ecoverse/slicc-scrub": "1.0.0",
|
|
70
|
-
"@ai-ecoverse/slicc-shared-web": "1.
|
|
71
|
-
"@ai-ecoverse/slicc-spectrum": "1.
|
|
70
|
+
"@ai-ecoverse/slicc-shared-web": "1.25.0",
|
|
71
|
+
"@ai-ecoverse/slicc-spectrum": "1.96.1",
|
|
72
72
|
"@ai-ecoverse/wasi-fnox": "1.39.0-5",
|
|
73
73
|
"@ai-ecoverse/wasm-bash": "5.3.0-20",
|
|
74
74
|
"@ai-ecoverse/wasm-coreutils": "9.12.0-10",
|