@ai-ecoverse/slicc-agent 7.4.0 → 7.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +1 -1
  2. package/dist/agents.js +2 -2
  3. package/dist/agents.js.map +2 -2
  4. package/dist/approvals/policy.js +2 -2
  5. package/dist/approvals/policy.js.map +2 -2
  6. package/dist/approvals/record.js +2 -2
  7. package/dist/approvals/record.js.map +2 -2
  8. package/dist/checkpoints.js +4 -0
  9. package/dist/checkpoints.js.map +2 -2
  10. package/dist/codemode/index.js +2 -2
  11. package/dist/codemode/index.js.map +2 -2
  12. package/dist/cone.js +2 -2
  13. package/dist/cone.js.map +2 -2
  14. package/dist/guests/guard.js +3 -3
  15. package/dist/guests/guard.js.map +2 -2
  16. package/dist/guests/review.js +2 -2
  17. package/dist/guests/review.js.map +2 -2
  18. package/dist/guests/scoop.js +3 -3
  19. package/dist/guests/scoop.js.map +2 -2
  20. package/dist/guests/seats.js +2 -2
  21. package/dist/guests/seats.js.map +2 -2
  22. package/dist/guests/tags.js +2 -2
  23. package/dist/guests/tags.js.map +2 -2
  24. package/dist/licks/boot.js +2 -2
  25. package/dist/licks/boot.js.map +2 -2
  26. package/dist/licks/licks.js +2 -2
  27. package/dist/licks/licks.js.map +2 -2
  28. package/dist/mcp/allow.js +2 -2
  29. package/dist/mcp/allow.js.map +2 -2
  30. package/dist/memory/extract.js +3 -3
  31. package/dist/memory/extract.js.map +2 -2
  32. package/dist/scoops/service.js +2 -2
  33. package/dist/scoops/service.js.map +2 -2
  34. package/dist/secrets/legacy.js +2 -2
  35. package/dist/secrets/legacy.js.map +2 -2
  36. package/dist/selection.js +2 -2
  37. package/dist/selection.js.map +2 -2
  38. package/dist/sprinkles/sprinkles.js +2 -2
  39. package/dist/sprinkles/sprinkles.js.map +2 -2
  40. package/dist/titles/labels.js +2 -2
  41. package/dist/titles/labels.js.map +2 -2
  42. package/dist/types/checkpoints.d.ts +3 -0
  43. package/dist/workflow/run.js +2 -2
  44. package/dist/workflow/run.js.map +2 -2
  45. package/package.json +3 -3
@@ -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 { 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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",
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 { boundedDeltas } 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: boundedDeltas,\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
  }
@@ -1 +1,4 @@
1
+ import type { CheckpointInfo } from '@earendil-works/pi-durable';
2
+ export declare const BASE_EVERY = 64;
1
3
  export declare const deltasOnly: () => boolean;
4
+ export declare const boundedDeltas: (_value: unknown, _ops: unknown, info: CheckpointInfo) => boolean;
@@ -4,7 +4,7 @@ import {
4
4
  defineDocFamily,
5
5
  defineTask
6
6
  } from "@earendil-works/pi-durable";
7
- import { deltasOnly } from "../checkpoints.js";
7
+ import { boundedDeltas, deltasOnly } from "../checkpoints.js";
8
8
  import { MAX_AGENTS } from "./script.js";
9
9
  import {
10
10
  cleanup,
@@ -17,7 +17,7 @@ const MAX_LOGS = 200;
17
17
  const KEPT_RUNS = 50;
18
18
  const WorkflowsDoc = defineDoc({
19
19
  kind: "slicc.workflows",
20
- checkpointWhen: deltasOnly,
20
+ checkpointWhen: boundedDeltas,
21
21
  version: 1,
22
22
  scope: "session",
23
23
  initial: () => ({ runs: {} })
@@ -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 { 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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",
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 { boundedDeltas, 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: boundedDeltas,\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": "7.4.0",
3
+ "version": "7.4.2",
4
4
  "description": "SLICC's agent core on pi durable: an agent worker, session storage, remoting and pi extensions",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -65,7 +65,7 @@
65
65
  "release": "semantic-release"
66
66
  },
67
67
  "devDependencies": {
68
- "@ai-ecoverse/slicc-kernel": "1.146.7",
68
+ "@ai-ecoverse/slicc-kernel": "1.147.3",
69
69
  "@ai-ecoverse/slicc-scrub": "1.0.0",
70
70
  "@ai-ecoverse/slicc-shared-web": "2.10.4",
71
71
  "@ai-ecoverse/slicc-spectrum": "1.107.1",
@@ -86,7 +86,7 @@
86
86
  },
87
87
  "dependencies": {
88
88
  "@ai-ecoverse/slicc-browsers": "1.18.10",
89
- "@ai-ecoverse/slicc-vault": "1.16.0",
89
+ "@ai-ecoverse/slicc-vault": "1.16.1",
90
90
  "@aws-sdk/middleware-websocket": "^3.972.54",
91
91
  "@earendil-works/chord": "1.4.0",
92
92
  "@earendil-works/pi-ai": "1.4.0",