@cogitator-ai/fastify 0.1.14 → 0.2.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.
Files changed (38) hide show
  1. package/README.md +66 -38
  2. package/dist/hooks/error-handler.d.ts.map +1 -1
  3. package/dist/hooks/error-handler.js +29 -0
  4. package/dist/hooks/error-handler.js.map +1 -1
  5. package/dist/plugin.d.ts.map +1 -1
  6. package/dist/plugin.js +42 -37
  7. package/dist/plugin.js.map +1 -1
  8. package/dist/routes/agents.d.ts.map +1 -1
  9. package/dist/routes/agents.js +58 -49
  10. package/dist/routes/agents.js.map +1 -1
  11. package/dist/routes/health.d.ts.map +1 -1
  12. package/dist/routes/health.js +1 -1
  13. package/dist/routes/health.js.map +1 -1
  14. package/dist/routes/swarms.d.ts.map +1 -1
  15. package/dist/routes/swarms.js +49 -59
  16. package/dist/routes/swarms.js.map +1 -1
  17. package/dist/routes/threads.d.ts.map +1 -1
  18. package/dist/routes/threads.js +11 -30
  19. package/dist/routes/threads.js.map +1 -1
  20. package/dist/routes/utils.d.ts +12 -0
  21. package/dist/routes/utils.d.ts.map +1 -0
  22. package/dist/routes/utils.js +32 -0
  23. package/dist/routes/utils.js.map +1 -0
  24. package/dist/routes/workflows.d.ts.map +1 -1
  25. package/dist/routes/workflows.js +57 -56
  26. package/dist/routes/workflows.js.map +1 -1
  27. package/dist/streaming/fastify-stream-writer.d.ts +2 -0
  28. package/dist/streaming/fastify-stream-writer.d.ts.map +1 -1
  29. package/dist/streaming/fastify-stream-writer.js +27 -2
  30. package/dist/streaming/fastify-stream-writer.js.map +1 -1
  31. package/dist/types.d.ts +11 -2
  32. package/dist/types.d.ts.map +1 -1
  33. package/dist/types.js +8 -6
  34. package/dist/types.js.map +1 -1
  35. package/dist/websocket/handler.d.ts.map +1 -1
  36. package/dist/websocket/handler.js +171 -93
  37. package/dist/websocket/handler.js.map +1 -1
  38. package/package.json +9 -9
package/README.md CHANGED
@@ -20,14 +20,17 @@ import { cogitatorPlugin } from '@cogitator-ai/fastify';
20
20
  const fastify = Fastify({ logger: true });
21
21
 
22
22
  const cogitator = new Cogitator({
23
- defaultBackend: 'openai',
24
- backends: { openai: { apiKey: process.env.OPENAI_API_KEY } },
23
+ llm: {
24
+ defaultModel: 'openai/gpt-4o-mini',
25
+ providers: { openai: { apiKey: process.env.OPENAI_API_KEY } },
26
+ },
25
27
  });
26
28
 
27
29
  const chatAgent = new Agent({
28
30
  name: 'chat',
31
+ description: 'General-purpose chat assistant',
29
32
  instructions: 'You are a helpful assistant.',
30
- model: 'gpt-4o-mini',
33
+ model: 'openai/gpt-4o-mini',
31
34
  });
32
35
 
