@ai-ecoverse/slicc-agent 6.19.15 → 7.1.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 +17 -33
- package/dist/agent.js +10 -1
- package/dist/agent.js.map +2 -2
- package/dist/agents.js +2 -0
- package/dist/agents.js.map +2 -2
- package/dist/approvals/policy.js +2 -0
- package/dist/approvals/policy.js.map +2 -2
- package/dist/approvals/record.js +2 -0
- package/dist/approvals/record.js.map +2 -2
- package/dist/checkpoints.js +5 -0
- package/dist/checkpoints.js.map +7 -0
- package/dist/codemode/index.js +2 -0
- package/dist/codemode/index.js.map +2 -2
- package/dist/cone.js +2 -0
- package/dist/cone.js.map +2 -2
- package/dist/guests/guard.js +3 -0
- package/dist/guests/guard.js.map +2 -2
- package/dist/guests/review.js +4 -1
- package/dist/guests/review.js.map +2 -2
- package/dist/guests/scoop.js +3 -0
- package/dist/guests/scoop.js.map +2 -2
- package/dist/guests/seats.js +2 -0
- package/dist/guests/seats.js.map +2 -2
- package/dist/guests/tags.js +2 -0
- package/dist/guests/tags.js.map +2 -2
- package/dist/licks/boot.js +2 -0
- package/dist/licks/boot.js.map +2 -2
- package/dist/licks/licks.js +2 -0
- package/dist/licks/licks.js.map +2 -2
- package/dist/mcp/allow.js +2 -0
- package/dist/mcp/allow.js.map +2 -2
- package/dist/memory/extract.js +2 -0
- package/dist/memory/extract.js.map +2 -2
- package/dist/monitor/index.js +3 -1
- package/dist/monitor/index.js.map +2 -2
- package/dist/pause.js +26 -0
- package/dist/pause.js.map +7 -0
- package/dist/preferred.js +6 -6
- package/dist/preferred.js.map +1 -1
- package/dist/providers.js +1 -1
- package/dist/providers.js.map +1 -1
- package/dist/scoops/extension.js +2 -1
- package/dist/scoops/extension.js.map +2 -2
- package/dist/scoops/service.js +2 -0
- package/dist/scoops/service.js.map +2 -2
- package/dist/secrets/legacy.js +2 -0
- package/dist/secrets/legacy.js.map +2 -2
- package/dist/selection.js +2 -0
- package/dist/selection.js.map +2 -2
- package/dist/services.js.map +2 -2
- package/dist/settings.js +33 -5
- package/dist/settings.js.map +3 -3
- package/dist/spectrum/budget.js +30 -0
- package/dist/spectrum/budget.js.map +7 -0
- package/dist/spectrum/index.js +7 -5
- package/dist/spectrum/index.js.map +2 -2
- package/dist/spectrum/monitor-port.js +24 -4
- package/dist/spectrum/monitor-port.js.map +2 -2
- package/dist/spectrum/tray-port.js +19 -3
- package/dist/spectrum/tray-port.js.map +2 -2
- package/dist/sprinkles/sprinkles.js +2 -0
- package/dist/sprinkles/sprinkles.js.map +2 -2
- package/dist/supergrok.js +73 -0
- package/dist/supergrok.js.map +7 -0
- package/dist/titles/labels.js +2 -0
- package/dist/titles/labels.js.map +2 -2
- package/dist/types/agent.d.ts +4 -0
- package/dist/types/checkpoints.d.ts +1 -0
- package/dist/types/pause.d.ts +6 -0
- package/dist/types/services.d.ts +5 -2
- package/dist/types/settings.d.ts +8 -1
- package/dist/types/spectrum/budget.d.ts +16 -0
- package/dist/types/spectrum/monitor-port.d.ts +2 -0
- package/dist/types/spectrum/tray-port.d.ts +2 -1
- package/dist/types/supergrok.d.ts +12 -0
- package/dist/workflow/run.js +5 -0
- package/dist/workflow/run.js.map +2 -2
- package/package.json +11 -11
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/secrets/legacy.ts"],
|
|
4
|
-
"sourcesContent": ["import { type Context, type ReplicatedState, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport { defineDoc, type Harness } from '@earendil-works/pi-durable';\nimport type { VaultRecords } from './records.ts';\nimport type { Vault } from './vault.ts';\n\nexport const LEGACY_DATABASE = 'slicc-agent-credentials';\n\nexport type MovedAccount =\n | { kind: 'model'; provider: string; label: string }\n | { kind: 'mcp'; server: string; label: string };\n\nexport type MovedState = {\n accounts: MovedAccount[];\n dismissed: boolean;\n};\n\nexport const MovedDoc = defineDoc<MovedState>({\n kind: 'slicc.keys-moved',\n version: 1,\n scope: 'session',\n initial: () => ({ accounts: [], dismissed: false }),\n});\n\nconst NAMES: Record<string, string> = { adobe: 'Adobe', 'amazon-bedrock': 'Bedrock' };\n\nfunction accountId(account: MovedAccount): string {\n return account.kind === 'mcp' ? `mcp:${account.server}` : account.provider;\n}\n\nexport function movedAccount(key: string): MovedAccount {\n if (key.startsWith('mcp:')) {\n const server = key.slice(4).split('|')[0] as string;\n return { kind: 'mcp', server, label: server };\n }\n return { kind: 'model', provider: key, label: NAMES[key] ?? key };\n}\n\nfunction request<T>(operation: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n operation.onsuccess = () => resolve(operation.result);\n operation.onerror = () => reject(operation.error);\n });\n}\n\nasync function legacyKeys(factory: IDBFactory): Promise<string[]> {\n const db = await request(factory.open(LEGACY_DATABASE));\n try {\n if (!db.objectStoreNames.contains('credentials')) return [];\n const store = db.transaction('credentials', 'readonly').objectStore('credentials');\n return ((await request(store.getAllKeys())) as IDBValidKey[]).map(String);\n } finally {\n db.close();\n }\n}\n\nfunction deleted(factory: IDBFactory): Promise<boolean> {\n return new Promise((resolve) => {\n const deleting = factory.deleteDatabase(LEGACY_DATABASE);\n deleting.onsuccess = () => resolve(true);\n deleting.onerror = () => resolve(false);\n });\n}\n\nexport const WIPE_WAIT_MS = 3000;\n\nexport interface Wiped {\n now: MovedAccount[];\n later: Promise<MovedAccount[]>;\n}\n\nconst nothing = (): Wiped => ({ now: [], later: Promise.resolve([]) });\n\nexport async function wipeLegacy(\n factory: IDBFactory | undefined = globalThis.indexedDB,\n wait = WIPE_WAIT_MS\n): Promise<Wiped> {\n if (!factory) return nothing();\n const listed = await factory.databases().catch(() => []);\n if (!listed.some((database) => database.name === LEGACY_DATABASE)) return nothing();\n const keys = await legacyKeys(factory).catch(() => []);\n const found = new Map(keys.map(movedAccount).map((account) => [accountId(account), account]));\n const done = deleted(factory).then((ok) => (ok ? [...found.values()] : []));\n const { promise: bound, resolve } = Promise.withResolvers<undefined>();\n const timer = setTimeout(() => resolve(undefined), wait);\n const first = await Promise.race([done, bound]);\n clearTimeout(timer);\n return first ? { now: first, later: Promise.resolve([]) } : { now: [], later: done };\n}\n\nexport type MovedName = { kind: 'model' | 'mcp'; label: string };\n\nexport interface KeysMoved {\n readonly state: ReplicatedState<MovedName[]>;\n dismiss(context: Context): Promise<void>;\n}\n\ntype Records = Pick<VaultRecords, 'state' | 'model' | 'mcp' | 'refresh'>;\n\nexport async function keysMoved(\n harness: Pick<Harness, 'commit'>,\n sources: { records: Records; vault: Pick<Vault, 'connected'> },\n wiped: Wiped,\n context: Context = BACKGROUND_CONTEXT\n): Promise<KeysMoved> {\n const { records, vault } = sources;\n const add = (accounts: readonly MovedAccount[], using: Context) =>\n harness.commit(async (tx) => {\n const doc = await tx.doc(MovedDoc);\n const known = new Set(doc.accounts.map(accountId));\n for (const account of accounts)\n if (!known.has(accountId(account))) doc.accounts.push(account);\n return JSON.parse(JSON.stringify(doc)) as MovedState;\n }, using);\n let saved = await add(wiped.now, context);\n let read = false;\n const missing = (account: MovedAccount) =>\n account.kind === 'mcp' ? !records.mcp(account.server) : !records.model(account.provider);\n const pending = () =>\n read && !saved.dismissed\n ? saved.accounts.filter(missing).map(({ kind, label }) => ({ kind, label }))\n : [];\n const state = replicatedState<MovedName[]>(pending());\n const update = (using: Context) => {\n const next = pending();\n if (JSON.stringify(next) !== JSON.stringify(state.value)) state.replace(using, next);\n };\n const mark = (using: Context) => {\n if (vault.connected) read = true;\n update(using);\n };\n records.state.subscribe((_value, using) => mark(using));\n wiped.later\n .then(async (late) => {\n if (!late.length) return;\n saved = await add(late, context);\n update(context);\n })\n .catch(() => undefined);\n void records.refresh(context).then(\n () => mark(context),\n () => undefined\n );\n return {\n state,\n async dismiss(using) {\n saved = await harness.commit(async (tx) => {\n const doc = await tx.doc(MovedDoc);\n doc.dismissed = true;\n return JSON.parse(JSON.stringify(doc)) as MovedState;\n }, using);\n update(using);\n },\n };\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAA6C,uBAAuB;AACpE,SAAS,0BAA0B;AACnC,SAAS,iBAA+B;
|
|
4
|
+
"sourcesContent": ["import { type Context, type ReplicatedState, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport { defineDoc, type Harness } from '@earendil-works/pi-durable';\nimport { deltasOnly } from '../checkpoints.ts';\nimport type { VaultRecords } from './records.ts';\nimport type { Vault } from './vault.ts';\n\nexport const LEGACY_DATABASE = 'slicc-agent-credentials';\n\nexport type MovedAccount =\n | { kind: 'model'; provider: string; label: string }\n | { kind: 'mcp'; server: string; label: string };\n\nexport type MovedState = {\n accounts: MovedAccount[];\n dismissed: boolean;\n};\n\nexport const MovedDoc = defineDoc<MovedState>({\n kind: 'slicc.keys-moved',\n checkpointWhen: deltasOnly,\n version: 1,\n scope: 'session',\n initial: () => ({ accounts: [], dismissed: false }),\n});\n\nconst NAMES: Record<string, string> = { adobe: 'Adobe', 'amazon-bedrock': 'Bedrock' };\n\nfunction accountId(account: MovedAccount): string {\n return account.kind === 'mcp' ? `mcp:${account.server}` : account.provider;\n}\n\nexport function movedAccount(key: string): MovedAccount {\n if (key.startsWith('mcp:')) {\n const server = key.slice(4).split('|')[0] as string;\n return { kind: 'mcp', server, label: server };\n }\n return { kind: 'model', provider: key, label: NAMES[key] ?? key };\n}\n\nfunction request<T>(operation: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n operation.onsuccess = () => resolve(operation.result);\n operation.onerror = () => reject(operation.error);\n });\n}\n\nasync function legacyKeys(factory: IDBFactory): Promise<string[]> {\n const db = await request(factory.open(LEGACY_DATABASE));\n try {\n if (!db.objectStoreNames.contains('credentials')) return [];\n const store = db.transaction('credentials', 'readonly').objectStore('credentials');\n return ((await request(store.getAllKeys())) as IDBValidKey[]).map(String);\n } finally {\n db.close();\n }\n}\n\nfunction deleted(factory: IDBFactory): Promise<boolean> {\n return new Promise((resolve) => {\n const deleting = factory.deleteDatabase(LEGACY_DATABASE);\n deleting.onsuccess = () => resolve(true);\n deleting.onerror = () => resolve(false);\n });\n}\n\nexport const WIPE_WAIT_MS = 3000;\n\nexport interface Wiped {\n now: MovedAccount[];\n later: Promise<MovedAccount[]>;\n}\n\nconst nothing = (): Wiped => ({ now: [], later: Promise.resolve([]) });\n\nexport async function wipeLegacy(\n factory: IDBFactory | undefined = globalThis.indexedDB,\n wait = WIPE_WAIT_MS\n): Promise<Wiped> {\n if (!factory) return nothing();\n const listed = await factory.databases().catch(() => []);\n if (!listed.some((database) => database.name === LEGACY_DATABASE)) return nothing();\n const keys = await legacyKeys(factory).catch(() => []);\n const found = new Map(keys.map(movedAccount).map((account) => [accountId(account), account]));\n const done = deleted(factory).then((ok) => (ok ? [...found.values()] : []));\n const { promise: bound, resolve } = Promise.withResolvers<undefined>();\n const timer = setTimeout(() => resolve(undefined), wait);\n const first = await Promise.race([done, bound]);\n clearTimeout(timer);\n return first ? { now: first, later: Promise.resolve([]) } : { now: [], later: done };\n}\n\nexport type MovedName = { kind: 'model' | 'mcp'; label: string };\n\nexport interface KeysMoved {\n readonly state: ReplicatedState<MovedName[]>;\n dismiss(context: Context): Promise<void>;\n}\n\ntype Records = Pick<VaultRecords, 'state' | 'model' | 'mcp' | 'refresh'>;\n\nexport async function keysMoved(\n harness: Pick<Harness, 'commit'>,\n sources: { records: Records; vault: Pick<Vault, 'connected'> },\n wiped: Wiped,\n context: Context = BACKGROUND_CONTEXT\n): Promise<KeysMoved> {\n const { records, vault } = sources;\n const add = (accounts: readonly MovedAccount[], using: Context) =>\n harness.commit(async (tx) => {\n const doc = await tx.doc(MovedDoc);\n const known = new Set(doc.accounts.map(accountId));\n for (const account of accounts)\n if (!known.has(accountId(account))) doc.accounts.push(account);\n return JSON.parse(JSON.stringify(doc)) as MovedState;\n }, using);\n let saved = await add(wiped.now, context);\n let read = false;\n const missing = (account: MovedAccount) =>\n account.kind === 'mcp' ? !records.mcp(account.server) : !records.model(account.provider);\n const pending = () =>\n read && !saved.dismissed\n ? saved.accounts.filter(missing).map(({ kind, label }) => ({ kind, label }))\n : [];\n const state = replicatedState<MovedName[]>(pending());\n const update = (using: Context) => {\n const next = pending();\n if (JSON.stringify(next) !== JSON.stringify(state.value)) state.replace(using, next);\n };\n const mark = (using: Context) => {\n if (vault.connected) read = true;\n update(using);\n };\n records.state.subscribe((_value, using) => mark(using));\n wiped.later\n .then(async (late) => {\n if (!late.length) return;\n saved = await add(late, context);\n update(context);\n })\n .catch(() => undefined);\n void records.refresh(context).then(\n () => mark(context),\n () => undefined\n );\n return {\n state,\n async dismiss(using) {\n saved = await harness.commit(async (tx) => {\n const doc = await tx.doc(MovedDoc);\n doc.dismissed = true;\n return JSON.parse(JSON.stringify(doc)) as MovedState;\n }, using);\n update(using);\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/selection.js
CHANGED
|
@@ -2,10 +2,12 @@ import {
|
|
|
2
2
|
AgentDoc,
|
|
3
3
|
defineDoc
|
|
4
4
|
} from "@earendil-works/pi-durable";
|
|
5
|
+
import { deltasOnly } from "./checkpoints.js";
|
|
5
6
|
const SELECTION = ["extensions", "tools", "modelTools", "instructions"];
|
|
6
7
|
const ALL = ["model", "thinkingLevel", "cwd", ...SELECTION];
|
|
7
8
|
const SelectionDoc = defineDoc({
|
|
8
9
|
kind: "slicc.selection",
|
|
10
|
+
checkpointWhen: deltasOnly,
|
|
9
11
|
version: 1,
|
|
10
12
|
scope: "session",
|
|
11
13
|
initial: () => ({ version: 0 })
|
package/dist/selection.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/selection.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Context } from '@earendil-works/chord';\nimport {\n AgentDoc,\n type AgentState,\n type ConversationId,\n type ConversationInit,\n type Cursor,\n defineDoc,\n type Harness,\n type HarnessOptions,\n type Storage,\n} from '@earendil-works/pi-durable';\n\nexport type Choosable = (tool: string) => boolean;\n\ntype Field = keyof AgentState;\n\nexport const SELECTION: readonly Field[] = ['extensions', 'tools', 'modelTools', 'instructions'];\n\nconst ALL: readonly Field[] = ['model', 'thinkingLevel', 'cwd', ...SELECTION];\n\nexport const SelectionDoc = defineDoc<{ version: number }>({\n kind: 'slicc.selection',\n version: 1,\n scope: 'session',\n initial: () => ({ version: 0 }),\n});\n\nexport const SELECTION_VERSION = 1;\n\nexport async function storedAgent(\n harness: Pick<Harness, 'snapshot'>,\n conversationId: ConversationId,\n context: Context\n): Promise<AgentState> {\n return structuredClone((await harness.snapshot(AgentDoc, conversationId, context)) ?? {});\n}\n\nexport function copyAgent(from: AgentState, fields: readonly Field[] = ALL): ConversationInit {\n return async (tx, conversationId) => {\n const agent = (await tx.doc(AgentDoc, conversationId)) as Record<string, unknown>;\n for (const field of fields) {\n const value = from[field];\n if (value === undefined) delete agent[field];\n else agent[field] = structuredClone(value);\n }\n };\n}\n\nexport function unfrozen(agent: AgentState, choosable: Choosable): boolean {\n let changed = false;\n if (Array.isArray(agent.extensions)) {\n delete agent.extensions;\n changed = true;\n }\n if (Array.isArray(agent.tools) && !agent.tools.every(choosable)) {\n delete agent.tools;\n changed = true;\n }\n return changed;\n}\n\nexport function unfreezeCreated(choosable: Choosable): HarnessOptions['conversationCreated'] {\n return async (tx, conversation) => {\n unfrozen(await tx.doc(AgentDoc, conversation.id), choosable);\n };\n}\n\nexport async function unfreeze(\n harness: Pick<Harness, 'snapshot' | 'commit'>,\n storage: Pick<Storage, 'scanConversations'>,\n choosable: Choosable,\n context: Context\n): Promise<number> {\n const done = await harness.snapshot(SelectionDoc, context);\n if ((done?.version ?? 0) >= SELECTION_VERSION) return 0;\n let fixed = 0;\n let cursor: Cursor | undefined;\n do {\n const page = await storage.scanConversations({}, 100, cursor, context);\n for (const record of page.items)\n if (\n await harness.commit(\n async (tx) => unfrozen(await tx.doc(AgentDoc, record.id), choosable),\n context\n )\n )\n fixed++;\n cursor = page.next;\n } while (cursor);\n await harness.commit(async (tx) => {\n (await tx.doc(SelectionDoc)).version = SELECTION_VERSION;\n }, context);\n return fixed;\n}\n"],
|
|
5
|
-
"mappings": "AACA;AAAA,EACE;AAAA,EAKA;AAAA,OAIK;
|
|
4
|
+
"sourcesContent": ["import type { Context } from '@earendil-works/chord';\nimport {\n AgentDoc,\n type AgentState,\n type ConversationId,\n type ConversationInit,\n type Cursor,\n defineDoc,\n type Harness,\n type HarnessOptions,\n type Storage,\n} from '@earendil-works/pi-durable';\nimport { deltasOnly } from './checkpoints.ts';\n\nexport type Choosable = (tool: string) => boolean;\n\ntype Field = keyof AgentState;\n\nexport const SELECTION: readonly Field[] = ['extensions', 'tools', 'modelTools', 'instructions'];\n\nconst ALL: readonly Field[] = ['model', 'thinkingLevel', 'cwd', ...SELECTION];\n\nexport const SelectionDoc = defineDoc<{ version: number }>({\n kind: 'slicc.selection',\n checkpointWhen: deltasOnly,\n version: 1,\n scope: 'session',\n initial: () => ({ version: 0 }),\n});\n\nexport const SELECTION_VERSION = 1;\n\nexport async function storedAgent(\n harness: Pick<Harness, 'snapshot'>,\n conversationId: ConversationId,\n context: Context\n): Promise<AgentState> {\n return structuredClone((await harness.snapshot(AgentDoc, conversationId, context)) ?? {});\n}\n\nexport function copyAgent(from: AgentState, fields: readonly Field[] = ALL): ConversationInit {\n return async (tx, conversationId) => {\n const agent = (await tx.doc(AgentDoc, conversationId)) as Record<string, unknown>;\n for (const field of fields) {\n const value = from[field];\n if (value === undefined) delete agent[field];\n else agent[field] = structuredClone(value);\n }\n };\n}\n\nexport function unfrozen(agent: AgentState, choosable: Choosable): boolean {\n let changed = false;\n if (Array.isArray(agent.extensions)) {\n delete agent.extensions;\n changed = true;\n }\n if (Array.isArray(agent.tools) && !agent.tools.every(choosable)) {\n delete agent.tools;\n changed = true;\n }\n return changed;\n}\n\nexport function unfreezeCreated(choosable: Choosable): HarnessOptions['conversationCreated'] {\n return async (tx, conversation) => {\n unfrozen(await tx.doc(AgentDoc, conversation.id), choosable);\n };\n}\n\nexport async function unfreeze(\n harness: Pick<Harness, 'snapshot' | 'commit'>,\n storage: Pick<Storage, 'scanConversations'>,\n choosable: Choosable,\n context: Context\n): Promise<number> {\n const done = await harness.snapshot(SelectionDoc, context);\n if ((done?.version ?? 0) >= SELECTION_VERSION) return 0;\n let fixed = 0;\n let cursor: Cursor | undefined;\n do {\n const page = await storage.scanConversations({}, 100, cursor, context);\n for (const record of page.items)\n if (\n await harness.commit(\n async (tx) => unfrozen(await tx.doc(AgentDoc, record.id), choosable),\n context\n )\n )\n fixed++;\n cursor = page.next;\n } while (cursor);\n await harness.commit(async (tx) => {\n (await tx.doc(SelectionDoc)).version = SELECTION_VERSION;\n }, context);\n return fixed;\n}\n"],
|
|
5
|
+
"mappings": "AACA;AAAA,EACE;AAAA,EAKA;AAAA,OAIK;AACP,SAAS,kBAAkB;AAMpB,MAAM,YAA8B,CAAC,cAAc,SAAS,cAAc,cAAc;AAE/F,MAAM,MAAwB,CAAC,SAAS,iBAAiB,OAAO,GAAG,SAAS;AAErE,MAAM,eAAe,UAA+B;AAAA,EACzD,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS,OAAO,EAAE,SAAS,EAAE;AAC/B,CAAC;AAEM,MAAM,oBAAoB;AAEjC,eAAsB,YACpB,SACA,gBACA,SACqB;AACrB,SAAO,gBAAiB,MAAM,QAAQ,SAAS,UAAU,gBAAgB,OAAO,KAAM,CAAC,CAAC;AAC1F;AAEO,SAAS,UAAU,MAAkB,SAA2B,KAAuB;AAC5F,SAAO,OAAO,IAAI,mBAAmB;AACnC,UAAM,QAAS,MAAM,GAAG,IAAI,UAAU,cAAc;AACpD,eAAW,SAAS,QAAQ;AAC1B,YAAM,QAAQ,KAAK,KAAK;AACxB,UAAI,UAAU,OAAW,QAAO,MAAM,KAAK;AAAA,UACtC,OAAM,KAAK,IAAI,gBAAgB,KAAK;AAAA,IAC3C;AAAA,EACF;AACF;AAEO,SAAS,SAAS,OAAmB,WAA+B;AACzE,MAAI,UAAU;AACd,MAAI,MAAM,QAAQ,MAAM,UAAU,GAAG;AACnC,WAAO,MAAM;AACb,cAAU;AAAA,EACZ;AACA,MAAI,MAAM,QAAQ,MAAM,KAAK,KAAK,CAAC,MAAM,MAAM,MAAM,SAAS,GAAG;AAC/D,WAAO,MAAM;AACb,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,WAA6D;AAC3F,SAAO,OAAO,IAAI,iBAAiB;AACjC,aAAS,MAAM,GAAG,IAAI,UAAU,aAAa,EAAE,GAAG,SAAS;AAAA,EAC7D;AACF;AAEA,eAAsB,SACpB,SACA,SACA,WACA,SACiB;AACjB,QAAM,OAAO,MAAM,QAAQ,SAAS,cAAc,OAAO;AACzD,OAAK,MAAM,WAAW,MAAM,kBAAmB,QAAO;AACtD,MAAI,QAAQ;AACZ,MAAI;AACJ,KAAG;AACD,UAAM,OAAO,MAAM,QAAQ,kBAAkB,CAAC,GAAG,KAAK,QAAQ,OAAO;AACrE,eAAW,UAAU,KAAK;AACxB,UACE,MAAM,QAAQ;AAAA,QACZ,OAAO,OAAO,SAAS,MAAM,GAAG,IAAI,UAAU,OAAO,EAAE,GAAG,SAAS;AAAA,QACnE;AAAA,MACF;AAEA;AACJ,aAAS,KAAK;AAAA,EAChB,SAAS;AACT,QAAM,QAAQ,OAAO,OAAO,OAAO;AACjC,KAAC,MAAM,GAAG,IAAI,YAAY,GAAG,UAAU;AAAA,EACzC,GAAG,OAAO;AACV,SAAO;AACT;",
|
|
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 { DeviceSignIn } from './sign-ins.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 inPlace?: 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 | DeviceSignIn | 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": "AAmBA,SAAS,gBAAgB;
|
|
4
|
+
"sourcesContent": ["import type { Context, JsonValue, RemoteContract, ReplicatedState } from '@earendil-works/chord';\nimport type { BlockedReason, 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 { DeviceSignIn } from './sign-ins.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 inPlace?: 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' | 'sleeping' | 'completing';\n phase: string;\n background: boolean;\n aborting: number | null;\n since: number;\n waits: number;\n until: number | null;\n blocked: BlockedReason | null;\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 budgets?: BudgetState[];\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 | DeviceSignIn | 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
|
}
|
package/dist/settings.js
CHANGED
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
} from "./providers.js";
|
|
24
24
|
import { absent } from "./secrets/fetch.js";
|
|
25
25
|
import { DEVICE_NEEDS_VAULT, DEVICE_SIGN_INS } from "./sign-ins.js";
|
|
26
|
+
import { XAI, xaiUsage } from "./supergrok.js";
|
|
26
27
|
import { BEDROCK as BEDROCK2, PREFERRED_MODELS, preferredModel as preferredModel2 } from "./preferred.js";
|
|
27
28
|
const DEFAULT_MODEL = { provider: BEDROCK, modelId: "us.anthropic.claude-sonnet-5-5" };
|
|
28
29
|
const DEFAULT_REGIONS = { [BEDROCK]: DEFAULT_REGION };
|
|
@@ -239,11 +240,25 @@ async function providerFields(store, providers) {
|
|
|
239
240
|
}
|
|
240
241
|
};
|
|
241
242
|
}
|
|
242
|
-
async function
|
|
243
|
+
async function adobeBudget(records, usage) {
|
|
243
244
|
const key = records.model(ADOBE)?.placeholder;
|
|
244
245
|
const found = key ? await usage(key).catch(() => null) : null;
|
|
245
246
|
return found ? { provider: ADOBE, ...found } : null;
|
|
246
247
|
}
|
|
248
|
+
function grokBudgets(records, usage, { reach, every, now }) {
|
|
249
|
+
let kept;
|
|
250
|
+
return async () => {
|
|
251
|
+
const record = records.model(XAI);
|
|
252
|
+
if (!record || record.expiresAt === void 0 || record.state === "expired") return null;
|
|
253
|
+
if (reach?.free() !== true) return null;
|
|
254
|
+
const key = `${record.placeholder} ${record.expiresAt}`;
|
|
255
|
+
const at = now();
|
|
256
|
+
if (!kept || kept.key !== key || at - kept.at >= every)
|
|
257
|
+
kept = { key, at, found: usage(record.placeholder).catch(() => null) };
|
|
258
|
+
const found = await kept.found;
|
|
259
|
+
return found ? { provider: XAI, ...found } : null;
|
|
260
|
+
};
|
|
261
|
+
}
|
|
247
262
|
function blockedBy(reach) {
|
|
248
263
|
return (providerId) => Boolean(LISTINGS.get(providerId)?.corsFree) && reach?.free() === false;
|
|
249
264
|
}
|
|
@@ -266,6 +281,16 @@ async function createAgentSettings(models, sources, providers = sliccProviders()
|
|
|
266
281
|
const endpoint = adobe?.baseUrl ?? ADOBE_PROXY;
|
|
267
282
|
const identity = adobe?.headers ?? adobeIdentity();
|
|
268
283
|
const usage = options.usage ?? ((token) => adobeUsage(token, { endpoint, identity }));
|
|
284
|
+
const every = options.every ?? BUDGET_EVERY;
|
|
285
|
+
const grok = grokBudgets(records, options.grok ?? ((token) => xaiUsage(token)), {
|
|
286
|
+
reach,
|
|
287
|
+
every,
|
|
288
|
+
now: options.now ?? Date.now
|
|
289
|
+
});
|
|
290
|
+
const polled = providers.some((provider) => provider.id === XAI);
|
|
291
|
+
const budgets = async () => (await Promise.all([adobeBudget(records, usage), polled ? grok() : null])).filter(
|
|
292
|
+
(found) => found !== null
|
|
293
|
+
);
|
|
269
294
|
const snapshot = async () => {
|
|
270
295
|
const stored = new Set(
|
|
271
296
|
providers.filter((provider) => records.model(provider.id) && fields.ready(provider.id)).map((provider) => provider.id)
|
|
@@ -273,12 +298,14 @@ async function createAgentSettings(models, sources, providers = sliccProviders()
|
|
|
273
298
|
const show = listed(records, fields);
|
|
274
299
|
const shown = providers.filter((provider) => show(provider.id));
|
|
275
300
|
const open = (list) => list.filter((provider) => !blocked(provider.id));
|
|
301
|
+
const held2 = await budgets();
|
|
276
302
|
return {
|
|
277
303
|
models: choices(models, open(providers), stored),
|
|
278
304
|
labels: labels(models, open(shown), stored),
|
|
279
305
|
accounts: [...accounts(records, shown, fields, blocked), ...await mcp?.accounts() ?? []],
|
|
280
306
|
providers: offered(providers, blocked),
|
|
281
|
-
budget:
|
|
307
|
+
budget: held2[0] ?? null,
|
|
308
|
+
budgets: held2,
|
|
282
309
|
...moved?.state.value?.length ? { moved: moved.state.value.map((name) => ({ ...name })) } : {}
|
|
283
310
|
};
|
|
284
311
|
};
|
|
@@ -294,10 +321,10 @@ async function createAgentSettings(models, sources, providers = sliccProviders()
|
|
|
294
321
|
() => void 0,
|
|
295
322
|
() => void 0
|
|
296
323
|
);
|
|
297
|
-
if (signedIn.length) {
|
|
298
|
-
const cycle = () => void discover(signedIn).then(() => refresh(BACKGROUND_CONTEXT)).catch(() => void 0);
|
|
324
|
+
if (signedIn.length || polled) {
|
|
325
|
+
const cycle = () => void (signedIn.length ? discover(signedIn) : Promise.resolve()).then(() => refresh(BACKGROUND_CONTEXT)).catch(() => void 0);
|
|
299
326
|
cycle();
|
|
300
|
-
const timer = setInterval(cycle,
|
|
327
|
+
const timer = setInterval(cycle, every);
|
|
301
328
|
timer.unref?.();
|
|
302
329
|
}
|
|
303
330
|
mcp?.onChange(() => void refresh(BACKGROUND_CONTEXT).catch(() => void 0));
|
|
@@ -381,6 +408,7 @@ export {
|
|
|
381
408
|
catalogStore,
|
|
382
409
|
createAgentSettings,
|
|
383
410
|
createSliccModels,
|
|
411
|
+
grokBudgets,
|
|
384
412
|
preferredModel2 as preferredModel,
|
|
385
413
|
providerFields,
|
|
386
414
|
resolveDefaultModel,
|
package/dist/settings.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/settings.ts"],
|
|
4
|
-
"sourcesContent": ["import { type Context, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { CredentialStore, ModelsStore, Provider } from '@earendil-works/pi-ai';\nimport { createModels, type MutableModels } from '@earendil-works/pi-ai/models';\nimport { amazonBedrockProvider } from '@earendil-works/pi-ai/providers/amazon-bedrock';\nimport {\n ADOBE,\n ADOBE_PROXY,\n adobeConfig,\n adobeIdentity,\n adobeProvider,\n adobeUsage,\n type Budget,\n} from './adobe.ts';\nimport { abortableBedrock } from './bedrock.ts';\nimport { codexProvider } from './codex.ts';\nimport { type DeviceFlows, deviceFlows } from './device.ts';\nimport type { McpAccounts } from './mcp/index.ts';\nimport { MCP_ACCOUNT } from './mcp/label.ts';\nimport type { Reach } from './net.ts';\nimport { BEDROCK, preferredModel } from './preferred.ts';\nimport {\n ADDED_FIRST,\n DEFAULT_REGION,\n type FieldSpec,\n KEY_PROVIDERS,\n LISTINGS,\n type Listing,\n} from './providers.ts';\nimport { absent } from './secrets/fetch.ts';\nimport type { KeysMoved } from './secrets/legacy.ts';\nimport type { VaultRecords } from './secrets/records.ts';\nimport type { PlainStore } from './secrets/store.ts';\nimport type { Vault } from './secrets/vault.ts';\nimport type {\n AccountField,\n AccountState,\n AgentSettings,\n ModelChoice,\n ProviderOption,\n SettingsState,\n} from './services.ts';\nimport { DEVICE_NEEDS_VAULT, DEVICE_SIGN_INS } from './sign-ins.ts';\n\nexport { BEDROCK, PREFERRED_MODELS, preferredModel } from './preferred.ts';\n\nexport const DEFAULT_MODEL = { provider: BEDROCK, modelId: 'us.anthropic.claude-sonnet-5-5' };\nexport const DEFAULT_REGIONS: Readonly<Record<string, string>> = { [BEDROCK]: DEFAULT_REGION };\n\nconst specs = (providerId: string): readonly FieldSpec[] => LISTINGS.get(providerId)?.fields ?? [];\n\nexport const ACCOUNT_FIELDS: Readonly<Record<string, readonly AccountField[]>> = Object.fromEntries(\n [...LISTINGS.keys()]\n .filter((id) => specs(id).length)\n .map((id) => [id, specs(id).map(({ env: _env, ...field }) => field)])\n);\nexport const SIGN_IN_NEEDS_VAULT = \"Adobe sign-in needs seven's vault: update seven\";\nexport const KEY_NEEDS_VAULT = \"API keys are kept in seven's vault: update seven\";\n\nexport async function resolveDefaultModel(\n credentials: CredentialStore,\n providers: Provider[],\n models: MutableModels\n): Promise<{ provider: string; modelId: string }> {\n const stored = new Set((await credentials.list()).map((info) => info.providerId));\n for (const provider of providers) {\n if (!stored.has(provider.id)) continue;\n if (!models.getModels(provider.id).length && provider.refreshModels) {\n await models.refresh({ providers: [provider.id] }).catch(() => undefined);\n }\n const chosen = preferredModel(provider.id, models.getModels(provider.id));\n if (chosen) return { provider: provider.id, modelId: chosen.id };\n }\n return DEFAULT_MODEL;\n}\n\nconst signIn = new Set([ADOBE]);\nconst oauth = (providerId: string) => signIn.has(providerId) || DEVICE_SIGN_INS.has(providerId);\nconst SIGN_IN_CORS_FREE = new Set(['xai']);\nconst BUDGET_EVERY = 5 * 60 * 1000;\n\nexport function sliccProviders(version?: string): Provider[] {\n return [\n amazonBedrockProvider() as Provider,\n adobeProvider({ version }),\n ...KEY_PROVIDERS.map((entry) => entry.make()),\n codexProvider(),\n ];\n}\n\nexport function withDefaultRegions(credentials: CredentialStore): CredentialStore {\n return {\n async read(providerId, options) {\n const credential = await credentials.read(providerId, options);\n const region = DEFAULT_REGIONS[providerId];\n if (credential?.type !== 'api_key' || !region || credential.env?.AWS_REGION) {\n return credential;\n }\n return { ...credential, env: { ...credential.env, AWS_REGION: region } };\n },\n list: (options) => credentials.list(options),\n modify: (providerId, fn, options) => credentials.modify(providerId, fn, options),\n delete: (providerId, options) => credentials.delete(providerId, options),\n };\n}\n\nexport function catalogStore(store: PlainStore): ModelsStore {\n return {\n read: async (providerId) =>\n ((await store.get(providerId)) as Awaited<ReturnType<ModelsStore['read']>>) ?? undefined,\n write: (providerId, entry) => store.set(providerId, entry),\n delete: (providerId) => store.set(providerId, undefined),\n };\n}\n\nexport function createSliccModels(\n credentials: CredentialStore,\n providers = sliccProviders(),\n catalog?: ModelsStore\n): MutableModels {\n const models = createModels({\n credentials: withDefaultRegions(credentials),\n ...(catalog ? { modelsStore: catalog } : {}),\n });\n for (const provider of providers) models.setProvider(abortableBedrock(provider));\n return models;\n}\n\nconst SHORT: Record<string, string> = { [BEDROCK]: 'Bedrock', [ADOBE]: 'Adobe' };\n\nfunction labels(\n models: MutableModels,\n providers: Provider[],\n stored: ReadonlySet<string>\n): Record<string, string> {\n return Object.fromEntries(\n providers\n .filter((provider) => !stored.has(provider.id))\n .flatMap((provider) =>\n models\n .getModels(provider.id)\n .map((model) => [\n `${provider.id}/${model.id}`,\n `${model.name} on ${SHORT[provider.id] ?? provider.name ?? provider.id}`,\n ])\n )\n );\n}\n\nfunction choices(\n models: MutableModels,\n providers: Provider[],\n stored: ReadonlySet<string>\n): ModelChoice[] {\n return providers\n .filter((provider) => stored.has(provider.id))\n .flatMap((provider) =>\n models.getModels(provider.id).map((model) => ({\n id: `${provider.id}/${model.id}`,\n label: model.name,\n provider: provider.name ?? provider.id,\n kind: 'chat' as const,\n reasoning: Boolean(model.reasoning),\n images: model.input.includes('image'),\n contextWindow: model.contextWindow,\n }))\n );\n}\n\nfunction listed(\n records: Pick<VaultRecords, 'model'>,\n fields: Pick<ProviderFields, 'get' | 'added'>\n): (providerId: string) => boolean {\n const added = new Set(fields.added() ?? ADDED_FIRST);\n return (providerId) =>\n !LISTINGS.has(providerId) ||\n added.has(providerId) ||\n records.model(providerId) !== undefined ||\n fields.get(providerId) !== undefined;\n}\n\nfunction filled(\n fields: readonly AccountField[],\n stored: Readonly<Record<string, string>> | undefined\n): AccountField[] {\n return fields.map((field) => {\n const value = stored?.[field.name]?.trim() || field.value;\n const options =\n field.options && value && !field.options.some((option) => option.value === value)\n ? [{ value, label: value }, ...field.options]\n : field.options;\n return { ...field, ...(options ? { options: [...options] } : {}), ...(value ? { value } : {}) };\n });\n}\n\nfunction accounts(\n records: Pick<VaultRecords, 'model'>,\n providers: Provider[],\n given: Pick<ProviderFields, 'ready' | 'get'>,\n blocked: (providerId: string) => boolean\n): AccountState[] {\n return providers.map((provider) => {\n const record = given.ready(provider.id) ? records.model(provider.id) : undefined;\n const fields = ACCOUNT_FIELDS[provider.id];\n const listing = LISTINGS.get(provider.id);\n return {\n id: provider.id,\n provider: provider.name ?? provider.id,\n identity: record ? identityOf(provider.id, record) : '',\n status: !record ? 'disconnected' : record.state === 'expired' ? 'expired' : 'connected',\n auth: oauth(provider.id) ? 'oauth' : 'api-key',\n ...(DEVICE_SIGN_INS.has(provider.id) && listing?.keyUrl\n ? { secret: 'api-key' as const }\n : {}),\n needs: listing?.corsFree ? 'cors-free-transport' : null,\n ...(blocked(provider.id) ? { blocked: 'cors-free-transport' as const } : {}),\n group: 'providers',\n store: 'vault',\n ...(fields ? { fields: filled(fields, given.get(provider.id)) } : {}),\n ...about(listing),\n };\n });\n}\n\nfunction identityOf(providerId: string, record: { expiresAt?: number }): string {\n if (signIn.has(providerId)) return 'Adobe ID';\n return DEVICE_SIGN_INS.has(providerId) && record.expiresAt !== undefined\n ? 'Signed in'\n : 'API key';\n}\n\nfunction about(listing: Listing | undefined) {\n if (!listing) return {};\n return {\n description: listing.description,\n vaultName: listing.vaultName,\n ...(listing.keyUrl ? { keyUrl: listing.keyUrl } : {}),\n };\n}\n\nfunction offered(\n providers: Provider[],\n blocked: (providerId: string) => boolean\n): ProviderOption[] {\n return providers\n .flatMap((provider): ProviderOption[] => {\n const listing = LISTINGS.get(provider.id);\n if (!listing) return [];\n const fields = ACCOUNT_FIELDS[provider.id];\n return [\n {\n id: provider.id,\n name: provider.name,\n description: listing.description,\n auth: listing.auth,\n vaultName: listing.vaultName,\n ...(fields ? { fields: filled(fields, undefined) } : {}),\n ...(listing.keyUrl ? { keyUrl: listing.keyUrl } : {}),\n ...(listing.corsFree ? { needs: 'cors-free-transport' as const } : {}),\n ...(blocked(provider.id) ? { blocked: 'cors-free-transport' as const } : {}),\n },\n ];\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport interface ProviderFields {\n get(providerId: string): Readonly<Record<string, string>> | undefined;\n env(providerId: string): Readonly<Record<string, string>> | undefined;\n set(providerId: string, fields: Record<string, string> | undefined): Promise<void>;\n ready(providerId: string): boolean;\n added(): readonly string[] | undefined;\n add(providerId: string): Promise<void>;\n forget(providerId: string): Promise<void>;\n}\n\nconst ADDED = 'providers';\n\nexport async function providerFields(\n store: PlainStore,\n providers: readonly Provider[]\n): Promise<ProviderFields> {\n const known = new Map<string, Record<string, string>>();\n for (const provider of providers) {\n const saved = (await store.get(`model:${provider.id}`)) as Record<string, string> | undefined;\n if (saved && typeof saved === 'object') known.set(provider.id, saved);\n }\n const saved = await store.get(ADDED);\n let added = Array.isArray(saved)\n ? saved.filter((id): id is string => typeof id === 'string')\n : undefined;\n const keep = async (next: string[]) => {\n added = next;\n await store.set(ADDED, next);\n };\n return {\n ready: (providerId) =>\n specs(providerId).every((spec) => {\n const value = known.get(providerId)?.[spec.name];\n if (value === undefined) return !spec.required;\n return typeof spec.env(value.trim()) !== 'string';\n }),\n added: () => added,\n async add(providerId) {\n const now = added ?? ADDED_FIRST;\n if (added && now.includes(providerId)) return;\n await keep([...new Set([...now, providerId])]);\n },\n async forget(providerId) {\n await keep((added ?? ADDED_FIRST).filter((id) => id !== providerId));\n known.delete(providerId);\n await store.set(`model:${providerId}`, undefined);\n },\n get: (providerId) => known.get(providerId),\n env(providerId) {\n const fields = known.get(providerId);\n if (!fields) return undefined;\n return Object.assign(\n {},\n ...specs(providerId).flatMap((spec) => {\n const value = fields[spec.name];\n const env = value === undefined ? '' : spec.env(value.trim());\n return typeof env === 'string' ? [] : [env];\n })\n );\n },\n async set(providerId, fields) {\n const kept: Record<string, string> = {};\n for (const spec of specs(providerId)) {\n const given = fields?.[spec.name];\n const value = typeof given === 'string' ? given.trim() : '';\n const stored = known.get(providerId)?.[spec.name];\n if (!value && spec.required && fields && stored) kept[spec.name] = stored;\n else if (!value && spec.required && fields)\n throw new Error(`${spec.label} can\u2019t be empty.`);\n else if (value) {\n const problem = spec.env(value);\n if (typeof problem === 'string') throw new Error(problem);\n kept[spec.name] = value;\n }\n }\n const next = Object.keys(kept).length ? kept : undefined;\n if (next) known.set(providerId, next);\n else known.delete(providerId);\n await store.set(`model:${providerId}`, next);\n },\n };\n}\n\nexport type UsageReader = (token: string) => Promise<Budget | null>;\n\nasync function budget(records: Pick<VaultRecords, 'model'>, usage: UsageReader) {\n const key = records.model(ADOBE)?.placeholder;\n const found = key ? await usage(key).catch(() => null) : null;\n return found ? { provider: ADOBE, ...found } : null;\n}\n\nexport interface SettingsSources {\n records: VaultRecords;\n fields: ProviderFields;\n}\n\nfunction blockedBy(reach: Reach | undefined): (providerId: string) => boolean {\n return (providerId) => Boolean(LISTINGS.get(providerId)?.corsFree) && reach?.free() === false;\n}\n\nexport async function createAgentSettings(\n models: MutableModels,\n sources: SettingsSources,\n providers = sliccProviders(),\n options: {\n usage?: UsageReader;\n every?: number;\n mcp?: McpAccounts;\n moved?: KeysMoved;\n reach?: Reach;\n vault?: Pick<Vault, 'connected' | 'needed' | 'grantProvider'>;\n flows?: DeviceFlows;\n } = {}\n): Promise<AgentSettings> {\n const { mcp, moved, reach, vault } = options;\n const blocked = blockedBy(reach);\n const flows =\n options.flows ??\n deviceFlows((grant) => (vault as Pick<Vault, 'grantProvider'>).grantProvider(grant));\n const device = (providerId: string, context: Context) => {\n const provider = providers.find((candidate) => candidate.id === providerId);\n const name = LISTINGS.get(providerId)?.vaultName;\n if (!provider || !name) return Promise.resolve(null);\n if (!vault || absent(vault)) return Promise.reject(new Error(DEVICE_NEEDS_VAULT));\n if (blocked(providerId) || (SIGN_IN_CORS_FREE.has(providerId) && reach?.free() === false))\n return Promise.reject(new Error(`${provider.name} sign-in needs the cors-free transport.`));\n return fields\n .add(providerId)\n .then(() => refresh(context))\n .then(() => flows.start(provider, name, context));\n };\n const { records, fields } = sources;\n const routed = (providerId: string) => (providerId.startsWith(MCP_ACCOUNT) ? mcp : undefined);\n const adobe = providers.find((provider) => provider.id === ADOBE);\n const endpoint = adobe?.baseUrl ?? ADOBE_PROXY;\n const identity = (adobe?.headers as Record<string, string> | undefined) ?? adobeIdentity();\n const usage = options.usage ?? ((token: string) => adobeUsage(token, { endpoint, identity }));\n const snapshot = async (): Promise<SettingsState> => {\n const stored = new Set(\n providers\n .filter((provider) => records.model(provider.id) && fields.ready(provider.id))\n .map((provider) => provider.id)\n );\n const show = listed(records, fields);\n const shown = providers.filter((provider) => show(provider.id));\n const open = (list: Provider[]) => list.filter((provider) => !blocked(provider.id));\n return {\n models: choices(models, open(providers), stored),\n labels: labels(models, open(shown), stored),\n accounts: [...accounts(records, shown, fields, blocked), ...((await mcp?.accounts()) ?? [])],\n providers: offered(providers, blocked),\n budget: await budget(records, usage),\n ...(moved?.state.value?.length\n ? { moved: moved.state.value.map((name) => ({ ...name })) }\n : {}),\n };\n };\n const state = replicatedState<SettingsState>(await snapshot());\n let latest = Promise.resolve();\n const refresh = (context: Context) => {\n const next = latest.then(async () => state.replace(context, await snapshot()));\n latest = next.catch(() => undefined);\n return next;\n };\n const signedIn = providers\n .filter((provider) => signIn.has(provider.id))\n .map((provider) => provider.id);\n const discover = (ids: string[]) =>\n models.refresh({ providers: ids }).then(\n () => undefined,\n () => undefined\n );\n if (signedIn.length) {\n const cycle = () =>\n void discover(signedIn)\n .then(() => refresh(BACKGROUND_CONTEXT))\n .catch(() => undefined);\n cycle();\n const timer: unknown = setInterval(cycle, options.every ?? BUDGET_EVERY);\n (timer as { unref?: () => void }).unref?.();\n }\n mcp?.onChange(() => void refresh(BACKGROUND_CONTEXT).catch(() => undefined));\n reach?.onChange(() => void refresh(BACKGROUND_CONTEXT).catch(() => undefined));\n moved?.state.subscribe((_value, context) => void refresh(context).catch(() => undefined));\n const held = () => signedIn.filter((id) => records.model(id)).join(' ');\n let seen = held();\n records.state.subscribe(() => {\n const now = held();\n const added = now !== seen;\n seen = now;\n const discovered = added ? discover(signedIn) : Promise.resolve();\n void discovered.then(() => refresh(BACKGROUND_CONTEXT)).catch(() => undefined);\n });\n const reread = (context: Context) => records.refresh(context).catch(() => undefined);\n return {\n state,\n async connect(providerId, secret, given, context) {\n const server = routed(providerId);\n if (server) {\n await server.connect(providerId, secret);\n await refresh(context);\n return;\n }\n if (secret !== null)\n throw new Error(signIn.has(providerId) ? SIGN_IN_NEEDS_VAULT : KEY_NEEDS_VAULT);\n if (flows.has(providerId)) await flows.finish(providerId, context);\n if (given !== null) await fields.set(providerId, given);\n if (LISTINGS.has(providerId)) await fields.add(providerId);\n records.reconnected(providerId);\n await reread(context);\n if (signIn.has(providerId)) await discover([providerId]);\n await refresh(context);\n },\n async signIn(providerId, context) {\n const server = routed(providerId);\n if (server) return server.signIn(providerId);\n if (DEVICE_SIGN_INS.has(providerId)) return device(providerId, context);\n if (providerId !== ADOBE) return null;\n const { clientId, scopes, imsEnvironment } = await adobeConfig(\n endpoint,\n (input, init) => globalThis.fetch(input, init),\n identity\n );\n return { clientId, scopes, imsEnvironment: imsEnvironment || 'prod' };\n },\n async dismissMoved(context) {\n await moved?.dismiss(context);\n await refresh(context);\n },\n async disconnect(providerId, context) {\n flows.stop(providerId);\n const server = routed(providerId);\n if (server) await server.disconnect(providerId);\n else if (LISTINGS.has(providerId)) await fields.add(providerId);\n else await fields.set(providerId, undefined);\n await reread(context);\n await refresh(context);\n },\n async serverUrl(providerId) {\n return (await routed(providerId)?.serverUrl(providerId)) ?? null;\n },\n async remove(providerId, context) {\n flows.stop(providerId);\n const server = routed(providerId);\n if (server) await server.disconnect(providerId);\n else await fields.forget(providerId);\n await reread(context);\n await refresh(context);\n },\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["BEDROCK", "preferredModel", "saved"]
|
|
4
|
+
"sourcesContent": ["import { type Context, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { CredentialStore, ModelsStore, Provider } from '@earendil-works/pi-ai';\nimport { createModels, type MutableModels } from '@earendil-works/pi-ai/models';\nimport { amazonBedrockProvider } from '@earendil-works/pi-ai/providers/amazon-bedrock';\nimport {\n ADOBE,\n ADOBE_PROXY,\n adobeConfig,\n adobeIdentity,\n adobeProvider,\n adobeUsage,\n type Budget,\n} from './adobe.ts';\nimport { abortableBedrock } from './bedrock.ts';\nimport { codexProvider } from './codex.ts';\nimport { type DeviceFlows, deviceFlows } from './device.ts';\nimport type { McpAccounts } from './mcp/index.ts';\nimport { MCP_ACCOUNT } from './mcp/label.ts';\nimport type { Reach } from './net.ts';\nimport { BEDROCK, preferredModel } from './preferred.ts';\nimport {\n ADDED_FIRST,\n DEFAULT_REGION,\n type FieldSpec,\n KEY_PROVIDERS,\n LISTINGS,\n type Listing,\n} from './providers.ts';\nimport { absent } from './secrets/fetch.ts';\nimport type { KeysMoved } from './secrets/legacy.ts';\nimport type { VaultRecords } from './secrets/records.ts';\nimport type { PlainStore } from './secrets/store.ts';\nimport type { Vault } from './secrets/vault.ts';\nimport type {\n AccountField,\n AccountState,\n AgentSettings,\n BudgetState,\n ModelChoice,\n ProviderOption,\n SettingsState,\n} from './services.ts';\nimport { DEVICE_NEEDS_VAULT, DEVICE_SIGN_INS } from './sign-ins.ts';\nimport { XAI, xaiUsage } from './supergrok.ts';\n\nexport { BEDROCK, PREFERRED_MODELS, preferredModel } from './preferred.ts';\n\nexport const DEFAULT_MODEL = { provider: BEDROCK, modelId: 'us.anthropic.claude-sonnet-5-5' };\nexport const DEFAULT_REGIONS: Readonly<Record<string, string>> = { [BEDROCK]: DEFAULT_REGION };\n\nconst specs = (providerId: string): readonly FieldSpec[] => LISTINGS.get(providerId)?.fields ?? [];\n\nexport const ACCOUNT_FIELDS: Readonly<Record<string, readonly AccountField[]>> = Object.fromEntries(\n [...LISTINGS.keys()]\n .filter((id) => specs(id).length)\n .map((id) => [id, specs(id).map(({ env: _env, ...field }) => field)])\n);\nexport const SIGN_IN_NEEDS_VAULT = \"Adobe sign-in needs seven's vault: update seven\";\nexport const KEY_NEEDS_VAULT = \"API keys are kept in seven's vault: update seven\";\n\nexport async function resolveDefaultModel(\n credentials: CredentialStore,\n providers: Provider[],\n models: MutableModels\n): Promise<{ provider: string; modelId: string }> {\n const stored = new Set((await credentials.list()).map((info) => info.providerId));\n for (const provider of providers) {\n if (!stored.has(provider.id)) continue;\n if (!models.getModels(provider.id).length && provider.refreshModels) {\n await models.refresh({ providers: [provider.id] }).catch(() => undefined);\n }\n const chosen = preferredModel(provider.id, models.getModels(provider.id));\n if (chosen) return { provider: provider.id, modelId: chosen.id };\n }\n return DEFAULT_MODEL;\n}\n\nconst signIn = new Set([ADOBE]);\nconst oauth = (providerId: string) => signIn.has(providerId) || DEVICE_SIGN_INS.has(providerId);\nconst SIGN_IN_CORS_FREE = new Set(['xai']);\nconst BUDGET_EVERY = 5 * 60 * 1000;\n\nexport function sliccProviders(version?: string): Provider[] {\n return [\n amazonBedrockProvider() as Provider,\n adobeProvider({ version }),\n ...KEY_PROVIDERS.map((entry) => entry.make()),\n codexProvider(),\n ];\n}\n\nexport function withDefaultRegions(credentials: CredentialStore): CredentialStore {\n return {\n async read(providerId, options) {\n const credential = await credentials.read(providerId, options);\n const region = DEFAULT_REGIONS[providerId];\n if (credential?.type !== 'api_key' || !region || credential.env?.AWS_REGION) {\n return credential;\n }\n return { ...credential, env: { ...credential.env, AWS_REGION: region } };\n },\n list: (options) => credentials.list(options),\n modify: (providerId, fn, options) => credentials.modify(providerId, fn, options),\n delete: (providerId, options) => credentials.delete(providerId, options),\n };\n}\n\nexport function catalogStore(store: PlainStore): ModelsStore {\n return {\n read: async (providerId) =>\n ((await store.get(providerId)) as Awaited<ReturnType<ModelsStore['read']>>) ?? undefined,\n write: (providerId, entry) => store.set(providerId, entry),\n delete: (providerId) => store.set(providerId, undefined),\n };\n}\n\nexport function createSliccModels(\n credentials: CredentialStore,\n providers = sliccProviders(),\n catalog?: ModelsStore\n): MutableModels {\n const models = createModels({\n credentials: withDefaultRegions(credentials),\n ...(catalog ? { modelsStore: catalog } : {}),\n });\n for (const provider of providers) models.setProvider(abortableBedrock(provider));\n return models;\n}\n\nconst SHORT: Record<string, string> = { [BEDROCK]: 'Bedrock', [ADOBE]: 'Adobe' };\n\nfunction labels(\n models: MutableModels,\n providers: Provider[],\n stored: ReadonlySet<string>\n): Record<string, string> {\n return Object.fromEntries(\n providers\n .filter((provider) => !stored.has(provider.id))\n .flatMap((provider) =>\n models\n .getModels(provider.id)\n .map((model) => [\n `${provider.id}/${model.id}`,\n `${model.name} on ${SHORT[provider.id] ?? provider.name ?? provider.id}`,\n ])\n )\n );\n}\n\nfunction choices(\n models: MutableModels,\n providers: Provider[],\n stored: ReadonlySet<string>\n): ModelChoice[] {\n return providers\n .filter((provider) => stored.has(provider.id))\n .flatMap((provider) =>\n models.getModels(provider.id).map((model) => ({\n id: `${provider.id}/${model.id}`,\n label: model.name,\n provider: provider.name ?? provider.id,\n kind: 'chat' as const,\n reasoning: Boolean(model.reasoning),\n images: model.input.includes('image'),\n contextWindow: model.contextWindow,\n }))\n );\n}\n\nfunction listed(\n records: Pick<VaultRecords, 'model'>,\n fields: Pick<ProviderFields, 'get' | 'added'>\n): (providerId: string) => boolean {\n const added = new Set(fields.added() ?? ADDED_FIRST);\n return (providerId) =>\n !LISTINGS.has(providerId) ||\n added.has(providerId) ||\n records.model(providerId) !== undefined ||\n fields.get(providerId) !== undefined;\n}\n\nfunction filled(\n fields: readonly AccountField[],\n stored: Readonly<Record<string, string>> | undefined\n): AccountField[] {\n return fields.map((field) => {\n const value = stored?.[field.name]?.trim() || field.value;\n const options =\n field.options && value && !field.options.some((option) => option.value === value)\n ? [{ value, label: value }, ...field.options]\n : field.options;\n return { ...field, ...(options ? { options: [...options] } : {}), ...(value ? { value } : {}) };\n });\n}\n\nfunction accounts(\n records: Pick<VaultRecords, 'model'>,\n providers: Provider[],\n given: Pick<ProviderFields, 'ready' | 'get'>,\n blocked: (providerId: string) => boolean\n): AccountState[] {\n return providers.map((provider) => {\n const record = given.ready(provider.id) ? records.model(provider.id) : undefined;\n const fields = ACCOUNT_FIELDS[provider.id];\n const listing = LISTINGS.get(provider.id);\n return {\n id: provider.id,\n provider: provider.name ?? provider.id,\n identity: record ? identityOf(provider.id, record) : '',\n status: !record ? 'disconnected' : record.state === 'expired' ? 'expired' : 'connected',\n auth: oauth(provider.id) ? 'oauth' : 'api-key',\n ...(DEVICE_SIGN_INS.has(provider.id) && listing?.keyUrl\n ? { secret: 'api-key' as const }\n : {}),\n needs: listing?.corsFree ? 'cors-free-transport' : null,\n ...(blocked(provider.id) ? { blocked: 'cors-free-transport' as const } : {}),\n group: 'providers',\n store: 'vault',\n ...(fields ? { fields: filled(fields, given.get(provider.id)) } : {}),\n ...about(listing),\n };\n });\n}\n\nfunction identityOf(providerId: string, record: { expiresAt?: number }): string {\n if (signIn.has(providerId)) return 'Adobe ID';\n return DEVICE_SIGN_INS.has(providerId) && record.expiresAt !== undefined\n ? 'Signed in'\n : 'API key';\n}\n\nfunction about(listing: Listing | undefined) {\n if (!listing) return {};\n return {\n description: listing.description,\n vaultName: listing.vaultName,\n ...(listing.keyUrl ? { keyUrl: listing.keyUrl } : {}),\n };\n}\n\nfunction offered(\n providers: Provider[],\n blocked: (providerId: string) => boolean\n): ProviderOption[] {\n return providers\n .flatMap((provider): ProviderOption[] => {\n const listing = LISTINGS.get(provider.id);\n if (!listing) return [];\n const fields = ACCOUNT_FIELDS[provider.id];\n return [\n {\n id: provider.id,\n name: provider.name,\n description: listing.description,\n auth: listing.auth,\n vaultName: listing.vaultName,\n ...(fields ? { fields: filled(fields, undefined) } : {}),\n ...(listing.keyUrl ? { keyUrl: listing.keyUrl } : {}),\n ...(listing.corsFree ? { needs: 'cors-free-transport' as const } : {}),\n ...(blocked(provider.id) ? { blocked: 'cors-free-transport' as const } : {}),\n },\n ];\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport interface ProviderFields {\n get(providerId: string): Readonly<Record<string, string>> | undefined;\n env(providerId: string): Readonly<Record<string, string>> | undefined;\n set(providerId: string, fields: Record<string, string> | undefined): Promise<void>;\n ready(providerId: string): boolean;\n added(): readonly string[] | undefined;\n add(providerId: string): Promise<void>;\n forget(providerId: string): Promise<void>;\n}\n\nconst ADDED = 'providers';\n\nexport async function providerFields(\n store: PlainStore,\n providers: readonly Provider[]\n): Promise<ProviderFields> {\n const known = new Map<string, Record<string, string>>();\n for (const provider of providers) {\n const saved = (await store.get(`model:${provider.id}`)) as Record<string, string> | undefined;\n if (saved && typeof saved === 'object') known.set(provider.id, saved);\n }\n const saved = await store.get(ADDED);\n let added = Array.isArray(saved)\n ? saved.filter((id): id is string => typeof id === 'string')\n : undefined;\n const keep = async (next: string[]) => {\n added = next;\n await store.set(ADDED, next);\n };\n return {\n ready: (providerId) =>\n specs(providerId).every((spec) => {\n const value = known.get(providerId)?.[spec.name];\n if (value === undefined) return !spec.required;\n return typeof spec.env(value.trim()) !== 'string';\n }),\n added: () => added,\n async add(providerId) {\n const now = added ?? ADDED_FIRST;\n if (added && now.includes(providerId)) return;\n await keep([...new Set([...now, providerId])]);\n },\n async forget(providerId) {\n await keep((added ?? ADDED_FIRST).filter((id) => id !== providerId));\n known.delete(providerId);\n await store.set(`model:${providerId}`, undefined);\n },\n get: (providerId) => known.get(providerId),\n env(providerId) {\n const fields = known.get(providerId);\n if (!fields) return undefined;\n return Object.assign(\n {},\n ...specs(providerId).flatMap((spec) => {\n const value = fields[spec.name];\n const env = value === undefined ? '' : spec.env(value.trim());\n return typeof env === 'string' ? [] : [env];\n })\n );\n },\n async set(providerId, fields) {\n const kept: Record<string, string> = {};\n for (const spec of specs(providerId)) {\n const given = fields?.[spec.name];\n const value = typeof given === 'string' ? given.trim() : '';\n const stored = known.get(providerId)?.[spec.name];\n if (!value && spec.required && fields && stored) kept[spec.name] = stored;\n else if (!value && spec.required && fields)\n throw new Error(`${spec.label} can\u2019t be empty.`);\n else if (value) {\n const problem = spec.env(value);\n if (typeof problem === 'string') throw new Error(problem);\n kept[spec.name] = value;\n }\n }\n const next = Object.keys(kept).length ? kept : undefined;\n if (next) known.set(providerId, next);\n else known.delete(providerId);\n await store.set(`model:${providerId}`, next);\n },\n };\n}\n\nexport type UsageReader = (token: string) => Promise<Budget | null>;\n\nasync function adobeBudget(records: Pick<VaultRecords, 'model'>, usage: UsageReader) {\n const key = records.model(ADOBE)?.placeholder;\n const found = key ? await usage(key).catch(() => null) : null;\n return found ? { provider: ADOBE, ...found } : null;\n}\n\nexport function grokBudgets(\n records: Pick<VaultRecords, 'model'>,\n usage: UsageReader,\n { reach, every, now }: { reach?: Reach; every: number; now: () => number }\n): () => Promise<BudgetState | null> {\n let kept: { key: string; at: number; found: Promise<Budget | null> } | undefined;\n return async () => {\n const record = records.model(XAI);\n if (!record || record.expiresAt === undefined || record.state === 'expired') return null;\n if (reach?.free() !== true) return null;\n const key = `${record.placeholder} ${record.expiresAt}`;\n const at = now();\n if (!kept || kept.key !== key || at - kept.at >= every)\n kept = { key, at, found: usage(record.placeholder).catch(() => null) };\n const found = await kept.found;\n return found ? { provider: XAI, ...found } : null;\n };\n}\n\nexport interface SettingsSources {\n records: VaultRecords;\n fields: ProviderFields;\n}\n\nfunction blockedBy(reach: Reach | undefined): (providerId: string) => boolean {\n return (providerId) => Boolean(LISTINGS.get(providerId)?.corsFree) && reach?.free() === false;\n}\n\nexport async function createAgentSettings(\n models: MutableModels,\n sources: SettingsSources,\n providers = sliccProviders(),\n options: {\n usage?: UsageReader;\n every?: number;\n mcp?: McpAccounts;\n moved?: KeysMoved;\n reach?: Reach;\n vault?: Pick<Vault, 'connected' | 'needed' | 'grantProvider'>;\n flows?: DeviceFlows;\n grok?: UsageReader;\n now?: () => number;\n } = {}\n): Promise<AgentSettings> {\n const { mcp, moved, reach, vault } = options;\n const blocked = blockedBy(reach);\n const flows =\n options.flows ??\n deviceFlows((grant) => (vault as Pick<Vault, 'grantProvider'>).grantProvider(grant));\n const device = (providerId: string, context: Context) => {\n const provider = providers.find((candidate) => candidate.id === providerId);\n const name = LISTINGS.get(providerId)?.vaultName;\n if (!provider || !name) return Promise.resolve(null);\n if (!vault || absent(vault)) return Promise.reject(new Error(DEVICE_NEEDS_VAULT));\n if (blocked(providerId) || (SIGN_IN_CORS_FREE.has(providerId) && reach?.free() === false))\n return Promise.reject(new Error(`${provider.name} sign-in needs the cors-free transport.`));\n return fields\n .add(providerId)\n .then(() => refresh(context))\n .then(() => flows.start(provider, name, context));\n };\n const { records, fields } = sources;\n const routed = (providerId: string) => (providerId.startsWith(MCP_ACCOUNT) ? mcp : undefined);\n const adobe = providers.find((provider) => provider.id === ADOBE);\n const endpoint = adobe?.baseUrl ?? ADOBE_PROXY;\n const identity = (adobe?.headers as Record<string, string> | undefined) ?? adobeIdentity();\n const usage = options.usage ?? ((token: string) => adobeUsage(token, { endpoint, identity }));\n const every = options.every ?? BUDGET_EVERY;\n const grok = grokBudgets(records, options.grok ?? ((token: string) => xaiUsage(token)), {\n reach,\n every,\n now: options.now ?? Date.now,\n });\n const polled = providers.some((provider) => provider.id === XAI);\n const budgets = async () =>\n (await Promise.all([adobeBudget(records, usage), polled ? grok() : null])).filter(\n (found): found is BudgetState => found !== null\n );\n const snapshot = async (): Promise<SettingsState> => {\n const stored = new Set(\n providers\n .filter((provider) => records.model(provider.id) && fields.ready(provider.id))\n .map((provider) => provider.id)\n );\n const show = listed(records, fields);\n const shown = providers.filter((provider) => show(provider.id));\n const open = (list: Provider[]) => list.filter((provider) => !blocked(provider.id));\n const held = await budgets();\n return {\n models: choices(models, open(providers), stored),\n labels: labels(models, open(shown), stored),\n accounts: [...accounts(records, shown, fields, blocked), ...((await mcp?.accounts()) ?? [])],\n providers: offered(providers, blocked),\n budget: held[0] ?? null,\n budgets: held,\n ...(moved?.state.value?.length\n ? { moved: moved.state.value.map((name) => ({ ...name })) }\n : {}),\n };\n };\n const state = replicatedState<SettingsState>(await snapshot());\n let latest = Promise.resolve();\n const refresh = (context: Context) => {\n const next = latest.then(async () => state.replace(context, await snapshot()));\n latest = next.catch(() => undefined);\n return next;\n };\n const signedIn = providers\n .filter((provider) => signIn.has(provider.id))\n .map((provider) => provider.id);\n const discover = (ids: string[]) =>\n models.refresh({ providers: ids }).then(\n () => undefined,\n () => undefined\n );\n if (signedIn.length || polled) {\n const cycle = () =>\n void (signedIn.length ? discover(signedIn) : Promise.resolve())\n .then(() => refresh(BACKGROUND_CONTEXT))\n .catch(() => undefined);\n cycle();\n const timer: unknown = setInterval(cycle, every);\n (timer as { unref?: () => void }).unref?.();\n }\n mcp?.onChange(() => void refresh(BACKGROUND_CONTEXT).catch(() => undefined));\n reach?.onChange(() => void refresh(BACKGROUND_CONTEXT).catch(() => undefined));\n moved?.state.subscribe((_value, context) => void refresh(context).catch(() => undefined));\n const held = () => signedIn.filter((id) => records.model(id)).join(' ');\n let seen = held();\n records.state.subscribe(() => {\n const now = held();\n const added = now !== seen;\n seen = now;\n const discovered = added ? discover(signedIn) : Promise.resolve();\n void discovered.then(() => refresh(BACKGROUND_CONTEXT)).catch(() => undefined);\n });\n const reread = (context: Context) => records.refresh(context).catch(() => undefined);\n return {\n state,\n async connect(providerId, secret, given, context) {\n const server = routed(providerId);\n if (server) {\n await server.connect(providerId, secret);\n await refresh(context);\n return;\n }\n if (secret !== null)\n throw new Error(signIn.has(providerId) ? SIGN_IN_NEEDS_VAULT : KEY_NEEDS_VAULT);\n if (flows.has(providerId)) await flows.finish(providerId, context);\n if (given !== null) await fields.set(providerId, given);\n if (LISTINGS.has(providerId)) await fields.add(providerId);\n records.reconnected(providerId);\n await reread(context);\n if (signIn.has(providerId)) await discover([providerId]);\n await refresh(context);\n },\n async signIn(providerId, context) {\n const server = routed(providerId);\n if (server) return server.signIn(providerId);\n if (DEVICE_SIGN_INS.has(providerId)) return device(providerId, context);\n if (providerId !== ADOBE) return null;\n const { clientId, scopes, imsEnvironment } = await adobeConfig(\n endpoint,\n (input, init) => globalThis.fetch(input, init),\n identity\n );\n return { clientId, scopes, imsEnvironment: imsEnvironment || 'prod' };\n },\n async dismissMoved(context) {\n await moved?.dismiss(context);\n await refresh(context);\n },\n async disconnect(providerId, context) {\n flows.stop(providerId);\n const server = routed(providerId);\n if (server) await server.disconnect(providerId);\n else if (LISTINGS.has(providerId)) await fields.add(providerId);\n else await fields.set(providerId, undefined);\n await reread(context);\n await refresh(context);\n },\n async serverUrl(providerId) {\n return (await routed(providerId)?.serverUrl(providerId)) ?? null;\n },\n async remove(providerId, context) {\n flows.stop(providerId);\n const server = routed(providerId);\n if (server) await server.disconnect(providerId);\n else await fields.forget(providerId);\n await reread(context);\n await refresh(context);\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["BEDROCK", "preferredModel", "saved", "held"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const BUDGET_NAMES = { adobe: "Adobe", xai: "SuperGrok" };
|
|
2
|
+
const budgetName = (provider) => BUDGET_NAMES[provider] ?? provider;
|
|
3
|
+
function selectedBudget(state, provider) {
|
|
4
|
+
const budgets = state?.budgets ?? (state?.budget ? [state.budget] : []);
|
|
5
|
+
return budgets.find((budget) => budget.provider === provider) ?? budgets[0] ?? null;
|
|
6
|
+
}
|
|
7
|
+
function agentSelection(agent) {
|
|
8
|
+
return {
|
|
9
|
+
provider() {
|
|
10
|
+
const rows = agent.list();
|
|
11
|
+
const row = rows.find((entry) => entry.id === agent.active()) ?? rows[0];
|
|
12
|
+
const model = row?.model ?? "";
|
|
13
|
+
const at = model.indexOf("/");
|
|
14
|
+
return at > 0 ? model.slice(0, at) : void 0;
|
|
15
|
+
},
|
|
16
|
+
onChange(listener) {
|
|
17
|
+
const offs = [agent.on("agents", listener), agent.on("active", listener)];
|
|
18
|
+
return () => {
|
|
19
|
+
for (const off of offs) off();
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
BUDGET_NAMES,
|
|
26
|
+
agentSelection,
|
|
27
|
+
budgetName,
|
|
28
|
+
selectedBudget
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=budget.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/spectrum/budget.ts"],
|
|
4
|
+
"sourcesContent": ["import type { BudgetState, SettingsState } from '../services.ts';\n\nexport interface Selected {\n provider(): string | undefined;\n onChange(listener: () => void): () => void;\n}\n\nexport const BUDGET_NAMES: Readonly<Record<string, string>> = { adobe: 'Adobe', xai: 'SuperGrok' };\n\nexport const budgetName = (provider: string): string => BUDGET_NAMES[provider] ?? provider;\n\nexport function selectedBudget(\n state: SettingsState | undefined,\n provider: string | undefined\n): BudgetState | null {\n const budgets = state?.budgets ?? (state?.budget ? [state.budget] : []);\n return budgets.find((budget) => budget.provider === provider) ?? budgets[0] ?? null;\n}\n\nexport function agentSelection(agent: {\n active(): string;\n list(): readonly { id: string; model: string }[];\n on(type: 'agents' | 'active', listener: () => void): () => void;\n}): Selected {\n return {\n provider() {\n const rows = agent.list();\n const row = rows.find((entry) => entry.id === agent.active()) ?? rows[0];\n const model = row?.model ?? '';\n const at = model.indexOf('/');\n return at > 0 ? model.slice(0, at) : undefined;\n },\n onChange(listener) {\n const offs = [agent.on('agents', listener), agent.on('active', listener)];\n return () => {\n for (const off of offs) off();\n };\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "AAOO,MAAM,eAAiD,EAAE,OAAO,SAAS,KAAK,YAAY;AAE1F,MAAM,aAAa,CAAC,aAA6B,aAAa,QAAQ,KAAK;AAE3E,SAAS,eACd,OACA,UACoB;AACpB,QAAM,UAAU,OAAO,YAAY,OAAO,SAAS,CAAC,MAAM,MAAM,IAAI,CAAC;AACrE,SAAO,QAAQ,KAAK,CAAC,WAAW,OAAO,aAAa,QAAQ,KAAK,QAAQ,CAAC,KAAK;AACjF;AAEO,SAAS,eAAe,OAIlB;AACX,SAAO;AAAA,IACL,WAAW;AACT,YAAM,OAAO,MAAM,KAAK;AACxB,YAAM,MAAM,KAAK,KAAK,CAAC,UAAU,MAAM,OAAO,MAAM,OAAO,CAAC,KAAK,KAAK,CAAC;AACvE,YAAM,QAAQ,KAAK,SAAS;AAC5B,YAAM,KAAK,MAAM,QAAQ,GAAG;AAC5B,aAAO,KAAK,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI;AAAA,IACvC;AAAA,IACA,SAAS,UAAU;AACjB,YAAM,OAAO,CAAC,MAAM,GAAG,UAAU,QAAQ,GAAG,MAAM,GAAG,UAAU,QAAQ,CAAC;AACxE,aAAO,MAAM;AACX,mBAAW,OAAO,KAAM,KAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/spectrum/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AgentAdapter } from "./agent-port.js";
|
|
2
2
|
import { ApprovalsAdapter } from "./approvals-port.js";
|
|
3
|
+
import { agentSelection } from "./budget.js";
|
|
3
4
|
import { ChangesAdapter } from "./changes-port.js";
|
|
4
5
|
import { GuestAdapter } from "./guest-port.js";
|
|
5
6
|
import { MemoryAdapter } from "./memory-port.js";
|
|
@@ -57,6 +58,7 @@ function seatOf(connection) {
|
|
|
57
58
|
}
|
|
58
59
|
function createAgentModel(connection, options = {}) {
|
|
59
60
|
const agent = new AgentAdapter(connection);
|
|
61
|
+
const selected = agentSelection(agent);
|
|
60
62
|
const report = (text) => agent.notify(text);
|
|
61
63
|
const run = options.page?.run;
|
|
62
64
|
return {
|
|
@@ -71,15 +73,15 @@ function createAgentModel(connection, options = {}) {
|
|
|
71
73
|
options.storage ?? null,
|
|
72
74
|
options.login ?? null
|
|
73
75
|
),
|
|
74
|
-
tray: new TrayAdapter(connection.settings),
|
|
76
|
+
tray: new TrayAdapter(connection.settings, selected),
|
|
75
77
|
sprinkles: new SprinkleAdapter(connection, report),
|
|
76
78
|
memory: new MemoryAdapter(connection, report),
|
|
77
79
|
changes: new ChangesAdapter(connection, report),
|
|
78
80
|
notices: new NoticesAdapter(connection.settings, report, options.notices),
|
|
79
|
-
monitor: new MonitorAdapter(
|
|
80
|
-
|
|
81
|
-
options.monitor?.extra ? { extra: options.monitor.extra } : {}
|
|
82
|
-
)
|
|
81
|
+
monitor: new MonitorAdapter(connection, {
|
|
82
|
+
selected,
|
|
83
|
+
...options.monitor?.extra ? { extra: options.monitor.extra } : {}
|
|
84
|
+
})
|
|
83
85
|
};
|
|
84
86
|
}
|
|
85
87
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/spectrum/index.ts"],
|
|
4
|
-
"sourcesContent": ["import type { MonitorSection } from '@ai-ecoverse/slicc-spectrum/ui';\nimport type { AgentConnection } from '../client.ts';\nimport type { GuestGates } from '../guests/seats.ts';\nimport { AgentAdapter } from './agent-port.ts';\nimport { ApprovalsAdapter, type HostApprovals } from './approvals-port.ts';\nimport { ChangesAdapter } from './changes-port.ts';\nimport { GuestAdapter, type GuestHub } from './guest-port.ts';\nimport { MemoryAdapter } from './memory-port.ts';\nimport { MonitorAdapter } from './monitor-port.ts';\nimport { type HostNotices, NoticesAdapter } from './notices-port.ts';\nimport { PageAdapter, type PageOptions } from './page-port.ts';\nimport { type Login, SettingsAdapter } from './settings-port.ts';\nimport { SprinkleAdapter } from './sprinkle-port.ts';\nimport { TrayAdapter } from './tray-port.ts';\n\nexport { AgentAdapter, CONE } from './agent-port.ts';\nexport {\n ApprovalsAdapter,\n type HostApprovals,\n NOT_HERE,\n shown as shownApproval,\n} from './approvals-port.ts';\nexport { ChangesAdapter, type ChangesEvents } from './changes-port.ts';\nexport {\n GuestAdapter,\n type GuestHub,\n NO_CONTROL,\n NO_HUB,\n NO_OWNER,\n NOT_OWNER_DEVICE,\n} from './guest-port.ts';\nexport { MemoryAdapter } from './memory-port.ts';\nexport {\n assistant,\n errorAction,\n errorPart,\n isBusy,\n queued,\n textOf,\n toMessages,\n} from './messages.ts';\nexport {\n MonitorAdapter,\n type MonitorAdapterOptions,\n type MonitorInput,\n monitorSnapshot,\n} from './monitor-port.ts';\nexport {\n type HostNotices,\n KEYS_MOVED,\n movedList,\n movedNotice,\n NoticesAdapter,\n} from './notices-port.ts';\nexport {\n PageAdapter,\n type PageDocument,\n type PageOptions,\n type PageRun,\n type PageTarget,\n} from './page-port.ts';\nexport { type Login, SETTINGS_KEY, SettingsAdapter } from './settings-port.ts';\nexport { SprinkleAdapter } from './sprinkle-port.ts';\nexport { TrayAdapter } from './tray-port.ts';\n\nexport interface GuestSeatShown {\n id: string;\n label: string;\n agentId: string;\n expiresAt: number | null;\n gates: GuestGates;\n}\n\nfunction seatOf(connection: AgentConnection): { seat?: GuestSeatShown } {\n const guest = connection.guest;\n if (!guest) return {};\n const { id, label, agentId, expiresAt, gates } = guest;\n return { seat: { id, label, agentId, expiresAt, gates: { ...gates } } };\n}\n\nexport function createAgentModel(\n connection: AgentConnection,\n options: {\n storage?: Pick<Storage, 'getItem' | 'setItem'> | null;\n login?: Login;\n monitor?: { extra?: () => readonly MonitorSection[] };\n page?: PageOptions;\n guests?: GuestHub;\n approvals?: HostApprovals;\n notices?: HostNotices;\n } = {}\n): {\n agent: AgentAdapter;\n approvals: ApprovalsAdapter;\n settings: SettingsAdapter;\n tray: TrayAdapter;\n sprinkles: SprinkleAdapter;\n memory: MemoryAdapter;\n changes: ChangesAdapter;\n monitor: MonitorAdapter;\n notices: NoticesAdapter;\n page: PageAdapter | null;\n guests: GuestAdapter;\n seat?: GuestSeatShown;\n} {\n const agent = new AgentAdapter(connection);\n const report = (text: string) => agent.notify(text);\n const run = options.page?.run;\n return {\n agent,\n guests: new GuestAdapter(connection, options.guests ?? null),\n ...seatOf(connection),\n approvals: new ApprovalsAdapter(connection, options.approvals),\n page: options.page && run ? new PageAdapter(connection, agent, { ...options.page, run }) : null,\n settings: new SettingsAdapter(\n connection.settings,\n agent,\n options.storage ?? null,\n options.login ?? null\n ),\n tray: new TrayAdapter(connection.settings),\n sprinkles: new SprinkleAdapter(connection, report),\n memory: new MemoryAdapter(connection, report),\n changes: new ChangesAdapter(connection, report),\n notices: new NoticesAdapter(connection.settings, report, options.notices),\n monitor: new MonitorAdapter(\n
|
|
5
|
-
"mappings": "AAGA,SAAS,oBAAoB;AAC7B,SAAS,wBAA4C;AACrD,SAAS,sBAAsB;AAC/B,SAAS,oBAAmC;AAC5C,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAC/B,SAA2B,sBAAsB;AACjD,SAAS,mBAAqC;AAC9C,SAAqB,uBAAuB;AAC5C,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAE5B,SAAS,gBAAAA,eAAc,YAAY;AACnC;AAAA,EACE,oBAAAC;AAAA,EAEA;AAAA,EACS;AAAA,OACJ;AACP,SAAS,kBAAAC,uBAA0C;AACnD;AAAA,EACE,gBAAAC;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAAC,sBAAqB;AAC9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE,kBAAAC;AAAA,EAGA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAAC;AAAA,OACK;AACP;AAAA,EACE,eAAAC;AAAA,OAKK;AACP,SAAqB,cAAc,mBAAAC,wBAAuB;AAC1D,SAAS,mBAAAC,wBAAuB;AAChC,SAAS,eAAAC,oBAAmB;AAU5B,SAAS,OAAO,YAAwD;AACtE,QAAM,QAAQ,WAAW;AACzB,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,EAAE,IAAI,OAAO,SAAS,WAAW,MAAM,IAAI;AACjD,SAAO,EAAE,MAAM,EAAE,IAAI,OAAO,SAAS,WAAW,OAAO,EAAE,GAAG,MAAM,EAAE,EAAE;AACxE;AAEO,SAAS,iBACd,YACA,UAQI,CAAC,GAcL;AACA,QAAM,QAAQ,IAAI,aAAa,UAAU;AACzC,QAAM,SAAS,CAAC,SAAiB,MAAM,OAAO,IAAI;AAClD,QAAM,MAAM,QAAQ,MAAM;AAC1B,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,IAAI,aAAa,YAAY,QAAQ,UAAU,IAAI;AAAA,IAC3D,GAAG,OAAO,UAAU;AAAA,IACpB,WAAW,IAAI,iBAAiB,YAAY,QAAQ,SAAS;AAAA,IAC7D,MAAM,QAAQ,QAAQ,MAAM,IAAI,YAAY,YAAY,OAAO,EAAE,GAAG,QAAQ,MAAM,IAAI,CAAC,IAAI;AAAA,IAC3F,UAAU,IAAI;AAAA,MACZ,WAAW;AAAA,MACX;AAAA,MACA,QAAQ,WAAW;AAAA,MACnB,QAAQ,SAAS;AAAA,IACnB;AAAA,IACA,MAAM,IAAI,YAAY,WAAW,QAAQ;AAAA,
|
|
4
|
+
"sourcesContent": ["import type { MonitorSection } from '@ai-ecoverse/slicc-spectrum/ui';\nimport type { AgentConnection } from '../client.ts';\nimport type { GuestGates } from '../guests/seats.ts';\nimport { AgentAdapter } from './agent-port.ts';\nimport { ApprovalsAdapter, type HostApprovals } from './approvals-port.ts';\nimport { agentSelection } from './budget.ts';\nimport { ChangesAdapter } from './changes-port.ts';\nimport { GuestAdapter, type GuestHub } from './guest-port.ts';\nimport { MemoryAdapter } from './memory-port.ts';\nimport { MonitorAdapter } from './monitor-port.ts';\nimport { type HostNotices, NoticesAdapter } from './notices-port.ts';\nimport { PageAdapter, type PageOptions } from './page-port.ts';\nimport { type Login, SettingsAdapter } from './settings-port.ts';\nimport { SprinkleAdapter } from './sprinkle-port.ts';\nimport { TrayAdapter } from './tray-port.ts';\n\nexport { AgentAdapter, CONE } from './agent-port.ts';\nexport {\n ApprovalsAdapter,\n type HostApprovals,\n NOT_HERE,\n shown as shownApproval,\n} from './approvals-port.ts';\nexport { ChangesAdapter, type ChangesEvents } from './changes-port.ts';\nexport {\n GuestAdapter,\n type GuestHub,\n NO_CONTROL,\n NO_HUB,\n NO_OWNER,\n NOT_OWNER_DEVICE,\n} from './guest-port.ts';\nexport { MemoryAdapter } from './memory-port.ts';\nexport {\n assistant,\n errorAction,\n errorPart,\n isBusy,\n queued,\n textOf,\n toMessages,\n} from './messages.ts';\nexport {\n MonitorAdapter,\n type MonitorAdapterOptions,\n type MonitorInput,\n monitorSnapshot,\n} from './monitor-port.ts';\nexport {\n type HostNotices,\n KEYS_MOVED,\n movedList,\n movedNotice,\n NoticesAdapter,\n} from './notices-port.ts';\nexport {\n PageAdapter,\n type PageDocument,\n type PageOptions,\n type PageRun,\n type PageTarget,\n} from './page-port.ts';\nexport { type Login, SETTINGS_KEY, SettingsAdapter } from './settings-port.ts';\nexport { SprinkleAdapter } from './sprinkle-port.ts';\nexport { TrayAdapter } from './tray-port.ts';\n\nexport interface GuestSeatShown {\n id: string;\n label: string;\n agentId: string;\n expiresAt: number | null;\n gates: GuestGates;\n}\n\nfunction seatOf(connection: AgentConnection): { seat?: GuestSeatShown } {\n const guest = connection.guest;\n if (!guest) return {};\n const { id, label, agentId, expiresAt, gates } = guest;\n return { seat: { id, label, agentId, expiresAt, gates: { ...gates } } };\n}\n\nexport function createAgentModel(\n connection: AgentConnection,\n options: {\n storage?: Pick<Storage, 'getItem' | 'setItem'> | null;\n login?: Login;\n monitor?: { extra?: () => readonly MonitorSection[] };\n page?: PageOptions;\n guests?: GuestHub;\n approvals?: HostApprovals;\n notices?: HostNotices;\n } = {}\n): {\n agent: AgentAdapter;\n approvals: ApprovalsAdapter;\n settings: SettingsAdapter;\n tray: TrayAdapter;\n sprinkles: SprinkleAdapter;\n memory: MemoryAdapter;\n changes: ChangesAdapter;\n monitor: MonitorAdapter;\n notices: NoticesAdapter;\n page: PageAdapter | null;\n guests: GuestAdapter;\n seat?: GuestSeatShown;\n} {\n const agent = new AgentAdapter(connection);\n const selected = agentSelection(agent);\n const report = (text: string) => agent.notify(text);\n const run = options.page?.run;\n return {\n agent,\n guests: new GuestAdapter(connection, options.guests ?? null),\n ...seatOf(connection),\n approvals: new ApprovalsAdapter(connection, options.approvals),\n page: options.page && run ? new PageAdapter(connection, agent, { ...options.page, run }) : null,\n settings: new SettingsAdapter(\n connection.settings,\n agent,\n options.storage ?? null,\n options.login ?? null\n ),\n tray: new TrayAdapter(connection.settings, selected),\n sprinkles: new SprinkleAdapter(connection, report),\n memory: new MemoryAdapter(connection, report),\n changes: new ChangesAdapter(connection, report),\n notices: new NoticesAdapter(connection.settings, report, options.notices),\n monitor: new MonitorAdapter(connection, {\n selected,\n ...(options.monitor?.extra ? { extra: options.monitor.extra } : {}),\n }),\n };\n}\n"],
|
|
5
|
+
"mappings": "AAGA,SAAS,oBAAoB;AAC7B,SAAS,wBAA4C;AACrD,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAC/B,SAAS,oBAAmC;AAC5C,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAC/B,SAA2B,sBAAsB;AACjD,SAAS,mBAAqC;AAC9C,SAAqB,uBAAuB;AAC5C,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAE5B,SAAS,gBAAAA,eAAc,YAAY;AACnC;AAAA,EACE,oBAAAC;AAAA,EAEA;AAAA,EACS;AAAA,OACJ;AACP,SAAS,kBAAAC,uBAA0C;AACnD;AAAA,EACE,gBAAAC;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAAC,sBAAqB;AAC9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE,kBAAAC;AAAA,EAGA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAAC;AAAA,OACK;AACP;AAAA,EACE,eAAAC;AAAA,OAKK;AACP,SAAqB,cAAc,mBAAAC,wBAAuB;AAC1D,SAAS,mBAAAC,wBAAuB;AAChC,SAAS,eAAAC,oBAAmB;AAU5B,SAAS,OAAO,YAAwD;AACtE,QAAM,QAAQ,WAAW;AACzB,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,EAAE,IAAI,OAAO,SAAS,WAAW,MAAM,IAAI;AACjD,SAAO,EAAE,MAAM,EAAE,IAAI,OAAO,SAAS,WAAW,OAAO,EAAE,GAAG,MAAM,EAAE,EAAE;AACxE;AAEO,SAAS,iBACd,YACA,UAQI,CAAC,GAcL;AACA,QAAM,QAAQ,IAAI,aAAa,UAAU;AACzC,QAAM,WAAW,eAAe,KAAK;AACrC,QAAM,SAAS,CAAC,SAAiB,MAAM,OAAO,IAAI;AAClD,QAAM,MAAM,QAAQ,MAAM;AAC1B,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,IAAI,aAAa,YAAY,QAAQ,UAAU,IAAI;AAAA,IAC3D,GAAG,OAAO,UAAU;AAAA,IACpB,WAAW,IAAI,iBAAiB,YAAY,QAAQ,SAAS;AAAA,IAC7D,MAAM,QAAQ,QAAQ,MAAM,IAAI,YAAY,YAAY,OAAO,EAAE,GAAG,QAAQ,MAAM,IAAI,CAAC,IAAI;AAAA,IAC3F,UAAU,IAAI;AAAA,MACZ,WAAW;AAAA,MACX;AAAA,MACA,QAAQ,WAAW;AAAA,MACnB,QAAQ,SAAS;AAAA,IACnB;AAAA,IACA,MAAM,IAAI,YAAY,WAAW,UAAU,QAAQ;AAAA,IACnD,WAAW,IAAI,gBAAgB,YAAY,MAAM;AAAA,IACjD,QAAQ,IAAI,cAAc,YAAY,MAAM;AAAA,IAC5C,SAAS,IAAI,eAAe,YAAY,MAAM;AAAA,IAC9C,SAAS,IAAI,eAAe,WAAW,UAAU,QAAQ,QAAQ,OAAO;AAAA,IACxE,SAAS,IAAI,eAAe,YAAY;AAAA,MACtC;AAAA,MACA,GAAI,QAAQ,SAAS,QAAQ,EAAE,OAAO,QAAQ,QAAQ,MAAM,IAAI,CAAC;AAAA,IACnE,CAAC;AAAA,EACH;AACF;",
|
|
6
6
|
"names": ["AgentAdapter", "ApprovalsAdapter", "ChangesAdapter", "GuestAdapter", "MemoryAdapter", "MonitorAdapter", "NoticesAdapter", "PageAdapter", "SettingsAdapter", "SprinkleAdapter", "TrayAdapter"]
|
|
7
7
|
}
|