@diyor28/context 1.0.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 (280) hide show
  1. package/README.md +270 -0
  2. package/dist/__tests__/attachment-selector.test.d.ts +11 -0
  3. package/dist/__tests__/attachment-selector.test.d.ts.map +1 -0
  4. package/dist/__tests__/attachment-selector.test.js +449 -0
  5. package/dist/__tests__/attachment-selector.test.js.map +1 -0
  6. package/dist/__tests__/cache-breakpoints.test.d.ts +11 -0
  7. package/dist/__tests__/cache-breakpoints.test.d.ts.map +1 -0
  8. package/dist/__tests__/cache-breakpoints.test.js +398 -0
  9. package/dist/__tests__/cache-breakpoints.test.js.map +1 -0
  10. package/dist/__tests__/codecs.test.d.ts +7 -0
  11. package/dist/__tests__/codecs.test.d.ts.map +1 -0
  12. package/dist/__tests__/codecs.test.js +331 -0
  13. package/dist/__tests__/codecs.test.js.map +1 -0
  14. package/dist/__tests__/compactor.test.d.ts +11 -0
  15. package/dist/__tests__/compactor.test.d.ts.map +1 -0
  16. package/dist/__tests__/compactor.test.js +519 -0
  17. package/dist/__tests__/compactor.test.js.map +1 -0
  18. package/dist/__tests__/context-graph.test.d.ts +7 -0
  19. package/dist/__tests__/context-graph.test.d.ts.map +1 -0
  20. package/dist/__tests__/context-graph.test.js +262 -0
  21. package/dist/__tests__/context-graph.test.js.map +1 -0
  22. package/dist/__tests__/hash.test.d.ts +7 -0
  23. package/dist/__tests__/hash.test.d.ts.map +1 -0
  24. package/dist/__tests__/hash.test.js +228 -0
  25. package/dist/__tests__/hash.test.js.map +1 -0
  26. package/dist/__tests__/integration.test.d.ts +15 -0
  27. package/dist/__tests__/integration.test.d.ts.map +1 -0
  28. package/dist/__tests__/integration.test.js +728 -0
  29. package/dist/__tests__/integration.test.js.map +1 -0
  30. package/dist/__tests__/kind-order.test.d.ts +7 -0
  31. package/dist/__tests__/kind-order.test.d.ts.map +1 -0
  32. package/dist/__tests__/kind-order.test.js +243 -0
  33. package/dist/__tests__/kind-order.test.js.map +1 -0
  34. package/dist/__tests__/phase2-integration.test.d.ts +5 -0
  35. package/dist/__tests__/phase2-integration.test.d.ts.map +1 -0
  36. package/dist/__tests__/phase2-integration.test.js +222 -0
  37. package/dist/__tests__/phase2-integration.test.js.map +1 -0
  38. package/dist/__tests__/queries.test.d.ts +7 -0
  39. package/dist/__tests__/queries.test.d.ts.map +1 -0
  40. package/dist/__tests__/queries.test.js +254 -0
  41. package/dist/__tests__/queries.test.js.map +1 -0
  42. package/dist/__tests__/token-estimator.test.d.ts +7 -0
  43. package/dist/__tests__/token-estimator.test.d.ts.map +1 -0
  44. package/dist/__tests__/token-estimator.test.js +267 -0
  45. package/dist/__tests__/token-estimator.test.js.map +1 -0
  46. package/dist/adapters/anthropic-estimator.d.ts +38 -0
  47. package/dist/adapters/anthropic-estimator.d.ts.map +1 -0
  48. package/dist/adapters/anthropic-estimator.js +108 -0
  49. package/dist/adapters/anthropic-estimator.js.map +1 -0
  50. package/dist/adapters/attachment-resolver.d.ts +96 -0
  51. package/dist/adapters/attachment-resolver.d.ts.map +1 -0
  52. package/dist/adapters/attachment-resolver.js +176 -0
  53. package/dist/adapters/attachment-resolver.js.map +1 -0
  54. package/dist/adapters/attachment-selector.d.ts +59 -0
  55. package/dist/adapters/attachment-selector.d.ts.map +1 -0
  56. package/dist/adapters/attachment-selector.js +163 -0
  57. package/dist/adapters/attachment-selector.js.map +1 -0
  58. package/dist/adapters/gemini-estimator.d.ts +27 -0
  59. package/dist/adapters/gemini-estimator.d.ts.map +1 -0
  60. package/dist/adapters/gemini-estimator.js +80 -0
  61. package/dist/adapters/gemini-estimator.js.map +1 -0
  62. package/dist/adapters/index.d.ts +12 -0
  63. package/dist/adapters/index.d.ts.map +1 -0
  64. package/dist/adapters/index.js +28 -0
  65. package/dist/adapters/index.js.map +1 -0
  66. package/dist/adapters/memory-store.d.ts +139 -0
  67. package/dist/adapters/memory-store.d.ts.map +1 -0
  68. package/dist/adapters/memory-store.js +187 -0
  69. package/dist/adapters/memory-store.js.map +1 -0
  70. package/dist/adapters/openai-estimator.d.ts +35 -0
  71. package/dist/adapters/openai-estimator.d.ts.map +1 -0
  72. package/dist/adapters/openai-estimator.js +89 -0
  73. package/dist/adapters/openai-estimator.js.map +1 -0
  74. package/dist/adapters/summarizer.d.ts +121 -0
  75. package/dist/adapters/summarizer.d.ts.map +1 -0
  76. package/dist/adapters/summarizer.js +121 -0
  77. package/dist/adapters/summarizer.js.map +1 -0
  78. package/dist/adapters/token-estimator.d.ts +63 -0
  79. package/dist/adapters/token-estimator.d.ts.map +1 -0
  80. package/dist/adapters/token-estimator.js +37 -0
  81. package/dist/adapters/token-estimator.js.map +1 -0
  82. package/dist/builder/context-builder.d.ts +186 -0
  83. package/dist/builder/context-builder.d.ts.map +1 -0
  84. package/dist/builder/context-builder.js +305 -0
  85. package/dist/builder/context-builder.js.map +1 -0
  86. package/dist/builder/context-fork.d.ts +166 -0
  87. package/dist/builder/context-fork.d.ts.map +1 -0
  88. package/dist/builder/context-fork.js +282 -0
  89. package/dist/builder/context-fork.js.map +1 -0
  90. package/dist/builder/index.d.ts +6 -0
  91. package/dist/builder/index.d.ts.map +1 -0
  92. package/dist/builder/index.js +22 -0
  93. package/dist/builder/index.js.map +1 -0
  94. package/dist/codecs/base.d.ts +18 -0
  95. package/dist/codecs/base.d.ts.map +1 -0
  96. package/dist/codecs/base.js +39 -0
  97. package/dist/codecs/base.js.map +1 -0
  98. package/dist/codecs/conversation-history.codec.d.ts +81 -0
  99. package/dist/codecs/conversation-history.codec.d.ts.map +1 -0
  100. package/dist/codecs/conversation-history.codec.js +89 -0
  101. package/dist/codecs/conversation-history.codec.js.map +1 -0
  102. package/dist/codecs/index.d.ts +31 -0
  103. package/dist/codecs/index.d.ts.map +1 -0
  104. package/dist/codecs/index.js +71 -0
  105. package/dist/codecs/index.js.map +1 -0
  106. package/dist/codecs/redacted-stub.codec.d.ts +32 -0
  107. package/dist/codecs/redacted-stub.codec.d.ts.map +1 -0
  108. package/dist/codecs/redacted-stub.codec.js +64 -0
  109. package/dist/codecs/redacted-stub.codec.js.map +1 -0
  110. package/dist/codecs/structured-reference.codec.d.ts +40 -0
  111. package/dist/codecs/structured-reference.codec.d.ts.map +1 -0
  112. package/dist/codecs/structured-reference.codec.js +81 -0
  113. package/dist/codecs/structured-reference.codec.js.map +1 -0
  114. package/dist/codecs/system-rules.codec.d.ts +32 -0
  115. package/dist/codecs/system-rules.codec.d.ts.map +1 -0
  116. package/dist/codecs/system-rules.codec.js +62 -0
  117. package/dist/codecs/system-rules.codec.js.map +1 -0
  118. package/dist/codecs/tool-output.codec.d.ts +66 -0
  119. package/dist/codecs/tool-output.codec.d.ts.map +1 -0
  120. package/dist/codecs/tool-output.codec.js +95 -0
  121. package/dist/codecs/tool-output.codec.js.map +1 -0
  122. package/dist/codecs/tool-schema.codec.d.ts +36 -0
  123. package/dist/codecs/tool-schema.codec.d.ts.map +1 -0
  124. package/dist/codecs/tool-schema.codec.js +74 -0
  125. package/dist/codecs/tool-schema.codec.js.map +1 -0
  126. package/dist/codecs/unsafe-text.codec.d.ts +28 -0
  127. package/dist/codecs/unsafe-text.codec.d.ts.map +1 -0
  128. package/dist/codecs/unsafe-text.codec.js +63 -0
  129. package/dist/codecs/unsafe-text.codec.js.map +1 -0
  130. package/dist/graph/context-graph.d.ts +121 -0
  131. package/dist/graph/context-graph.d.ts.map +1 -0
  132. package/dist/graph/context-graph.js +166 -0
  133. package/dist/graph/context-graph.js.map +1 -0
  134. package/dist/graph/index.d.ts +8 -0
  135. package/dist/graph/index.d.ts.map +1 -0
  136. package/dist/graph/index.js +24 -0
  137. package/dist/graph/index.js.map +1 -0
  138. package/dist/graph/kind-order.d.ts +60 -0
  139. package/dist/graph/kind-order.d.ts.map +1 -0
  140. package/dist/graph/kind-order.js +113 -0
  141. package/dist/graph/kind-order.js.map +1 -0
  142. package/dist/graph/queries.d.ts +68 -0
  143. package/dist/graph/queries.d.ts.map +1 -0
  144. package/dist/graph/queries.js +240 -0
  145. package/dist/graph/queries.js.map +1 -0
  146. package/dist/graph/views.d.ts +90 -0
  147. package/dist/graph/views.d.ts.map +1 -0
  148. package/dist/graph/views.js +173 -0
  149. package/dist/graph/views.js.map +1 -0
  150. package/dist/index.d.ts +16 -0
  151. package/dist/index.d.ts.map +1 -0
  152. package/dist/index.js +40 -0
  153. package/dist/index.js.map +1 -0
  154. package/dist/pipeline/compactor.d.ts +128 -0
  155. package/dist/pipeline/compactor.d.ts.map +1 -0
  156. package/dist/pipeline/compactor.js +346 -0
  157. package/dist/pipeline/compactor.js.map +1 -0
  158. package/dist/pipeline/index.d.ts +6 -0
  159. package/dist/pipeline/index.d.ts.map +1 -0
  160. package/dist/pipeline/index.js +22 -0
  161. package/dist/pipeline/index.js.map +1 -0
  162. package/dist/pipeline/summarizer.d.ts +18 -0
  163. package/dist/pipeline/summarizer.d.ts.map +1 -0
  164. package/dist/pipeline/summarizer.js +68 -0
  165. package/dist/pipeline/summarizer.js.map +1 -0
  166. package/dist/policies/default-policy.d.ts +29 -0
  167. package/dist/policies/default-policy.d.ts.map +1 -0
  168. package/dist/policies/default-policy.js +58 -0
  169. package/dist/policies/default-policy.js.map +1 -0
  170. package/dist/policies/index.d.ts +5 -0
  171. package/dist/policies/index.d.ts.map +1 -0
  172. package/dist/policies/index.js +21 -0
  173. package/dist/policies/index.js.map +1 -0
  174. package/dist/providers/anthropic-compiler.d.ts +58 -0
  175. package/dist/providers/anthropic-compiler.d.ts.map +1 -0
  176. package/dist/providers/anthropic-compiler.js +182 -0
  177. package/dist/providers/anthropic-compiler.js.map +1 -0
  178. package/dist/providers/capabilities.d.ts +54 -0
  179. package/dist/providers/capabilities.d.ts.map +1 -0
  180. package/dist/providers/capabilities.js +87 -0
  181. package/dist/providers/capabilities.js.map +1 -0
  182. package/dist/providers/gemini-compiler.d.ts +51 -0
  183. package/dist/providers/gemini-compiler.d.ts.map +1 -0
  184. package/dist/providers/gemini-compiler.js +206 -0
  185. package/dist/providers/gemini-compiler.js.map +1 -0
  186. package/dist/providers/index.d.ts +8 -0
  187. package/dist/providers/index.d.ts.map +1 -0
  188. package/dist/providers/index.js +24 -0
  189. package/dist/providers/index.js.map +1 -0
  190. package/dist/providers/openai-compiler.d.ts +46 -0
  191. package/dist/providers/openai-compiler.d.ts.map +1 -0
  192. package/dist/providers/openai-compiler.js +149 -0
  193. package/dist/providers/openai-compiler.js.map +1 -0
  194. package/dist/types/attachment.d.ts +62 -0
  195. package/dist/types/attachment.d.ts.map +1 -0
  196. package/dist/types/attachment.js +6 -0
  197. package/dist/types/attachment.js.map +1 -0
  198. package/dist/types/block.d.ts +61 -0
  199. package/dist/types/block.d.ts.map +1 -0
  200. package/dist/types/block.js +8 -0
  201. package/dist/types/block.js.map +1 -0
  202. package/dist/types/codec.d.ts +58 -0
  203. package/dist/types/codec.d.ts.map +1 -0
  204. package/dist/types/codec.js +6 -0
  205. package/dist/types/codec.js.map +1 -0
  206. package/dist/types/compiled.d.ts +91 -0
  207. package/dist/types/compiled.d.ts.map +1 -0
  208. package/dist/types/compiled.js +6 -0
  209. package/dist/types/compiled.js.map +1 -0
  210. package/dist/types/hash.d.ts +24 -0
  211. package/dist/types/hash.d.ts.map +1 -0
  212. package/dist/types/hash.js +49 -0
  213. package/dist/types/hash.js.map +1 -0
  214. package/dist/types/index.d.ts +10 -0
  215. package/dist/types/index.d.ts.map +1 -0
  216. package/dist/types/index.js +26 -0
  217. package/dist/types/index.js.map +1 -0
  218. package/dist/types/policy.d.ts +128 -0
  219. package/dist/types/policy.d.ts.map +1 -0
  220. package/dist/types/policy.js +55 -0
  221. package/dist/types/policy.js.map +1 -0
  222. package/package.json +55 -0
  223. package/postcss.config.js +4 -0
  224. package/src/__tests__/attachment-selector.test.ts +559 -0
  225. package/src/__tests__/cache-breakpoints.test.ts +566 -0
  226. package/src/__tests__/codecs.test.ts +417 -0
  227. package/src/__tests__/compactor.test.ts +608 -0
  228. package/src/__tests__/context-graph.test.ts +383 -0
  229. package/src/__tests__/hash.test.ts +274 -0
  230. package/src/__tests__/integration.test.ts +866 -0
  231. package/src/__tests__/kind-order.test.ts +312 -0
  232. package/src/__tests__/phase2-integration.test.ts +253 -0
  233. package/src/__tests__/queries.test.ts +387 -0
  234. package/src/__tests__/token-estimator.test.ts +326 -0
  235. package/src/adapters/anthropic-estimator.ts +125 -0
  236. package/src/adapters/attachment-resolver.ts +295 -0
  237. package/src/adapters/attachment-selector.ts +218 -0
  238. package/src/adapters/gemini-estimator.ts +93 -0
  239. package/src/adapters/index.ts +12 -0
  240. package/src/adapters/memory-store.ts +299 -0
  241. package/src/adapters/openai-estimator.ts +105 -0
  242. package/src/adapters/summarizer.ts +250 -0
  243. package/src/adapters/token-estimator.ts +74 -0
  244. package/src/builder/context-builder.ts +467 -0
  245. package/src/builder/context-fork.ts +471 -0
  246. package/src/builder/index.ts +6 -0
  247. package/src/codecs/base.ts +36 -0
  248. package/src/codecs/conversation-history.codec.ts +108 -0
  249. package/src/codecs/index.ts +57 -0
  250. package/src/codecs/redacted-stub.codec.ts +76 -0
  251. package/src/codecs/structured-reference.codec.ts +96 -0
  252. package/src/codecs/system-rules.codec.ts +74 -0
  253. package/src/codecs/tool-output.codec.ts +109 -0
  254. package/src/codecs/tool-schema.codec.ts +87 -0
  255. package/src/codecs/unsafe-text.codec.ts +74 -0
  256. package/src/graph/context-graph.ts +205 -0
  257. package/src/graph/index.ts +8 -0
  258. package/src/graph/kind-order.ts +125 -0
  259. package/src/graph/queries.ts +306 -0
  260. package/src/graph/views.ts +255 -0
  261. package/src/index.ts +31 -0
  262. package/src/pipeline/compactor.ts +563 -0
  263. package/src/pipeline/index.ts +6 -0
  264. package/src/pipeline/summarizer.ts +76 -0
  265. package/src/policies/default-policy.ts +69 -0
  266. package/src/policies/index.ts +5 -0
  267. package/src/providers/anthropic-compiler.ts +294 -0
  268. package/src/providers/capabilities.ts +144 -0
  269. package/src/providers/gemini-compiler.ts +272 -0
  270. package/src/providers/index.ts +8 -0
  271. package/src/providers/openai-compiler.ts +191 -0
  272. package/src/types/attachment.ts +86 -0
  273. package/src/types/block.ts +84 -0
  274. package/src/types/codec.ts +68 -0
  275. package/src/types/compiled.ts +109 -0
  276. package/src/types/hash.ts +58 -0
  277. package/src/types/index.ts +10 -0
  278. package/src/types/policy.ts +194 -0
  279. package/tsconfig.json +21 -0
  280. package/vitest.config.ts +21 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Anthropic compiler: Pure compilation to Anthropic message format.
