@cogitator-ai/next 0.2.12 → 0.4.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 (41) hide show
  1. package/README.md +42 -13
  2. package/dist/client/http-error.d.ts +6 -0
  3. package/dist/client/http-error.d.ts.map +1 -0
  4. package/dist/client/http-error.js +26 -0
  5. package/dist/client/http-error.js.map +1 -0
  6. package/dist/client/index.d.ts +1 -0
  7. package/dist/client/index.d.ts.map +1 -1
  8. package/dist/client/index.js +1 -0
  9. package/dist/client/index.js.map +1 -1
  10. package/dist/client/retry.d.ts +2 -1
  11. package/dist/client/retry.d.ts.map +1 -1
  12. package/dist/client/retry.js +37 -11
  13. package/dist/client/retry.js.map +1 -1
  14. package/dist/client/sse-parser.d.ts.map +1 -1
  15. package/dist/client/sse-parser.js +29 -28
  16. package/dist/client/sse-parser.js.map +1 -1
  17. package/dist/client/use-agent.d.ts.map +1 -1
  18. package/dist/client/use-agent.js +29 -6
  19. package/dist/client/use-agent.js.map +1 -1
  20. package/dist/client/use-chat.d.ts.map +1 -1
  21. package/dist/client/use-chat.js +130 -96
  22. package/dist/client/use-chat.js.map +1 -1
  23. package/dist/handlers/agent.d.ts.map +1 -1
  24. package/dist/handlers/agent.js +33 -35
  25. package/dist/handlers/agent.js.map +1 -1
  26. package/dist/handlers/chat.d.ts.map +1 -1
  27. package/dist/handlers/chat.js +124 -70
  28. package/dist/handlers/chat.js.map +1 -1
  29. package/dist/handlers/http.d.ts +15 -0
  30. package/dist/handlers/http.d.ts.map +1 -0
  31. package/dist/handlers/http.js +66 -0
  32. package/dist/handlers/http.js.map +1 -0
  33. package/dist/streaming/protocol.d.ts +2 -1
  34. package/dist/streaming/protocol.d.ts.map +1 -1
  35. package/dist/streaming/protocol.js +2 -2
  36. package/dist/streaming/protocol.js.map +1 -1
  37. package/dist/streaming/stream-writer.d.ts +2 -1
  38. package/dist/streaming/stream-writer.d.ts.map +1 -1
  39. package/dist/streaming/stream-writer.js +12 -3
  40. package/dist/streaming/stream-writer.js.map +1 -1
  41. package/package.json +15 -11
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @cogitator-ai/next
2
2
 
3
- Next.js App Router integration for Cogitator AI runtime. Provides streaming chat handlers and React hooks compatible with the Vercel AI SDK protocol.
3
+ Next.js App Router integration for Cogitator AI runtime. Provides streaming chat handlers, a batch agent handler, and React hooks that speak a typed SSE protocol modeled on the Vercel AI SDK event stream.
4
4
 
5
5
  ## Installation
6
6
 
@@ -8,6 +8,8 @@ Next.js App Router integration for Cogitator AI runtime. Provides streaming chat
8
8
  pnpm add @cogitator-ai/next @cogitator-ai/core
9
9
  ```
10
10
 
11
+ Works with Next.js 14, 15 and 16 and React 18 and 19.
12
+
11
13
  ## Quick Start
12
14
 
13
15
  ### 1. Create API Route
@@ -19,11 +21,15 @@ import { createChatHandler } from '@cogitator-ai/next';
19
21
  import { z } from 'zod';
20
22
 
21
23
  const cogitator = new Cogitator({
22
- backend: { type: 'openai', apiKey: process.env.OPENAI_API_KEY! },
24
+ llm: {
25
+ defaultModel: 'openai/gpt-6-luna',
26
+ providers: { openai: { apiKey: process.env.OPENAI_API_KEY! } },
27
+ },
23
28
  });
24
29
 
25
30
  const agent = new Agent({
26
31
  name: 'assistant',
32
+ model: 'openai/gpt-6-luna',
27
33
  instructions: 'You are a helpful assistant.',
28
34
  tools: [
29
35
  tool({
@@ -83,7 +89,13 @@ export function Chat() {
83
89
 
84
90
  ### `createChatHandler`
85
91
 
86
- Creates a streaming chat handler compatible with AI SDK protocol.
92
+ Creates a streaming chat handler. The handler:
93
+
94
+ - runs the agent with token streaming enabled and forwards `text-*`, `tool-*` and `finish` events as they happen
95
+ - uses the **last user message** as the run input; conversation history is carried by `threadId` (configure `memory` on the `Cogitator` instance) — the server returns the thread id in the `finish` event and `useCogitatorChat` adopts it automatically
96
+ - passes request `metadata` to the run as `context`
97
+ - aborts the run when the client disconnects (`req.signal`)
98
+ - validates the body (JSON object, `messages` array, string `threadId`, object `metadata`), limits it to 1 MB (413 otherwise) and returns `400` when there is no user message
87
99
 
88
100
  ```typescript
