@alquimia-ai/tools 2.7.0 → 2.8.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.
Files changed (63) hide show
  1. package/README.md +88 -12
  2. package/dist/actions/index.d.mts +1 -1
  3. package/dist/actions/index.d.ts +1 -1
  4. package/dist/adapters/fetch.d.mts +1 -0
  5. package/dist/adapters/fetch.d.ts +1 -0
  6. package/dist/adapters/fetch.js +4 -0
  7. package/dist/adapters/fetch.js.map +1 -1
  8. package/dist/adapters/fetch.mjs +4 -0
  9. package/dist/adapters/fetch.mjs.map +1 -1
  10. package/dist/adapters/index.d.mts +1 -0
  11. package/dist/adapters/index.d.ts +1 -0
  12. package/dist/adapters/index.js.map +1 -1
  13. package/dist/adapters/next.d.mts +1 -0
  14. package/dist/adapters/next.d.ts +1 -0
  15. package/dist/adapters/next.js +4 -0
  16. package/dist/adapters/next.js.map +1 -1
  17. package/dist/adapters/next.mjs +4 -0
  18. package/dist/adapters/next.mjs.map +1 -1
  19. package/dist/approvals-CcnmqUkQ.d.ts +59 -0
  20. package/dist/approvals-dn4sd_Ot.d.mts +59 -0
  21. package/dist/hooks/index.d.mts +36 -5
  22. package/dist/hooks/index.d.ts +36 -5
  23. package/dist/hooks/index.js +208 -12
  24. package/dist/hooks/index.js.map +1 -1
  25. package/dist/hooks/index.mjs +208 -12
  26. package/dist/hooks/index.mjs.map +1 -1
  27. package/dist/next/index.d.mts +7 -0
  28. package/dist/next/index.d.ts +7 -0
  29. package/dist/next/index.js +56 -40
  30. package/dist/next/index.js.map +1 -1
  31. package/dist/next/index.mjs +56 -40
  32. package/dist/next/index.mjs.map +1 -1
  33. package/dist/providers/index.d.mts +3 -3
  34. package/dist/providers/index.d.ts +3 -3
  35. package/dist/{providers-mx21gNgZ.d.ts → providers-J_Z9rQ3Q.d.ts} +1 -1
  36. package/dist/{providers-B4IOiGfr.d.mts → providers-YKiEag2L.d.mts} +1 -1
  37. package/dist/proxy.d.mts +2 -0
  38. package/dist/proxy.d.ts +2 -0
  39. package/dist/proxy.js +47 -40
  40. package/dist/proxy.js.map +1 -1
  41. package/dist/proxy.mjs +47 -40
  42. package/dist/proxy.mjs.map +1 -1
  43. package/dist/sdk/index.d.mts +25 -3
  44. package/dist/sdk/index.d.ts +25 -3
  45. package/dist/sdk/index.js +73 -10
  46. package/dist/sdk/index.js.map +1 -1
  47. package/dist/sdk/index.mjs +73 -10
  48. package/dist/sdk/index.mjs.map +1 -1
  49. package/dist/services/index.d.mts +1 -1
  50. package/dist/services/index.d.ts +1 -1
  51. package/dist/{type-D-JaSMkV.d.ts → type-BFtGEEb4.d.ts} +1 -1
  52. package/dist/{type-61gaZga-.d.mts → type-C_sKpIM1.d.mts} +1 -1
  53. package/dist/types/index.d.mts +23 -2
  54. package/dist/types/index.d.ts +23 -2
  55. package/dist/utils/index.d.mts +1 -1
  56. package/dist/utils/index.d.ts +1 -1
  57. package/dist/worklog/index.d.mts +1 -0
  58. package/dist/worklog/index.d.ts +1 -0
  59. package/dist/worklog/index.js +75 -2
  60. package/dist/worklog/index.js.map +1 -1
  61. package/dist/worklog/index.mjs +75 -2
  62. package/dist/worklog/index.mjs.map +1 -1
  63. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/worklog/index.ts","../../src/worklog/types.ts","../../src/worklog/registry.ts","../../src/worklog/reducer.ts","../../src/worklog/use-worklog.ts","../../src/worklog/from-frame.ts"],"sourcesContent":["export * from \"./types\";\nexport { EVENT_REGISTRY, resolveInterpreter } from \"./registry\";\nexport { reduceWorklog, foldWorklog } from \"./reducer\";\nexport { useWorklog } from \"./use-worklog\";\nexport { frameToRecord, type RawFrame } from \"./from-frame\";\n","/** One granular Runtime worklog record (a `bus_mode` SSE frame or a `/worklog/{task_id}/events` item). */\nexport interface WorklogRecord {\n /** Runtime v0.5.0+ tamper-evident hash chain fields (optional on SSE frames). */\n entry_hash?: string | null;\n previous_hash?: string | null;\n event_class: string;\n control_id: string | null;\n data: unknown;\n status: \"success\" | \"error\" | null;\n date_submitted: string;\n}\n\n/** Runtime v0.5.0 worklog audit summary returned by `GET /worklog/`. */\nexport interface WorklogSummary {\n task_id: string;\n parent_task_id?: string | null;\n session_id?: string | null;\n user_id?: string | null;\n assistant_id?: string | null;\n agentspace_id?: string | null;\n channel_id?: string | null;\n depth?: number;\n final_status?: string | null;\n started_at: string;\n finished_at?: string | null;\n}\n\n/** Runtime v0.5.0 full worklog detail returned by `GET /worklog/{task_id}`. */\nexport interface WorklogDetail extends WorklogSummary {\n final_result?: string | null;\n error_message?: string | null;\n}\n\n/** Runtime v0.5.0 single worklog event returned by `GET /worklog/{task_id}/events`. */\nexport interface WorklogEventDetail {\n id: number;\n task_id: string;\n previous_hash?: string | null;\n entry_hash?: string | null;\n event_class: string;\n control_id?: string | null;\n status?: string | null;\n data?: unknown;\n submitted_at: string;\n}\n\n/** Runtime v0.5.0 paginated list of worklog summaries. */\nexport interface WorklogPage {\n items: WorklogSummary[];\n total: number;\n limit: number;\n offset: number;\n}\n\n/** Runtime v0.5.0 paginated list of worklog events for a single task. */\nexport interface WorklogEventPage {\n task_id: string;\n items: WorklogEventDetail[];\n total: number;\n}\n\n/** Runtime v0.5.0 hash-chain verification result returned by `GET /worklog/{task_id}/verify`. */\nexport interface WorklogVerificationResult {\n valid: boolean;\n task_id: string;\n event_count: number;\n first_broken_event_id?: number | null;\n first_broken_index?: number | null;\n expected_hash?: string | null;\n actual_hash?: string | null;\n message: string;\n}\n\n/** Semantic bucket a node belongs to. */\nexport type NodeKind =\n | \"safeguard\"\n | \"reasoning\"\n | \"tool\"\n | \"a2a\"\n | \"memory\"\n | \"knowledge\"\n | \"speech\"\n | \"answer\"\n | \"unknown\";\n\n/** Lifecycle state of a single node. */\nexport type NodeStatus = \"pending\" | \"running\" | \"completed\" | \"failed\" | \"skipped\";\n\n/** Overall run status. */\nexport type RunStatus = \"idle\" | \"running\" | \"success\" | \"error\";\n\n/** A single step in the execution chain (command + its response merged by control_id). */\nexport interface WorklogNode {\n id: string;\n kind: NodeKind;\n eventClass: string;\n status: NodeStatus;\n title: string;\n startedAt?: string;\n endedAt?: string;\n depth: number;\n parentId?: string;\n children: WorklogNode[];\n command?: unknown;\n response?: unknown;\n error?: string;\n raw: WorklogRecord[];\n}\n\n/** Normalized execution model produced by the reducer. */\nexport interface WorklogState {\n taskId: string | null;\n status: RunStatus;\n answer: string | null;\n nodes: WorklogNode[];\n index: Record<string, number>;\n raw: WorklogRecord[];\n}\n\n/** How a record acts on the model. */\nexport type EventRole = \"open\" | \"close\" | \"run-open\" | \"run-close\" | \"ignore\";\n\n/** Registry descriptor for one event_class. */\nexport interface EventInterpreter {\n kind: NodeKind;\n role: EventRole;\n title: (_record: WorklogRecord) => string;\n /** If true, an opened node starts in \"pending\" (awaiting external input) rather than \"running\". */\n pending?: boolean;\n}\n\nexport function initialWorklogState(taskId: string | null = null): WorklogState {\n return { taskId, status: \"idle\", answer: null, nodes: [], index: {}, raw: [] };\n}\n","import type { EventInterpreter, WorklogRecord } from \"./types\";\n\nconst asRecord = (data: unknown): Record<string, unknown> =>\n data && typeof data === \"object\" ? (data as Record<string, unknown>) : {};\n\nconst toolTitle = (r: WorklogRecord): string => {\n const name = asRecord(r.data).name;\n return typeof name === \"string\" && name.length > 0 ? `Tool: ${name}` : \"Tool\";\n};\n\nconst agentTitle = (r: WorklogRecord): string => {\n const name = asRecord(r.data).name;\n return typeof name === \"string\" && name.length > 0 ? `Agent: ${name}` : \"Agent-to-agent\";\n};\n\nconst constTitle = (label: string) => () => label;\n\nconst shieldBlockTitle = (r: WorklogRecord): string => {\n const id = asRecord(r.data).shield_id;\n return typeof id === \"string\" && id.length > 0 ? `Blocked by ${id}` : \"Blocked by safeguard\";\n};\n\nconst knowledgeTitle = (r: WorklogRecord): string => {\n const query = asRecord(r.data).query;\n return typeof query === \"string\" && query.length > 0\n ? `Knowledge: ${query}`\n : \"Knowledge retrieval\";\n};\n\nexport const EVENT_REGISTRY: Record<string, EventInterpreter> = {\n // Run envelope\n AssistantInference: { kind: \"answer\", role: \"run-open\", title: constTitle(\"Inference started\") },\n AssistantInferenceResponse: { kind: \"answer\", role: \"run-close\", title: constTitle(\"Answer\") },\n\n // Safeguard\n ShieldInference: { kind: \"safeguard\", role: \"open\", title: constTitle(\"Safeguard\") },\n ShieldInferenceResponse: { kind: \"safeguard\", role: \"close\", title: constTitle(\"Safeguard\") },\n // Emitted when a shield enforcement decision blocks the request (core 0.5.x).\n // Response-only: the reducer opens it already closed when no command matched.\n ShieldBlockedResponse: { kind: \"safeguard\", role: \"close\", title: shieldBlockTitle },\n\n // Reasoning\n ResponseInference: { kind: \"reasoning\", role: \"open\", title: constTitle(\"Reasoning\") },\n ResponseInferenceResponse: { kind: \"reasoning\", role: \"close\", title: constTitle(\"Reasoning\") },\n\n // Tools (server + subclasses) and their responses\n ServerToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n BuiltinToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n UnknownToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n ClientToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle, pending: true },\n ToolExecutionResponse: { kind: \"tool\", role: \"close\", title: toolTitle },\n BuiltinToolExecutionResponse: { kind: \"tool\", role: \"close\", title: toolTitle },\n\n // Tool schema discovery\n ToolSchema: { kind: \"tool\", role: \"open\", title: constTitle(\"Tool schema\") },\n ToolSchemaResponse: { kind: \"tool\", role: \"close\", title: constTitle(\"Tool schema\") },\n\n // Agent-to-agent\n A2AInference: { kind: \"a2a\", role: \"open\", title: agentTitle },\n AgentDiscovery: { kind: \"a2a\", role: \"open\", title: constTitle(\"Agent discovery\") },\n AgentDiscoveryResponse: { kind: \"a2a\", role: \"close\", title: constTitle(\"Agent discovery\") },\n\n // Knowledge retrieval (RAG) — core 0.5.x\n KnowledgeRetrieval: { kind: \"knowledge\", role: \"open\", title: knowledgeTitle },\n KnowledgeRetrievalResponse: { kind: \"knowledge\", role: \"close\", title: knowledgeTitle },\n\n // Speech pipeline — core 0.5.x\n SpeechTranscription: { kind: \"speech\", role: \"open\", title: constTitle(\"Speech-to-text\") },\n SpeechTranscriptionResponse: { kind: \"speech\", role: \"close\", title: constTitle(\"Speech-to-text\") },\n SpeechSynthesis: { kind: \"speech\", role: \"open\", title: constTitle(\"Text-to-speech\") },\n SpeechSynthesisResponse: { kind: \"speech\", role: \"close\", title: constTitle(\"Text-to-speech\") },\n\n // Memory / persistence\n ContextPersistence: { kind: \"memory\", role: \"open\", title: constTitle(\"Memory persistence\") },\n ContextFlush: { kind: \"memory\", role: \"open\", title: constTitle(\"Memory flush\") },\n ContextFlushResponse: { kind: \"memory\", role: \"close\", title: constTitle(\"Memory flush\") },\n\n // Human approval\n HumanApprovalRequired: {\n kind: \"tool\",\n role: \"open\",\n title: constTitle(\"Human approval required\"),\n pending: true,\n },\n HumanApprovalRequiredResponse: { kind: \"tool\", role: \"close\", title: constTitle(\"Human approval\") },\n};\n\nexport function resolveInterpreter(eventClass: string): EventInterpreter {\n if (Object.prototype.hasOwnProperty.call(EVENT_REGISTRY, eventClass)) {\n return EVENT_REGISTRY[eventClass];\n }\n return {\n kind: \"unknown\",\n role: \"open\",\n title: (r: WorklogRecord) => r.event_class,\n };\n}\n","import { resolveInterpreter } from \"./registry\";\nimport type { EventInterpreter, WorklogNode, WorklogRecord, WorklogState } from \"./types\";\nimport { initialWorklogState } from \"./types\";\n\nconst asString = (v: unknown): string =>\n typeof v === \"string\" ? v : v == null ? \"\" : JSON.stringify(v);\n\nconst nodeDepth = (record: WorklogRecord): number => {\n const d = record.data && typeof record.data === \"object\"\n ? (record.data as Record<string, unknown>).depth\n : undefined;\n return typeof d === \"number\" ? d : 0;\n};\n\nconst makeOpenNode = (record: WorklogRecord, interp: EventInterpreter, id: string): WorklogNode => ({\n id,\n kind: interp.kind,\n eventClass: record.event_class,\n status: interp.pending ? \"pending\" : \"running\",\n title: interp.title(record),\n startedAt: record.date_submitted,\n depth: nodeDepth(record),\n children: [],\n command: record.data,\n raw: [record],\n});\n\nconst makeClosedNode = (record: WorklogRecord, interp: EventInterpreter, id: string): WorklogNode => ({\n id,\n kind: interp.kind,\n eventClass: record.event_class,\n status: record.status === \"error\" ? \"failed\" : \"completed\",\n title: interp.title(record),\n startedAt: record.date_submitted,\n endedAt: record.date_submitted,\n depth: nodeDepth(record),\n children: [],\n response: record.data,\n error: record.status === \"error\" ? asString(record.data) : undefined,\n raw: [record],\n});\n\nexport function reduceWorklog(state: WorklogState, record: WorklogRecord): WorklogState {\n const interp = resolveInterpreter(record.event_class);\n const next: WorklogState = {\n ...state,\n nodes: state.nodes.slice(),\n index: { ...state.index },\n raw: [...state.raw, record],\n };\n\n if (interp.role === \"ignore\") return next;\n\n if (interp.role === \"run-open\") {\n next.status = \"running\";\n return next;\n }\n\n if (interp.role === \"run-close\") {\n next.answer = asString(record.data) || null;\n next.status = record.status === \"error\" ? \"error\" : \"success\";\n return next;\n }\n\n const key = record.control_id ?? `${record.event_class}-${next.raw.length}`;\n\n if (interp.role === \"close\") {\n const pos = Object.prototype.hasOwnProperty.call(next.index, key) ? next.index[key] : undefined;\n if (pos != null) {\n const existing = next.nodes[pos];\n next.nodes[pos] = {\n ...existing,\n status: record.status === \"error\" ? \"failed\" : \"completed\",\n endedAt: record.date_submitted,\n response: record.data,\n error: record.status === \"error\" ? asString(record.data) : existing.error,\n raw: [...existing.raw, record],\n };\n } else {\n // response arrived without a seen command — create it already closed\n next.index[key] = next.nodes.length;\n next.nodes.push(makeClosedNode(record, interp, key));\n }\n if (record.status === \"error\") next.status = \"error\";\n return next;\n }\n\n // role === \"open\"\n const pos = Object.prototype.hasOwnProperty.call(next.index, key) ? next.index[key] : undefined;\n if (pos != null) {\n const existing = next.nodes[pos];\n next.nodes[pos] = { ...existing, raw: [...existing.raw, record] };\n } else {\n next.index[key] = next.nodes.length;\n next.nodes.push(makeOpenNode(record, interp, key));\n }\n return next;\n}\n\nexport function foldWorklog(records: WorklogRecord[], taskId: string | null = null): WorklogState {\n return records.reduce(reduceWorklog, initialWorklogState(taskId));\n}\n","import { useCallback, useReducer } from \"react\";\nimport { reduceWorklog } from \"./reducer\";\nimport { initialWorklogState, type WorklogRecord, type WorklogState } from \"./types\";\n\ntype Action =\n | { type: \"ingest\"; record: WorklogRecord }\n | { type: \"ingestMany\"; records: WorklogRecord[] }\n | { type: \"reset\"; taskId: string | null };\n\nfunction hookReducer(state: WorklogState, action: Action): WorklogState {\n switch (action.type) {\n case \"ingest\":\n return reduceWorklog(state, action.record);\n case \"ingestMany\":\n return action.records.reduce(reduceWorklog, state);\n case \"reset\":\n return initialWorklogState(action.taskId);\n }\n}\n\n/** Live worklog accumulator. Feed it `bus_mode` records via `ingest`; use `foldWorklog` for history. */\nexport function useWorklog(taskId: string | null = null) {\n const [worklog, dispatch] = useReducer(hookReducer, taskId, initialWorklogState);\n\n const ingest = useCallback((record: WorklogRecord) => dispatch({ type: \"ingest\", record }), []);\n const ingestMany = useCallback(\n (records: WorklogRecord[]) => dispatch({ type: \"ingestMany\", records }),\n [],\n );\n const reset = useCallback(\n (id: string | null = null) => dispatch({ type: \"reset\", taskId: id }),\n [],\n );\n\n return { worklog, ingest, ingestMany, reset };\n}\n","import type { WorklogRecord } from \"./types\";\n\n/** Loosely-typed shape of a parsed SSE `data:` frame from the granular Runtime stream. */\nexport interface RawFrame {\n event_class?: string;\n control_id?: string | null;\n data?: unknown;\n status?: string | null;\n date_submitted?: string;\n /** Runtime v0.5.0+ tamper-evident hash chain fields. */\n entry_hash?: string | null;\n previous_hash?: string | null;\n}\n\n/** Normalize a parsed SSE frame into a WorklogRecord (defaults missing fields; never throws). */\nexport function frameToRecord(frame: RawFrame): WorklogRecord {\n const status = frame.status === \"success\" || frame.status === \"error\" ? frame.status : null;\n return {\n event_class: typeof frame.event_class === \"string\" && frame.event_class.length > 0\n ? frame.event_class\n : \"Unknown\",\n control_id: frame.control_id ?? null,\n data: frame.data,\n status,\n date_submitted: typeof frame.date_submitted === \"string\" ? frame.date_submitted : \"\",\n entry_hash: frame.entry_hash ?? null,\n previous_hash: frame.previous_hash ?? null,\n };\n}\n"],"mappings":"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","names":["pos"]}
