@kubuild/ai 0.8.0 → 0.8.2

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 (133) hide show
  1. package/dist/{chunk-3DRAVYU3.js → chunk-BNGDJQ73.js} +2 -2
  2. package/dist/chunk-BNGDJQ73.js.map +1 -0
  3. package/dist/{chunk-CCV6S4YN.js → chunk-I7HYQEMW.js} +1 -1
  4. package/dist/chunk-I7HYQEMW.js.map +1 -0
  5. package/dist/{chunk-ILLNRABB.js → chunk-LBSLMWKD.js} +1 -1
  6. package/dist/chunk-LBSLMWKD.js.map +1 -0
  7. package/dist/{chunk-ORA6BS4P.js → chunk-WDLMKCLQ.js} +1 -1
  8. package/dist/chunk-WDLMKCLQ.js.map +1 -0
  9. package/dist/client/ai-client.d.cts +85 -0
  10. package/dist/client/ai-client.d.cts.map +1 -0
  11. package/dist/client/ai-client.d.ts +1 -1
  12. package/dist/client/ai-client.d.ts.map +1 -1
  13. package/dist/client/index.cjs.map +1 -1
  14. package/dist/client/index.d.cts +2 -0
  15. package/dist/client/index.d.cts.map +1 -0
  16. package/dist/client/index.d.ts +1 -1
  17. package/dist/client/index.d.ts.map +1 -1
  18. package/dist/client/index.js +1 -1
  19. package/dist/core/document-outline.d.cts +60 -0
  20. package/dist/core/document-outline.d.cts.map +1 -0
  21. package/dist/core/index.d.cts +5 -0
  22. package/dist/core/index.d.cts.map +1 -0
  23. package/dist/core/index.d.ts +4 -4
  24. package/dist/core/index.d.ts.map +1 -1
  25. package/dist/core/messages.d.cts +18 -0
  26. package/dist/core/messages.d.cts.map +1 -0
  27. package/dist/core/messages.d.ts +1 -1
  28. package/dist/core/messages.d.ts.map +1 -1
  29. package/dist/core/normalizer.d.cts +9 -0
  30. package/dist/core/normalizer.d.cts.map +1 -0
  31. package/dist/core/prompt-compiler.d.cts +50 -0
  32. package/dist/core/prompt-compiler.d.cts.map +1 -0
  33. package/dist/core/prompt-compiler.d.ts +1 -1
  34. package/dist/core/prompt-compiler.d.ts.map +1 -1
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +3 -0
  37. package/dist/index.d.cts.map +1 -0
  38. package/dist/index.d.ts +2 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +2 -2
  41. package/dist/react/index.cjs.map +1 -1
  42. package/dist/react/index.d.cts +4 -0
  43. package/dist/react/index.d.cts.map +1 -0
  44. package/dist/react/index.d.ts +3 -3
  45. package/dist/react/index.d.ts.map +1 -1
  46. package/dist/react/index.js +1 -1
  47. package/dist/react/index.js.map +1 -1
  48. package/dist/react/use-ai-agent.d.cts +52 -0
  49. package/dist/react/use-ai-agent.d.cts.map +1 -0
  50. package/dist/react/use-ai-agent.d.ts +2 -2
  51. package/dist/react/use-ai-agent.d.ts.map +1 -1
  52. package/dist/react/use-ai-chat.d.cts +69 -0
  53. package/dist/react/use-ai-chat.d.cts.map +1 -0
  54. package/dist/react/use-ai-chat.d.ts +2 -2
  55. package/dist/react/use-ai-chat.d.ts.map +1 -1
  56. package/dist/react/use-ai-generator.d.cts +20 -0
  57. package/dist/react/use-ai-generator.d.cts.map +1 -0
  58. package/dist/react/use-ai-generator.d.ts +2 -2
  59. package/dist/react/use-ai-generator.d.ts.map +1 -1
  60. package/dist/server/adapters/anthropic.d.cts +30 -0
  61. package/dist/server/adapters/anthropic.d.cts.map +1 -0
  62. package/dist/server/adapters/anthropic.d.ts +1 -1
  63. package/dist/server/adapters/anthropic.d.ts.map +1 -1
  64. package/dist/server/adapters/base.d.cts +2 -0
  65. package/dist/server/adapters/base.d.cts.map +1 -0
  66. package/dist/server/adapters/base.d.ts +1 -1
  67. package/dist/server/adapters/base.d.ts.map +1 -1
  68. package/dist/server/adapters/custom.d.cts +18 -0
  69. package/dist/server/adapters/custom.d.cts.map +1 -0
  70. package/dist/server/adapters/custom.d.ts +1 -1
  71. package/dist/server/adapters/custom.d.ts.map +1 -1
  72. package/dist/server/adapters/gemini.d.cts +22 -0
  73. package/dist/server/adapters/gemini.d.cts.map +1 -0
  74. package/dist/server/adapters/gemini.d.ts +1 -1
  75. package/dist/server/adapters/gemini.d.ts.map +1 -1
  76. package/dist/server/adapters/index.cjs.map +1 -1
  77. package/dist/server/adapters/index.d.cts +6 -0
  78. package/dist/server/adapters/index.d.cts.map +1 -0
  79. package/dist/server/adapters/index.d.ts +5 -5
  80. package/dist/server/adapters/index.d.ts.map +1 -1
  81. package/dist/server/adapters/index.js +2 -2
  82. package/dist/server/adapters/openai.d.cts +51 -0
  83. package/dist/server/adapters/openai.d.cts.map +1 -0
  84. package/dist/server/adapters/openai.d.ts +1 -1
  85. package/dist/server/adapters/openai.d.ts.map +1 -1
  86. package/dist/server/adapters/stream-utils.d.cts +12 -0
  87. package/dist/server/adapters/stream-utils.d.cts.map +1 -0
  88. package/dist/server/agent.d.cts +59 -0
  89. package/dist/server/agent.d.cts.map +1 -0
  90. package/dist/server/agent.d.ts +3 -3
  91. package/dist/server/agent.d.ts.map +1 -1
  92. package/dist/server/engine.d.cts +69 -0
  93. package/dist/server/engine.d.cts.map +1 -0
  94. package/dist/server/engine.d.ts +1 -1
  95. package/dist/server/engine.d.ts.map +1 -1
  96. package/dist/server/handler.d.cts +111 -0
  97. package/dist/server/handler.d.cts.map +1 -0
  98. package/dist/server/handler.d.ts +3 -3
  99. package/dist/server/handler.d.ts.map +1 -1
  100. package/dist/server/index.cjs.map +1 -1
  101. package/dist/server/index.d.cts +6 -0
  102. package/dist/server/index.d.cts.map +1 -0
  103. package/dist/server/index.d.ts +5 -5
  104. package/dist/server/index.d.ts.map +1 -1
  105. package/dist/server/index.js +3 -3
  106. package/dist/server/index.js.map +1 -1
  107. package/dist/server/tools/helpers.d.cts +66 -0
  108. package/dist/server/tools/helpers.d.cts.map +1 -0
  109. package/dist/server/tools/helpers.d.ts +2 -2
  110. package/dist/server/tools/helpers.d.ts.map +1 -1
  111. package/dist/server/tools/index.d.cts +25 -0
  112. package/dist/server/tools/index.d.cts.map +1 -0
  113. package/dist/server/tools/index.d.ts +6 -6
  114. package/dist/server/tools/index.d.ts.map +1 -1
  115. package/dist/server/tools/read-tools.d.cts +3 -0
  116. package/dist/server/tools/read-tools.d.cts.map +1 -0
  117. package/dist/server/tools/read-tools.d.ts +1 -1
  118. package/dist/server/tools/read-tools.d.ts.map +1 -1
  119. package/dist/server/tools/types.d.cts +51 -0
  120. package/dist/server/tools/types.d.cts.map +1 -0
  121. package/dist/server/tools/types.d.ts +1 -1
  122. package/dist/server/tools/types.d.ts.map +1 -1
  123. package/dist/server/tools/write-tools.d.cts +3 -0
  124. package/dist/server/tools/write-tools.d.cts.map +1 -0
  125. package/dist/server/tools/write-tools.d.ts +1 -1
  126. package/dist/server/tools/write-tools.d.ts.map +1 -1
  127. package/dist/types.d.cts +463 -0
  128. package/dist/types.d.cts.map +1 -0
  129. package/package.json +49 -24
  130. package/dist/chunk-3DRAVYU3.js.map +0 -1
  131. package/dist/chunk-CCV6S4YN.js.map +0 -1
  132. package/dist/chunk-ILLNRABB.js.map +0 -1
  133. package/dist/chunk-ORA6BS4P.js.map +0 -1
