@contractspec/lib.ai-agent 1.44.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 (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -0
  3. package/dist/agent/agent-factory.d.ts +104 -0
  4. package/dist/agent/agent-factory.d.ts.map +1 -0
  5. package/dist/agent/agent-factory.js +103 -0
  6. package/dist/agent/agent-factory.js.map +1 -0
  7. package/dist/agent/contract-spec-agent.d.ts +75 -0
  8. package/dist/agent/contract-spec-agent.d.ts.map +1 -0
  9. package/dist/agent/contract-spec-agent.js +148 -0
  10. package/dist/agent/contract-spec-agent.js.map +1 -0
  11. package/dist/agent/index.d.ts +3 -0
  12. package/dist/agent/index.js +4 -0
  13. package/dist/approval/index.d.ts +2 -0
  14. package/dist/approval/index.js +3 -0
  15. package/dist/approval/workflow.d.ts +156 -0
  16. package/dist/approval/workflow.d.ts.map +1 -0
  17. package/dist/approval/workflow.js +160 -0
  18. package/dist/approval/workflow.js.map +1 -0
  19. package/dist/index.d.ts +23 -0
  20. package/dist/index.js +21 -0
  21. package/dist/knowledge/index.d.ts +2 -0
  22. package/dist/knowledge/index.js +3 -0
  23. package/dist/knowledge/injector.d.ts +38 -0
  24. package/dist/knowledge/injector.d.ts.map +1 -0
  25. package/dist/knowledge/injector.js +58 -0
  26. package/dist/knowledge/injector.js.map +1 -0
  27. package/dist/memory/in-memory.d.ts +22 -0
  28. package/dist/memory/in-memory.d.ts.map +1 -0
  29. package/dist/memory/in-memory.js +48 -0
  30. package/dist/memory/in-memory.js.map +1 -0
  31. package/dist/memory/index.d.ts +3 -0
  32. package/dist/memory/index.js +4 -0
  33. package/dist/memory/manager.d.ts +42 -0
  34. package/dist/memory/manager.d.ts.map +1 -0
  35. package/dist/memory/manager.js +80 -0
  36. package/dist/memory/manager.js.map +1 -0
  37. package/dist/schema/index.d.ts +3 -0
  38. package/dist/schema/index.js +4 -0
  39. package/dist/schema/json-schema-to-zod.d.ts +55 -0
  40. package/dist/schema/json-schema-to-zod.d.ts.map +1 -0
  41. package/dist/schema/json-schema-to-zod.js +124 -0
  42. package/dist/schema/json-schema-to-zod.js.map +1 -0
  43. package/dist/schema/schema-output.d.ts +77 -0
  44. package/dist/schema/schema-output.d.ts.map +1 -0
  45. package/dist/schema/schema-output.js +65 -0
  46. package/dist/schema/schema-output.js.map +1 -0
  47. package/dist/session/index.d.ts +2 -0
  48. package/dist/session/index.js +3 -0
  49. package/dist/session/store.d.ts +74 -0
  50. package/dist/session/store.d.ts.map +1 -0
  51. package/dist/session/store.js +79 -0
  52. package/dist/session/store.js.map +1 -0
  53. package/dist/spec/index.d.ts +3 -0
  54. package/dist/spec/index.js +4 -0
  55. package/dist/spec/registry.d.ts +78 -0
  56. package/dist/spec/registry.d.ts.map +1 -0
  57. package/dist/spec/registry.js +117 -0
  58. package/dist/spec/registry.js.map +1 -0
  59. package/dist/spec/spec.d.ts +127 -0
  60. package/dist/spec/spec.d.ts.map +1 -0
  61. package/dist/spec/spec.js +30 -0
  62. package/dist/spec/spec.js.map +1 -0
  63. package/dist/telemetry/adapter.d.ts +73 -0
  64. package/dist/telemetry/adapter.d.ts.map +1 -0
  65. package/dist/telemetry/adapter.js +103 -0
  66. package/dist/telemetry/adapter.js.map +1 -0
  67. package/dist/telemetry/index.d.ts +2 -0
  68. package/dist/telemetry/index.js +3 -0
  69. package/dist/tools/index.d.ts +5 -0
  70. package/dist/tools/index.js +6 -0
  71. package/dist/tools/knowledge-tool.d.ts +21 -0
  72. package/dist/tools/knowledge-tool.d.ts.map +1 -0
  73. package/dist/tools/knowledge-tool.js +54 -0
  74. package/dist/tools/knowledge-tool.js.map +1 -0
  75. package/dist/tools/mcp-client.d.ts +59 -0
  76. package/dist/tools/mcp-client.d.ts.map +1 -0
  77. package/dist/tools/mcp-client.js +58 -0
  78. package/dist/tools/mcp-client.js.map +1 -0
  79. package/dist/tools/mcp-server.d.ts +46 -0
  80. package/dist/tools/mcp-server.d.ts.map +1 -0
  81. package/dist/tools/mcp-server.js +69 -0
  82. package/dist/tools/mcp-server.js.map +1 -0
  83. package/dist/tools/tool-adapter.d.ts +50 -0
  84. package/dist/tools/tool-adapter.d.ts.map +1 -0
  85. package/dist/tools/tool-adapter.js +80 -0
  86. package/dist/tools/tool-adapter.js.map +1 -0
  87. package/dist/types.d.ts +146 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/types.js +0 -0
  90. package/package.json +114 -0
@@ -0,0 +1,80 @@
1
+ import { randomUUID } from "node:crypto";
2
+
3
+ //#region src/memory/manager.ts
4
+ /**
5
+ * Extract text content from a ModelMessage.
6
+ * Handles both string content and array content parts.
7
+ */
8
+ function extractMessageContent(message) {
9
+ const content = message.content;
10
+ if (typeof content === "string") return content;
11
+ if (Array.isArray(content)) return content.map((part) => {
12
+ if (typeof part === "string") return part;
13
+ if ("text" in part && typeof part.text === "string") return part.text;
14
+ return "";
15
+ }).filter(Boolean).join("");
16
+ return "";
17
+ }
18
+ /**
19
+ * Extract text content from an AgentMessage.
20
+ */
21
+ function extractAgentMessageContent(message) {
22
+ const content = message.content;
23
+ if (typeof content === "string") return content;
24
+ if (Array.isArray(content)) return content.map((part) => {
25
+ if (typeof part === "string") return part;
26
+ if ("text" in part && typeof part.text === "string") return part.text;
27
+ return "";
28
+ }).filter(Boolean).join("");
29
+ return "";
30
+ }
31
+ /**
32
+ * Map ModelMessage role to memory entry type.
33
+ */
34
+ function roleToEntryType(role) {
35
+ switch (role) {
36
+ case "assistant": return "assistant";
37
+ case "system": return "system";
38
+ case "tool": return "tool";
39
+ case "user":
40
+ default: return "user";
41
+ }
42
+ }
43
+ var BaseAgentMemoryManager = class {
44
+ async append(session, entry) {
45
+ const current = await this.load(session.sessionId) ?? this.bootstrapMemory(session);
46
+ const finalEntry = {
47
+ id: randomUUID(),
48
+ createdAt: entry.createdAt ?? /* @__PURE__ */ new Date(),
49
+ ...entry
50
+ };
51
+ current.memory.entries.push(finalEntry);
52
+ await this.save(current);
53
+ return current;
54
+ }
55
+ async summarize(_session) {}
56
+ async prune(_session) {}
57
+ bootstrapMemory(session) {
58
+ return {
59
+ session,
60
+ memory: { entries: session.messages.map((message) => ({
61
+ id: randomUUID(),
62
+ createdAt: /* @__PURE__ */ new Date(),
63
+ type: roleToEntryType(message.role),
64
+ content: extractMessageContent(message)
65
+ })) }
66
+ };
67
+ }
68
+ };
69
+ function trackMessageInMemory(manager, session, message) {
70
+ if (!manager) return;
71
+ manager.append(session, {
72
+ type: message.role,
73
+ content: extractAgentMessageContent(message),
74
+ metadata: message.metadata
75
+ });
76
+ }
77
+
78
+ //#endregion
79
+ export { BaseAgentMemoryManager, trackMessageInMemory };
80
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","names":["finalEntry: AgentMemoryEntry"],"sources":["../../src/memory/manager.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { ModelMessage } from 'ai';\nimport type { AgentMessage, AgentSessionState } from '../types';\n\nexport interface AgentMemoryEntry {\n id: string;\n type: 'user' | 'assistant' | 'tool' | 'system';\n content: string;\n createdAt: Date;\n metadata?: Record<string, string>;\n}\n\nexport interface AgentMemorySnapshot {\n entries: AgentMemoryEntry[];\n summary?: string;\n lastSummarizedAt?: Date;\n}\n\nexport interface AgentSessionMemory {\n session: AgentSessionState;\n memory: AgentMemorySnapshot;\n}\n\nexport interface AgentMemoryManager {\n load(sessionId: string): Promise<AgentSessionMemory | null>;\n save(snapshot: AgentSessionMemory): Promise<void>;\n append(\n session: AgentSessionState,\n entry: Omit<AgentMemoryEntry, 'id' | 'createdAt'> & { createdAt?: Date }\n ): Promise<AgentSessionMemory>;\n summarize(\n session: AgentSessionState\n ): Promise<AgentMemorySnapshot | undefined>;\n prune(session: AgentSessionState): Promise<void>;\n}\n\n/**\n * Extract text content from a ModelMessage.\n * Handles both string content and array content parts.\n */\nfunction extractMessageContent(message: ModelMessage): string {\n const content = message.content;\n\n // Handle string content directly\n if (typeof content === 'string') {\n return content;\n }\n\n // Handle array content (parts)\n if (Array.isArray(content)) {\n return content\n .map((part) => {\n if (typeof part === 'string') return part;\n if ('text' in part && typeof part.text === 'string') return part.text;\n return '';\n })\n .filter(Boolean)\n .join('');\n }\n\n return '';\n}\n\n/**\n * Extract text content from an AgentMessage.\n */\nfunction extractAgentMessageContent(message: AgentMessage): string {\n const content = message.content;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n return content\n .map((part) => {\n if (typeof part === 'string') return part;\n if ('text' in part && typeof part.text === 'string') return part.text;\n return '';\n })\n .filter(Boolean)\n .join('');\n }\n\n return '';\n}\n\n/**\n * Map ModelMessage role to memory entry type.\n */\nfunction roleToEntryType(\n role: ModelMessage['role']\n): 'user' | 'assistant' | 'tool' | 'system' {\n switch (role) {\n case 'assistant':\n return 'assistant';\n case 'system':\n return 'system';\n case 'tool':\n return 'tool';\n case 'user':\n default:\n return 'user';\n }\n}\n\nexport abstract class BaseAgentMemoryManager implements AgentMemoryManager {\n abstract load(sessionId: string): Promise<AgentSessionMemory | null>;\n abstract save(snapshot: AgentSessionMemory): Promise<void>;\n\n async append(\n session: AgentSessionState,\n entry: Omit<AgentMemoryEntry, 'id' | 'createdAt'> & { createdAt?: Date }\n ): Promise<AgentSessionMemory> {\n const current =\n (await this.load(session.sessionId)) ?? this.bootstrapMemory(session);\n const finalEntry: AgentMemoryEntry = {\n id: randomUUID(),\n createdAt: entry.createdAt ?? new Date(),\n ...entry,\n };\n current.memory.entries.push(finalEntry);\n await this.save(current);\n return current;\n }\n\n async summarize(\n _session: AgentSessionState\n ): Promise<AgentMemorySnapshot | undefined> {\n return undefined;\n }\n\n async prune(_session: AgentSessionState): Promise<void> {\n // noop by default\n }\n\n protected bootstrapMemory(session: AgentSessionState): AgentSessionMemory {\n return {\n session,\n memory: {\n entries: session.messages.map<AgentMemoryEntry>((message) => ({\n id: randomUUID(),\n createdAt: new Date(),\n type: roleToEntryType(message.role),\n content: extractMessageContent(message),\n })),\n },\n };\n }\n}\n\nexport function trackMessageInMemory(\n manager: AgentMemoryManager | undefined,\n session: AgentSessionState,\n message: AgentMessage\n) {\n if (!manager) return;\n void manager.append(session, {\n type: message.role,\n content: extractAgentMessageContent(message),\n metadata: message.metadata,\n });\n}\n"],"mappings":";;;;;;;AAwCA,SAAS,sBAAsB,SAA+B;CAC5D,MAAM,UAAU,QAAQ;AAGxB,KAAI,OAAO,YAAY,SACrB,QAAO;AAIT,KAAI,MAAM,QAAQ,QAAQ,CACxB,QAAO,QACJ,KAAK,SAAS;AACb,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,MAAI,UAAU,QAAQ,OAAO,KAAK,SAAS,SAAU,QAAO,KAAK;AACjE,SAAO;GACP,CACD,OAAO,QAAQ,CACf,KAAK,GAAG;AAGb,QAAO;;;;;AAMT,SAAS,2BAA2B,SAA+B;CACjE,MAAM,UAAU,QAAQ;AAExB,KAAI,OAAO,YAAY,SACrB,QAAO;AAGT,KAAI,MAAM,QAAQ,QAAQ,CACxB,QAAO,QACJ,KAAK,SAAS;AACb,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,MAAI,UAAU,QAAQ,OAAO,KAAK,SAAS,SAAU,QAAO,KAAK;AACjE,SAAO;GACP,CACD,OAAO,QAAQ,CACf,KAAK,GAAG;AAGb,QAAO;;;;;AAMT,SAAS,gBACP,MAC0C;AAC1C,SAAQ,MAAR;EACE,KAAK,YACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK;EACL,QACE,QAAO;;;AAIb,IAAsB,yBAAtB,MAA2E;CAIzE,MAAM,OACJ,SACA,OAC6B;EAC7B,MAAM,UACH,MAAM,KAAK,KAAK,QAAQ,UAAU,IAAK,KAAK,gBAAgB,QAAQ;EACvE,MAAMA,aAA+B;GACnC,IAAI,YAAY;GAChB,WAAW,MAAM,6BAAa,IAAI,MAAM;GACxC,GAAG;GACJ;AACD,UAAQ,OAAO,QAAQ,KAAK,WAAW;AACvC,QAAM,KAAK,KAAK,QAAQ;AACxB,SAAO;;CAGT,MAAM,UACJ,UAC0C;CAI5C,MAAM,MAAM,UAA4C;CAIxD,AAAU,gBAAgB,SAAgD;AACxE,SAAO;GACL;GACA,QAAQ,EACN,SAAS,QAAQ,SAAS,KAAuB,aAAa;IAC5D,IAAI,YAAY;IAChB,2BAAW,IAAI,MAAM;IACrB,MAAM,gBAAgB,QAAQ,KAAK;IACnC,SAAS,sBAAsB,QAAQ;IACxC,EAAE,EACJ;GACF;;;AAIL,SAAgB,qBACd,SACA,SACA,SACA;AACA,KAAI,CAAC,QAAS;AACd,CAAK,QAAQ,OAAO,SAAS;EAC3B,MAAM,QAAQ;EACd,SAAS,2BAA2B,QAAQ;EAC5C,UAAU,QAAQ;EACnB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { jsonSchemaToZod, jsonSchemaToZodSafe } from "./json-schema-to-zod.js";
2
+ import { SchemaOutput, enumToChoiceOutput, jsonSchemaToArrayOutput, jsonSchemaToOutput, textOutput, zodToOutput } from "./schema-output.js";
3
+ export { SchemaOutput, enumToChoiceOutput, jsonSchemaToArrayOutput, jsonSchemaToOutput, jsonSchemaToZod, jsonSchemaToZodSafe, textOutput, zodToOutput };
@@ -0,0 +1,4 @@
1
+ import { jsonSchemaToZod, jsonSchemaToZodSafe } from "./json-schema-to-zod.js";
2
+ import { SchemaOutput, enumToChoiceOutput, jsonSchemaToArrayOutput, jsonSchemaToOutput, textOutput, zodToOutput } from "./schema-output.js";
3
+
4
+ export { SchemaOutput, enumToChoiceOutput, jsonSchemaToArrayOutput, jsonSchemaToOutput, jsonSchemaToZod, jsonSchemaToZodSafe, textOutput, zodToOutput };
@@ -0,0 +1,55 @@
1
+ import { ZodType } from "zod";
2
+
3
+ //#region src/schema/json-schema-to-zod.d.ts
4
+
5
+ /**
6
+ * JSON Schema type definitions for conversion.
7
+ */
8
+ interface JsonSchema {
9
+ type?: string;
10
+ properties?: Record<string, JsonSchema>;
11
+ required?: string[];
12
+ items?: JsonSchema;
13
+ enum?: (string | number | boolean)[];
14
+ const?: unknown;
15
+ anyOf?: JsonSchema[];
16
+ oneOf?: JsonSchema[];
17
+ allOf?: JsonSchema[];
18
+ description?: string;
19
+ default?: unknown;
20
+ minimum?: number;
21
+ maximum?: number;
22
+ minLength?: number;
23
+ maxLength?: number;
24
+ pattern?: string;
25
+ format?: string;
26
+ nullable?: boolean;
27
+ [key: string]: unknown;
28
+ }
29
+ /**
30
+ * Convert a JSON Schema to a Zod schema.
31
+ *
32
+ * Supports common JSON Schema types and constraints:
33
+ * - string, number, integer, boolean, null
34
+ * - object with properties and required
35
+ * - array with items
36
+ * - enum and const
37
+ * - anyOf, oneOf, allOf
38
+ * - format constraints (email, uri, uuid, date-time)
39
+ * - numeric constraints (minimum, maximum)
40
+ * - string constraints (minLength, maxLength, pattern)
41
+ *
42
+ * @param schema - JSON Schema object
43
+ * @returns Zod schema
44
+ */
45
+ declare function jsonSchemaToZod(schema: JsonSchema | Record<string, unknown>): ZodType;
46
+ /**
47
+ * Convert a JSON Schema to a Zod schema with a default empty object fallback.
48
+ *
49
+ * @param schema - Optional JSON Schema object
50
+ * @returns Zod schema (defaults to empty object schema)
51
+ */
52
+ declare function jsonSchemaToZodSafe(schema?: Record<string, unknown>): ZodType;
53
+ //#endregion
54
+ export { jsonSchemaToZod, jsonSchemaToZodSafe };
55
+ //# sourceMappingURL=json-schema-to-zod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-to-zod.d.ts","names":[],"sources":["../../src/schema/json-schema-to-zod.ts"],"sourcesContent":[],"mappings":";;;;;;AAAsC;UAK5B,UAAA,CAEoB;EAAf,IAAA,CAAA,EAAA,MAAA;EAEL,UAAA,CAAA,EAFK,MAEL,CAAA,MAAA,EAFoB,UAEpB,CAAA;EAGA,QAAA,CAAA,EAAA,MAAA,EAAA;EACA,KAAA,CAAA,EAJA,UAIA;EACA,IAAA,CAAA,EAAA,CAAA,MAAA,GAAA,MAAA,GAAA,OAAA,CAAA,EAAA;EAAU,KAAA,CAAA,EAAA,OAAA;EA6BJ,KAAA,CAAA,EA/BN,UA+BqB,EAAA;EACrB,KAAA,CAAA,EA/BA,UA+BA,EAAA;EAAa,KAAA,CAAA,EA9Bb,UA8Ba,EAAA;EACpB,WAAA,CAAA,EAAA,MAAA;EAAO,OAAA,CAAA,EAAA,OAAA;EAyKM,OAAA,CAAA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;iBA3KA,eAAA,SACN,aAAa,0BACpB;;;;;;;iBAyKa,mBAAA,UAA6B,0BAA0B"}
@@ -0,0 +1,124 @@
1
+ import { z } from "zod";
2
+
3
+ //#region src/schema/json-schema-to-zod.ts
4
+ /**
5
+ * Convert a JSON Schema to a Zod schema.
6
+ *
7
+ * Supports common JSON Schema types and constraints:
8
+ * - string, number, integer, boolean, null
9
+ * - object with properties and required
10
+ * - array with items
11
+ * - enum and const
12
+ * - anyOf, oneOf, allOf
13
+ * - format constraints (email, uri, uuid, date-time)
14
+ * - numeric constraints (minimum, maximum)
15
+ * - string constraints (minLength, maxLength, pattern)
16
+ *
17
+ * @param schema - JSON Schema object
18
+ * @returns Zod schema
19
+ */
20
+ function jsonSchemaToZod(schema) {
21
+ const s = schema;
22
+ const makeNullable = (zodSchema) => {
23
+ return s.nullable ? z.union([zodSchema, z.null()]) : zodSchema;
24
+ };
25
+ if (s.const !== void 0) return z.literal(s.const);
26
+ if (s.enum) {
27
+ const values = s.enum;
28
+ return makeNullable(z.enum(values.map(String)));
29
+ }
30
+ if (s.anyOf && s.anyOf.length > 0) {
31
+ const schemas = s.anyOf.map((sub) => jsonSchemaToZod(sub));
32
+ if (schemas.length === 1) return schemas[0] ?? z.unknown();
33
+ return z.union([
34
+ schemas[0] ?? z.unknown(),
35
+ schemas[1] ?? z.unknown(),
36
+ ...schemas.slice(2)
37
+ ]);
38
+ }
39
+ if (s.oneOf && s.oneOf.length > 0) {
40
+ const schemas = s.oneOf.map((sub) => jsonSchemaToZod(sub));
41
+ if (schemas.length === 1) return schemas[0] ?? z.unknown();
42
+ return z.union([
43
+ schemas[0] ?? z.unknown(),
44
+ schemas[1] ?? z.unknown(),
45
+ ...schemas.slice(2)
46
+ ]);
47
+ }
48
+ if (s.allOf && s.allOf.length > 0) return s.allOf.map((sub) => jsonSchemaToZod(sub)).reduce((acc, curr) => z.intersection(acc, curr));
49
+ switch (s.type) {
50
+ case "string": return makeNullable(buildStringSchema(s));
51
+ case "number":
52
+ case "integer": return makeNullable(buildNumberSchema(s));
53
+ case "boolean": return makeNullable(z.boolean());
54
+ case "null": return z.null();
55
+ case "array": return makeNullable(buildArraySchema(s));
56
+ case "object": return makeNullable(buildObjectSchema(s));
57
+ default: return z.unknown();
58
+ }
59
+ }
60
+ function buildStringSchema(schema) {
61
+ let zodSchema = z.string();
62
+ if (schema.description) zodSchema = zodSchema.describe(schema.description);
63
+ switch (schema.format) {
64
+ case "email":
65
+ zodSchema = zodSchema.email();
66
+ break;
67
+ case "uri":
68
+ case "url":
69
+ zodSchema = zodSchema.url();
70
+ break;
71
+ case "uuid":
72
+ zodSchema = zodSchema.uuid();
73
+ break;
74
+ case "date-time":
75
+ zodSchema = zodSchema.datetime();
76
+ break;
77
+ case "date":
78
+ zodSchema = zodSchema.date();
79
+ break;
80
+ }
81
+ if (schema.minLength !== void 0) zodSchema = zodSchema.min(schema.minLength);
82
+ if (schema.maxLength !== void 0) zodSchema = zodSchema.max(schema.maxLength);
83
+ if (schema.pattern) zodSchema = zodSchema.regex(new RegExp(schema.pattern));
84
+ return zodSchema;
85
+ }
86
+ function buildNumberSchema(schema) {
87
+ let zodSchema = schema.type === "integer" ? z.number().int() : z.number();
88
+ if (schema.description) zodSchema = zodSchema.describe(schema.description);
89
+ if (schema.minimum !== void 0) zodSchema = zodSchema.min(schema.minimum);
90
+ if (schema.maximum !== void 0) zodSchema = zodSchema.max(schema.maximum);
91
+ return zodSchema;
92
+ }
93
+ function buildArraySchema(schema) {
94
+ const itemsSchema = schema.items ? jsonSchemaToZod(schema.items) : z.unknown();
95
+ let zodSchema = z.array(itemsSchema);
96
+ if (schema.description) zodSchema = zodSchema.describe(schema.description);
97
+ return zodSchema;
98
+ }
99
+ function buildObjectSchema(schema) {
100
+ const properties = schema.properties ?? {};
101
+ const required = new Set(schema.required ?? []);
102
+ const shape = {};
103
+ for (const [key, propSchema] of Object.entries(properties)) {
104
+ const zodProp = jsonSchemaToZod(propSchema);
105
+ shape[key] = required.has(key) ? zodProp : zodProp.optional();
106
+ }
107
+ let zodSchema = z.object(shape);
108
+ if (schema.description) zodSchema = zodSchema.describe(schema.description);
109
+ return zodSchema;
110
+ }
111
+ /**
112
+ * Convert a JSON Schema to a Zod schema with a default empty object fallback.
113
+ *
114
+ * @param schema - Optional JSON Schema object
115
+ * @returns Zod schema (defaults to empty object schema)
116
+ */
117
+ function jsonSchemaToZodSafe(schema) {
118
+ if (!schema || Object.keys(schema).length === 0) return z.object({});
119
+ return jsonSchemaToZod(schema);
120
+ }
121
+
122
+ //#endregion
123
+ export { jsonSchemaToZod, jsonSchemaToZodSafe };
124
+ //# sourceMappingURL=json-schema-to-zod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-to-zod.js","names":["shape: Record<string, ZodType>"],"sources":["../../src/schema/json-schema-to-zod.ts"],"sourcesContent":["import { z, type ZodType } from 'zod';\n\n/**\n * JSON Schema type definitions for conversion.\n */\ninterface JsonSchema {\n type?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n items?: JsonSchema;\n enum?: (string | number | boolean)[];\n const?: unknown;\n anyOf?: JsonSchema[];\n oneOf?: JsonSchema[];\n allOf?: JsonSchema[];\n description?: string;\n default?: unknown;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n format?: string;\n nullable?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Convert a JSON Schema to a Zod schema.\n *\n * Supports common JSON Schema types and constraints:\n * - string, number, integer, boolean, null\n * - object with properties and required\n * - array with items\n * - enum and const\n * - anyOf, oneOf, allOf\n * - format constraints (email, uri, uuid, date-time)\n * - numeric constraints (minimum, maximum)\n * - string constraints (minLength, maxLength, pattern)\n *\n * @param schema - JSON Schema object\n * @returns Zod schema\n */\nexport function jsonSchemaToZod(\n schema: JsonSchema | Record<string, unknown>\n): ZodType {\n const s = schema as JsonSchema;\n\n // Handle nullable\n const makeNullable = (zodSchema: ZodType): ZodType => {\n return s.nullable ? z.union([zodSchema, z.null()]) : zodSchema;\n };\n\n // Handle const\n if (s.const !== undefined) {\n return z.literal(s.const as string | number | boolean);\n }\n\n // Handle enum\n if (s.enum) {\n const values = s.enum as [\n string | number | boolean,\n ...(string | number | boolean)[],\n ];\n return makeNullable(z.enum(values.map(String) as [string, ...string[]]));\n }\n\n // Handle anyOf\n if (s.anyOf && s.anyOf.length > 0) {\n const schemas = s.anyOf.map((sub) => jsonSchemaToZod(sub));\n if (schemas.length === 1) return schemas[0] ?? z.unknown();\n return z.union([\n schemas[0] ?? z.unknown(),\n schemas[1] ?? z.unknown(),\n ...schemas.slice(2),\n ]);\n }\n\n // Handle oneOf (same as anyOf for Zod purposes)\n if (s.oneOf && s.oneOf.length > 0) {\n const schemas = s.oneOf.map((sub) => jsonSchemaToZod(sub));\n if (schemas.length === 1) return schemas[0] ?? z.unknown();\n return z.union([\n schemas[0] ?? z.unknown(),\n schemas[1] ?? z.unknown(),\n ...schemas.slice(2),\n ]);\n }\n\n // Handle allOf (intersection)\n if (s.allOf && s.allOf.length > 0) {\n const schemas = s.allOf.map((sub) => jsonSchemaToZod(sub));\n return schemas.reduce((acc, curr) => z.intersection(acc, curr));\n }\n\n // Handle type\n switch (s.type) {\n case 'string':\n return makeNullable(buildStringSchema(s));\n case 'number':\n case 'integer':\n return makeNullable(buildNumberSchema(s));\n case 'boolean':\n return makeNullable(z.boolean());\n case 'null':\n return z.null();\n case 'array':\n return makeNullable(buildArraySchema(s));\n case 'object':\n return makeNullable(buildObjectSchema(s));\n default:\n // Unknown type, accept anything\n return z.unknown();\n }\n}\n\nfunction buildStringSchema(schema: JsonSchema): ZodType {\n let zodSchema = z.string();\n\n if (schema.description) {\n zodSchema = zodSchema.describe(schema.description);\n }\n\n // Format constraints\n switch (schema.format) {\n case 'email':\n zodSchema = zodSchema.email();\n break;\n case 'uri':\n case 'url':\n zodSchema = zodSchema.url();\n break;\n case 'uuid':\n zodSchema = zodSchema.uuid();\n break;\n case 'date-time':\n zodSchema = zodSchema.datetime();\n break;\n case 'date':\n zodSchema = zodSchema.date();\n break;\n }\n\n // Length constraints\n if (schema.minLength !== undefined) {\n zodSchema = zodSchema.min(schema.minLength);\n }\n if (schema.maxLength !== undefined) {\n zodSchema = zodSchema.max(schema.maxLength);\n }\n\n // Pattern constraint\n if (schema.pattern) {\n zodSchema = zodSchema.regex(new RegExp(schema.pattern));\n }\n\n return zodSchema;\n}\n\nfunction buildNumberSchema(schema: JsonSchema): ZodType {\n let zodSchema = schema.type === 'integer' ? z.number().int() : z.number();\n\n if (schema.description) {\n zodSchema = zodSchema.describe(schema.description);\n }\n\n if (schema.minimum !== undefined) {\n zodSchema = zodSchema.min(schema.minimum);\n }\n if (schema.maximum !== undefined) {\n zodSchema = zodSchema.max(schema.maximum);\n }\n\n return zodSchema;\n}\n\nfunction buildArraySchema(schema: JsonSchema): ZodType {\n const itemsSchema = schema.items\n ? jsonSchemaToZod(schema.items)\n : z.unknown();\n let zodSchema = z.array(itemsSchema);\n\n if (schema.description) {\n zodSchema = zodSchema.describe(schema.description);\n }\n\n return zodSchema;\n}\n\nfunction buildObjectSchema(schema: JsonSchema): ZodType {\n const properties = schema.properties ?? {};\n const required = new Set(schema.required ?? []);\n\n const shape: Record<string, ZodType> = {};\n for (const [key, propSchema] of Object.entries(properties)) {\n const zodProp = jsonSchemaToZod(propSchema);\n shape[key] = required.has(key) ? zodProp : zodProp.optional();\n }\n\n let zodSchema = z.object(shape);\n\n if (schema.description) {\n zodSchema = zodSchema.describe(schema.description);\n }\n\n return zodSchema;\n}\n\n/**\n * Convert a JSON Schema to a Zod schema with a default empty object fallback.\n *\n * @param schema - Optional JSON Schema object\n * @returns Zod schema (defaults to empty object schema)\n */\nexport function jsonSchemaToZodSafe(schema?: Record<string, unknown>): ZodType {\n if (!schema || Object.keys(schema).length === 0) {\n return z.object({});\n }\n return jsonSchemaToZod(schema);\n}\n"],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { Output } from "ai";
2
+ import { ZodType } from "zod";
3
+
4
+ //#region src/schema/schema-output.d.ts
5
+
6
+ /**
7
+ * Bridge between ContractSpec SchemaModel and AI SDK Output.
8
+ *
9
+ * This module provides utilities to convert ContractSpec schema definitions
10
+ * to AI SDK v6 Output.* structured output configurations.
11
+ */
12
+ type ObjectOutputReturn = ReturnType<typeof Output.object>;
13
+ type ArrayOutputReturn = ReturnType<typeof Output.array>;
14
+ type ChoiceOutputReturn = ReturnType<typeof Output.choice>;
15
+ type TextOutputReturn = ReturnType<typeof Output.text>;
16
+ /**
17
+ * Create an AI SDK Output.object from a JSON Schema.
18
+ *
19
+ * @param schema - JSON Schema object
20
+ * @returns AI SDK Output configuration
21
+ */
22
+ declare function jsonSchemaToOutput(schema: Record<string, unknown>): ObjectOutputReturn;
23
+ /**
24
+ * Create an AI SDK Output.array from a JSON Schema items definition.
25
+ *
26
+ * @param itemSchema - JSON Schema for array items
27
+ * @returns AI SDK Output configuration
28
+ */
29
+ declare function jsonSchemaToArrayOutput(itemSchema: Record<string, unknown>): ArrayOutputReturn;
30
+ /**
31
+ * Create an AI SDK Output.choice from enum values.
32
+ *
33
+ * @param choices - Array of choice values
34
+ * @returns AI SDK Output configuration
35
+ */
36
+ declare function enumToChoiceOutput(choices: string[]): ChoiceOutputReturn;
37
+ /**
38
+ * Create an AI SDK Output from a Zod schema directly.
39
+ *
40
+ * @param schema - Zod schema
41
+ * @returns AI SDK Output configuration
42
+ */
43
+ declare function zodToOutput<T extends ZodType>(schema: T): ObjectOutputReturn;
44
+ /**
45
+ * Create a simple text output configuration.
46
+ *
47
+ * @returns AI SDK Output configuration for text
48
+ */
49
+ declare function textOutput(): TextOutputReturn;
50
+ /**
51
+ * Output builder that can be used fluently.
52
+ */
53
+ declare const SchemaOutput: {
54
+ /**
55
+ * Create an object output from JSON Schema.
56
+ */
57
+ readonly fromJsonSchema: typeof jsonSchemaToOutput;
58
+ /**
59
+ * Create an array output from JSON Schema.
60
+ */
61
+ readonly arrayFromJsonSchema: typeof jsonSchemaToArrayOutput;
62
+ /**
63
+ * Create a choice output from enum.
64
+ */
65
+ readonly fromEnum: typeof enumToChoiceOutput;
66
+ /**
67
+ * Create an output from Zod schema.
68
+ */
69
+ readonly fromZod: typeof zodToOutput;
70
+ /**
71
+ * Create a text output.
72
+ */
73
+ readonly text: typeof textOutput;
74
+ };
75
+ //#endregion
76
+ export { SchemaOutput, enumToChoiceOutput, jsonSchemaToArrayOutput, jsonSchemaToOutput, textOutput, zodToOutput };
77
+ //# sourceMappingURL=schema-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-output.d.ts","names":[],"sources":["../../src/schema/schema-output.ts"],"sourcesContent":[],"mappings":";;;;;;;AACmC;AAWC;AACD;AACC;AASpC,KAXK,kBAAA,GAAqB,UAWQ,CACxB,OAZkC,MAAA,CAAO,MAahD,CAAA;AAaH,KAzBK,iBAAA,GAAoB,UAyBc,CAAA,OAzBI,MAAA,CAAO,KA2B/C,CAAA;AAaH,KAvCK,kBAAA,GAAqB,UAuCQ,CAAqB,OAvCX,MAAA,CAAO,MAuCsB,CAAA;AAYzE,KAlDK,gBAAA,GAAmB,UAkDG,CAAA,OAlDe,MAAA,CAAO,IAkDtB,CAAA;;;;;AAW3B;AAOA;iBA5DgB,kBAAA,SACN,0BACP;;;;;;;iBAaa,uBAAA,aACF,0BACX;;;;;;;iBAaa,kBAAA,qBAAuC;;;;;;;iBAYvC,sBAAsB,iBAAiB,IAAI;;;;;;iBAW3C,UAAA,CAAA,GAAc;;;;cAOjB"}
@@ -0,0 +1,65 @@
1
+ import { jsonSchemaToZod } from "./json-schema-to-zod.js";
2
+ import { Output } from "ai";
3
+ import "zod";
4
+
5
+ //#region src/schema/schema-output.ts
6
+ /**
7
+ * Create an AI SDK Output.object from a JSON Schema.
8
+ *
9
+ * @param schema - JSON Schema object
10
+ * @returns AI SDK Output configuration
11
+ */
12
+ function jsonSchemaToOutput(schema) {
13
+ const zodSchema = jsonSchemaToZod(schema);
14
+ return Output.object({ schema: zodSchema });
15
+ }
16
+ /**
17
+ * Create an AI SDK Output.array from a JSON Schema items definition.
18
+ *
19
+ * @param itemSchema - JSON Schema for array items
20
+ * @returns AI SDK Output configuration
21
+ */
22
+ function jsonSchemaToArrayOutput(itemSchema) {
23
+ const zodSchema = jsonSchemaToZod(itemSchema);
24
+ return Output.array({ element: zodSchema });
25
+ }
26
+ /**
27
+ * Create an AI SDK Output.choice from enum values.
28
+ *
29
+ * @param choices - Array of choice values
30
+ * @returns AI SDK Output configuration
31
+ */
32
+ function enumToChoiceOutput(choices) {
33
+ return Output.choice({ options: choices });
34
+ }
35
+ /**
36
+ * Create an AI SDK Output from a Zod schema directly.
37
+ *
38
+ * @param schema - Zod schema
39
+ * @returns AI SDK Output configuration
40
+ */
41
+ function zodToOutput(schema) {
42
+ return Output.object({ schema });
43
+ }
44
+ /**
45
+ * Create a simple text output configuration.
46
+ *
47
+ * @returns AI SDK Output configuration for text
48
+ */
49
+ function textOutput() {
50
+ return Output.text();
51
+ }
52
+ /**
53
+ * Output builder that can be used fluently.
54
+ */
55
+ const SchemaOutput = {
56
+ fromJsonSchema: jsonSchemaToOutput,
57
+ arrayFromJsonSchema: jsonSchemaToArrayOutput,
58
+ fromEnum: enumToChoiceOutput,
59
+ fromZod: zodToOutput,
60
+ text: textOutput
61
+ };
62
+
63
+ //#endregion
64
+ export { SchemaOutput, enumToChoiceOutput, jsonSchemaToArrayOutput, jsonSchemaToOutput, textOutput, zodToOutput };
65
+ //# sourceMappingURL=schema-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-output.js","names":[],"sources":["../../src/schema/schema-output.ts"],"sourcesContent":["import { Output } from 'ai';\nimport { type ZodType } from 'zod';\nimport { jsonSchemaToZod } from './json-schema-to-zod';\n\n/**\n * Bridge between ContractSpec SchemaModel and AI SDK Output.\n *\n * This module provides utilities to convert ContractSpec schema definitions\n * to AI SDK v6 Output.* structured output configurations.\n */\n\n// Extract return types from Output functions for explicit type annotations\ntype ObjectOutputReturn = ReturnType<typeof Output.object>;\ntype ArrayOutputReturn = ReturnType<typeof Output.array>;\ntype ChoiceOutputReturn = ReturnType<typeof Output.choice>;\ntype TextOutputReturn = ReturnType<typeof Output.text>;\n\n/**\n * Create an AI SDK Output.object from a JSON Schema.\n *\n * @param schema - JSON Schema object\n * @returns AI SDK Output configuration\n */\nexport function jsonSchemaToOutput(\n schema: Record<string, unknown>\n): ObjectOutputReturn {\n const zodSchema = jsonSchemaToZod(schema);\n return Output.object({\n schema: zodSchema,\n });\n}\n\n/**\n * Create an AI SDK Output.array from a JSON Schema items definition.\n *\n * @param itemSchema - JSON Schema for array items\n * @returns AI SDK Output configuration\n */\nexport function jsonSchemaToArrayOutput(\n itemSchema: Record<string, unknown>\n): ArrayOutputReturn {\n const zodSchema = jsonSchemaToZod(itemSchema);\n return Output.array({\n element: zodSchema,\n });\n}\n\n/**\n * Create an AI SDK Output.choice from enum values.\n *\n * @param choices - Array of choice values\n * @returns AI SDK Output configuration\n */\nexport function enumToChoiceOutput(choices: string[]): ChoiceOutputReturn {\n return Output.choice({\n options: choices as [string, ...string[]],\n });\n}\n\n/**\n * Create an AI SDK Output from a Zod schema directly.\n *\n * @param schema - Zod schema\n * @returns AI SDK Output configuration\n */\nexport function zodToOutput<T extends ZodType>(schema: T): ObjectOutputReturn {\n return Output.object({\n schema,\n });\n}\n\n/**\n * Create a simple text output configuration.\n *\n * @returns AI SDK Output configuration for text\n */\nexport function textOutput(): TextOutputReturn {\n return Output.text();\n}\n\n/**\n * Output builder that can be used fluently.\n */\nexport const SchemaOutput = {\n /**\n * Create an object output from JSON Schema.\n */\n fromJsonSchema: jsonSchemaToOutput,\n\n /**\n * Create an array output from JSON Schema.\n */\n arrayFromJsonSchema: jsonSchemaToArrayOutput,\n\n /**\n * Create a choice output from enum.\n */\n fromEnum: enumToChoiceOutput,\n\n /**\n * Create an output from Zod schema.\n */\n fromZod: zodToOutput,\n\n /**\n * Create a text output.\n */\n text: textOutput,\n} as const;\n"],"mappings":";;;;;;;;;;;AAuBA,SAAgB,mBACd,QACoB;CACpB,MAAM,YAAY,gBAAgB,OAAO;AACzC,QAAO,OAAO,OAAO,EACnB,QAAQ,WACT,CAAC;;;;;;;;AASJ,SAAgB,wBACd,YACmB;CACnB,MAAM,YAAY,gBAAgB,WAAW;AAC7C,QAAO,OAAO,MAAM,EAClB,SAAS,WACV,CAAC;;;;;;;;AASJ,SAAgB,mBAAmB,SAAuC;AACxE,QAAO,OAAO,OAAO,EACnB,SAAS,SACV,CAAC;;;;;;;;AASJ,SAAgB,YAA+B,QAA+B;AAC5E,QAAO,OAAO,OAAO,EACnB,QACD,CAAC;;;;;;;AAQJ,SAAgB,aAA+B;AAC7C,QAAO,OAAO,MAAM;;;;;AAMtB,MAAa,eAAe;CAI1B,gBAAgB;CAKhB,qBAAqB;CAKrB,UAAU;CAKV,SAAS;CAKT,MAAM;CACP"}
@@ -0,0 +1,2 @@
1
+ import { AgentSessionStore, InMemorySessionStore, createInMemorySessionStore, generateSessionId } from "./store.js";
2
+ export { AgentSessionStore, InMemorySessionStore, createInMemorySessionStore, generateSessionId };
@@ -0,0 +1,3 @@
1
+ import { InMemorySessionStore, createInMemorySessionStore, generateSessionId } from "./store.js";
2
+
3
+ export { InMemorySessionStore, createInMemorySessionStore, generateSessionId };
@@ -0,0 +1,74 @@
1
+ import { AgentSessionState } from "../types.js";
2
+ import { ModelMessage, StepResult, ToolSet } from "ai";
3
+
4
+ //#region src/session/store.d.ts
5
+
6
+ /**
7
+ * Interface for persisting agent session state.
8
+ *
9
+ * Implementations can use in-memory storage, databases,
10
+ * or external services like Redis.
11
+ */
12
+ interface AgentSessionStore {
13
+ /**
14
+ * Get a session by ID.
15
+ */
16
+ get(sessionId: string): Promise<AgentSessionState | null>;
17
+ /**
18
+ * Create a new session.
19
+ */
20
+ create(session: Omit<AgentSessionState, 'createdAt' | 'updatedAt'>): Promise<AgentSessionState>;
21
+ /**
22
+ * Append a step to a session.
23
+ */
24
+ appendStep(sessionId: string, step: StepResult<ToolSet>): Promise<void>;
25
+ /**
26
+ * Append a message to a session.
27
+ */
28
+ appendMessage(sessionId: string, message: ModelMessage): Promise<void>;
29
+ /**
30
+ * Update session properties.
31
+ */
32
+ update(sessionId: string, updates: Partial<Pick<AgentSessionState, 'status' | 'metadata'>>): Promise<void>;
33
+ /**
34
+ * Delete a session.
35
+ */
36
+ delete(sessionId: string): Promise<boolean>;
37
+ /**
38
+ * List sessions by agent ID.
39
+ */
40
+ listByAgent(agentId: string, limit?: number): Promise<AgentSessionState[]>;
41
+ /**
42
+ * List sessions by tenant ID.
43
+ */
44
+ listByTenant(tenantId: string, limit?: number): Promise<AgentSessionState[]>;
45
+ }
46
+ /**
47
+ * In-memory session store for development and testing.
48
+ */
49
+ declare class InMemorySessionStore implements AgentSessionStore {
50
+ private readonly sessions;
51
+ get(sessionId: string): Promise<AgentSessionState | null>;
52
+ create(session: Omit<AgentSessionState, 'createdAt' | 'updatedAt'>): Promise<AgentSessionState>;
53
+ appendStep(sessionId: string, step: StepResult<ToolSet>): Promise<void>;
54
+ appendMessage(sessionId: string, message: ModelMessage): Promise<void>;
55
+ update(sessionId: string, updates: Partial<Pick<AgentSessionState, 'status' | 'metadata'>>): Promise<void>;
56
+ delete(sessionId: string): Promise<boolean>;
57
+ listByAgent(agentId: string, limit?: number): Promise<AgentSessionState[]>;
58
+ listByTenant(tenantId: string, limit?: number): Promise<AgentSessionState[]>;
59
+ /**
60
+ * Clear all sessions (for testing).
61
+ */
62
+ clear(): void;
63
+ }
64
+ /**
65
+ * Create an in-memory session store.
66
+ */
67
+ declare function createInMemorySessionStore(): AgentSessionStore;
68
+ /**
69
+ * Generate a unique session ID.
70
+ */
71
+ declare function generateSessionId(): string;
72
+ //#endregion
73
+ export { AgentSessionStore, InMemorySessionStore, createInMemorySessionStore, generateSessionId };
74
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","names":[],"sources":["../../src/session/store.ts"],"sourcesContent":[],"mappings":";;;;;;;AASA;;;;AAUa,UAVI,iBAAA,CAUJ;EACA;;;EAKyB,GAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAZZ,OAYY,CAZJ,iBAYI,GAAA,IAAA,CAAA;EAAsB;;;EAYlC,MAAA,CAAA,OAAA,EAlBb,IAkBa,CAlBR,iBAkBQ,EAAA,WAAA,GAAA,WAAA,CAAA,CAAA,EAjBrB,OAiBqB,CAjBb,iBAiBa,CAAA;EAAL;;;EAMQ,UAAA,CAAA,SAAA,EAAA,MAAA,EAAA,IAAA,EAlBS,UAkBT,CAlBoB,OAkBpB,CAAA,CAAA,EAlB+B,OAkB/B,CAAA,IAAA,CAAA;EAK2B;;;EAKN,aAAA,CAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAvBN,YAuBM,CAAA,EAvBS,OAuBT,CAAA,IAAA,CAAA;EAAO;AAMzD;;EAGgC,MAAA,CAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAzBnB,OAyBmB,CAzBX,IAyBW,CAzBN,iBAyBM,EAAA,QAAA,GAAA,UAAA,CAAA,CAAA,CAAA,EAxB3B,OAwB2B,CAAA,IAAA,CAAA;EAKd;;;EACb,MAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAzBwB,OAyBxB,CAAA,OAAA,CAAA;EAagB;;;EAS6B,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAAA,MAAA,CAAA,EA1CF,OA0CE,CA1CM,iBA0CN,EAAA,CAAA;EAAe;;;EAUpD,YAAA,CAAA,QAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAAA,MAAA,CAAA,EA/CqC,OA+CrC,CA/C6C,iBA+C7C,EAAA,CAAA;;;;;AA+BA,cAxEA,oBAAA,YAAgC,iBAwEhC,CAAA;EAAR,iBAAA,QAAA;EAxEwC,GAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAGb,OAHa,CAGL,iBAHK,GAAA,IAAA,CAAA;EAAiB,MAAA,CAAA,OAAA,EAQjD,IARiD,CAQ5C,iBAR4C,EAAA,WAAA,GAAA,WAAA,CAAA,CAAA,EASzD,OATyD,CASjD,iBATiD,CAAA;EAgG9C,UAAA,CAAA,SAAA,EAAA,MAAA,EAA0B,IAAA,EA1EhC,UA0EoC,CA1EzB,OA0EyB,CAAA,CAAA,EAzEzC,OAyE0D,CAAA,IAAA,CAAA;EAO/C,aAAA,CAAA,SAAiB,EAAA,MAAA,EAAA,OAAA,EAxEiB,YAwEjB,CAAA,EAxEgC,OAwEhC,CAAA,IAAA,CAAA;qCA9DpB,QAAQ,KAAK,6CACrB;6BAO8B;gDAO9B,QAAQ;kDAgBR,QAAQ;;;;;;;;;iBAwBG,0BAAA,CAAA,GAA8B;;;;iBAO9B,iBAAA,CAAA"}
@@ -0,0 +1,79 @@
1
+ //#region src/session/store.ts
2
+ /**
3
+ * In-memory session store for development and testing.
4
+ */
5
+ var InMemorySessionStore = class {
6
+ sessions = /* @__PURE__ */ new Map();
7
+ async get(sessionId) {
8
+ return this.sessions.get(sessionId) ?? null;
9
+ }
10
+ async create(session) {
11
+ const now = /* @__PURE__ */ new Date();
12
+ const fullSession = {
13
+ ...session,
14
+ createdAt: now,
15
+ updatedAt: now
16
+ };
17
+ this.sessions.set(session.sessionId, fullSession);
18
+ return fullSession;
19
+ }
20
+ async appendStep(sessionId, step) {
21
+ const session = this.sessions.get(sessionId);
22
+ if (session) {
23
+ session.steps.push(step);
24
+ session.updatedAt = /* @__PURE__ */ new Date();
25
+ }
26
+ }
27
+ async appendMessage(sessionId, message) {
28
+ const session = this.sessions.get(sessionId);
29
+ if (session) {
30
+ session.messages.push(message);
31
+ session.updatedAt = /* @__PURE__ */ new Date();
32
+ }
33
+ }
34
+ async update(sessionId, updates) {
35
+ const session = this.sessions.get(sessionId);
36
+ if (session) Object.assign(session, updates, { updatedAt: /* @__PURE__ */ new Date() });
37
+ }
38
+ async delete(sessionId) {
39
+ return this.sessions.delete(sessionId);
40
+ }
41
+ async listByAgent(agentId, limit = 100) {
42
+ const results = [];
43
+ for (const session of this.sessions.values()) if (session.agentId === agentId) {
44
+ results.push(session);
45
+ if (results.length >= limit) break;
46
+ }
47
+ return results.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());
48
+ }
49
+ async listByTenant(tenantId, limit = 100) {
50
+ const results = [];
51
+ for (const session of this.sessions.values()) if (session.tenantId === tenantId) {
52
+ results.push(session);
53
+ if (results.length >= limit) break;
54
+ }
55
+ return results.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());
56
+ }
57
+ /**
58
+ * Clear all sessions (for testing).
59
+ */
60
+ clear() {
61
+ this.sessions.clear();
62
+ }
63
+ };
64
+ /**
65
+ * Create an in-memory session store.
66
+ */
67
+ function createInMemorySessionStore() {
68
+ return new InMemorySessionStore();
69
+ }
70
+ /**
71
+ * Generate a unique session ID.
72
+ */
73
+ function generateSessionId() {
74
+ return `sess_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;
75
+ }
76
+
77
+ //#endregion
78
+ export { InMemorySessionStore, createInMemorySessionStore, generateSessionId };
79
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","names":["fullSession: AgentSessionState","results: AgentSessionState[]"],"sources":["../../src/session/store.ts"],"sourcesContent":["import type { ModelMessage, StepResult, ToolSet } from 'ai';\nimport type { AgentSessionState } from '../types';\n\n/**\n * Interface for persisting agent session state.\n *\n * Implementations can use in-memory storage, databases,\n * or external services like Redis.\n */\nexport interface AgentSessionStore {\n /**\n * Get a session by ID.\n */\n get(sessionId: string): Promise<AgentSessionState | null>;\n\n /**\n * Create a new session.\n */\n create(\n session: Omit<AgentSessionState, 'createdAt' | 'updatedAt'>\n ): Promise<AgentSessionState>;\n\n /**\n * Append a step to a session.\n */\n appendStep(sessionId: string, step: StepResult<ToolSet>): Promise<void>;\n\n /**\n * Append a message to a session.\n */\n appendMessage(sessionId: string, message: ModelMessage): Promise<void>;\n\n /**\n * Update session properties.\n */\n update(\n sessionId: string,\n updates: Partial<Pick<AgentSessionState, 'status' | 'metadata'>>\n ): Promise<void>;\n\n /**\n * Delete a session.\n */\n delete(sessionId: string): Promise<boolean>;\n\n /**\n * List sessions by agent ID.\n */\n listByAgent(agentId: string, limit?: number): Promise<AgentSessionState[]>;\n\n /**\n * List sessions by tenant ID.\n */\n listByTenant(tenantId: string, limit?: number): Promise<AgentSessionState[]>;\n}\n\n/**\n * In-memory session store for development and testing.\n */\nexport class InMemorySessionStore implements AgentSessionStore {\n private readonly sessions = new Map<string, AgentSessionState>();\n\n async get(sessionId: string): Promise<AgentSessionState | null> {\n return this.sessions.get(sessionId) ?? null;\n }\n\n async create(\n session: Omit<AgentSessionState, 'createdAt' | 'updatedAt'>\n ): Promise<AgentSessionState> {\n const now = new Date();\n const fullSession: AgentSessionState = {\n ...session,\n createdAt: now,\n updatedAt: now,\n };\n this.sessions.set(session.sessionId, fullSession);\n return fullSession;\n }\n\n async appendStep(\n sessionId: string,\n step: StepResult<ToolSet>\n ): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.steps.push(step);\n session.updatedAt = new Date();\n }\n }\n\n async appendMessage(sessionId: string, message: ModelMessage): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.messages.push(message);\n session.updatedAt = new Date();\n }\n }\n\n async update(\n sessionId: string,\n updates: Partial<Pick<AgentSessionState, 'status' | 'metadata'>>\n ): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (session) {\n Object.assign(session, updates, { updatedAt: new Date() });\n }\n }\n\n async delete(sessionId: string): Promise<boolean> {\n return this.sessions.delete(sessionId);\n }\n\n async listByAgent(\n agentId: string,\n limit = 100\n ): Promise<AgentSessionState[]> {\n const results: AgentSessionState[] = [];\n for (const session of this.sessions.values()) {\n if (session.agentId === agentId) {\n results.push(session);\n if (results.length >= limit) break;\n }\n }\n return results.sort(\n (a, b) => b.updatedAt.getTime() - a.updatedAt.getTime()\n );\n }\n\n async listByTenant(\n tenantId: string,\n limit = 100\n ): Promise<AgentSessionState[]> {\n const results: AgentSessionState[] = [];\n for (const session of this.sessions.values()) {\n if (session.tenantId === tenantId) {\n results.push(session);\n if (results.length >= limit) break;\n }\n }\n return results.sort(\n (a, b) => b.updatedAt.getTime() - a.updatedAt.getTime()\n );\n }\n\n /**\n * Clear all sessions (for testing).\n */\n clear(): void {\n this.sessions.clear();\n }\n}\n\n/**\n * Create an in-memory session store.\n */\nexport function createInMemorySessionStore(): AgentSessionStore {\n return new InMemorySessionStore();\n}\n\n/**\n * Generate a unique session ID.\n */\nexport function generateSessionId(): string {\n return `sess_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n}\n"],"mappings":";;;;AA2DA,IAAa,uBAAb,MAA+D;CAC7D,AAAiB,2BAAW,IAAI,KAAgC;CAEhE,MAAM,IAAI,WAAsD;AAC9D,SAAO,KAAK,SAAS,IAAI,UAAU,IAAI;;CAGzC,MAAM,OACJ,SAC4B;EAC5B,MAAM,sBAAM,IAAI,MAAM;EACtB,MAAMA,cAAiC;GACrC,GAAG;GACH,WAAW;GACX,WAAW;GACZ;AACD,OAAK,SAAS,IAAI,QAAQ,WAAW,YAAY;AACjD,SAAO;;CAGT,MAAM,WACJ,WACA,MACe;EACf,MAAM,UAAU,KAAK,SAAS,IAAI,UAAU;AAC5C,MAAI,SAAS;AACX,WAAQ,MAAM,KAAK,KAAK;AACxB,WAAQ,4BAAY,IAAI,MAAM;;;CAIlC,MAAM,cAAc,WAAmB,SAAsC;EAC3E,MAAM,UAAU,KAAK,SAAS,IAAI,UAAU;AAC5C,MAAI,SAAS;AACX,WAAQ,SAAS,KAAK,QAAQ;AAC9B,WAAQ,4BAAY,IAAI,MAAM;;;CAIlC,MAAM,OACJ,WACA,SACe;EACf,MAAM,UAAU,KAAK,SAAS,IAAI,UAAU;AAC5C,MAAI,QACF,QAAO,OAAO,SAAS,SAAS,EAAE,2BAAW,IAAI,MAAM,EAAE,CAAC;;CAI9D,MAAM,OAAO,WAAqC;AAChD,SAAO,KAAK,SAAS,OAAO,UAAU;;CAGxC,MAAM,YACJ,SACA,QAAQ,KACsB;EAC9B,MAAMC,UAA+B,EAAE;AACvC,OAAK,MAAM,WAAW,KAAK,SAAS,QAAQ,CAC1C,KAAI,QAAQ,YAAY,SAAS;AAC/B,WAAQ,KAAK,QAAQ;AACrB,OAAI,QAAQ,UAAU,MAAO;;AAGjC,SAAO,QAAQ,MACZ,GAAG,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,UAAU,SAAS,CACxD;;CAGH,MAAM,aACJ,UACA,QAAQ,KACsB;EAC9B,MAAMA,UAA+B,EAAE;AACvC,OAAK,MAAM,WAAW,KAAK,SAAS,QAAQ,CAC1C,KAAI,QAAQ,aAAa,UAAU;AACjC,WAAQ,KAAK,QAAQ;AACrB,OAAI,QAAQ,UAAU,MAAO;;AAGjC,SAAO,QAAQ,MACZ,GAAG,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,UAAU,SAAS,CACxD;;;;;CAMH,QAAc;AACZ,OAAK,SAAS,OAAO;;;;;;AAOzB,SAAgB,6BAAgD;AAC9D,QAAO,IAAI,sBAAsB;;;;;AAMnC,SAAgB,oBAA4B;AAC1C,QAAO,QAAQ,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,GAAG,GAAG"}
@@ -0,0 +1,3 @@
1
+ import { AgentConfidencePolicy, AgentEscalationPolicy, AgentKnowledgeRef, AgentMemoryConfig, AgentMeta, AgentPolicy, AgentSpec, AgentToolConfig, agentKey, defineAgent } from "./spec.js";
2
+ import { AgentRegistry, createAgentRegistry } from "./registry.js";
3
+ export { AgentConfidencePolicy, AgentEscalationPolicy, AgentKnowledgeRef, AgentMemoryConfig, AgentMeta, AgentPolicy, AgentRegistry, AgentSpec, AgentToolConfig, agentKey, createAgentRegistry, defineAgent };
@@ -0,0 +1,4 @@
1
+ import { agentKey, defineAgent } from "./spec.js";
2
+ import { AgentRegistry, createAgentRegistry } from "./registry.js";
3
+
4
+ export { AgentRegistry, agentKey, createAgentRegistry, defineAgent };