1
+ {"version":3,"sources":["../../src/worklog/index.ts","../../src/worklog/types.ts","../../src/worklog/registry.ts","../../src/worklog/reducer.ts","../../src/worklog/use-worklog.ts","../../src/worklog/from-frame.ts","../../src/worklog/approvals.ts"],"sourcesContent":["export * from \"./types\";\nexport { EVENT_REGISTRY, resolveInterpreter } from \"./registry\";\nexport { reduceWorklog, foldWorklog } from \"./reducer\";\nexport { useWorklog } from \"./use-worklog\";\nexport { frameToRecord, type RawFrame } from \"./from-frame\";\nexport {\n initialApprovalsState,\n reduceApprovals,\n foldApprovals,\n listApprovals,\n pendingApprovals,\n type ApprovalsState,\n type ApprovalRequest,\n type ApprovalDecision,\n} from \"./approvals\";\n","/** One granular Runtime worklog record (a `bus_mode` SSE frame or a `/worklog/{task_id}/events` item). */\nexport interface WorklogRecord {\n /** Runtime v0.5.0+ tamper-evident hash chain fields (optional on SSE frames). */\n entry_hash?: string | null;\n previous_hash?: string | null;\n event_class: string;\n control_id: string | null;\n data: unknown;\n status: \"success\" | \"error\" | null;\n date_submitted: string;\n}\n\n/** Runtime v0.5.0 worklog audit summary returned by `GET /worklog/`. */\nexport interface WorklogSummary {\n task_id: string;\n parent_task_id?: string | null;\n session_id?: string | null;\n user_id?: string | null;\n assistant_id?: string | null;\n agentspace_id?: string | null;\n channel_id?: string | null;\n depth?: number;\n final_status?: string | null;\n started_at: string;\n finished_at?: string | null;\n}\n\n/** Runtime v0.5.0 full worklog detail returned by `GET /worklog/{task_id}`. */\nexport interface WorklogDetail extends WorklogSummary {\n final_result?: string | null;\n error_message?: string | null;\n}\n\n/** Runtime v0.5.0 single worklog event returned by `GET /worklog/{task_id}/events`. */\nexport interface WorklogEventDetail {\n id: number;\n task_id: string;\n previous_hash?: string | null;\n entry_hash?: string | null;\n event_class: string;\n control_id?: string | null;\n status?: string | null;\n data?: unknown;\n submitted_at: string;\n}\n\n/** Runtime v0.5.0 paginated list of worklog summaries. */\nexport interface WorklogPage {\n items: WorklogSummary[];\n total: number;\n limit: number;\n offset: number;\n}\n\n/** Runtime v0.5.0 paginated list of worklog events for a single task. */\nexport interface WorklogEventPage {\n task_id: string;\n items: WorklogEventDetail[];\n total: number;\n}\n\n/** Runtime v0.5.0 hash-chain verification result returned by `GET /worklog/{task_id}/verify`. */\nexport interface WorklogVerificationResult {\n valid: boolean;\n task_id: string;\n event_count: number;\n first_broken_event_id?: number | null;\n first_broken_index?: number | null;\n expected_hash?: string | null;\n actual_hash?: string | null;\n message: string;\n}\n\n/** Semantic bucket a node belongs to. */\nexport type NodeKind =\n | \"safeguard\"\n | \"reasoning\"\n | \"tool\"\n | \"a2a\"\n | \"memory\"\n | \"knowledge\"\n | \"speech\"\n | \"answer\"\n | \"unknown\";\n\n/** Lifecycle state of a single node. */\nexport type NodeStatus = \"pending\" | \"running\" | \"completed\" | \"failed\" | \"skipped\";\n\n/** Overall run status. */\nexport type RunStatus = \"idle\" | \"running\" | \"success\" | \"error\";\n\n/** A single step in the execution chain (command + its response merged by control_id). */\nexport interface WorklogNode {\n id: string;\n kind: NodeKind;\n eventClass: string;\n status: NodeStatus;\n title: string;\n startedAt?: string;\n endedAt?: string;\n depth: number;\n parentId?: string;\n children: WorklogNode[];\n command?: unknown;\n response?: unknown;\n error?: string;\n raw: WorklogRecord[];\n}\n\n/** Normalized execution model produced by the reducer. */\nexport interface WorklogState {\n taskId: string | null;\n status: RunStatus;\n answer: string | null;\n nodes: WorklogNode[];\n index: Record<string, number>;\n raw: WorklogRecord[];\n}\n\n/** How a record acts on the model. */\nexport type EventRole = \"open\" | \"close\" | \"run-open\" | \"run-close\" | \"ignore\";\n\n/** Registry descriptor for one event_class. */\nexport interface EventInterpreter {\n kind: NodeKind;\n role: EventRole;\n title: (_record: WorklogRecord) => string;\n /** If true, an opened node starts in \"pending\" (awaiting external input) rather than \"running\". */\n pending?: boolean;\n}\n\nexport function initialWorklogState(taskId: string | null = null): WorklogState {\n return { taskId, status: \"idle\", answer: null, nodes: [], index: {}, raw: [] };\n}\n","import type { EventInterpreter, WorklogRecord } from \"./types\";\n\nconst asRecord = (data: unknown): Record<string, unknown> =>\n data && typeof data === \"object\" ? (data as Record<string, unknown>) : {};\n\nconst toolTitle = (r: WorklogRecord): string => {\n const name = asRecord(r.data).name;\n return typeof name === \"string\" && name.length > 0 ? `Tool: ${name}` : \"Tool\";\n};\n\nconst agentTitle = (r: WorklogRecord): string => {\n const name = asRecord(r.data).name;\n return typeof name === \"string\" && name.length > 0 ? `Agent: ${name}` : \"Agent-to-agent\";\n};\n\nconst constTitle = (label: string) => () => label;\n\n// The approval gate wraps the parked tool execution in `parameters`.\nconst approvalTitle = (r: WorklogRecord): string => {\n const name = asRecord(asRecord(r.data).parameters).name;\n return typeof name === \"string\" && name.length > 0\n ? `Approval required: ${name}`\n : \"Human approval required\";\n};\n\nconst shieldBlockTitle = (r: WorklogRecord): string => {\n const id = asRecord(r.data).shield_id;\n return typeof id === \"string\" && id.length > 0 ? `Blocked by ${id}` : \"Blocked by safeguard\";\n};\n\nconst knowledgeTitle = (r: WorklogRecord): string => {\n const query = asRecord(r.data).query;\n return typeof query === \"string\" && query.length > 0\n ? `Knowledge: ${query}`\n : \"Knowledge retrieval\";\n};\n\nexport const EVENT_REGISTRY: Record<string, EventInterpreter> = {\n // Run envelope\n AssistantInference: { kind: \"answer\", role: \"run-open\", title: constTitle(\"Inference started\") },\n AssistantInferenceResponse: { kind: \"answer\", role: \"run-close\", title: constTitle(\"Answer\") },\n\n // Safeguard\n ShieldInference: { kind: \"safeguard\", role: \"open\", title: constTitle(\"Safeguard\") },\n ShieldInferenceResponse: { kind: \"safeguard\", role: \"close\", title: constTitle(\"Safeguard\") },\n // Emitted when a shield enforcement decision blocks the request (core 0.5.x).\n // Response-only: the reducer opens it already closed when no command matched.\n ShieldBlockedResponse: { kind: \"safeguard\", role: \"close\", title: shieldBlockTitle },\n\n // Reasoning\n ResponseInference: { kind: \"reasoning\", role: \"open\", title: constTitle(\"Reasoning\") },\n ResponseInferenceResponse: { kind: \"reasoning\", role: \"close\", title: constTitle(\"Reasoning\") },\n\n // Tools (server + subclasses) and their responses\n ServerToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n BuiltinToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n UnknownToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n ClientToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle, pending: true },\n ToolExecutionResponse: { kind: \"tool\", role: \"close\", title: toolTitle },\n BuiltinToolExecutionResponse: { kind: \"tool\", role: \"close\", title: toolTitle },\n\n // Tool schema discovery\n ToolSchema: { kind: \"tool\", role: \"open\", title: constTitle(\"Tool schema\") },\n ToolSchemaResponse: { kind: \"tool\", role: \"close\", title: constTitle(\"Tool schema\") },\n\n // Agent-to-agent\n A2AInference: { kind: \"a2a\", role: \"open\", title: agentTitle },\n AgentDiscovery: { kind: \"a2a\", role: \"open\", title: constTitle(\"Agent discovery\") },\n AgentDiscoveryResponse: { kind: \"a2a\", role: \"close\", title: constTitle(\"Agent discovery\") },\n\n // Knowledge retrieval (RAG) — core 0.5.x\n KnowledgeRetrieval: { kind: \"knowledge\", role: \"open\", title: knowledgeTitle },\n KnowledgeRetrievalResponse: { kind: \"knowledge\", role: \"close\", title: knowledgeTitle },\n\n // Speech pipeline — core 0.5.x\n SpeechTranscription: { kind: \"speech\", role: \"open\", title: constTitle(\"Speech-to-text\") },\n SpeechTranscriptionResponse: { kind: \"speech\", role: \"close\", title: constTitle(\"Speech-to-text\") },\n SpeechSynthesis: { kind: \"speech\", role: \"open\", title: constTitle(\"Text-to-speech\") },\n SpeechSynthesisResponse: { kind: \"speech\", role: \"close\", title: constTitle(\"Text-to-speech\") },\n\n // Memory / persistence\n ContextPersistence: { kind: \"memory\", role: \"open\", title: constTitle(\"Memory persistence\") },\n ContextFlush: { kind: \"memory\", role: \"open\", title: constTitle(\"Memory flush\") },\n ContextFlushResponse: { kind: \"memory\", role: \"close\", title: constTitle(\"Memory flush\") },\n\n // Human approval\n HumanApprovalRequired: {\n kind: \"tool\",\n role: \"open\",\n title: approvalTitle,\n pending: true,\n },\n HumanApprovalRequiredResponse: { kind: \"tool\", role: \"close\", title: constTitle(\"Human approval\") },\n};\n\nexport function resolveInterpreter(eventClass: string): EventInterpreter {\n if (Object.prototype.hasOwnProperty.call(EVENT_REGISTRY, eventClass)) {\n return EVENT_REGISTRY[eventClass];\n }\n return {\n kind: \"unknown\",\n role: \"open\",\n title: (r: WorklogRecord) => r.event_class,\n };\n}\n","import { resolveInterpreter } from \"./registry\";\nimport type { EventInterpreter, WorklogNode, WorklogRecord, WorklogState } from \"./types\";\nimport { initialWorklogState } from \"./types\";\n\nconst asString = (v: unknown): string =>\n typeof v === \"string\" ? v : v == null ? \"\" : JSON.stringify(v);\n\nconst nodeDepth = (record: WorklogRecord): number => {\n const d = record.data && typeof record.data === \"object\"\n ? (record.data as Record<string, unknown>).depth\n : undefined;\n return typeof d === \"number\" ? d : 0;\n};\n\nconst makeOpenNode = (record: WorklogRecord, interp: EventInterpreter, id: string): WorklogNode => ({\n id,\n kind: interp.kind,\n eventClass: record.event_class,\n status: interp.pending ? \"pending\" : \"running\",\n title: interp.title(record),\n startedAt: record.date_submitted,\n depth: nodeDepth(record),\n children: [],\n command: record.data,\n raw: [record],\n});\n\nconst makeClosedNode = (record: WorklogRecord, interp: EventInterpreter, id: string): WorklogNode => ({\n id,\n kind: interp.kind,\n eventClass: record.event_class,\n status: record.status === \"error\" ? \"failed\" : \"completed\",\n title: interp.title(record),\n startedAt: record.date_submitted,\n endedAt: record.date_submitted,\n depth: nodeDepth(record),\n children: [],\n response: record.data,\n error: record.status === \"error\" ? asString(record.data) : undefined,\n raw: [record],\n});\n\nexport function reduceWorklog(state: WorklogState, record: WorklogRecord): WorklogState {\n const interp = resolveInterpreter(record.event_class);\n const next: WorklogState = {\n ...state,\n nodes: state.nodes.slice(),\n index: { ...state.index },\n raw: [...state.raw, record],\n };\n\n if (interp.role === \"ignore\") return next;\n\n if (interp.role === \"run-open\") {\n next.status = \"running\";\n return next;\n }\n\n if (interp.role === \"run-close\") {\n next.answer = asString(record.data) || null;\n next.status = record.status === \"error\" ? \"error\" : \"success\";\n return next;\n }\n\n const key = record.control_id ?? `${record.event_class}-${next.raw.length}`;\n\n if (interp.role === \"close\") {\n const pos = Object.prototype.hasOwnProperty.call(next.index, key) ? next.index[key] : undefined;\n if (pos != null) {\n const existing = next.nodes[pos];\n next.nodes[pos] = {\n ...existing,\n status: record.status === \"error\" ? \"failed\" : \"completed\",\n endedAt: record.date_submitted,\n response: record.data,\n error: record.status === \"error\" ? asString(record.data) : existing.error,\n raw: [...existing.raw, record],\n };\n } else {\n // response arrived without a seen command — create it already closed\n next.index[key] = next.nodes.length;\n next.nodes.push(makeClosedNode(record, interp, key));\n }\n if (record.status === \"error\") next.status = \"error\";\n return next;\n }\n\n // role === \"open\"\n const pos = Object.prototype.hasOwnProperty.call(next.index, key) ? next.index[key] : undefined;\n if (pos != null) {\n const existing = next.nodes[pos];\n // The command can arrive after its response (the node was opened closed);\n // keep the status, but fill in what the command says it was.\n next.nodes[pos] = {\n ...existing,\n command: existing.command ?? record.data,\n title: existing.command === undefined ? interp.title(record) : existing.title,\n raw: [...existing.raw, record],\n };\n } else {\n next.index[key] = next.nodes.length;\n next.nodes.push(makeOpenNode(record, interp, key));\n }\n return next;\n}\n\nexport function foldWorklog(records: WorklogRecord[], taskId: string | null = null): WorklogState {\n return records.reduce(reduceWorklog, initialWorklogState(taskId));\n}\n","import { useCallback, useReducer } from \"react\";\nimport { reduceWorklog } from \"./reducer\";\nimport { initialWorklogState, type WorklogRecord, type WorklogState } from \"./types\";\n\ntype Action =\n | { type: \"ingest\"; record: WorklogRecord }\n | { type: \"ingestMany\"; records: WorklogRecord[] }\n | { type: \"reset\"; taskId: string | null };\n\nfunction hookReducer(state: WorklogState, action: Action): WorklogState {\n switch (action.type) {\n case \"ingest\":\n return reduceWorklog(state, action.record);\n case \"ingestMany\":\n return action.records.reduce(reduceWorklog, state);\n case \"reset\":\n return initialWorklogState(action.taskId);\n }\n}\n\n/** Live worklog accumulator. Feed it `bus_mode` records via `ingest`; use `foldWorklog` for history. */\nexport function useWorklog(taskId: string | null = null) {\n const [worklog, dispatch] = useReducer(hookReducer, taskId, initialWorklogState);\n\n const ingest = useCallback((record: WorklogRecord) => dispatch({ type: \"ingest\", record }), []);\n const ingestMany = useCallback(\n (records: WorklogRecord[]) => dispatch({ type: \"ingestMany\", records }),\n [],\n );\n const reset = useCallback(\n (id: string | null = null) => dispatch({ type: \"reset\", taskId: id }),\n [],\n );\n\n return { worklog, ingest, ingestMany, reset };\n}\n","import type { WorklogRecord } from \"./types\";\n\n/** Loosely-typed shape of a parsed SSE `data:` frame from the granular Runtime stream. */\nexport interface RawFrame {\n event_class?: string;\n control_id?: string | null;\n data?: unknown;\n status?: string | null;\n date_submitted?: string;\n /** Runtime v0.5.0+ tamper-evident hash chain fields. */\n entry_hash?: string | null;\n previous_hash?: string | null;\n}\n\n/** Normalize a parsed SSE frame into a WorklogRecord (defaults missing fields; never throws). */\nexport function frameToRecord(frame: RawFrame): WorklogRecord {\n const status = frame.status === \"success\" || frame.status === \"error\" ? frame.status : null;\n return {\n event_class: typeof frame.event_class === \"string\" && frame.event_class.length > 0\n ? frame.event_class\n : \"Unknown\",\n control_id: frame.control_id ?? null,\n data: frame.data,\n status,\n date_submitted: typeof frame.date_submitted === \"string\" ? frame.date_submitted : \"\",\n entry_hash: frame.entry_hash ?? null,\n previous_hash: frame.previous_hash ?? null,\n };\n}\n","import type { WorklogRecord } from \"./types\";\n\n/**\n * Human-approval gates, derived from the worklog.\n *\n * When the runtime's authz policy resolves a tool call to `REQUIRE_APPROVAL`,\n * core parks the call and records a `HumanApprovalRequired` whose `data` is the\n * command minus its conversation: `{ parameters: <the tool execution> }`. The\n * gate closes with a `HumanApprovalRequiredResponse` under the same\n * `control_id`, whichever channel the decision came through — so the stream,\n * not the local submit, is the source of truth for \"settled\".\n */\n\n/** A decision as the worklog records it. */\nexport interface ApprovalDecision {\n approved: boolean;\n /**\n * Rejection reason. Core records `result or message` as the response data,\n * so an approval never carries one and a rejection carries the reason when\n * the approver gave it.\n */\n reason: string | null;\n decidedAt: string;\n}\n\n/** One approval gate, pending or settled. */\nexport interface ApprovalRequest {\n /** The `HumanApprovalRequired` control id — the one `/event/tool-approval` expects. */\n controlId: string;\n /** Name of the parked tool call; `null` until the request record is seen. */\n toolName: string | null;\n /** Control id of the parked tool execution itself (distinct from `controlId`). */\n toolCallId: string | null;\n /** Arguments the tool would be called with. What is actually being approved. */\n arguments: unknown;\n /**\n * The gate belongs to an MCP server that runs its own approval over the\n * task's originating channel (the `mcp_approval` runtime extension). The\n * runtime refuses an HTTP decision for it with a 409, so offering buttons\n * would be a lie.\n */\n channelOwned: boolean;\n requestedAt: string | null;\n /** `null` while pending. */\n decision: ApprovalDecision | null;\n}\n\nexport interface ApprovalsState {\n /** Gates in the order they were first seen. */\n order: string[];\n byId: Record<string, ApprovalRequest>;\n}\n\nexport function initialApprovalsState(): ApprovalsState {\n return { order: [], byId: {} };\n}\n\nconst asObject = (v: unknown): Record<string, unknown> | null =>\n v && typeof v === \"object\" && !Array.isArray(v) ? (v as Record<string, unknown>) : null;\n\nconst MCP_APPROVAL_EXTENSION = \"mcp_approval\";\n\nfunction describeRequest(record: WorklogRecord) {\n const execution = asObject(asObject(record.data)?.parameters) ?? {};\n const name = execution.name;\n const callId = execution.control_id;\n // Server tools keep their config in `parameters` and the LLM's arguments in\n // `tool_call_parameters`; client and builtin tools put the arguments in\n // `parameters` directly.\n const args =\n execution.tool_call_parameters !== undefined && execution.tool_call_parameters !== null\n ? execution.tool_call_parameters\n : execution.parameters;\n const extensions = asObject(execution.parameters)?.runtime_extensions;\n return {\n toolName: typeof name === \"string\" && name.length > 0 ? name : null,\n toolCallId: typeof callId === \"string\" ? callId : null,\n arguments: args ?? null,\n channelOwned: Array.isArray(extensions) && extensions.includes(MCP_APPROVAL_EXTENSION),\n };\n}\n\nfunction describeDecision(record: WorklogRecord): ApprovalDecision {\n const approved = record.data === true;\n return {\n approved,\n reason: !approved && typeof record.data === \"string\" && record.data.length > 0 ? record.data : null,\n decidedAt: record.date_submitted,\n };\n}\n\nconst blank = (controlId: string): ApprovalRequest => ({\n controlId,\n toolName: null,\n toolCallId: null,\n arguments: null,\n channelOwned: false,\n requestedAt: null,\n decision: null,\n});\n\n/** Fold one worklog record into the approvals state. Records of other classes are a no-op. */\nexport function reduceApprovals(state: ApprovalsState, record: WorklogRecord): ApprovalsState {\n const isRequest = record.event_class === \"HumanApprovalRequired\";\n const isResponse = record.event_class === \"HumanApprovalRequiredResponse\";\n if ((!isRequest && !isResponse) || !record.control_id) return state;\n\n const id = record.control_id;\n const known = state.byId[id];\n const current = known ?? blank(id);\n\n // A response can overtake its request (bus redelivery, a replayed history).\n // Either order lands on the same settled entry: the request only fills in\n // what is being approved and never reopens a decision.\n const next: ApprovalRequest = isRequest\n ? { ...current, ...describeRequest(record), requestedAt: record.date_submitted }\n : { ...current, decision: current.decision ?? describeDecision(record) };\n\n return {\n order: known ? state.order : [...state.order, id],\n byId: { ...state.byId, [id]: next },\n };\n}\n\nexport function foldApprovals(records: WorklogRecord[]): ApprovalsState {\n return records.reduce(reduceApprovals, initialApprovalsState());\n}\n\n/** All gates, in first-seen order. */\nexport function listApprovals(state: ApprovalsState): ApprovalRequest[] {\n return state.order.map((id) => state.byId[id]);\n}\n\n/** Gates with no recorded decision yet. */\nexport function pendingApprovals(state: ApprovalsState): ApprovalRequest[] {\n return listApprovals(state).filter((a) => a.decision === null);\n}\n"],"mappings":"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","names":["pos"]}
@@ -14,6 +14,10 @@ var agentTitle = (r) => {
14
14
  return typeof name === "string" && name.length > 0 ? `Agent: ${name}` : "Agent-to-agent";
15
15
  };