@@ -0,0 +1,69 @@
1
+ import type { PageDocument } from '@kubuild/schema';
2
+ import type { AiChatMessage } from '../types.cjs';
3
+ import { type AiClientOptions } from '../client/ai-client.cjs';
4
+ /**
5
+ * Optional, host-implemented chat history persistence (STORA-520). `@kubuild/ai` stays
6
+ * storage-agnostic — it never imports `localStorage` or any concrete storage mechanism
7
+ * itself; the host supplies an adapter backed by whatever it wants (browser
8
+ * `localStorage`, IndexedDB, a Stora.page backend call, etc.).
9
+ */
10
+ export interface AiChatHistoryStorageAdapter {
11
+ /** Called once on mount to seed `messages` before the user sends anything. */
12
+ loadHistory(): Promise<AiChatMessage[]> | AiChatMessage[];
13
+ /**
14
+ * Called at completed-message boundaries (a user message just sent, or an assistant
15
+ * reply that just finished/streamed to completion) — never on every mid-stream token,
16
+ * see `useAiChat`'s persistence notes.
17
+ */
18
+ saveHistory(messages: AiChatMessage[]): Promise<void> | void;
19
+ }
20
+ export interface UseAiChatOptions extends AiClientOptions {
21
+ initialMessages?: AiChatMessage[];
22
+ onMessage?: (message: AiChatMessage) => void;
23
+ onError?: (error: Error) => void;
24
+ /**
25
+ * Fired for every partial token/chunk of a streaming chat response (STORA-516),
26
+ * mirroring `useAiGenerator`'s `AiStreamCallbacks` naming convention. Optional — the
27
+ * `messages` array already updates incrementally on its own, this is only for hosts
28
+ * that want a side-channel (e.g. custom rendering, telemetry) into the raw chunks.
29
+ */
30
+ onChunk?: (delta: string, content: string) => void;
31
+ /**
32
+ * Optional storage adapter (STORA-520) used to persist/restore chat history across
33
+ * reloads. Without it, behavior is exactly as before: pure in-memory React state, lost
34
+ * on reload/unmount. `loadHistory()` is called once on mount to hydrate `messages`
35
+ * (only overriding `initialMessages` when it resolves a non-empty array);
36
+ * `saveHistory()` is called at completed-message boundaries — after a user message is
37
+ * appended, and after an assistant reply finishes (streamed or not) — intentionally
38
+ * *not* on every streaming chunk, to avoid hammering the adapter mid-stream.
39
+ */
40
+ historyStorage?: AiChatHistoryStorageAdapter;
41
+ }
42
+ export interface SendMessageOptions {
43
+ currentDocument?: PageDocument;
44
+ selectedNodeId?: string;
45
+ /**
46
+ * Extra instructions sent to the server and appended after its built-in system prompt
47
+ * (see `createAiHandler`'s `allowClientInstructions`).
48
+ */
49
+ instructions?: string;
50
+ /** @deprecated Alias of `instructions`. */
51
+ systemPrompt?: string;
52
+ /**
53
+ * Opt out of token-level streaming for this call (STORA-515/516 default to `true`).
54
+ * When `false`, behaves exactly like the pre-streaming single request/response call.
55
+ */
56
+ stream?: boolean;
57
+ }
58
+ export declare function useAiChat(options: UseAiChatOptions): {
59
+ messages: AiChatMessage[];
60
+ sendMessage: (content: string, sendOptions?: SendMessageOptions) => Promise<AiChatMessage | null>;
61
+ isLoading: boolean;
62
+ /** Whether the in-flight `sendMessage` call is a token-level stream (STORA-516). */
63
+ isStreaming: boolean;
64
+ error: Error | null;
65
+ cancel: () => void;
66
+ clearMessages: () => void;
67
+ setMessages: import("react").Dispatch<import("react").SetStateAction<AiChatMessage[]>>;
68
+ };
69
+ //# sourceMappingURL=use-ai-chat.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-ai-chat.d.cts","sourceRoot":"","sources":["../../src/react/use-ai-chat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,aAAa,CAAC;AACjE,OAAO,EAAkB,KAAK,eAAe,EAAmB,MAAM,wBAAwB,CAAC;AAE/F;;;;;GAKG;AACH,MAAM,WAAW,2BAA2B;IAC1C,8EAA8E;IAC9E,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1D;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,2BAA2B,CAAC;CAC9C;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB;;2BAuE/B,MAAM,gBAAgB,kBAAkB,KAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;;IAgHxF,oFAAoF;;;;;;EAOvF"}
@@ -1,6 +1,6 @@
1
1
  import type { PageDocument } from '@kubuild/schema';
2
- import type { AiChatMessage } from '../types';
3
- import { type AiClientOptions } from '../client/ai-client';
2
+ import type { AiChatMessage } from '../types.js';
3
+ import { type AiClientOptions } from '../client/ai-client.js';
4
4
  /**
5
5
  * Optional, host-implemented chat history persistence (STORA-520). `@kubuild/ai` stays
6
6
  * storage-agnostic — it never imports `localStorage` or any concrete storage mechanism
@@ -1 +1 @@
1
- {"version":3,"file":"use-ai-chat.d.ts","sourceRoot":"","sources":["../../src/react/use-ai-chat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAkB,KAAK,eAAe,EAAmB,MAAM,qBAAqB,CAAC;AAE5F;;;;;GAKG;AACH,MAAM,WAAW,2BAA2B;IAC1C,8EAA8E;IAC9E,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1D;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,2BAA2B,CAAC;CAC9C;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB;;2BAuE/B,MAAM,gBAAgB,kBAAkB,KAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;;IAgHxF,oFAAoF;;;;;;EAOvF"}
1
+ {"version":3,"file":"use-ai-chat.d.ts","sourceRoot":"","sources":["../../src/react/use-ai-chat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,aAAa,CAAC;AACjE,OAAO,EAAkB,KAAK,eAAe,EAAmB,MAAM,wBAAwB,CAAC;AAE/F;;;;;GAKG;AACH,MAAM,WAAW,2BAA2B;IAC1C,8EAA8E;IAC9E,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1D;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,2BAA2B,CAAC;CAC9C;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB;;2BAuE/B,MAAM,gBAAgB,kBAAkB,KAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;;IAgHxF,oFAAoF;;;;;;EAOvF"}
@@ -0,0 +1,20 @@
1
+ import type { PageDocument, Node } from '@kubuild/schema';
2
+ import type { AiGeneratePageRequest, AiGenerateSectionRequest, AiRefactorNodeRequest, AiStreamCallbacks, PagePlan, AiPlanPageRequest } from '../types.cjs';
3
+ import { type AiClientOptions } from '../client/ai-client.cjs';
4
+ export interface UseAiGeneratorOptions extends AiClientOptions {
5
+ onSuccess?: (data: PageDocument | Node) => void;
6
+ onError?: (error: Error) => void;
7
+ }
8
+ export declare function useAiGenerator(options: UseAiGeneratorOptions): {
9
+ generatePage: (params: AiGeneratePageRequest) => Promise<PageDocument | null>;
10
+ planPage: (params: AiPlanPageRequest) => Promise<PagePlan | null>;
11
+ streamPage: (params: AiGeneratePageRequest, streamCallbacks?: AiStreamCallbacks) => Promise<PageDocument | null>;
12
+ generateSection: (params: AiGenerateSectionRequest) => Promise<Node | null>;
13
+ refactorNode: (params: AiRefactorNodeRequest) => Promise<Node | null>;
14
+ isGenerating: boolean;
15
+ isStreaming: boolean;
16
+ currentStep: string;
17
+ error: Error | null;
18
+ cancel: () => void;
19
+ };
20
+ //# sourceMappingURL=use-ai-generator.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-ai-generator.d.cts","sourceRoot":"","sources":["../../src/react/use-ai-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EACV,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB,EACjB,QAAQ,EACR,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAkB,KAAK,eAAe,EAAmB,MAAM,wBAAwB,CAAC;AAE/F,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB;2BAwB1C,qBAAqB,KAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;uBA+KpD,iBAAiB,KAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;yBAxIjD,qBAAqB,oBACX,iBAAiB,KAClC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;8BA2DhB,wBAAwB,KAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;2BAkC/C,qBAAqB,KAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;;;;;;EAqF9D"}
@@ -1,6 +1,6 @@
1
1
  import type { PageDocument, Node } from '@kubuild/schema';
2
- import type { AiGeneratePageRequest, AiGenerateSectionRequest, AiRefactorNodeRequest, AiStreamCallbacks, PagePlan, AiPlanPageRequest } from '../types';
3
- import { type AiClientOptions } from '../client/ai-client';
2
+ import type { AiGeneratePageRequest, AiGenerateSectionRequest, AiRefactorNodeRequest, AiStreamCallbacks, PagePlan, AiPlanPageRequest } from '../types.js';
3
+ import { type AiClientOptions } from '../client/ai-client.js';
4
4
  export interface UseAiGeneratorOptions extends AiClientOptions {
5
5
  onSuccess?: (data: PageDocument | Node) => void;
6
6
  onError?: (error: Error) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"use-ai-generator.d.ts","sourceRoot":"","sources":["../../src/react/use-ai-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EACV,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB,EACjB,QAAQ,EACR,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAkB,KAAK,eAAe,EAAmB,MAAM,qBAAqB,CAAC;AAE5F,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB;2BAwB1C,qBAAqB,KAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;uBA+KpD,iBAAiB,KAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;yBAxIjD,qBAAqB,oBACX,iBAAiB,KAClC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;8BA2DhB,wBAAwB,KAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;2BAkC/C,qBAAqB,KAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;;;;;;EAqF9D"}
1
+ {"version":3,"file":"use-ai-generator.d.ts","sourceRoot":"","sources":["../../src/react/use-ai-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EACV,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB,EACjB,QAAQ,EACR,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAkB,KAAK,eAAe,EAAmB,MAAM,wBAAwB,CAAC;AAE/F,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB;2BAwB1C,qBAAqB,KAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;uBA+KpD,iBAAiB,KAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;yBAxIjD,qBAAqB,oBACX,iBAAiB,KAClC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;8BA2DhB,wBAAwB,KAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;2BAkC/C,qBAAqB,KAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;;;;;;EAqF9D"}
@@ -0,0 +1,30 @@
1
+ import type { AiProviderAdapter, AiProviderGenerateParams, AiProviderGenerateResult } from '../../types.cjs';
2
+ export interface AnthropicAdapterOptions {
3
+ apiKey: string;
4
+ model?: string;
5
+ maxTokens?: number;
6
+ temperature?: number;
7
+ baseUrl?: string;
8
+ anthropicVersion?: string;
9
+ headers?: Record<string, string>;
10
+ }
11
+ export declare class AnthropicAdapter implements AiProviderAdapter {
12
+ readonly name = "anthropic";
13
+ private apiKey;
14
+ private model;
15
+ private maxTokens;
16
+ private temperature;
17
+ private baseUrl;
18
+ private anthropicVersion;
19
+ private customHeaders?;
20
+ constructor(options: AnthropicAdapterOptions);
21
+ private buildMessages;
22
+ generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult>;
23
+ /**
24
+ * Token-level streaming via Anthropic's `stream: true` Messages API (STORA-515).
25
+ * Parses the `content_block_delta` (`text_delta`) events for incremental text and the
26
+ * `message_start`/`message_delta` events for usage accounting.
27
+ */
28
+ generateStream(params: AiProviderGenerateParams): AsyncGenerator<string, AiProviderGenerateResult, void>;
29
+ }
30
+ //# sourceMappingURL=anthropic.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.cts","sourceRoot":"","sources":["../../../src/server/adapters/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,gBAAgB,CAAC;AAIxB,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,aAAa,CAAC,CAAyB;gBAEnC,OAAO,EAAE,uBAAuB;IAa5C,OAAO,CAAC,aAAa;IAgBf,QAAQ,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IA4DnF;;;;OAIG;IACI,cAAc,CACnB,MAAM,EAAE,wBAAwB,GAC/B,cAAc,CAAC,MAAM,EAAE,wBAAwB,EAAE,IAAI,CAAC;CA6E1D"}
@@ -1,4 +1,4 @@
1
- import type { AiProviderAdapter, AiProviderGenerateParams, AiProviderGenerateResult } from '../../types';
1
+ import type { AiProviderAdapter, AiProviderGenerateParams, AiProviderGenerateResult } from '../../types.js';
2
2
  export interface AnthropicAdapterOptions {
3
3
  apiKey: string;
4
4
  model?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,aAAa,CAAC;AAIrB,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,aAAa,CAAC,CAAyB;gBAEnC,OAAO,EAAE,uBAAuB;IAa5C,OAAO,CAAC,aAAa;IAgBf,QAAQ,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IA4DnF;;;;OAIG;IACI,cAAc,CACnB,MAAM,EAAE,wBAAwB,GAC/B,cAAc,CAAC,MAAM,EAAE,wBAAwB,EAAE,IAAI,CAAC;CA6E1D"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,gBAAgB,CAAC;AAIxB,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,aAAa,CAAC,CAAyB;gBAEnC,OAAO,EAAE,uBAAuB;IAa5C,OAAO,CAAC,aAAa;IAgBf,QAAQ,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IA4DnF;;;;OAIG;IACI,cAAc,CACnB,MAAM,EAAE,wBAAwB,GAC/B,cAAc,CAAC,MAAM,EAAE,wBAAwB,EAAE,IAAI,CAAC;CA6E1D"}
