@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,282 @@
1
+ "use strict";
2
+ /**
3
+ * ContextFork: Create sub-agent contexts with sensitivity enforcement.
4
+ *
5
+ * Enables forking contexts for sub-agents with automatic sensitivity redaction,
6
+ * budget overrides, and schema-enforced output validation.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ContextFork = void 0;
10
+ exports.filterBySensitivity = filterBySensitivity;
11
+ exports.computeExecutionHash = computeExecutionHash;
12
+ exports.computeSchemaHash = computeSchemaHash;
13
+ const crypto_1 = require("crypto");
14
+ const redacted_stub_codec_js_1 = require("../codecs/redacted-stub.codec.js");
15
+ const hash_js_1 = require("../types/hash.js");
16
+ /**
17
+ * Sensitivity level ordering (for comparison).
18
+ */
19
+ const SENSITIVITY_ORDER = {
20
+ public: 0,
21
+ internal: 1,
22
+ restricted: 2,
23
+ };
24
+ /**
25
+ * Check if a sensitivity level exceeds the maximum allowed level.
26
+ *
27
+ * @param level - Sensitivity level to check
28
+ * @param maxLevel - Maximum allowed level
29
+ * @returns True if level exceeds maxLevel
30
+ */
31
+ function exceedsSensitivityLevel(level, maxLevel) {
32
+ return SENSITIVITY_ORDER[level] > SENSITIVITY_ORDER[maxLevel];
33
+ }
34
+ /**
35
+ * Create a redacted stub block for sensitive content.
36
+ *
37
+ * @param originalBlock - Original block to redact
38
+ * @param reason - Redaction reason
39
+ * @returns Redacted stub block
40
+ */
41
+ function createRedactedStub(originalBlock, reason) {
42
+ const payload = {
43
+ originalBlockHash: originalBlock.blockHash,
44
+ reason,
45
+ placeholder: '[REDACTED - Sensitive content removed]',
46
+ };
47
+ const meta = {
48
+ kind: originalBlock.meta.kind,
49
+ sensitivity: 'public',
50
+ codecId: redacted_stub_codec_js_1.RedactedStubCodec.codecId,
51
+ codecVersion: redacted_stub_codec_js_1.RedactedStubCodec.version,
52
+ createdAt: Math.floor(Date.now() / 1000),
53
+ source: originalBlock.meta.source,
54
+ tags: originalBlock.meta.tags,
55
+ };
56
+ const blockHash = (0, hash_js_1.computeBlockHash)(meta, payload, redacted_stub_codec_js_1.RedactedStubCodec);
57
+ return {
58
+ blockHash,
59
+ meta,
60
+ payload,
61
+ };
62
+ }
63
+ /**
64
+ * Filter view blocks by sensitivity level.
65
+ * Blocks exceeding maxSensitivity are replaced with redacted stubs.
66
+ *
67
+ * @param view - Source context view
68
+ * @param maxSensitivity - Maximum allowed sensitivity level
69
+ * @returns Filtered blocks with redacted stubs
70
+ */
71
+ function filterBySensitivity(view, maxSensitivity) {
72
+ return view.blocks.map((block) => {
73
+ if (exceedsSensitivityLevel(block.meta.sensitivity, maxSensitivity)) {
74
+ return createRedactedStub(block, `Sensitivity level '${block.meta.sensitivity}' exceeds maximum '${maxSensitivity}'`);
75
+ }
76
+ return block;
77
+ });
78
+ }
79
+ /**
80
+ * Compute deterministic execution hash.
81
+ * Hash includes: model + compiledViewHash + instruction + schemaHash + toolsetVersion
82
+ *
83
+ * @param model - Model reference
84
+ * @param viewHash - Compiled view hash
85
+ * @param instruction - Task instruction
86
+ * @param schemaHash - Output schema hash
87
+ * @param toolsetVersion - Toolset version (optional)
88
+ * @returns Hex-encoded SHA-256 hash
89
+ */
90
+ function computeExecutionHash(model, viewHash, instruction, schemaHash, toolsetVersion) {
91
+ const combined = {
92
+ model: `${model.provider}:${model.model}`,
93
+ viewHash,
94
+ instruction,
95
+ schemaHash,
96
+ toolsetVersion: toolsetVersion ?? 'none',
97
+ };
98
+ return (0, crypto_1.createHash)('sha256')
99
+ .update(JSON.stringify(combined))
100
+ .digest('hex');
101
+ }
102
+ /**
103
+ * Compute schema hash for deterministic execution tracking.
104
+ *
105
+ * @param schema - Zod schema
106
+ * @returns Hex-encoded SHA-256 hash
107
+ */
108
+ function computeSchemaHash(schema) {
109
+ // Use schema description for hashing (simplified approach)
110
+ // In production, you'd want to serialize the schema structure
111
+ const schemaDesc = schema.description ?? JSON.stringify(schema._def);
112
+ return (0, crypto_1.createHash)('sha256')
113
+ .update(schemaDesc)
114
+ .digest('hex');
115
+ }
116
+ /**
117
+ * ContextFork: Create sub-agent contexts with sensitivity enforcement.
118
+ */
119
+ class ContextFork {
120
+ graph;
121
+ parentView;
122
+ constructor(graph, parentView) {
123
+ this.graph = graph;
124
+ this.parentView = parentView;
125
+ }
126
+ /**
127
+ * Create a fork with sensitivity filtering and budget override.
128
+ *
129
+ * @param options - Fork options
130
+ * @returns Filtered context view for sub-agent
131
+ */
132
+ async createFork(options) {
133
+ const maxSensitivity = options.maxSensitivity ?? 'public';
134
+ // Filter blocks by sensitivity
135
+ const filteredBlocks = filterBySensitivity(this.parentView, maxSensitivity);
136
+ // Apply additional filters based on options
137
+ let finalBlocks = filteredBlocks;
138
+ if (!options.includeHistory) {
139
+ finalBlocks = finalBlocks.filter((block) => block.meta.kind !== 'history');
140
+ }
141
+ if (!options.includeState) {
142
+ finalBlocks = finalBlocks.filter((block) => block.meta.kind !== 'state');
143
+ }
144
+ // Create new view with filtered blocks
145
+ // Re-compute stable prefix hash
146
+ const stablePrefixHash = (0, crypto_1.createHash)('sha256')
147
+ .update(finalBlocks.map((b) => b.blockHash).join('|'))
148
+ .digest('hex');
149
+ const forkedView = {
150
+ blocks: finalBlocks,
151
+ stablePrefixHash,
152
+ createdAt: Math.floor(Date.now() / 1000),
153
+ tokenEstimate: options.budgetOverride
154
+ ? { tokens: options.budgetOverride, confidence: 'high', truncated: false }
155
+ : this.parentView.tokenEstimate,
156
+ };
157
+ return forkedView;
158
+ }
159
+ /**
160
+ * Execute a sub-agent task with schema validation.
161
+ *
162
+ * @param task - Sub-agent task definition
163
+ * @param options - Fork options
164
+ * @param executor - Async executor function (calls LLM)
165
+ * @returns Fork result with validated output
166
+ */
167
+ async executeFork(task, options, executor) {
168
+ const forkedAt = Math.floor(Date.now() / 1000);
169
+ // Create fork
170
+ const forkedView = await this.createFork(options);
171
+ // Validate forbidden fields
172
+ if (task.forbiddenFields && task.forbiddenFields.length > 0) {
173
+ // Add validation to instruction
174
+ const forbiddenFieldsNote = `\n\nIMPORTANT: Your output MUST NOT include these fields: ${task.forbiddenFields.join(', ')}`;
175
+ const enhancedInstruction = task.instruction + forbiddenFieldsNote;
176
+ // Execute with enhanced instruction
177
+ const executionResult = await executor(enhancedInstruction, forkedView);
178
+ // Validate output against schema
179
+ const validatedOutput = task.expectedOutputSchema.parse(executionResult.output);
180
+ // Check for forbidden fields in output
181
+ const outputStr = JSON.stringify(validatedOutput);
182
+ for (const field of task.forbiddenFields) {
183
+ if (outputStr.includes(field)) {
184
+ throw new Error(`Fork execution failed: Output contains forbidden field '${field}'`);
185
+ }
186
+ }
187
+ const completedAt = Math.floor(Date.now() / 1000);
188
+ // Compute execution hash
189
+ const schemaHash = computeSchemaHash(task.expectedOutputSchema);
190
+ const executionHash = computeExecutionHash(options.model, forkedView.stablePrefixHash, task.instruction, schemaHash);
191
+ return {
192
+ agentId: options.agentId,
193
+ model: options.model,
194
+ summary: executionResult.summary,
195
+ output: validatedOutput,
196
+ artifacts: executionResult.artifacts,
197
+ citations: executionResult.citations,
198
+ usage: executionResult.usage,
199
+ provenance: {
200
+ sourceViewHash: this.parentView.stablePrefixHash,
201
+ executionHash,
202
+ forkedAt,
203
+ completedAt,
204
+ },
205
+ };
206
+ }
207
+ else {
208
+ // Execute without forbidden field validation
209
+ const executionResult = await executor(task.instruction, forkedView);
210
+ // Validate output against schema
211
+ const validatedOutput = task.expectedOutputSchema.parse(executionResult.output);
212
+ const completedAt = Math.floor(Date.now() / 1000);
213
+ // Compute execution hash
214
+ const schemaHash = computeSchemaHash(task.expectedOutputSchema);
215
+ const executionHash = computeExecutionHash(options.model, forkedView.stablePrefixHash, task.instruction, schemaHash);
216
+ return {
217
+ agentId: options.agentId,
218
+ model: options.model,
219
+ summary: executionResult.summary,
220
+ output: validatedOutput,
221
+ artifacts: executionResult.artifacts,
222
+ citations: executionResult.citations,
223
+ usage: executionResult.usage,
224
+ provenance: {
225
+ sourceViewHash: this.parentView.stablePrefixHash,
226
+ executionHash,
227
+ forkedAt,
228
+ completedAt,
229
+ },
230
+ };
231
+ }
232
+ }
233
+ /**
234
+ * Ingest fork result back into parent graph.
235
+ * Adds result as a memory block with provenance tracking.
236
+ *
237
+ * @param result - Fork result to ingest
238
+ * @param asMemory - Add as memory block (default: true)
239
+ * @returns Block hash of ingested result
240
+ */
241
+ ingestForkResult(result, asMemory = true) {
242
+ // Create a structured reference block for the fork result
243
+ // This would use a codec designed for fork results
244
+ // For now, we'll use a simplified approach
245
+ const payload = {
246
+ agentId: result.agentId,
247
+ model: result.model,
248
+ summary: result.summary,
249
+ output: result.output,
250
+ artifacts: result.artifacts,
251
+ citations: result.citations,
252
+ usage: result.usage,
253
+ provenance: result.provenance,
254
+ };
255
+ const meta = {
256
+ kind: asMemory ? 'memory' : 'reference',
257
+ sensitivity: 'public',
258
+ codecId: 'fork-result',
259
+ codecVersion: '1.0.0',
260
+ createdAt: Math.floor(Date.now() / 1000),
261
+ source: result.agentId,
262
+ tags: ['fork-result', result.model.provider],
263
+ };
264
+ // Compute block hash (without codec for now)
265
+ const blockHash = (0, crypto_1.createHash)('sha256')
266
+ .update(JSON.stringify({ meta, payload }))
267
+ .digest('hex');
268
+ const block = {
269
+ blockHash,
270
+ meta,
271
+ payload,
272
+ };
273
+ // Add to graph with provenance
274
+ const derivedFrom = result.citations
275
+ ? result.citations.map((hash) => ({ blockHash: hash }))
276
+ : [];
277
+ this.graph.addBlock(block, derivedFrom);
278
+ return blockHash;
279
+ }
280
+ }
281
+ exports.ContextFork = ContextFork;
282
+ //# sourceMappingURL=context-fork.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-fork.js","sourceRoot":"","sources":["../../src/builder/context-fork.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Context builder exports.
3
+ */
4
+ export * from './context-builder.js';
5
+ export * from './context-fork.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ /**
3
+ * Context builder exports.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./context-builder.js"), exports);
21
+ __exportStar(require("./context-fork.js"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,uDAAqC;AACrC,oDAAkC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Base codec utilities.
3
+ */
4
+ /**
5
+ * Default hash implementation: SHA-256 of JSON.stringify(canonicalized).
6
+ *
7
+ * @param canonicalized - Canonicalized payload
8
+ * @returns Hex-encoded SHA-256 hash
9
+ */
10
+ export declare function defaultHash(canonicalized: unknown): string;
11
+ /**
12
+ * Sort object keys for deterministic serialization.
13
+ *
14
+ * @param obj - Object to sort
15
+ * @returns Object with sorted keys
16
+ */
17
+ export declare function sortObjectKeys(obj: Record<string, unknown>): Record<string, unknown>;
18
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/codecs/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,aAAa,EAAE,OAAO,GAAG,MAAM,CAI1D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWpF"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ /**
3
+ * Base codec utilities.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.defaultHash = defaultHash;
7
+ exports.sortObjectKeys = sortObjectKeys;
8
+ const crypto_1 = require("crypto");
9
+ /**
10
+ * Default hash implementation: SHA-256 of JSON.stringify(canonicalized).
11
+ *
12
+ * @param canonicalized - Canonicalized payload
13
+ * @returns Hex-encoded SHA-256 hash
14
+ */
15
+ function defaultHash(canonicalized) {
16
+ return (0, crypto_1.createHash)('sha256')
17
+ .update(JSON.stringify(canonicalized))
18
+ .digest('hex');
19
+ }
20
+ /**
21
+ * Sort object keys for deterministic serialization.
22
+ *
23
+ * @param obj - Object to sort
24
+ * @returns Object with sorted keys
25
+ */
26
+ function sortObjectKeys(obj) {
27
+ const sorted = {};
28
+ for (const key of Object.keys(obj).sort()) {
29
+ const value = obj[key];
30
+ if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
31
+ sorted[key] = sortObjectKeys(value);
32
+ }
33
+ else {
34
+ sorted[key] = value;
35
+ }
36
+ }
37
+ return sorted;
38
+ }
39
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/codecs/base.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAUH,kCAIC;AAQD,wCAWC;AA/BD,mCAAoC;AAEpC;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,aAAsB;IAChD,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;SACrC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,GAA4B;IACzD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzE,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAgC,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Conversation history codec (kind: 'history').
3
+ *
4
+ * Previous turns in conversation.
5
+ */
6
+ import { z } from 'zod';
7
+ import type { BlockCodec } from '../types/codec.js';
8
+ /**
9
+ * Conversation message schema.
10
+ */
11
+ export declare const ConversationMessageSchema: z.ZodObject<{
12
+ /** Message role */
13
+ role: z.ZodEnum<["user", "assistant"]>;
14
+ /** Message content (text or structured) */
15
+ content: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">]>;
16
+ /** Optional message ID */
17
+ messageId: z.ZodOptional<z.ZodString>;
18
+ /** Optional timestamp */
19
+ timestamp: z.ZodOptional<z.ZodNumber>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ content: string | Record<string, unknown>[];
22
+ role: "user" | "assistant";
23
+ messageId?: string | undefined;
24
+ timestamp?: number | undefined;
25
+ }, {
26
+ content: string | Record<string, unknown>[];
27
+ role: "user" | "assistant";
28
+ messageId?: string | undefined;
29
+ timestamp?: number | undefined;
30
+ }>;
31
+ export type ConversationMessage = z.infer<typeof ConversationMessageSchema>;
32
+ /**
33
+ * Conversation history payload schema.
34
+ */
35
+ export declare const ConversationHistoryPayloadSchema: z.ZodObject<{
36
+ /** Array of messages */
37
+ messages: z.ZodArray<z.ZodObject<{
38
+ /** Message role */
39
+ role: z.ZodEnum<["user", "assistant"]>;
40
+ /** Message content (text or structured) */
41
+ content: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">]>;
42
+ /** Optional message ID */
43
+ messageId: z.ZodOptional<z.ZodString>;
44
+ /** Optional timestamp */
45
+ timestamp: z.ZodOptional<z.ZodNumber>;
46
+ }, "strip", z.ZodTypeAny, {
47
+ content: string | Record<string, unknown>[];
48
+ role: "user" | "assistant";
49
+ messageId?: string | undefined;
50
+ timestamp?: number | undefined;
51
+ }, {
52
+ content: string | Record<string, unknown>[];
53
+ role: "user" | "assistant";
54
+ messageId?: string | undefined;
55
+ timestamp?: number | undefined;
56
+ }>, "many">;
57
+ /** Optional summary of earlier messages */
58
+ summary: z.ZodOptional<z.ZodString>;
59
+ }, "strip", z.ZodTypeAny, {
60
+ messages: {
61
+ content: string | Record<string, unknown>[];
62
+ role: "user" | "assistant";
63
+ messageId?: string | undefined;
64
+ timestamp?: number | undefined;
65
+ }[];
66
+ summary?: string | undefined;
67
+ }, {
68
+ messages: {
69
+ content: string | Record<string, unknown>[];
70
+ role: "user" | "assistant";
71
+ messageId?: string | undefined;
72
+ timestamp?: number | undefined;
73
+ }[];
74
+ summary?: string | undefined;
75
+ }>;
76
+ export type ConversationHistoryPayload = z.infer<typeof ConversationHistoryPayloadSchema>;
77
+ /**
78
+ * Conversation history codec implementation.
79
+ */
80
+ export declare const ConversationHistoryCodec: BlockCodec<ConversationHistoryPayload>;
81
+ //# sourceMappingURL=conversation-history.codec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-history.codec.d.ts","sourceRoot":"","sources":["../../src/codecs/conversation-history.codec.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,mBAAmB,CAAC;AAIrE;;GAEG;AACH,eAAO,MAAM,yBAAyB;IACpC,mBAAmB;;IAGnB,2CAA2C;;IAM3C,0BAA0B;;IAG1B,yBAAyB;;;;;;;;;;;;EAEzB,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;GAEG;AACH,eAAO,MAAM,gCAAgC;IAC3C,wBAAwB;;QAtBxB,mBAAmB;;QAGnB,2CAA2C;;QAM3C,0BAA0B;;QAG1B,yBAAyB;;;;;;;;;;;;;IAazB,2CAA2C;;;;;;;;;;;;;;;;;;EAE3C,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gCAAgC,CAAC,CAAC;AAE1F;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,UAAU,CAAC,0BAA0B,CA0D3E,CAAC"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ /**
3
+ * Conversation history codec (kind: 'history').
4
+ *
5
+ * Previous turns in conversation.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ConversationHistoryCodec = exports.ConversationHistoryPayloadSchema = exports.ConversationMessageSchema = void 0;
9
+ const zod_1 = require("zod");
10
+ const base_js_1 = require("./base.js");
11
+ /**
12
+ * Conversation message schema.
13
+ */
14
+ exports.ConversationMessageSchema = zod_1.z.object({
15
+ /** Message role */
16
+ role: zod_1.z.enum(['user', 'assistant']),
17
+ /** Message content (text or structured) */
18
+ content: zod_1.z.union([
19
+ zod_1.z.string(),
20
+ zod_1.z.array(zod_1.z.record(zod_1.z.unknown())),
21
+ ]),
22
+ /** Optional message ID */
23
+ messageId: zod_1.z.string().optional(),
24
+ /** Optional timestamp */
25
+ timestamp: zod_1.z.number().optional(),
26
+ });
27
+ /**
28
+ * Conversation history payload schema.
29
+ */
30
+ exports.ConversationHistoryPayloadSchema = zod_1.z.object({
31
+ /** Array of messages */
32
+ messages: zod_1.z.array(exports.ConversationMessageSchema),
33
+ /** Optional summary of earlier messages */
34
+ summary: zod_1.z.string().optional(),
35
+ });
36
+ /**
37
+ * Conversation history codec implementation.
38
+ */
39
+ exports.ConversationHistoryCodec = {
40
+ codecId: 'conversation-history',
41
+ version: '1.0.0',
42
+ payloadSchema: exports.ConversationHistoryPayloadSchema,
43
+ canonicalize(payload) {
44
+ // Canonicalize messages (exclude volatile fields like timestamp)
45
+ const canonicalMessages = payload.messages.map((msg) => ({
46
+ role: msg.role,
47
+ content: msg.content,
48
+ }));
49
+ return (0, base_js_1.sortObjectKeys)({
50
+ messages: canonicalMessages,
51
+ summary: payload.summary ?? null,
52
+ });
53
+ },
54
+ hash(canonicalized) {
55
+ return (0, base_js_1.defaultHash)(canonicalized);
56
+ },
57
+ render(block) {
58
+ const { messages, summary } = block.payload;
59
+ // Add summary as first message if present
60
+ const allMessages = summary
61
+ ? [{ role: 'user', content: `**Earlier conversation (summary):**\n${summary}` }, ...messages]
62
+ : messages;
63
+ return {
64
+ // Anthropic: messages array
65
+ anthropic: allMessages.map((msg) => ({
66
+ role: msg.role,
67
+ content: typeof msg.content === 'string'
68
+ ? msg.content
69
+ : msg.content,
70
+ })),
71
+ // OpenAI: messages array
72
+ openai: allMessages.map((msg) => ({
73
+ role: msg.role,
74
+ content: msg.content,
75
+ })),
76
+ // Gemini: convert to user/model role
77
+ gemini: allMessages.map((msg) => ({
78
+ role: msg.role === 'assistant' ? 'model' : 'user',
79
+ parts: typeof msg.content === 'string'
80
+ ? [{ text: msg.content }]
81
+ : msg.content,
82
+ })),
83
+ };
84
+ },
85
+ validate(payload) {
86
+ return exports.ConversationHistoryPayloadSchema.parse(payload);
87
+ },
88
+ };
89
+ //# sourceMappingURL=conversation-history.codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-history.codec.js","sourceRoot":"","sources":["../../src/codecs/conversation-history.codec.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,6BAAwB;AAGxB,uCAAwD;AAExD;;GAEG;AACU,QAAA,yBAAyB,GAAG,OAAC,CAAC,MAAM,CAAC;IAChD,mBAAmB;IACnB,IAAI,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEnC,2CAA2C;IAC3C,OAAO,EAAE,OAAC,CAAC,KAAK,CAAC;QACf,OAAC,CAAC,MAAM,EAAE;QACV,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC;KAC/B,CAAC;IAEF,0BAA0B;IAC1B,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAEhC,yBAAyB;IACzB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;AAIH;;GAEG;AACU,QAAA,gCAAgC,GAAG,OAAC,CAAC,MAAM,CAAC;IACvD,wBAAwB;IACxB,QAAQ,EAAE,OAAC,CAAC,KAAK,CAAC,iCAAyB,CAAC;IAE5C,2CAA2C;IAC3C,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC;AAIH;;GAEG;AACU,QAAA,wBAAwB,GAA2C;IAC9E,OAAO,EAAE,sBAAsB;IAC/B,OAAO,EAAE,OAAO;IAChB,aAAa,EAAE,wCAAgC;IAE/C,YAAY,CAAC,OAAmC;QAC9C,iEAAiE;QACjE,MAAM,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACvD,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC,CAAC;QAEJ,OAAO,IAAA,wBAAc,EAAC;YACpB,QAAQ,EAAE,iBAAiB;YAC3B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;SACjC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,aAAsB;QACzB,OAAO,IAAA,qBAAW,EAAC,aAAa,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,KAA+C;QACpD,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;QAE5C,0CAA0C;QAC1C,MAAM,WAAW,GAAG,OAAO;YACzB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,OAAO,EAAE,wCAAwC,OAAO,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC;YACtG,CAAC,CAAC,QAAQ,CAAC;QAEb,OAAO;YACL,4BAA4B;YAC5B,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACnC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;oBACtC,CAAC,CAAC,GAAG,CAAC,OAAO;oBACb,CAAC,CAAC,GAAG,CAAC,OAAO;aAChB,CAAC,CAAC;YAEH,yBAAyB;YACzB,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAChC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,GAAG,CAAC,OAAO;aACrB,CAAC,CAAC;YAEH,qCAAqC;YACrC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAChC,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;gBACjD,KAAK,EAAE,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;oBACpC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;oBACzB,CAAC,CAAC,GAAG,CAAC,OAAO;aAChB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,OAAgB;QACvB,OAAO,wCAAgC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;CACF,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Built-in codecs for @foundry/context
3
+ */
4
+ export * from './base.js';
5
+ export * from './system-rules.codec.js';
6
+ export * from './tool-schema.codec.js';
7
+ export * from './structured-reference.codec.js';
8
+ export * from './conversation-history.codec.js';
9
+ export * from './tool-output.codec.js';
10
+ export * from './redacted-stub.codec.js';
11
+ export * from './unsafe-text.codec.js';
12
+ import type { BlockCodec } from '../types/codec.js';
13
+ /**
14
+ * Built-in codec registry.
15
+ * Maps codecId -> codec implementation.
16
+ */
17
+ export declare const BUILT_IN_CODECS: Record<string, BlockCodec>;
18
+ /**
19
+ * Get codec by ID.
20
+ *
21
+ * @param codecId - Codec identifier
22
+ * @returns Codec implementation, or undefined if not found
23
+ */
24
+ export declare function getCodec(codecId: string): BlockCodec | undefined;
25
+ /**
26
+ * Register custom codec.
27
+ *
28
+ * @param codec - Custom codec implementation
29
+ */
30
+ export declare function registerCodec(codec: BlockCodec): void;
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/codecs/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AASpD;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAQtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAKrD"}