@ekairos/story 1.21.30-beta.0 → 1.21.33-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/README.md ADDED
@@ -0,0 +1,174 @@
1
+ # @ekairos/story
2
+
3
+ Build **durable AI Stories**: an LLM + tool-call loop with a pluggable persistence layer.
4
+
5
+ ## What you get (why you’d use this)
6
+
7
+ - **Durable runs**: survive serverless timeouts, restarts, and long-running tool calls.
8
+ - **Resumable UX**: users can refresh/reconnect and continue streaming from where they left off.
9
+ - **Retries + observability**: each LLM call and side-effectful tool can be a durable step.
10
+ - **Human approvals**: pause execution for a human decision and resume later.
11
+ - **Multi-tenant ready**: resolve the correct runtime store from a serializable `env` (orgId/tenantId/etc).
12
+ - **Database-agnostic**: InstantDB, Postgres, or anything else via a `StoryStore`.
13
+
14
+ ## Quickstart (5 minutes)
15
+
16
+ ### 1) Configure a runtime resolver (required)
17
+
18
+ `@ekairos/story` is **declarative**: you define prompts/tools/loop logic with `createStory()`.
19
+ At runtime, the engine needs a `StoryStore` to load/save context + events.
20
+
21
+ Because stores are **not serializable** (DB clients, SDK instances), you don’t pass them through `env`.
22
+ Instead, you register a single global resolver once, and it will be invoked from inside steps.
23
+ If you skip this, story execution will throw: `Story runtime is not configured...`.
24
+
25
+ ```ts
26
+ import { configureStoryRuntime } from "@ekairos/story";
27
+ import { InstantStore } from "@ekairos/story/instant";
28
+ import { init } from "@instantdb/admin";
29
+ import schema from "./instant.schema";
30
+
31
+ const storesByOrg = new Map<string, InstantStore>();
32
+
33
+ configureStoryRuntime(async (env) => {
34
+ // `env` MUST be serializable (plain object).
35
+ // Use it for multi-tenant routing (orgId/tenantId/etc).
36
+ const orgId = String((env as { orgId?: string }).orgId ?? "default");
37
+
38
+ const cached = storesByOrg.get(orgId);
39
+ if (cached) return { store: cached };
40
+
41
+ const appId = process.env.NEXT_PUBLIC_INSTANT_APP_ID!;
42
+ const adminToken = process.env.INSTANT_APP_ADMIN_TOKEN!;
43
+
44
+ const db = init({ appId, adminToken, schema });
45
+ const store = new InstantStore(db);
46
+ storesByOrg.set(orgId, store);
47
+ return { store };
48
+ });
49
+ ```
50
+
51
+ ### 2) Define a Story (authoring API)
52
+
53
+ ```ts
54
+ import { createStory } from "@ekairos/story";
55
+
56
+ type Env = { orgId: string };
57
+ type Ctx = { userId: string };
58
+
59
+ export const myStory = createStory<Env>()
60
+ .context(async (ctx, _env) => {
61
+ return { userId: ctx.content?.userId ?? "unknown" } satisfies Ctx;
62
+ })
63
+ .systemPrompt((ctx, env) => {
64
+ return `You are a helpful assistant.\norgId=${env.orgId}\nuserId=${ctx.content?.userId}`;
65
+ })
66
+ .tools(async (_ctx, _env) => {
67
+ return {};
68
+ })
69
+ .model("bedrock/claude-4-5-haiku-20251001-v1")
70
+ .build();
71
+ ```
72
+
73
+ ### 3) Run it anywhere (plain Web Streams)
74
+
75
+ You can run Stories anywhere you can provide a `WritableStream<UIMessageChunk>`.
76
+ For local dev / simple backends, a `TransformStream` is enough:
77
+
78
+ ```ts
79
+ import type { UIMessageChunk } from "ai";
80
+ import { createUIMessageStreamResponse } from "ai";
81
+
82
+ export async function POST(req: Request) {
83
+ const { env, event: incomingEvent } = await req.json();
84
+ const { readable, writable } = new TransformStream<UIMessageChunk, UIMessageChunk>();
85
+
86
+ // Start streaming (don’t await if you want the response to return immediately).
87
+ void myStory.stream({
88
+ env,
89
+ incomingEvent,
90
+ contextIdentifier: null,
91
+ writable,
92
+ });
93
+
94
+ return createUIMessageStreamResponse({ stream: readable });
95
+ }
96
+ ```
97
+
98
+ That’s it. You now have a streaming Story loop.
99
+
100
+ ## Production runtime: Workflow DevKit (durable + resumable)
101
+
102
+ This library is **workflow-first** and designed to run on Workflow DevKit:
103
+
104
+ - [Building Durable AI Agents](https://useworkflow.dev/docs/ai)
105
+ - [Streaming](https://useworkflow.dev/docs/foundations/streaming)
106
+ - [Workflows and Steps](https://useworkflow.dev/docs/foundations/workflows-and-steps)
107
+
108
+ The key idea: **workflows must be deterministic**, so all I/O happens inside `"use step"` functions.
109
+ If you don’t need durability/resumption, the “Run it anywhere” example above works fine.
110
+
111
+ ## Resumable streaming (production UX)
112
+
113
+ If you want “refresh-safe” UX, use Workflow DevKit’s resumable streams:
114
+ - [Resumable Streams](https://useworkflow.dev/docs/ai/resumable-streams)
115
+
116
+ ```ts
117
+ import { createUIMessageStreamResponse } from "ai";
118
+ import { start } from "workflow/api";
119
+
120
+ export async function storyWorkflow(env: { orgId: string }, incomingEvent: any) {
121
+ "use workflow";
122
+ await myStory.stream({ env, incomingEvent, contextIdentifier: null });
123
+ }
124
+
125
+ export async function POST(req: Request) {
126
+ const { env, event } = await req.json();
127
+ const run = await start(storyWorkflow, [env, event]);
128
+
129
+ return createUIMessageStreamResponse({
130
+ stream: run.readable,
131
+ headers: { "x-workflow-run-id": run.runId },
132
+ });
133
+ }
134
+ ```
135
+
136
+ ### Reconnect endpoint (resume from `startIndex`)
137
+
138
+ ```ts
139
+ import { createUIMessageStreamResponse } from "ai";
140
+ import { getRun } from "workflow/api";
141
+
142
+ export async function GET(
143
+ request: Request,
144
+ { params }: { params: Promise<{ id: string }> }
145
+ ) {
146
+ const { id } = await params;
147
+ const { searchParams } = new URL(request.url);
148
+ const startIndexParam = searchParams.get("startIndex");
149
+ const startIndex = startIndexParam ? parseInt(startIndexParam, 10) : undefined;
150
+
151
+ const run = getRun(id);
152
+ const stream = run.getReadable({ startIndex });
153
+
154
+ return createUIMessageStreamResponse({ stream });
155
+ }
156
+ ```
157
+
158
+ ### Client: `WorkflowChatTransport`
159
+
160
+ Workflow DevKit provides a drop-in AI SDK transport that handles reconnection for you:
161
+ - [Resumable Streams](https://useworkflow.dev/docs/ai/resumable-streams)
162
+
163
+ ## Tools in workflows
164
+
165
+ Tools can be:
166
+ - **Step-level** (`"use step"`) for side-effects (DB, fetch) + retries
167
+ - **Workflow-level** for workflow primitives (sleep, hooks, approvals)
168
+
169
+ See:
170
+ - [Patterns for Defining Tools](https://useworkflow.dev/docs/ai/defining-tools)
171
+ - [Streaming Updates from Tools](https://useworkflow.dev/docs/ai/streaming-updates-from-tools)
172
+ - [Human-in-the-Loop](https://useworkflow.dev/docs/ai/human-in-the-loop)
173
+
174
+
@@ -0,0 +1,52 @@
1
+ import type { InstantAdminDatabase } from "@instantdb/admin";
2
+ import type { Tool } from "ai";
3
+ import type { SchemaOf } from "@ekairos/domain";
4
+ import { storyDomain } from "./schema";
5
+ import { Story, type StoryOptions, type DataStreamWriter } from "./agent.engine";
6
+ import type { StoredContext } from "./service";
7
+ export interface StoryConfig<Context> {
8
+ db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>;
9
+ context: (context: StoredContext<Context>) => Promise<Context> | Context;
10
+ systemPrompt: (context: StoredContext<Context>) => Promise<string> | string;
11
+ tools: (context: StoredContext<Context>, dataStream: DataStreamWriter) => Promise<Record<string, Tool>> | Record<string, Tool>;
12
+ model?: string | ((context: StoredContext<Context>) => string);
13
+ opts?: StoryOptions;
14
+ includeBaseTools?: {
15
+ createMessage?: boolean;
16
+ requestDirection?: boolean;
17
+ end?: boolean;
18
+ };
19
+ }
20
+ export type StoryInstance<Context> = Story<Context> & {
21
+ readonly __config: StoryConfig<Context>;
22
+ };
23
+ export declare function story<Context>(config: StoryConfig<Context>): StoryInstance<Context>;
24
+ type InitializedStoredContext<Context> = StoredContext<Context> & {
25
+ content: Context;
26
+ };
27
+ type BuilderSystemPrompt<Context> = (context: InitializedStoredContext<Context>) => Promise<string> | string;
28
+ type BuilderTools<Context> = (context: InitializedStoredContext<Context>, dataStream: DataStreamWriter) => Promise<Record<string, Tool>> | Record<string, Tool>;
29
+ type BuilderModel<Context> = string | ((context: InitializedStoredContext<Context>) => string);
30
+ type BuilderIncludeBaseTools = {
31
+ createMessage?: boolean;
32
+ requestDirection?: boolean;
33
+ end?: boolean;
34
+ };
35
+ type FluentAgentBuilder<Context> = {
36
+ systemPrompt(fn: BuilderSystemPrompt<Context>): FluentAgentBuilder<Context>;
37
+ tools(fn: BuilderTools<Context>): FluentAgentBuilder<Context>;
38
+ model(model: BuilderModel<Context>): FluentAgentBuilder<Context>;
39
+ opts(opts: StoryOptions): FluentAgentBuilder<Context>;
40
+ includeBaseTools(baseTools: BuilderIncludeBaseTools): FluentAgentBuilder<Context>;
41
+ config(): StoryConfig<Context>;
42
+ build(): StoryInstance<Context>;
43
+ };
44
+ type AnyContextInitializer = (context: StoredContext<any>) => Promise<any> | any;
45
+ type InferContextFromInitializer<I extends AnyContextInitializer> = Awaited<ReturnType<I>>;
46
+ type CreateAgentEntry = {
47
+ context<Initializer extends AnyContextInitializer>(initializer: Initializer): FluentAgentBuilder<InferContextFromInitializer<Initializer>>;
48
+ initialize<Initializer extends AnyContextInitializer>(initializer: Initializer): FluentAgentBuilder<InferContextFromInitializer<Initializer>>;
49
+ };
50
+ export declare function createStory(db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>): CreateAgentEntry;
51
+ export {};
52
+ //# sourceMappingURL=agent.builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.builder.d.ts","sourceRoot":"","sources":["../src/agent.builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.story = story;
4
+ exports.createStory = createStory;
5
+ const agent_engine_1 = require("./agent.engine");
6
+ function story(config) {
7
+ class FunctionalAgent extends agent_engine_1.Story {
8
+ constructor() {
9
+ super(config.db, config.opts);
10
+ this.__config = config;
11
+ }
12
+ includeBaseTools() {
13
+ if (config.includeBaseTools) {
14
+ return {
15
+ createMessage: config.includeBaseTools.createMessage ?? true,
16
+ requestDirection: config.includeBaseTools.requestDirection ?? true,
17
+ end: config.includeBaseTools.end ?? true,
18
+ };
19
+ }
20
+ return super.includeBaseTools();
21
+ }
22
+ async buildSystemPrompt(context) {
23
+ return config.systemPrompt(context);
24
+ }
25
+ async buildTools(context, dataStream) {
26
+ return config.tools(context, dataStream);
27
+ }
28
+ async initialize(context) {
29
+ return config.context(context);
30
+ }
31
+ getModel(context) {
32
+ if (typeof config.model === "function") {
33
+ return config.model(context);
34
+ }
35
+ return config.model || super.getModel(context);
36
+ }
37
+ }
38
+ const instance = new FunctionalAgent();
39
+ return Object.assign(instance, { __config: config });
40
+ }
41
+ function assertConfigComplete(config) {
42
+ if (!config.db) {
43
+ throw new Error("createStory: Debes proporcionar db como parámetro.");
44
+ }
45
+ if (!config.context) {
46
+ throw new Error("createStory: Debes definir context() antes de construir la story.");
47
+ }
48
+ if (!config.systemPrompt) {
49
+ throw new Error("createStory: Debes definir systemPrompt() antes de construir la story.");
50
+ }
51
+ if (!config.tools) {
52
+ throw new Error("createStory: Debes definir tools() antes de construir la story.");
53
+ }
54
+ }
55
+ function ensureInitializedContext(context) {
56
+ if (!context.content) {
57
+ throw new Error("createStory: context() debe devolver datos antes de usar systemPrompt/tools.");
58
+ }
59
+ return context;
60
+ }
61
+ function createStory(db) {
62
+ const initializeBuilder = (initializer) => {
63
+ const typedInitializer = (context) => initializer(context);
64
+ const fluentState = {
65
+ db,
66
+ context: typedInitializer,
67
+ };
68
+ const builder = {
69
+ systemPrompt(systemPrompt) {
70
+ fluentState.systemPrompt = (context) => systemPrompt(ensureInitializedContext(context));
71
+ return builder;
72
+ },
73
+ tools(toolsFactory) {
74
+ fluentState.tools = (context, dataStream) => toolsFactory(ensureInitializedContext(context), dataStream);
75
+ return builder;
76
+ },
77
+ model(model) {
78
+ if (typeof model === "function") {
79
+ fluentState.model = (context) => model(ensureInitializedContext(context));
80
+ }
81
+ else {
82
+ fluentState.model = model;
83
+ }
84
+ return builder;
85
+ },
86
+ opts(options) {
87
+ fluentState.opts = options;
88
+ return builder;
89
+ },
90
+ includeBaseTools(baseTools) {
91
+ fluentState.includeBaseTools = baseTools;
92
+ return builder;
93
+ },
94
+ config() {
95
+ assertConfigComplete(fluentState);
96
+ return fluentState;
97
+ },
98
+ build() {
99
+ assertConfigComplete(fluentState);
100
+ return story(fluentState);
101
+ },
102
+ };
103
+ return builder;
104
+ };
105
+ return {
106
+ context: initializeBuilder,
107
+ initialize: initializeBuilder,
108
+ };
109
+ }
110
+ //# sourceMappingURL=agent.builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.builder.js","sourceRoot":"","sources":["../src/agent.builder.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InstantAdminDatabase } from \"@instantdb/admin\"\r\nimport type { Tool } from \"ai\"\r\nimport type { SchemaOf } from \"@ekairos/domain\"\r\n\r\nimport { storyDomain } from \"./schema\"\r\nimport { Story, type StoryOptions, type DataStreamWriter } from \"./agent.engine\"\r\nimport type { StoredContext } from \"./service\"\r\n\r\nexport interface StoryConfig<Context> {\r\n db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>\r\n context: (context: StoredContext<Context>) => Promise<Context> | Context\r\n systemPrompt: (context: StoredContext<Context>) => Promise<string> | string\r\n tools: (\r\n context: StoredContext<Context>,\r\n dataStream: DataStreamWriter\r\n ) => Promise<Record<string, Tool>> | Record<string, Tool>\r\n model?: string | ((context: StoredContext<Context>) => string)\r\n opts?: StoryOptions\r\n includeBaseTools?: { createMessage?: boolean; requestDirection?: boolean; end?: boolean }\r\n}\r\n\r\nexport type StoryInstance<Context> = Story<Context> & {\r\n readonly __config: StoryConfig<Context>\r\n}\r\n\r\nexport function story<Context>(config: StoryConfig<Context>): StoryInstance<Context> {\r\n class FunctionalAgent extends Story<Context> {\r\n public readonly __config = config\r\n\r\n constructor() {\r\n super(config.db, config.opts)\r\n }\r\n\r\n protected includeBaseTools(): { createMessage: boolean; requestDirection: boolean; end: boolean } {\r\n if (config.includeBaseTools) {\r\n return {\r\n createMessage: config.includeBaseTools.createMessage ?? true,\r\n requestDirection: config.includeBaseTools.requestDirection ?? true,\r\n end: config.includeBaseTools.end ?? true,\r\n }\r\n }\r\n return super.includeBaseTools()\r\n }\r\n\r\n protected async buildSystemPrompt(context: StoredContext<Context>) {\r\n return config.systemPrompt(context)\r\n }\r\n\r\n protected async buildTools(context: StoredContext<Context>, dataStream: DataStreamWriter) {\r\n return config.tools(context, dataStream)\r\n }\r\n\r\n protected async initialize(context: StoredContext<Context>) {\r\n return config.context(context)\r\n }\r\n\r\n protected getModel(context: StoredContext<Context>) {\r\n if (typeof config.model === \"function\") {\r\n return config.model(context)\r\n }\r\n return config.model || super.getModel(context)\r\n }\r\n }\r\n const instance = new FunctionalAgent()\r\n return Object.assign(instance, { __config: config })\r\n}\r\n\r\ntype InitializedStoredContext<Context> = StoredContext<Context> & { content: Context }\r\n\r\ntype BuilderSystemPrompt<Context> = (\r\n context: InitializedStoredContext<Context>\r\n) => Promise<string> | string\r\n\r\ntype BuilderTools<Context> = (\r\n context: InitializedStoredContext<Context>,\r\n dataStream: DataStreamWriter\r\n) => Promise<Record<string, Tool>> | Record<string, Tool>\r\n\r\ntype BuilderModel<Context> =\r\n | string\r\n | ((context: InitializedStoredContext<Context>) => string)\r\n\r\ntype BuilderIncludeBaseTools = { createMessage?: boolean; requestDirection?: boolean; end?: boolean }\r\n\r\ntype FluentAgentBuilder<Context> = {\r\n systemPrompt(fn: BuilderSystemPrompt<Context>): FluentAgentBuilder<Context>\r\n tools(fn: BuilderTools<Context>): FluentAgentBuilder<Context>\r\n model(model: BuilderModel<Context>): FluentAgentBuilder<Context>\r\n opts(opts: StoryOptions): FluentAgentBuilder<Context>\r\n includeBaseTools(baseTools: BuilderIncludeBaseTools): FluentAgentBuilder<Context>\r\n config(): StoryConfig<Context>\r\n build(): StoryInstance<Context>\r\n}\r\n\r\ntype AnyContextInitializer = (context: StoredContext<any>) => Promise<any> | any\r\n\r\ntype InferContextFromInitializer<I extends AnyContextInitializer> = Awaited<ReturnType<I>>\r\n\r\ntype CreateAgentEntry = {\r\n context<Initializer extends AnyContextInitializer>(\r\n initializer: Initializer\r\n ): FluentAgentBuilder<InferContextFromInitializer<Initializer>>\r\n initialize<Initializer extends AnyContextInitializer>(\r\n initializer: Initializer\r\n ): FluentAgentBuilder<InferContextFromInitializer<Initializer>>\r\n}\r\n\r\nfunction assertConfigComplete<Context>(\r\n config: Partial<StoryConfig<Context>>\r\n): asserts config is StoryConfig<Context> {\r\n if (!config.db) {\r\n throw new Error(\"createStory: Debes proporcionar db como parámetro.\")\r\n }\r\n\r\n if (!config.context) {\r\n throw new Error(\"createStory: Debes definir context() antes de construir la story.\")\r\n }\r\n\r\n if (!config.systemPrompt) {\r\n throw new Error(\"createStory: Debes definir systemPrompt() antes de construir la story.\")\r\n }\r\n\r\n if (!config.tools) {\r\n throw new Error(\"createStory: Debes definir tools() antes de construir la story.\")\r\n }\r\n}\r\n\r\nfunction ensureInitializedContext<Context>(\r\n context: StoredContext<Context>\r\n): InitializedStoredContext<Context> {\r\n if (!context.content) {\r\n throw new Error(\r\n \"createStory: context() debe devolver datos antes de usar systemPrompt/tools.\"\r\n )\r\n }\r\n return context as InitializedStoredContext<Context>\r\n}\r\n\r\nexport function createStory(\r\n db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>\r\n): CreateAgentEntry {\r\n const initializeBuilder = <Initializer extends AnyContextInitializer>(initializer: Initializer) => {\r\n type Context = InferContextFromInitializer<Initializer>\r\n\r\n const typedInitializer: StoryConfig<Context>[\"context\"] = (context) =>\r\n initializer(context as StoredContext<Context>)\r\n\r\n const fluentState: Partial<StoryConfig<Context>> = {\r\n db,\r\n context: typedInitializer,\r\n }\r\n\r\n const builder: FluentAgentBuilder<Context> = {\r\n systemPrompt(systemPrompt) {\r\n fluentState.systemPrompt = (context) =>\r\n systemPrompt(ensureInitializedContext(context))\r\n return builder\r\n },\r\n tools(toolsFactory) {\r\n fluentState.tools = (context, dataStream) =>\r\n toolsFactory(ensureInitializedContext(context), dataStream)\r\n return builder\r\n },\r\n model(model) {\r\n if (typeof model === \"function\") {\r\n fluentState.model = (context) =>\r\n model(ensureInitializedContext(context))\r\n } else {\r\n fluentState.model = model\r\n }\r\n return builder\r\n },\r\n opts(options) {\r\n fluentState.opts = options\r\n return builder\r\n },\r\n includeBaseTools(baseTools) {\r\n fluentState.includeBaseTools = baseTools\r\n return builder\r\n },\r\n config() {\r\n assertConfigComplete(fluentState)\r\n return fluentState\r\n },\r\n build() {\r\n assertConfigComplete(fluentState)\r\n return story(fluentState)\r\n },\r\n }\r\n\r\n return builder\r\n }\r\n\r\n return {\r\n context: initializeBuilder,\r\n initialize: initializeBuilder,\r\n }\r\n}\r\n\r\n\r\n\r\n"]}
package/dist/agent.d.ts CHANGED
@@ -1,120 +1,3 @@
1
- import { InstantAdminDatabase } from "@instantdb/admin";
2
- import { Tool, UIMessageStreamWriter } from "ai";
3
- import { UIMessage } from 'ai';
4
- import { AgentService, ContextEvent, ContextIdentifier, StoredContext } from "./service";
5
- import { storyDomain } from "./schema";
6
- import { SchemaOf } from "@ekairos/domain";
7
- export type AgentMessage = UIMessage<never, // metadata type
8
- {
9
- weather: {
10
- city: string;
11
- weather?: string;
12
- status: 'loading' | 'success';
13
- };
14
- notification: {
15
- message: string;
16
- level: 'info' | 'warning' | 'error';
17
- };
18
- }>;
19
- export interface AgentOptions {
20
- onEventCreated?: (event: any) => void | Promise<void>;
21
- evaluateToolCalls?: (toolCalls: any[]) => Promise<{
22
- success: boolean;
23
- message?: string;
24
- }>;
25
- onToolCallExecuted?: (executionEvent: any) => void | Promise<void>;
26
- onEnd?: (lastEvent: ContextEvent) => void | {
27
- end?: boolean;
28
- } | Promise<void | {
29
- end?: boolean;
30
- }>;
31
- }
32
- export interface ProgressStreamOptions {
33
- reasoningEffort?: "off" | "low" | "medium" | "high";
34
- webSearch?: boolean;
35
- }
36
- export type DataStreamWriter = UIMessageStreamWriter<AgentMessage>;
37
- export declare abstract class Story<Context> {
38
- private opts;
39
- protected db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>;
40
- protected agentService: AgentService;
41
- constructor(db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>, opts?: AgentOptions);
42
- protected abstract buildSystemPrompt(context: StoredContext<Context>, ...args: any[]): Promise<string> | string;
43
- protected abstract buildTools(context: StoredContext<Context>, dataStream: DataStreamWriter): Promise<Record<string, Tool>>;
44
- protected abstract initialize(context: StoredContext<Context>): Promise<Context>;
45
- protected getModel(context: StoredContext<Context>): string;
46
- protected includeBaseTools(): {
47
- createMessage: boolean;
48
- requestDirection: boolean;
49
- end: boolean;
50
- };
51
- protected getFinalizationToolNames(): Promise<string[]>;
52
- private static readonly FINAL_TOOL_NAMES;
53
- protected getBaseTools(dataStream: DataStreamWriter, threadId: string): Record<string, Tool>;
54
- protected executeCreateMessage(eventId: string, args: {
55
- message: string;
56
- type: "info" | "confirmation" | "warning" | "error" | "success";
57
- includeContext?: boolean;
58
- }, threadId: string, dataStream?: DataStreamWriter): Promise<any>;
59
- protected executeRequestDirection(eventId: string, args: {
60
- issue: string;
61
- context: string;
62
- suggestedActions?: string[];
63
- urgency: "low" | "medium" | "high";
64
- }, threadId: string, _dataStream?: DataStreamWriter): Promise<any>;
65
- progressStream(incomingEvent: ContextEvent, contextIdentifier: ContextIdentifier | null, options?: ProgressStreamOptions): Promise<{
66
- contextId: unknown;
67
- triggerEventId: string;
68
- reactionEventId: string;
69
- stream: ReadableStream<any>;
70
- executionId: string;
71
- }>;
72
- private saveMessagesToThread;
73
- private callOnEnd;
74
- }
75
- export interface AgentConfig<Context> {
76
- db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>;
77
- context: (context: StoredContext<Context>) => Promise<Context> | Context;
78
- systemPrompt: (context: StoredContext<Context>) => Promise<string> | string;
79
- tools: (context: StoredContext<Context>, dataStream: DataStreamWriter) => Promise<Record<string, Tool>> | Record<string, Tool>;
80
- model?: string | ((context: StoredContext<Context>) => string);
81
- opts?: AgentOptions;
82
- includeBaseTools?: {
83
- createMessage?: boolean;
84
- requestDirection?: boolean;
85
- end?: boolean;
86
- };
87
- }
88
- export type AgentInstance<Context> = Story<Context> & {
89
- readonly __config: AgentConfig<Context>;
90
- };
91
- export declare function agent<Context>(config: AgentConfig<Context>): AgentInstance<Context>;
92
- export { Story as Agent };
93
- type InitializedStoredContext<Context> = StoredContext<Context> & {
94
- content: Context;
95
- };
96
- type BuilderSystemPrompt<Context> = (context: InitializedStoredContext<Context>) => Promise<string> | string;
97
- type BuilderTools<Context> = (context: InitializedStoredContext<Context>, dataStream: DataStreamWriter) => Promise<Record<string, Tool>> | Record<string, Tool>;
98
- type BuilderModel<Context> = string | ((context: InitializedStoredContext<Context>) => string);
99
- type BuilderIncludeBaseTools = {
100
- createMessage?: boolean;
101
- requestDirection?: boolean;
102
- end?: boolean;
103
- };
104
- type FluentAgentBuilder<Context> = {
105
- systemPrompt(fn: BuilderSystemPrompt<Context>): FluentAgentBuilder<Context>;
106
- tools(fn: BuilderTools<Context>): FluentAgentBuilder<Context>;
107
- model(model: BuilderModel<Context>): FluentAgentBuilder<Context>;
108
- opts(opts: AgentOptions): FluentAgentBuilder<Context>;
109
- includeBaseTools(baseTools: BuilderIncludeBaseTools): FluentAgentBuilder<Context>;
110
- config(): AgentConfig<Context>;
111
- build(): AgentInstance<Context>;
112
- };
113
- type AnyContextInitializer = (context: StoredContext<any>) => Promise<any> | any;
114
- type InferContextFromInitializer<I extends AnyContextInitializer> = Awaited<ReturnType<I>>;
115
- type CreateAgentEntry = {
116
- context<Initializer extends AnyContextInitializer>(initializer: Initializer): FluentAgentBuilder<InferContextFromInitializer<Initializer>>;
117
- initialize<Initializer extends AnyContextInitializer>(initializer: Initializer): FluentAgentBuilder<InferContextFromInitializer<Initializer>>;
118
- };
119
- export declare function createAgent(db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>): CreateAgentEntry;
1
+ export { Story, type StoryOptions, type ProgressStreamOptions, type DataStreamWriter, } from "./agent.engine";
2
+ export { story, createStory, type StoryConfig, type StoryInstance, } from "./agent.builder";
120
3
  //# sourceMappingURL=agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,EACL,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAEL,KAAK,EACL,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,75 @@
1
+ import { type InstantAdminDatabase } from "@instantdb/admin";
2
+ import { type Tool, type UIMessage, type UIMessageStreamWriter } from "ai";
3
+ import type { SchemaOf } from "@ekairos/domain";
4
+ import { storyDomain } from "./schema";
5
+ import type { ContextEvent, ContextIdentifier, StoredContext } from "./service";
6
+ import { AgentService } from "./service";
7
+ export type AgentMessage = UIMessage<never, // metadata type
8
+ {
9
+ weather: {
10
+ city: string;
11
+ weather?: string;
12
+ status: "loading" | "success";
13
+ };
14
+ notification: {
15
+ message: string;
16
+ level: "info" | "warning" | "error";
17
+ };
18
+ }>;
19
+ export interface StoryOptions {
20
+ onEventCreated?: (event: any) => void | Promise<void>;
21
+ evaluateToolCalls?: (toolCalls: any[]) => Promise<{
22
+ success: boolean;
23
+ message?: string;
24
+ }>;
25
+ onToolCallExecuted?: (executionEvent: any) => void | Promise<void>;
26
+ onEnd?: (lastEvent: ContextEvent) => void | {
27
+ end?: boolean;
28
+ } | Promise<void | {
29
+ end?: boolean;
30
+ }>;
31
+ }
32
+ export interface ProgressStreamOptions {
33
+ reasoningEffort?: "off" | "low" | "medium" | "high";
34
+ webSearch?: boolean;
35
+ }
36
+ export type DataStreamWriter = UIMessageStreamWriter<AgentMessage>;
37
+ export declare abstract class Story<Context> {
38
+ private opts;
39
+ protected db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>;
40
+ protected agentService: AgentService;
41
+ constructor(db: InstantAdminDatabase<SchemaOf<typeof storyDomain>>, opts?: StoryOptions);
42
+ protected abstract buildSystemPrompt(context: StoredContext<Context>, ...args: any[]): Promise<string> | string;
43
+ protected abstract buildTools(context: StoredContext<Context>, dataStream: DataStreamWriter): Promise<Record<string, Tool>>;
44
+ protected abstract initialize(context: StoredContext<Context>): Promise<Context>;
45
+ protected getModel(_context: StoredContext<Context>): string;
46
+ protected includeBaseTools(): {
47
+ createMessage: boolean;
48
+ requestDirection: boolean;
49
+ end: boolean;
50
+ };
51
+ protected getFinalizationToolNames(): Promise<string[]>;
52
+ private static readonly FINAL_TOOL_NAMES;
53
+ protected getBaseTools(_dataStream: DataStreamWriter, _threadId: string): Record<string, Tool>;
54
+ protected executeCreateMessage(eventId: string, args: {
55
+ message: string;
56
+ type: "info" | "confirmation" | "warning" | "error" | "success";
57
+ includeContext?: boolean;
58
+ }, threadId: string, dataStream?: DataStreamWriter): Promise<any>;
59
+ protected executeRequestDirection(eventId: string, args: {
60
+ issue: string;
61
+ context: string;
62
+ suggestedActions?: string[];
63
+ urgency: "low" | "medium" | "high";
64
+ }, threadId: string, _dataStream?: DataStreamWriter): Promise<any>;
65
+ progressStream(incomingEvent: ContextEvent, contextIdentifier: ContextIdentifier | null, options?: ProgressStreamOptions): Promise<{
66
+ contextId: unknown;
67
+ triggerEventId: string;
68
+ reactionEventId: string;
69
+ stream: ReadableStream<any>;
70
+ executionId: string;
71
+ }>;
72
+ private saveMessagesToThread;
73
+ private callOnEnd;
74
+ }
75
+ //# sourceMappingURL=agent.engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.engine.d.ts","sourceRoot":"","sources":["../src/agent.engine.ts"],"names":[],"mappings":"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"}