@@ -0,0 +1,2 @@
1
+ export type { AiProviderAdapter, AiProviderGenerateParams, AiProviderGenerateResult, } from '../../types.cjs';
2
+ //# sourceMappingURL=base.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.cts","sourceRoot":"","sources":["../../../src/server/adapters/base.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC"}
@@ -1,2 +1,2 @@
1
- export type { AiProviderAdapter, AiProviderGenerateParams, AiProviderGenerateResult, } from '../../types';
1
+ export type { AiProviderAdapter, AiProviderGenerateParams, AiProviderGenerateResult, } from '../../types.js';
2
2
  //# sourceMappingURL=base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/base.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/base.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { AiProviderAdapter, AiProviderGenerateParams, AiProviderGenerateResult } from '../../types.cjs';
2
+ export interface CustomHttpAdapterOptions {
3
+ url: string;
4
+ name?: string;
5
+ headers?: Record<string, string>;
6
+ formatRequestBody?: (params: AiProviderGenerateParams) => unknown;
7
+ parseResponse?: (json: unknown) => string;
8
+ }
9
+ export declare class CustomHttpAdapter implements AiProviderAdapter {
10
+ readonly name: string;
11
+ private url;
12
+ private headers?;
13
+ private formatRequestBody;
14
+ private parseResponse;
15
+ constructor(options: CustomHttpAdapterOptions);
16
+ generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult>;
17
+ }
18
+ //# sourceMappingURL=custom.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom.d.cts","sourceRoot":"","sources":["../../../src/server/adapters/custom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,gBAAgB,CAAC;AAGxB,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,OAAO,CAAC;IAClE,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC;CAC3C;AAED,qBAAa,iBAAkB,YAAW,iBAAiB;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAAC,CAAyB;IACzC,OAAO,CAAC,iBAAiB,CAAgD;IACzE,OAAO,CAAC,aAAa,CAA4B;gBAErC,OAAO,EAAE,wBAAwB;IA8CvC,QAAQ,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;CAyBpF"}
@@ -1,4 +1,4 @@
1
- import type { AiProviderAdapter, AiProviderGenerateParams, AiProviderGenerateResult } from '../../types';
1
+ import type { AiProviderAdapter, AiProviderGenerateParams, AiProviderGenerateResult } from '../../types.js';
2
2
  export interface CustomHttpAdapterOptions {
3
3
  url: string;
4
4
  name?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/custom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,OAAO,CAAC;IAClE,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC;CAC3C;AAED,qBAAa,iBAAkB,YAAW,iBAAiB;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAAC,CAAyB;IACzC,OAAO,CAAC,iBAAiB,CAAgD;IACzE,OAAO,CAAC,aAAa,CAA4B;gBAErC,OAAO,EAAE,wBAAwB;IA8CvC,QAAQ,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;CAyBpF"}
1
+ {"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/custom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,gBAAgB,CAAC;AAGxB,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,OAAO,CAAC;IAClE,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC;CAC3C;AAED,qBAAa,iBAAkB,YAAW,iBAAiB;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAAC,CAAyB;IACzC,OAAO,CAAC,iBAAiB,CAAgD;IACzE,OAAO,CAAC,aAAa,CAA4B;gBAErC,OAAO,EAAE,wBAAwB;IA8CvC,QAAQ,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;CAyBpF"}
@@ -0,0 +1,22 @@
1
+ import type { AiProviderAdapter, AiProviderGenerateParams, AiProviderGenerateResult } from '../../types.cjs';
2
+ export interface GeminiAdapterOptions {
3
+ apiKey: string;
4
+ model?: string;
5
+ temperature?: number;
6
+ baseUrl?: string;
7
+ }
8
+ export declare class GeminiAdapter implements AiProviderAdapter {
9
+ readonly name = "gemini";
10
+ private apiKey;
11
+ private model;
12
+ private temperature;
13
+ private baseUrl;
14
+ constructor(options: GeminiAdapterOptions);
15
+ private buildContents;
16
+ generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult>;
17
+ /**
18
+ * Token-level streaming via Gemini's `streamGenerateContent` SSE endpoint (STORA-515).
19
+ */
20
+ generateStream(params: AiProviderGenerateParams): AsyncGenerator<string, AiProviderGenerateResult, void>;
21
+ }
22
+ //# sourceMappingURL=gemini.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.cts","sourceRoot":"","sources":["../../../src/server/adapters/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,gBAAgB,CAAC;AAIxB,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAc,YAAW,iBAAiB;IACrD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,oBAAoB;IAWzC,OAAO,CAAC,aAAa;IAiBf,QAAQ,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAkEnF;;OAEG;IACI,cAAc,CACnB,MAAM,EAAE,wBAAwB,GAC/B,cAAc,CAAC,MAAM,EAAE,wBAAwB,EAAE,IAAI,CAAC;CAmE1D"}
@@ -1,4 +1,4 @@
1
- import type { AiProviderAdapter, AiProviderGenerateParams, AiProviderGenerateResult } from '../../types';
1
+ import type { AiProviderAdapter, AiProviderGenerateParams, AiProviderGenerateResult } from '../../types.js';
2
2
  export interface GeminiAdapterOptions {
3
3
  apiKey: string;
4
4
  model?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,aAAa,CAAC;AAIrB,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAc,YAAW,iBAAiB;IACrD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,oBAAoB;IAWzC,OAAO,CAAC,aAAa;IAiBf,QAAQ,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAkEnF;;OAEG;IACI,cAAc,CACnB,MAAM,EAAE,wBAAwB,GAC/B,cAAc,CAAC,MAAM,EAAE,wBAAwB,EAAE,IAAI,CAAC;CAmE1D"}
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,gBAAgB,CAAC;AAIxB,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAc,YAAW,iBAAiB;IACrD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,oBAAoB;IAWzC,OAAO,CAAC,aAAa;IAiBf,QAAQ,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAkEnF;;OAEG;IACI,cAAc,CACnB,MAAM,EAAE,wBAAwB,GAC/B,cAAc,CAAC,MAAM,EAAE,wBAAwB,EAAE,IAAI,CAAC;CAmE1D"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/adapters/index.ts","../../../src/server/adapters/stream-utils.ts","../../../src/core/messages.ts","../../../src/server/adapters/gemini.ts","../../../src/server/adapters/openai.ts","../../../src/server/adapters/anthropic.ts","../../../src/server/adapters/custom.ts"],"sourcesContent":["export * from './base';\nexport * from './gemini';\nexport * from './openai';\nexport * from './anthropic';\nexport * from './custom';\n","/**\n * Shared SSE (server-sent events) frame reader for provider adapters that support\n * token-level streaming (STORA-515) — OpenAI, Anthropic and Gemini all expose their\n * streaming APIs as `data: <json>\\n\\n` frames, so every adapter reuses this single\n * low-level reader instead of re-implementing buffering/decoding three times.\n *\n * Yields the raw string payload of each `data:` line (already trimmed), in arrival\n * order. Callers are responsible for `JSON.parse`-ing (or ignoring sentinel values\n * like OpenAI's `[DONE]`) and for interpreting provider-specific event shapes.\n */\nexport async function* readSseDataLines(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<string, void, void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n if (signal?.aborted) {\n throw new Error('Streaming aborted by client');\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const frames = buffer.split('\\n\\n');\n buffer = frames.pop() || '';\n\n for (const frame of frames) {\n for (const line of frame.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.startsWith('data:')) {\n yield trimmed.slice(5).trim();\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n","import type { AiChatMessage, AiContentBlock, AiToolUseBlock, AiToolResultBlock } from '../types';\n\n/**\n * Flattens a message's content to plain text (STORA-530).\n *\n * `AiChatMessage.content` became `string | AiContentBlock[]` when tool calling landed;\n * every place that previously assumed a bare string (adapter message mapping, the chat\n * prompt's \"last user message\" lookup, chat UIs) goes through this helper instead of\n * re-implementing the narrowing. Tool-use/tool-result blocks contribute nothing to the\n * text rendering — they're transported separately by the adapters.\n */\nexport function getMessageText(message: Pick<AiChatMessage, 'content'>): string {\n if (typeof message.content === 'string') return message.content;\n return message.content\n .filter((block): block is Extract<AiContentBlock, { type: 'text' }> => block.type === 'text')\n .map((block) => block.text)\n .join('\\n');\n}\n\n/** All `tool_use` blocks carried by a message, in order. Empty for plain-text messages. */\nexport function getToolUseBlocks(message: Pick<AiChatMessage, 'content'>): AiToolUseBlock[] {\n if (typeof message.content === 'string') return [];\n return message.content.filter((b): b is AiToolUseBlock => b.type === 'tool_use');\n}\n\n/** All `tool_result` blocks carried by a message, in order. */\nexport function getToolResultBlocks(message: Pick<AiChatMessage, 'content'>): AiToolResultBlock[] {\n if (typeof message.content === 'string') return [];\n return message.content.filter((b): b is AiToolResultBlock => b.type === 'tool_result');\n}\n\n/** True when the message carries any non-text block — i.e. adapters must map it structurally. */\nexport function hasStructuredContent(message: Pick<AiChatMessage, 'content'>): boolean {\n return typeof message.content !== 'string' && message.content.some((b) => b.type !== 'text');\n}\n","import type {\n AiProviderAdapter,\n AiProviderGenerateParams,\n AiProviderGenerateResult,\n} from '../../types';\nimport { readSseDataLines } from './stream-utils';\nimport { getMessageText } from '../../core/messages';\n\nexport interface GeminiAdapterOptions {\n apiKey: string;\n model?: string;\n temperature?: number;\n baseUrl?: string;\n}\n\nexport class GeminiAdapter implements AiProviderAdapter {\n readonly name = 'gemini';\n private apiKey: string;\n private model: string;\n private temperature: number;\n private baseUrl: string;\n\n constructor(options: GeminiAdapterOptions) {\n if (!options.apiKey) {\n throw new Error('GeminiAdapter requires an apiKey');\n }\n this.apiKey = options.apiKey;\n this.model = options.model || 'gemini-2.5-flash';\n this.temperature = options.temperature ?? 0.4;\n this.baseUrl =\n options.baseUrl || 'https://generativelanguage.googleapis.com/v1beta';\n }\n\n private buildContents(\n params: AiProviderGenerateParams,\n ): Array<{ role: string; parts: Array<{ text: string }> }> {\n const { userPrompt, messages: chatMessages } = params;\n return chatMessages && chatMessages.length > 0\n ? chatMessages.map((m) => ({\n role: m.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: getMessageText(m) }],\n }))\n : [\n {\n role: 'user',\n parts: [{ text: userPrompt }],\n },\n ];\n }\n\n async generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult> {\n const { systemPrompt, messages: chatMessages, signal } = params;\n\n const url = `${this.baseUrl}/models/${encodeURIComponent(this.model)}:generateContent?key=${encodeURIComponent(this.apiKey)}`;\n const contents = this.buildContents(params);\n\n const generationConfig: Record<string, unknown> = {\n temperature: this.temperature,\n };\n\n if (params.jsonSchema || (!chatMessages && (systemPrompt.includes('JSON') || systemPrompt.includes('json')))) {\n generationConfig.responseMimeType = 'application/json';\n }\n\n const body: Record<string, unknown> = {\n system_instruction: {\n parts: [{ text: systemPrompt }],\n },\n contents,\n generationConfig,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Gemini API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n const data = (await res.json()) as {\n candidates?: Array<{\n content?: {\n parts?: Array<{ text?: string }>;\n };\n }>;\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n };\n };\n\n const candidateText = data.candidates?.[0]?.content?.parts?.[0]?.text;\n if (!candidateText) {\n throw new Error('Gemini returned an empty or invalid candidate response');\n }\n\n return {\n text: candidateText,\n usage: data.usageMetadata\n ? {\n promptTokens: data.usageMetadata.promptTokenCount,\n completionTokens: data.usageMetadata.candidatesTokenCount,\n }\n : undefined,\n };\n }\n\n /**\n * Token-level streaming via Gemini's `streamGenerateContent` SSE endpoint (STORA-515).\n */\n async *generateStream(\n params: AiProviderGenerateParams,\n ): AsyncGenerator<string, AiProviderGenerateResult, void> {\n const { systemPrompt, signal } = params;\n const url = `${this.baseUrl}/models/${encodeURIComponent(this.model)}:streamGenerateContent?alt=sse&key=${encodeURIComponent(this.apiKey)}`;\n const contents = this.buildContents(params);\n\n const generationConfig: Record<string, unknown> = {\n temperature: this.temperature,\n };\n\n const body: Record<string, unknown> = {\n system_instruction: {\n parts: [{ text: systemPrompt }],\n },\n contents,\n generationConfig,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Gemini API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n if (!res.body) {\n throw new Error('Gemini streaming response has no readable body');\n }\n\n let text = '';\n let usage: AiProviderGenerateResult['usage'];\n\n for await (const raw of readSseDataLines(res.body, signal)) {\n let parsed: {\n candidates?: Array<{ content?: { parts?: Array<{ text?: string }> } }>;\n usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number };\n };\n try {\n parsed = JSON.parse(raw);\n } catch {\n continue;\n }\n\n const delta = parsed.candidates?.[0]?.content?.parts?.[0]?.text;\n if (typeof delta === 'string' && delta.length > 0) {\n text += delta;\n yield delta;\n }\n\n if (parsed.usageMetadata) {\n usage = {\n promptTokens: parsed.usageMetadata.promptTokenCount,\n completionTokens: parsed.usageMetadata.candidatesTokenCount,\n };\n }\n }\n\n return { text, usage };\n }\n}\n","import type {\n AiChatMessage,\n AiProviderAdapter,\n AiProviderGenerateParams,\n AiProviderGenerateResult,\n AiStopReason,\n AiToolUseBlock,\n} from '../../types';\nimport { getMessageText, getToolResultBlocks, getToolUseBlocks } from '../../core/messages';\nimport { readSseDataLines } from './stream-utils';\n\nexport interface OpenAiAdapterOptions {\n apiKey: string;\n model?: string;\n temperature?: number;\n baseUrl?: string;\n headers?: Record<string, string>;\n}\n\n/** OpenAI Chat Completions message shape — `tool_calls`/`role: 'tool'` included. */\ninterface OpenAiMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }>;\n tool_call_id?: string;\n}\n\ninterface OpenAiToolCallPayload {\n id?: string;\n type?: string;\n function?: { name?: string; arguments?: string };\n}\n\n/**\n * Maps OpenAI's `finish_reason` onto the provider-agnostic `AiStopReason` the agent loop\n * branches on (STORA-530).\n */\nfunction mapStopReason(finishReason: string | undefined | null): AiStopReason {\n switch (finishReason) {\n case 'stop':\n return 'stop';\n case 'tool_calls':\n case 'function_call':\n return 'tool_calls';\n case 'length':\n return 'length';\n case 'content_filter':\n return 'content_filter';\n default:\n return 'unknown';\n }\n}\n\n/**\n * Parses OpenAI `tool_calls` into `AiToolUseBlock`s. A call whose `arguments` isn't valid\n * JSON is surfaced with an empty `input` rather than throwing: the agent's tool executor\n * then rejects it with a `tool_result` error and the model self-corrects on the next step,\n * which is far better than killing the whole run over one malformed argument blob.\n */\nfunction parseToolCalls(raw: OpenAiToolCallPayload[] | undefined): AiToolUseBlock[] {\n if (!Array.isArray(raw) || raw.length === 0) return [];\n return raw\n .filter((call) => call?.function?.name)\n .map((call, index) => {\n let input: Record<string, unknown> = {};\n const argsText = call.function?.arguments;\n if (argsText && argsText.trim()) {\n try {\n const parsed = JSON.parse(argsText);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n input = parsed as Record<string, unknown>;\n }\n } catch {\n input = {};\n }\n }\n return {\n type: 'tool_use' as const,\n id: call.id || `call_${index}`,\n name: call.function!.name!,\n input,\n };\n });\n}\n\nexport class OpenAiAdapter implements AiProviderAdapter {\n readonly name = 'openai';\n readonly supportsTools = true;\n private apiKey: string;\n private model: string;\n private temperature: number;\n private baseUrl: string;\n private customHeaders?: Record<string, string>;\n\n constructor(options: OpenAiAdapterOptions) {\n if (!options.apiKey) {\n throw new Error('OpenAiAdapter requires an apiKey');\n }\n this.apiKey = options.apiKey;\n this.model = options.model || 'gpt-4o';\n this.temperature = options.temperature ?? 0.4;\n this.baseUrl = (options.baseUrl || 'https://api.openai.com/v1').replace(/\\/+$/, '');\n this.customHeaders = options.headers;\n }\n\n /**\n * Expands one `AiChatMessage` into the one-or-more OpenAI messages it corresponds to\n * (STORA-530).\n *\n * The block model is Anthropic-shaped — tool results ride along inside a `user` message —\n * while OpenAI wants each result as its own `role: 'tool'` message keyed by\n * `tool_call_id`. That fan-out happens here so the rest of the stack stays\n * provider-agnostic.\n */\n private mapMessage(message: AiChatMessage): OpenAiMessage[] {\n const toolUses = getToolUseBlocks(message);\n const toolResults = getToolResultBlocks(message);\n const text = getMessageText(message);\n\n if (toolResults.length > 0) {\n const results: OpenAiMessage[] = toolResults.map((block) => ({\n role: 'tool',\n content: block.content,\n tool_call_id: block.toolUseId,\n }));\n // Any free text riding alongside tool results becomes a separate user turn — OpenAI\n // rejects a `role: 'tool'` message that carries anything but the result payload.\n if (text.trim()) {\n results.push({ role: 'user', content: text });\n }\n return results;\n }\n\n if (toolUses.length > 0) {\n return [\n {\n role: 'assistant',\n content: text.trim() ? text : null,\n tool_calls: toolUses.map((block) => ({\n id: block.id,\n type: 'function' as const,\n function: {\n name: block.name,\n arguments: JSON.stringify(block.input ?? {}),\n },\n })),\n },\n ];\n }\n\n return [{ role: message.role, content: text }];\n }\n\n private buildMessages(params: AiProviderGenerateParams): OpenAiMessage[] {\n const { systemPrompt, userPrompt, messages: chatMessages } = params;\n if (chatMessages && chatMessages.length > 0) {\n return [\n { role: 'system', content: systemPrompt },\n ...chatMessages.flatMap((m) => this.mapMessage(m)),\n ];\n }\n return [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ];\n }\n\n /**\n * Shared request body builder for `generate`/`generateStream` — notably the\n * `response_format` decision, which must never fire in tool mode: OpenAI rejects\n * `json_object` combined with `tools`, and a tool-calling turn's text output is a\n * natural-language summary, not JSON.\n */\n private buildBody(params: AiProviderGenerateParams): Record<string, unknown> {\n const { systemPrompt, jsonSchema, messages: chatMessages, tools, toolChoice } = params;\n\n const body: Record<string, unknown> = {\n model: this.model,\n temperature: params.temperature ?? this.temperature,\n messages: this.buildMessages(params),\n };\n\n if (tools && tools.length > 0) {\n body.tools = tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n if (toolChoice) {\n body.tool_choice =\n typeof toolChoice === 'string'\n ? toolChoice\n : { type: 'function', function: { name: toolChoice.name } };\n }\n return body;\n }\n\n // Only force json_object when JSON schema is provided or specifically requested,\n // allowing natural conversation text in chat mode.\n if (jsonSchema || (!chatMessages && (systemPrompt.includes('JSON') || systemPrompt.includes('json')))) {\n body.response_format = { type: 'json_object' };\n }\n\n return body;\n }\n\n private async post(body: Record<string, unknown>, signal?: AbortSignal): Promise<Response> {\n const res = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n ...this.customHeaders,\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `OpenAI API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n return res;\n }\n\n async generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult> {\n const res = await this.post(this.buildBody(params), params.signal);\n\n const data = (await res.json()) as {\n choices?: Array<{\n finish_reason?: string;\n message?: {\n content?: string;\n tool_calls?: OpenAiToolCallPayload[];\n };\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n };\n };\n\n const choice = data.choices?.[0];\n const content = choice?.message?.content;\n const toolCalls = parseToolCalls(choice?.message?.tool_calls);\n\n // A tool-calling turn legitimately has null content — only a turn with neither text\n // nor tool calls is an empty response worth throwing over.\n if (!content && toolCalls.length === 0) {\n throw new Error('OpenAI returned an empty message content');\n }\n\n return {\n text: content || '',\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n stopReason: mapStopReason(choice?.finish_reason),\n usage: data.usage\n ? {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n }\n : undefined,\n };\n }\n\n /**\n * Token-level streaming via OpenAI's `stream: true` chat completions mode (STORA-515).\n * Yields each `delta.content` fragment as it arrives and returns the fully assembled\n * text + usage (when the final chunk includes it) once the stream ends.\n *\n * Tool calls arrive fragmented too (STORA-530): `delta.tool_calls[].function.arguments`\n * is delivered as a character stream across many chunks, keyed by array `index`. They're\n * accumulated per index and parsed only once the stream ends — parsing a partial\n * arguments string would always fail. Tool call deltas are never `yield`ed as text,\n * since they aren't part of the assistant's visible message.\n */\n async *generateStream(\n params: AiProviderGenerateParams,\n ): AsyncGenerator<string, AiProviderGenerateResult, void> {\n const { signal } = params;\n const res = await this.post({ ...this.buildBody(params), stream: true }, signal);\n\n if (!res.body) {\n throw new Error('OpenAI streaming response has no readable body');\n }\n\n let text = '';\n let usage: AiProviderGenerateResult['usage'];\n let finishReason: string | undefined;\n const toolCallAccumulator = new Map<number, { id: string; name: string; arguments: string }>();\n\n for await (const raw of readSseDataLines(res.body, signal)) {\n if (raw === '[DONE]') break;\n\n let parsed: {\n choices?: Array<{\n finish_reason?: string;\n delta?: {\n content?: string;\n tool_calls?: Array<OpenAiToolCallPayload & { index?: number }>;\n };\n }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number };\n };\n try {\n parsed = JSON.parse(raw);\n } catch {\n continue;\n }\n\n const choice = parsed.choices?.[0];\n\n const delta = choice?.delta?.content;\n if (typeof delta === 'string' && delta.length > 0) {\n text += delta;\n yield delta;\n }\n\n for (const call of choice?.delta?.tool_calls ?? []) {\n const index = typeof call.index === 'number' ? call.index : 0;\n const entry = toolCallAccumulator.get(index) ?? { id: '', name: '', arguments: '' };\n if (call.id) entry.id = call.id;\n if (call.function?.name) entry.name = call.function.name;\n if (call.function?.arguments) entry.arguments += call.function.arguments;\n toolCallAccumulator.set(index, entry);\n }\n\n if (choice?.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n if (parsed.usage) {\n usage = {\n promptTokens: parsed.usage.prompt_tokens,\n completionTokens: parsed.usage.completion_tokens,\n };\n }\n }\n\n const toolCalls = parseToolCalls(\n Array.from(toolCallAccumulator.entries())\n .sort(([a], [b]) => a - b)\n .map(([, entry]) => ({\n id: entry.id,\n type: 'function',\n function: { name: entry.name, arguments: entry.arguments },\n })),\n );\n\n return {\n text,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n stopReason: mapStopReason(finishReason),\n usage,\n };\n }\n}\n","import type {\n AiProviderAdapter,\n AiProviderGenerateParams,\n AiProviderGenerateResult,\n} from '../../types';\nimport { readSseDataLines } from './stream-utils';\nimport { getMessageText } from '../../core/messages';\n\nexport interface AnthropicAdapterOptions {\n apiKey: string;\n model?: string;\n maxTokens?: number;\n temperature?: number;\n baseUrl?: string;\n anthropicVersion?: string;\n headers?: Record<string, string>;\n}\n\nexport class AnthropicAdapter implements AiProviderAdapter {\n readonly name = 'anthropic';\n private apiKey: string;\n private model: string;\n private maxTokens: number;\n private temperature: number;\n private baseUrl: string;\n private anthropicVersion: string;\n private customHeaders?: Record<string, string>;\n\n constructor(options: AnthropicAdapterOptions) {\n if (!options.apiKey) {\n throw new Error('AnthropicAdapter requires an apiKey');\n }\n this.apiKey = options.apiKey;\n this.model = options.model || 'claude-3-5-sonnet-20241022';\n this.maxTokens = options.maxTokens ?? 4096;\n this.temperature = options.temperature ?? 0.4;\n this.baseUrl = (options.baseUrl || 'https://api.anthropic.com/v1').replace(/\\/+$/, '');\n this.anthropicVersion = options.anthropicVersion || '2023-06-01';\n this.customHeaders = options.headers;\n }\n\n private buildMessages(\n params: AiProviderGenerateParams,\n ): Array<{ role: 'user' | 'assistant'; content: string }> {\n const { userPrompt, messages: chatMessages } = params;\n return chatMessages && chatMessages.length > 0\n ? chatMessages\n .filter((m) => m.role === 'user' || m.role === 'assistant')\n .map((m) => ({ role: m.role as 'user' | 'assistant', content: getMessageText(m) }))\n : [\n {\n role: 'user' as const,\n content: userPrompt,\n },\n ];\n }\n\n async generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult> {\n const { systemPrompt, signal } = params;\n\n const url = `${this.baseUrl}/messages`;\n const messages = this.buildMessages(params);\n\n const body: Record<string, unknown> = {\n model: this.model,\n max_tokens: this.maxTokens,\n temperature: this.temperature,\n system: systemPrompt,\n messages,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': this.anthropicVersion,\n ...this.customHeaders,\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Anthropic API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n const data = (await res.json()) as {\n content?: Array<{\n type?: string;\n text?: string;\n }>;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n };\n\n const textPart = data.content?.find((c) => c.type === 'text')?.text;\n if (!textPart) {\n throw new Error('Anthropic returned an empty text content');\n }\n\n return {\n text: textPart,\n usage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n }\n : undefined,\n };\n }\n\n /**\n * Token-level streaming via Anthropic's `stream: true` Messages API (STORA-515).\n * Parses the `content_block_delta` (`text_delta`) events for incremental text and the\n * `message_start`/`message_delta` events for usage accounting.\n */\n async *generateStream(\n params: AiProviderGenerateParams,\n ): AsyncGenerator<string, AiProviderGenerateResult, void> {\n const { systemPrompt, signal } = params;\n const url = `${this.baseUrl}/messages`;\n const messages = this.buildMessages(params);\n\n const body: Record<string, unknown> = {\n model: this.model,\n max_tokens: this.maxTokens,\n temperature: this.temperature,\n system: systemPrompt,\n messages,\n stream: true,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': this.anthropicVersion,\n ...this.customHeaders,\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Anthropic API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n if (!res.body) {\n throw new Error('Anthropic streaming response has no readable body');\n }\n\n let text = '';\n let promptTokens: number | undefined;\n let completionTokens: number | undefined;\n\n for await (const raw of readSseDataLines(res.body, signal)) {\n if (!raw) continue;\n\n let evt: {\n type?: string;\n delta?: { type?: string; text?: string };\n usage?: { output_tokens?: number };\n message?: { usage?: { input_tokens?: number } };\n };\n try {\n evt = JSON.parse(raw);\n } catch {\n continue;\n }\n\n if (evt.type === 'content_block_delta' && evt.delta?.type === 'text_delta') {\n const delta = evt.delta.text;\n if (typeof delta === 'string' && delta.length > 0) {\n text += delta;\n yield delta;\n }\n } else if (evt.type === 'message_start' && evt.message?.usage?.input_tokens !== undefined) {\n promptTokens = evt.message.usage.input_tokens;\n } else if (evt.type === 'message_delta' && evt.usage?.output_tokens !== undefined) {\n completionTokens = evt.usage.output_tokens;\n }\n }\n\n return {\n text,\n usage:\n promptTokens !== undefined || completionTokens !== undefined\n ? { promptTokens, completionTokens }\n : undefined,\n };\n }\n}\n","import type {\n AiProviderAdapter,\n AiProviderGenerateParams,\n AiProviderGenerateResult,\n} from '../../types';\nimport { getMessageText } from '../../core/messages';\n\nexport interface CustomHttpAdapterOptions {\n url: string;\n name?: string;\n headers?: Record<string, string>;\n formatRequestBody?: (params: AiProviderGenerateParams) => unknown;\n parseResponse?: (json: unknown) => string;\n}\n\nexport class CustomHttpAdapter implements AiProviderAdapter {\n readonly name: string;\n private url: string;\n private headers?: Record<string, string>;\n private formatRequestBody: (params: AiProviderGenerateParams) => unknown;\n private parseResponse: (json: unknown) => string;\n\n constructor(options: CustomHttpAdapterOptions) {\n if (!options.url) {\n throw new Error('CustomHttpAdapter requires a url');\n }\n this.url = options.url;\n this.name = options.name || 'custom-http';\n this.headers = options.headers;\n\n // Default body formatter (OpenAI compatible or Ollama chat compatible)\n this.formatRequestBody =\n options.formatRequestBody ||\n ((params) => ({\n messages:\n params.messages && params.messages.length > 0\n ? [\n { role: 'system', content: params.systemPrompt },\n ...params.messages.map((m) => ({ role: m.role, content: getMessageText(m) })),\n ]\n : [\n { role: 'system', content: params.systemPrompt },\n { role: 'user', content: params.userPrompt },\n ],\n }));\n\n // Default response parser\n this.parseResponse =\n options.parseResponse ||\n ((json: unknown) => {\n if (!json || typeof json !== 'object') {\n throw new Error('Response is not a valid JSON object');\n }\n const obj = json as Record<string, unknown>;\n if (typeof obj.response === 'string') return obj.response; // Ollama generate\n if (typeof obj.text === 'string') return obj.text;\n const choices = obj.choices as Array<{ message?: { content?: string } }>;\n if (Array.isArray(choices) && choices[0]?.message?.content) {\n return choices[0].message.content; // OpenAI format\n }\n const message = obj.message as { content?: string };\n if (message && typeof message.content === 'string') {\n return message.content; // Ollama chat format\n }\n throw new Error('Unable to extract generated text from custom HTTP response');\n });\n }\n\n async generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult> {\n const body = this.formatRequestBody(params);\n\n const res = await fetch(this.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.headers,\n },\n body: JSON.stringify(body),\n signal: params.signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Custom HTTP adapter error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n const json = await res.json();\n const text = this.parseResponse(json);\n\n return { text };\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/server/adapters/index.ts","../../../src/server/adapters/stream-utils.ts","../../../src/core/messages.ts","../../../src/server/adapters/gemini.ts","../../../src/server/adapters/openai.ts","../../../src/server/adapters/anthropic.ts","../../../src/server/adapters/custom.ts"],"sourcesContent":["export * from './base.js';\nexport * from './gemini.js';\nexport * from './openai.js';\nexport * from './anthropic.js';\nexport * from './custom.js';\n","/**\n * Shared SSE (server-sent events) frame reader for provider adapters that support\n * token-level streaming (STORA-515) — OpenAI, Anthropic and Gemini all expose their\n * streaming APIs as `data: <json>\\n\\n` frames, so every adapter reuses this single\n * low-level reader instead of re-implementing buffering/decoding three times.\n *\n * Yields the raw string payload of each `data:` line (already trimmed), in arrival\n * order. Callers are responsible for `JSON.parse`-ing (or ignoring sentinel values\n * like OpenAI's `[DONE]`) and for interpreting provider-specific event shapes.\n */\nexport async function* readSseDataLines(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<string, void, void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n if (signal?.aborted) {\n throw new Error('Streaming aborted by client');\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const frames = buffer.split('\\n\\n');\n buffer = frames.pop() || '';\n\n for (const frame of frames) {\n for (const line of frame.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.startsWith('data:')) {\n yield trimmed.slice(5).trim();\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n","import type { AiChatMessage, AiContentBlock, AiToolUseBlock, AiToolResultBlock } from '../types.js';\n\n/**\n * Flattens a message's content to plain text (STORA-530).\n *\n * `AiChatMessage.content` became `string | AiContentBlock[]` when tool calling landed;\n * every place that previously assumed a bare string (adapter message mapping, the chat\n * prompt's \"last user message\" lookup, chat UIs) goes through this helper instead of\n * re-implementing the narrowing. Tool-use/tool-result blocks contribute nothing to the\n * text rendering — they're transported separately by the adapters.\n */\nexport function getMessageText(message: Pick<AiChatMessage, 'content'>): string {\n if (typeof message.content === 'string') return message.content;\n return message.content\n .filter((block): block is Extract<AiContentBlock, { type: 'text' }> => block.type === 'text')\n .map((block) => block.text)\n .join('\\n');\n}\n\n/** All `tool_use` blocks carried by a message, in order. Empty for plain-text messages. */\nexport function getToolUseBlocks(message: Pick<AiChatMessage, 'content'>): AiToolUseBlock[] {\n if (typeof message.content === 'string') return [];\n return message.content.filter((b): b is AiToolUseBlock => b.type === 'tool_use');\n}\n\n/** All `tool_result` blocks carried by a message, in order. */\nexport function getToolResultBlocks(message: Pick<AiChatMessage, 'content'>): AiToolResultBlock[] {\n if (typeof message.content === 'string') return [];\n return message.content.filter((b): b is AiToolResultBlock => b.type === 'tool_result');\n}\n\n/** True when the message carries any non-text block — i.e. adapters must map it structurally. */\nexport function hasStructuredContent(message: Pick<AiChatMessage, 'content'>): boolean {\n return typeof message.content !== 'string' && message.content.some((b) => b.type !== 'text');\n}\n","import type {\n AiProviderAdapter,\n AiProviderGenerateParams,\n AiProviderGenerateResult,\n} from '../../types.js';\nimport { readSseDataLines } from './stream-utils.js';\nimport { getMessageText } from '../../core/messages.js';\n\nexport interface GeminiAdapterOptions {\n apiKey: string;\n model?: string;\n temperature?: number;\n baseUrl?: string;\n}\n\nexport class GeminiAdapter implements AiProviderAdapter {\n readonly name = 'gemini';\n private apiKey: string;\n private model: string;\n private temperature: number;\n private baseUrl: string;\n\n constructor(options: GeminiAdapterOptions) {\n if (!options.apiKey) {\n throw new Error('GeminiAdapter requires an apiKey');\n }\n this.apiKey = options.apiKey;\n this.model = options.model || 'gemini-2.5-flash';\n this.temperature = options.temperature ?? 0.4;\n this.baseUrl =\n options.baseUrl || 'https://generativelanguage.googleapis.com/v1beta';\n }\n\n private buildContents(\n params: AiProviderGenerateParams,\n ): Array<{ role: string; parts: Array<{ text: string }> }> {\n const { userPrompt, messages: chatMessages } = params;\n return chatMessages && chatMessages.length > 0\n ? chatMessages.map((m) => ({\n role: m.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: getMessageText(m) }],\n }))\n : [\n {\n role: 'user',\n parts: [{ text: userPrompt }],\n },\n ];\n }\n\n async generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult> {\n const { systemPrompt, messages: chatMessages, signal } = params;\n\n const url = `${this.baseUrl}/models/${encodeURIComponent(this.model)}:generateContent?key=${encodeURIComponent(this.apiKey)}`;\n const contents = this.buildContents(params);\n\n const generationConfig: Record<string, unknown> = {\n temperature: this.temperature,\n };\n\n if (params.jsonSchema || (!chatMessages && (systemPrompt.includes('JSON') || systemPrompt.includes('json')))) {\n generationConfig.responseMimeType = 'application/json';\n }\n\n const body: Record<string, unknown> = {\n system_instruction: {\n parts: [{ text: systemPrompt }],\n },\n contents,\n generationConfig,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Gemini API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n const data = (await res.json()) as {\n candidates?: Array<{\n content?: {\n parts?: Array<{ text?: string }>;\n };\n }>;\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n };\n };\n\n const candidateText = data.candidates?.[0]?.content?.parts?.[0]?.text;\n if (!candidateText) {\n throw new Error('Gemini returned an empty or invalid candidate response');\n }\n\n return {\n text: candidateText,\n usage: data.usageMetadata\n ? {\n promptTokens: data.usageMetadata.promptTokenCount,\n completionTokens: data.usageMetadata.candidatesTokenCount,\n }\n : undefined,\n };\n }\n\n /**\n * Token-level streaming via Gemini's `streamGenerateContent` SSE endpoint (STORA-515).\n */\n async *generateStream(\n params: AiProviderGenerateParams,\n ): AsyncGenerator<string, AiProviderGenerateResult, void> {\n const { systemPrompt, signal } = params;\n const url = `${this.baseUrl}/models/${encodeURIComponent(this.model)}:streamGenerateContent?alt=sse&key=${encodeURIComponent(this.apiKey)}`;\n const contents = this.buildContents(params);\n\n const generationConfig: Record<string, unknown> = {\n temperature: this.temperature,\n };\n\n const body: Record<string, unknown> = {\n system_instruction: {\n parts: [{ text: systemPrompt }],\n },\n contents,\n generationConfig,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Gemini API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n if (!res.body) {\n throw new Error('Gemini streaming response has no readable body');\n }\n\n let text = '';\n let usage: AiProviderGenerateResult['usage'];\n\n for await (const raw of readSseDataLines(res.body, signal)) {\n let parsed: {\n candidates?: Array<{ content?: { parts?: Array<{ text?: string }> } }>;\n usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number };\n };\n try {\n parsed = JSON.parse(raw);\n } catch {\n continue;\n }\n\n const delta = parsed.candidates?.[0]?.content?.parts?.[0]?.text;\n if (typeof delta === 'string' && delta.length > 0) {\n text += delta;\n yield delta;\n }\n\n if (parsed.usageMetadata) {\n usage = {\n promptTokens: parsed.usageMetadata.promptTokenCount,\n completionTokens: parsed.usageMetadata.candidatesTokenCount,\n };\n }\n }\n\n return { text, usage };\n }\n}\n","import type {\n AiChatMessage,\n AiProviderAdapter,\n AiProviderGenerateParams,\n AiProviderGenerateResult,\n AiStopReason,\n AiToolUseBlock,\n} from '../../types.js';\nimport { getMessageText, getToolResultBlocks, getToolUseBlocks } from '../../core/messages.js';\nimport { readSseDataLines } from './stream-utils.js';\n\nexport interface OpenAiAdapterOptions {\n apiKey: string;\n model?: string;\n temperature?: number;\n baseUrl?: string;\n headers?: Record<string, string>;\n}\n\n/** OpenAI Chat Completions message shape — `tool_calls`/`role: 'tool'` included. */\ninterface OpenAiMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }>;\n tool_call_id?: string;\n}\n\ninterface OpenAiToolCallPayload {\n id?: string;\n type?: string;\n function?: { name?: string; arguments?: string };\n}\n\n/**\n * Maps OpenAI's `finish_reason` onto the provider-agnostic `AiStopReason` the agent loop\n * branches on (STORA-530).\n */\nfunction mapStopReason(finishReason: string | undefined | null): AiStopReason {\n switch (finishReason) {\n case 'stop':\n return 'stop';\n case 'tool_calls':\n case 'function_call':\n return 'tool_calls';\n case 'length':\n return 'length';\n case 'content_filter':\n return 'content_filter';\n default:\n return 'unknown';\n }\n}\n\n/**\n * Parses OpenAI `tool_calls` into `AiToolUseBlock`s. A call whose `arguments` isn't valid\n * JSON is surfaced with an empty `input` rather than throwing: the agent's tool executor\n * then rejects it with a `tool_result` error and the model self-corrects on the next step,\n * which is far better than killing the whole run over one malformed argument blob.\n */\nfunction parseToolCalls(raw: OpenAiToolCallPayload[] | undefined): AiToolUseBlock[] {\n if (!Array.isArray(raw) || raw.length === 0) return [];\n return raw\n .filter((call) => call?.function?.name)\n .map((call, index) => {\n let input: Record<string, unknown> = {};\n const argsText = call.function?.arguments;\n if (argsText && argsText.trim()) {\n try {\n const parsed = JSON.parse(argsText);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n input = parsed as Record<string, unknown>;\n }\n } catch {\n input = {};\n }\n }\n return {\n type: 'tool_use' as const,\n id: call.id || `call_${index}`,\n name: call.function!.name!,\n input,\n };\n });\n}\n\nexport class OpenAiAdapter implements AiProviderAdapter {\n readonly name = 'openai';\n readonly supportsTools = true;\n private apiKey: string;\n private model: string;\n private temperature: number;\n private baseUrl: string;\n private customHeaders?: Record<string, string>;\n\n constructor(options: OpenAiAdapterOptions) {\n if (!options.apiKey) {\n throw new Error('OpenAiAdapter requires an apiKey');\n }\n this.apiKey = options.apiKey;\n this.model = options.model || 'gpt-4o';\n this.temperature = options.temperature ?? 0.4;\n this.baseUrl = (options.baseUrl || 'https://api.openai.com/v1').replace(/\\/+$/, '');\n this.customHeaders = options.headers;\n }\n\n /**\n * Expands one `AiChatMessage` into the one-or-more OpenAI messages it corresponds to\n * (STORA-530).\n *\n * The block model is Anthropic-shaped — tool results ride along inside a `user` message —\n * while OpenAI wants each result as its own `role: 'tool'` message keyed by\n * `tool_call_id`. That fan-out happens here so the rest of the stack stays\n * provider-agnostic.\n */\n private mapMessage(message: AiChatMessage): OpenAiMessage[] {\n const toolUses = getToolUseBlocks(message);\n const toolResults = getToolResultBlocks(message);\n const text = getMessageText(message);\n\n if (toolResults.length > 0) {\n const results: OpenAiMessage[] = toolResults.map((block) => ({\n role: 'tool',\n content: block.content,\n tool_call_id: block.toolUseId,\n }));\n // Any free text riding alongside tool results becomes a separate user turn — OpenAI\n // rejects a `role: 'tool'` message that carries anything but the result payload.\n if (text.trim()) {\n results.push({ role: 'user', content: text });\n }\n return results;\n }\n\n if (toolUses.length > 0) {\n return [\n {\n role: 'assistant',\n content: text.trim() ? text : null,\n tool_calls: toolUses.map((block) => ({\n id: block.id,\n type: 'function' as const,\n function: {\n name: block.name,\n arguments: JSON.stringify(block.input ?? {}),\n },\n })),\n },\n ];\n }\n\n return [{ role: message.role, content: text }];\n }\n\n private buildMessages(params: AiProviderGenerateParams): OpenAiMessage[] {\n const { systemPrompt, userPrompt, messages: chatMessages } = params;\n if (chatMessages && chatMessages.length > 0) {\n return [\n { role: 'system', content: systemPrompt },\n ...chatMessages.flatMap((m) => this.mapMessage(m)),\n ];\n }\n return [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ];\n }\n\n /**\n * Shared request body builder for `generate`/`generateStream` — notably the\n * `response_format` decision, which must never fire in tool mode: OpenAI rejects\n * `json_object` combined with `tools`, and a tool-calling turn's text output is a\n * natural-language summary, not JSON.\n */\n private buildBody(params: AiProviderGenerateParams): Record<string, unknown> {\n const { systemPrompt, jsonSchema, messages: chatMessages, tools, toolChoice } = params;\n\n const body: Record<string, unknown> = {\n model: this.model,\n temperature: params.temperature ?? this.temperature,\n messages: this.buildMessages(params),\n };\n\n if (tools && tools.length > 0) {\n body.tools = tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n if (toolChoice) {\n body.tool_choice =\n typeof toolChoice === 'string'\n ? toolChoice\n : { type: 'function', function: { name: toolChoice.name } };\n }\n return body;\n }\n\n // Only force json_object when JSON schema is provided or specifically requested,\n // allowing natural conversation text in chat mode.\n if (jsonSchema || (!chatMessages && (systemPrompt.includes('JSON') || systemPrompt.includes('json')))) {\n body.response_format = { type: 'json_object' };\n }\n\n return body;\n }\n\n private async post(body: Record<string, unknown>, signal?: AbortSignal): Promise<Response> {\n const res = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n ...this.customHeaders,\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `OpenAI API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n return res;\n }\n\n async generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult> {\n const res = await this.post(this.buildBody(params), params.signal);\n\n const data = (await res.json()) as {\n choices?: Array<{\n finish_reason?: string;\n message?: {\n content?: string;\n tool_calls?: OpenAiToolCallPayload[];\n };\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n };\n };\n\n const choice = data.choices?.[0];\n const content = choice?.message?.content;\n const toolCalls = parseToolCalls(choice?.message?.tool_calls);\n\n // A tool-calling turn legitimately has null content — only a turn with neither text\n // nor tool calls is an empty response worth throwing over.\n if (!content && toolCalls.length === 0) {\n throw new Error('OpenAI returned an empty message content');\n }\n\n return {\n text: content || '',\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n stopReason: mapStopReason(choice?.finish_reason),\n usage: data.usage\n ? {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n }\n : undefined,\n };\n }\n\n /**\n * Token-level streaming via OpenAI's `stream: true` chat completions mode (STORA-515).\n * Yields each `delta.content` fragment as it arrives and returns the fully assembled\n * text + usage (when the final chunk includes it) once the stream ends.\n *\n * Tool calls arrive fragmented too (STORA-530): `delta.tool_calls[].function.arguments`\n * is delivered as a character stream across many chunks, keyed by array `index`. They're\n * accumulated per index and parsed only once the stream ends — parsing a partial\n * arguments string would always fail. Tool call deltas are never `yield`ed as text,\n * since they aren't part of the assistant's visible message.\n */\n async *generateStream(\n params: AiProviderGenerateParams,\n ): AsyncGenerator<string, AiProviderGenerateResult, void> {\n const { signal } = params;\n const res = await this.post({ ...this.buildBody(params), stream: true }, signal);\n\n if (!res.body) {\n throw new Error('OpenAI streaming response has no readable body');\n }\n\n let text = '';\n let usage: AiProviderGenerateResult['usage'];\n let finishReason: string | undefined;\n const toolCallAccumulator = new Map<number, { id: string; name: string; arguments: string }>();\n\n for await (const raw of readSseDataLines(res.body, signal)) {\n if (raw === '[DONE]') break;\n\n let parsed: {\n choices?: Array<{\n finish_reason?: string;\n delta?: {\n content?: string;\n tool_calls?: Array<OpenAiToolCallPayload & { index?: number }>;\n };\n }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number };\n };\n try {\n parsed = JSON.parse(raw);\n } catch {\n continue;\n }\n\n const choice = parsed.choices?.[0];\n\n const delta = choice?.delta?.content;\n if (typeof delta === 'string' && delta.length > 0) {\n text += delta;\n yield delta;\n }\n\n for (const call of choice?.delta?.tool_calls ?? []) {\n const index = typeof call.index === 'number' ? call.index : 0;\n const entry = toolCallAccumulator.get(index) ?? { id: '', name: '', arguments: '' };\n if (call.id) entry.id = call.id;\n if (call.function?.name) entry.name = call.function.name;\n if (call.function?.arguments) entry.arguments += call.function.arguments;\n toolCallAccumulator.set(index, entry);\n }\n\n if (choice?.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n if (parsed.usage) {\n usage = {\n promptTokens: parsed.usage.prompt_tokens,\n completionTokens: parsed.usage.completion_tokens,\n };\n }\n }\n\n const toolCalls = parseToolCalls(\n Array.from(toolCallAccumulator.entries())\n .sort(([a], [b]) => a - b)\n .map(([, entry]) => ({\n id: entry.id,\n type: 'function',\n function: { name: entry.name, arguments: entry.arguments },\n })),\n );\n\n return {\n text,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n stopReason: mapStopReason(finishReason),\n usage,\n };\n }\n}\n","import type {\n AiProviderAdapter,\n AiProviderGenerateParams,\n AiProviderGenerateResult,\n} from '../../types.js';\nimport { readSseDataLines } from './stream-utils.js';\nimport { getMessageText } from '../../core/messages.js';\n\nexport interface AnthropicAdapterOptions {\n apiKey: string;\n model?: string;\n maxTokens?: number;\n temperature?: number;\n baseUrl?: string;\n anthropicVersion?: string;\n headers?: Record<string, string>;\n}\n\nexport class AnthropicAdapter implements AiProviderAdapter {\n readonly name = 'anthropic';\n private apiKey: string;\n private model: string;\n private maxTokens: number;\n private temperature: number;\n private baseUrl: string;\n private anthropicVersion: string;\n private customHeaders?: Record<string, string>;\n\n constructor(options: AnthropicAdapterOptions) {\n if (!options.apiKey) {\n throw new Error('AnthropicAdapter requires an apiKey');\n }\n this.apiKey = options.apiKey;\n this.model = options.model || 'claude-3-5-sonnet-20241022';\n this.maxTokens = options.maxTokens ?? 4096;\n this.temperature = options.temperature ?? 0.4;\n this.baseUrl = (options.baseUrl || 'https://api.anthropic.com/v1').replace(/\\/+$/, '');\n this.anthropicVersion = options.anthropicVersion || '2023-06-01';\n this.customHeaders = options.headers;\n }\n\n private buildMessages(\n params: AiProviderGenerateParams,\n ): Array<{ role: 'user' | 'assistant'; content: string }> {\n const { userPrompt, messages: chatMessages } = params;\n return chatMessages && chatMessages.length > 0\n ? chatMessages\n .filter((m) => m.role === 'user' || m.role === 'assistant')\n .map((m) => ({ role: m.role as 'user' | 'assistant', content: getMessageText(m) }))\n : [\n {\n role: 'user' as const,\n content: userPrompt,\n },\n ];\n }\n\n async generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult> {\n const { systemPrompt, signal } = params;\n\n const url = `${this.baseUrl}/messages`;\n const messages = this.buildMessages(params);\n\n const body: Record<string, unknown> = {\n model: this.model,\n max_tokens: this.maxTokens,\n temperature: this.temperature,\n system: systemPrompt,\n messages,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': this.anthropicVersion,\n ...this.customHeaders,\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Anthropic API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n const data = (await res.json()) as {\n content?: Array<{\n type?: string;\n text?: string;\n }>;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n };\n\n const textPart = data.content?.find((c) => c.type === 'text')?.text;\n if (!textPart) {\n throw new Error('Anthropic returned an empty text content');\n }\n\n return {\n text: textPart,\n usage: data.usage\n ? {\n promptTokens: data.usage.input_tokens,\n completionTokens: data.usage.output_tokens,\n }\n : undefined,\n };\n }\n\n /**\n * Token-level streaming via Anthropic's `stream: true` Messages API (STORA-515).\n * Parses the `content_block_delta` (`text_delta`) events for incremental text and the\n * `message_start`/`message_delta` events for usage accounting.\n */\n async *generateStream(\n params: AiProviderGenerateParams,\n ): AsyncGenerator<string, AiProviderGenerateResult, void> {\n const { systemPrompt, signal } = params;\n const url = `${this.baseUrl}/messages`;\n const messages = this.buildMessages(params);\n\n const body: Record<string, unknown> = {\n model: this.model,\n max_tokens: this.maxTokens,\n temperature: this.temperature,\n system: systemPrompt,\n messages,\n stream: true,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': this.anthropicVersion,\n ...this.customHeaders,\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Anthropic API error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n if (!res.body) {\n throw new Error('Anthropic streaming response has no readable body');\n }\n\n let text = '';\n let promptTokens: number | undefined;\n let completionTokens: number | undefined;\n\n for await (const raw of readSseDataLines(res.body, signal)) {\n if (!raw) continue;\n\n let evt: {\n type?: string;\n delta?: { type?: string; text?: string };\n usage?: { output_tokens?: number };\n message?: { usage?: { input_tokens?: number } };\n };\n try {\n evt = JSON.parse(raw);\n } catch {\n continue;\n }\n\n if (evt.type === 'content_block_delta' && evt.delta?.type === 'text_delta') {\n const delta = evt.delta.text;\n if (typeof delta === 'string' && delta.length > 0) {\n text += delta;\n yield delta;\n }\n } else if (evt.type === 'message_start' && evt.message?.usage?.input_tokens !== undefined) {\n promptTokens = evt.message.usage.input_tokens;\n } else if (evt.type === 'message_delta' && evt.usage?.output_tokens !== undefined) {\n completionTokens = evt.usage.output_tokens;\n }\n }\n\n return {\n text,\n usage:\n promptTokens !== undefined || completionTokens !== undefined\n ? { promptTokens, completionTokens }\n : undefined,\n };\n }\n}\n","import type {\n AiProviderAdapter,\n AiProviderGenerateParams,\n AiProviderGenerateResult,\n} from '../../types.js';\nimport { getMessageText } from '../../core/messages.js';\n\nexport interface CustomHttpAdapterOptions {\n url: string;\n name?: string;\n headers?: Record<string, string>;\n formatRequestBody?: (params: AiProviderGenerateParams) => unknown;\n parseResponse?: (json: unknown) => string;\n}\n\nexport class CustomHttpAdapter implements AiProviderAdapter {\n readonly name: string;\n private url: string;\n private headers?: Record<string, string>;\n private formatRequestBody: (params: AiProviderGenerateParams) => unknown;\n private parseResponse: (json: unknown) => string;\n\n constructor(options: CustomHttpAdapterOptions) {\n if (!options.url) {\n throw new Error('CustomHttpAdapter requires a url');\n }\n this.url = options.url;\n this.name = options.name || 'custom-http';\n this.headers = options.headers;\n\n // Default body formatter (OpenAI compatible or Ollama chat compatible)\n this.formatRequestBody =\n options.formatRequestBody ||\n ((params) => ({\n messages:\n params.messages && params.messages.length > 0\n ? [\n { role: 'system', content: params.systemPrompt },\n ...params.messages.map((m) => ({ role: m.role, content: getMessageText(m) })),\n ]\n : [\n { role: 'system', content: params.systemPrompt },\n { role: 'user', content: params.userPrompt },\n ],\n }));\n\n // Default response parser\n this.parseResponse =\n options.parseResponse ||\n ((json: unknown) => {\n if (!json || typeof json !== 'object') {\n throw new Error('Response is not a valid JSON object');\n }\n const obj = json as Record<string, unknown>;\n if (typeof obj.response === 'string') return obj.response; // Ollama generate\n if (typeof obj.text === 'string') return obj.text;\n const choices = obj.choices as Array<{ message?: { content?: string } }>;\n if (Array.isArray(choices) && choices[0]?.message?.content) {\n return choices[0].message.content; // OpenAI format\n }\n const message = obj.message as { content?: string };\n if (message && typeof message.content === 'string') {\n return message.content; // Ollama chat format\n }\n throw new Error('Unable to extract generated text from custom HTTP response');\n });\n }\n\n async generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult> {\n const body = this.formatRequestBody(params);\n\n const res = await fetch(this.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.headers,\n },\n body: JSON.stringify(body),\n signal: params.signal,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n throw new Error(\n `Custom HTTP adapter error [${res.status} ${res.statusText}]: ${errText || 'Unknown error'}`,\n );\n }\n\n const json = await res.json();\n const text = this.parseResponse(json);\n\n return { text };\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,6 @@
1
+ export * from './base.cjs';
2
+ export * from './gemini.cjs';
3
+ export * from './openai.cjs';
4
+ export * from './anthropic.cjs';
5
+ export * from './custom.cjs';
6
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/server/adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
@@ -1,6 +1,6 @@
1
- export * from './base';
2
- export * from './gemini';
3
- export * from './openai';
4
- export * from './anthropic';
5
- export * from './custom';
1
+ export * from './base.js';
2
+ export * from './gemini.js';
3
+ export * from './openai.js';
4
+ export * from './anthropic.js';
5
+ export * from './custom.js';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
@@ -3,8 +3,8 @@ import {
3
3
  CustomHttpAdapter,
4
4
  GeminiAdapter,
5
5
  OpenAiAdapter
6
- } from "../../chunk-3DRAVYU3.js";
7
- import "../../chunk-ILLNRABB.js";
6
+ } from "../../chunk-BNGDJQ73.js";
7
+ import "../../chunk-LBSLMWKD.js";
8
8
  export {
9
9
  AnthropicAdapter,
10
10
  CustomHttpAdapter,
@@ -0,0 +1,51 @@
1
+ import type { AiProviderAdapter, AiProviderGenerateParams, AiProviderGenerateResult } from '../../types.cjs';
2
+ export interface OpenAiAdapterOptions {
3
+ apiKey: string;
4
+ model?: string;
5
+ temperature?: number;
6
+ baseUrl?: string;
7
+ headers?: Record<string, string>;
8
+ }
9
+ export declare class OpenAiAdapter implements AiProviderAdapter {
10
+ readonly name = "openai";
11
+ readonly supportsTools = true;
12
+ private apiKey;
13
+ private model;
14
+ private temperature;
15
+ private baseUrl;
16
+ private customHeaders?;
17
+ constructor(options: OpenAiAdapterOptions);
18
+ /**
19
+ * Expands one `AiChatMessage` into the one-or-more OpenAI messages it corresponds to
20
+ * (STORA-530).
21
+ *
22
+ * The block model is Anthropic-shaped — tool results ride along inside a `user` message —
23
+ * while OpenAI wants each result as its own `role: 'tool'` message keyed by
24
+ * `tool_call_id`. That fan-out happens here so the rest of the stack stays
25
+ * provider-agnostic.
26
+ */
27
+ private mapMessage;
28
+ private buildMessages;
29
+ /**
30
+ * Shared request body builder for `generate`/`generateStream` — notably the
31
+ * `response_format` decision, which must never fire in tool mode: OpenAI rejects
32
+ * `json_object` combined with `tools`, and a tool-calling turn's text output is a
33
+ * natural-language summary, not JSON.
34
+ */
35
+ private buildBody;
36
+ private post;
37
+ generate(params: AiProviderGenerateParams): Promise<AiProviderGenerateResult>;
38
+ /**
39
+ * Token-level streaming via OpenAI's `stream: true` chat completions mode (STORA-515).
40
+ * Yields each `delta.content` fragment as it arrives and returns the fully assembled
41
+ * text + usage (when the final chunk includes it) once the stream ends.
42
+ *
43
+ * Tool calls arrive fragmented too (STORA-530): `delta.tool_calls[].function.arguments`
44
+ * is delivered as a character stream across many chunks, keyed by array `index`. They're
45
+ * accumulated per index and parsed only once the stream ends — parsing a partial
46
+ * arguments string would always fail. Tool call deltas are never `yield`ed as text,
47
+ * since they aren't part of the assistant's visible message.
48
+ */
49
+ generateStream(params: AiProviderGenerateParams): AsyncGenerator<string, AiProviderGenerateResult, void>;
50
+ }
51
+ //# sourceMappingURL=openai.d.cts.map