3
+ *
4
+ * Features:
5
+ * - System messages with prompt caching
6
+ * - Cache breakpoint resolution ("after last matching block")
7
+ * - Diagnostics for cache configuration
8
+ */
9
+ import type { ContextBlock } from '../types/block.js';
10
+ import type { ContextPolicy } from '../types/policy.js';
11
+ import type { AnthropicCompiledContext } from '../types/compiled.js';
12
+ import type { BlockCodec } from '../types/codec.js';
13
+ /**
14
+ * Cache breakpoint selector for Anthropic prompt caching.
15
+ */
16
+ export interface CacheBreakpointSelector {
17
+ /** Block kind to match */
18
+ kind?: string;
19
+ /** Codec ID to match */
20
+ codecId?: string;
21
+ /** Tag to match */
22
+ tag?: string;
23
+ /** Source to match */
24
+ source?: string;
25
+ }
26
+ /**
27
+ * Cache breakpoint diagnostic.
28
+ */
29
+ export interface CacheBreakpointDiagnostic {
30
+ /** Diagnostic level */
31
+ level: 'error' | 'warning' | 'info';
32
+ /** Diagnostic message */
33
+ message: string;
34
+ /** Matched blocks count */
35
+ matchedBlocks?: number;
36
+ /** Breakpoint position (if resolved) */
37
+ position?: number;
38
+ }
39
+ /**
40
+ * Anthropic compilation options.
41
+ */
42
+ export interface AnthropicCompilationOptions {
43
+ /** Cache breakpoint selector (omit = no caching) */
44
+ cacheBreakpoint?: CacheBreakpointSelector;
45
+ /** Codec registry for rendering */
46
+ codecRegistry: Map<string, BlockCodec<unknown>>;
47
+ }
48
+ /**
49
+ * Compile context to Anthropic message format.
50
+ * Pure function: same inputs → identical outputs.
51
+ *
52
+ * @param blocks - Ordered blocks from ContextView
53
+ * @param policy - Context policy
54
+ * @param options - Compilation options
55
+ * @returns Anthropic compiled context
56
+ */
57
+ export declare function compileAnthropicContext(blocks: ContextBlock[], policy: ContextPolicy, options: AnthropicCompilationOptions): AnthropicCompiledContext;
58
+ //# sourceMappingURL=anthropic-compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-compiler.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic-compiler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAmB,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,mBAAmB;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,uBAAuB;IACvB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAEpC,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAEhB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,oDAAoD;IACpD,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAE1C,mCAAmC;IACnC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;CACjD;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EAAE,EACtB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,2BAA2B,GACnC,wBAAwB,CAsC1B"}
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ /**
3
+ * Anthropic compiler: Pure compilation to Anthropic message format.
4
+ *
5
+ * Features:
6
+ * - System messages with prompt caching
7
+ * - Cache breakpoint resolution ("after last matching block")
8
+ * - Diagnostics for cache configuration
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.compileAnthropicContext = compileAnthropicContext;
12
+ const capabilities_js_1 = require("./capabilities.js");
13
+ /**
14
+ * Compile context to Anthropic message format.
15
+ * Pure function: same inputs → identical outputs.
16
+ *
17
+ * @param blocks - Ordered blocks from ContextView
18
+ * @param policy - Context policy
19
+ * @param options - Compilation options
20
+ * @returns Anthropic compiled context
21
+ */
22
+ function compileAnthropicContext(blocks, policy, options) {
23
+ const capabilities = (0, capabilities_js_1.getProviderCapabilities)('anthropic');
24
+ // Separate system blocks from message blocks
25
+ const systemBlocks = blocks.filter((b) => b.meta.kind === 'pinned');
26
+ const messageBlocks = blocks.filter((b) => b.meta.kind !== 'pinned');
27
+ // Compile system messages
28
+ const systemMessages = compileSystemMessages(systemBlocks, options.codecRegistry, options.cacheBreakpoint);
29
+ // Compile message blocks
30
+ const messages = compileMessages(messageBlocks, options.codecRegistry);
31
+ // Calculate tokens (simplified - would use actual estimator in production)
32
+ const estimatedTokens = blocks.length * 100; // Placeholder
33
+ return {
34
+ provider: 'anthropic',
35
+ modelId: policy.modelId,
36
+ messages,
37
+ system: systemMessages.length > 0 ? systemMessages : undefined,
38
+ estimatedTokens,
39
+ blocks,
40
+ meta: {
41
+ compiledAt: Math.floor(Date.now() / 1000),
42
+ contextWindow: policy.contextWindow,
43
+ completionReserve: policy.completionReserve,
44
+ availableTokens: policy.contextWindow - policy.completionReserve,
45
+ overflowed: false,
46
+ compacted: false,
47
+ truncated: false,
48
+ tokensByKind: {},
49
+ },
50
+ };
51
+ }
52
+ /**
53
+ * Compile system messages with optional prompt caching.
54
+ *
55
+ * @param blocks - System blocks
56
+ * @param codecRegistry - Codec registry
57
+ * @param cacheBreakpoint - Cache breakpoint selector
58
+ * @returns Anthropic system messages
59
+ */
60
+ function compileSystemMessages(blocks, codecRegistry, cacheBreakpoint) {
61
+ if (blocks.length === 0) {
62
+ return [];
63
+ }
64
+ const messages = [];
65
+ // Resolve cache breakpoint position
66
+ let cacheBreakpointPos = -1;
67
+ const diagnostics = [];
68
+ if (cacheBreakpoint) {
69
+ const result = resolveCacheBreakpoint(blocks, cacheBreakpoint);
70
+ cacheBreakpointPos = result.position;
71
+ diagnostics.push(...result.diagnostics);
72
+ }
73
+ // Compile each system block
74
+ for (let i = 0; i < blocks.length; i++) {
75
+ const block = blocks[i];
76
+ const codec = codecRegistry.get(block.meta.codecId);
77
+ if (!codec) {
78
+ console.warn(`[Anthropic] Codec not found: ${block.meta.codecId}`);
79
+ continue;
80
+ }
81
+ const rendered = codec.render(block);
82
+ const anthropicContent = rendered.anthropic;
83
+ // Add cache control if this is the breakpoint
84
+ const isCacheBreakpoint = i === cacheBreakpointPos;
85
+ messages.push({
86
+ type: 'text',
87
+ text: anthropicContent.text || JSON.stringify(anthropicContent),
88
+ ...(isCacheBreakpoint && { cache_control: { type: 'ephemeral' } }),
89
+ });
90
+ }
91
+ return messages;
92
+ }
93
+ /**
94
+ * Compile message blocks to Anthropic message format.
95
+ *
96
+ * @param blocks - Message blocks
97
+ * @param codecRegistry - Codec registry
98
+ * @returns Anthropic messages
99
+ */
100
+ function compileMessages(blocks, codecRegistry) {
101
+ const messages = [];
102
+ for (const block of blocks) {
103
+ const codec = codecRegistry.get(block.meta.codecId);
104
+ if (!codec) {
105
+ console.warn(`[Anthropic] Codec not found: ${block.meta.codecId}`);
106
+ continue;
107
+ }
108
+ const rendered = codec.render(block);
109
+ const anthropicContent = rendered.anthropic;
110
+ // Handle different block kinds
111
+ if (block.meta.kind === 'history') {
112
+ // History blocks are already in message format
113
+ if (Array.isArray(anthropicContent)) {
114
+ messages.push(...anthropicContent);
115
+ }
116
+ }
117
+ else if (block.meta.kind === 'turn') {
118
+ // Turn blocks are user messages
119
+ messages.push({
120
+ role: 'user',
121
+ content: anthropicContent.content || anthropicContent,
122
+ });
123
+ }
124
+ else {
125
+ // Other blocks (reference, memory, state, tool_output) as user messages
126
+ messages.push({
127
+ role: 'user',
128
+ content: typeof anthropicContent === 'string'
129
+ ? anthropicContent
130
+ : JSON.stringify(anthropicContent),
131
+ });
132
+ }
133
+ }
134
+ return messages;
135
+ }
136
+ /**
137
+ * Resolve cache breakpoint position using "after last matching block" strategy.
138
+ *
139
+ * @param blocks - System blocks
140
+ * @param selector - Cache breakpoint selector
141
+ * @returns Resolved position and diagnostics
142
+ */
143
+ function resolveCacheBreakpoint(blocks, selector) {
144
+ const diagnostics = [];
145
+ // Find all matching blocks
146
+ const matchedIndices = [];
147
+ for (let i = 0; i < blocks.length; i++) {
148
+ const block = blocks[i];
149
+ const matches = (selector.kind === undefined || block.meta.kind === selector.kind) &&
150
+ (selector.codecId === undefined || block.meta.codecId === selector.codecId) &&
151
+ (selector.tag === undefined || block.meta.tags?.includes(selector.tag)) &&
152
+ (selector.source === undefined || block.meta.source === selector.source);
153
+ if (matches) {
154
+ matchedIndices.push(i);
155
+ }
156
+ }
157
+ // Apply "after last matching block" rule
158
+ if (matchedIndices.length === 0) {
159
+ diagnostics.push({
160
+ level: 'warning',
161
+ message: 'No blocks matched cache breakpoint selector',
162
+ matchedBlocks: 0,
163
+ });
164
+ return { position: -1, diagnostics };
165
+ }
166
+ if (matchedIndices.length > 10) {
167
+ diagnostics.push({
168
+ level: 'warning',
169
+ message: `Many blocks matched (${matchedIndices.length}), using last match`,
170
+ matchedBlocks: matchedIndices.length,
171
+ });
172
+ }
173
+ const lastMatchIndex = matchedIndices[matchedIndices.length - 1];
174
+ diagnostics.push({
175
+ level: 'info',
176
+ message: `Cache breakpoint resolved to block ${lastMatchIndex}`,
177
+ matchedBlocks: matchedIndices.length,
178
+ position: lastMatchIndex,
179
+ });
180
+ return { position: lastMatchIndex, diagnostics };
181
+ }
182
+ //# sourceMappingURL=anthropic-compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-compiler.js","sourceRoot":"","sources":["../../src/providers/anthropic-compiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Provider capabilities and feature detection.
3
+ */
4
+ import type { Provider } from '../types/policy.js';
5
+ /**
6
+ * Provider capabilities.
7
+ */
8
+ export interface ProviderCapabilities {
9
+ /** Provider identifier */
10
+ provider: Provider;
11
+ /** Supports prompt caching */
12
+ supportsPromptCaching: boolean;
13
+ /** Supports structured outputs */
14
+ supportsStructuredOutputs: boolean;
15
+ /** Supports tool/function calling */
16
+ supportsToolCalling: boolean;
17
+ /** Supports vision (image inputs) */
18
+ supportsVision: boolean;
19
+ /** Maximum context window (tokens) */
20
+ maxContextWindow: number;
21
+ /** Maximum output tokens */
22
+ maxOutputTokens: number;
23
+ /** Message format details */
24
+ messageFormat: {
25
+ /** Supports system messages */
26
+ supportsSystemMessages: boolean;
27
+ /** System message location */
28
+ systemMessageLocation: 'inline' | 'separate' | 'none';
29
+ /** Role names */
30
+ roles: {
31
+ system?: string;
32
+ user: string;
33
+ assistant: string;
34
+ tool?: string;
35
+ };
36
+ };
37
+ /** Cache breakpoint configuration */
38
+ caching?: {
39
+ /** Minimum tokens for caching */
40
+ minTokensForCaching: number;
41
+ /** Cache TTL (seconds) */
42
+ cacheTTL: number;
43
+ /** Breakpoint selector strategy */
44
+ breakpointStrategy: 'after_last_match' | 'manual';
45
+ };
46
+ }
47
+ /**
48
+ * Get capabilities for a provider.
49
+ *
50
+ * @param provider - Provider identifier
51
+ * @returns Provider capabilities
52
+ */
53
+ export declare function getProviderCapabilities(provider: Provider): ProviderCapabilities;
54
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/providers/capabilities.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,0BAA0B;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IAEnB,8BAA8B;IAC9B,qBAAqB,EAAE,OAAO,CAAC;IAE/B,kCAAkC;IAClC,yBAAyB,EAAE,OAAO,CAAC;IAEnC,qCAAqC;IACrC,mBAAmB,EAAE,OAAO,CAAC;IAE7B,qCAAqC;IACrC,cAAc,EAAE,OAAO,CAAC;IAExB,sCAAsC;IACtC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,4BAA4B;IAC5B,eAAe,EAAE,MAAM,CAAC;IAExB,6BAA6B;IAC7B,aAAa,EAAE;QACb,+BAA+B;QAC/B,sBAAsB,EAAE,OAAO,CAAC;QAEhC,8BAA8B;QAC9B,qBAAqB,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;QAEtD,iBAAiB;QACjB,KAAK,EAAE;YACL,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,MAAM,CAAC;YAClB,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;IAEF,qCAAqC;IACrC,OAAO,CAAC,EAAE;QACR,iCAAiC;QACjC,mBAAmB,EAAE,MAAM,CAAC;QAE5B,0BAA0B;QAC1B,QAAQ,EAAE,MAAM,CAAC;QAEjB,mCAAmC;QACnC,kBAAkB,EAAE,kBAAkB,GAAG,QAAQ,CAAC;KACnD,CAAC;CACH;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,oBAAoB,CA4EhF"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ /**
3
+ * Provider capabilities and feature detection.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getProviderCapabilities = getProviderCapabilities;
7
+ /**
8
+ * Get capabilities for a provider.
9
+ *
10
+ * @param provider - Provider identifier
11
+ * @returns Provider capabilities
12
+ */
13
+ function getProviderCapabilities(provider) {
14
+ switch (provider) {
15
+ case 'anthropic':
16
+ return {
17
+ provider: 'anthropic',
18
+ supportsPromptCaching: true,
19
+ supportsStructuredOutputs: true,
20
+ supportsToolCalling: true,
21
+ supportsVision: true,
22
+ maxContextWindow: 200000,
23
+ maxOutputTokens: 64000,
24
+ messageFormat: {
25
+ supportsSystemMessages: true,
26
+ systemMessageLocation: 'separate',
27
+ roles: {
28
+ system: 'system',
29
+ user: 'user',
30
+ assistant: 'assistant',
31
+ tool: 'user',
32
+ },
33
+ },
34
+ caching: {
35
+ minTokensForCaching: 1024,
36
+ cacheTTL: 300,
37
+ breakpointStrategy: 'after_last_match',
38
+ },
39
+ };
40
+ case 'openai':
41
+ return {
42
+ provider: 'openai',
43
+ supportsPromptCaching: false,
44
+ supportsStructuredOutputs: true,
45
+ supportsToolCalling: true,
46
+ supportsVision: true,
47
+ maxContextWindow: 128000,
48
+ maxOutputTokens: 16000,
49
+ messageFormat: {
50
+ supportsSystemMessages: true,
51
+ systemMessageLocation: 'inline',
52
+ roles: {
53
+ system: 'system',
54
+ user: 'user',
55
+ assistant: 'assistant',
56
+ tool: 'tool',
57
+ },
58
+ },
59
+ };
60
+ case 'gemini':
61
+ return {
62
+ provider: 'gemini',
63
+ supportsPromptCaching: true,
64
+ supportsStructuredOutputs: true,
65
+ supportsToolCalling: true,
66
+ supportsVision: true,
67
+ maxContextWindow: 1000000,
68
+ maxOutputTokens: 64000,
69
+ messageFormat: {
70
+ supportsSystemMessages: true,
71
+ systemMessageLocation: 'separate',
72
+ roles: {
73
+ user: 'user',
74
+ assistant: 'model',
75
+ },
76
+ },
77
+ caching: {
78
+ minTokensForCaching: 32000,
79
+ cacheTTL: 300,
80
+ breakpointStrategy: 'after_last_match',
81
+ },
82
+ };
83
+ default:
84
+ throw new Error(`Unknown provider: ${provider}`);
85
+ }
86
+ }
87
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/providers/capabilities.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAiEH,0DA4EC;AAlFD;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,QAAkB;IACxD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,WAAW;YACd,OAAO;gBACL,QAAQ,EAAE,WAAW;gBACrB,qBAAqB,EAAE,IAAI;gBAC3B,yBAAyB,EAAE,IAAI;gBAC/B,mBAAmB,EAAE,IAAI;gBACzB,cAAc,EAAE,IAAI;gBACpB,gBAAgB,EAAE,MAAM;gBACxB,eAAe,EAAE,KAAK;gBACtB,aAAa,EAAE;oBACb,sBAAsB,EAAE,IAAI;oBAC5B,qBAAqB,EAAE,UAAU;oBACjC,KAAK,EAAE;wBACL,MAAM,EAAE,QAAQ;wBAChB,IAAI,EAAE,MAAM;wBACZ,SAAS,EAAE,WAAW;wBACtB,IAAI,EAAE,MAAM;qBACb;iBACF;gBACD,OAAO,EAAE;oBACP,mBAAmB,EAAE,IAAI;oBACzB,QAAQ,EAAE,GAAG;oBACb,kBAAkB,EAAE,kBAAkB;iBACvC;aACF,CAAC;QAEJ,KAAK,QAAQ;YACX,OAAO;gBACL,QAAQ,EAAE,QAAQ;gBAClB,qBAAqB,EAAE,KAAK;gBAC5B,yBAAyB,EAAE,IAAI;gBAC/B,mBAAmB,EAAE,IAAI;gBACzB,cAAc,EAAE,IAAI;gBACpB,gBAAgB,EAAE,MAAM;gBACxB,eAAe,EAAE,KAAK;gBACtB,aAAa,EAAE;oBACb,sBAAsB,EAAE,IAAI;oBAC5B,qBAAqB,EAAE,QAAQ;oBAC/B,KAAK,EAAE;wBACL,MAAM,EAAE,QAAQ;wBAChB,IAAI,EAAE,MAAM;wBACZ,SAAS,EAAE,WAAW;wBACtB,IAAI,EAAE,MAAM;qBACb;iBACF;aACF,CAAC;QAEJ,KAAK,QAAQ;YACX,OAAO;gBACL,QAAQ,EAAE,QAAQ;gBAClB,qBAAqB,EAAE,IAAI;gBAC3B,yBAAyB,EAAE,IAAI;gBAC/B,mBAAmB,EAAE,IAAI;gBACzB,cAAc,EAAE,IAAI;gBACpB,gBAAgB,EAAE,OAAO;gBACzB,eAAe,EAAE,KAAK;gBACtB,aAAa,EAAE;oBACb,sBAAsB,EAAE,IAAI;oBAC5B,qBAAqB,EAAE,UAAU;oBACjC,KAAK,EAAE;wBACL,IAAI,EAAE,MAAM;wBACZ,SAAS,EAAE,OAAO;qBACnB;iBACF;gBACD,OAAO,EAAE;oBACP,mBAAmB,EAAE,KAAK;oBAC1B,QAAQ,EAAE,GAAG;oBACb,kBAAkB,EAAE,kBAAkB;iBACvC;aACF,CAAC;QAEJ;YACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Gemini compiler: Pure compilation to Gemini content format.
3
+ *
4
+ * Features:
5
+ * - Separate system instruction
6
+ * - User/model role mapping
7
+ * - Parts-based content structure
8
+ * - Caching support (for large contexts)
9
+ */
10
+ import type { ContextBlock } from '../types/block.js';
11
+ import type { ContextPolicy } from '../types/policy.js';
12
+ import type { GeminiCompiledContext } from '../types/compiled.js';
13
+ import type { BlockCodec } from '../types/codec.js';
14
+ /**
15
+ * Gemini compilation options.
16
+ */
17
+ export interface GeminiCompilationOptions {
18
+ /** Codec registry for rendering */
19
+ codecRegistry: Map<string, BlockCodec<unknown>>;
20
+ /** Cache configuration (optional) */
21
+ caching?: {
22
+ /** Enable caching for large contexts */
23
+ enabled: boolean;
24
+ /** Minimum tokens for caching */
25
+ minTokens: number;
26
+ };
27
+ }
28
+ /**
29
+ * Compile context to Gemini content format.
30
+ * Pure function: same inputs → identical outputs.
31
+ *
32
+ * @param blocks - Ordered blocks from ContextView
33
+ * @param policy - Context policy
34
+ * @param options - Compilation options
35
+ * @returns Gemini compiled context
36
+ */
37
+ export declare function compileGeminiContext(blocks: ContextBlock[], policy: ContextPolicy, options: GeminiCompilationOptions): GeminiCompiledContext;
38
+ /**
39
+ * Validate Gemini message sequence.
40
+ *
41
+ * @param messages - Gemini messages
42
+ * @returns Validation diagnostics
43
+ */
44
+ export declare function validateGeminiMessages(messages: Array<{
45
+ role: 'user' | 'model';
46
+ parts: unknown[];
47
+ }>): Array<{
48
+ level: 'error' | 'warning';
49
+ message: string;
50
+ }>;
51
+ //# sourceMappingURL=gemini-compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-compiler.d.ts","sourceRoot":"","sources":["../../src/providers/gemini-compiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,mCAAmC;IACnC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAEhD,qCAAqC;IACrC,OAAO,CAAC,EAAE;QACR,wCAAwC;QACxC,OAAO,EAAE,OAAO,CAAC;QAEjB,iCAAiC;QACjC,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EAAE,EACtB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,wBAAwB,GAChC,qBAAqB,CAkCvB;AA+ID;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,GAC5D,KAAK,CAAC;IAAE,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAwCxD"}
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ /**
3
+ * Gemini compiler: Pure compilation to Gemini content format.
4
+ *
5
+ * Features:
6
+ * - Separate system instruction
7
+ * - User/model role mapping
8
+ * - Parts-based content structure
9
+ * - Caching support (for large contexts)
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.compileGeminiContext = compileGeminiContext;
13
+ exports.validateGeminiMessages = validateGeminiMessages;
14
+ const capabilities_js_1 = require("./capabilities.js");
15
+ /**
16
+ * Compile context to Gemini content format.
17
+ * Pure function: same inputs → identical outputs.
18
+ *
19
+ * @param blocks - Ordered blocks from ContextView
20
+ * @param policy - Context policy
21
+ * @param options - Compilation options
22
+ * @returns Gemini compiled context
23
+ */
24
+ function compileGeminiContext(blocks, policy, options) {
25
+ const capabilities = (0, capabilities_js_1.getProviderCapabilities)('gemini');
26
+ // Separate system blocks from message blocks
27
+ const systemBlocks = blocks.filter((b) => b.meta.kind === 'pinned');
28
+ const messageBlocks = blocks.filter((b) => b.meta.kind !== 'pinned');
29
+ // Compile system instruction
30
+ const systemInstruction = compileSystemInstruction(systemBlocks, options.codecRegistry);
31
+ // Compile message blocks
32
+ const messages = compileMessages(messageBlocks, options.codecRegistry);
33
+ // Calculate tokens (simplified - would use actual estimator in production)
34
+ const estimatedTokens = blocks.length * 100; // Placeholder
35
+ return {
36
+ provider: 'gemini',
37
+ modelId: policy.modelId,
38
+ messages,
39
+ system: systemInstruction,
40
+ estimatedTokens,
41
+ blocks,
42
+ meta: {
43
+ compiledAt: Math.floor(Date.now() / 1000),
44
+ contextWindow: policy.contextWindow,
45
+ completionReserve: policy.completionReserve,
46
+ availableTokens: policy.contextWindow - policy.completionReserve,
47
+ overflowed: false,
48
+ compacted: false,
49
+ truncated: false,
50
+ tokensByKind: {},
51
+ },
52
+ };
53
+ }
54
+ /**
55
+ * Compile system instruction from system blocks.
56
+ * Gemini uses a single string for system instruction.
57
+ *
58
+ * @param blocks - System blocks
59
+ * @param codecRegistry - Codec registry
60
+ * @returns System instruction string (or undefined)
61
+ */
62
+ function compileSystemInstruction(blocks, codecRegistry) {
63
+ if (blocks.length === 0) {
64
+ return undefined;
65
+ }
66
+ const parts = [];
67
+ for (const block of blocks) {
68
+ const codec = codecRegistry.get(block.meta.codecId);
69
+ if (!codec) {
70
+ console.warn(`[Gemini] Codec not found: ${block.meta.codecId}`);
71
+ continue;
72
+ }
73
+ const rendered = codec.render(block);
74
+ const geminiContent = rendered.gemini;
75
+ // Extract text from rendered content
76
+ if (typeof geminiContent === 'string') {
77
+ parts.push(geminiContent);
78
+ }
79
+ else {
80
+ parts.push(JSON.stringify(geminiContent));
81
+ }
82
+ }
83
+ return parts.join('\n\n');
84
+ }
85
+ /**
86
+ * Compile blocks to Gemini messages.
87
+ * Gemini uses user/model roles and parts-based content.
88
+ *
89
+ * @param blocks - Message blocks
90
+ * @param codecRegistry - Codec registry
91
+ * @returns Gemini messages
92
+ */
93
+ function compileMessages(blocks, codecRegistry) {
94
+ const messages = [];
95
+ for (const block of blocks) {
96
+ const codec = codecRegistry.get(block.meta.codecId);
97
+ if (!codec) {
98
+ console.warn(`[Gemini] Codec not found: ${block.meta.codecId}`);
99
+ continue;
100
+ }
101
+ const rendered = codec.render(block);
102
+ const geminiContent = rendered.gemini;
103
+ // Handle different block kinds
104
+ if (block.meta.kind === 'history') {
105
+ // History blocks are already in message format
106
+ if (Array.isArray(geminiContent)) {
107
+ messages.push(...geminiContent);
108
+ }
109
+ else {
110
+ messages.push(geminiContent);
111
+ }
112
+ }
113
+ else if (block.meta.kind === 'turn') {
114
+ // Turn blocks are user messages
115
+ messages.push({
116
+ role: 'user',
117
+ parts: geminiContent.parts || [{ text: geminiContent }],
118
+ });
119
+ }
120
+ else {
121
+ // Other blocks (reference, memory, state, tool_output) as user messages
122
+ const textContent = typeof geminiContent === 'string'
123
+ ? geminiContent
124
+ : JSON.stringify(geminiContent);
125
+ messages.push({
126
+ role: 'user',
127
+ parts: [{ text: textContent }],
128
+ });
129
+ }
130
+ }
131
+ // Ensure alternating user/model roles (required by Gemini)
132
+ return enforceAlternatingRoles(messages);
133
+ }
134
+ /**
135
+ * Enforce alternating user/model roles.
136
+ * Gemini requires strict alternation between user and model messages.
137
+ *
138
+ * @param messages - Input messages
139
+ * @returns Messages with enforced alternation
140
+ */
141
+ function enforceAlternatingRoles(messages) {
142
+ const result = [];
143
+ let currentRole = null;
144
+ let currentParts = [];
145
+ for (const msg of messages) {
146
+ if (msg.role === currentRole) {
147
+ // Same role - merge parts
148
+ currentParts.push(...msg.parts);
149
+ }
150
+ else {
151
+ // Different role - flush current message
152
+ if (currentRole !== null && currentParts.length > 0) {
153
+ result.push({ role: currentRole, parts: currentParts });
154
+ }
155
+ // Start new message
156
+ currentRole = msg.role;
157
+ currentParts = [...msg.parts];
158
+ }
159
+ }
160
+ // Flush final message
161
+ if (currentRole !== null && currentParts.length > 0) {
162
+ result.push({ role: currentRole, parts: currentParts });
163
+ }
164
+ return result;
165
+ }
166
+ /**
167
+ * Validate Gemini message sequence.
168
+ *
169
+ * @param messages - Gemini messages
170
+ * @returns Validation diagnostics
171
+ */
172
+ function validateGeminiMessages(messages) {
173
+ const diagnostics = [];
174
+ // Check for empty messages
175
+ if (messages.length === 0) {
176
+ diagnostics.push({
177
+ level: 'error',
178
+ message: 'Message array is empty',
179
+ });
180
+ return diagnostics;
181
+ }
182
+ // Check for strict alternation
183
+ let lastRole = null;
184
+ for (let i = 0; i < messages.length; i++) {
185
+ const msg = messages[i];
186
+ if (msg.role === lastRole) {
187
+ diagnostics.push({
188
+ level: 'error',
189
+ message: `Consecutive ${msg.role} messages at index ${i} (Gemini requires strict alternation)`,
190
+ });
191
+ }
192
+ lastRole = msg.role;
193
+ }
194
+ // Check for empty parts
195
+ for (let i = 0; i < messages.length; i++) {
196
+ const msg = messages[i];
197
+ if (msg.parts.length === 0) {
198
+ diagnostics.push({
199
+ level: 'error',
200
+ message: `Empty parts array at index ${i}`,
201
+ });
202
+ }
203
+ }
204
+ return diagnostics;
205
+ }
206
+ //# sourceMappingURL=gemini-compiler.js.map