@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/titles/labels.ts"],
|
|
4
|
-
"sourcesContent": ["import { type Context, type ReplicatedState, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { AssistantMessage, Usage } from '@earendil-works/pi-ai';\nimport {\n type ConversationId,\n type ConversationView,\n defineDoc,\n type Harness,\n type Tx,\n UsageDoc,\n} from '@earendil-works/pi-durable';\nimport type { Agents } from '../agents.ts';\nimport type { VaultState } from '../secrets/vault.ts';\nimport { vaultHold } from '../secrets/view.ts';\nimport { callIdsOf, clusterOf, describe } from './cluster.ts';\nimport { type Labeler, scrubbed } from './generate.ts';\nimport { labelKey, shownLabel } from './shown.ts';\n\nexport type LabelsState = { labels: Record<string, string> };\n\nexport const LabelsDoc = defineDoc<LabelsState>({\n kind: 'slicc.labels',\n version: 1,\n scope: 'session',\n initial: () => ({ labels: {} }),\n});\n\nexport const LABELS_KEPT = 500;\nexport const LABELS_PER_MINUTE = 6;\nconst MINUTE = 60_000;\nconst LABEL_WORDS = 8;\nconst LABEL_LENGTH = 80;\nconst RESERVED = 2;\nconst POLL_MS = 1000;\nconst SETTLE_MS = 600_000;\n\nexport const LABEL_WAIT_MS = 30_000;\n\nexport function visibleLabels(\n labels: ReplicatedState<Record<string, string>>,\n sources: readonly ReplicatedState<unknown>[],\n views: () => readonly ConversationView[]\n) {\n const pick = () => {\n const ids = callIdsOf(views());\n return Object.fromEntries(\n Object.entries(labels.value as Record<string, string>).filter(([key]) =>\n key.split(' ').every((id) => ids.has(id))\n )\n );\n };\n const state = replicatedState<Record<string, string>>(pick());\n let queued = false;\n const update = () => {\n if (queued) return;\n queued = true;\n queueMicrotask(() => {\n queued = false;\n const next = pick();\n const before = state.value;\n const keys = Object.keys(next);\n if (\n keys.length !== Object.keys(before).length ||\n keys.some((key) => before[key] !== next[key])\n )\n state.replace(BACKGROUND_CONTEXT, next);\n });\n };\n const offs = [labels, ...sources].map((source) => source.subscribe(update));\n return {\n state,\n dispose() {\n for (const off of offs) off();\n },\n };\n}\n\nexport function watchLabel(\n labels: ReplicatedState<Record<string, string>>,\n waitMs = LABEL_WAIT_MS\n) {\n return (_agentId: string, callIds: readonly string[]): Promise<string | null> => {\n const found = shownLabel(labels.value, callIds);\n if (found !== undefined || !callIds.length) return Promise.resolve(found ?? null);\n return new Promise((resolve) => {\n const done = (label: string | null) => {\n clearTimeout(timer);\n off();\n resolve(label);\n };\n const timer = setTimeout(() => done(null), waitMs);\n const off = labels.subscribe(() => {\n const label = shownLabel(labels.value, callIds);\n if (label !== undefined) done(label);\n });\n });\n };\n}\n\nexport function cleanLabel(text: string): string {\n return text\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/^[\"'\u201C\u201D]+|[\"'\u201C\u201D]+$/g, '')\n .replace(/\\.+$/, '')\n .trim()\n .split(' ')\n .slice(0, LABEL_WORDS)\n .join(' ')\n .slice(0, LABEL_LENGTH);\n}\n\ntype Counted = Record<'input' | 'output' | 'cacheRead' | 'cacheWrite' | 'totalTokens', number> & {\n cost: Record<'input' | 'output' | 'cacheRead' | 'cacheWrite' | 'total', number>;\n};\n\nexport async function spend(\n tx: Tx,\n conversation: ConversationId,\n answer: Pick<AssistantMessage, 'provider' | 'model' | 'usage'>\n) {\n const models = (await tx.doc(UsageDoc, conversation)).models as unknown as Record<\n string,\n Counted\n >;\n const key = `${answer.provider}/${answer.model}`;\n const usage = answer.usage as Usage;\n const total = Object.hasOwn(models, key) ? models[key] : undefined;\n if (!total) {\n models[key] = JSON.parse(JSON.stringify(usage)) as Counted;\n return;\n }\n for (const field of ['input', 'output', 'cacheRead', 'cacheWrite', 'totalTokens'] as const)\n total[field] += usage[field];\n for (const field of ['input', 'output', 'cacheRead', 'cacheWrite', 'total'] as const)\n total.cost[field] += usage.cost[field];\n}\n\nexport interface LabelsAttach {\n harness: Pick<Harness, 'commit'>;\n agents: Pick<Agents, 'conversation'>;\n label: Labeler;\n vault?: Pick<ReplicatedState<VaultState>, 'value'>;\n now?: () => number;\n perMinute?: number;\n pollMs?: number;\n settleMs?: number;\n}\n\nexport interface LabelsRuntime {\n labels: ReplicatedState<Record<string, string>>;\n label(agentId: string, callIds: readonly string[], context: Context): Promise<string | null>;\n}\n\nfunction modelName(model: { provider: string; modelId: string } | undefined): string {\n return model ? `${model.provider}/${model.modelId}` : '';\n}\n\nexport async function attachLabels(\n options: LabelsAttach,\n context: Context = BACKGROUND_CONTEXT\n): Promise<LabelsRuntime> {\n const { harness, agents } = options;\n const now = options.now ?? Date.now;\n const started = now();\n const cap = options.perMinute ?? LABELS_PER_MINUTE;\n const loaded = await harness.commit(\n async (tx) => ({ ...(await tx.doc(LabelsDoc)).labels }),\n context\n );\n const labels = replicatedState<Record<string, string>>(loaded);\n const flying = new Map<string, Promise<string | null>>();\n const waiting = new Set<string>();\n const spent = new Map<string, number[]>();\n const pollMs = options.pollMs ?? POLL_MS;\n const rounds = Math.ceil((options.settleMs ?? SETTLE_MS) / pollMs);\n const sleep = () => new Promise((resolve) => setTimeout(resolve, pollMs));\n const used = (agentId: string) => {\n const at = now();\n const recent = (spent.get(agentId) ?? []).filter((time) => at - time < MINUTE);\n spent.set(agentId, recent);\n return recent;\n };\n const admit = (agentId: string, settle: boolean) => () => {\n const recent = used(agentId);\n if (recent.length >= (settle ? cap : cap - RESERVED)) return false;\n recent.push(now());\n return true;\n };\n const room = async (agentId: string) => {\n for (let round = 0; round < rounds && used(agentId).length >= cap; round++) await sleep();\n };\n const keep = (\n key: string,\n label: string,\n conversation: ConversationId,\n answer: AssistantMessage\n ) =>\n harness.commit(async (tx) => {\n const doc = await tx.doc(LabelsDoc);\n doc.labels[key] = label;\n const keys = Object.keys(doc.labels);\n for (const old of keys.slice(0, Math.max(0, keys.length - LABELS_KEPT)))\n delete doc.labels[old];\n await spend(tx, conversation, answer);\n return { ...doc.labels };\n }, BACKGROUND_CONTEXT);\n const read = async (agentId: string, callIds: readonly string[]) => {\n const conversation = await agents.conversation(agentId, BACKGROUND_CONTEXT);\n if (!conversation) return undefined;\n const cluster = clusterOf((await conversation.context(BACKGROUND_CONTEXT)).entries, callIds);\n return cluster ? { conversation, cluster } : undefined;\n };\n type Read = NonNullable<Awaited<ReturnType<typeof read>>>;\n const ask = async (agentId: string, key: string, found: Read, settle: boolean) => {\n if (vaultHold(options.vault?.value)) return null;\n if (settle) await room(agentId);\n const text = await scrubbed(describe(found.cluster.runs));\n const model = modelName((await found.conversation.agent(BACKGROUND_CONTEXT)).model);\n const asked = await options.label(text, model, BACKGROUND_CONTEXT, admit(agentId, settle));\n if (!asked) return null;\n const label = cleanLabel(asked.text);\n labels.replace(BACKGROUND_CONTEXT, await keep(key, label, found.conversation.id, asked.answer));\n return label || null;\n };\n const longer = (key: string) =>\n [...flying.keys(), ...waiting, ...Object.keys(labels.value)].some((other) =>\n other.startsWith(`${key} `)\n );\n const prefixOf = (callIds: readonly string[]) => {\n for (let size = callIds.length - 1; size > 0; size--) {\n const part = callIds.slice(0, size);\n const key = labelKey(part);\n const shown = flying.get(key) ?? shownLabel(labels.value, part);\n if (shown !== undefined) return Promise.resolve(shown);\n if (waiting.has(key)) return Promise.resolve(null);\n }\n return undefined;\n };\n const settled = async (agentId: string, callIds: readonly string[], key: string) => {\n for (let round = 0; round < rounds; round++) {\n await sleep();\n if (longer(key)) return undefined;\n const found = await read(agentId, callIds);\n if (found?.cluster.settled) return found;\n }\n return undefined;\n };\n const relabel = async (agentId: string, callIds: readonly string[], key: string) => {\n const found = await settled(agentId, callIds, key);\n return found ? ask(agentId, key, found, true) : undefined;\n };\n const make = async (agentId: string, callIds: readonly string[], key: string) => {\n const found = await read(agentId, callIds);\n if (!found || found.cluster.at < started) return null;\n const prefix = prefixOf(callIds);\n if (longer(key)) return (await prefix) ?? null;\n if (found.cluster.settled) return ask(agentId, key, found, prefix !== undefined);\n if (prefix !== undefined) {\n const shown = await prefix;\n return (await relabel(agentId, callIds, key)) ?? shown;\n }\n const first = await ask(agentId, key, found, false);\n waiting.add(key);\n void relabel(agentId, callIds, key)\n .catch(() => undefined)\n .finally(() => waiting.delete(key));\n return first;\n };\n return {\n labels,\n label(agentId, callIds, _context) {\n if (!callIds.length) return Promise.resolve(null);\n const key = labelKey(callIds);\n const found = shownLabel(labels.value, callIds);\n if (found !== undefined) return Promise.resolve(found);\n const known = flying.get(key);\n if (known !== undefined) return known;\n const made = make(agentId, callIds, key)\n .catch(() => null)\n .finally(() => flying.delete(key));\n flying.set(key, made);\n return made;\n },\n };\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAA6C,uBAAuB;AACpE,SAAS,0BAA0B;AAEnC;AAAA,EAGE;AAAA,EAGA;AAAA,OACK;
|
|
4
|
+
"sourcesContent": ["import { type Context, type ReplicatedState, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { AssistantMessage, Usage } from '@earendil-works/pi-ai';\nimport {\n type ConversationId,\n type ConversationView,\n defineDoc,\n type Harness,\n type Tx,\n UsageDoc,\n} from '@earendil-works/pi-durable';\nimport type { Agents } from '../agents.ts';\nimport { deltasOnly } from '../checkpoints.ts';\nimport type { VaultState } from '../secrets/vault.ts';\nimport { vaultHold } from '../secrets/view.ts';\nimport { callIdsOf, clusterOf, describe } from './cluster.ts';\nimport { type Labeler, scrubbed } from './generate.ts';\nimport { labelKey, shownLabel } from './shown.ts';\n\nexport type LabelsState = { labels: Record<string, string> };\n\nexport const LabelsDoc = defineDoc<LabelsState>({\n kind: 'slicc.labels',\n checkpointWhen: deltasOnly,\n version: 1,\n scope: 'session',\n initial: () => ({ labels: {} }),\n});\n\nexport const LABELS_KEPT = 500;\nexport const LABELS_PER_MINUTE = 6;\nconst MINUTE = 60_000;\nconst LABEL_WORDS = 8;\nconst LABEL_LENGTH = 80;\nconst RESERVED = 2;\nconst POLL_MS = 1000;\nconst SETTLE_MS = 600_000;\n\nexport const LABEL_WAIT_MS = 30_000;\n\nexport function visibleLabels(\n labels: ReplicatedState<Record<string, string>>,\n sources: readonly ReplicatedState<unknown>[],\n views: () => readonly ConversationView[]\n) {\n const pick = () => {\n const ids = callIdsOf(views());\n return Object.fromEntries(\n Object.entries(labels.value as Record<string, string>).filter(([key]) =>\n key.split(' ').every((id) => ids.has(id))\n )\n );\n };\n const state = replicatedState<Record<string, string>>(pick());\n let queued = false;\n const update = () => {\n if (queued) return;\n queued = true;\n queueMicrotask(() => {\n queued = false;\n const next = pick();\n const before = state.value;\n const keys = Object.keys(next);\n if (\n keys.length !== Object.keys(before).length ||\n keys.some((key) => before[key] !== next[key])\n )\n state.replace(BACKGROUND_CONTEXT, next);\n });\n };\n const offs = [labels, ...sources].map((source) => source.subscribe(update));\n return {\n state,\n dispose() {\n for (const off of offs) off();\n },\n };\n}\n\nexport function watchLabel(\n labels: ReplicatedState<Record<string, string>>,\n waitMs = LABEL_WAIT_MS\n) {\n return (_agentId: string, callIds: readonly string[]): Promise<string | null> => {\n const found = shownLabel(labels.value, callIds);\n if (found !== undefined || !callIds.length) return Promise.resolve(found ?? null);\n return new Promise((resolve) => {\n const done = (label: string | null) => {\n clearTimeout(timer);\n off();\n resolve(label);\n };\n const timer = setTimeout(() => done(null), waitMs);\n const off = labels.subscribe(() => {\n const label = shownLabel(labels.value, callIds);\n if (label !== undefined) done(label);\n });\n });\n };\n}\n\nexport function cleanLabel(text: string): string {\n return text\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/^[\"'\u201C\u201D]+|[\"'\u201C\u201D]+$/g, '')\n .replace(/\\.+$/, '')\n .trim()\n .split(' ')\n .slice(0, LABEL_WORDS)\n .join(' ')\n .slice(0, LABEL_LENGTH);\n}\n\ntype Counted = Record<'input' | 'output' | 'cacheRead' | 'cacheWrite' | 'totalTokens', number> & {\n cost: Record<'input' | 'output' | 'cacheRead' | 'cacheWrite' | 'total', number>;\n};\n\nexport async function spend(\n tx: Tx,\n conversation: ConversationId,\n answer: Pick<AssistantMessage, 'provider' | 'model' | 'usage'>\n) {\n const models = (await tx.doc(UsageDoc, conversation)).models as unknown as Record<\n string,\n Counted\n >;\n const key = `${answer.provider}/${answer.model}`;\n const usage = answer.usage as Usage;\n const total = Object.hasOwn(models, key) ? models[key] : undefined;\n if (!total) {\n models[key] = JSON.parse(JSON.stringify(usage)) as Counted;\n return;\n }\n for (const field of ['input', 'output', 'cacheRead', 'cacheWrite', 'totalTokens'] as const)\n total[field] += usage[field];\n for (const field of ['input', 'output', 'cacheRead', 'cacheWrite', 'total'] as const)\n total.cost[field] += usage.cost[field];\n}\n\nexport interface LabelsAttach {\n harness: Pick<Harness, 'commit'>;\n agents: Pick<Agents, 'conversation'>;\n label: Labeler;\n vault?: Pick<ReplicatedState<VaultState>, 'value'>;\n now?: () => number;\n perMinute?: number;\n pollMs?: number;\n settleMs?: number;\n}\n\nexport interface LabelsRuntime {\n labels: ReplicatedState<Record<string, string>>;\n label(agentId: string, callIds: readonly string[], context: Context): Promise<string | null>;\n}\n\nfunction modelName(model: { provider: string; modelId: string } | undefined): string {\n return model ? `${model.provider}/${model.modelId}` : '';\n}\n\nexport async function attachLabels(\n options: LabelsAttach,\n context: Context = BACKGROUND_CONTEXT\n): Promise<LabelsRuntime> {\n const { harness, agents } = options;\n const now = options.now ?? Date.now;\n const started = now();\n const cap = options.perMinute ?? LABELS_PER_MINUTE;\n const loaded = await harness.commit(\n async (tx) => ({ ...(await tx.doc(LabelsDoc)).labels }),\n context\n );\n const labels = replicatedState<Record<string, string>>(loaded);\n const flying = new Map<string, Promise<string | null>>();\n const waiting = new Set<string>();\n const spent = new Map<string, number[]>();\n const pollMs = options.pollMs ?? POLL_MS;\n const rounds = Math.ceil((options.settleMs ?? SETTLE_MS) / pollMs);\n const sleep = () => new Promise((resolve) => setTimeout(resolve, pollMs));\n const used = (agentId: string) => {\n const at = now();\n const recent = (spent.get(agentId) ?? []).filter((time) => at - time < MINUTE);\n spent.set(agentId, recent);\n return recent;\n };\n const admit = (agentId: string, settle: boolean) => () => {\n const recent = used(agentId);\n if (recent.length >= (settle ? cap : cap - RESERVED)) return false;\n recent.push(now());\n return true;\n };\n const room = async (agentId: string) => {\n for (let round = 0; round < rounds && used(agentId).length >= cap; round++) await sleep();\n };\n const keep = (\n key: string,\n label: string,\n conversation: ConversationId,\n answer: AssistantMessage\n ) =>\n harness.commit(async (tx) => {\n const doc = await tx.doc(LabelsDoc);\n doc.labels[key] = label;\n const keys = Object.keys(doc.labels);\n for (const old of keys.slice(0, Math.max(0, keys.length - LABELS_KEPT)))\n delete doc.labels[old];\n await spend(tx, conversation, answer);\n return { ...doc.labels };\n }, BACKGROUND_CONTEXT);\n const read = async (agentId: string, callIds: readonly string[]) => {\n const conversation = await agents.conversation(agentId, BACKGROUND_CONTEXT);\n if (!conversation) return undefined;\n const cluster = clusterOf((await conversation.context(BACKGROUND_CONTEXT)).entries, callIds);\n return cluster ? { conversation, cluster } : undefined;\n };\n type Read = NonNullable<Awaited<ReturnType<typeof read>>>;\n const ask = async (agentId: string, key: string, found: Read, settle: boolean) => {\n if (vaultHold(options.vault?.value)) return null;\n if (settle) await room(agentId);\n const text = await scrubbed(describe(found.cluster.runs));\n const model = modelName((await found.conversation.agent(BACKGROUND_CONTEXT)).model);\n const asked = await options.label(text, model, BACKGROUND_CONTEXT, admit(agentId, settle));\n if (!asked) return null;\n const label = cleanLabel(asked.text);\n labels.replace(BACKGROUND_CONTEXT, await keep(key, label, found.conversation.id, asked.answer));\n return label || null;\n };\n const longer = (key: string) =>\n [...flying.keys(), ...waiting, ...Object.keys(labels.value)].some((other) =>\n other.startsWith(`${key} `)\n );\n const prefixOf = (callIds: readonly string[]) => {\n for (let size = callIds.length - 1; size > 0; size--) {\n const part = callIds.slice(0, size);\n const key = labelKey(part);\n const shown = flying.get(key) ?? shownLabel(labels.value, part);\n if (shown !== undefined) return Promise.resolve(shown);\n if (waiting.has(key)) return Promise.resolve(null);\n }\n return undefined;\n };\n const settled = async (agentId: string, callIds: readonly string[], key: string) => {\n for (let round = 0; round < rounds; round++) {\n await sleep();\n if (longer(key)) return undefined;\n const found = await read(agentId, callIds);\n if (found?.cluster.settled) return found;\n }\n return undefined;\n };\n const relabel = async (agentId: string, callIds: readonly string[], key: string) => {\n const found = await settled(agentId, callIds, key);\n return found ? ask(agentId, key, found, true) : undefined;\n };\n const make = async (agentId: string, callIds: readonly string[], key: string) => {\n const found = await read(agentId, callIds);\n if (!found || found.cluster.at < started) return null;\n const prefix = prefixOf(callIds);\n if (longer(key)) return (await prefix) ?? null;\n if (found.cluster.settled) return ask(agentId, key, found, prefix !== undefined);\n if (prefix !== undefined) {\n const shown = await prefix;\n return (await relabel(agentId, callIds, key)) ?? shown;\n }\n const first = await ask(agentId, key, found, false);\n waiting.add(key);\n void relabel(agentId, callIds, key)\n .catch(() => undefined)\n .finally(() => waiting.delete(key));\n return first;\n };\n return {\n labels,\n label(agentId, callIds, _context) {\n if (!callIds.length) return Promise.resolve(null);\n const key = labelKey(callIds);\n const found = shownLabel(labels.value, callIds);\n if (found !== undefined) return Promise.resolve(found);\n const known = flying.get(key);\n if (known !== undefined) return known;\n const made = make(agentId, callIds, key)\n .catch(() => null)\n .finally(() => flying.delete(key));\n flying.set(key, made);\n return made;\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/types/agent.d.ts
CHANGED
|
@@ -29,4 +29,8 @@ export interface Agent extends Cones {
|
|
|
29
29
|
close(): Promise<void>;
|
|
30
30
|
}
|
|
31
31
|
export declare function answerText(content: unknown): string;
|
|
32
|
+
export declare const SLICC_ATTRIBUTION: {
|
|
33
|
+
name: string;
|
|
34
|
+
url: string;
|
|
35
|
+
};
|
|
32
36
|
export declare function openAgent(options: AgentOptions): Promise<Agent>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const deltasOnly: () => boolean;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Context } from '@earendil-works/chord';
|
|
2
|
+
export interface PhaseClock {
|
|
3
|
+
now(): number;
|
|
4
|
+
setTimer(callback: () => void, delayMs: number): () => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function pauseUntil(clock: PhaseClock, until: number, context: Context): Promise<void>;
|
package/dist/types/services.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Context, JsonValue, RemoteContract, ReplicatedState } from '@earendil-works/chord';
|
|
2
|
-
import type { ConversationView } from '@earendil-works/pi-durable';
|
|
2
|
+
import type { BlockedReason, ConversationView } from '@earendil-works/pi-durable';
|
|
3
3
|
import type { Approval, ApprovalAnswer, ApprovalDecided } from './approvals/index.ts';
|
|
4
4
|
import type { ApprovalPolicy, ApprovalPolicyChange, ApprovalPolicySet } from './approvals/policy.ts';
|
|
5
5
|
import type { SendAttachment, ShownAttachment } from './attachments.ts';
|
|
@@ -153,12 +153,14 @@ export interface MonitorTask {
|
|
|
153
153
|
detail: string | null;
|
|
154
154
|
agentId: string | null;
|
|
155
155
|
owner: string | null;
|
|
156
|
-
status: 'pending' | 'running' | 'waiting' | 'completing';
|
|
156
|
+
status: 'pending' | 'running' | 'waiting' | 'sleeping' | 'completing';
|
|
157
157
|
phase: string;
|
|
158
158
|
background: boolean;
|
|
159
159
|
aborting: number | null;
|
|
160
160
|
since: number;
|
|
161
161
|
waits: number;
|
|
162
|
+
until: number | null;
|
|
163
|
+
blocked: BlockedReason | null;
|
|
162
164
|
}
|
|
163
165
|
export interface MonitorProcess {
|
|
164
166
|
pid: number;
|
|
@@ -399,6 +401,7 @@ export interface SettingsState {
|
|
|
399
401
|
accounts: AccountState[];
|
|
400
402
|
providers?: ProviderOption[];
|
|
401
403
|
budget?: BudgetState | null;
|
|
404
|
+
budgets?: BudgetState[];
|
|
402
405
|
moved?: {
|
|
403
406
|
kind: 'model' | 'mcp';
|
|
404
407
|
label: string;
|
package/dist/types/settings.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ import type { KeysMoved } from './secrets/legacy.ts';
|
|
|
8
8
|
import type { VaultRecords } from './secrets/records.ts';
|
|
9
9
|
import type { PlainStore } from './secrets/store.ts';
|
|
10
10
|
import type { Vault } from './secrets/vault.ts';
|
|
11
|
-
import type { AccountField, AgentSettings } from './services.ts';
|
|
11
|
+
import type { AccountField, AgentSettings, BudgetState } from './services.ts';
|
|
12
12
|
export { BEDROCK, PREFERRED_MODELS, preferredModel } from './preferred.ts';
|
|
13
13
|
export declare const DEFAULT_MODEL: {
|
|
14
14
|
provider: string;
|
|
@@ -37,6 +37,11 @@ export interface ProviderFields {
|
|
|
37
37
|
}
|
|
38
38
|
export declare function providerFields(store: PlainStore, providers: readonly Provider[]): Promise<ProviderFields>;
|
|
39
39
|
export type UsageReader = (token: string) => Promise<Budget | null>;
|
|
40
|
+
export declare function grokBudgets(records: Pick<VaultRecords, 'model'>, usage: UsageReader, { reach, every, now }: {
|
|
41
|
+
reach?: Reach;
|
|
42
|
+
every: number;
|
|
43
|
+
now: () => number;
|
|
44
|
+
}): () => Promise<BudgetState | null>;
|
|
40
45
|
export interface SettingsSources {
|
|
41
46
|
records: VaultRecords;
|
|
42
47
|
fields: ProviderFields;
|
|
@@ -49,4 +54,6 @@ export declare function createAgentSettings(models: MutableModels, sources: Sett
|
|
|
49
54
|
reach?: Reach;
|
|
50
55
|
vault?: Pick<Vault, 'connected' | 'needed' | 'grantProvider'>;
|
|
51
56
|
flows?: DeviceFlows;
|
|
57
|
+
grok?: UsageReader;
|
|
58
|
+
now?: () => number;
|
|
52
59
|
}): Promise<AgentSettings>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { BudgetState, SettingsState } from '../services.ts';
|
|
2
|
+
export interface Selected {
|
|
3
|
+
provider(): string | undefined;
|
|
4
|
+
onChange(listener: () => void): () => void;
|
|
5
|
+
}
|
|
6
|
+
export declare const BUDGET_NAMES: Readonly<Record<string, string>>;
|
|
7
|
+
export declare const budgetName: (provider: string) => string;
|
|
8
|
+
export declare function selectedBudget(state: SettingsState | undefined, provider: string | undefined): BudgetState | null;
|
|
9
|
+
export declare function agentSelection(agent: {
|
|
10
|
+
active(): string;
|
|
11
|
+
list(): readonly {
|
|
12
|
+
id: string;
|
|
13
|
+
model: string;
|
|
14
|
+
}[];
|
|
15
|
+
on(type: 'agents' | 'active', listener: () => void): () => void;
|
|
16
|
+
}): Selected;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { MonitorAlert, MonitorEvents, MonitorPort, MonitorSection, MonitorSnapshot } from '@ai-ecoverse/slicc-spectrum/ui';
|
|
2
2
|
import type { AgentConnection } from '../client.ts';
|
|
3
3
|
import type { BudgetState, ModelChoice, MonitorFeed, MonitorProcess, MonitorTask } from '../services.ts';
|
|
4
|
+
import { type Selected } from './budget.ts';
|
|
4
5
|
export declare const RENEW_MS = 10000;
|
|
5
6
|
export declare const SAMPLE_MS = 2000;
|
|
6
7
|
export declare const ROWS_MAX = 200;
|
|
@@ -83,6 +84,7 @@ export interface MonitorAdapterOptions {
|
|
|
83
84
|
sampleMs?: number;
|
|
84
85
|
intervals?: Intervals;
|
|
85
86
|
now?: () => number;
|
|
87
|
+
selected?: Selected;
|
|
86
88
|
}
|
|
87
89
|
export declare class MonitorAdapter implements MonitorPort {
|
|
88
90
|
#private;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { TrayEvents, TrayPort, TrayStatus } from '@ai-ecoverse/slicc-spectrum/ui';
|
|
2
2
|
import type { AgentSettings } from '../services.ts';
|
|
3
|
+
import { type Selected } from './budget.ts';
|
|
3
4
|
import { Emitter } from './emitter.ts';
|
|
4
5
|
export declare class TrayAdapter extends Emitter<TrayEvents> implements TrayPort {
|
|
5
6
|
#private;
|
|
6
|
-
constructor(settings: AgentSettings);
|
|
7
|
+
constructor(settings: AgentSettings, selected?: Selected);
|
|
7
8
|
status(): TrayStatus;
|
|
8
9
|
reconnect(): void;
|
|
9
10
|
disconnect(): void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Budget } from './adobe.ts';
|
|
2
|
+
export declare const XAI = "xai";
|
|
3
|
+
export declare const XAI_USAGE_URL = "https://cli-chat-proxy.grok.com/v1/billing?format=credits";
|
|
4
|
+
export declare const USAGE_TIMEOUT_MS = 8000;
|
|
5
|
+
export declare const MAX_USAGE_BYTES: number;
|
|
6
|
+
type Fetch = typeof fetch;
|
|
7
|
+
export declare function grokBudget(text: string): Budget | null;
|
|
8
|
+
export declare function xaiUsage(token: string, { fetch: fetcher, timeout, }?: {
|
|
9
|
+
fetch?: Fetch;
|
|
10
|
+
timeout?: number;
|
|
11
|
+
}): Promise<Budget | null>;
|
|
12
|
+
export {};
|
package/dist/workflow/run.js
CHANGED
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
defineDocFamily,
|
|
5
5
|
defineTask
|
|
6
6
|
} from "@earendil-works/pi-durable";
|
|
7
|
+
import { deltasOnly } from "../checkpoints.js";
|
|
7
8
|
import { MAX_AGENTS } from "./script.js";
|
|
8
9
|
import {
|
|
9
10
|
cleanup,
|
|
@@ -16,18 +17,21 @@ const MAX_LOGS = 200;
|
|
|
16
17
|
const KEPT_RUNS = 50;
|
|
17
18
|
const WorkflowsDoc = defineDoc({
|
|
18
19
|
kind: "slicc.workflows",
|
|
20
|
+
checkpointWhen: deltasOnly,
|
|
19
21
|
version: 1,
|
|
20
22
|
scope: "session",
|
|
21
23
|
initial: () => ({ runs: {} })
|
|
22
24
|
});
|
|
23
25
|
const StartDoc = defineDoc({
|
|
24
26
|
kind: "slicc.workflow.start",
|
|
27
|
+
checkpointWhen: deltasOnly,
|
|
25
28
|
version: 1,
|
|
26
29
|
scope: "task",
|
|
27
30
|
initial: () => ({ startedAt: 0, seed: 0, fingerprint: null, count: 0, firstIssued: null })
|
|
28
31
|
});
|
|
29
32
|
const JournalDoc = defineDocFamily({
|
|
30
33
|
kind: "slicc.workflow.journal",
|
|
34
|
+
checkpointWhen: deltasOnly,
|
|
31
35
|
version: 1,
|
|
32
36
|
scope: "task",
|
|
33
37
|
family: true,
|
|
@@ -35,6 +39,7 @@ const JournalDoc = defineDocFamily({
|
|
|
35
39
|
});
|
|
36
40
|
const StepDoc = defineDocFamily({
|
|
37
41
|
kind: "slicc.workflow.step",
|
|
42
|
+
checkpointWhen: deltasOnly,
|
|
38
43
|
version: 1,
|
|
39
44
|
scope: "task",
|
|
40
45
|
family: true,
|
package/dist/workflow/run.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/workflow/run.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Context, JsonValue } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT, withAbortSignal } from '@earendil-works/chord/context';\nimport type {\n CodemodeHostCall,\n CodemodeOutcome,\n CodemodeResult,\n CodemodeRun,\n CodemodeRunOptions,\n} from '@earendil-works/pi-codemode';\nimport {\n defineDoc,\n defineDocFamily,\n defineTask,\n type TaskRuntime,\n type Tx,\n} from '@earendil-works/pi-durable';\nimport type { InheritedTaint } from '../guests/guard.ts';\nimport type { Spawned } from '../scoops/service.ts';\nimport { MAX_AGENTS } from './script.ts';\nimport {\n type AgentCall,\n cleanup,\n plan,\n StepError,\n type StepHost,\n settle,\n waitReport,\n} from './step.ts';\n\nexport const MAX_LOGS = 200;\nexport const KEPT_RUNS = 50;\n\nexport type RunStatus = 'running' | 'completed' | 'failed' | 'stopped';\n\nexport type RunRecord = {\n id: string;\n name: string;\n description: string;\n cone: string;\n home: string;\n file: string | null;\n source: string;\n budget: number | null;\n concurrency: number;\n status: RunStatus;\n phase: string | null;\n started: number;\n ended: number | null;\n agents: { started: number; done: number; failed: number; running: string[] };\n spent: number;\n logs: string[];\n fromAgent: boolean;\n taints: InheritedTaint[];\n result?: JsonValue;\n error?: string;\n};\n\nexport const WorkflowsDoc = defineDoc<{ runs: Record<string, RunRecord> }>({\n kind: 'slicc.workflows',\n version: 1,\n scope: 'session',\n initial: () => ({ runs: {} }),\n});\n\ntype Start = {\n startedAt: number;\n seed: number;\n fingerprint: string | null;\n count: number;\n firstIssued: number | null;\n};\n\nconst StartDoc = defineDoc<Start>({\n kind: 'slicc.workflow.start',\n version: 1,\n scope: 'task',\n initial: () => ({ startedAt: 0, seed: 0, fingerprint: null, count: 0, firstIssued: null }),\n});\n\ntype Entry = {\n id: number;\n name: string;\n at: number;\n outcome: JsonValue;\n issuedAfter: number | null;\n};\n\nconst JournalDoc = defineDocFamily<Entry, null>({\n kind: 'slicc.workflow.journal',\n version: 1,\n scope: 'task',\n family: true,\n initial: () => ({ id: 0, name: '', at: 0, outcome: null, issuedAfter: null }),\n});\n\ntype Step = { folder: string; task: number; conversation: number };\n\nconst StepDoc = defineDocFamily<Step, null>({\n kind: 'slicc.workflow.step',\n version: 1,\n scope: 'task',\n family: true,\n initial: () => ({ folder: '', task: 0, conversation: 0 }),\n});\n\nexport interface Engine {\n start(code: string, options: CodemodeRunOptions): CodemodeRun;\n}\n\nexport interface RunHost extends StepHost {\n engine: () => Engine;\n}\n\ntype Lookup = () => Promise<RunHost>;\ntype RunInput = { code: string };\ntype RunState = { phase: 'start' } | { phase: 'run' };\n\nexport const GLOBALS = [{ name: '__agent' }, { name: '__notify' }];\n\nexport const DIVERGED =\n 'the workflow took another path than before the restart, so it cannot resume';\n\nfunction addLog(record: RunRecord, line: string): void {\n record.logs.push(line);\n if (record.logs.length > MAX_LOGS) record.logs.splice(0, record.logs.length - MAX_LOGS);\n}\n\nexport function noted(record: RunRecord, args: unknown): void {\n const { kind, text } = (args ?? {}) as { kind?: string; text?: unknown };\n const line = String(text ?? '');\n if (kind === 'phase') {\n record.phase = line;\n addLog(record, `phase: ${line}`);\n } else addLog(record, line);\n}\n\nfunction failure(error: unknown): CodemodeOutcome {\n const tokens = error instanceof StepError ? error.outputTokens : 0;\n return {\n ok: false,\n message: error instanceof Error ? error.message : String(error),\n properties: { outputTokens: tokens },\n };\n}\n\nfunction spentOf(outcome: CodemodeOutcome): number {\n const value = outcome.ok ? outcome.value : outcome.properties;\n const tokens = (value as { outputTokens?: unknown } | undefined)?.outputTokens;\n return typeof tokens === 'number' ? tokens : 0;\n}\n\nexport function errorText(result: CodemodeResult): string {\n if (result.ok) return '';\n const { error } = result;\n return error.kind === 'script' ? error.message : `${error.kind}: ${error.message}`;\n}\n\ntype Runtime = TaskRuntime<RunInput, RunState, null, object>;\n\nasync function runOf(tx: Tx, id: string): Promise<RunRecord | undefined> {\n return (await tx.doc(WorkflowsDoc)).runs[id] as RunRecord | undefined;\n}\n\ntype Event =\n | { kind: 'call'; call: CodemodeHostCall }\n | { kind: 'idle'; seq: number; issued: number }\n | { kind: 'started'; fingerprint: string };\n\nexport class Driver {\n readonly id: string;\n readonly host: RunHost;\n readonly runtime: Runtime;\n readonly context: Context;\n readonly controller = new AbortController();\n readonly issued = new Map<number, CodemodeHostCall>();\n readonly steps = new Set<Promise<void>>();\n readonly deferred: CodemodeHostCall[] = [];\n readonly queue: (() => void)[] = [];\n journal: Entry[] = [];\n start: Start = { startedAt: 0, seed: 0, fingerprint: null, count: 0, firstIssued: null };\n record: RunRecord | undefined;\n next = 0;\n idle: { seq: number; issued: number } | null = null;\n agents = 0;\n inflight = 0;\n spent = 0;\n stopped: string | null = null;\n run: CodemodeRun | undefined;\n\n constructor(host: RunHost, runtime: Runtime, context: Context) {\n this.host = host;\n this.runtime = runtime;\n this.context = context;\n this.id = String(runtime.taskId);\n }\n\n get scoped(): Context {\n return withAbortSignal(this.controller.signal, this.context);\n }\n\n get lanes(): number {\n return (this.record as RunRecord).concurrency;\n }\n\n async load(): Promise<void> {\n this.start = (await this.runtime.snapshot(\n StartDoc,\n this.runtime.taskId,\n this.context\n )) as Start;\n this.record = (await this.runtime.snapshot(WorkflowsDoc, this.context))?.runs[this.id];\n if (!this.record) throw new Error('the run is gone');\n this.spent = this.record.spent;\n for (let seq = 1; seq <= this.start.count; seq++) {\n const entry = await this.runtime.snapshot(\n JournalDoc,\n this.runtime.taskId,\n String(seq),\n this.context\n );\n if (!entry) throw new Error(`the run's journal is missing entry ${seq}`);\n this.journal.push(entry);\n }\n }\n\n halt(reason: string): void {\n this.stopped ??= reason;\n this.controller.abort();\n }\n\n replaying(): boolean {\n return this.next < this.journal.length;\n }\n\n deliver(seq: number, at: number, id: number, outcome: CodemodeOutcome): void {\n if (this.run && !this.run.finished) this.run.deliver(seq, at, id, outcome);\n }\n\n expected(): number | null {\n return this.next === 0\n ? this.start.firstIssued\n : (this.journal[this.next - 1] as Entry).issuedAfter;\n }\n\n pump(): void {\n while (this.replaying()) {\n if (this.idle?.seq !== this.next) return;\n const entry = this.journal[this.next] as Entry;\n const expected = this.expected();\n const call = this.issued.get(entry.id);\n if ((expected !== null && this.idle.issued !== expected) || call?.name !== entry.name) {\n this.halt(DIVERGED);\n return;\n }\n this.next++;\n this.deliver(this.next, entry.at, entry.id, entry.outcome as CodemodeOutcome);\n }\n for (const call of this.deferred.splice(0)) this.launch(call);\n }\n\n handle(event: Event): void {\n if (event.kind === 'started') {\n void this.fingerprint(event.fingerprint).catch(() => undefined);\n return;\n }\n if (event.kind === 'idle') {\n this.idle = { seq: event.seq, issued: event.issued };\n void this.acknowledge(event.seq, event.issued).catch(() => undefined);\n this.pump();\n return;\n }\n this.issued.set(event.call.id, event.call);\n if (event.call.name === '__agent') this.agents++;\n if (!this.replaying()) this.launch(event.call);\n else if (!this.journal.some((entry) => entry.id === event.call.id))\n this.deferred.push(event.call);\n }\n\n async acknowledge(seq: number, issued: number): Promise<void> {\n if (seq === 0 && this.start.firstIssued !== null) return;\n if (seq > 0 && seq <= this.journal.length) return;\n await this.runtime.commit(async (tx) => {\n if (seq === 0) (await tx.doc(StartDoc, this.runtime.taskId)).firstIssued = issued;\n else (await tx.doc(JournalDoc, this.runtime.taskId, String(seq), null)).issuedAfter = issued;\n return undefined;\n }, this.scoped);\n }\n\n launch(call: CodemodeHostCall): void {\n const step = this.live(call).catch((error) => {\n if (!this.controller.signal.aborted) this.halt((error as Error).message);\n });\n this.steps.add(step);\n void step.finally(() => this.steps.delete(step));\n }\n\n async journalize(\n call: CodemodeHostCall,\n outcome: CodemodeOutcome,\n effect: (record: RunRecord) => void\n ): Promise<void> {\n const at = this.runtime.now();\n let seq = 0;\n await this.runtime.commit(async (tx) => {\n const start = await tx.doc(StartDoc, this.runtime.taskId);\n start.count += 1;\n seq = start.count;\n Object.assign(await tx.doc(JournalDoc, this.runtime.taskId, String(seq), null), {\n id: call.id,\n name: call.name,\n at,\n outcome: outcome as JsonValue,\n issuedAfter: null,\n });\n const record = await runOf(tx, this.id);\n if (record) effect(record);\n return undefined;\n }, this.scoped);\n this.deliver(seq, at, call.id, outcome);\n }\n\n refused(): string | null {\n if (this.agents > MAX_AGENTS) return `agent(): a workflow starts at most ${MAX_AGENTS} agents`;\n const { budget } = this.record as RunRecord;\n if (budget !== null && this.spent >= budget)\n return `agent(): the budget of ${budget} output tokens is spent`;\n return null;\n }\n\n async admit(): Promise<void> {\n if (this.inflight < this.lanes) {\n this.inflight++;\n return;\n }\n await new Promise<void>((resume) => this.queue.push(resume));\n }\n\n free(): void {\n const next = this.queue.shift();\n if (next) next();\n else this.inflight--;\n }\n\n async live(call: CodemodeHostCall): Promise<void> {\n if (call.name !== '__agent')\n return this.journalize(call, { ok: true, value: null }, (record) => noted(record, call.args));\n if (this.agents > MAX_AGENTS)\n return this.journalize(call, { ok: false, message: this.refused() as string }, () => {});\n await this.admit();\n const refused = this.refused();\n let outcome: CodemodeOutcome;\n if (refused) outcome = { ok: false, message: refused };\n else\n try {\n outcome = { ok: true, value: await this.step(call) };\n } catch (error) {\n if (this.controller.signal.aborted) {\n this.free();\n throw error;\n }\n outcome = failure(error);\n }\n const tokens = spentOf(outcome);\n this.spent += tokens;\n this.free();\n return this.journalize(call, outcome, (record) => {\n record.spent += tokens;\n if (refused) return;\n if (outcome.ok) record.agents.done++;\n else record.agents.failed++;\n });\n }\n\n created(call: CodemodeHostCall) {\n return async (tx: Tx, made: Spawned) => {\n Object.assign(await tx.doc(StepDoc, this.runtime.taskId, String(call.id), null), {\n folder: made.folder,\n task: made.tasks[0] as number,\n conversation: made.conversation,\n });\n const current = await runOf(tx, this.id);\n if (current) {\n current.agents.started++;\n current.agents.running.push(`scoop:${made.folder}`);\n }\n };\n }\n\n async spawn(call: CodemodeHostCall, planned: ReturnType<typeof plan>, limits: object) {\n const record = this.record as RunRecord;\n const answer = await this.host.scoops.spawn(\n {\n cone: record.cone,\n kind: 'sync',\n target: null,\n asker: null,\n name: planned.name,\n ...(planned.role ? { role: planned.role } : {}),\n ...(planned.model ? { model: planned.model } : {}),\n ...(planned.thinking ? { thinking: planned.thinking as never } : {}),\n prompts: [planned.prompt],\n fromAgent: record.fromAgent,\n request: `workflow:${this.id}:${call.id}`,\n limits: limits as never,\n taints: record.taints,\n created: this.created(call),\n },\n this.scoped\n );\n if (answer.code !== 0) throw new StepError(answer.out.trim().replace(/^subagent: /, ''));\n return { folder: answer.out.trim(), task: (answer.tasks as number[])[0] as number };\n }\n\n async step(call: CodemodeHostCall): Promise<JsonValue> {\n const host = this.host;\n const roles = await host.roles(this.scoped);\n const planned = plan(call.args as AgentCall, roles);\n const kept = await this.runtime.snapshot(\n StepDoc,\n this.runtime.taskId,\n String(call.id),\n this.scoped\n );\n const step = kept ?? (await this.spawn(call, planned, roles.limits));\n const scoop = `scoop:${step.folder}`;\n try {\n const done = await settle(\n host,\n step.folder,\n step.task,\n planned,\n (task) => waitReport((id, using) => this.runtime.waitForTask(id, using), task, this.scoped),\n this.scoped\n );\n return { value: done.value, outputTokens: done.outputTokens } as unknown as JsonValue;\n } finally {\n await cleanup(host, step.folder);\n await this.runtime\n .commit(async (tx) => {\n const current = await runOf(tx, this.id);\n if (current)\n current.agents.running = current.agents.running.filter((name) => name !== scoop);\n return undefined;\n }, BACKGROUND_CONTEXT)\n .catch(() => undefined);\n }\n }\n\n async fingerprint(value: string): Promise<void> {\n if (this.start.fingerprint === value) return;\n if (this.start.fingerprint !== null) {\n this.halt('the sandbox changed since the run started, so it cannot resume');\n return;\n }\n await this.runtime.commit(async (tx) => {\n (await tx.doc(StartDoc, this.runtime.taskId)).fingerprint = value;\n return undefined;\n }, this.scoped);\n }\n\n async execute(code: string): Promise<CodemodeResult> {\n const abort = () => this.controller.abort();\n this.runtime.signal.addEventListener('abort', abort, { once: true });\n this.context.abortSignal?.addEventListener('abort', abort, { once: true });\n const early: Event[] = [];\n let ready = false;\n const emit = (event: Event) => {\n if (ready) this.handle(event);\n else early.push(event);\n };\n const run = this.host.engine().start(code, {\n startedAt: this.start.startedAt,\n seed: this.start.seed,\n globals: GLOBALS,\n signal: this.controller.signal,\n onStarted: (fingerprint) => emit({ kind: 'started', fingerprint }),\n onCall: (call) => emit({ kind: 'call', call }),\n onIdle: (seq, issued) => emit({ kind: 'idle', seq, issued }),\n });\n this.run = run;\n ready = true;\n for (const event of early.splice(0)) this.handle(event);\n const result = await run.result;\n if (this.replaying()) this.halt(DIVERGED);\n this.controller.abort();\n await Promise.allSettled([...this.steps]);\n return result;\n }\n}\n\nfunction seed(): number {\n return crypto.getRandomValues(new Uint32Array(1))[0] as number;\n}\n\nasync function finish(\n runtime: Runtime,\n driver: Driver,\n result: CodemodeResult,\n context: Context\n): Promise<void> {\n const error = driver.stopped ?? (result.ok ? null : errorText(result));\n await runtime.commit(async (tx) => {\n const record = await runOf(tx, String(runtime.taskId));\n if (record) {\n record.status = error === null ? 'completed' : 'failed';\n record.ended = runtime.now();\n record.agents.running = [];\n if (error === null) record.result = (result.ok ? (result.value ?? null) : null) as never;\n else record.error = error;\n }\n return { status: 'terminal', outcome: { status: 'completed', result: null } };\n }, context);\n}\n\nexport function runTask(lookup: Lookup) {\n return defineTask<RunInput, RunState, null>({\n name: 'slicc.workflow-run',\n version: 1,\n initial: () => ({ phase: 'start' }),\n phases: {\n start: (_task, runtime, context) =>\n runtime.commit(async (tx) => {\n Object.assign(await tx.doc(StartDoc, runtime.taskId), {\n startedAt: runtime.now(),\n seed: seed(),\n });\n return { status: 'running', checkpoint: { phase: 'run' } };\n }, context),\n async run(task, runtime, context) {\n const driver = new Driver(await lookup(), runtime, context);\n await driver.load();\n const result = await driver.execute(task.input.code);\n if (runtime.signal.aborted || context.abortSignal?.aborted) return;\n await finish(runtime, driver, result, context);\n },\n },\n async abort(_task, runtime, context) {\n const host = await lookup();\n const id = String(runtime.taskId);\n const record = (await runtime.snapshot(WorkflowsDoc, context))?.runs[id];\n for (const scoop of record?.agents.running ?? [])\n await cleanup(host, scoop.slice('scoop:'.length));\n await runtime.commit(async (tx) => {\n const current = await runOf(tx, id);\n if (current) {\n current.status = 'stopped';\n current.ended = runtime.now();\n current.agents.running = [];\n }\n return { status: 'terminal', outcome: { status: 'aborted' } };\n }, context);\n },\n });\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { Context, JsonValue } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT, withAbortSignal } from '@earendil-works/chord/context';\nimport type {\n CodemodeHostCall,\n CodemodeOutcome,\n CodemodeResult,\n CodemodeRun,\n CodemodeRunOptions,\n} from '@earendil-works/pi-codemode';\nimport {\n defineDoc,\n defineDocFamily,\n defineTask,\n type TaskRuntime,\n type Tx,\n} from '@earendil-works/pi-durable';\nimport { deltasOnly } from '../checkpoints.ts';\nimport type { InheritedTaint } from '../guests/guard.ts';\nimport type { Spawned } from '../scoops/service.ts';\nimport { MAX_AGENTS } from './script.ts';\nimport {\n type AgentCall,\n cleanup,\n plan,\n StepError,\n type StepHost,\n settle,\n waitReport,\n} from './step.ts';\n\nexport const MAX_LOGS = 200;\nexport const KEPT_RUNS = 50;\n\nexport type RunStatus = 'running' | 'completed' | 'failed' | 'stopped';\n\nexport type RunRecord = {\n id: string;\n name: string;\n description: string;\n cone: string;\n home: string;\n file: string | null;\n source: string;\n budget: number | null;\n concurrency: number;\n status: RunStatus;\n phase: string | null;\n started: number;\n ended: number | null;\n agents: { started: number; done: number; failed: number; running: string[] };\n spent: number;\n logs: string[];\n fromAgent: boolean;\n taints: InheritedTaint[];\n result?: JsonValue;\n error?: string;\n};\n\nexport const WorkflowsDoc = defineDoc<{ runs: Record<string, RunRecord> }>({\n kind: 'slicc.workflows',\n checkpointWhen: deltasOnly,\n version: 1,\n scope: 'session',\n initial: () => ({ runs: {} }),\n});\n\ntype Start = {\n startedAt: number;\n seed: number;\n fingerprint: string | null;\n count: number;\n firstIssued: number | null;\n};\n\nconst StartDoc = defineDoc<Start>({\n kind: 'slicc.workflow.start',\n checkpointWhen: deltasOnly,\n version: 1,\n scope: 'task',\n initial: () => ({ startedAt: 0, seed: 0, fingerprint: null, count: 0, firstIssued: null }),\n});\n\ntype Entry = {\n id: number;\n name: string;\n at: number;\n outcome: JsonValue;\n issuedAfter: number | null;\n};\n\nconst JournalDoc = defineDocFamily<Entry, null>({\n kind: 'slicc.workflow.journal',\n checkpointWhen: deltasOnly,\n version: 1,\n scope: 'task',\n family: true,\n initial: () => ({ id: 0, name: '', at: 0, outcome: null, issuedAfter: null }),\n});\n\ntype Step = { folder: string; task: number; conversation: number };\n\nconst StepDoc = defineDocFamily<Step, null>({\n kind: 'slicc.workflow.step',\n checkpointWhen: deltasOnly,\n version: 1,\n scope: 'task',\n family: true,\n initial: () => ({ folder: '', task: 0, conversation: 0 }),\n});\n\nexport interface Engine {\n start(code: string, options: CodemodeRunOptions): CodemodeRun;\n}\n\nexport interface RunHost extends StepHost {\n engine: () => Engine;\n}\n\ntype Lookup = () => Promise<RunHost>;\ntype RunInput = { code: string };\ntype RunState = { phase: 'start' } | { phase: 'run' };\n\nexport const GLOBALS = [{ name: '__agent' }, { name: '__notify' }];\n\nexport const DIVERGED =\n 'the workflow took another path than before the restart, so it cannot resume';\n\nfunction addLog(record: RunRecord, line: string): void {\n record.logs.push(line);\n if (record.logs.length > MAX_LOGS) record.logs.splice(0, record.logs.length - MAX_LOGS);\n}\n\nexport function noted(record: RunRecord, args: unknown): void {\n const { kind, text } = (args ?? {}) as { kind?: string; text?: unknown };\n const line = String(text ?? '');\n if (kind === 'phase') {\n record.phase = line;\n addLog(record, `phase: ${line}`);\n } else addLog(record, line);\n}\n\nfunction failure(error: unknown): CodemodeOutcome {\n const tokens = error instanceof StepError ? error.outputTokens : 0;\n return {\n ok: false,\n message: error instanceof Error ? error.message : String(error),\n properties: { outputTokens: tokens },\n };\n}\n\nfunction spentOf(outcome: CodemodeOutcome): number {\n const value = outcome.ok ? outcome.value : outcome.properties;\n const tokens = (value as { outputTokens?: unknown } | undefined)?.outputTokens;\n return typeof tokens === 'number' ? tokens : 0;\n}\n\nexport function errorText(result: CodemodeResult): string {\n if (result.ok) return '';\n const { error } = result;\n return error.kind === 'script' ? error.message : `${error.kind}: ${error.message}`;\n}\n\ntype Runtime = TaskRuntime<RunInput, RunState, null, object>;\n\nasync function runOf(tx: Tx, id: string): Promise<RunRecord | undefined> {\n return (await tx.doc(WorkflowsDoc)).runs[id] as RunRecord | undefined;\n}\n\ntype Event =\n | { kind: 'call'; call: CodemodeHostCall }\n | { kind: 'idle'; seq: number; issued: number }\n | { kind: 'started'; fingerprint: string };\n\nexport class Driver {\n readonly id: string;\n readonly host: RunHost;\n readonly runtime: Runtime;\n readonly context: Context;\n readonly controller = new AbortController();\n readonly issued = new Map<number, CodemodeHostCall>();\n readonly steps = new Set<Promise<void>>();\n readonly deferred: CodemodeHostCall[] = [];\n readonly queue: (() => void)[] = [];\n journal: Entry[] = [];\n start: Start = { startedAt: 0, seed: 0, fingerprint: null, count: 0, firstIssued: null };\n record: RunRecord | undefined;\n next = 0;\n idle: { seq: number; issued: number } | null = null;\n agents = 0;\n inflight = 0;\n spent = 0;\n stopped: string | null = null;\n run: CodemodeRun | undefined;\n\n constructor(host: RunHost, runtime: Runtime, context: Context) {\n this.host = host;\n this.runtime = runtime;\n this.context = context;\n this.id = String(runtime.taskId);\n }\n\n get scoped(): Context {\n return withAbortSignal(this.controller.signal, this.context);\n }\n\n get lanes(): number {\n return (this.record as RunRecord).concurrency;\n }\n\n async load(): Promise<void> {\n this.start = (await this.runtime.snapshot(\n StartDoc,\n this.runtime.taskId,\n this.context\n )) as Start;\n this.record = (await this.runtime.snapshot(WorkflowsDoc, this.context))?.runs[this.id];\n if (!this.record) throw new Error('the run is gone');\n this.spent = this.record.spent;\n for (let seq = 1; seq <= this.start.count; seq++) {\n const entry = await this.runtime.snapshot(\n JournalDoc,\n this.runtime.taskId,\n String(seq),\n this.context\n );\n if (!entry) throw new Error(`the run's journal is missing entry ${seq}`);\n this.journal.push(entry);\n }\n }\n\n halt(reason: string): void {\n this.stopped ??= reason;\n this.controller.abort();\n }\n\n replaying(): boolean {\n return this.next < this.journal.length;\n }\n\n deliver(seq: number, at: number, id: number, outcome: CodemodeOutcome): void {\n if (this.run && !this.run.finished) this.run.deliver(seq, at, id, outcome);\n }\n\n expected(): number | null {\n return this.next === 0\n ? this.start.firstIssued\n : (this.journal[this.next - 1] as Entry).issuedAfter;\n }\n\n pump(): void {\n while (this.replaying()) {\n if (this.idle?.seq !== this.next) return;\n const entry = this.journal[this.next] as Entry;\n const expected = this.expected();\n const call = this.issued.get(entry.id);\n if ((expected !== null && this.idle.issued !== expected) || call?.name !== entry.name) {\n this.halt(DIVERGED);\n return;\n }\n this.next++;\n this.deliver(this.next, entry.at, entry.id, entry.outcome as CodemodeOutcome);\n }\n for (const call of this.deferred.splice(0)) this.launch(call);\n }\n\n handle(event: Event): void {\n if (event.kind === 'started') {\n void this.fingerprint(event.fingerprint).catch(() => undefined);\n return;\n }\n if (event.kind === 'idle') {\n this.idle = { seq: event.seq, issued: event.issued };\n void this.acknowledge(event.seq, event.issued).catch(() => undefined);\n this.pump();\n return;\n }\n this.issued.set(event.call.id, event.call);\n if (event.call.name === '__agent') this.agents++;\n if (!this.replaying()) this.launch(event.call);\n else if (!this.journal.some((entry) => entry.id === event.call.id))\n this.deferred.push(event.call);\n }\n\n async acknowledge(seq: number, issued: number): Promise<void> {\n if (seq === 0 && this.start.firstIssued !== null) return;\n if (seq > 0 && seq <= this.journal.length) return;\n await this.runtime.commit(async (tx) => {\n if (seq === 0) (await tx.doc(StartDoc, this.runtime.taskId)).firstIssued = issued;\n else (await tx.doc(JournalDoc, this.runtime.taskId, String(seq), null)).issuedAfter = issued;\n return undefined;\n }, this.scoped);\n }\n\n launch(call: CodemodeHostCall): void {\n const step = this.live(call).catch((error) => {\n if (!this.controller.signal.aborted) this.halt((error as Error).message);\n });\n this.steps.add(step);\n void step.finally(() => this.steps.delete(step));\n }\n\n async journalize(\n call: CodemodeHostCall,\n outcome: CodemodeOutcome,\n effect: (record: RunRecord) => void\n ): Promise<void> {\n const at = this.runtime.now();\n let seq = 0;\n await this.runtime.commit(async (tx) => {\n const start = await tx.doc(StartDoc, this.runtime.taskId);\n start.count += 1;\n seq = start.count;\n Object.assign(await tx.doc(JournalDoc, this.runtime.taskId, String(seq), null), {\n id: call.id,\n name: call.name,\n at,\n outcome: outcome as JsonValue,\n issuedAfter: null,\n });\n const record = await runOf(tx, this.id);\n if (record) effect(record);\n return undefined;\n }, this.scoped);\n this.deliver(seq, at, call.id, outcome);\n }\n\n refused(): string | null {\n if (this.agents > MAX_AGENTS) return `agent(): a workflow starts at most ${MAX_AGENTS} agents`;\n const { budget } = this.record as RunRecord;\n if (budget !== null && this.spent >= budget)\n return `agent(): the budget of ${budget} output tokens is spent`;\n return null;\n }\n\n async admit(): Promise<void> {\n if (this.inflight < this.lanes) {\n this.inflight++;\n return;\n }\n await new Promise<void>((resume) => this.queue.push(resume));\n }\n\n free(): void {\n const next = this.queue.shift();\n if (next) next();\n else this.inflight--;\n }\n\n async live(call: CodemodeHostCall): Promise<void> {\n if (call.name !== '__agent')\n return this.journalize(call, { ok: true, value: null }, (record) => noted(record, call.args));\n if (this.agents > MAX_AGENTS)\n return this.journalize(call, { ok: false, message: this.refused() as string }, () => {});\n await this.admit();\n const refused = this.refused();\n let outcome: CodemodeOutcome;\n if (refused) outcome = { ok: false, message: refused };\n else\n try {\n outcome = { ok: true, value: await this.step(call) };\n } catch (error) {\n if (this.controller.signal.aborted) {\n this.free();\n throw error;\n }\n outcome = failure(error);\n }\n const tokens = spentOf(outcome);\n this.spent += tokens;\n this.free();\n return this.journalize(call, outcome, (record) => {\n record.spent += tokens;\n if (refused) return;\n if (outcome.ok) record.agents.done++;\n else record.agents.failed++;\n });\n }\n\n created(call: CodemodeHostCall) {\n return async (tx: Tx, made: Spawned) => {\n Object.assign(await tx.doc(StepDoc, this.runtime.taskId, String(call.id), null), {\n folder: made.folder,\n task: made.tasks[0] as number,\n conversation: made.conversation,\n });\n const current = await runOf(tx, this.id);\n if (current) {\n current.agents.started++;\n current.agents.running.push(`scoop:${made.folder}`);\n }\n };\n }\n\n async spawn(call: CodemodeHostCall, planned: ReturnType<typeof plan>, limits: object) {\n const record = this.record as RunRecord;\n const answer = await this.host.scoops.spawn(\n {\n cone: record.cone,\n kind: 'sync',\n target: null,\n asker: null,\n name: planned.name,\n ...(planned.role ? { role: planned.role } : {}),\n ...(planned.model ? { model: planned.model } : {}),\n ...(planned.thinking ? { thinking: planned.thinking as never } : {}),\n prompts: [planned.prompt],\n fromAgent: record.fromAgent,\n request: `workflow:${this.id}:${call.id}`,\n limits: limits as never,\n taints: record.taints,\n created: this.created(call),\n },\n this.scoped\n );\n if (answer.code !== 0) throw new StepError(answer.out.trim().replace(/^subagent: /, ''));\n return { folder: answer.out.trim(), task: (answer.tasks as number[])[0] as number };\n }\n\n async step(call: CodemodeHostCall): Promise<JsonValue> {\n const host = this.host;\n const roles = await host.roles(this.scoped);\n const planned = plan(call.args as AgentCall, roles);\n const kept = await this.runtime.snapshot(\n StepDoc,\n this.runtime.taskId,\n String(call.id),\n this.scoped\n );\n const step = kept ?? (await this.spawn(call, planned, roles.limits));\n const scoop = `scoop:${step.folder}`;\n try {\n const done = await settle(\n host,\n step.folder,\n step.task,\n planned,\n (task) => waitReport((id, using) => this.runtime.waitForTask(id, using), task, this.scoped),\n this.scoped\n );\n return { value: done.value, outputTokens: done.outputTokens } as unknown as JsonValue;\n } finally {\n await cleanup(host, step.folder);\n await this.runtime\n .commit(async (tx) => {\n const current = await runOf(tx, this.id);\n if (current)\n current.agents.running = current.agents.running.filter((name) => name !== scoop);\n return undefined;\n }, BACKGROUND_CONTEXT)\n .catch(() => undefined);\n }\n }\n\n async fingerprint(value: string): Promise<void> {\n if (this.start.fingerprint === value) return;\n if (this.start.fingerprint !== null) {\n this.halt('the sandbox changed since the run started, so it cannot resume');\n return;\n }\n await this.runtime.commit(async (tx) => {\n (await tx.doc(StartDoc, this.runtime.taskId)).fingerprint = value;\n return undefined;\n }, this.scoped);\n }\n\n async execute(code: string): Promise<CodemodeResult> {\n const abort = () => this.controller.abort();\n this.runtime.signal.addEventListener('abort', abort, { once: true });\n this.context.abortSignal?.addEventListener('abort', abort, { once: true });\n const early: Event[] = [];\n let ready = false;\n const emit = (event: Event) => {\n if (ready) this.handle(event);\n else early.push(event);\n };\n const run = this.host.engine().start(code, {\n startedAt: this.start.startedAt,\n seed: this.start.seed,\n globals: GLOBALS,\n signal: this.controller.signal,\n onStarted: (fingerprint) => emit({ kind: 'started', fingerprint }),\n onCall: (call) => emit({ kind: 'call', call }),\n onIdle: (seq, issued) => emit({ kind: 'idle', seq, issued }),\n });\n this.run = run;\n ready = true;\n for (const event of early.splice(0)) this.handle(event);\n const result = await run.result;\n if (this.replaying()) this.halt(DIVERGED);\n this.controller.abort();\n await Promise.allSettled([...this.steps]);\n return result;\n }\n}\n\nfunction seed(): number {\n return crypto.getRandomValues(new Uint32Array(1))[0] as number;\n}\n\nasync function finish(\n runtime: Runtime,\n driver: Driver,\n result: CodemodeResult,\n context: Context\n): Promise<void> {\n const error = driver.stopped ?? (result.ok ? null : errorText(result));\n await runtime.commit(async (tx) => {\n const record = await runOf(tx, String(runtime.taskId));\n if (record) {\n record.status = error === null ? 'completed' : 'failed';\n record.ended = runtime.now();\n record.agents.running = [];\n if (error === null) record.result = (result.ok ? (result.value ?? null) : null) as never;\n else record.error = error;\n }\n return { status: 'terminal', outcome: { status: 'completed', result: null } };\n }, context);\n}\n\nexport function runTask(lookup: Lookup) {\n return defineTask<RunInput, RunState, null>({\n name: 'slicc.workflow-run',\n version: 1,\n initial: () => ({ phase: 'start' }),\n phases: {\n start: (_task, runtime, context) =>\n runtime.commit(async (tx) => {\n Object.assign(await tx.doc(StartDoc, runtime.taskId), {\n startedAt: runtime.now(),\n seed: seed(),\n });\n return { status: 'running', checkpoint: { phase: 'run' } };\n }, context),\n async run(task, runtime, context) {\n const driver = new Driver(await lookup(), runtime, context);\n await driver.load();\n const result = await driver.execute(task.input.code);\n if (runtime.signal.aborted || context.abortSignal?.aborted) return;\n await finish(runtime, driver, result, context);\n },\n },\n async abort(_task, runtime, context) {\n const host = await lookup();\n const id = String(runtime.taskId);\n const record = (await runtime.snapshot(WorkflowsDoc, context))?.runs[id];\n for (const scoop of record?.agents.running ?? [])\n await cleanup(host, scoop.slice('scoop:'.length));\n await runtime.commit(async (tx) => {\n const current = await runOf(tx, id);\n if (current) {\n current.status = 'stopped';\n current.ended = runtime.now();\n current.agents.running = [];\n }\n return { status: 'terminal', outcome: { status: 'aborted' } };\n }, context);\n },\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-ecoverse/slicc-agent",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.1.0",
|
|
4
4
|
"description": "SLICC's agent core on pi durable: an agent worker, session storage, remoting and pi extensions",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
},
|
|
14
14
|
"fledgling": {
|
|
15
15
|
"provider": "github",
|
|
16
|
-
"workflow": "
|
|
16
|
+
"workflow": "ci.yml",
|
|
17
17
|
"repo": "ai-ecoverse/slicc-agent",
|
|
18
18
|
"publish": true
|
|
19
19
|
},
|
|
@@ -65,10 +65,10 @@
|
|
|
65
65
|
"release": "semantic-release"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
|
-
"@ai-ecoverse/slicc-kernel": "1.146.
|
|
68
|
+
"@ai-ecoverse/slicc-kernel": "1.146.2",
|
|
69
69
|
"@ai-ecoverse/slicc-scrub": "1.0.0",
|
|
70
|
-
"@ai-ecoverse/slicc-shared-web": "
|
|
71
|
-
"@ai-ecoverse/slicc-spectrum": "1.
|
|
70
|
+
"@ai-ecoverse/slicc-shared-web": "2.10.2",
|
|
71
|
+
"@ai-ecoverse/slicc-spectrum": "1.107.0",
|
|
72
72
|
"@ai-ecoverse/wasi-fnox": "1.39.0-6",
|
|
73
73
|
"@ai-ecoverse/wasm-bash": "5.3.0-23",
|
|
74
74
|
"@ai-ecoverse/wasm-coreutils": "9.12.0-15",
|
|
@@ -86,13 +86,13 @@
|
|
|
86
86
|
},
|
|
87
87
|
"dependencies": {
|
|
88
88
|
"@ai-ecoverse/slicc-browsers": "1.18.7",
|
|
89
|
-
"@ai-ecoverse/slicc-vault": "1.
|
|
89
|
+
"@ai-ecoverse/slicc-vault": "1.16.0",
|
|
90
90
|
"@aws-sdk/middleware-websocket": "^3.972.54",
|
|
91
|
-
"@earendil-works/chord": "1.
|
|
92
|
-
"@earendil-works/pi-ai": "1.
|
|
93
|
-
"@earendil-works/pi-codemode": "1.
|
|
94
|
-
"@earendil-works/pi-durable": "1.
|
|
95
|
-
"@earendil-works/pi-mcp": "1.
|
|
91
|
+
"@earendil-works/chord": "1.4.0",
|
|
92
|
+
"@earendil-works/pi-ai": "1.4.0",
|
|
93
|
+
"@earendil-works/pi-codemode": "1.4.0",
|
|
94
|
+
"@earendil-works/pi-durable": "1.4.0",
|
|
95
|
+
"@earendil-works/pi-mcp": "1.4.0",
|
|
96
96
|
"@sqlite.org/sqlite-wasm": "3.53.4-build2",
|
|
97
97
|
"typebox": "1.3.37"
|
|
98
98
|
},
|