89
101
  import { createChatHandler } from '@cogitator-ai/next';
@@ -99,13 +111,17 @@ export const POST = createChatHandler(cogitator, agent, {
99
111
  };
100
112
  },
101
113
 
102
- // Pre-processing hook
114
+ // Pre-processing hook — the returned object is merged into the run options
115
+ // (e.g. userId, threadId, timeout). Streaming callbacks and the abort
116
+ // signal are always managed by the handler. Throw an error with a `status`
117
+ // property to reject the request with that status (default 401).
103
118
  beforeRun: async (req, input) => {
104
119
  console.log('Starting chat with', input.messages.length, 'messages');
105
- return { userId: 'user-123' }; // Merged into context
120
+ return { userId: 'user-123' };
106
121
  },
107
122
 
108
- // Post-processing hook
123
+ // Post-processing hook — runs before the `finish` event; if it throws,
124
+ // the client receives an `error` event instead of `finish`
109
125
  afterRun: async (result) => {
110
126
  console.log('Chat completed:', result.output);
111
127
  },
@@ -114,7 +130,7 @@ export const POST = createChatHandler(cogitator, agent, {
114
130
 
115
131
  ### `createAgentHandler`
116
132
 
117
- Creates a batch (non-streaming) handler for long-running tasks.
133
+ Creates a batch (non-streaming) handler for long-running tasks. The default parser requires a non-blank string `input`, an optional object `context` and an optional string `threadId` (400 otherwise). The run is aborted if the client disconnects.
118
134
 
119
135
  ```typescript
120
136
  import { createAgentHandler } from '@cogitator-ai/next';
@@ -142,7 +158,8 @@ Response format:
142
158
  "outputTokens": 500,
143
159
  "totalTokens": 650
144
160
  },
145
- "toolCalls": [...]
161
+ "toolCalls": [...],
162
+ "trace": { "traceId": "trace-xyz", "spans": [...] }
146
163
  }
147
164
  ```
148
165
 
@@ -199,7 +216,7 @@ const {
199
216
  // Basic send
200
217
  await send('Hello!');
201
218
 
202
- // Send with metadata (passed to server)
219
+ // Send with metadata (passed to the run as `context` on the server)
203
220
  await send('Analyze this', {
204
221
  userId: 'user-123',
205
222
  priority: 'high',
@@ -266,7 +283,7 @@ console.log(result?.toolCalls);
266
283
 
267
284
  ## Streaming Protocol
268
285
 
269
- The package implements Vercel AI SDK v5 streaming protocol:
286
+ The chat handler streams Server-Sent Events. The event names follow the Vercel AI SDK event-stream style, but the payloads are Cogitator's own (`tool-call-*`, `message` on errors, `usage`/`threadId` on finish), so use `useCogitatorChat` (or your own parser) on the client rather than the AI SDK's `useChat`:
270
287
 
271
288
  ```
272
289
  data: {"type":"start","messageId":"msg-1"}
@@ -287,11 +304,20 @@ data: {"type":"tool-call-end","id":"tool-1"}
287
304
 
288
305
  data: {"type":"tool-result","id":"tr-1","toolCallId":"tool-1","result":"72°F"}
289
306
 
290
- data: {"type":"finish","messageId":"msg-1","usage":{...}}
307
+ data: {"type":"finish","messageId":"msg-1","usage":{...},"threadId":"thread-abc"}
291
308
 
292
309
  data: [DONE]
293
310
  ```
294
311
 
312
+ If the run fails, the open text block is closed and an `{"type":"error","message":"..."}` event is sent instead of `finish`.
313
+
314
+ The server-side building blocks are exported for custom handlers:
315
+
316
+ ```typescript
317
+ import { StreamWriter, encodeSSE, generateId } from '@cogitator-ai/next';
318
+ import type { StreamEvent, Usage } from '@cogitator-ai/next';
319
+ ```
320
+
295
321
  ## Types
296
322
 
297
323
  ```typescript
@@ -319,6 +345,7 @@ interface AgentResponse {
319
345
  totalTokens: number;
320
346
  };
321
347
  toolCalls: ToolCall[];
348
+ trace?: { traceId: string; spans: unknown[] };
322
349
  }
323
350
 
324
351
  interface RetryConfig {
@@ -345,7 +372,9 @@ if (error) {
345
372
  }
346
373
  ```
347
374
 
348
- With retry enabled, transient errors (network, 502/503/504) are automatically retried:
375
+ HTTP failures are thrown as `HttpError` (exported from `@cogitator-ai/next/client`) with a `status` property and a message like `Request failed: 400 - No user message provided`. Stream-level `error` events call `onError` and skip `onFinish`.
376
+
377
+ With retry enabled, transient errors (network failures, 408/429/502/503/504) are automatically retried; the backoff wait is cancelled by `stop()`:
349
378
 
350
379
  ```typescript
351
380
  useCogitatorChat({
@@ -360,7 +389,7 @@ useCogitatorChat({
360
389
 
361
390
  ## Cancellation
362
391
 
363
- Stop ongoing requests with the `stop()` function:
392
+ Stop ongoing requests with the `stop()` function. The partial assistant message is kept in `messages`, and the server aborts the agent run when the connection closes. Calling `send()` while a response is streaming interrupts it the same way. Pending requests are aborted when the component unmounts; `useCogitatorAgent` aborts a previous `run()` when a new one starts and on `reset()`.
364
393
 
365
394
  ```typescript
366
395
  const { send, stop, isLoading } = useCogitatorChat({ api: '/api/chat' });
@@ -0,0 +1,6 @@
1
+ export declare class HttpError extends Error {
2
+ readonly status: number;
3
+ constructor(status: number, message: string);
4
+ }
5
+ export declare function toHttpError(response: Response): Promise<HttpError>;
6
+ //# sourceMappingURL=http-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-error.d.ts","sourceRoot":"","sources":["../../src/client/http-error.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK5C;AAaD,wBAAsB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAIxE"}
@@ -0,0 +1,26 @@
1
+ export class HttpError extends Error {
2
+ status;
3
+ constructor(status, message) {
4
+ super(message);
5
+ this.name = 'HttpError';
6
+ this.status = status;
7
+ }
8
+ }
9
+ function extractErrorDetail(text) {
10
+ try {
11
+ const parsed = JSON.parse(text);
12
+ if (typeof parsed === 'object' && parsed !== null && 'error' in parsed) {
13
+ const { error } = parsed;
14
+ if (typeof error === 'string' && error)
15
+ return error;
16
+ }
17
+ }
18
+ catch { }
19
+ return text;
20
+ }
21
+ export async function toHttpError(response) {
22
+ const text = await response.text().catch(() => '');
23
+ const detail = extractErrorDetail(text.trim()) || response.statusText || 'Unknown error';
24
+ return new HttpError(response.status, `Request failed: ${response.status} - ${detail}`);
25
+ }
26
+ //# sourceMappingURL=http-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-error.js","sourceRoot":"","sources":["../../src/client/http-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,MAAM,CAAS;IAExB,YAAY,MAAc,EAAE,OAAe;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACvE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QACvD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAkB;IAClD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,UAAU,IAAI,eAAe,CAAC;IACzF,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,QAAQ,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC,CAAC;AAC1F,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { useCogitatorChat } from './use-chat.js';
2
2
  export { useCogitatorAgent } from './use-agent.js';
3
+ export { HttpError } from './http-error.js';
3
4
  export type { ChatMessage, ToolCall, UseChatOptions, UseChatReturn, AgentInput, AgentResponse, UseAgentOptions, UseAgentReturn, RetryConfig, ToolResultEvent, } from '../types.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,YAAY,EACV,WAAW,EACX,QAAQ,EACR,cAAc,EACd,aAAa,EACb,UAAU,EACV,aAAa,EACb,eAAe,EACf,cAAc,EACd,WAAW,EACX,eAAe,GAChB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,YAAY,EACV,WAAW,EACX,QAAQ,EACR,cAAc,EACd,aAAa,EACb,UAAU,EACV,aAAa,EACb,eAAe,EACf,cAAc,EACd,WAAW,EACX,eAAe,GAChB,MAAM,aAAa,CAAC"}
@@ -1,4 +1,5 @@
1
1
  'use client';
2
2
  export { useCogitatorChat } from './use-chat.js';
3
3
  export { useCogitatorAgent } from './use-agent.js';
4
+ export { HttpError } from './http-error.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,3 +1,4 @@
1
1
  import type { RetryConfig } from '../types.js';
2
- export declare function withRetry<T>(fn: () => Promise<T>, config?: RetryConfig): Promise<T>;
2
+ export declare function isRetryableError(error: unknown): boolean;
3
+ export declare function withRetry<T>(fn: () => Promise<T>, config?: RetryConfig, signal?: AbortSignal): Promise<T>;
3
4
  //# sourceMappingURL=retry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/client/retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA+B/C,wBAAsB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAoBzF"}
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/client/retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA6C/C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAexD;AAED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,CAAC,CAAC,CAcZ"}
@@ -1,21 +1,50 @@
1
+ import { HttpError } from './http-error.js';
1
2
  const DEFAULT_RETRY_CONFIG = {
2
3
  maxRetries: 0,
3
4
  delay: 1000,
4
5
  backoff: 'exponential',
5
6
  };
7
+ const RETRYABLE_STATUSES = new Set([408, 429, 502, 503, 504]);
6
8
  function getDelay(attempt, config) {
7
9
  if (config.backoff === 'linear') {
8
10
  return config.delay * attempt;
9
11
  }
10
12
  return config.delay * Math.pow(2, attempt - 1);
11
13
  }
12
- function sleep(ms) {
13
- return new Promise((resolve) => setTimeout(resolve, ms));
14
+ function abortReason(signal) {
15
+ return signal.reason instanceof Error
16
+ ? signal.reason
17
+ : new DOMException('The operation was aborted.', 'AbortError');
14
18
  }
15
- function isRetryableError(error) {
19
+ function sleep(ms, signal) {
20
+ if (!signal) {
21
+ return new Promise((resolve) => setTimeout(resolve, ms));
22
+ }
23
+ return new Promise((resolve, reject) => {
24
+ if (signal.aborted) {
25
+ reject(abortReason(signal));
26
+ return;
27
+ }
28
+ const onAbort = () => {
29
+ clearTimeout(timer);
30
+ reject(abortReason(signal));
31
+ };
32
+ const timer = setTimeout(() => {
33
+ signal.removeEventListener('abort', onAbort);
34
+ resolve();
35
+ }, ms);
36
+ signal.addEventListener('abort', onAbort, { once: true });
37
+ });
38
+ }
39
+ export function isRetryableError(error) {
40
+ if (error instanceof HttpError) {
41
+ return RETRYABLE_STATUSES.has(error.status);
42
+ }
16
43
  if (error instanceof Error) {
17
44
  if (error.name === 'AbortError')
18
45
  return false;
46
+ if (error instanceof TypeError)
47
+ return true;
19
48
  const message = error.message.toLowerCase();
20
49
  if (message.includes('network') || message.includes('fetch'))
21
50
  return true;
@@ -26,22 +55,19 @@ function isRetryableError(error) {
26
55
  }
27
56
  return false;
28
57
  }
29
- export async function withRetry(fn, config) {
58
+ export async function withRetry(fn, config, signal) {
30
59
  const cfg = { ...DEFAULT_RETRY_CONFIG, ...config };
31
- let lastError;
32
- for (let attempt = 0; attempt <= cfg.maxRetries; attempt++) {
60
+ const maxRetries = Number.isFinite(cfg.maxRetries) ? Math.max(0, Math.floor(cfg.maxRetries)) : 0;
61
+ for (let attempt = 0;; attempt++) {
33
62
  try {
34
63
  return await fn();
35
64
  }
36
65
  catch (error) {
37
- lastError = error;
38
- if (attempt === cfg.maxRetries || !isRetryableError(error)) {
66
+ if (attempt >= maxRetries || signal?.aborted || !isRetryableError(error)) {
39
67
  throw error;
40
68
  }
41
- const delay = getDelay(attempt + 1, cfg);
42
- await sleep(delay);
69
+ await sleep(getDelay(attempt + 1, cfg), signal);
43
70
  }
44
71
  }
45
- throw lastError;
46
72
  }
47
73
  //# sourceMappingURL=retry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/client/retry.ts"],"names":[],"mappings":"AAEA,MAAM,oBAAoB,GAA0B;IAClD,UAAU,EAAE,CAAC;IACb,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,aAAa;CACvB,CAAC;AAEF,SAAS,QAAQ,CAAC,OAAe,EAAE,MAA6B;IAC9D,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,KAAK,CAAC;QAE9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1E,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IACjG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,EAAoB,EAAE,MAAoB;IAC3E,MAAM,GAAG,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,MAAM,EAAE,CAAC;IAEnD,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QAC3D,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;YAElB,IAAI,OAAO,KAAK,GAAG,CAAC,UAAU,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3D,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;YACzC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/client/retry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sse-parser.d.ts","sourceRoot":"","sources":["../../src/client/sse-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,wBAAuB,cAAc,CACnC,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC,GAC9C,cAAc,CAAC,WAAW,CAAC,CA0C7B"}
1
+ {"version":3,"file":"sse-parser.d.ts","sourceRoot":"","sources":["../../src/client/sse-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAqB5D,wBAAuB,cAAc,CACnC,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC,GAC9C,cAAc,CAAC,WAAW,CAAC,CAyB7B"}
@@ -1,7 +1,23 @@
1
+ function parseLine(line) {
2
+ const trimmed = line.trim();
3
+ if (!trimmed || trimmed.startsWith(':') || !trimmed.startsWith('data:')) {
4
+ return { done: false };
5
+ }
6
+ const data = trimmed.slice(5).trimStart();
7
+ if (data === '[DONE]')
8
+ return { done: true };
9
+ try {
10
+ return { done: false, event: JSON.parse(data) };
11
+ }
12
+ catch {
13
+ console.warn('[cogitator] Failed to parse SSE data:', data);
14
+ return { done: false };
15
+ }
16
+ }
1
17
  export async function* parseSSEStream(reader) {
2
18
  const decoder = new TextDecoder();
3
19
  let buffer = '';
4
- while (true) {
20
+ for (;;) {
5
21
  const { done, value } = await reader.read();
6
22
  if (done)
7
23
  break;
@@ -9,35 +25,20 @@ export async function* parseSSEStream(reader) {
9
25
  const lines = buffer.split('\n');
10
26
  buffer = lines.pop() ?? '';
11
27
  for (const line of lines) {
12
- const trimmed = line.trim();
13
- if (!trimmed || trimmed.startsWith(':'))
14
- continue;
15
- if (trimmed.startsWith('data: ')) {
16
- const data = trimmed.slice(6);
17
- if (data === '[DONE]')
18
- return;
19
- try {
20
- yield JSON.parse(data);
21
- }
22
- catch {
23
- console.warn('[cogitator] Failed to parse SSE data:', data);
24
- }
25
- }
28
+ const result = parseLine(line);
29
+ if (result.done)
30
+ return;
31
+ if (result.event)
32
+ yield result.event;
26
33
  }
27
34
  }
28
- if (buffer.trim()) {
29
- const trimmed = buffer.trim();
30
- if (trimmed.startsWith('data: ')) {
31
- const data = trimmed.slice(6);
32
- if (data !== '[DONE]') {
33
- try {
34
- yield JSON.parse(data);
35
- }
36
- catch {
37
- console.warn('[cogitator] Failed to parse SSE data:', data);
38
- }
39
- }
40
- }
35
+ buffer += decoder.decode();
36
+ for (const line of buffer.split('\n')) {
37
+ const result = parseLine(line);
38
+ if (result.done)
39
+ return;
40
+ if (result.event)
41
+ yield result.event;
41
42
  }
42
43
  }
43
44
  //# sourceMappingURL=sse-parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sse-parser.js","sourceRoot":"","sources":["../../src/client/sse-parser.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,cAAc,CACnC,MAA+C;IAE/C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAEhB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAElD,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAI,IAAI,KAAK,QAAQ;oBAAE,OAAO;gBAE9B,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE,IAAI,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE,IAAI,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"sse-parser.js","sourceRoot":"","sources":["../../src/client/sse-parser.ts"],"names":[],"mappings":"AAIA,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IAC1C,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAE7C,IAAI,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,EAAE,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE,IAAI,CAAC,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,cAAc,CACnC,MAA+C;IAE/C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,SAAS,CAAC;QACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAEhB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,MAAM,CAAC,IAAI;gBAAE,OAAO;YACxB,IAAI,MAAM,CAAC,KAAK;gBAAE,MAAM,MAAM,CAAC,KAAK,CAAC;QACvC,CAAC;IACH,CAAC;IAED,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO;QACxB,IAAI,MAAM,CAAC,KAAK;YAAE,MAAM,MAAM,CAAC,KAAK,CAAC;IACvC,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-agent.d.ts","sourceRoot":"","sources":["../../src/client/use-agent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA6B,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG9F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAyD1E"}
1
+ {"version":3,"file":"use-agent.d.ts","sourceRoot":"","sources":["../../src/client/use-agent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA6B,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAI9F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CA+E1E"}
@@ -1,12 +1,23 @@
1
1
  'use client';
2
- import { useState, useCallback } from 'react';
2
+ import { useState, useCallback, useEffect, useRef } from 'react';
3
3
  import { withRetry } from './retry.js';
4
+ import { toHttpError } from './http-error.js';
4
5
  export function useCogitatorAgent(options) {
5
6
  const { api, headers, onError, onSuccess, retry } = options;
6
7
  const [result, setResult] = useState(null);
7
8
  const [isLoading, setIsLoading] = useState(false);
8
9
  const [error, setError] = useState(null);
10
+ const activeRequestRef = useRef(null);
11
+ useEffect(() => {
12
+ return () => {
13
+ activeRequestRef.current?.abort();
14
+ activeRequestRef.current = null;
15
+ };
16
+ }, []);
9
17
  const run = useCallback(async (input) => {
18
+ activeRequestRef.current?.abort();
19
+ const controller = new AbortController();
20
+ activeRequestRef.current = controller;
10
21
  setIsLoading(true);
11
22
  setError(null);
12
23
  const executeRequest = async () => {
@@ -17,30 +28,42 @@ export function useCogitatorAgent(options) {
17
28
  ...headers,
18
29
  },
19
30
  body: JSON.stringify(input),
31
+ signal: controller.signal,
20
32
  });
21
33
  if (!response.ok) {
22
- const errorText = await response.text().catch(() => 'Unknown error');
23
- throw new Error(`Request failed: ${response.status} - ${errorText}`);
34
+ throw await toHttpError(response);
24
35
  }
25
- return response.json();
36
+ return (await response.json());
26
37
  };
27
38
  try {
28
- const data = await withRetry(executeRequest, retry);
39
+ const data = await withRetry(executeRequest, retry, controller.signal);
40
+ if (activeRequestRef.current !== controller)
41
+ return;
29
42
  setResult(data);
30
43
  onSuccess?.(data);
31
44
  }
32
45
  catch (err) {
46
+ if (activeRequestRef.current !== controller)
47
+ return;
48
+ if (err instanceof Error && err.name === 'AbortError')
49
+ return;
33
50
  const e = err instanceof Error ? err : new Error(String(err));
34
51
  setError(e);
35
52
  onError?.(e);
36
53
  }
37
54
  finally {
38
- setIsLoading(false);
55
+ if (activeRequestRef.current === controller) {
56
+ activeRequestRef.current = null;
57
+ setIsLoading(false);
58
+ }
39
59
  }
40
60
  }, [api, headers, onError, onSuccess, retry]);
41
61
  const reset = useCallback(() => {
62
+ activeRequestRef.current?.abort();
63
+ activeRequestRef.current = null;
42
64
  setResult(null);
43
65
  setError(null);
66
+ setIsLoading(false);
44
67
  }, []);
45
68
  return {
46
69
  run,
@@ -1 +1 @@
1
- {"version":3,"file":"use-agent.js","sourceRoot":"","sources":["../../src/client/use-agent.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,UAAU,iBAAiB,CAAC,OAAwB;IACxD,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE5D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAuB,IAAI,CAAC,CAAC;IACjE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,GAAG,GAAG,WAAW,CACrB,KAAK,EAAE,KAAiB,EAAiB,EAAE;QACzC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,MAAM,cAAc,GAAG,KAAK,IAA4B,EAAE;YACxD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,GAAG,OAAO;iBACX;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;aAC5B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;gBACrE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;YACvE,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,EAA4B,CAAC;QACnD,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YACpD,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EACD,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAC1C,CAAC;IAEF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,GAAG;QACH,MAAM;QACN,SAAS;QACT,KAAK;QACL,KAAK;KACN,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"use-agent.js","sourceRoot":"","sources":["../../src/client/use-agent.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-chat.d.ts","sourceRoot":"","sources":["../../src/client/use-chat.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAId,MAAM,aAAa,CAAC;AAWrB,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CA4QvE"}
1
+ {"version":3,"file":"use-chat.d.ts","sourceRoot":"","sources":["../../src/client/use-chat.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAId,MAAM,aAAa,CAAC;AAyCrB,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CAiSvE"}