@alquimia-ai/tools 2.4.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/actions/index.d.mts +2 -2
- package/dist/actions/index.d.ts +2 -2
- package/dist/actions/index.js +1 -1
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/index.mjs +1 -1
- package/dist/actions/index.mjs.map +1 -1
- package/dist/{actions-CZU_GRy5.d.mts → actions-BjDPJdyA.d.mts} +1 -1
- package/dist/{actions-B0hfoYRd.d.ts → actions-CP1d4Ye1.d.ts} +1 -1
- package/dist/adapters/index.d.mts +2 -2
- package/dist/adapters/index.d.ts +2 -2
- package/dist/adapters/index.js.map +1 -1
- package/dist/genui/index.d.mts +3 -3
- package/dist/genui/index.d.ts +3 -3
- package/dist/genui/index.js +9 -1
- package/dist/genui/index.js.map +1 -1
- package/dist/genui/index.mjs +9 -1
- package/dist/genui/index.mjs.map +1 -1
- package/dist/hooks/index.d.mts +10 -10
- package/dist/hooks/index.d.ts +10 -10
- package/dist/hooks/index.js +28 -8
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +28 -8
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/next/index.js +19 -5
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs +19 -5
- package/dist/next/index.mjs.map +1 -1
- package/dist/providers/index.d.mts +4 -4
- package/dist/providers/index.d.ts +4 -4
- package/dist/providers/index.js +111 -110
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/index.mjs +111 -110
- package/dist/providers/index.mjs.map +1 -1
- package/dist/{providers-BJTXCtI3.d.ts → providers-DiR9cgyo.d.mts} +8 -8
- package/dist/{providers-0Gi78uNQ.d.mts → providers-b5_yMyMo.d.ts} +8 -8
- package/dist/proxy.d.mts +4 -4
- package/dist/proxy.d.ts +4 -4
- package/dist/proxy.js +19 -5
- package/dist/proxy.js.map +1 -1
- package/dist/proxy.mjs +19 -5
- package/dist/proxy.mjs.map +1 -1
- package/dist/sdk/index.d.mts +4 -3
- package/dist/sdk/index.d.ts +4 -3
- package/dist/sdk/index.js +8 -2
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/index.mjs +8 -2
- package/dist/sdk/index.mjs.map +1 -1
- package/dist/services/index.d.mts +3 -3
- package/dist/services/index.d.ts +3 -3
- package/dist/services/index.js.map +1 -1
- package/dist/services/index.mjs.map +1 -1
- package/dist/type-DqX3-9QS.d.mts +312 -0
- package/dist/type-xksRnBUW.d.ts +312 -0
- package/dist/types/index.d.mts +78 -304
- package/dist/types/index.d.ts +78 -304
- package/dist/types/index.js.map +1 -1
- package/dist/types-C-6fgK1_.d.mts +111 -0
- package/dist/types-C-6fgK1_.d.ts +111 -0
- package/dist/{types-DnfWUE9V.d.mts → types-CMVbyEv8.d.mts} +3 -2
- package/dist/{types-DnfWUE9V.d.ts → types-CMVbyEv8.d.ts} +3 -2
- package/dist/utils/index.d.mts +2 -2
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +1 -1
- package/dist/utils/index.mjs.map +1 -1
- package/dist/worklog/index.d.mts +5 -2
- package/dist/worklog/index.d.ts +5 -2
- package/dist/worklog/index.js +3 -1
- package/dist/worklog/index.js.map +1 -1
- package/dist/worklog/index.mjs +3 -1
- package/dist/worklog/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/types-Dvu9y4WM.d.mts +0 -53
- package/dist/types-Dvu9y4WM.d.ts +0 -53
|
@@ -41,7 +41,8 @@ interface A2uiSurface {
|
|
|
41
41
|
dataModel?: Record<string, unknown>;
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
|
-
* Body of POST /event/tool-completion.
|
|
44
|
+
* Body of POST /event/tool-completion (runtime v0.5.0).
|
|
45
|
+
* Also exported as {@link ToolCompletionEvent} from `@alquimia-ai/tools/types`.
|
|
45
46
|
* The runtime requires `message` when `status === "error"`.
|
|
46
47
|
*/
|
|
47
48
|
interface ToolExecutionResponse {
|
|
@@ -53,4 +54,4 @@ interface ToolExecutionResponse {
|
|
|
53
54
|
message?: string;
|
|
54
55
|
}
|
|
55
56
|
|
|
56
|
-
export type {
|
|
57
|
+
export type { A2uiSurface as A, SurfaceAction as S, ToolExecutionResponse as T, A2uiComponent as a };
|
package/dist/utils/index.d.mts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { BaseAPIConfig, ThinkingsInferenceResponse, Tooler, ToolEvent, ConversationsMap } from '../
|
|
1
|
+
import { B as BaseAPIConfig, s as ThinkingsInferenceResponse, y as Tooler, u as ToolEvent, j as ConversationsMap } from '../type-DqX3-9QS.mjs';
|
|
2
2
|
import { C as CatalogManifest } from '../registry-Bcu_ZYL1.mjs';
|
|
3
3
|
import '@elastic/apm-rum';
|
|
4
4
|
import 'ai';
|
|
5
|
-
import '../types-
|
|
5
|
+
import '../types-CMVbyEv8.mjs';
|
|
6
6
|
import 'zod';
|
|
7
7
|
|
|
8
8
|
declare function generateTranslatePrompt(text: string): string;
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { BaseAPIConfig, ThinkingsInferenceResponse, Tooler, ToolEvent, ConversationsMap } from '../
|
|
1
|
+
import { B as BaseAPIConfig, s as ThinkingsInferenceResponse, y as Tooler, u as ToolEvent, j as ConversationsMap } from '../type-xksRnBUW.js';
|
|
2
2
|
import { C as CatalogManifest } from '../registry-Bcu_ZYL1.js';
|
|
3
3
|
import '@elastic/apm-rum';
|
|
4
4
|
import 'ai';
|
|
5
|
-
import '../types-
|
|
5
|
+
import '../types-CMVbyEv8.js';
|
|
6
6
|
import 'zod';
|
|
7
7
|
|
|
8
8
|
declare function generateTranslatePrompt(text: string): string;
|
package/dist/utils/index.js
CHANGED
|
@@ -92,7 +92,7 @@ function isTextContent(buffer) {
|
|
|
92
92
|
try {
|
|
93
93
|
const text = new TextDecoder().decode(buffer);
|
|
94
94
|
const trimmedText = text.trim();
|
|
95
|
-
return /^[\w
|
|
95
|
+
return /^[\w#\-*|[\]+=\s\n\r\t!]/.test(trimmedText) || trimmedText.startsWith("#") || trimmedText.startsWith("![") || trimmedText.startsWith("```") || trimmedText.startsWith("---") || /^[a-zA-Z0-9\s\n\r\t]/.test(trimmedText) || /^!\[.*\]\(.*\)/.test(trimmedText);
|
|
96
96
|
} catch {
|
|
97
97
|
return false;
|
|
98
98
|
}
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/index.ts","../../src/utils/utils.ts"],"sourcesContent":["export * from './utils';","import {\n BaseAPIConfig,\n ApiError,\n ConversationsMap,\n ThinkingsInferenceResponse,\n Tooler,\n ToolEvent,\n} from \"../types/type\";\nimport { CatalogManifest } from \"../genui\";\n\nexport function generateTranslatePrompt(text: string) {\n const prompt = `\n Arrange the following text according to the given object structure and return it as plain json, values summarized to one word, no formatting:\n {\n restrictions: {\n value: [''],\n description: 'Restrictions to certain foods'\n },\n alergies: {\n value: [''],\n description: 'Alergies to certain foods'\n },\n wine_preference: {\n value: [''],\n description: 'Preferences for the wine'\n },\n meal_preference: {\n value: [''],\n description: 'Preferences for the meal'\n }\n }\n\n Text: \"${text}\"\n\n Output:\n `;\n\n return prompt;\n}\n\nexport function getCookies(name: string) {\n if (typeof document === \"undefined\") return undefined;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(\";\").shift();\n}\n\nexport function generateHeaders(config: BaseAPIConfig): HeadersInit {\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers[key] = value;\n });\n }\n\n return headers;\n}\n\nexport function isTextContent(buffer: ArrayBuffer): boolean {\n try {\n const text = new TextDecoder().decode(buffer);\n const trimmedText = text.trim();\n\n return (\n /^[\\w\\#\\-\\*\\|\\[\\]\\-\\+\\=\\s\\n\\r\\t\\!]/.test(trimmedText) ||\n trimmedText.startsWith(\"#\") ||\n trimmedText.startsWith(\"![\") ||\n trimmedText.startsWith(\"```\") ||\n trimmedText.startsWith(\"---\") ||\n /^[a-zA-Z0-9\\s\\n\\r\\t]/.test(trimmedText) ||\n /^\\!\\[.*\\]\\(.*\\)/.test(trimmedText)\n );\n } catch {\n return false;\n }\n}\n\nexport function getQueryParam(param: string): string | null {\n if (typeof window !== \"undefined\") {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param);\n }\n return null;\n}\n\nexport function defineAssistantId(defaultId: string): string {\n if (typeof window !== \"undefined\" && window.location.pathname === \"/\") {\n const queryAssistantId = getQueryParam(\"talkwith\");\n if (queryAssistantId) {\n localStorage.setItem(\"assistantId\", queryAssistantId);\n return queryAssistantId;\n }\n const storedAssistantId = localStorage.getItem(\"assistantId\");\n return storedAssistantId || defaultId;\n }\n return defaultId;\n}\n\nexport function formatTimeWithUnit(timeMs: number): string {\n if (timeMs >= 1000) {\n return `${(timeMs / 1000).toFixed(1)}s`;\n }\n return `${Math.round(timeMs)}ms`;\n}\n\nexport function serializeAxiosError(error: unknown) {\n if (error instanceof Error) {\n const customError = error as ApiError;\n return {\n message: customError?.message,\n name: customError?.name,\n stack: customError?.stack,\n code: customError?.code,\n status: customError?.status,\n };\n }\n return {\n message: String(error),\n name: \"Unknown Error\",\n };\n}\n\nexport function parseConversationsMapCookie(\n cookieValue: string\n): ConversationsMap {\n try {\n const decodedValue = decodeURIComponent(cookieValue);\n return JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error(\"Error parsing conversations cookie:\", e);\n return {};\n }\n}\n\nexport function getTopicSessionId(topicId: string): string {\n const conversationsStr = getCookies(\"alquimia-sessions\") || \"{}\";\n if (!conversationsStr) {\n const sessionCookie = getCookies(\"alquimia-session\");\n return sessionCookie || \"\";\n }\n\n const conversationsMap = parseConversationsMapCookie(conversationsStr);\n return conversationsMap[topicId] || \"\";\n}\n\nexport function createMessageId() {\n return Math.floor(Math.random() * 1000000).toString();\n}\n\nexport function hasToolSummary(data: any) {\n return data.tool_summary && Object.keys(data.tool_summary).length > 0;\n}\n\nexport function mergeThinkingsByControlId(\n existingThinkings: ThinkingsInferenceResponse[] = [],\n newThinkings: ThinkingsInferenceResponse[] = []\n): ThinkingsInferenceResponse[] {\n const thinkingsMap = new Map(existingThinkings.map((t) => [t.control_id, t]));\n for (const t of newThinkings) {\n if (t && t.control_id) {\n thinkingsMap.set(t.control_id, t);\n }\n }\n return Array.from(thinkingsMap.values());\n}\n\n\nexport function mergeToolerByControlId(\n currentTooler: Tooler[],\n toolEvent: ToolEvent\n): Tooler[] {\n const { event_class, control_id, data, status } = toolEvent;\n const existingTool = currentTooler.find((t) => t.control_id === control_id);\n const base: Tooler = existingTool || { control_id };\n\n let updated: Tooler;\n switch (event_class) {\n case \"ServerToolExecutionCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: data,\n },\n };\n break;\n case \"ToolExecutionResponse\":\n updated = {\n ...base,\n tool_output: {\n result: data,\n status,\n },\n };\n break;\n case \"A2AInferenceCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: { ...data, type: \"A2A\" },\n },\n };\n break;\n default:\n return currentTooler;\n }\n\n return currentTooler.some(tool => tool.control_id === control_id)\n ? currentTooler.map(tool => (tool.control_id === control_id ? updated : tool))\n : [...currentTooler, updated];\n}\n\nexport function mergeToolEvents(\n initial: Tooler[],\n toolEvents?: ToolEvent[]\n): Tooler[] {\n return (toolEvents ?? []).reduce(\n (acc, toolEvent) => mergeToolerByControlId(acc, toolEvent),\n initial\n );\n}\n\nexport function resolveGenuiAllow(catalog: CatalogManifest, allow?: string[] | 'all'): string[] {\n return !allow || allow === 'all' ? Object.keys(catalog.components) : allow;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/index.ts","../../src/utils/utils.ts"],"sourcesContent":["export * from './utils';","import {\n BaseAPIConfig,\n ApiError,\n ConversationsMap,\n ThinkingsInferenceResponse,\n Tooler,\n ToolEvent,\n} from \"../types/type\";\nimport { CatalogManifest } from \"../genui\";\n\nexport function generateTranslatePrompt(text: string) {\n const prompt = `\n Arrange the following text according to the given object structure and return it as plain json, values summarized to one word, no formatting:\n {\n restrictions: {\n value: [''],\n description: 'Restrictions to certain foods'\n },\n alergies: {\n value: [''],\n description: 'Alergies to certain foods'\n },\n wine_preference: {\n value: [''],\n description: 'Preferences for the wine'\n },\n meal_preference: {\n value: [''],\n description: 'Preferences for the meal'\n }\n }\n\n Text: \"${text}\"\n\n Output:\n `;\n\n return prompt;\n}\n\nexport function getCookies(name: string) {\n if (typeof document === \"undefined\") return undefined;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(\";\").shift();\n}\n\nexport function generateHeaders(config: BaseAPIConfig): HeadersInit {\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers[key] = value;\n });\n }\n\n return headers;\n}\n\nexport function isTextContent(buffer: ArrayBuffer): boolean {\n try {\n const text = new TextDecoder().decode(buffer);\n const trimmedText = text.trim();\n\n return (\n /^[\\w#\\-*|[\\]+=\\s\\n\\r\\t!]/.test(trimmedText) ||\n trimmedText.startsWith(\"#\") ||\n trimmedText.startsWith(\"![\") ||\n trimmedText.startsWith(\"```\") ||\n trimmedText.startsWith(\"---\") ||\n /^[a-zA-Z0-9\\s\\n\\r\\t]/.test(trimmedText) ||\n /^!\\[.*\\]\\(.*\\)/.test(trimmedText)\n );\n } catch {\n return false;\n }\n}\n\nexport function getQueryParam(param: string): string | null {\n if (typeof window !== \"undefined\") {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param);\n }\n return null;\n}\n\nexport function defineAssistantId(defaultId: string): string {\n if (typeof window !== \"undefined\" && window.location.pathname === \"/\") {\n const queryAssistantId = getQueryParam(\"talkwith\");\n if (queryAssistantId) {\n localStorage.setItem(\"assistantId\", queryAssistantId);\n return queryAssistantId;\n }\n const storedAssistantId = localStorage.getItem(\"assistantId\");\n return storedAssistantId || defaultId;\n }\n return defaultId;\n}\n\nexport function formatTimeWithUnit(timeMs: number): string {\n if (timeMs >= 1000) {\n return `${(timeMs / 1000).toFixed(1)}s`;\n }\n return `${Math.round(timeMs)}ms`;\n}\n\nexport function serializeAxiosError(error: unknown) {\n if (error instanceof Error) {\n const customError = error as ApiError;\n return {\n message: customError?.message,\n name: customError?.name,\n stack: customError?.stack,\n code: customError?.code,\n status: customError?.status,\n };\n }\n return {\n message: String(error),\n name: \"Unknown Error\",\n };\n}\n\nexport function parseConversationsMapCookie(\n cookieValue: string\n): ConversationsMap {\n try {\n const decodedValue = decodeURIComponent(cookieValue);\n return JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error(\"Error parsing conversations cookie:\", e);\n return {};\n }\n}\n\nexport function getTopicSessionId(topicId: string): string {\n const conversationsStr = getCookies(\"alquimia-sessions\") || \"{}\";\n if (!conversationsStr) {\n const sessionCookie = getCookies(\"alquimia-session\");\n return sessionCookie || \"\";\n }\n\n const conversationsMap = parseConversationsMapCookie(conversationsStr);\n return conversationsMap[topicId] || \"\";\n}\n\nexport function createMessageId() {\n return Math.floor(Math.random() * 1000000).toString();\n}\n\nexport function hasToolSummary(data: any) {\n return data.tool_summary && Object.keys(data.tool_summary).length > 0;\n}\n\nexport function mergeThinkingsByControlId(\n existingThinkings: ThinkingsInferenceResponse[] = [],\n newThinkings: ThinkingsInferenceResponse[] = []\n): ThinkingsInferenceResponse[] {\n const thinkingsMap = new Map(existingThinkings.map((t) => [t.control_id, t]));\n for (const t of newThinkings) {\n if (t && t.control_id) {\n thinkingsMap.set(t.control_id, t);\n }\n }\n return Array.from(thinkingsMap.values());\n}\n\n\nexport function mergeToolerByControlId(\n currentTooler: Tooler[],\n toolEvent: ToolEvent\n): Tooler[] {\n const { event_class, control_id, data, status } = toolEvent;\n const existingTool = currentTooler.find((t) => t.control_id === control_id);\n const base: Tooler = existingTool || { control_id };\n\n let updated: Tooler;\n switch (event_class) {\n case \"ServerToolExecutionCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: data,\n },\n };\n break;\n case \"ToolExecutionResponse\":\n updated = {\n ...base,\n tool_output: {\n result: data,\n status,\n },\n };\n break;\n case \"A2AInferenceCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: { ...data, type: \"A2A\" },\n },\n };\n break;\n default:\n return currentTooler;\n }\n\n return currentTooler.some(tool => tool.control_id === control_id)\n ? currentTooler.map(tool => (tool.control_id === control_id ? updated : tool))\n : [...currentTooler, updated];\n}\n\nexport function mergeToolEvents(\n initial: Tooler[],\n toolEvents?: ToolEvent[]\n): Tooler[] {\n return (toolEvents ?? []).reduce(\n (acc, toolEvent) => mergeToolerByControlId(acc, toolEvent),\n initial\n );\n}\n\nexport function resolveGenuiAllow(catalog: CatalogManifest, allow?: string[] | 'all'): string[] {\n return !allow || allow === 'all' ? Object.keys(catalog.components) : allow;\n}\n"],"mappings":"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","names":[]}
|
package/dist/utils/index.mjs
CHANGED
|
@@ -51,7 +51,7 @@ function isTextContent(buffer) {
|
|
|
51
51
|
try {
|
|
52
52
|
const text = new TextDecoder().decode(buffer);
|
|
53
53
|
const trimmedText = text.trim();
|
|
54
|
-
return /^[\w
|
|
54
|
+
return /^[\w#\-*|[\]+=\s\n\r\t!]/.test(trimmedText) || trimmedText.startsWith("#") || trimmedText.startsWith("![") || trimmedText.startsWith("```") || trimmedText.startsWith("---") || /^[a-zA-Z0-9\s\n\r\t]/.test(trimmedText) || /^!\[.*\]\(.*\)/.test(trimmedText);
|
|
55
55
|
} catch {
|
|
56
56
|
return false;
|
|
57
57
|
}
|
package/dist/utils/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/utils.ts"],"sourcesContent":["import {\n BaseAPIConfig,\n ApiError,\n ConversationsMap,\n ThinkingsInferenceResponse,\n Tooler,\n ToolEvent,\n} from \"../types/type\";\nimport { CatalogManifest } from \"../genui\";\n\nexport function generateTranslatePrompt(text: string) {\n const prompt = `\n Arrange the following text according to the given object structure and return it as plain json, values summarized to one word, no formatting:\n {\n restrictions: {\n value: [''],\n description: 'Restrictions to certain foods'\n },\n alergies: {\n value: [''],\n description: 'Alergies to certain foods'\n },\n wine_preference: {\n value: [''],\n description: 'Preferences for the wine'\n },\n meal_preference: {\n value: [''],\n description: 'Preferences for the meal'\n }\n }\n\n Text: \"${text}\"\n\n Output:\n `;\n\n return prompt;\n}\n\nexport function getCookies(name: string) {\n if (typeof document === \"undefined\") return undefined;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(\";\").shift();\n}\n\nexport function generateHeaders(config: BaseAPIConfig): HeadersInit {\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers[key] = value;\n });\n }\n\n return headers;\n}\n\nexport function isTextContent(buffer: ArrayBuffer): boolean {\n try {\n const text = new TextDecoder().decode(buffer);\n const trimmedText = text.trim();\n\n return (\n /^[\\w\\#\\-\\*\\|\\[\\]\\-\\+\\=\\s\\n\\r\\t\\!]/.test(trimmedText) ||\n trimmedText.startsWith(\"#\") ||\n trimmedText.startsWith(\"![\") ||\n trimmedText.startsWith(\"```\") ||\n trimmedText.startsWith(\"---\") ||\n /^[a-zA-Z0-9\\s\\n\\r\\t]/.test(trimmedText) ||\n /^\\!\\[.*\\]\\(.*\\)/.test(trimmedText)\n );\n } catch {\n return false;\n }\n}\n\nexport function getQueryParam(param: string): string | null {\n if (typeof window !== \"undefined\") {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param);\n }\n return null;\n}\n\nexport function defineAssistantId(defaultId: string): string {\n if (typeof window !== \"undefined\" && window.location.pathname === \"/\") {\n const queryAssistantId = getQueryParam(\"talkwith\");\n if (queryAssistantId) {\n localStorage.setItem(\"assistantId\", queryAssistantId);\n return queryAssistantId;\n }\n const storedAssistantId = localStorage.getItem(\"assistantId\");\n return storedAssistantId || defaultId;\n }\n return defaultId;\n}\n\nexport function formatTimeWithUnit(timeMs: number): string {\n if (timeMs >= 1000) {\n return `${(timeMs / 1000).toFixed(1)}s`;\n }\n return `${Math.round(timeMs)}ms`;\n}\n\nexport function serializeAxiosError(error: unknown) {\n if (error instanceof Error) {\n const customError = error as ApiError;\n return {\n message: customError?.message,\n name: customError?.name,\n stack: customError?.stack,\n code: customError?.code,\n status: customError?.status,\n };\n }\n return {\n message: String(error),\n name: \"Unknown Error\",\n };\n}\n\nexport function parseConversationsMapCookie(\n cookieValue: string\n): ConversationsMap {\n try {\n const decodedValue = decodeURIComponent(cookieValue);\n return JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error(\"Error parsing conversations cookie:\", e);\n return {};\n }\n}\n\nexport function getTopicSessionId(topicId: string): string {\n const conversationsStr = getCookies(\"alquimia-sessions\") || \"{}\";\n if (!conversationsStr) {\n const sessionCookie = getCookies(\"alquimia-session\");\n return sessionCookie || \"\";\n }\n\n const conversationsMap = parseConversationsMapCookie(conversationsStr);\n return conversationsMap[topicId] || \"\";\n}\n\nexport function createMessageId() {\n return Math.floor(Math.random() * 1000000).toString();\n}\n\nexport function hasToolSummary(data: any) {\n return data.tool_summary && Object.keys(data.tool_summary).length > 0;\n}\n\nexport function mergeThinkingsByControlId(\n existingThinkings: ThinkingsInferenceResponse[] = [],\n newThinkings: ThinkingsInferenceResponse[] = []\n): ThinkingsInferenceResponse[] {\n const thinkingsMap = new Map(existingThinkings.map((t) => [t.control_id, t]));\n for (const t of newThinkings) {\n if (t && t.control_id) {\n thinkingsMap.set(t.control_id, t);\n }\n }\n return Array.from(thinkingsMap.values());\n}\n\n\nexport function mergeToolerByControlId(\n currentTooler: Tooler[],\n toolEvent: ToolEvent\n): Tooler[] {\n const { event_class, control_id, data, status } = toolEvent;\n const existingTool = currentTooler.find((t) => t.control_id === control_id);\n const base: Tooler = existingTool || { control_id };\n\n let updated: Tooler;\n switch (event_class) {\n case \"ServerToolExecutionCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: data,\n },\n };\n break;\n case \"ToolExecutionResponse\":\n updated = {\n ...base,\n tool_output: {\n result: data,\n status,\n },\n };\n break;\n case \"A2AInferenceCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: { ...data, type: \"A2A\" },\n },\n };\n break;\n default:\n return currentTooler;\n }\n\n return currentTooler.some(tool => tool.control_id === control_id)\n ? currentTooler.map(tool => (tool.control_id === control_id ? updated : tool))\n : [...currentTooler, updated];\n}\n\nexport function mergeToolEvents(\n initial: Tooler[],\n toolEvents?: ToolEvent[]\n): Tooler[] {\n return (toolEvents ?? []).reduce(\n (acc, toolEvent) => mergeToolerByControlId(acc, toolEvent),\n initial\n );\n}\n\nexport function resolveGenuiAllow(catalog: CatalogManifest, allow?: string[] | 'all'): string[] {\n return !allow || allow === 'all' ? Object.keys(catalog.components) : allow;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/utils.ts"],"sourcesContent":["import {\n BaseAPIConfig,\n ApiError,\n ConversationsMap,\n ThinkingsInferenceResponse,\n Tooler,\n ToolEvent,\n} from \"../types/type\";\nimport { CatalogManifest } from \"../genui\";\n\nexport function generateTranslatePrompt(text: string) {\n const prompt = `\n Arrange the following text according to the given object structure and return it as plain json, values summarized to one word, no formatting:\n {\n restrictions: {\n value: [''],\n description: 'Restrictions to certain foods'\n },\n alergies: {\n value: [''],\n description: 'Alergies to certain foods'\n },\n wine_preference: {\n value: [''],\n description: 'Preferences for the wine'\n },\n meal_preference: {\n value: [''],\n description: 'Preferences for the meal'\n }\n }\n\n Text: \"${text}\"\n\n Output:\n `;\n\n return prompt;\n}\n\nexport function getCookies(name: string) {\n if (typeof document === \"undefined\") return undefined;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(\";\").shift();\n}\n\nexport function generateHeaders(config: BaseAPIConfig): HeadersInit {\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers[key] = value;\n });\n }\n\n return headers;\n}\n\nexport function isTextContent(buffer: ArrayBuffer): boolean {\n try {\n const text = new TextDecoder().decode(buffer);\n const trimmedText = text.trim();\n\n return (\n /^[\\w#\\-*|[\\]+=\\s\\n\\r\\t!]/.test(trimmedText) ||\n trimmedText.startsWith(\"#\") ||\n trimmedText.startsWith(\"![\") ||\n trimmedText.startsWith(\"```\") ||\n trimmedText.startsWith(\"---\") ||\n /^[a-zA-Z0-9\\s\\n\\r\\t]/.test(trimmedText) ||\n /^!\\[.*\\]\\(.*\\)/.test(trimmedText)\n );\n } catch {\n return false;\n }\n}\n\nexport function getQueryParam(param: string): string | null {\n if (typeof window !== \"undefined\") {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param);\n }\n return null;\n}\n\nexport function defineAssistantId(defaultId: string): string {\n if (typeof window !== \"undefined\" && window.location.pathname === \"/\") {\n const queryAssistantId = getQueryParam(\"talkwith\");\n if (queryAssistantId) {\n localStorage.setItem(\"assistantId\", queryAssistantId);\n return queryAssistantId;\n }\n const storedAssistantId = localStorage.getItem(\"assistantId\");\n return storedAssistantId || defaultId;\n }\n return defaultId;\n}\n\nexport function formatTimeWithUnit(timeMs: number): string {\n if (timeMs >= 1000) {\n return `${(timeMs / 1000).toFixed(1)}s`;\n }\n return `${Math.round(timeMs)}ms`;\n}\n\nexport function serializeAxiosError(error: unknown) {\n if (error instanceof Error) {\n const customError = error as ApiError;\n return {\n message: customError?.message,\n name: customError?.name,\n stack: customError?.stack,\n code: customError?.code,\n status: customError?.status,\n };\n }\n return {\n message: String(error),\n name: \"Unknown Error\",\n };\n}\n\nexport function parseConversationsMapCookie(\n cookieValue: string\n): ConversationsMap {\n try {\n const decodedValue = decodeURIComponent(cookieValue);\n return JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error(\"Error parsing conversations cookie:\", e);\n return {};\n }\n}\n\nexport function getTopicSessionId(topicId: string): string {\n const conversationsStr = getCookies(\"alquimia-sessions\") || \"{}\";\n if (!conversationsStr) {\n const sessionCookie = getCookies(\"alquimia-session\");\n return sessionCookie || \"\";\n }\n\n const conversationsMap = parseConversationsMapCookie(conversationsStr);\n return conversationsMap[topicId] || \"\";\n}\n\nexport function createMessageId() {\n return Math.floor(Math.random() * 1000000).toString();\n}\n\nexport function hasToolSummary(data: any) {\n return data.tool_summary && Object.keys(data.tool_summary).length > 0;\n}\n\nexport function mergeThinkingsByControlId(\n existingThinkings: ThinkingsInferenceResponse[] = [],\n newThinkings: ThinkingsInferenceResponse[] = []\n): ThinkingsInferenceResponse[] {\n const thinkingsMap = new Map(existingThinkings.map((t) => [t.control_id, t]));\n for (const t of newThinkings) {\n if (t && t.control_id) {\n thinkingsMap.set(t.control_id, t);\n }\n }\n return Array.from(thinkingsMap.values());\n}\n\n\nexport function mergeToolerByControlId(\n currentTooler: Tooler[],\n toolEvent: ToolEvent\n): Tooler[] {\n const { event_class, control_id, data, status } = toolEvent;\n const existingTool = currentTooler.find((t) => t.control_id === control_id);\n const base: Tooler = existingTool || { control_id };\n\n let updated: Tooler;\n switch (event_class) {\n case \"ServerToolExecutionCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: data,\n },\n };\n break;\n case \"ToolExecutionResponse\":\n updated = {\n ...base,\n tool_output: {\n result: data,\n status,\n },\n };\n break;\n case \"A2AInferenceCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: { ...data, type: \"A2A\" },\n },\n };\n break;\n default:\n return currentTooler;\n }\n\n return currentTooler.some(tool => tool.control_id === control_id)\n ? currentTooler.map(tool => (tool.control_id === control_id ? updated : tool))\n : [...currentTooler, updated];\n}\n\nexport function mergeToolEvents(\n initial: Tooler[],\n toolEvents?: ToolEvent[]\n): Tooler[] {\n return (toolEvents ?? []).reduce(\n (acc, toolEvent) => mergeToolerByControlId(acc, toolEvent),\n initial\n );\n}\n\nexport function resolveGenuiAllow(catalog: CatalogManifest, allow?: string[] | 'all'): string[] {\n return !allow || allow === 'all' ? Object.keys(catalog.components) : allow;\n}\n"],"mappings":"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","names":[]}
|
package/dist/worklog/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as EventInterpreter,
|
|
2
|
-
export { b as EventRole, N as NodeKind, c as NodeStatus, R as RunStatus, d as WorklogNode, i as initialWorklogState } from '../types-
|
|
1
|
+
import { E as EventInterpreter, W as WorklogRecord, a as WorklogState } from '../types-C-6fgK1_.mjs';
|
|
2
|
+
export { b as EventRole, N as NodeKind, c as NodeStatus, R as RunStatus, d as WorklogDetail, e as WorklogEventDetail, f as WorklogEventPage, g as WorklogNode, h as WorklogPage, i as WorklogSummary, j as WorklogVerificationResult, k as initialWorklogState } from '../types-C-6fgK1_.mjs';
|
|
3
3
|
|
|
4
4
|
declare const EVENT_REGISTRY: Record<string, EventInterpreter>;
|
|
5
5
|
declare function resolveInterpreter(eventClass: string): EventInterpreter;
|
|
@@ -22,6 +22,9 @@ interface RawFrame {
|
|
|
22
22
|
data?: unknown;
|
|
23
23
|
status?: string | null;
|
|
24
24
|
date_submitted?: string;
|
|
25
|
+
/** Runtime v0.5.0+ tamper-evident hash chain fields. */
|
|
26
|
+
entry_hash?: string | null;
|
|
27
|
+
previous_hash?: string | null;
|
|
25
28
|
}
|
|
26
29
|
/** Normalize a parsed SSE frame into a WorklogRecord (defaults missing fields; never throws). */
|
|
27
30
|
declare function frameToRecord(frame: RawFrame): WorklogRecord;
|
package/dist/worklog/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as EventInterpreter,
|
|
2
|
-
export { b as EventRole, N as NodeKind, c as NodeStatus, R as RunStatus, d as WorklogNode, i as initialWorklogState } from '../types-
|
|
1
|
+
import { E as EventInterpreter, W as WorklogRecord, a as WorklogState } from '../types-C-6fgK1_.js';
|
|
2
|
+
export { b as EventRole, N as NodeKind, c as NodeStatus, R as RunStatus, d as WorklogDetail, e as WorklogEventDetail, f as WorklogEventPage, g as WorklogNode, h as WorklogPage, i as WorklogSummary, j as WorklogVerificationResult, k as initialWorklogState } from '../types-C-6fgK1_.js';
|
|
3
3
|
|
|
4
4
|
declare const EVENT_REGISTRY: Record<string, EventInterpreter>;
|
|
5
5
|
declare function resolveInterpreter(eventClass: string): EventInterpreter;
|
|
@@ -22,6 +22,9 @@ interface RawFrame {
|
|
|
22
22
|
data?: unknown;
|
|
23
23
|
status?: string | null;
|
|
24
24
|
date_submitted?: string;
|
|
25
|
+
/** Runtime v0.5.0+ tamper-evident hash chain fields. */
|
|
26
|
+
entry_hash?: string | null;
|
|
27
|
+
previous_hash?: string | null;
|
|
25
28
|
}
|
|
26
29
|
/** Normalize a parsed SSE frame into a WorklogRecord (defaults missing fields; never throws). */
|
|
27
30
|
declare function frameToRecord(frame: RawFrame): WorklogRecord;
|
package/dist/worklog/index.js
CHANGED
|
@@ -212,7 +212,9 @@ function frameToRecord(frame) {
|
|
|
212
212
|
control_id: frame.control_id ?? null,
|
|
213
213
|
data: frame.data,
|
|
214
214
|
status,
|
|
215
|
-
date_submitted: typeof frame.date_submitted === "string" ? frame.date_submitted : ""
|
|
215
|
+
date_submitted: typeof frame.date_submitted === "string" ? frame.date_submitted : "",
|
|
216
|
+
entry_hash: frame.entry_hash ?? null,
|
|
217
|
+
previous_hash: frame.previous_hash ?? null
|
|
216
218
|
};
|
|
217
219
|
}
|
|
218
220
|
//# sourceMappingURL=index.js.map
|
|
@@ -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 event_class: string;\n control_id: string | null;\n data: unknown;\n status: \"success\" | \"error\" | null;\n date_submitted: string;\n}\n\n/** Semantic bucket a node belongs to. */\nexport type NodeKind =\n | \"safeguard\"\n | \"reasoning\"\n | \"tool\"\n | \"a2a\"\n | \"memory\"\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\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\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 // 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}\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 };\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"],"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 | \"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\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\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 // 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"]}
|
package/dist/worklog/index.mjs
CHANGED
|
@@ -180,7 +180,9 @@ function frameToRecord(frame) {
|
|
|
180
180
|
control_id: frame.control_id ?? null,
|
|
181
181
|
data: frame.data,
|
|
182
182
|
status,
|
|
183
|
-
date_submitted: typeof frame.date_submitted === "string" ? frame.date_submitted : ""
|
|
183
|
+
date_submitted: typeof frame.date_submitted === "string" ? frame.date_submitted : "",
|
|
184
|
+
entry_hash: frame.entry_hash ?? null,
|
|
185
|
+
previous_hash: frame.previous_hash ?? null
|
|
184
186
|
};
|
|
185
187
|
}
|
|
186
188
|
export {
|
|
@@ -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 event_class: string;\n control_id: string | null;\n data: unknown;\n status: \"success\" | \"error\" | null;\n date_submitted: string;\n}\n\n/** Semantic bucket a node belongs to. */\nexport type NodeKind =\n | \"safeguard\"\n | \"reasoning\"\n | \"tool\"\n | \"a2a\"\n | \"memory\"\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\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\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 // 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}\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 };\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"],"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 | \"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\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\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 // 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"]}
|
package/package.json
CHANGED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/** One granular Runtime worklog record (a `bus_mode` SSE frame or a `/worklog/{task_id}/events` item). */
|
|
2
|
-
interface WorklogRecord {
|
|
3
|
-
event_class: string;
|
|
4
|
-
control_id: string | null;
|
|
5
|
-
data: unknown;
|
|
6
|
-
status: "success" | "error" | null;
|
|
7
|
-
date_submitted: string;
|
|
8
|
-
}
|
|
9
|
-
/** Semantic bucket a node belongs to. */
|
|
10
|
-
type NodeKind = "safeguard" | "reasoning" | "tool" | "a2a" | "memory" | "answer" | "unknown";
|
|
11
|
-
/** Lifecycle state of a single node. */
|
|
12
|
-
type NodeStatus = "pending" | "running" | "completed" | "failed" | "skipped";
|
|
13
|
-
/** Overall run status. */
|
|
14
|
-
type RunStatus = "idle" | "running" | "success" | "error";
|
|
15
|
-
/** A single step in the execution chain (command + its response merged by control_id). */
|
|
16
|
-
interface WorklogNode {
|
|
17
|
-
id: string;
|
|
18
|
-
kind: NodeKind;
|
|
19
|
-
eventClass: string;
|
|
20
|
-
status: NodeStatus;
|
|
21
|
-
title: string;
|
|
22
|
-
startedAt?: string;
|
|
23
|
-
endedAt?: string;
|
|
24
|
-
depth: number;
|
|
25
|
-
parentId?: string;
|
|
26
|
-
children: WorklogNode[];
|
|
27
|
-
command?: unknown;
|
|
28
|
-
response?: unknown;
|
|
29
|
-
error?: string;
|
|
30
|
-
raw: WorklogRecord[];
|
|
31
|
-
}
|
|
32
|
-
/** Normalized execution model produced by the reducer. */
|
|
33
|
-
interface WorklogState {
|
|
34
|
-
taskId: string | null;
|
|
35
|
-
status: RunStatus;
|
|
36
|
-
answer: string | null;
|
|
37
|
-
nodes: WorklogNode[];
|
|
38
|
-
index: Record<string, number>;
|
|
39
|
-
raw: WorklogRecord[];
|
|
40
|
-
}
|
|
41
|
-
/** How a record acts on the model. */
|
|
42
|
-
type EventRole = "open" | "close" | "run-open" | "run-close" | "ignore";
|
|
43
|
-
/** Registry descriptor for one event_class. */
|
|
44
|
-
interface EventInterpreter {
|
|
45
|
-
kind: NodeKind;
|
|
46
|
-
role: EventRole;
|
|
47
|
-
title: (record: WorklogRecord) => string;
|
|
48
|
-
/** If true, an opened node starts in "pending" (awaiting external input) rather than "running". */
|
|
49
|
-
pending?: boolean;
|
|
50
|
-
}
|
|
51
|
-
declare function initialWorklogState(taskId?: string | null): WorklogState;
|
|
52
|
-
|
|
53
|
-
export { type EventInterpreter as E, type NodeKind as N, type RunStatus as R, type WorklogState as W, type WorklogRecord as a, type EventRole as b, type NodeStatus as c, type WorklogNode as d, initialWorklogState as i };
|
package/dist/types-Dvu9y4WM.d.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/** One granular Runtime worklog record (a `bus_mode` SSE frame or a `/worklog/{task_id}/events` item). */
|
|
2
|
-
interface WorklogRecord {
|
|
3
|
-
event_class: string;
|
|
4
|
-
control_id: string | null;
|
|
5
|
-
data: unknown;
|
|
6
|
-
status: "success" | "error" | null;
|
|
7
|
-
date_submitted: string;
|
|
8
|
-
}
|
|
9
|
-
/** Semantic bucket a node belongs to. */
|
|
10
|
-
type NodeKind = "safeguard" | "reasoning" | "tool" | "a2a" | "memory" | "answer" | "unknown";
|
|
11
|
-
/** Lifecycle state of a single node. */
|
|
12
|
-
type NodeStatus = "pending" | "running" | "completed" | "failed" | "skipped";
|
|
13
|
-
/** Overall run status. */
|
|
14
|
-
type RunStatus = "idle" | "running" | "success" | "error";
|
|
15
|
-
/** A single step in the execution chain (command + its response merged by control_id). */
|
|
16
|
-
interface WorklogNode {
|
|
17
|
-
id: string;
|
|
18
|
-
kind: NodeKind;
|
|
19
|
-
eventClass: string;
|
|
20
|
-
status: NodeStatus;
|
|
21
|
-
title: string;
|
|
22
|
-
startedAt?: string;
|
|
23
|
-
endedAt?: string;
|
|
24
|
-
depth: number;
|
|
25
|
-
parentId?: string;
|
|
26
|
-
children: WorklogNode[];
|
|
27
|
-
command?: unknown;
|
|
28
|
-
response?: unknown;
|
|
29
|
-
error?: string;
|
|
30
|
-
raw: WorklogRecord[];
|
|
31
|
-
}
|
|
32
|
-
/** Normalized execution model produced by the reducer. */
|
|
33
|
-
interface WorklogState {
|
|
34
|
-
taskId: string | null;
|
|
35
|
-
status: RunStatus;
|
|
36
|
-
answer: string | null;
|
|
37
|
-
nodes: WorklogNode[];
|
|
38
|
-
index: Record<string, number>;
|
|
39
|
-
raw: WorklogRecord[];
|
|
40
|
-
}
|
|
41
|
-
/** How a record acts on the model. */
|
|
42
|
-
type EventRole = "open" | "close" | "run-open" | "run-close" | "ignore";
|
|
43
|
-
/** Registry descriptor for one event_class. */
|
|
44
|
-
interface EventInterpreter {
|
|
45
|
-
kind: NodeKind;
|
|
46
|
-
role: EventRole;
|
|
47
|
-
title: (record: WorklogRecord) => string;
|
|
48
|
-
/** If true, an opened node starts in "pending" (awaiting external input) rather than "running". */
|
|
49
|
-
pending?: boolean;
|
|
50
|
-
}
|
|
51
|
-
declare function initialWorklogState(taskId?: string | null): WorklogState;
|
|
52
|
-
|
|
53
|
-
export { type EventInterpreter as E, type NodeKind as N, type RunStatus as R, type WorklogState as W, type WorklogRecord as a, type EventRole as b, type NodeStatus as c, type WorklogNode as d, initialWorklogState as i };
|