@ekairos/story 1.21.30-beta.0 → 1.21.32-beta.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 (108) hide show
  1. package/README.md +174 -0
  2. package/dist/agent.builder.d.ts +52 -0
  3. package/dist/agent.builder.d.ts.map +1 -0
  4. package/dist/agent.builder.js +110 -0
  5. package/dist/agent.builder.js.map +1 -0
  6. package/dist/agent.d.ts +2 -119
  7. package/dist/agent.d.ts.map +1 -1
  8. package/dist/agent.engine.d.ts +75 -0
  9. package/dist/agent.engine.d.ts.map +1 -0
  10. package/dist/agent.engine.js +455 -0
  11. package/dist/agent.engine.js.map +1 -0
  12. package/dist/agent.js +8 -607
  13. package/dist/agent.js.map +1 -1
  14. package/dist/ekairos.config.d.ts +21 -0
  15. package/dist/ekairos.config.d.ts.map +1 -0
  16. package/dist/ekairos.config.js +26 -0
  17. package/dist/ekairos.config.js.map +1 -0
  18. package/dist/events.d.ts +11 -7
  19. package/dist/events.d.ts.map +1 -1
  20. package/dist/events.js +37 -210
  21. package/dist/events.js.map +1 -1
  22. package/dist/index.d.ts +4 -4
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +7 -25
  25. package/dist/index.js.map +1 -1
  26. package/dist/legacy.story.d.ts +5 -0
  27. package/dist/legacy.story.d.ts.map +1 -0
  28. package/dist/legacy.story.js +15 -0
  29. package/dist/legacy.story.js.map +1 -0
  30. package/dist/runtime.d.ts +12 -0
  31. package/dist/runtime.js +12 -0
  32. package/dist/schema-document.d.ts +0 -1
  33. package/dist/schema-document.js +14 -18
  34. package/dist/schema-document.js.map +1 -1
  35. package/dist/schema.d.ts +0 -1
  36. package/dist/schema.js +22 -26
  37. package/dist/schema.js.map +1 -1
  38. package/dist/steps/do-story-stream-step.d.ts +29 -0
  39. package/dist/steps/do-story-stream-step.d.ts.map +1 -0
  40. package/dist/steps/do-story-stream-step.js +89 -0
  41. package/dist/steps/do-story-stream-step.js.map +1 -0
  42. package/dist/steps/index.d.ts +1 -3
  43. package/dist/steps/index.d.ts.map +1 -1
  44. package/dist/steps/index.js +3 -17
  45. package/dist/steps/index.js.map +1 -1
  46. package/dist/steps/store.steps.d.ts +43 -0
  47. package/dist/steps/store.steps.d.ts.map +1 -0
  48. package/dist/steps/store.steps.js +123 -0
  49. package/dist/steps/store.steps.js.map +1 -0
  50. package/dist/steps/story.steps.d.ts +35 -0
  51. package/dist/steps/story.steps.d.ts.map +1 -0
  52. package/dist/steps/story.steps.js +59 -0
  53. package/dist/steps/story.steps.js.map +1 -0
  54. package/dist/steps/stream.steps.d.ts +28 -0
  55. package/dist/steps/stream.steps.d.ts.map +1 -0
  56. package/dist/steps/stream.steps.js +75 -0
  57. package/dist/steps/stream.steps.js.map +1 -0
  58. package/dist/stores/instant.document-parser.d.ts +5 -0
  59. package/dist/stores/instant.document-parser.d.ts.map +1 -0
  60. package/dist/stores/instant.document-parser.js +116 -0
  61. package/dist/stores/instant.document-parser.js.map +1 -0
  62. package/dist/stores/instant.documents.d.ts +16 -0
  63. package/dist/stores/instant.documents.js +108 -0
  64. package/dist/stores/instant.store.d.ts +40 -0
  65. package/dist/stores/instant.store.d.ts.map +1 -0
  66. package/dist/stores/instant.store.js +207 -0
  67. package/dist/stores/instant.store.js.map +1 -0
  68. package/dist/story.builder.d.ts +116 -0
  69. package/dist/story.builder.d.ts.map +1 -0
  70. package/dist/story.builder.js +130 -0
  71. package/dist/story.builder.js.map +1 -0
  72. package/dist/story.config.d.ts +43 -0
  73. package/dist/story.config.d.ts.map +1 -0
  74. package/dist/story.config.js +57 -0
  75. package/dist/story.config.js.map +1 -0
  76. package/dist/story.d.ts +2 -50
  77. package/dist/story.d.ts.map +1 -1
  78. package/dist/story.engine.d.ts +174 -0
  79. package/dist/story.engine.d.ts.map +1 -0
  80. package/dist/story.engine.js +283 -0
  81. package/dist/story.engine.js.map +1 -0
  82. package/dist/story.js +6 -55
  83. package/dist/story.js.map +1 -1
  84. package/dist/story.legacy.d.ts +12 -0
  85. package/dist/story.legacy.d.ts.map +1 -0
  86. package/dist/story.legacy.js +15 -0
  87. package/dist/story.legacy.js.map +1 -0
  88. package/dist/story.registry.d.ts +21 -0
  89. package/dist/story.registry.d.ts.map +1 -0
  90. package/dist/story.registry.js +30 -0
  91. package/dist/story.registry.js.map +1 -0
  92. package/dist/story.store.d.ts +59 -0
  93. package/dist/story.store.d.ts.map +1 -0
  94. package/dist/story.store.js +1 -0
  95. package/dist/story.store.js.map +1 -0
  96. package/dist/story.streams.d.ts +55 -0
  97. package/dist/story.streams.d.ts.map +1 -0
  98. package/dist/story.streams.js +99 -0
  99. package/dist/story.streams.js.map +1 -0
  100. package/dist/story.toolcalls.d.ts +60 -0
  101. package/dist/story.toolcalls.d.ts.map +1 -0
  102. package/dist/story.toolcalls.js +73 -0
  103. package/dist/story.toolcalls.js.map +1 -0
  104. package/dist/tools-to-model-tools.d.ts +19 -0
  105. package/dist/tools-to-model-tools.js +21 -0
  106. package/dist/workflow.d.ts +20 -0
  107. package/dist/workflow.js +27 -0
  108. package/package.json +15 -4