16
16
  var constTitle = (label) => () => label;
17
+ var approvalTitle = (r) => {
18
+ const name = asRecord(asRecord(r.data).parameters).name;
19
+ return typeof name === "string" && name.length > 0 ? `Approval required: ${name}` : "Human approval required";
20
+ };
17
21
  var shieldBlockTitle = (r) => {
18
22
  const id = asRecord(r.data).shield_id;
19
23
  return typeof id === "string" && id.length > 0 ? `Blocked by ${id}` : "Blocked by safeguard";
@@ -65,7 +69,7 @@ var EVENT_REGISTRY = {
65
69
  HumanApprovalRequired: {
66
70
  kind: "tool",
67
71
  role: "open",
68
- title: constTitle("Human approval required"),
72
+ title: approvalTitle,
69
73
  pending: true
70
74
  },
71
75
  HumanApprovalRequiredResponse: { kind: "tool", role: "close", title: constTitle("Human approval") }
@@ -154,7 +158,12 @@ function reduceWorklog(state, record) {
154
158
  const pos = Object.prototype.hasOwnProperty.call(next.index, key) ? next.index[key] : void 0;
155
159
  if (pos != null) {
156
160
  const existing = next.nodes[pos];
157
- next.nodes[pos] = { ...existing, raw: [...existing.raw, record] };
161
+ next.nodes[pos] = {
162
+ ...existing,
163
+ command: existing.command ?? record.data,
164
+ title: existing.command === void 0 ? interp.title(record) : existing.title,
165
+ raw: [...existing.raw, record]
166
+ };
158
167
  } else {
159
168
  next.index[key] = next.nodes.length;
160
169
  next.nodes.push(makeOpenNode(record, interp, key));
@@ -204,11 +213,75 @@ function frameToRecord(frame) {
204
213
  previous_hash: frame.previous_hash ?? null
205
214
  };
206
215
  }
216
+
217
+ // src/worklog/approvals.ts
218
+ function initialApprovalsState() {
219
+ return { order: [], byId: {} };
220
+ }
221
+ var asObject = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : null;
222
+ var MCP_APPROVAL_EXTENSION = "mcp_approval";
223
+ function describeRequest(record) {
224
+ const execution = asObject(asObject(record.data)?.parameters) ?? {};
225
+ const name = execution.name;
226
+ const callId = execution.control_id;
227
+ const args = execution.tool_call_parameters !== void 0 && execution.tool_call_parameters !== null ? execution.tool_call_parameters : execution.parameters;
228
+ const extensions = asObject(execution.parameters)?.runtime_extensions;
229
+ return {
230
+ toolName: typeof name === "string" && name.length > 0 ? name : null,
231
+ toolCallId: typeof callId === "string" ? callId : null,
232
+ arguments: args ?? null,
233
+ channelOwned: Array.isArray(extensions) && extensions.includes(MCP_APPROVAL_EXTENSION)
234
+ };
235
+ }
236
+ function describeDecision(record) {
237
+ const approved = record.data === true;
238
+ return {
239
+ approved,
240
+ reason: !approved && typeof record.data === "string" && record.data.length > 0 ? record.data : null,
241
+ decidedAt: record.date_submitted
242
+ };
243
+ }
244
+ var blank = (controlId) => ({
245
+ controlId,
246
+ toolName: null,
247
+ toolCallId: null,
248
+ arguments: null,
249
+ channelOwned: false,
250
+ requestedAt: null,
251
+ decision: null
252
+ });
253
+ function reduceApprovals(state, record) {
254
+ const isRequest = record.event_class === "HumanApprovalRequired";
255
+ const isResponse = record.event_class === "HumanApprovalRequiredResponse";
256
+ if (!isRequest && !isResponse || !record.control_id) return state;
257
+ const id = record.control_id;
258
+ const known = state.byId[id];
259
+ const current = known ?? blank(id);
260
+ const next = isRequest ? { ...current, ...describeRequest(record), requestedAt: record.date_submitted } : { ...current, decision: current.decision ?? describeDecision(record) };
261
+ return {
262
+ order: known ? state.order : [...state.order, id],
263
+ byId: { ...state.byId, [id]: next }
264
+ };
265
+ }
266
+ function foldApprovals(records) {
267
+ return records.reduce(reduceApprovals, initialApprovalsState());
268
+ }
269
+ function listApprovals(state) {
270
+ return state.order.map((id) => state.byId[id]);
271
+ }
272
+ function pendingApprovals(state) {
273
+ return listApprovals(state).filter((a) => a.decision === null);
274
+ }
207
275
  export {
208
276
  EVENT_REGISTRY,
277
+ foldApprovals,
209
278
  foldWorklog,
210
279
  frameToRecord,
280
+ initialApprovalsState,
211
281
  initialWorklogState,
282
+ listApprovals,
283
+ pendingApprovals,
284
+ reduceApprovals,
212
285
  reduceWorklog,
213
286
  resolveInterpreter,
214
287
  useWorklog
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/worklog/types.ts","../../src/worklog/registry.ts","../../src/worklog/reducer.ts","../../src/worklog/use-worklog.ts","../../src/worklog/from-frame.ts"],"sourcesContent":["/** One granular Runtime worklog record (a `bus_mode` SSE frame or a `/worklog/{task_id}/events` item). */\nexport interface WorklogRecord {\n /** Runtime v0.5.0+ tamper-evident hash chain fields (optional on SSE frames). */\n entry_hash?: string | null;\n previous_hash?: string | null;\n event_class: string;\n control_id: string | null;\n data: unknown;\n status: \"success\" | \"error\" | null;\n date_submitted: string;\n}\n\n/** Runtime v0.5.0 worklog audit summary returned by `GET /worklog/`. */\nexport interface WorklogSummary {\n task_id: string;\n parent_task_id?: string | null;\n session_id?: string | null;\n user_id?: string | null;\n assistant_id?: string | null;\n agentspace_id?: string | null;\n channel_id?: string | null;\n depth?: number;\n final_status?: string | null;\n started_at: string;\n finished_at?: string | null;\n}\n\n/** Runtime v0.5.0 full worklog detail returned by `GET /worklog/{task_id}`. */\nexport interface WorklogDetail extends WorklogSummary {\n final_result?: string | null;\n error_message?: string | null;\n}\n\n/** Runtime v0.5.0 single worklog event returned by `GET /worklog/{task_id}/events`. */\nexport interface WorklogEventDetail {\n id: number;\n task_id: string;\n previous_hash?: string | null;\n entry_hash?: string | null;\n event_class: string;\n control_id?: string | null;\n status?: string | null;\n data?: unknown;\n submitted_at: string;\n}\n\n/** Runtime v0.5.0 paginated list of worklog summaries. */\nexport interface WorklogPage {\n items: WorklogSummary[];\n total: number;\n limit: number;\n offset: number;\n}\n\n/** Runtime v0.5.0 paginated list of worklog events for a single task. */\nexport interface WorklogEventPage {\n task_id: string;\n items: WorklogEventDetail[];\n total: number;\n}\n\n/** Runtime v0.5.0 hash-chain verification result returned by `GET /worklog/{task_id}/verify`. */\nexport interface WorklogVerificationResult {\n valid: boolean;\n task_id: string;\n event_count: number;\n first_broken_event_id?: number | null;\n first_broken_index?: number | null;\n expected_hash?: string | null;\n actual_hash?: string | null;\n message: string;\n}\n\n/** Semantic bucket a node belongs to. */\nexport type NodeKind =\n | \"safeguard\"\n | \"reasoning\"\n | \"tool\"\n | \"a2a\"\n | \"memory\"\n | \"knowledge\"\n | \"speech\"\n | \"answer\"\n | \"unknown\";\n\n/** Lifecycle state of a single node. */\nexport type NodeStatus = \"pending\" | \"running\" | \"completed\" | \"failed\" | \"skipped\";\n\n/** Overall run status. */\nexport type RunStatus = \"idle\" | \"running\" | \"success\" | \"error\";\n\n/** A single step in the execution chain (command + its response merged by control_id). */\nexport interface WorklogNode {\n id: string;\n kind: NodeKind;\n eventClass: string;\n status: NodeStatus;\n title: string;\n startedAt?: string;\n endedAt?: string;\n depth: number;\n parentId?: string;\n children: WorklogNode[];\n command?: unknown;\n response?: unknown;\n error?: string;\n raw: WorklogRecord[];\n}\n\n/** Normalized execution model produced by the reducer. */\nexport interface WorklogState {\n taskId: string | null;\n status: RunStatus;\n answer: string | null;\n nodes: WorklogNode[];\n index: Record<string, number>;\n raw: WorklogRecord[];\n}\n\n/** How a record acts on the model. */\nexport type EventRole = \"open\" | \"close\" | \"run-open\" | \"run-close\" | \"ignore\";\n\n/** Registry descriptor for one event_class. */\nexport interface EventInterpreter {\n kind: NodeKind;\n role: EventRole;\n title: (_record: WorklogRecord) => string;\n /** If true, an opened node starts in \"pending\" (awaiting external input) rather than \"running\". */\n pending?: boolean;\n}\n\nexport function initialWorklogState(taskId: string | null = null): WorklogState {\n return { taskId, status: \"idle\", answer: null, nodes: [], index: {}, raw: [] };\n}\n","import type { EventInterpreter, WorklogRecord } from \"./types\";\n\nconst asRecord = (data: unknown): Record<string, unknown> =>\n data && typeof data === \"object\" ? (data as Record<string, unknown>) : {};\n\nconst toolTitle = (r: WorklogRecord): string => {\n const name = asRecord(r.data).name;\n return typeof name === \"string\" && name.length > 0 ? `Tool: ${name}` : \"Tool\";\n};\n\nconst agentTitle = (r: WorklogRecord): string => {\n const name = asRecord(r.data).name;\n return typeof name === \"string\" && name.length > 0 ? `Agent: ${name}` : \"Agent-to-agent\";\n};\n\nconst constTitle = (label: string) => () => label;\n\nconst shieldBlockTitle = (r: WorklogRecord): string => {\n const id = asRecord(r.data).shield_id;\n return typeof id === \"string\" && id.length > 0 ? `Blocked by ${id}` : \"Blocked by safeguard\";\n};\n\nconst knowledgeTitle = (r: WorklogRecord): string => {\n const query = asRecord(r.data).query;\n return typeof query === \"string\" && query.length > 0\n ? `Knowledge: ${query}`\n : \"Knowledge retrieval\";\n};\n\nexport const EVENT_REGISTRY: Record<string, EventInterpreter> = {\n // Run envelope\n AssistantInference: { kind: \"answer\", role: \"run-open\", title: constTitle(\"Inference started\") },\n AssistantInferenceResponse: { kind: \"answer\", role: \"run-close\", title: constTitle(\"Answer\") },\n\n // Safeguard\n ShieldInference: { kind: \"safeguard\", role: \"open\", title: constTitle(\"Safeguard\") },\n ShieldInferenceResponse: { kind: \"safeguard\", role: \"close\", title: constTitle(\"Safeguard\") },\n // Emitted when a shield enforcement decision blocks the request (core 0.5.x).\n // Response-only: the reducer opens it already closed when no command matched.\n ShieldBlockedResponse: { kind: \"safeguard\", role: \"close\", title: shieldBlockTitle },\n\n // Reasoning\n ResponseInference: { kind: \"reasoning\", role: \"open\", title: constTitle(\"Reasoning\") },\n ResponseInferenceResponse: { kind: \"reasoning\", role: \"close\", title: constTitle(\"Reasoning\") },\n\n // Tools (server + subclasses) and their responses\n ServerToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n BuiltinToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n UnknownToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n ClientToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle, pending: true },\n ToolExecutionResponse: { kind: \"tool\", role: \"close\", title: toolTitle },\n BuiltinToolExecutionResponse: { kind: \"tool\", role: \"close\", title: toolTitle },\n\n // Tool schema discovery\n ToolSchema: { kind: \"tool\", role: \"open\", title: constTitle(\"Tool schema\") },\n ToolSchemaResponse: { kind: \"tool\", role: \"close\", title: constTitle(\"Tool schema\") },\n\n // Agent-to-agent\n A2AInference: { kind: \"a2a\", role: \"open\", title: agentTitle },\n AgentDiscovery: { kind: \"a2a\", role: \"open\", title: constTitle(\"Agent discovery\") },\n AgentDiscoveryResponse: { kind: \"a2a\", role: \"close\", title: constTitle(\"Agent discovery\") },\n\n // Knowledge retrieval (RAG) — core 0.5.x\n KnowledgeRetrieval: { kind: \"knowledge\", role: \"open\", title: knowledgeTitle },\n KnowledgeRetrievalResponse: { kind: \"knowledge\", role: \"close\", title: knowledgeTitle },\n\n // Speech pipeline — core 0.5.x\n SpeechTranscription: { kind: \"speech\", role: \"open\", title: constTitle(\"Speech-to-text\") },\n SpeechTranscriptionResponse: { kind: \"speech\", role: \"close\", title: constTitle(\"Speech-to-text\") },\n SpeechSynthesis: { kind: \"speech\", role: \"open\", title: constTitle(\"Text-to-speech\") },\n SpeechSynthesisResponse: { kind: \"speech\", role: \"close\", title: constTitle(\"Text-to-speech\") },\n\n // Memory / persistence\n ContextPersistence: { kind: \"memory\", role: \"open\", title: constTitle(\"Memory persistence\") },\n ContextFlush: { kind: \"memory\", role: \"open\", title: constTitle(\"Memory flush\") },\n ContextFlushResponse: { kind: \"memory\", role: \"close\", title: constTitle(\"Memory flush\") },\n\n // Human approval\n HumanApprovalRequired: {\n kind: \"tool\",\n role: \"open\",\n title: constTitle(\"Human approval required\"),\n pending: true,\n },\n HumanApprovalRequiredResponse: { kind: \"tool\", role: \"close\", title: constTitle(\"Human approval\") },\n};\n\nexport function resolveInterpreter(eventClass: string): EventInterpreter {\n if (Object.prototype.hasOwnProperty.call(EVENT_REGISTRY, eventClass)) {\n return EVENT_REGISTRY[eventClass];\n }\n return {\n kind: \"unknown\",\n role: \"open\",\n title: (r: WorklogRecord) => r.event_class,\n };\n}\n","import { resolveInterpreter } from \"./registry\";\nimport type { EventInterpreter, WorklogNode, WorklogRecord, WorklogState } from \"./types\";\nimport { initialWorklogState } from \"./types\";\n\nconst asString = (v: unknown): string =>\n typeof v === \"string\" ? v : v == null ? \"\" : JSON.stringify(v);\n\nconst nodeDepth = (record: WorklogRecord): number => {\n const d = record.data && typeof record.data === \"object\"\n ? (record.data as Record<string, unknown>).depth\n : undefined;\n return typeof d === \"number\" ? d : 0;\n};\n\nconst makeOpenNode = (record: WorklogRecord, interp: EventInterpreter, id: string): WorklogNode => ({\n id,\n kind: interp.kind,\n eventClass: record.event_class,\n status: interp.pending ? \"pending\" : \"running\",\n title: interp.title(record),\n startedAt: record.date_submitted,\n depth: nodeDepth(record),\n children: [],\n command: record.data,\n raw: [record],\n});\n\nconst makeClosedNode = (record: WorklogRecord, interp: EventInterpreter, id: string): WorklogNode => ({\n id,\n kind: interp.kind,\n eventClass: record.event_class,\n status: record.status === \"error\" ? \"failed\" : \"completed\",\n title: interp.title(record),\n startedAt: record.date_submitted,\n endedAt: record.date_submitted,\n depth: nodeDepth(record),\n children: [],\n response: record.data,\n error: record.status === \"error\" ? asString(record.data) : undefined,\n raw: [record],\n});\n\nexport function reduceWorklog(state: WorklogState, record: WorklogRecord): WorklogState {\n const interp = resolveInterpreter(record.event_class);\n const next: WorklogState = {\n ...state,\n nodes: state.nodes.slice(),\n index: { ...state.index },\n raw: [...state.raw, record],\n };\n\n if (interp.role === \"ignore\") return next;\n\n if (interp.role === \"run-open\") {\n next.status = \"running\";\n return next;\n }\n\n if (interp.role === \"run-close\") {\n next.answer = asString(record.data) || null;\n next.status = record.status === \"error\" ? \"error\" : \"success\";\n return next;\n }\n\n const key = record.control_id ?? `${record.event_class}-${next.raw.length}`;\n\n if (interp.role === \"close\") {\n const pos = Object.prototype.hasOwnProperty.call(next.index, key) ? next.index[key] : undefined;\n if (pos != null) {\n const existing = next.nodes[pos];\n next.nodes[pos] = {\n ...existing,\n status: record.status === \"error\" ? \"failed\" : \"completed\",\n endedAt: record.date_submitted,\n response: record.data,\n error: record.status === \"error\" ? asString(record.data) : existing.error,\n raw: [...existing.raw, record],\n };\n } else {\n // response arrived without a seen command — create it already closed\n next.index[key] = next.nodes.length;\n next.nodes.push(makeClosedNode(record, interp, key));\n }\n if (record.status === \"error\") next.status = \"error\";\n return next;\n }\n\n // role === \"open\"\n const pos = Object.prototype.hasOwnProperty.call(next.index, key) ? next.index[key] : undefined;\n if (pos != null) {\n const existing = next.nodes[pos];\n next.nodes[pos] = { ...existing, raw: [...existing.raw, record] };\n } else {\n next.index[key] = next.nodes.length;\n next.nodes.push(makeOpenNode(record, interp, key));\n }\n return next;\n}\n\nexport function foldWorklog(records: WorklogRecord[], taskId: string | null = null): WorklogState {\n return records.reduce(reduceWorklog, initialWorklogState(taskId));\n}\n","import { useCallback, useReducer } from \"react\";\nimport { reduceWorklog } from \"./reducer\";\nimport { initialWorklogState, type WorklogRecord, type WorklogState } from \"./types\";\n\ntype Action =\n | { type: \"ingest\"; record: WorklogRecord }\n | { type: \"ingestMany\"; records: WorklogRecord[] }\n | { type: \"reset\"; taskId: string | null };\n\nfunction hookReducer(state: WorklogState, action: Action): WorklogState {\n switch (action.type) {\n case \"ingest\":\n return reduceWorklog(state, action.record);\n case \"ingestMany\":\n return action.records.reduce(reduceWorklog, state);\n case \"reset\":\n return initialWorklogState(action.taskId);\n }\n}\n\n/** Live worklog accumulator. Feed it `bus_mode` records via `ingest`; use `foldWorklog` for history. */\nexport function useWorklog(taskId: string | null = null) {\n const [worklog, dispatch] = useReducer(hookReducer, taskId, initialWorklogState);\n\n const ingest = useCallback((record: WorklogRecord) => dispatch({ type: \"ingest\", record }), []);\n const ingestMany = useCallback(\n (records: WorklogRecord[]) => dispatch({ type: \"ingestMany\", records }),\n [],\n );\n const reset = useCallback(\n (id: string | null = null) => dispatch({ type: \"reset\", taskId: id }),\n [],\n );\n\n return { worklog, ingest, ingestMany, reset };\n}\n","import type { WorklogRecord } from \"./types\";\n\n/** Loosely-typed shape of a parsed SSE `data:` frame from the granular Runtime stream. */\nexport interface RawFrame {\n event_class?: string;\n control_id?: string | null;\n data?: unknown;\n status?: string | null;\n date_submitted?: string;\n /** Runtime v0.5.0+ tamper-evident hash chain fields. */\n entry_hash?: string | null;\n previous_hash?: string | null;\n}\n\n/** Normalize a parsed SSE frame into a WorklogRecord (defaults missing fields; never throws). */\nexport function frameToRecord(frame: RawFrame): WorklogRecord {\n const status = frame.status === \"success\" || frame.status === \"error\" ? frame.status : null;\n return {\n event_class: typeof frame.event_class === \"string\" && frame.event_class.length > 0\n ? frame.event_class\n : \"Unknown\",\n control_id: frame.control_id ?? null,\n data: frame.data,\n status,\n date_submitted: typeof frame.date_submitted === \"string\" ? frame.date_submitted : \"\",\n entry_hash: frame.entry_hash ?? null,\n previous_hash: frame.previous_hash ?? null,\n };\n}\n"],"mappings":"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","names":["pos"]}
1
+ {"version":3,"sources":["../../src/worklog/types.ts","../../src/worklog/registry.ts","../../src/worklog/reducer.ts","../../src/worklog/use-worklog.ts","../../src/worklog/from-frame.ts","../../src/worklog/approvals.ts"],"sourcesContent":["/** One granular Runtime worklog record (a `bus_mode` SSE frame or a `/worklog/{task_id}/events` item). */\nexport interface WorklogRecord {\n /** Runtime v0.5.0+ tamper-evident hash chain fields (optional on SSE frames). */\n entry_hash?: string | null;\n previous_hash?: string | null;\n event_class: string;\n control_id: string | null;\n data: unknown;\n status: \"success\" | \"error\" | null;\n date_submitted: string;\n}\n\n/** Runtime v0.5.0 worklog audit summary returned by `GET /worklog/`. */\nexport interface WorklogSummary {\n task_id: string;\n parent_task_id?: string | null;\n session_id?: string | null;\n user_id?: string | null;\n assistant_id?: string | null;\n agentspace_id?: string | null;\n channel_id?: string | null;\n depth?: number;\n final_status?: string | null;\n started_at: string;\n finished_at?: string | null;\n}\n\n/** Runtime v0.5.0 full worklog detail returned by `GET /worklog/{task_id}`. */\nexport interface WorklogDetail extends WorklogSummary {\n final_result?: string | null;\n error_message?: string | null;\n}\n\n/** Runtime v0.5.0 single worklog event returned by `GET /worklog/{task_id}/events`. */\nexport interface WorklogEventDetail {\n id: number;\n task_id: string;\n previous_hash?: string | null;\n entry_hash?: string | null;\n event_class: string;\n control_id?: string | null;\n status?: string | null;\n data?: unknown;\n submitted_at: string;\n}\n\n/** Runtime v0.5.0 paginated list of worklog summaries. */\nexport interface WorklogPage {\n items: WorklogSummary[];\n total: number;\n limit: number;\n offset: number;\n}\n\n/** Runtime v0.5.0 paginated list of worklog events for a single task. */\nexport interface WorklogEventPage {\n task_id: string;\n items: WorklogEventDetail[];\n total: number;\n}\n\n/** Runtime v0.5.0 hash-chain verification result returned by `GET /worklog/{task_id}/verify`. */\nexport interface WorklogVerificationResult {\n valid: boolean;\n task_id: string;\n event_count: number;\n first_broken_event_id?: number | null;\n first_broken_index?: number | null;\n expected_hash?: string | null;\n actual_hash?: string | null;\n message: string;\n}\n\n/** Semantic bucket a node belongs to. */\nexport type NodeKind =\n | \"safeguard\"\n | \"reasoning\"\n | \"tool\"\n | \"a2a\"\n | \"memory\"\n | \"knowledge\"\n | \"speech\"\n | \"answer\"\n | \"unknown\";\n\n/** Lifecycle state of a single node. */\nexport type NodeStatus = \"pending\" | \"running\" | \"completed\" | \"failed\" | \"skipped\";\n\n/** Overall run status. */\nexport type RunStatus = \"idle\" | \"running\" | \"success\" | \"error\";\n\n/** A single step in the execution chain (command + its response merged by control_id). */\nexport interface WorklogNode {\n id: string;\n kind: NodeKind;\n eventClass: string;\n status: NodeStatus;\n title: string;\n startedAt?: string;\n endedAt?: string;\n depth: number;\n parentId?: string;\n children: WorklogNode[];\n command?: unknown;\n response?: unknown;\n error?: string;\n raw: WorklogRecord[];\n}\n\n/** Normalized execution model produced by the reducer. */\nexport interface WorklogState {\n taskId: string | null;\n status: RunStatus;\n answer: string | null;\n nodes: WorklogNode[];\n index: Record<string, number>;\n raw: WorklogRecord[];\n}\n\n/** How a record acts on the model. */\nexport type EventRole = \"open\" | \"close\" | \"run-open\" | \"run-close\" | \"ignore\";\n\n/** Registry descriptor for one event_class. */\nexport interface EventInterpreter {\n kind: NodeKind;\n role: EventRole;\n title: (_record: WorklogRecord) => string;\n /** If true, an opened node starts in \"pending\" (awaiting external input) rather than \"running\". */\n pending?: boolean;\n}\n\nexport function initialWorklogState(taskId: string | null = null): WorklogState {\n return { taskId, status: \"idle\", answer: null, nodes: [], index: {}, raw: [] };\n}\n","import type { EventInterpreter, WorklogRecord } from \"./types\";\n\nconst asRecord = (data: unknown): Record<string, unknown> =>\n data && typeof data === \"object\" ? (data as Record<string, unknown>) : {};\n\nconst toolTitle = (r: WorklogRecord): string => {\n const name = asRecord(r.data).name;\n return typeof name === \"string\" && name.length > 0 ? `Tool: ${name}` : \"Tool\";\n};\n\nconst agentTitle = (r: WorklogRecord): string => {\n const name = asRecord(r.data).name;\n return typeof name === \"string\" && name.length > 0 ? `Agent: ${name}` : \"Agent-to-agent\";\n};\n\nconst constTitle = (label: string) => () => label;\n\n// The approval gate wraps the parked tool execution in `parameters`.\nconst approvalTitle = (r: WorklogRecord): string => {\n const name = asRecord(asRecord(r.data).parameters).name;\n return typeof name === \"string\" && name.length > 0\n ? `Approval required: ${name}`\n : \"Human approval required\";\n};\n\nconst shieldBlockTitle = (r: WorklogRecord): string => {\n const id = asRecord(r.data).shield_id;\n return typeof id === \"string\" && id.length > 0 ? `Blocked by ${id}` : \"Blocked by safeguard\";\n};\n\nconst knowledgeTitle = (r: WorklogRecord): string => {\n const query = asRecord(r.data).query;\n return typeof query === \"string\" && query.length > 0\n ? `Knowledge: ${query}`\n : \"Knowledge retrieval\";\n};\n\nexport const EVENT_REGISTRY: Record<string, EventInterpreter> = {\n // Run envelope\n AssistantInference: { kind: \"answer\", role: \"run-open\", title: constTitle(\"Inference started\") },\n AssistantInferenceResponse: { kind: \"answer\", role: \"run-close\", title: constTitle(\"Answer\") },\n\n // Safeguard\n ShieldInference: { kind: \"safeguard\", role: \"open\", title: constTitle(\"Safeguard\") },\n ShieldInferenceResponse: { kind: \"safeguard\", role: \"close\", title: constTitle(\"Safeguard\") },\n // Emitted when a shield enforcement decision blocks the request (core 0.5.x).\n // Response-only: the reducer opens it already closed when no command matched.\n ShieldBlockedResponse: { kind: \"safeguard\", role: \"close\", title: shieldBlockTitle },\n\n // Reasoning\n ResponseInference: { kind: \"reasoning\", role: \"open\", title: constTitle(\"Reasoning\") },\n ResponseInferenceResponse: { kind: \"reasoning\", role: \"close\", title: constTitle(\"Reasoning\") },\n\n // Tools (server + subclasses) and their responses\n ServerToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n BuiltinToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n UnknownToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n ClientToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle, pending: true },\n ToolExecutionResponse: { kind: \"tool\", role: \"close\", title: toolTitle },\n BuiltinToolExecutionResponse: { kind: \"tool\", role: \"close\", title: toolTitle },\n\n // Tool schema discovery\n ToolSchema: { kind: \"tool\", role: \"open\", title: constTitle(\"Tool schema\") },\n ToolSchemaResponse: { kind: \"tool\", role: \"close\", title: constTitle(\"Tool schema\") },\n\n // Agent-to-agent\n A2AInference: { kind: \"a2a\", role: \"open\", title: agentTitle },\n AgentDiscovery: { kind: \"a2a\", role: \"open\", title: constTitle(\"Agent discovery\") },\n AgentDiscoveryResponse: { kind: \"a2a\", role: \"close\", title: constTitle(\"Agent discovery\") },\n\n // Knowledge retrieval (RAG) — core 0.5.x\n KnowledgeRetrieval: { kind: \"knowledge\", role: \"open\", title: knowledgeTitle },\n KnowledgeRetrievalResponse: { kind: \"knowledge\", role: \"close\", title: knowledgeTitle },\n\n // Speech pipeline — core 0.5.x\n SpeechTranscription: { kind: \"speech\", role: \"open\", title: constTitle(\"Speech-to-text\") },\n SpeechTranscriptionResponse: { kind: \"speech\", role: \"close\", title: constTitle(\"Speech-to-text\") },\n SpeechSynthesis: { kind: \"speech\", role: \"open\", title: constTitle(\"Text-to-speech\") },\n SpeechSynthesisResponse: { kind: \"speech\", role: \"close\", title: constTitle(\"Text-to-speech\") },\n\n // Memory / persistence\n ContextPersistence: { kind: \"memory\", role: \"open\", title: constTitle(\"Memory persistence\") },\n ContextFlush: { kind: \"memory\", role: \"open\", title: constTitle(\"Memory flush\") },\n ContextFlushResponse: { kind: \"memory\", role: \"close\", title: constTitle(\"Memory flush\") },\n\n // Human approval\n HumanApprovalRequired: {\n kind: \"tool\",\n role: \"open\",\n title: approvalTitle,\n pending: true,\n },\n HumanApprovalRequiredResponse: { kind: \"tool\", role: \"close\", title: constTitle(\"Human approval\") },\n};\n\nexport function resolveInterpreter(eventClass: string): EventInterpreter {\n if (Object.prototype.hasOwnProperty.call(EVENT_REGISTRY, eventClass)) {\n return EVENT_REGISTRY[eventClass];\n }\n return {\n kind: \"unknown\",\n role: \"open\",\n title: (r: WorklogRecord) => r.event_class,\n };\n}\n","import { resolveInterpreter } from \"./registry\";\nimport type { EventInterpreter, WorklogNode, WorklogRecord, WorklogState } from \"./types\";\nimport { initialWorklogState } from \"./types\";\n\nconst asString = (v: unknown): string =>\n typeof v === \"string\" ? v : v == null ? \"\" : JSON.stringify(v);\n\nconst nodeDepth = (record: WorklogRecord): number => {\n const d = record.data && typeof record.data === \"object\"\n ? (record.data as Record<string, unknown>).depth\n : undefined;\n return typeof d === \"number\" ? d : 0;\n};\n\nconst makeOpenNode = (record: WorklogRecord, interp: EventInterpreter, id: string): WorklogNode => ({\n id,\n kind: interp.kind,\n eventClass: record.event_class,\n status: interp.pending ? \"pending\" : \"running\",\n title: interp.title(record),\n startedAt: record.date_submitted,\n depth: nodeDepth(record),\n children: [],\n command: record.data,\n raw: [record],\n});\n\nconst makeClosedNode = (record: WorklogRecord, interp: EventInterpreter, id: string): WorklogNode => ({\n id,\n kind: interp.kind,\n eventClass: record.event_class,\n status: record.status === \"error\" ? \"failed\" : \"completed\",\n title: interp.title(record),\n startedAt: record.date_submitted,\n endedAt: record.date_submitted,\n depth: nodeDepth(record),\n children: [],\n response: record.data,\n error: record.status === \"error\" ? asString(record.data) : undefined,\n raw: [record],\n});\n\nexport function reduceWorklog(state: WorklogState, record: WorklogRecord): WorklogState {\n const interp = resolveInterpreter(record.event_class);\n const next: WorklogState = {\n ...state,\n nodes: state.nodes.slice(),\n index: { ...state.index },\n raw: [...state.raw, record],\n };\n\n if (interp.role === \"ignore\") return next;\n\n if (interp.role === \"run-open\") {\n next.status = \"running\";\n return next;\n }\n\n if (interp.role === \"run-close\") {\n next.answer = asString(record.data) || null;\n next.status = record.status === \"error\" ? \"error\" : \"success\";\n return next;\n }\n\n const key = record.control_id ?? `${record.event_class}-${next.raw.length}`;\n\n if (interp.role === \"close\") {\n const pos = Object.prototype.hasOwnProperty.call(next.index, key) ? next.index[key] : undefined;\n if (pos != null) {\n const existing = next.nodes[pos];\n next.nodes[pos] = {\n ...existing,\n status: record.status === \"error\" ? \"failed\" : \"completed\",\n endedAt: record.date_submitted,\n response: record.data,\n error: record.status === \"error\" ? asString(record.data) : existing.error,\n raw: [...existing.raw, record],\n };\n } else {\n // response arrived without a seen command — create it already closed\n next.index[key] = next.nodes.length;\n next.nodes.push(makeClosedNode(record, interp, key));\n }\n if (record.status === \"error\") next.status = \"error\";\n return next;\n }\n\n // role === \"open\"\n const pos = Object.prototype.hasOwnProperty.call(next.index, key) ? next.index[key] : undefined;\n if (pos != null) {\n const existing = next.nodes[pos];\n // The command can arrive after its response (the node was opened closed);\n // keep the status, but fill in what the command says it was.\n next.nodes[pos] = {\n ...existing,\n command: existing.command ?? record.data,\n title: existing.command === undefined ? interp.title(record) : existing.title,\n raw: [...existing.raw, record],\n };\n } else {\n next.index[key] = next.nodes.length;\n next.nodes.push(makeOpenNode(record, interp, key));\n }\n return next;\n}\n\nexport function foldWorklog(records: WorklogRecord[], taskId: string | null = null): WorklogState {\n return records.reduce(reduceWorklog, initialWorklogState(taskId));\n}\n","import { useCallback, useReducer } from \"react\";\nimport { reduceWorklog } from \"./reducer\";\nimport { initialWorklogState, type WorklogRecord, type WorklogState } from \"./types\";\n\ntype Action =\n | { type: \"ingest\"; record: WorklogRecord }\n | { type: \"ingestMany\"; records: WorklogRecord[] }\n | { type: \"reset\"; taskId: string | null };\n\nfunction hookReducer(state: WorklogState, action: Action): WorklogState {\n switch (action.type) {\n case \"ingest\":\n return reduceWorklog(state, action.record);\n case \"ingestMany\":\n return action.records.reduce(reduceWorklog, state);\n case \"reset\":\n return initialWorklogState(action.taskId);\n }\n}\n\n/** Live worklog accumulator. Feed it `bus_mode` records via `ingest`; use `foldWorklog` for history. */\nexport function useWorklog(taskId: string | null = null) {\n const [worklog, dispatch] = useReducer(hookReducer, taskId, initialWorklogState);\n\n const ingest = useCallback((record: WorklogRecord) => dispatch({ type: \"ingest\", record }), []);\n const ingestMany = useCallback(\n (records: WorklogRecord[]) => dispatch({ type: \"ingestMany\", records }),\n [],\n );\n const reset = useCallback(\n (id: string | null = null) => dispatch({ type: \"reset\", taskId: id }),\n [],\n );\n\n return { worklog, ingest, ingestMany, reset };\n}\n","import type { WorklogRecord } from \"./types\";\n\n/** Loosely-typed shape of a parsed SSE `data:` frame from the granular Runtime stream. */\nexport interface RawFrame {\n event_class?: string;\n control_id?: string | null;\n data?: unknown;\n status?: string | null;\n date_submitted?: string;\n /** Runtime v0.5.0+ tamper-evident hash chain fields. */\n entry_hash?: string | null;\n previous_hash?: string | null;\n}\n\n/** Normalize a parsed SSE frame into a WorklogRecord (defaults missing fields; never throws). */\nexport function frameToRecord(frame: RawFrame): WorklogRecord {\n const status = frame.status === \"success\" || frame.status === \"error\" ? frame.status : null;\n return {\n event_class: typeof frame.event_class === \"string\" && frame.event_class.length > 0\n ? frame.event_class\n : \"Unknown\",\n control_id: frame.control_id ?? null,\n data: frame.data,\n status,\n date_submitted: typeof frame.date_submitted === \"string\" ? frame.date_submitted : \"\",\n entry_hash: frame.entry_hash ?? null,\n previous_hash: frame.previous_hash ?? null,\n };\n}\n","import type { WorklogRecord } from \"./types\";\n\n/**\n * Human-approval gates, derived from the worklog.\n *\n * When the runtime's authz policy resolves a tool call to `REQUIRE_APPROVAL`,\n * core parks the call and records a `HumanApprovalRequired` whose `data` is the\n * command minus its conversation: `{ parameters: <the tool execution> }`. The\n * gate closes with a `HumanApprovalRequiredResponse` under the same\n * `control_id`, whichever channel the decision came through — so the stream,\n * not the local submit, is the source of truth for \"settled\".\n */\n\n/** A decision as the worklog records it. */\nexport interface ApprovalDecision {\n approved: boolean;\n /**\n * Rejection reason. Core records `result or message` as the response data,\n * so an approval never carries one and a rejection carries the reason when\n * the approver gave it.\n */\n reason: string | null;\n decidedAt: string;\n}\n\n/** One approval gate, pending or settled. */\nexport interface ApprovalRequest {\n /** The `HumanApprovalRequired` control id — the one `/event/tool-approval` expects. */\n controlId: string;\n /** Name of the parked tool call; `null` until the request record is seen. */\n toolName: string | null;\n /** Control id of the parked tool execution itself (distinct from `controlId`). */\n toolCallId: string | null;\n /** Arguments the tool would be called with. What is actually being approved. */\n arguments: unknown;\n /**\n * The gate belongs to an MCP server that runs its own approval over the\n * task's originating channel (the `mcp_approval` runtime extension). The\n * runtime refuses an HTTP decision for it with a 409, so offering buttons\n * would be a lie.\n */\n channelOwned: boolean;\n requestedAt: string | null;\n /** `null` while pending. */\n decision: ApprovalDecision | null;\n}\n\nexport interface ApprovalsState {\n /** Gates in the order they were first seen. */\n order: string[];\n byId: Record<string, ApprovalRequest>;\n}\n\nexport function initialApprovalsState(): ApprovalsState {\n return { order: [], byId: {} };\n}\n\nconst asObject = (v: unknown): Record<string, unknown> | null =>\n v && typeof v === \"object\" && !Array.isArray(v) ? (v as Record<string, unknown>) : null;\n\nconst MCP_APPROVAL_EXTENSION = \"mcp_approval\";\n\nfunction describeRequest(record: WorklogRecord) {\n const execution = asObject(asObject(record.data)?.parameters) ?? {};\n const name = execution.name;\n const callId = execution.control_id;\n // Server tools keep their config in `parameters` and the LLM's arguments in\n // `tool_call_parameters`; client and builtin tools put the arguments in\n // `parameters` directly.\n const args =\n execution.tool_call_parameters !== undefined && execution.tool_call_parameters !== null\n ? execution.tool_call_parameters\n : execution.parameters;\n const extensions = asObject(execution.parameters)?.runtime_extensions;\n return {\n toolName: typeof name === \"string\" && name.length > 0 ? name : null,\n toolCallId: typeof callId === \"string\" ? callId : null,\n arguments: args ?? null,\n channelOwned: Array.isArray(extensions) && extensions.includes(MCP_APPROVAL_EXTENSION),\n };\n}\n\nfunction describeDecision(record: WorklogRecord): ApprovalDecision {\n const approved = record.data === true;\n return {\n approved,\n reason: !approved && typeof record.data === \"string\" && record.data.length > 0 ? record.data : null,\n decidedAt: record.date_submitted,\n };\n}\n\nconst blank = (controlId: string): ApprovalRequest => ({\n controlId,\n toolName: null,\n toolCallId: null,\n arguments: null,\n channelOwned: false,\n requestedAt: null,\n decision: null,\n});\n\n/** Fold one worklog record into the approvals state. Records of other classes are a no-op. */\nexport function reduceApprovals(state: ApprovalsState, record: WorklogRecord): ApprovalsState {\n const isRequest = record.event_class === \"HumanApprovalRequired\";\n const isResponse = record.event_class === \"HumanApprovalRequiredResponse\";\n if ((!isRequest && !isResponse) || !record.control_id) return state;\n\n const id = record.control_id;\n const known = state.byId[id];\n const current = known ?? blank(id);\n\n // A response can overtake its request (bus redelivery, a replayed history).\n // Either order lands on the same settled entry: the request only fills in\n // what is being approved and never reopens a decision.\n const next: ApprovalRequest = isRequest\n ? { ...current, ...describeRequest(record), requestedAt: record.date_submitted }\n : { ...current, decision: current.decision ?? describeDecision(record) };\n\n return {\n order: known ? state.order : [...state.order, id],\n byId: { ...state.byId, [id]: next },\n };\n}\n\nexport function foldApprovals(records: WorklogRecord[]): ApprovalsState {\n return records.reduce(reduceApprovals, initialApprovalsState());\n}\n\n/** All gates, in first-seen order. */\nexport function listApprovals(state: ApprovalsState): ApprovalRequest[] {\n return state.order.map((id) => state.byId[id]);\n}\n\n/** Gates with no recorded decision yet. */\nexport function pendingApprovals(state: ApprovalsState): ApprovalRequest[] {\n return listApprovals(state).filter((a) => a.decision === null);\n}\n"],"mappings":"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","names":["pos"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alquimia-ai/tools",
3
- "version": "2.7.0",
3
+ "version": "2.8.0",
4
4
  "author": "Alquimia AI",
5
5
  "description": "tools for Alquimia SDK",
6
6
  "private": false,