@reminix/runtime 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,8 +1,34 @@
1
1
  /**
2
- * Reminix Runtime Types
3
- * @packageDocumentation
2
+ * Reminix Agent Runtime
3
+ *
4
+ * Build AI agents that integrate seamlessly with the Reminix API.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { Agent, serve } from '@reminix/runtime';
9
+ *
10
+ * const agent = new Agent('my-agent');
11
+ *
12
+ * agent.onInvoke(async (input) => {
13
+ * return { output: `Processed: ${input.message}` };
14
+ * });
15
+ *
16
+ * agent.onChat(async (messages) => {
17
+ * const lastMessage = messages[messages.length - 1];
18
+ * return {
19
+ * message: { role: 'assistant', content: `Reply to: ${lastMessage.content}` }
20
+ * };
21
+ * });
22
+ *
23
+ * serve(agent, { port: 8080 });
24
+ * ```
4
25
  */
5
- export { loadHandler, isFile } from './loader';
6
- export { discoverRegistry } from './registry';
7
- export { executeAgent, executeTool, executeHandler } from './executor';
26
+ // Export schemas for runtime validation
27
+ export { ToolCallFunctionSchema, ToolCallSchema, MessageRoleSchema, ChatMessageSchema, AssistantMessageSchema, InvokeRequestSchema, ChatRequestSchema, InvokeResponseSchema, ChatResponseSchema, StreamChunkSchema, } from './types';
28
+ // Export Agent class, options, and errors
29
+ export { Agent, NotImplementedError, AgentError } from './agent';
30
+ // Export server
31
+ export { serve, createApp } from './server';
32
+ // Export streaming utilities
33
+ export { formatSseEvent, formatSseDone, streamToSse } from './streaming';
8
34
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAsB,MAAM,UAAU,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAiB,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAmCH,wCAAwC;AACxC,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAEjB,0CAA0C;AAC1C,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAqB,MAAM,SAAS,CAAC;AAEpF,gBAAgB;AAChB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAqB,MAAM,UAAU,CAAC;AAE/D,6BAA6B;AAC7B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Hono server for hosting AI agents.
3
+ */
4
+ import { Hono } from 'hono';
5
+ import { Agent } from './agent';
6
+ /**
7
+ * Options for the serve function.
8
+ */
9
+ export interface ServeOptions {
10
+ /** Host to bind to (default: '0.0.0.0') */
11
+ host?: string;
12
+ /** Port to listen on (default: 8080) */
13
+ port?: number;
14
+ }
15
+ /**
16
+ * Create a Hono app with agent routes.
17
+ *
18
+ * @param agents - List of agents to serve
19
+ * @returns Configured Hono app
20
+ */
21
+ export declare function createApp(agents: Agent[]): Hono;
22
+ /**
23
+ * Start a server hosting the provided agents.
24
+ *
25
+ * @param agents - A single agent or array of agents to serve
26
+ * @param options - Server options (host, port)
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const agent = new Agent('my-agent');
31
+ * agent.onInvoke(async (input) => ({ output: 'hello' }));
32
+ *
33
+ * serve(agent, { port: 8080 });
34
+ * // or
35
+ * serve([agent1, agent2], { port: 8080 });
36
+ * ```
37
+ */
38
+ export declare function serve(agents: Agent | Agent[], options?: ServeOptions): void;
39
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,EAAE,KAAK,EAAmC,MAAM,SAAS,CAAC;AAcjE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAyL/C;AA+BD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE,OAAO,GAAE,YAAiB,GAAG,IAAI,CA8B/E"}
package/dist/server.js ADDED
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Hono server for hosting AI agents.
3
+ */
4
+ import { Hono } from 'hono';
5
+ import { streamSSE } from 'hono/streaming';
6
+ import { serve as honoServe } from '@hono/node-server';
7
+ import { AgentError, NotImplementedError } from './agent';
8
+ import { streamToSse } from './streaming';
9
+ import { ChatRequestSchema, InvokeRequestSchema, } from './types';
10
+ import { VERSION } from './version';
11
+ /**
12
+ * Create a Hono app with agent routes.
13
+ *
14
+ * @param agents - List of agents to serve
15
+ * @returns Configured Hono app
16
+ */
17
+ export function createApp(agents) {
18
+ const app = new Hono();
19
+ // Build agent registry
20
+ const registry = new Map();
21
+ for (const agent of agents) {
22
+ if (registry.has(agent.name)) {
23
+ throw new Error(`Duplicate agent name: ${agent.name}`);
24
+ }
25
+ registry.set(agent.name, agent);
26
+ }
27
+ // Health check endpoint
28
+ app.get('/health', (c) => {
29
+ const response = {
30
+ status: 'healthy',
31
+ agents: Array.from(registry.keys()),
32
+ };
33
+ return c.json(response);
34
+ });
35
+ // Discovery endpoint for Reminix platform
36
+ app.get('/_discover', (c) => {
37
+ const response = {
38
+ runtime: {
39
+ version: VERSION,
40
+ language: 'typescript',
41
+ framework: 'hono',
42
+ },
43
+ agents: agents.map((agent) => agent.toInfo()),
44
+ };
45
+ return c.json(response);
46
+ });
47
+ // Per-agent health endpoint
48
+ app.get('/agent/:name/health', (c) => {
49
+ const name = c.req.param('name');
50
+ const agent = registry.get(name);
51
+ if (!agent) {
52
+ return c.json({ error: `Agent not found: ${name}` }, 404);
53
+ }
54
+ const response = {
55
+ name: agent.name,
56
+ invoke: agent.hasInvoke,
57
+ chat: agent.hasChat,
58
+ };
59
+ return c.json(response);
60
+ });
61
+ // Invoke endpoint
62
+ app.post('/agent/:name/invoke', async (c) => {
63
+ const name = c.req.param('name');
64
+ const agent = registry.get(name);
65
+ if (!agent) {
66
+ return c.json({ error: `Agent not found: ${name}` }, 404);
67
+ }
68
+ // Parse and validate request
69
+ let body;
70
+ try {
71
+ body = await c.req.json();
72
+ }
73
+ catch {
74
+ return c.json({ error: 'Invalid JSON body' }, 400);
75
+ }
76
+ const parseResult = InvokeRequestSchema.safeParse(body);
77
+ if (!parseResult.success) {
78
+ const errors = parseResult.error.issues
79
+ .map((i) => `${i.path.join('.')}: ${i.message}`)
80
+ .join('; ');
81
+ return c.json({ error: `Invalid request: ${errors}` }, 400);
82
+ }
83
+ const { input, stream } = parseResult.data;
84
+ // Extract context from raw body (not in schema to keep it flexible)
85
+ const context = body.context;
86
+ try {
87
+ const result = await agent.handleInvoke(input, context);
88
+ // Check if streaming
89
+ if (isAsyncGenerator(result)) {
90
+ if (stream) {
91
+ // Return SSE stream
92
+ return streamSSE(c, async (sseStream) => {
93
+ for await (const event of streamToSse(result)) {
94
+ await sseStream.writeSSE({ data: event.replace(/^data: /, '').replace(/\n\n$/, '') });
95
+ }
96
+ });
97
+ }
98
+ else {
99
+ // Collect chunks into single response
100
+ const chunks = [];
101
+ for await (const chunk of result) {
102
+ chunks.push(chunk.chunk);
103
+ }
104
+ return c.json({ output: chunks.join('') });
105
+ }
106
+ }
107
+ return c.json(result);
108
+ }
109
+ catch (err) {
110
+ return handleError(c, err);
111
+ }
112
+ });
113
+ // Chat endpoint
114
+ app.post('/agent/:name/chat', async (c) => {
115
+ const name = c.req.param('name');
116
+ const agent = registry.get(name);
117
+ if (!agent) {
118
+ return c.json({ error: `Agent not found: ${name}` }, 404);
119
+ }
120
+ // Parse and validate request
121
+ let body;
122
+ try {
123
+ body = await c.req.json();
124
+ }
125
+ catch {
126
+ return c.json({ error: 'Invalid JSON body' }, 400);
127
+ }
128
+ const parseResult = ChatRequestSchema.safeParse(body);
129
+ if (!parseResult.success) {
130
+ const errors = parseResult.error.issues
131
+ .map((i) => `${i.path.join('.')}: ${i.message}`)
132
+ .join('; ');
133
+ return c.json({ error: `Invalid request: ${errors}` }, 400);
134
+ }
135
+ const { messages, stream } = parseResult.data;
136
+ // Extract context from raw body (not in schema to keep it flexible)
137
+ const context = body.context;
138
+ // Validate messages array is not empty
139
+ if (messages.length === 0) {
140
+ return c.json({ error: 'Messages array cannot be empty' }, 400);
141
+ }
142
+ // Validate message roles
143
+ const validRoles = ['system', 'user', 'assistant', 'tool'];
144
+ for (const msg of messages) {
145
+ if (!validRoles.includes(msg.role)) {
146
+ return c.json({ error: `Invalid role: ${msg.role}` }, 400);
147
+ }
148
+ }
149
+ try {
150
+ const result = await agent.handleChat(messages, context);
151
+ // Check if streaming
152
+ if (isAsyncGenerator(result)) {
153
+ if (stream) {
154
+ // Return SSE stream
155
+ return streamSSE(c, async (sseStream) => {
156
+ for await (const event of streamToSse(result)) {
157
+ await sseStream.writeSSE({ data: event.replace(/^data: /, '').replace(/\n\n$/, '') });
158
+ }
159
+ });
160
+ }
161
+ else {
162
+ // Collect chunks into single response
163
+ const chunks = [];
164
+ for await (const chunk of result) {
165
+ chunks.push(chunk.chunk);
166
+ }
167
+ return c.json({
168
+ message: { role: 'assistant', content: chunks.join('') },
169
+ });
170
+ }
171
+ }
172
+ return c.json(result);
173
+ }
174
+ catch (err) {
175
+ return handleError(c, err);
176
+ }
177
+ });
178
+ return app;
179
+ }
180
+ /**
181
+ * Check if a value is an async generator.
182
+ */
183
+ function isAsyncGenerator(value) {
184
+ return (value !== null &&
185
+ typeof value === 'object' &&
186
+ Symbol.asyncIterator in value &&
187
+ typeof value.next === 'function');
188
+ }
189
+ /**
190
+ * Handle errors from agent handlers.
191
+ */
192
+ function handleError(c, err) {
193
+ if (err instanceof NotImplementedError) {
194
+ return c.json({ error: err.message }, 501);
195
+ }
196
+ if (err instanceof AgentError) {
197
+ return c.json({ error: err.message }, 502);
198
+ }
199
+ const message = err instanceof Error ? err.message : 'Internal server error';
200
+ return c.json({ error: message }, 500);
201
+ }
202
+ /**
203
+ * Start a server hosting the provided agents.
204
+ *
205
+ * @param agents - A single agent or array of agents to serve
206
+ * @param options - Server options (host, port)
207
+ *
208
+ * @example
209
+ * ```typescript
210
+ * const agent = new Agent('my-agent');
211
+ * agent.onInvoke(async (input) => ({ output: 'hello' }));
212
+ *
213
+ * serve(agent, { port: 8080 });
214
+ * // or
215
+ * serve([agent1, agent2], { port: 8080 });
216
+ * ```
217
+ */
218
+ export function serve(agents, options = {}) {
219
+ const { host = '0.0.0.0', port = 8080 } = options;
220
+ // Normalize to array
221
+ const agentList = Array.isArray(agents) ? agents : [agents];
222
+ if (agentList.length === 0) {
223
+ throw new Error('At least one agent must be provided');
224
+ }
225
+ // Check for duplicate names
226
+ const names = new Set();
227
+ for (const agent of agentList) {
228
+ if (names.has(agent.name)) {
229
+ throw new Error(`Duplicate agent name: ${agent.name}`);
230
+ }
231
+ names.add(agent.name);
232
+ }
233
+ const app = createApp(agentList);
234
+ console.log(`Starting Reminix Agent Runtime...`);
235
+ console.log(`Agents: ${agentList.map((a) => a.name).join(', ')}`);
236
+ console.log(`Listening on http://${host}:${port}`);
237
+ honoServe({
238
+ fetch: app.fetch,
239
+ hostname: host,
240
+ port,
241
+ });
242
+ }
243
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Streaming utilities for Server-Sent Events (SSE).
3
+ */
4
+ import type { StreamChunk } from './types';
5
+ /**
6
+ * Format data as an SSE event.
7
+ */
8
+ export declare function formatSseEvent(data: Record<string, unknown>): string;
9
+ /**
10
+ * Format the SSE done marker.
11
+ */
12
+ export declare function formatSseDone(): string;
13
+ /**
14
+ * Validate a streaming chunk.
15
+ *
16
+ * @param chunk - The chunk to validate
17
+ * @returns An error message if invalid, null if valid
18
+ */
19
+ export declare function validateChunk(chunk: unknown): string | null;
20
+ /**
21
+ * Convert an async generator to an SSE stream.
22
+ *
23
+ * @param generator - The async generator yielding StreamChunk objects
24
+ * @returns An async generator yielding SSE-formatted strings
25
+ */
26
+ export declare function streamToSse(generator: AsyncGenerator<StreamChunk, void, unknown>): AsyncGenerator<string, void, unknown>;
27
+ //# sourceMappingURL=streaming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAEpE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAc3D;AAED;;;;;GAKG;AACH,wBAAuB,WAAW,CAChC,SAAS,EAAE,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,GACpD,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAiBvC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Streaming utilities for Server-Sent Events (SSE).
3
+ */
4
+ /**
5
+ * Format data as an SSE event.
6
+ */
7
+ export function formatSseEvent(data) {
8
+ return `data: ${JSON.stringify(data)}\n\n`;
9
+ }
10
+ /**
11
+ * Format the SSE done marker.
12
+ */
13
+ export function formatSseDone() {
14
+ return 'data: [DONE]\n\n';
15
+ }
16
+ /**
17
+ * Validate a streaming chunk.
18
+ *
19
+ * @param chunk - The chunk to validate
20
+ * @returns An error message if invalid, null if valid
21
+ */
22
+ export function validateChunk(chunk) {
23
+ if (typeof chunk !== 'object' || chunk === null) {
24
+ return 'Chunk must be an object';
25
+ }
26
+ if (!('chunk' in chunk)) {
27
+ return 'Chunk missing required "chunk" field';
28
+ }
29
+ if (typeof chunk.chunk !== 'string') {
30
+ return 'Chunk "chunk" field must be a string';
31
+ }
32
+ return null;
33
+ }
34
+ /**
35
+ * Convert an async generator to an SSE stream.
36
+ *
37
+ * @param generator - The async generator yielding StreamChunk objects
38
+ * @returns An async generator yielding SSE-formatted strings
39
+ */
40
+ export async function* streamToSse(generator) {
41
+ try {
42
+ for await (const chunk of generator) {
43
+ const error = validateChunk(chunk);
44
+ if (error) {
45
+ yield formatSseEvent({ error });
46
+ yield formatSseDone();
47
+ return;
48
+ }
49
+ yield formatSseEvent(chunk);
50
+ }
51
+ }
52
+ catch (err) {
53
+ const message = err instanceof Error ? err.message : 'Unknown error';
54
+ yield formatSseEvent({ error: `Stream error: ${message}` });
55
+ }
56
+ yield formatSseDone();
57
+ }
58
+ //# sourceMappingURL=streaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAA6B;IAC1D,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,yBAAyB,CAAC;IACnC,CAAC;IAED,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,sCAAsC,CAAC;IAChD,CAAC;IAED,IAAI,OAAQ,KAAqB,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrD,OAAO,sCAAsC,CAAC;IAChD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,WAAW,CAChC,SAAqD;IAErD,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBAChC,MAAM,aAAa,EAAE,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACrE,MAAM,cAAc,CAAC,EAAE,KAAK,EAAE,iBAAiB,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC"}