33
36
  await fastify.register(cogitatorPlugin, {
@@ -51,6 +54,8 @@ POST /api/agents/:name/run - Run agent (JSON response)
51
54
  POST /api/agents/:name/stream - Run agent (SSE stream)
52
55
  ```
53
56
 
57
+ Bodies are validated with JSON Schema (`input` must be a non-blank string); validation failures return `400 INVALID_INPUT`. The agent list exposes `config.description`, never the instructions. The authenticated `userId` is passed to the run, and runs are aborted when the client disconnects.
58
+
54
59
  ### Threads (Memory)
55
60
 
56
61
  ```
@@ -59,6 +64,8 @@ POST /api/threads/:id/messages - Add message to thread
59
64
  DELETE /api/threads/:id - Delete thread
60
65
  ```
61
66
 
67
+ Requires `memory` on the `Cogitator` instance (503 otherwise). Message `metadata` is stored on the memory entry.
68
+
62
69
  ### Workflows
63
70
 
64
71
  ```
@@ -67,15 +74,19 @@ POST /api/workflows/:name/run - Run workflow
67
74
  POST /api/workflows/:name/stream - Stream workflow events
68
75
  ```
69
76
 
77
+ Options are limited to `maxConcurrency`/`maxIterations` (positive integers) and `checkpoint`. A failed workflow returns `500 WORKFLOW_FAILED` (the stream ends with an `error` event instead of `workflow_completed`). Disconnecting aborts the workflow.
78
+
70
79
  ### Swarms
71
80
 
72
81
  ```
73
82
  GET /api/swarms - List all swarms
74
83
  POST /api/swarms/:name/run - Run swarm
75
84
  POST /api/swarms/:name/stream - Stream swarm events
76
- GET /api/swarms/:name/blackboard - Get shared state
85
+ GET /api/swarms/:name/blackboard - Get configured blackboard sections
77
86
  ```
78
87
 
88
+ `timeout` must be positive. Disconnecting aborts the swarm. Each run creates a fresh swarm, so the blackboard endpoint returns the configured initial sections.
89
+
79
90
  ### Tools & Docs
80
91
 
81
92
  ```
@@ -96,7 +107,8 @@ await fastify.register(cogitatorPlugin, {
96
107
  enableWebSocket: true,
97
108
  enableSwagger: true,
98
109
 
99
- // Authentication
110
+ // Authentication — throw to reject with 401. Runs as an onRequest hook, so it
111
+ // also guards WebSocket upgrades; the returned userId is passed to agent runs.
100
112
  auth: async (request) => {
101
113
  const token = request.headers.authorization?.replace('Bearer ', '');
102
114
  const user = await validateToken(token);
@@ -116,7 +128,7 @@ await fastify.register(cogitatorPlugin, {
116
128
  version: '1.0.0',
117
129
  },
118
130
 
119
- // WebSocket options
131
+ // WebSocket options (path is relative to the prefix)
120
132
  websocket: {
121
133
  path: '/ws',
122
134
  },
@@ -154,19 +166,22 @@ while (true) {
154
166
 
155
167
  ### Stream Events
156
168
 
157
- | Event Type | Description |
158
- | ----------------- | --------------------------------------- |
159
- | `start` | Stream started, includes message ID |
160
- | `text-start` | Text generation started |
161
- | `text-delta` | Text chunk received |
162
- | `text-end` | Text generation finished |
163
- | `tool-call-start` | Tool execution started |
164
- | `tool-call-end` | Tool execution finished |
165
- | `tool-result` | Tool returned result |
166
- | `workflow` | Workflow event (node started/completed) |
167
- | `swarm` | Swarm event (agent started/completed) |
168
- | `error` | Error occurred |
169
- | `finish` | Stream finished, includes usage stats |
169
+ | Event Type | Description |
170
+ | ----------------- | ---------------------------------------- |
171
+ | `start` | Stream started, includes message ID |
172
+ | `text-start` | Text generation started |
173
+ | `text-delta` | Text chunk received |
174
+ | `text-end` | Text generation finished |
175
+ | `tool-call-start` | Tool call started (`id` = model call id) |
176
+ | `tool-call-delta` | Tool call arguments (JSON text) |
177
+ | `tool-call-end` | Tool call finished |
178
+ | `tool-result` | Tool result (`toolCallId` = call id) |
179
+ | `workflow` | Workflow event (node started/completed) |
180
+ | `swarm` | Swarm event (agent started/completed) |
181
+ | `error` | Error occurred |
182
+ | `finish` | Stream finished, includes usage stats |
183
+
184
+ Text is emitted in `text-start`/`text-delta`/`text-end` blocks that are closed around tool calls; the stream ends with `data: [DONE]` after `finish`. Headers set by your hooks (CORS, rate-limit) are kept on SSE responses.
170
185
 
171
186
  ## WebSocket Support
172
187
 
@@ -202,8 +217,11 @@ ws.send(
202
217
  })
203
218
  );
204
219
 
205
- // Subscribe to channel
206
- ws.send(JSON.stringify({ type: 'subscribe', channel: 'updates' }));
220
+ // Observe runs of an agent started by other clients
221
+ ws.send(JSON.stringify({ type: 'subscribe', channel: 'agent:chat' }));
222
+
223
+ // Abort the running agent (emits { type: 'event', payload: { type: 'cancelled' } })
224
+ ws.send(JSON.stringify({ type: 'stop' }));
207
225
 
208
226
  // Ping/pong
209
227
  ws.send(JSON.stringify({ type: 'ping' }));
@@ -211,17 +229,19 @@ ws.send(JSON.stringify({ type: 'ping' }));
211
229
 
212
230
  ### WebSocket Message Types
213
231
 
214
- | Type | Direction | Description |
215
- | ------------- | ------------- | ------------------------ |
216
- | `ping` | Client→Server | Heartbeat |
217
- | `pong` | Server→Client | Heartbeat response |
218
- | `subscribe` | Client→Server | Subscribe to channel |
219
- | `subscribed` | Server→Client | Subscription confirmed |
220
- | `unsubscribe` | Client→Server | Unsubscribe from channel |
221
- | `run` | Client→Server | Run agent/workflow/swarm |
222
- | `stop` | Client→Server | Cancel running operation |
223
- | `event` | Server→Client | Stream event |
224
- | `error` | Server→Client | Error message |
232
+ | Type | Direction | Description |
233
+ | ------------- | ------------- | --------------------------------------------------------------------------------------------------------------- |
234
+ | `ping` | Client→Server | Heartbeat |
235
+ | `pong` | Server→Client | Heartbeat response |
236
+ | `subscribe` | Client→Server | Subscribe to `agent:<name>`: receive events of runs started by other clients |
237
+ | `subscribed` | Server→Client | Subscription confirmed |
238
+ | `unsubscribe` | Client→Server | Unsubscribe from channel |
239
+ | `run` | Client→Server | Run an agent (`payload: { type: 'agent', name, input, context?, threadId? }`); one run per connection at a time |
240
+ | `stop` | Client→Server | Abort the running agent |
241
+ | `event` | Server→Client | Run event: `token`, `tool-call`, `tool-result`, `complete`, `cancelled` |
242
+ | `error` | Server→Client | Error message |
243
+
244
+ Only agent runs are supported over WebSocket; use the HTTP endpoints for workflows and swarms.
225
245
 
226
246
  ## Custom Streaming
227
247
 
@@ -231,8 +251,9 @@ Use `FastifyStreamWriter` for custom streaming routes:
231
251
  import { FastifyStreamWriter, generateId } from '@cogitator-ai/fastify';
232
252
 
233
253
  fastify.post('/custom/stream', async (request, reply) => {
234
- const writer = new FastifyStreamWriter(reply);
254
+ const writer = new FastifyStreamWriter(reply); // start() hijacks the reply
235
255
  const messageId = generateId('msg');
256
+ reply.raw.on('close', () => writer.close());
236
257
 
237
258
  writer.start(messageId);
238
259
  const textId = generateId('txt');
@@ -245,6 +266,7 @@ fastify.post('/custom/stream', async (request, reply) => {
245
266
  writer.textEnd(textId);
246
267
  writer.finish(messageId);
247
268
  writer.close();
269
+ return reply;
248
270
  });
249
271
  ```
250
272
 
@@ -314,7 +336,8 @@ class FastifyStreamWriter {
314
336
  swarmEvent(event: string, data: unknown): void;
315
337
  error(message: string, code?: string): void;
316
338
  finish(messageId: string, usage?: Usage): void;
317
- close(): void;
339
+ close(): void; // no-op before start(); ignores writes after the response ended
340
+ readonly isClosed: boolean;
318
341
  }
319
342
  ```
320
343
 
@@ -350,14 +373,17 @@ All endpoints return consistent error responses:
350
373
 
351
374
  Error codes map to HTTP status codes:
352
375
 
353
- - `INVALID_INPUT` → 400
376
+ - `INVALID_INPUT` → 400 (schema validation and malformed JSON; `details` carries the validation errors)
354
377
  - `UNAUTHORIZED` → 401
355
- - `PERMISSION_DENIED` → 403
356
378
  - `NOT_FOUND` → 404
379
+ - `PAYLOAD_TOO_LARGE` → 413
357
380
  - `RATE_LIMIT_EXCEEDED` → 429
358
- - `INTERNAL` → 500
359
- - `UNAVAILABLE` → 503
381
+ - `WORKFLOW_FAILED` → 500
382
+ - `INTERNAL` → 500 (details are logged, not returned)
360
383
  - `UNIMPLEMENTED` → 501
384
+ - `UNAVAILABLE` → 503
385
+
386
+ `CogitatorError`s thrown by runs keep their code and its mapped status (for example `LLM_RATE_LIMITED` → 429).
361
387
 
362
388
  ## JSON Schema Validation
363
389
 
@@ -373,6 +399,8 @@ import {
373
399
  } from '@cogitator-ai/fastify';
374
400
  ```
375
401
 
402
+ `AgentRunRequestSchema` and `SwarmRunRequestSchema` require a non-blank `input` (the swarm `timeout` must be greater than 0), `AddMessageRequestSchema` requires a non-empty `content` and a `user`/`assistant`/`system` role, and `WorkflowRunRequestSchema.options` only allows `maxConcurrency`/`maxIterations` (integers ≥ 1) and `checkpoint` (`additionalProperties: false`).
403
+
376
404
  ## License
377
405
 
378
406
  MIT
@@ -1 +1 @@
1
- {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/hooks/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG1E,wBAAgB,YAAY,CAC1B,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,GAClB,IAAI,CAwBN"}
1
+ {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/hooks/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAa1E,wBAAgB,YAAY,CAC1B,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,GAClB,IAAI,CA8CN"}
@@ -1,4 +1,13 @@
1
1
  import { CogitatorError, ERROR_STATUS_CODES, ErrorCode } from '@cogitator-ai/types';
2
+ const CLIENT_ERROR_CODES = {
3
+ 400: 'INVALID_INPUT',
4
+ 401: 'UNAUTHORIZED',
5
+ 403: 'FORBIDDEN',
6
+ 404: 'NOT_FOUND',
7
+ 413: 'PAYLOAD_TOO_LARGE',
8
+ 415: 'UNSUPPORTED_MEDIA_TYPE',
9
+ 429: 'RATE_LIMIT_EXCEEDED',
10
+ };
2
11
  export function errorHandler(error, request, reply) {
3
12
  if (reply.sent) {
4
13
  return;
@@ -13,6 +22,26 @@ export function errorHandler(error, request, reply) {
13
22
  });
14
23
  return;
15
24
  }
25
+ if (error.validation) {
26
+ reply.status(400).send({
27
+ error: {
28
+ message: error.message,
29
+ code: 'INVALID_INPUT',
30
+ details: error.validation,
31
+ },
32
+ });
33
+ return;
34
+ }
35
+ const statusCode = error.statusCode;
36
+ if (typeof statusCode === 'number' && statusCode >= 400 && statusCode < 500) {
37
+ reply.status(statusCode).send({
38
+ error: {
39
+ message: error.message,
40
+ code: CLIENT_ERROR_CODES[statusCode] ?? error.code ?? 'BAD_REQUEST',
41
+ },
42
+ });
43
+ return;
44
+ }
16
45
  request.log.error({ err: error }, 'unhandled error in cogitator plugin');
17
46
  reply.status(500).send({
18
47
  error: {
@@ -1 +1 @@
1
- {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/hooks/error-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEpF,MAAM,UAAU,YAAY,CAC1B,KAAmB,EACnB,OAAuB,EACvB,KAAmB;IAEnB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,IAAI,cAAc,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;QACzD,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;YAC5B,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB;SACF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,qCAAqC,CAAC,CAAC;IAEzE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACrB,KAAK,EAAE;YACL,OAAO,EAAE,uBAAuB;YAChC,IAAI,EAAE,SAAS,CAAC,cAAc;SAC/B;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/hooks/error-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEpF,MAAM,kBAAkB,GAA2B;IACjD,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,mBAAmB;IACxB,GAAG,EAAE,wBAAwB;IAC7B,GAAG,EAAE,qBAAqB;CAC3B,CAAC;AAEF,MAAM,UAAU,YAAY,CAC1B,KAAmB,EACnB,OAAuB,EACvB,KAAmB;IAEnB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,IAAI,cAAc,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;QACzD,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;YAC5B,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB;SACF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACrB,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,KAAK,CAAC,UAAU;aAC1B;SACF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACpC,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QAC5E,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;YAC5B,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,kBAAkB,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,aAAa;aACpE;SACF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,qCAAqC,CAAC,CAAC;IAEzE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACrB,KAAK,EAAE;YACL,OAAO,EAAE,uBAAuB;YAChC,IAAI,EAAE,SAAS,CAAC,cAAc;SAC/B;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,SAAS,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAoB,MAAM,YAAY,CAAC;AAsH3E,eAAO,MAAM,eAAe,4CAG1B,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,SAAS,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAoB,MAAM,YAAY,CAAC;AA0H3E,eAAO,MAAM,eAAe,4CAG1B,CAAC"}
package/dist/plugin.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import fp from 'fastify-plugin';
2
2
  import { createAuthHook, errorHandler } from './hooks/index.js';
3
3
  import { healthRoutes, agentRoutes, threadRoutes, toolRoutes, workflowRoutes, swarmRoutes, } from './routes/index.js';
4
+ import { isModuleNotFound } from './routes/utils.js';
4
5
  const cogitatorPluginImpl = async (fastify, opts) => {
5
6
  const context = {
6
7
  runtime: opts.cogitator,
@@ -12,28 +13,47 @@ const cogitatorPluginImpl = async (fastify, opts) => {
12
13
  fastify.decorateRequest('cogitatorAuth', undefined);
13
14
  fastify.decorateRequest('cogitatorRequestId', '');
14
15
  fastify.decorateRequest('cogitatorStartTime', 0);
15
- fastify.addHook('onRequest', createAuthHook(opts.auth));
16
- if (opts.rateLimit) {
17
- try {
18
- const rateLimitModule = await import('@fastify/rate-limit');
19
- await fastify.register(rateLimitModule.default, {
20
- max: opts.rateLimit.max,
21
- timeWindow: opts.rateLimit.timeWindow,
22
- keyGenerator: opts.rateLimit.keyGenerator,
23
- errorResponseBuilder: opts.rateLimit.errorResponseBuilder,
24
- });
16
+ const prefix = opts.prefix ?? '/cogitator';
17
+ await fastify.register(async (instance) => {
18
+ let websocketEnabled = false;
19
+ if (opts.enableWebSocket) {
20
+ try {
21
+ const websocketModule = await import('@fastify/websocket');
22
+ await instance.register(websocketModule.default);
23
+ websocketEnabled = true;
24
+ }
25
+ catch (err) {
26
+ if (isModuleNotFound(err)) {
27
+ fastify.log.warn('@fastify/websocket not installed, skipping WebSocket support');
28
+ }
29
+ else {
30
+ throw err;
31
+ }
32
+ }
25
33
  }
26
- catch (err) {
27
- if (err.code === 'ERR_MODULE_NOT_FOUND') {
28
- fastify.log.warn('@fastify/rate-limit not installed, skipping rate limiting');
34
+ instance.addHook('onRequest', createAuthHook(opts.auth));
35
+ if (opts.rateLimit) {
36
+ try {
37
+ const rateLimitModule = await import('@fastify/rate-limit');
38
+ await instance.register(rateLimitModule.default, {
39
+ max: opts.rateLimit.max,
40
+ timeWindow: opts.rateLimit.timeWindow,
41
+ keyGenerator: opts.rateLimit.keyGenerator,
42
+ errorResponseBuilder: opts.rateLimit.errorResponseBuilder,
43
+ });
29
44
  }
30
- else {
31
- throw err;
45
+ catch (err) {
46
+ if (isModuleNotFound(err)) {
47
+ instance.log.warn('@fastify/rate-limit not installed, skipping rate limiting');
48
+ }
49
+ else {
50
+ throw err;
51
+ }
32
52
  }
33
53
  }
34
- }
35
- const prefix = opts.prefix ?? '/cogitator';
36
- await fastify.register(async (instance) => {
54
+ instance.setErrorHandler((error, request, reply) => {
55
+ errorHandler(error, request, reply);
56
+ });
37
57
  if (opts.enableSwagger) {
38
58
  try {
39
59
  const swaggerModule = await import('@fastify/swagger');
@@ -63,7 +83,7 @@ const cogitatorPluginImpl = async (fastify, opts) => {
63
83
  });
64
84
  }
65
85
  catch (err) {
66
- if (err.code === 'ERR_MODULE_NOT_FOUND') {
86
+ if (isModuleNotFound(err)) {
67
87
  fastify.log.warn('@fastify/swagger not installed, skipping Swagger UI');
68
88
  }
69
89
  else {
@@ -77,26 +97,11 @@ const cogitatorPluginImpl = async (fastify, opts) => {
77
97
  await instance.register(toolRoutes);
78
98
  await instance.register(workflowRoutes);
79
99
  await instance.register(swarmRoutes);
80
- if (opts.enableWebSocket) {
81
- try {
82
- const websocketModule = await import('@fastify/websocket');
83
- await instance.register(websocketModule.default);
84
- const { websocketRoutes } = await import('./websocket/handler.js');
85
- await instance.register(websocketRoutes, { path: opts.websocket?.path });
86
- }
87
- catch (err) {
88
- if (err.code === 'ERR_MODULE_NOT_FOUND') {
89
- fastify.log.warn('@fastify/websocket not installed, skipping WebSocket support');
90
- }
91
- else {
92
- throw err;
93
- }
94
- }
100
+ if (websocketEnabled) {
101
+ const { websocketRoutes } = await import('./websocket/handler.js');
102
+ await instance.register(websocketRoutes, { path: opts.websocket?.path });
95
103
  }
96
104
  }, { prefix });
97
- fastify.setErrorHandler((error, request, reply) => {
98
- errorHandler(error, request, reply);
99
- });
100
105
  };
101
106
  export const cogitatorPlugin = fp(cogitatorPluginImpl, {
102
107
  fastify: '5.x',
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAUlD,eAAO,MAAM,WAAW,EAAE,kBAoIzB,CAAC"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAgBlD,eAAO,MAAM,WAAW,EAAE,kBA2IzB,CAAC"}
@@ -1,37 +1,37 @@
1
1
  import { AgentRunRequestSchema } from '../types.js';
2
2
  import { FastifyStreamWriter, generateId } from '../streaming/index.js';
3
+ import { onClientDisconnect, resolveError, sendError, sendRouteError } from './utils.js';
4
+ const paramsSchema = {
5
+ type: 'object',
6
+ properties: { name: { type: 'string' } },
7
+ required: ['name'],
8
+ };
3
9
  export const agentRoutes = async (fastify) => {
10
+ const findAgent = (name) => Object.hasOwn(fastify.cogitator.agents, name) ? fastify.cogitator.agents[name] : undefined;
4
11
  fastify.get('/agents', async () => {
5
12
  const agentList = Object.entries(fastify.cogitator.agents).map(([name, agent]) => ({
6
13
  name,
7
- description: agent.config.instructions?.slice(0, 100),
14
+ description: agent.config.description,
8
15
  tools: agent.config.tools?.map((t) => t.name) || [],
9
16
  }));
10
17
  const response = { agents: agentList };
11
18
  return response;
12
19
  });
13
- fastify.post('/agents/:name/run', {
14
- schema: {
15
- params: {
16
- type: 'object',
17
- properties: { name: { type: 'string' } },
18
- required: ['name'],
19
- },
20
- body: AgentRunRequestSchema,
21
- },
22
- }, async (request, reply) => {
20
+ fastify.post('/agents/:name/run', { schema: { params: paramsSchema, body: AgentRunRequestSchema } }, async (request, reply) => {
23
21
  const { name } = request.params;
24
- const agent = fastify.cogitator.agents[name];
22
+ const agent = findAgent(name);
25
23
  if (!agent) {
26
- return reply.status(404).send({
27
- error: { message: `Agent '${name}' not found`, code: 'NOT_FOUND' },
28
- });
24
+ return sendError(reply, 404, `Agent '${name}' not found`, 'NOT_FOUND');
29
25
  }
26
+ const abortController = new AbortController();
27
+ onClientDisconnect(reply, () => abortController.abort());
30
28
  try {
31
29
  const result = await fastify.cogitator.runtime.run(agent, {
32
30
  input: request.body.input,
33
31
  context: request.body.context,
34
32
  threadId: request.body.threadId,
33
+ userId: request.cogitatorAuth?.userId,
34
+ signal: abortController.signal,
35
35
  });
36
36
  const response = {
37
37
  output: result.output,
@@ -46,59 +46,66 @@ export const agentRoutes = async (fastify) => {
46
46
  return response;
47
47
  }
48
48
  catch (error) {
49
- const message = error instanceof Error ? error.message : 'Unknown error';
50
- return reply.status(500).send({
51
- error: { message, code: 'INTERNAL' },
52
- });
49
+ return sendRouteError(request, reply, error, 'agent run error');
53
50
  }
54
51
  });
55
- fastify.post('/agents/:name/stream', {
56
- schema: {
57
- params: {
58
- type: 'object',
59
- properties: { name: { type: 'string' } },
60
- required: ['name'],
61
- },
62
- body: AgentRunRequestSchema,
63
- },
64
- }, async (request, reply) => {
52
+ fastify.post('/agents/:name/stream', { schema: { params: paramsSchema, body: AgentRunRequestSchema } }, async (request, reply) => {
65
53
  const { name } = request.params;
66
- const agent = fastify.cogitator.agents[name];
54
+ const agent = findAgent(name);
67
55
  if (!agent) {
68
- return reply.status(404).send({
69
- error: { message: `Agent '${name}' not found`, code: 'NOT_FOUND' },
70
- });
56
+ return sendError(reply, 404, `Agent '${name}' not found`, 'NOT_FOUND');
71
57
  }
72
58
  const writer = new FastifyStreamWriter(reply);
73
59
  const messageId = generateId('msg');
74
- const textId = generateId('txt');
75
- let textStarted = false;
76
- request.raw.on('close', () => {
60
+ const abortController = new AbortController();
61
+ onClientDisconnect(reply, () => {
62
+ abortController.abort();
77
63
  writer.close();
78
64
  });
65
+ let textId = null;
66
+ let streamedText = false;
67
+ const writeText = (delta) => {
68
+ if (!delta)
69
+ return;
70
+ if (textId === null) {
71
+ textId = generateId('txt');
72
+ writer.textStart(textId);
73
+ }
74
+ writer.textDelta(textId, delta);
75
+ };
76
+ const endText = () => {
77
+ if (textId === null)
78
+ return;
79
+ writer.textEnd(textId);
80
+ textId = null;
81
+ };
79
82
  try {
80
83
  writer.start(messageId);
81
- writer.textStart(textId);
82
- textStarted = true;
83
84
  const result = await fastify.cogitator.runtime.run(agent, {
84
85
  input: request.body.input,
85
86
  context: request.body.context,
86
87
  threadId: request.body.threadId,
88
+ userId: request.cogitatorAuth?.userId,
89
+ signal: abortController.signal,
87
90
  stream: true,
88
91
  onToken: (token) => {
89
- writer.textDelta(textId, token);
92
+ if (token)
93
+ streamedText = true;
94
+ writeText(token);
90
95
  },
91
96
  onToolCall: (toolCall) => {
92
- const toolId = generateId('tool');
93
- writer.toolCallStart(toolId, toolCall.name);
94
- writer.toolCallEnd(toolId);
97
+ endText();
98
+ writer.toolCallStart(toolCall.id, toolCall.name);
99
+ writer.toolCallDelta(toolCall.id, JSON.stringify(toolCall.arguments));
100
+ writer.toolCallEnd(toolCall.id);
95
101
  },
96
102
  onToolResult: (toolResult) => {
97
- const resultId = generateId('res');
98
- writer.toolResult(resultId, toolResult.callId, toolResult.result);
103
+ writer.toolResult(generateId('res'), toolResult.callId, toolResult.result);
99
104
  },
100
105
  });
101
- writer.textEnd(textId);
106
+ if (!streamedText)
107
+ writeText(result.output);
108
+ endText();
102
109
  writer.finish(messageId, {
103
110
  inputTokens: result.usage.inputTokens,
104
111
  outputTokens: result.usage.outputTokens,
@@ -106,14 +113,16 @@ export const agentRoutes = async (fastify) => {
106
113
  });
107
114
  }
108
115
  catch (error) {
109
- if (textStarted)
110
- writer.textEnd(textId);
111
- const message = error instanceof Error ? error.message : 'Unknown error';
112
- writer.error(message, 'INTERNAL');
116
+ if (!abortController.signal.aborted) {
117
+ const resolved = resolveError(request, error, 'agent stream error');
118
+ endText();
119
+ writer.error(resolved.message, resolved.code);
120
+ }
113
121
  }
114
122
  finally {
115
123
  writer.close();
116
124
  }
125
+ return reply;
117
126
  });
118
127
  };
119
128
  //# sourceMappingURL=agents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAKlD,eAAO,MAAM,YAAY,EAAE,kBAa1B,CAAC"}
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAGlD,eAAO,MAAM,YAAY,EAAE,kBAe1B,CAAC"}
@@ -1,5 +1,5 @@
1
- const startTime = Date.now();
2
1
  export const healthRoutes = async (fastify) => {
2
+ const startTime = Date.now();
3
3
  fastify.get('/health', async () => {
4
4
  const response = {
5
5
  status: 'ok',
@@ -1 +1 @@
1
- {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAGA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,YAAY,GAAuB,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,QAAQ,GAAmB;YAC/B,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAC9B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC/B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,YAAY,GAAuB,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,QAAQ,GAAmB;YAC/B,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAC9B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC/B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}