package/dist/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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","sourcesContent":["import { init, id, tx, lookup, InstaQLEntity,InstantAdminDatabase } from \"@instantdb/admin\"\nimport { convertToModelMessages, createUIMessageStream, generateText, ModelMessage, smoothStream, stepCountIs, streamText, Tool, tool, UIMessageStreamWriter } from \"ai\"\nimport { openai } from \"@ai-sdk/openai\"\nimport { z } from \"zod\"\n\nimport { UIMessage } from 'ai';\nimport { initLogger } from \"braintrust\";\nimport { AgentService, ContextEvent, ContextIdentifier, StoredContext } from \"./service\";\nimport { ASSISTANT_MESSAGE_TYPE, convertEventsToModelMessages, convertEventToModelMessages, convertModelMessageToEvent, createAssistantEventFromUIMessages, createUserEventFromUIMessages, ResponseMessage, SYSTEM_MESSAGE_TYPE } from \"./events\";\n\nimport { storyDomain } from \"./schema\";\nimport { SchemaOf } from \"@ekairos/domain\";\n\n// Inicializar Braintrust logger\nconst logger = initLogger({\n projectName: \"pulzar platform\",\n apiKey: process.env.BRAINTRUST_API_KEY,\n});\n\n// Define your custom message type with data part schemas\nexport type AgentMessage = UIMessage<\n never, // metadata type\n {\n weather: {\n city: string;\n weather?: string;\n status: 'loading' | 'success';\n };\n notification: {\n message: string;\n level: 'info' | 'warning' | 'error';\n };\n } // data parts type\n>;\n\nexport interface AgentOptions {\n onEventCreated?: (event: any) => void | Promise<void>\n evaluateToolCalls?: (toolCalls: any[]) => Promise<{ success: boolean; message?: string }>\n onToolCallExecuted?: (executionEvent: any) => void | Promise<void>\n onEnd?: (lastEvent: ContextEvent) => void | { end?: boolean } | Promise<void | { end?: boolean }>\n}\n\nexport interface ProgressStreamOptions {\n reasoningEffort?: \"off\" | \"low\" | \"medium\" | \"high\"\n webSearch?: boolean\n}\n\nexport type DataStreamWriter = UIMessageStreamWriter<AgentMessage>\nconst createDataStream = createUIMessageStream;\n\n\nexport abstract class Story<Context> {\n protected db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>\n protected agentService: AgentService\n\n constructor(db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>, private opts: AgentOptions = {}) {\n this.db = db\n this.agentService = new AgentService(db)\n }\n\n protected abstract buildSystemPrompt(context: StoredContext<Context>, ...args: any[]): Promise<string> | string\n protected abstract buildTools(context: StoredContext<Context>, dataStream: DataStreamWriter): Promise<Record<string, Tool>>\n protected abstract initialize(context: StoredContext<Context>): Promise<Context>\n\n protected getModel(context: StoredContext<Context>) {\n return \"openai/gpt-5\"\n }\n\n protected includeBaseTools(): { createMessage: boolean; requestDirection: boolean; end: boolean } {\n return { createMessage: true, requestDirection: true, end: true }\n }\n\n protected async getFinalizationToolNames(): Promise<string[]> {\n return []\n }\n\n private static readonly FINAL_TOOL_NAMES = [\"createMessage\", \"requestDirection\", \"end\"]\n\n protected getBaseTools(dataStream: DataStreamWriter, threadId: string): Record<string, Tool> {\n const include = this.includeBaseTools()\n const baseTools: Record<string, Tool> = {}\n\n if (include.createMessage) {\n baseTools.createMessage = tool({\n description: \"Send a message to the user. Use for final confirmations or information.\",\n inputSchema: z.object({\n message: z.string().describe(\"Message for the user in markdown format\")\n }),\n })\n }\n\n if (include.requestDirection) {\n baseTools.requestDirection = tool({\n description: \"Ask a human for guidance when blocked or unsure.\",\n inputSchema: z.object({\n issue: z.string(),\n context: z.string(),\n suggestedActions: z.array(z.string()).optional(),\n urgency: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\"),\n }),\n })\n }\n\n if (include.end) {\n baseTools.end = tool({\n description: \"End the current interaction loop.\",\n inputSchema: z.object({}).strict(),\n execute: async () => {\n return { success: true, message: \"Ended\" }\n },\n })\n }\n\n return baseTools\n }\n\n protected async executeCreateMessage(\n eventId: string,\n args: { message: string; type: \"info\" | \"confirmation\" | \"warning\" | \"error\" | \"success\"; includeContext?: boolean },\n threadId: string,\n dataStream?: DataStreamWriter,\n ): Promise<any> {\n const assistantMessage = { id: eventId, role: \"assistant\" as const, content: args.message, createdAt: new Date() } as any\n try {\n await this.saveMessagesToThread(threadId, [assistantMessage])\n } catch { }\n if (dataStream) {\n //dataStream.writeData({ type: \"user-response\", message: args.message, responseType: args.type, includeContext: Boolean(args.includeContext), timestamp: new Date().toISOString() } as any)\n }\n return { success: true, message: args.message, data: { messageId: assistantMessage.id, threadId } }\n }\n\n protected async executeRequestDirection(\n eventId: string,\n args: { issue: string; context: string; suggestedActions?: string[]; urgency: \"low\" | \"medium\" | \"high\" },\n threadId: string,\n _dataStream?: DataStreamWriter,\n ): Promise<any> {\n const systemMessage = { id: eventId, role: \"assistant\" as const, content: `Direction requested: ${args.issue}\\nContext: ${args.context}`, createdAt: new Date() } as any\n return { success: true, message: \"Direction requested\", data: { messageId: systemMessage.id, threadId } }\n }\n\n public async progressStream(\n incomingEvent: ContextEvent,\n contextIdentifier: ContextIdentifier | null,\n options?: ProgressStreamOptions\n ) {\n\n // get or create context\n const currentContext = await this.agentService.getOrCreateContext<Context>(contextIdentifier)\n\n const contextSelector: ContextIdentifier = contextIdentifier?.id\n ? { id: String(contextIdentifier.id) }\n : contextIdentifier?.key\n ? { key: contextIdentifier.key }\n : { id: String(currentContext.id) }\n\n // save incoming event\n const triggerEvent = await this.agentService.saveEvent(contextSelector, incomingEvent)\n\n const triggerEventId = triggerEvent.id // trigger event id\n const eventId = id() // reaction event id\n\n // Set context status to \"streaming\" before creating execution\n await this.agentService.updateContextStatus(contextSelector, \"streaming\")\n\n // create execution and set context status\n const execution = await this.agentService.createExecution(contextSelector, triggerEventId, eventId)\n const executionId = execution.id\n\n let latestReactionEvent: ContextEvent | null = null\n let executionStatus: \"executing\" | \"completed\" | \"failed\" = \"executing\"\n\n const markFailure = async () => {\n if (latestReactionEvent && latestReactionEvent.status !== \"failed\") {\n try {\n latestReactionEvent = await this.agentService.updateEvent(latestReactionEvent.id, {\n ...latestReactionEvent,\n status: \"failed\",\n })\n }\n catch (eventError) {\n console.error(\"Failed to mark reaction event as failed\", eventError)\n }\n }\n\n if (executionStatus === \"executing\") {\n try {\n await this.agentService.completeExecution(contextSelector, executionId, \"failed\")\n executionStatus = \"failed\"\n }\n catch (executionError) {\n console.error(\"Failed to mark execution as failed\", executionError)\n }\n }\n }\n\n const dataStreamResult = createDataStream({\n execute: async ({ writer: dataStream }: { writer: DataStreamWriter }) => {\n let loopSafety = 0\n const MAX_LOOPS = 20\n\n // load previous events (already in chronological order from InstantDB)\n const events: ContextEvent[] = await this.agentService.getEvents(contextSelector)\n const contextId = currentContext.id\n \n console.log(\"[agent] Loaded events from InstantDB:\", {\n contextId,\n eventsCount: events.length,\n eventsPreview: events.slice(-3).map((e: any) => ({\n id: e.id,\n type: e.type,\n createdAt: e.createdAt\n }))\n })\n\n let reactionEvent = await this.agentService.saveEvent(contextSelector, {\n id: eventId,\n type: \"assistant\",\n channel: \"agent\",\n createdAt: new Date().toISOString(),\n content: { parts: [] },\n status: \"pending\",\n })\n latestReactionEvent = reactionEvent\n\n dataStream.write({ type: \"event-start\", data: { eventId: eventId } } as any)\n while (loopSafety < MAX_LOOPS) {\n\n dataStream.write({ type: \"start-step\" })\n\n loopSafety++\n\n // Read context\n const currentContext = await this.agentService.getContext<Context>(contextSelector)\n dataStream.write({ type: \"data-context-id\", data: { contextId: currentContext.id } } as any)\n\n // Initialize on each loop and get new context data\n const contextContent = await this.initialize(currentContext)\n\n // Update context\n const updatedContext = await this.agentService.updateContextContent({ id: String(currentContext.id) }, contextContent)\n\n // Build tools\n const subclassToolsAll = await this.buildTools(updatedContext, dataStream)\n\n // Build base tools for agent loop control\n const baseTools = this.getBaseTools(dataStream, String(updatedContext.id))\n const tools: Record<string, Tool> = { ...subclassToolsAll, ...baseTools }\n\n // Add web search if enabled\n if (options?.webSearch) {\n tools.web_search = openai.tools.webSearch() as any\n }\n\n // Extract execute functions from tools\n const executeMap: Record<string, (args: any) => Promise<any>> = {}\n for (const [name, t] of Object.entries(subclassToolsAll)) {\n if ((t as any).execute) {\n executeMap[name] = (t as any).execute as (args: any) => Promise<any>\n }\n }\n\n const include = this.includeBaseTools()\n if (include.createMessage) {\n executeMap[\"createMessage\"] = (args: any) => this.executeCreateMessage(eventId, args, String(updatedContext.id), dataStream)\n }\n if (include.requestDirection) {\n executeMap[\"requestDirection\"] = (args: any) => this.executeRequestDirection(eventId, args, String(updatedContext.id), dataStream)\n }\n\n for (const [, t] of Object.entries(tools)) {\n delete (t as any).execute\n }\n\n const messagesForModel: ModelMessage[] = await convertEventsToModelMessages(\n reactionEvent.status !== \"pending\"\n ? [...events, reactionEvent]\n : [...events],\n this.db\n )\n\n const systemPrompt = await this.buildSystemPrompt(updatedContext)\n\n const providerOptions: any = {}\n const hasReasoning = options?.reasoningEffort && options.reasoningEffort !== \"off\"\n \n if (hasReasoning) {\n providerOptions.openai = {\n reasoningEffort: options.reasoningEffort,\n reasoningSummary: 'detailed',\n }\n console.log(\"[agent] Reasoning enabled:\", {\n reasoningEffort: options.reasoningEffort,\n model: this.getModel(updatedContext),\n providerOptions\n })\n } else {\n console.log(\"[agent] Reasoning disabled or off\")\n }\n\n // Allow more steps when using reasoning to give the model time to think\n const maxSteps = hasReasoning ? 5 : 1\n\n const result = streamText({\n model: this.getModel(updatedContext),\n system: systemPrompt,\n messages: messagesForModel,\n tools,\n toolChoice: \"required\",\n onStepFinish: (step) => {\n console.log(\"onStepFinish\", step)\n },\n stopWhen: stepCountIs(maxSteps),\n experimental_transform: smoothStream({\n delayInMs: 30,\n chunking: 'word',\n }),\n ...(Object.keys(providerOptions).length > 0 && { providerOptions }),\n })\n\n result.consumeStream()\n\n // create promise\n let resolveFinish!: (value: ContextEvent) => void\n let rejectFinish!: (reason?: unknown) => void\n const finishPromise = new Promise<ContextEvent>((resolve, reject) => {\n resolveFinish = resolve\n rejectFinish = reject\n })\n\n dataStream.merge(result.toUIMessageStream({\n sendStart: false,\n generateMessageId: () => {\n return eventId\n },\n messageMetadata(options) {\n return {\n eventId: eventId,\n }\n },\n onFinish: ({ messages }) => {\n console.log(\"[agent] Messages finished:\", messages.map((m: any) => ({\n role: m.role,\n parts: m.parts?.map((p: any) => ({\n type: p.type,\n text: p.text?.substring(0, 100),\n hasReasoning: p.type === \"reasoning\"\n }))\n })))\n const lastEvent = createAssistantEventFromUIMessages(eventId, messages)\n resolveFinish(lastEvent)\n },\n onError: (e: unknown) => {\n console.error(\"Agent error:\", e)\n rejectFinish(e)\n const message = e instanceof Error ? e.message : String(e)\n return message\n }\n }).pipeThrough(new TransformStream({\n transform(chunk: any, controller: any) {\n\n if (chunk.type === \"start\") {\n return;\n }\n\n if (chunk.type === \"finish-step\") {\n return;\n }\n\n if (chunk.type === \"start-step\") {\n return\n }\n\n if (chunk.type === \"finish\") {\n return;\n }\n\n controller.enqueue(chunk as any)\n }\n })))\n\n // wait for the on finish here\n const lastEvent = await finishPromise\n\n const toolCalls = lastEvent.content.parts.reduce((acc: any[], p: any) => {\n if (typeof p.type === \"string\" && p.type.startsWith(\"tool-\")) {\n const toolName = p.type.split(\"-\")[1]\n acc.push({ toolCallId: p.toolCallId, toolName: toolName, args: p.input });\n }\n return acc;\n }, []);\n\n console.log(\"agent.toolCalls.detected\", {\n eventId,\n toolCalls: toolCalls.map((call: any) => ({ toolCallId: call.toolCallId, toolName: call.toolName }))\n });\n\n if (!toolCalls.length) {\n const shouldEndInteraction = await this.callOnEnd(lastEvent)\n if (shouldEndInteraction) {\n break\n }\n continue\n }\n const reactionEventWithParts = {\n ...reactionEvent,\n content: { parts: [...reactionEvent.content.parts, ...lastEvent.content.parts] },\n }\n\n let currentEventState = await this.agentService.updateEvent(reactionEvent.id, reactionEventWithParts)\n latestReactionEvent = currentEventState\n\n const executionResults = await Promise.all(toolCalls.map(async (tc: any) => {\n console.log(\"agent.toolCall.selected\", {\n eventId,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName\n })\n\n let execSuccess = true\n let execMessage = \"Executed\"\n let execResult: any = null\n try {\n const execFn = executeMap[tc.toolName]\n if (execFn) {\n console.log(\"agent.toolCall.execute.start\", { toolCallId: tc.toolCallId, toolName: tc.toolName })\n execResult = await execFn(tc.args)\n execSuccess = execResult?.success !== false\n execMessage = execResult?.message || execMessage\n console.log(\"agent.toolCall.execute.success\", {\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n success: execSuccess\n })\n console.log(\"agent.toolCall.execute.result\", {\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n result: execResult\n })\n }\n }\n catch (err: any) {\n execSuccess = false\n execMessage = err.message\n console.error(\"agent.toolCall.execute.error\", {\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n error: err\n })\n }\n\n return { tc, execSuccess, execMessage, execResult }\n }))\n\n let exitOuterLoop = false\n const customFinalizationTools = await this.getFinalizationToolNames()\n const allFinalToolNames = [...Story.FINAL_TOOL_NAMES, ...customFinalizationTools]\n\n for (const { tc, execSuccess, execMessage, execResult } of executionResults) {\n try {\n if (execSuccess) {\n dataStream.write({\n type: \"tool-output-available\",\n toolCallId: tc.toolCallId,\n output: execResult,\n } as any)\n }\n else {\n dataStream.write({\n type: \"tool-output-error\",\n toolCallId: tc.toolCallId,\n errorText: String(execMessage || \"Error\"),\n } as any)\n }\n }\n catch (e) {\n console.error(\"Failed to write tool result to stream\", e)\n }\n\n const existingParts = currentEventState?.content?.parts || []\n const mergedParts = existingParts.map((p: any) => {\n if (p.type === `tool-${tc.toolName}` && p.toolCallId === tc.toolCallId) {\n if (execSuccess) {\n return {\n ...p,\n state: \"output-available\",\n output: execResult,\n }\n }\n return {\n ...p,\n state: \"output-error\",\n errorText: String(execMessage || \"Error\"),\n }\n }\n return p\n })\n\n currentEventState = await this.agentService.updateEvent(currentEventState.id, {\n id: currentEventState.id,\n type: currentEventState.type,\n channel: \"agent\",\n createdAt: currentEventState.createdAt,\n content: { parts: mergedParts },\n })\n\n dataStream.write({ type: \"finish-step\" })\n\n await this.opts.onToolCallExecuted?.({\n id: currentEventState.id,\n toolCall: tc,\n event: currentEventState.id,\n success: execSuccess,\n message: execMessage,\n result: execResult,\n })\n\n let shouldEnd = false\n if (!execSuccess) {\n const shouldEndInteraction = await this.callOnEnd(lastEvent)\n if (shouldEndInteraction) {\n shouldEnd = true\n }\n }\n\n if (!shouldEnd) {\n if (allFinalToolNames.includes(tc.toolName)) {\n const shouldEndInteraction = await this.callOnEnd(lastEvent)\n if (shouldEndInteraction) {\n shouldEnd = true\n }\n }\n }\n\n if (shouldEnd) {\n dataStream.write({ type: \"finish\", override: true } as any)\n exitOuterLoop = true\n break\n }\n }\n\n reactionEvent = currentEventState\n\n if (exitOuterLoop) {\n break\n }\n }\n reactionEvent = await this.agentService.updateEvent(reactionEvent.id, {\n ...reactionEvent,\n status: \"completed\",\n })\n latestReactionEvent = reactionEvent\n try {\n await this.agentService.completeExecution(contextSelector, executionId, \"completed\")\n executionStatus = \"completed\"\n }\n catch (error) {\n console.error(\"Failed to mark execution as completed\", error)\n }\n },\n onError: (error) => {\n console.error(\"Agent error:\", error)\n void markFailure()\n return error instanceof Error ? error.message : String(error)\n },\n onFinish: async () => {\n if (executionStatus === \"executing\") {\n try {\n await this.agentService.completeExecution(contextSelector, executionId, \"completed\")\n executionStatus = \"completed\"\n }\n catch (executionError) {\n console.error(\"Failed to finalize execution on finish\", executionError)\n }\n }\n console.log(\"Agent finished\")\n }\n })\n\n // start the stream\n\n const dataStreamFilteredResult = dataStreamResult.pipeThrough(new TransformStream({\n transform(chunk: any, controller: any) {\n if (chunk.type === \"start\") {\n console.log(\"start\", chunk.data)\n return;\n }\n\n if (chunk.type === \"event-start\") {\n controller.enqueue({ type: \"start\", messageId: chunk.data.eventId })\n return;\n }\n\n controller.enqueue(chunk as any)\n }\n }))\n\n return {\n contextId: currentContext.id,\n triggerEventId,\n reactionEventId: eventId,\n stream: dataStreamFilteredResult,\n executionId,\n }\n }\n\n private async saveMessagesToThread(threadId: string, messages: Array<any>) {\n // Placeholder for persistence hook. Not implemented in current scope.\n return\n }\n\n private async callOnEnd(lastEvent: ContextEvent): Promise<boolean> {\n if (!this.opts.onEnd) {\n return true\n }\n\n try {\n const result = await this.opts.onEnd(lastEvent)\n if (typeof result === \"boolean\") {\n return result\n }\n if (result && typeof result === \"object\") {\n if (Object.prototype.hasOwnProperty.call(result, \"end\")) {\n return Boolean(result.end)\n }\n }\n return true\n } catch (error) {\n console.error(\"onEnd callback failed\", error)\n return true\n }\n }\n\n\n\n\n}\n\nexport interface AgentConfig<Context> {\n db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>\n context: (context: StoredContext<Context>) => Promise<Context> | Context\n systemPrompt: (context: StoredContext<Context>) => Promise<string> | string\n tools: (context: StoredContext<Context>, dataStream: DataStreamWriter) => Promise<Record<string, Tool>> | Record<string, Tool>\n model?: string | ((context: StoredContext<Context>) => string)\n opts?: AgentOptions\n includeBaseTools?: { createMessage?: boolean; requestDirection?: boolean; end?: boolean }\n}\n\nexport type AgentInstance<Context> = Story<Context> & {\n readonly __config: AgentConfig<Context>\n}\n\nexport function agent<Context>(config: AgentConfig<Context>): AgentInstance<Context> {\n class FunctionalAgent extends Story<Context> {\n public readonly __config = config\n\n constructor() {\n super(config.db, config.opts)\n }\n\n protected includeBaseTools(): { createMessage: boolean; requestDirection: boolean; end: boolean } {\n if (config.includeBaseTools) {\n return {\n createMessage: config.includeBaseTools.createMessage ?? true,\n requestDirection: config.includeBaseTools.requestDirection ?? true,\n end: config.includeBaseTools.end ?? true,\n }\n }\n return super.includeBaseTools()\n }\n\n protected async buildSystemPrompt(context: StoredContext<Context>) {\n return config.systemPrompt(context)\n }\n\n protected async buildTools(context: StoredContext<Context>, dataStream: DataStreamWriter) {\n return config.tools(context, dataStream)\n }\n\n protected async initialize(context: StoredContext<Context>) {\n return config.context(context)\n }\n\n protected getModel(context: StoredContext<Context>) {\n if (typeof config.model === 'function') {\n return config.model(context)\n }\n return config.model || super.getModel(context)\n }\n }\n const instance = new FunctionalAgent()\n return Object.assign(instance, { __config: config })\n}\n\n// Alias para retrocompatibilidad\nexport { Story as Agent }\n\ntype InitializedStoredContext<Context> = StoredContext<Context> & { content: Context }\n\ntype BuilderSystemPrompt<Context> = (\n context: InitializedStoredContext<Context>\n) => Promise<string> | string\n\ntype BuilderTools<Context> = (\n context: InitializedStoredContext<Context>,\n dataStream: DataStreamWriter\n) => Promise<Record<string, Tool>> | Record<string, Tool>\n\ntype BuilderModel<Context> =\n | string\n | ((context: InitializedStoredContext<Context>) => string)\n\ntype BuilderIncludeBaseTools = { createMessage?: boolean; requestDirection?: boolean; end?: boolean }\n\ntype FluentAgentBuilder<Context> = {\n systemPrompt(fn: BuilderSystemPrompt<Context>): FluentAgentBuilder<Context>\n tools(fn: BuilderTools<Context>): FluentAgentBuilder<Context>\n model(model: BuilderModel<Context>): FluentAgentBuilder<Context>\n opts(opts: AgentOptions): FluentAgentBuilder<Context>\n includeBaseTools(baseTools: BuilderIncludeBaseTools): FluentAgentBuilder<Context>\n config(): AgentConfig<Context>\n build(): AgentInstance<Context>\n}\n\ntype AnyContextInitializer = (context: StoredContext<any>) => Promise<any> | any\n\ntype InferContextFromInitializer<I extends AnyContextInitializer> = Awaited<ReturnType<I>>\n\ntype CreateAgentEntry = {\n context<Initializer extends AnyContextInitializer>(\n initializer: Initializer\n ): FluentAgentBuilder<InferContextFromInitializer<Initializer>>\n initialize<Initializer extends AnyContextInitializer>(\n initializer: Initializer\n ): FluentAgentBuilder<InferContextFromInitializer<Initializer>>\n}\n\nfunction assertConfigComplete<Context>(\n config: Partial<AgentConfig<Context>>\n): asserts config is AgentConfig<Context> {\n if (!config.db) {\n throw new Error(\"createAgent: Debes proporcionar db como parámetro.\")\n }\n\n if (!config.context) {\n throw new Error(\"createAgent: Debes definir context() antes de construir el agente.\")\n }\n\n if (!config.systemPrompt) {\n throw new Error(\"createAgent: Debes definir systemPrompt() antes de construir el agente.\")\n }\n\n if (!config.tools) {\n throw new Error(\"createAgent: Debes definir tools() antes de construir el agente.\")\n }\n}\n\nfunction ensureInitializedContext<Context>(\n context: StoredContext<Context>\n): InitializedStoredContext<Context> {\n if (!context.content) {\n throw new Error(\n \"createAgent: context() debe devolver datos antes de usar systemPrompt/tools.\"\n )\n }\n return context as InitializedStoredContext<Context>\n}\n\nexport function createAgent(db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>): CreateAgentEntry {\n const initializeBuilder = <Initializer extends AnyContextInitializer>(initializer: Initializer) => {\n type Context = InferContextFromInitializer<Initializer>\n\n const typedInitializer: AgentConfig<Context>[\"context\"] = (context) =>\n initializer(context as StoredContext<Context>)\n\n const fluentState: Partial<AgentConfig<Context>> = {\n db,\n context: typedInitializer,\n }\n\n const builder: FluentAgentBuilder<Context> = {\n systemPrompt(systemPrompt) {\n fluentState.systemPrompt = (context) =>\n systemPrompt(ensureInitializedContext(context))\n return builder\n },\n tools(toolsFactory) {\n fluentState.tools = (context, dataStream) =>\n toolsFactory(ensureInitializedContext(context), dataStream)\n return builder\n },\n model(model) {\n if (typeof model === \"function\") {\n fluentState.model = (context) =>\n model(ensureInitializedContext(context))\n } else {\n fluentState.model = model\n }\n return builder\n },\n opts(options) {\n fluentState.opts = options\n return builder\n },\n includeBaseTools(baseTools) {\n fluentState.includeBaseTools = baseTools\n return builder\n },\n config() {\n assertConfigComplete(fluentState)\n return fluentState\n },\n build() {\n assertConfigComplete(fluentState)\n return agent(fluentState)\n },\n }\n\n return builder\n }\n\n return {\n context: initializeBuilder,\n initialize: initializeBuilder,\n }\n}\n\n"]}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":";;;AAAA,+CAMuB;AALrB,SAAS;AACT,qGAAA,KAAK,OAAA;AAMP,iDAMwB;AALtB,UAAU;AACV,sGAAA,KAAK,OAAA;AACL,4GAAA,WAAW,OAAA","sourcesContent":["export {\n // engine\n Story,\n type StoryOptions,\n type ProgressStreamOptions,\n type DataStreamWriter,\n} from \"./agent.engine\"\n\nexport {\n // builder\n story,\n createStory,\n type StoryConfig,\n type StoryInstance,\n} from \"./agent.builder\""]}
@@ -0,0 +1,21 @@
1
+ import { type StoryRuntimeResolver } from "./story.config";
2
+ import type { StoryKey } from "./story.registry";
3
+ export type RegistrableStory = {
4
+ key: StoryKey;
5
+ register: () => void;
6
+ };
7
+ export type EkairosConfig = {
8
+ stories: RegistrableStory[];
9
+ runtime: StoryRuntimeResolver<any>;
10
+ setup: () => void;
11
+ };
12
+ /**
13
+ * Creates a small "framework-style" config object that can be executed in the step runtime.
14
+ *
15
+ * - Configures the global story runtime resolver (store)
16
+ * - Registers all stories in the runtime registry
17
+ */
18
+ export declare function createEkairosConfig<Env extends Record<string, unknown>>(params: {
19
+ runtime: StoryRuntimeResolver<Env>;
20
+ stories?: RegistrableStory[];
21
+ }): EkairosConfig;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ekairos.config.d.ts","sourceRoot":"","sources":["../src/ekairos.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEhD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,QAAQ,CAAA;IACb,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAA;IAClC,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE;IAC/E,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAA;IAClC,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;CAC7B,GAAG,aAAa,CAgBhB"}
@@ -0,0 +1,26 @@
1
+ import { configureStoryRuntime, configureStoryRuntimeBootstrap, isStoryRuntimeConfigured, } from "./story.config";
2
+ /**
3
+ * Creates a small "framework-style" config object that can be executed in the step runtime.
4
+ *
5
+ * - Configures the global story runtime resolver (store)
6
+ * - Registers all stories in the runtime registry
7
+ */
8
+ export function createEkairosConfig(params) {
9
+ const stories = params.stories ?? [];
10
+ return {
11
+ stories,
12
+ runtime: params.runtime,
13
+ setup() {
14
+ if (!isStoryRuntimeConfigured()) {
15
+ configureStoryRuntime(params.runtime);
16
+ }
17
+ // Allow store steps to self-bootstrap in step runtimes by reusing this config.
18
+ configureStoryRuntimeBootstrap(() => {
19
+ if (!isStoryRuntimeConfigured())
20
+ configureStoryRuntime(params.runtime);
21
+ });
22
+ for (const s of stories)
23
+ s.register();
24
+ },
25
+ };
26
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ekairos.config.js","sourceRoot":"","sources":["../src/ekairos.config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,8BAA8B,EAC9B,wBAAwB,GAEzB,MAAM,gBAAgB,CAAA;AAcvB;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAsC,MAGxE;IACC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;IACpC,OAAO;QACL,OAAO;QACP,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK;YACH,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC;gBAChC,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACvC,CAAC;YACD,+EAA+E;YAC/E,8BAA8B,CAAC,GAAG,EAAE;gBAClC,IAAI,CAAC,wBAAwB,EAAE;oBAAE,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACxE,CAAC,CAAC,CAAA;YACF,KAAK,MAAM,CAAC,IAAI,OAAO;gBAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;QACvC,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["import {\r\n configureStoryRuntime,\r\n configureStoryRuntimeBootstrap,\r\n isStoryRuntimeConfigured,\r\n type StoryRuntimeResolver,\r\n} from \"./story.config\"\r\nimport type { StoryKey } from \"./story.registry\"\r\n\r\nexport type RegistrableStory = {\r\n key: StoryKey\r\n register: () => void\r\n}\r\n\r\nexport type EkairosConfig = {\r\n stories: RegistrableStory[]\r\n runtime: StoryRuntimeResolver<any>\r\n setup: () => void\r\n}\r\n\r\n/**\r\n * Creates a small \"framework-style\" config object that can be executed in the step runtime.\r\n *\r\n * - Configures the global story runtime resolver (store)\r\n * - Registers all stories in the runtime registry\r\n */\r\nexport function createEkairosConfig<Env extends Record<string, unknown>>(params: {\r\n runtime: StoryRuntimeResolver<Env>\r\n stories?: RegistrableStory[]\r\n}): EkairosConfig {\r\n const stories = params.stories ?? []\r\n return {\r\n stories,\r\n runtime: params.runtime,\r\n setup() {\r\n if (!isStoryRuntimeConfigured()) {\r\n configureStoryRuntime(params.runtime)\r\n }\r\n // Allow store steps to self-bootstrap in step runtimes by reusing this config.\r\n configureStoryRuntimeBootstrap(() => {\r\n if (!isStoryRuntimeConfigured()) configureStoryRuntime(params.runtime)\r\n })\r\n for (const s of stories) s.register()\r\n },\r\n }\r\n}\r\n\r\n\r\n"]}
package/dist/events.d.ts CHANGED
@@ -1,8 +1,5 @@
1
- import { type InstantAdminDatabase } from "@instantdb/admin";
2
1
  import { type ModelMessage, type UIMessage } from "ai";
3
- import type { ContextEvent } from "./service";
4
- import { SchemaOf } from "@ekairos/domain";
5
- import { storyDomain } from "./schema";
2
+ import type { ContextEvent } from "./story.store";
6
3
  export declare const USER_MESSAGE_TYPE = "user.message";
7
4
  export declare const ASSISTANT_MESSAGE_TYPE = "assistant.message";
8
5
  export declare const SYSTEM_MESSAGE_TYPE = "system.message";
@@ -12,8 +9,16 @@ export declare const EMAIL_CHANNEL = "email";
12
9
  export declare function createUserEventFromUIMessages(messages: UIMessage[]): ContextEvent;
13
10
  export declare function createAssistantEventFromUIMessages(eventId: string, messages: UIMessage[]): ContextEvent;
14
11
  export declare function convertToUIMessage(event: ContextEvent): UIMessage;
15
- export declare function convertEventsToModelMessages(events: ContextEvent[], db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>): Promise<ModelMessage[]>;
16
- export declare function convertEventToModelMessages(event: ContextEvent, db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>): Promise<ModelMessage[]>;
12
+ /**
13
+ * Converts stored ContextEvents to AI SDK ModelMessages.
14
+ *
15
+ * IMPORTANT:
16
+ * - Store-agnostic and workflow-safe.
17
+ * - Attachment/document handling MUST happen in the store boundary:
18
+ * `StoryStore.eventsToModelMessages(events)`.
19
+ */
20
+ export declare function convertEventsToModelMessages(events: ContextEvent[]): Promise<ModelMessage[]>;
21
+ export declare function convertEventToModelMessages(event: ContextEvent): Promise<ModelMessage[]>;
17
22
  export type AIMessage = {
18
23
  id: string;
19
24
  role: "user" | "assistant" | "system";
@@ -28,4 +33,3 @@ export type ResponseMessage = {
28
33
  message: ModelMessage;
29
34
  };
30
35
  export declare function convertModelMessageToEvent(eventId: string, message: ResponseMessage): ContextEvent;
31
- //# sourceMappingURL=events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACtE,OAAO,EAA0B,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,IAAI,CAAA;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAEtC,eAAO,MAAM,iBAAiB,iBAAiB,CAAA;AAC/C,eAAO,MAAM,sBAAsB,sBAAsB,CAAA;AACzD,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAEnD,eAAO,MAAM,WAAW,QAAQ,CAAA;AAChC,eAAO,MAAM,aAAa,aAAa,CAAA;AACvC,eAAO,MAAM,aAAa,UAAU,CAAA;AAEpC,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,YAAY,CAgBjF;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,YAAY,CAgBvG;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,CAkBjE;AAED,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,YAAY,EAAE,EACtB,EAAE,EAAE,oBAAoB,CAAC,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC,GACrD,OAAO,CAAC,YAAY,EAAE,CAAC,CAOzB;AAED,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,YAAY,EACnB,EAAE,EAAE,oBAAoB,CAAC,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC,GACrD,OAAO,CAAC,YAAY,EAAE,CAAC,CA8BzB;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,YAAY,CAAA;CACtB,CAAA;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,YAAY,CAwBlG"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,IAAI,CAAA;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEjD,eAAO,MAAM,iBAAiB,iBAAiB,CAAA;AAC/C,eAAO,MAAM,sBAAsB,sBAAsB,CAAA;AACzD,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAEnD,eAAO,MAAM,WAAW,QAAQ,CAAA;AAChC,eAAO,MAAM,aAAa,aAAa,CAAA;AACvC,eAAO,MAAM,aAAa,UAAU,CAAA;AAEpC,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,YAAY,CAgBjF;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,YAAY,CAgBvG;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,CAkBjE;AAED;;;;;;;GAOG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,YAAY,EAAE,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC,CAMzB;AAED,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,YAAY,EAAE,CAAC,CAGzB;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,YAAY,CAAA;CACtB,CAAA;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,YAAY,CA4BlG"}
package/dist/events.js CHANGED
@@ -1,54 +1,43 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EMAIL_CHANNEL = exports.AGENT_CHANNEL = exports.WEB_CHANNEL = exports.SYSTEM_MESSAGE_TYPE = exports.ASSISTANT_MESSAGE_TYPE = exports.USER_MESSAGE_TYPE = void 0;
4
- exports.createUserEventFromUIMessages = createUserEventFromUIMessages;
5
- exports.createAssistantEventFromUIMessages = createAssistantEventFromUIMessages;
6
- exports.convertToUIMessage = convertToUIMessage;
7
- exports.convertEventsToModelMessages = convertEventsToModelMessages;
8
- exports.convertEventToModelMessages = convertEventToModelMessages;
9
- exports.convertModelMessageToEvent = convertModelMessageToEvent;
10
- const admin_1 = require("@instantdb/admin");
11
- const ai_1 = require("ai");
12
- const document_parser_1 = require("./document-parser");
13
- exports.USER_MESSAGE_TYPE = "user.message";
14
- exports.ASSISTANT_MESSAGE_TYPE = "assistant.message";
15
- exports.SYSTEM_MESSAGE_TYPE = "system.message";
16
- exports.WEB_CHANNEL = "web";
17
- exports.AGENT_CHANNEL = "whatsapp";
18
- exports.EMAIL_CHANNEL = "email";
19
- function createUserEventFromUIMessages(messages) {
1
+ import { convertToModelMessages } from "ai";
2
+ export const USER_MESSAGE_TYPE = "user.message";
3
+ export const ASSISTANT_MESSAGE_TYPE = "assistant.message";
4
+ export const SYSTEM_MESSAGE_TYPE = "system.message";
5
+ export const WEB_CHANNEL = "web";
6
+ export const AGENT_CHANNEL = "whatsapp";
7
+ export const EMAIL_CHANNEL = "email";
8
+ export function createUserEventFromUIMessages(messages) {
20
9
  if (!Array.isArray(messages) || messages.length === 0) {
21
10
  throw new Error("Missing messages to create event");
22
11
  }
23
12
  const lastMessage = messages[messages.length - 1];
24
13
  return {
25
14
  id: lastMessage.id,
26
- type: exports.USER_MESSAGE_TYPE,
27
- channel: exports.WEB_CHANNEL,
15
+ type: USER_MESSAGE_TYPE,
16
+ channel: WEB_CHANNEL,
28
17
  content: {
29
18
  parts: lastMessage.parts,
30
19
  },
31
20
  createdAt: new Date().toISOString(),
32
21
  };
33
22
  }
34
- function createAssistantEventFromUIMessages(eventId, messages) {
23
+ export function createAssistantEventFromUIMessages(eventId, messages) {
35
24
  if (!Array.isArray(messages) || messages.length === 0) {
36
25
  throw new Error("Missing messages to create event");
37
26
  }
38
27
  const lastMessage = messages[messages.length - 1];
39
28
  return {
40
29
  id: eventId,
41
- type: exports.ASSISTANT_MESSAGE_TYPE,
42
- channel: exports.WEB_CHANNEL,
30
+ type: ASSISTANT_MESSAGE_TYPE,
31
+ channel: WEB_CHANNEL,
43
32
  content: {
44
33
  parts: lastMessage.parts,
45
34
  },
46
35
  createdAt: new Date().toISOString(),
47
36
  };
48
37
  }
49
- function convertToUIMessage(event) {
38
+ export function convertToUIMessage(event) {
50
39
  let role;
51
- if (event.type === exports.USER_MESSAGE_TYPE) {
40
+ if (event.type === USER_MESSAGE_TYPE) {
52
41
  role = "user";
53
42
  }
54
43
  else {
@@ -65,211 +54,49 @@ function convertToUIMessage(event) {
65
54
  }
66
55
  };
67
56
  }
68
- async function convertEventsToModelMessages(events, db) {
57
+ /**
58
+ * Converts stored ContextEvents to AI SDK ModelMessages.
59
+ *
60
+ * IMPORTANT:
61
+ * - Store-agnostic and workflow-safe.
62
+ * - Attachment/document handling MUST happen in the store boundary:
63
+ * `StoryStore.eventsToModelMessages(events)`.
64
+ */
65
+ export async function convertEventsToModelMessages(events) {
69
66
  const results = [];
70
67
  for (const event of events) {
71
- const messages = await convertEventToModelMessages(event, db);
72
- results.push(messages);
68
+ results.push(await convertEventToModelMessages(event));
73
69
  }
74
70
  return results.flat();
75
71
  }
76
- async function convertEventToModelMessages(event, db) {
77
- // convert files in message
78
- // const files = event.content.parts.filter(part => part.type === "file")
79
- // 1. copy event to new . we will manipulate the parts
80
- // 2. each file part will be converted using convertFilePart
81
- const convertedParts = await Promise.all((event.content?.parts || []).map(async (part) => {
82
- // Process file parts - check for type === "file" OR presence of url/mimeType (which indicates a file)
83
- if (part?.type === "file" || (part?.url && typeof part.url === "string") || part?.mimeType || part?.mediaType) {
84
- return await convertFilePart(part, db);
85
- }
86
- return [part];
87
- }));
88
- const newEvent = {
89
- ...event,
90
- content: {
91
- ...event.content,
92
- parts: convertedParts.flat(),
93
- },
94
- };
95
- // convert event to convertToModelMessages compatible
96
- let message = convertToUIMessage(newEvent);
97
- // use ai sdk helper
98
- return (0, ai_1.convertToModelMessages)([message]);
72
+ export async function convertEventToModelMessages(event) {
73
+ const message = convertToUIMessage(event);
74
+ return convertToModelMessages([message]);
99
75
  }
100
- function convertModelMessageToEvent(eventId, message) {
76
+ export function convertModelMessageToEvent(eventId, message) {
101
77
  let type;
102
78
  switch (message.message.role) {
103
79
  case "user":
104
- type = exports.USER_MESSAGE_TYPE;
80
+ type = USER_MESSAGE_TYPE;
105
81
  break;
106
82
  case "assistant":
107
- type = exports.ASSISTANT_MESSAGE_TYPE;
83
+ type = ASSISTANT_MESSAGE_TYPE;
108
84
  break;
109
85
  case "system":
110
- type = exports.SYSTEM_MESSAGE_TYPE;
86
+ type = SYSTEM_MESSAGE_TYPE;
87
+ break;
88
+ default:
89
+ // Fallback for roles not mapped to our event types (e.g. tool).
90
+ type = ASSISTANT_MESSAGE_TYPE;
111
91
  break;
112
92
  }
113
93
  return {
114
94
  id: eventId,
115
95
  type: type,
116
- channel: exports.WEB_CHANNEL,
96
+ channel: WEB_CHANNEL,
117
97
  content: {
118
98
  parts: message.message.content,
119
99
  },
120
100
  createdAt: message.timestamp.toISOString(),
121
101
  };
122
102
  }
123
- async function convertFilePart(part, db) {
124
- // Convert file parts to text using parseAndStoreDocument
125
- // Uses providerMetadata.instant.fileId if available, otherwise falls back to URL lookup
126
- // Get fileId and filePath from providerMetadata
127
- const fileId = part.providerMetadata?.instant?.fileId || null;
128
- const filePath = part.providerMetadata?.instant?.path || null;
129
- // If we have a fileId, query by ID. Otherwise, try by path or URL
130
- let fileRecord = undefined;
131
- try {
132
- if (fileId) {
133
- const fileQuery = await db.query({
134
- $files: {
135
- $: {
136
- where: {
137
- id: fileId,
138
- },
139
- limit: 1,
140
- },
141
- },
142
- });
143
- fileRecord = Array.isArray(fileQuery.$files) ? fileQuery.$files[0] : undefined;
144
- }
145
- else if (filePath) {
146
- // Try to find by path
147
- const fileQuery = await db.query({
148
- $files: {
149
- $: {
150
- where: {
151
- path: filePath,
152
- },
153
- limit: 1,
154
- },
155
- document: {},
156
- },
157
- });
158
- fileRecord = Array.isArray(fileQuery.$files) ? fileQuery.$files[0] : undefined;
159
- }
160
- else if (part.url.startsWith("http://") || part.url.startsWith("https://")) {
161
- // For HTTP/HTTPS URLs, try to find by URL
162
- const fileQuery = await db.query({
163
- $files: {
164
- $: {
165
- where: {
166
- url: part.url,
167
- },
168
- limit: 1,
169
- },
170
- document: {},
171
- },
172
- });
173
- fileRecord = Array.isArray(fileQuery.$files) ? fileQuery.$files[0] : undefined;
174
- }
175
- // If we still don't have a file record and have a URL, fetch and process it
176
- if (!fileRecord && (part.url.startsWith("http://") || part.url.startsWith("https://"))) {
177
- // Try to fetch the file directly and process it
178
- const fileResponse = await fetch(part.url);
179
- if (fileResponse.ok) {
180
- const buffer = await fileResponse.arrayBuffer();
181
- const contentType = part.mediaType || fileResponse.headers.get("content-type") || "application/octet-stream";
182
- const fileName = part.filename || "file";
183
- // Use a temporary path if we don't have one
184
- const tempPath = filePath || `/temp/${Date.now()}-${fileName}`;
185
- const documentId = await (0, document_parser_1.parseAndStoreDocument)(db, Buffer.from(buffer), tempPath, fileName, (0, admin_1.id)());
186
- const documentQuery = await db.query({
187
- document_documents: {
188
- $: {
189
- where: {
190
- id: documentId,
191
- },
192
- limit: 1,
193
- },
194
- file: {},
195
- },
196
- });
197
- const documentRecord = Array.isArray(documentQuery.document_documents) ? documentQuery.document_documents[0] : undefined;
198
- const parts = [];
199
- parts.push({
200
- type: "text",
201
- text: `User attached a file.\nFile Name: "${fileName}"\nMedia Type: ${contentType}`,
202
- });
203
- if (documentRecord?.content && typeof documentRecord.content === 'object' && documentRecord.content !== null && 'pages' in documentRecord.content && Array.isArray(documentRecord.content.pages)) {
204
- const pages = documentRecord.content.pages;
205
- const pageTexts = pages
206
- .map((page, index) => {
207
- const text = typeof page.text === "string" ? page.text : "";
208
- return `\n\n--- Page ${index + 1} ---\n\n${text}`;
209
- })
210
- .join("");
211
- if (pageTexts.length > 0) {
212
- parts.push({
213
- type: "text",
214
- text: `Document transcription for "${fileName}":${pageTexts}`,
215
- });
216
- }
217
- }
218
- return parts;
219
- }
220
- }
221
- if (!fileRecord) {
222
- throw new Error(`File not found: ${fileId || filePath || part.url}`);
223
- }
224
- let documentRecord = fileRecord.document;
225
- if (!documentRecord || (Array.isArray(documentRecord) && documentRecord.length === 0)) {
226
- const fileResponse = await fetch(fileRecord.url);
227
- if (!fileResponse.ok) {
228
- throw new Error(`Failed to fetch file: HTTP ${fileResponse.status} ${fileResponse.statusText}`);
229
- }
230
- const buffer = await fileResponse.arrayBuffer();
231
- const documentId = await (0, document_parser_1.parseAndStoreDocument)(db, Buffer.from(buffer), fileRecord.path, fileRecord.path, fileRecord.id);
232
- const documentQuery = await db.query({
233
- document_documents: {
234
- $: {
235
- where: {
236
- id: documentId,
237
- },
238
- limit: 1,
239
- },
240
- file: {},
241
- },
242
- });
243
- documentRecord = Array.isArray(documentQuery.document_documents) ? documentQuery.document_documents[0] : undefined;
244
- }
245
- const parts = [];
246
- const fileName = documentRecord && typeof documentRecord === "object" && "fileName" in documentRecord
247
- ? String(documentRecord.fileName)
248
- : String(fileRecord.path || "Unknown");
249
- parts.push({
250
- type: "text",
251
- text: `User attached a file.\nFile ID: ${fileRecord.id}\nFile Name: "${fileName}"\nMedia Type: ${part.mediaType || "unknown"}`,
252
- });
253
- if (documentRecord?.content && Array.isArray(documentRecord.content.pages)) {
254
- const pages = documentRecord.content.pages;
255
- const pageTexts = pages
256
- .map((page, index) => {
257
- const text = typeof page.text === "string" ? page.text : "";
258
- return `\n\n--- Page ${index + 1} ---\n\n${text}`;
259
- })
260
- .join("");
261
- if (pageTexts.length > 0) {
262
- parts.push({
263
- type: "text",
264
- text: `Document transcription for File ID ${fileRecord.id}:${pageTexts}`,
265
- });
266
- }
267
- }
268
- return parts;
269
- }
270
- catch (error) {
271
- console.error("convertFilePart error", error);
272
- throw error;
273
- }
274
- }
275
- //# sourceMappingURL=events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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","sourcesContent":["import { id, init, type InstantAdminDatabase } from \"@instantdb/admin\"\nimport { convertToModelMessages, type ModelMessage, type UIMessage } from \"ai\"\nimport type { ContextEvent } from \"./service\"\nimport { parseAndStoreDocument } from \"./document-parser\"\nimport { SchemaOf } from \"@ekairos/domain\"\nimport { storyDomain } from \"./schema\"\n\nexport const USER_MESSAGE_TYPE = \"user.message\"\nexport const ASSISTANT_MESSAGE_TYPE = \"assistant.message\"\nexport const SYSTEM_MESSAGE_TYPE = \"system.message\"\n\nexport const WEB_CHANNEL = \"web\"\nexport const AGENT_CHANNEL = \"whatsapp\"\nexport const EMAIL_CHANNEL = \"email\"\n\nexport function createUserEventFromUIMessages(messages: UIMessage[]): ContextEvent {\n if (!Array.isArray(messages) || messages.length === 0) {\n throw new Error(\"Missing messages to create event\")\n }\n\n const lastMessage = messages[messages.length - 1]\n\n return {\n id: lastMessage.id,\n type: USER_MESSAGE_TYPE,\n channel: WEB_CHANNEL,\n content: {\n parts: lastMessage.parts,\n },\n createdAt: new Date().toISOString(),\n }\n}\n\nexport function createAssistantEventFromUIMessages(eventId: string, messages: UIMessage[]): ContextEvent {\n if (!Array.isArray(messages) || messages.length === 0) {\n throw new Error(\"Missing messages to create event\")\n }\n\n const lastMessage = messages[messages.length - 1]\n\n return {\n id: eventId,\n type: ASSISTANT_MESSAGE_TYPE,\n channel: WEB_CHANNEL,\n content: {\n parts: lastMessage.parts,\n },\n createdAt: new Date().toISOString(),\n }\n}\n\nexport function convertToUIMessage(event: ContextEvent): UIMessage {\n let role: \"user\" | \"assistant\"\n if (event.type === USER_MESSAGE_TYPE) {\n role = \"user\"\n } else {\n role = \"assistant\"\n }\n\n return {\n id: event.id,\n role: role,\n parts: event.content.parts,\n metadata: {\n channel: event.channel,\n type: event.type,\n createdAt: event.createdAt,\n }\n }\n}\n\nexport async function convertEventsToModelMessages(\n events: ContextEvent[],\n db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>\n): Promise<ModelMessage[]> {\n const results: ModelMessage[][] = []\n for (const event of events) {\n const messages = await convertEventToModelMessages(event, db)\n results.push(messages)\n }\n return results.flat()\n}\n\nexport async function convertEventToModelMessages(\n event: ContextEvent,\n db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>\n): Promise<ModelMessage[]> {\n\n // convert files in message\n // const files = event.content.parts.filter(part => part.type === \"file\")\n // 1. copy event to new . we will manipulate the parts\n // 2. each file part will be converted using convertFilePart\n\n const convertedParts = await Promise.all(\n (event.content?.parts || []).map(async (part: any) => {\n // Process file parts - check for type === \"file\" OR presence of url/mimeType (which indicates a file)\n if (part?.type === \"file\" || (part?.url && typeof part.url === \"string\") || part?.mimeType || part?.mediaType) {\n return await convertFilePart(part, db)\n }\n return [part]\n }),\n )\n\n const newEvent: ContextEvent = {\n ...event,\n content: {\n ...event.content,\n parts: convertedParts.flat(),\n },\n }\n\n // convert event to convertToModelMessages compatible\n let message = convertToUIMessage(newEvent)\n\n // use ai sdk helper\n return convertToModelMessages([message])\n}\n\nexport type AIMessage = {\n id: string;\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n createdAt: Date;\n}\n\nexport type ResponseMessage = {\n id: string;\n timestamp: Date;\n modelId: string;\n headers?: Record<string, string>;\n message: ModelMessage\n}\n\nexport function convertModelMessageToEvent(eventId: string, message: ResponseMessage): ContextEvent {\n\n let type;\n switch (message.message.role) {\n case \"user\":\n type = USER_MESSAGE_TYPE;\n break;\n case \"assistant\":\n type = ASSISTANT_MESSAGE_TYPE;\n break;\n case \"system\":\n type = SYSTEM_MESSAGE_TYPE;\n break;\n }\n\n return {\n id: eventId,\n type: type,\n channel: WEB_CHANNEL,\n content: {\n parts: message.message.content,\n },\n createdAt: message.timestamp.toISOString(),\n }\n}\n\n\nasync function convertFilePart(\n part: any,\n db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>\n): Promise<any[]> {\n // Convert file parts to text using parseAndStoreDocument\n // Uses providerMetadata.instant.fileId if available, otherwise falls back to URL lookup\n \n // Get fileId and filePath from providerMetadata\n const fileId = part.providerMetadata?.instant?.fileId || null\n const filePath = part.providerMetadata?.instant?.path || null\n\n // If we have a fileId, query by ID. Otherwise, try by path or URL\n let fileRecord: any = undefined\n\n try {\n if (fileId) {\n const fileQuery = await db.query({\n $files: {\n $: {\n where: {\n id: fileId,\n },\n limit: 1,\n },\n },\n })\n fileRecord = Array.isArray(fileQuery.$files) ? fileQuery.$files[0] : undefined\n } else if (filePath) {\n // Try to find by path\n const fileQuery = await db.query({\n $files: {\n $: {\n where: {\n path: filePath,\n },\n limit: 1,\n },\n document: {},\n },\n })\n fileRecord = Array.isArray(fileQuery.$files) ? fileQuery.$files[0] : undefined\n } else if (part.url.startsWith(\"http://\") || part.url.startsWith(\"https://\")) {\n // For HTTP/HTTPS URLs, try to find by URL\n const fileQuery = await db.query({\n $files: {\n $: {\n where: {\n url: part.url,\n },\n limit: 1,\n },\n document: {},\n },\n })\n fileRecord = Array.isArray(fileQuery.$files) ? fileQuery.$files[0] : undefined\n }\n\n // If we still don't have a file record and have a URL, fetch and process it\n if (!fileRecord && (part.url.startsWith(\"http://\") || part.url.startsWith(\"https://\"))) {\n // Try to fetch the file directly and process it\n const fileResponse = await fetch(part.url)\n if (fileResponse.ok) {\n const buffer = await fileResponse.arrayBuffer()\n const contentType = part.mediaType || fileResponse.headers.get(\"content-type\") || \"application/octet-stream\"\n const fileName = part.filename || \"file\"\n \n // Use a temporary path if we don't have one\n const tempPath = filePath || `/temp/${Date.now()}-${fileName}`\n \n const documentId = await parseAndStoreDocument(\n db,\n Buffer.from(buffer),\n tempPath,\n fileName,\n id(), // Generate a temporary ID\n )\n\n const documentQuery = await db.query({\n document_documents: {\n $: {\n where: {\n id: documentId,\n } as Parameters<typeof db.query>[0]['document_documents']['$']['where'],\n limit: 1,\n },\n file: {},\n },\n })\n\n const documentRecord = Array.isArray(documentQuery.document_documents) ? documentQuery.document_documents[0] : undefined\n\n const parts: any[] = []\n parts.push({\n type: \"text\",\n text: `User attached a file.\\nFile Name: \"${fileName}\"\\nMedia Type: ${contentType}`,\n })\n\n if (documentRecord?.content && typeof documentRecord.content === 'object' && documentRecord.content !== null && 'pages' in documentRecord.content && Array.isArray(documentRecord.content.pages)) {\n const pages = documentRecord.content.pages\n const pageTexts = pages\n .map((page: Record<string, unknown>, index: number) => {\n const text = typeof page.text === \"string\" ? page.text : \"\"\n return `\\n\\n--- Page ${index + 1} ---\\n\\n${text}`\n })\n .join(\"\")\n\n if (pageTexts.length > 0) {\n parts.push({\n type: \"text\",\n text: `Document transcription for \"${fileName}\":${pageTexts}`,\n })\n }\n }\n\n return parts\n }\n }\n\n if (!fileRecord) {\n throw new Error(`File not found: ${fileId || filePath || part.url}`)\n }\n\n let documentRecord = fileRecord.document as any\n if (!documentRecord || (Array.isArray(documentRecord) && documentRecord.length === 0)) {\n const fileResponse = await fetch(fileRecord.url as string)\n if (!fileResponse.ok) {\n throw new Error(`Failed to fetch file: HTTP ${fileResponse.status} ${fileResponse.statusText}`)\n }\n\n const buffer = await fileResponse.arrayBuffer()\n const documentId = await parseAndStoreDocument(\n db,\n Buffer.from(buffer),\n fileRecord.path as string,\n fileRecord.path as string,\n fileRecord.id as string,\n )\n\n const documentQuery = await db.query({\n document_documents: {\n $: {\n where: {\n id: documentId,\n } as Parameters<typeof db.query>[0]['document_documents']['$']['where'],\n limit: 1,\n },\n file: {},\n },\n })\n\n documentRecord = Array.isArray(documentQuery.document_documents) ? documentQuery.document_documents[0] : undefined\n }\n\n const parts: any[] = []\n\n const fileName = documentRecord && typeof documentRecord === \"object\" && \"fileName\" in documentRecord\n ? String(documentRecord.fileName)\n : String(fileRecord.path || \"Unknown\")\n\n parts.push({\n type: \"text\",\n text: `User attached a file.\\nFile ID: ${fileRecord.id}\\nFile Name: \"${fileName}\"\\nMedia Type: ${part.mediaType || \"unknown\"}`,\n })\n\n if (documentRecord?.content && Array.isArray(documentRecord.content.pages)) {\n const pages = documentRecord.content.pages\n const pageTexts = pages\n .map((page: Record<string, unknown>, index: number) => {\n const text = typeof page.text === \"string\" ? page.text : \"\"\n return `\\n\\n--- Page ${index + 1} ---\\n\\n${text}`\n })\n .join(\"\")\n\n if (pageTexts.length > 0) {\n parts.push({\n type: \"text\",\n text: `Document transcription for File ID ${fileRecord.id}:${pageTexts}`,\n })\n }\n }\n\n return parts\n } catch (error) {\n console.error(\"convertFilePart error\", error)\n throw error\n }\n}\n"]}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAqC,MAAM,IAAI,CAAA;AAG9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAA;AAC/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,mBAAmB,CAAA;AACzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAA;AAEnD,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAA;AAChC,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAA;AACvC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAA;AAEpC,MAAM,UAAU,6BAA6B,CAAC,QAAqB;IACjE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACrD,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAEjD,OAAO;QACL,EAAE,EAAE,WAAW,CAAC,EAAE;QAClB,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,WAAW;QACpB,OAAO,EAAE;YACP,KAAK,EAAE,WAAW,CAAC,KAAK;SACzB;QACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,OAAe,EAAE,QAAqB;IACvF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACrD,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAEjD,OAAO;QACL,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,WAAW;QACpB,OAAO,EAAE;YACP,KAAK,EAAE,WAAW,CAAC,KAAK;SACzB;QACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAmB;IACpD,IAAI,IAA0B,CAAA;IAC9B,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACrC,IAAI,GAAG,MAAM,CAAA;IACf,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,WAAW,CAAA;IACpB,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK;QAC1B,QAAQ,EAAE;YACR,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B;KACF,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAAsB;IAEtB,MAAM,OAAO,GAAqB,EAAE,CAAA;IACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,MAAM,2BAA2B,CAAC,KAAK,CAAC,CAAC,CAAA;IACxD,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAA;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,KAAmB;IAEnB,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IACzC,OAAO,sBAAsB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;AAC1C,CAAC;AAiBD,MAAM,UAAU,0BAA0B,CAAC,OAAe,EAAE,OAAwB;IAElF,IAAI,IAAY,CAAC;IACjB,QAAQ,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7B,KAAK,MAAM;YACT,IAAI,GAAG,iBAAiB,CAAC;YACzB,MAAM;QACR,KAAK,WAAW;YACd,IAAI,GAAG,sBAAsB,CAAC;YAC9B,MAAM;QACR,KAAK,QAAQ;YACX,IAAI,GAAG,mBAAmB,CAAC;YAC3B,MAAM;QACR;YACE,gEAAgE;YAChE,IAAI,GAAG,sBAAsB,CAAC;YAC9B,MAAM;IACV,CAAC;IAED,OAAO;QACL,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,WAAW;QACpB,OAAO,EAAE;YACP,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO;SAC/B;QACD,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE;KAC3C,CAAA;AACH,CAAC","sourcesContent":["import { convertToModelMessages, type ModelMessage, type UIMessage } from \"ai\"\nimport type { ContextEvent } from \"./story.store\"\n\nexport const USER_MESSAGE_TYPE = \"user.message\"\nexport const ASSISTANT_MESSAGE_TYPE = \"assistant.message\"\nexport const SYSTEM_MESSAGE_TYPE = \"system.message\"\n\nexport const WEB_CHANNEL = \"web\"\nexport const AGENT_CHANNEL = \"whatsapp\"\nexport const EMAIL_CHANNEL = \"email\"\n\nexport function createUserEventFromUIMessages(messages: UIMessage[]): ContextEvent {\n if (!Array.isArray(messages) || messages.length === 0) {\n throw new Error(\"Missing messages to create event\")\n }\n\n const lastMessage = messages[messages.length - 1]\n\n return {\n id: lastMessage.id,\n type: USER_MESSAGE_TYPE,\n channel: WEB_CHANNEL,\n content: {\n parts: lastMessage.parts,\n },\n createdAt: new Date().toISOString(),\n }\n}\n\nexport function createAssistantEventFromUIMessages(eventId: string, messages: UIMessage[]): ContextEvent {\n if (!Array.isArray(messages) || messages.length === 0) {\n throw new Error(\"Missing messages to create event\")\n }\n\n const lastMessage = messages[messages.length - 1]\n\n return {\n id: eventId,\n type: ASSISTANT_MESSAGE_TYPE,\n channel: WEB_CHANNEL,\n content: {\n parts: lastMessage.parts,\n },\n createdAt: new Date().toISOString(),\n }\n}\n\nexport function convertToUIMessage(event: ContextEvent): UIMessage {\n let role: \"user\" | \"assistant\"\n if (event.type === USER_MESSAGE_TYPE) {\n role = \"user\"\n } else {\n role = \"assistant\"\n }\n\n return {\n id: event.id,\n role: role,\n parts: event.content.parts,\n metadata: {\n channel: event.channel,\n type: event.type,\n createdAt: event.createdAt,\n }\n }\n}\n\n/**\n * Converts stored ContextEvents to AI SDK ModelMessages.\n *\n * IMPORTANT:\n * - Store-agnostic and workflow-safe.\n * - Attachment/document handling MUST happen in the store boundary:\n * `StoryStore.eventsToModelMessages(events)`.\n */\nexport async function convertEventsToModelMessages(\n events: ContextEvent[],\n): Promise<ModelMessage[]> {\n const results: ModelMessage[][] = []\n for (const event of events) {\n results.push(await convertEventToModelMessages(event))\n }\n return results.flat()\n}\n\nexport async function convertEventToModelMessages(\n event: ContextEvent,\n): Promise<ModelMessage[]> {\n const message = convertToUIMessage(event)\n return convertToModelMessages([message])\n}\n\nexport type AIMessage = {\n id: string;\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n createdAt: Date;\n}\n\nexport type ResponseMessage = {\n id: string;\n timestamp: Date;\n modelId: string;\n headers?: Record<string, string>;\n message: ModelMessage\n}\n\nexport function convertModelMessageToEvent(eventId: string, message: ResponseMessage): ContextEvent {\n\n let type: string;\n switch (message.message.role) {\n case \"user\":\n type = USER_MESSAGE_TYPE;\n break;\n case \"assistant\":\n type = ASSISTANT_MESSAGE_TYPE;\n break;\n case \"system\":\n type = SYSTEM_MESSAGE_TYPE;\n break;\n default:\n // Fallback for roles not mapped to our event types (e.g. tool).\n type = ASSISTANT_MESSAGE_TYPE;\n break;\n }\n\n return {\n id: eventId,\n type: type,\n channel: WEB_CHANNEL,\n content: {\n parts: message.message.content,\n },\n createdAt: message.timestamp.toISOString(),\n }\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- export { agent, type AgentConfig, type AgentInstance, type AgentOptions, type ProgressStreamOptions, type DataStreamWriter, createAgent, Agent, } from "./agent";
2
- export { AgentService } from "./service";
3
- export type { ContextIdentifier, StoredContext, ContextEvent } from "./service";
1
+ export { story, createStory, type StoryConfig, type StoryInstance, type StoryOptions, type StoryStreamOptions, Story, type RegistrableStoryBuilder, } from "./story";
2
+ export type { StoryStore, ContextIdentifier, StoredContext, ContextEvent, } from "./story.store";
3
+ export { registerStory, getStory, getStoryFactory, hasStory, listStories, type StoryKey, } from "./story.registry";
4
4
  export { storyDomain } from "./schema";
5
+ export { didToolExecute } from "./story.toolcalls";
5
6
  export { USER_MESSAGE_TYPE, ASSISTANT_MESSAGE_TYPE, SYSTEM_MESSAGE_TYPE, WEB_CHANNEL, AGENT_CHANNEL, EMAIL_CHANNEL, createUserEventFromUIMessages, createAssistantEventFromUIMessages, convertToUIMessage, convertEventToModelMessages, convertEventsToModelMessages, convertModelMessageToEvent, type ResponseMessage, } from "./events";
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,WAAW,EACX,KAAK,GACN,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAE/E,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,aAAa,EACb,6BAA6B,EAC7B,kCAAkC,EAClC,kBAAkB,EAClB,2BAA2B,EAC3B,4BAA4B,EAC5B,0BAA0B,EAC1B,KAAK,eAAe,GACrB,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,EACL,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,EACL,KAAK,uBAAuB,GAC7B,MAAM,SAAS,CAAA;AAEhB,OAAO,EACL,qBAAqB,EACrB,8BAA8B,EAC9B,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,oBAAoB,GAC1B,MAAM,gBAAgB,CAAA;AAEvB,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,YAAY,GACb,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,aAAa,EACb,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,WAAW,EACX,KAAK,QAAQ,GACd,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,aAAa,EACb,6BAA6B,EAC7B,kCAAkC,EAClC,kBAAkB,EAClB,2BAA2B,EAC3B,4BAA4B,EAC5B,0BAA0B,EAC1B,KAAK,eAAe,GACrB,MAAM,UAAU,CAAA"}