@cogenta/agents 0.1.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 (293) hide show
  1. package/dist/agents/define.d.ts +9 -0
  2. package/dist/agents/define.d.ts.map +1 -0
  3. package/dist/agents/define.js +25 -0
  4. package/dist/agents/define.js.map +1 -0
  5. package/dist/agents/registry.d.ts +29 -0
  6. package/dist/agents/registry.d.ts.map +1 -0
  7. package/dist/agents/registry.js +50 -0
  8. package/dist/agents/registry.js.map +1 -0
  9. package/dist/agents/types.d.ts +36 -0
  10. package/dist/agents/types.d.ts.map +1 -0
  11. package/dist/agents/types.js +2 -0
  12. package/dist/agents/types.js.map +1 -0
  13. package/dist/audit/types.d.ts +23 -0
  14. package/dist/audit/types.d.ts.map +1 -0
  15. package/dist/audit/types.js +2 -0
  16. package/dist/audit/types.js.map +1 -0
  17. package/dist/audit/with-audit.d.ts +34 -0
  18. package/dist/audit/with-audit.d.ts.map +1 -0
  19. package/dist/audit/with-audit.js +65 -0
  20. package/dist/audit/with-audit.js.map +1 -0
  21. package/dist/autonomy/approval-queue.d.ts +13 -0
  22. package/dist/autonomy/approval-queue.d.ts.map +1 -0
  23. package/dist/autonomy/approval-queue.js +56 -0
  24. package/dist/autonomy/approval-queue.js.map +1 -0
  25. package/dist/autonomy/types.d.ts +36 -0
  26. package/dist/autonomy/types.d.ts.map +1 -0
  27. package/dist/autonomy/types.js +2 -0
  28. package/dist/autonomy/types.js.map +1 -0
  29. package/dist/autonomy/with-autonomy.d.ts +25 -0
  30. package/dist/autonomy/with-autonomy.d.ts.map +1 -0
  31. package/dist/autonomy/with-autonomy.js +77 -0
  32. package/dist/autonomy/with-autonomy.js.map +1 -0
  33. package/dist/budget/kill-switch.d.ts +14 -0
  34. package/dist/budget/kill-switch.d.ts.map +1 -0
  35. package/dist/budget/kill-switch.js +20 -0
  36. package/dist/budget/kill-switch.js.map +1 -0
  37. package/dist/budget/tracker.d.ts +15 -0
  38. package/dist/budget/tracker.d.ts.map +1 -0
  39. package/dist/budget/tracker.js +68 -0
  40. package/dist/budget/tracker.js.map +1 -0
  41. package/dist/budget/types.d.ts +35 -0
  42. package/dist/budget/types.d.ts.map +1 -0
  43. package/dist/budget/types.js +2 -0
  44. package/dist/budget/types.js.map +1 -0
  45. package/dist/eval/assert-threshold.d.ts +15 -0
  46. package/dist/eval/assert-threshold.d.ts.map +1 -0
  47. package/dist/eval/assert-threshold.js +27 -0
  48. package/dist/eval/assert-threshold.js.map +1 -0
  49. package/dist/eval/compare-prompt-versions.d.ts +17 -0
  50. package/dist/eval/compare-prompt-versions.d.ts.map +1 -0
  51. package/dist/eval/compare-prompt-versions.js +20 -0
  52. package/dist/eval/compare-prompt-versions.js.map +1 -0
  53. package/dist/eval/run-suite.d.ts +4 -0
  54. package/dist/eval/run-suite.d.ts.map +1 -0
  55. package/dist/eval/run-suite.js +18 -0
  56. package/dist/eval/run-suite.js.map +1 -0
  57. package/dist/eval/scorers.d.ts +13 -0
  58. package/dist/eval/scorers.d.ts.map +1 -0
  59. package/dist/eval/scorers.js +33 -0
  60. package/dist/eval/scorers.js.map +1 -0
  61. package/dist/eval/types.d.ts +27 -0
  62. package/dist/eval/types.d.ts.map +1 -0
  63. package/dist/eval/types.js +2 -0
  64. package/dist/eval/types.js.map +1 -0
  65. package/dist/identity/constitution.d.ts +17 -0
  66. package/dist/identity/constitution.d.ts.map +1 -0
  67. package/dist/identity/constitution.js +33 -0
  68. package/dist/identity/constitution.js.map +1 -0
  69. package/dist/identity/context.d.ts +49 -0
  70. package/dist/identity/context.d.ts.map +1 -0
  71. package/dist/identity/context.js +67 -0
  72. package/dist/identity/context.js.map +1 -0
  73. package/dist/index.d.ts +99 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +55 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/memory/file-store.d.ts +6 -0
  78. package/dist/memory/file-store.d.ts.map +1 -0
  79. package/dist/memory/file-store.js +94 -0
  80. package/dist/memory/file-store.js.map +1 -0
  81. package/dist/memory/from-approval.d.ts +20 -0
  82. package/dist/memory/from-approval.d.ts.map +1 -0
  83. package/dist/memory/from-approval.js +38 -0
  84. package/dist/memory/from-approval.js.map +1 -0
  85. package/dist/memory/memory-store.d.ts +4 -0
  86. package/dist/memory/memory-store.d.ts.map +1 -0
  87. package/dist/memory/memory-store.js +55 -0
  88. package/dist/memory/memory-store.js.map +1 -0
  89. package/dist/memory/types.d.ts +67 -0
  90. package/dist/memory/types.d.ts.map +1 -0
  91. package/dist/memory/types.js +2 -0
  92. package/dist/memory/types.js.map +1 -0
  93. package/dist/privacy/assert-provider-allowed.d.ts +10 -0
  94. package/dist/privacy/assert-provider-allowed.d.ts.map +1 -0
  95. package/dist/privacy/assert-provider-allowed.js +20 -0
  96. package/dist/privacy/assert-provider-allowed.js.map +1 -0
  97. package/dist/privacy/redact-fields.d.ts +11 -0
  98. package/dist/privacy/redact-fields.d.ts.map +1 -0
  99. package/dist/privacy/redact-fields.js +26 -0
  100. package/dist/privacy/redact-fields.js.map +1 -0
  101. package/dist/privacy/redact-text.d.ts +4 -0
  102. package/dist/privacy/redact-text.d.ts.map +1 -0
  103. package/dist/privacy/redact-text.js +26 -0
  104. package/dist/privacy/redact-text.js.map +1 -0
  105. package/dist/privacy/types.d.ts +23 -0
  106. package/dist/privacy/types.d.ts.map +1 -0
  107. package/dist/privacy/types.js +2 -0
  108. package/dist/privacy/types.js.map +1 -0
  109. package/dist/providers/anthropic.d.ts +57 -0
  110. package/dist/providers/anthropic.d.ts.map +1 -0
  111. package/dist/providers/anthropic.js +130 -0
  112. package/dist/providers/anthropic.js.map +1 -0
  113. package/dist/providers/google.d.ts +63 -0
  114. package/dist/providers/google.d.ts.map +1 -0
  115. package/dist/providers/google.js +144 -0
  116. package/dist/providers/google.js.map +1 -0
  117. package/dist/providers/openai.d.ts +56 -0
  118. package/dist/providers/openai.d.ts.map +1 -0
  119. package/dist/providers/openai.js +143 -0
  120. package/dist/providers/openai.js.map +1 -0
  121. package/dist/providers/registry.d.ts +31 -0
  122. package/dist/providers/registry.d.ts.map +1 -0
  123. package/dist/providers/registry.js +35 -0
  124. package/dist/providers/registry.js.map +1 -0
  125. package/dist/providers/types.d.ts +63 -0
  126. package/dist/providers/types.d.ts.map +1 -0
  127. package/dist/providers/types.js +10 -0
  128. package/dist/providers/types.js.map +1 -0
  129. package/dist/rag/chunking/chunk-document.d.ts +13 -0
  130. package/dist/rag/chunking/chunk-document.d.ts.map +1 -0
  131. package/dist/rag/chunking/chunk-document.js +51 -0
  132. package/dist/rag/chunking/chunk-document.js.map +1 -0
  133. package/dist/rag/chunking/incremental.d.ts +19 -0
  134. package/dist/rag/chunking/incremental.d.ts.map +1 -0
  135. package/dist/rag/chunking/incremental.js +24 -0
  136. package/dist/rag/chunking/incremental.js.map +1 -0
  137. package/dist/rag/chunking/types.d.ts +34 -0
  138. package/dist/rag/chunking/types.d.ts.map +1 -0
  139. package/dist/rag/chunking/types.js +2 -0
  140. package/dist/rag/chunking/types.js.map +1 -0
  141. package/dist/rag/embeddings/hashing-provider.d.ts +22 -0
  142. package/dist/rag/embeddings/hashing-provider.d.ts.map +1 -0
  143. package/dist/rag/embeddings/hashing-provider.js +53 -0
  144. package/dist/rag/embeddings/hashing-provider.js.map +1 -0
  145. package/dist/rag/embeddings/types.d.ts +16 -0
  146. package/dist/rag/embeddings/types.d.ts.map +1 -0
  147. package/dist/rag/embeddings/types.js +2 -0
  148. package/dist/rag/embeddings/types.js.map +1 -0
  149. package/dist/rag/index/bm25.d.ts +4 -0
  150. package/dist/rag/index/bm25.d.ts.map +1 -0
  151. package/dist/rag/index/bm25.js +38 -0
  152. package/dist/rag/index/bm25.js.map +1 -0
  153. package/dist/rag/index/memory-index.d.ts +12 -0
  154. package/dist/rag/index/memory-index.d.ts.map +1 -0
  155. package/dist/rag/index/memory-index.js +44 -0
  156. package/dist/rag/index/memory-index.js.map +1 -0
  157. package/dist/rag/index/rrf.d.ts +9 -0
  158. package/dist/rag/index/rrf.d.ts.map +1 -0
  159. package/dist/rag/index/rrf.js +20 -0
  160. package/dist/rag/index/rrf.js.map +1 -0
  161. package/dist/rag/index/types.d.ts +48 -0
  162. package/dist/rag/index/types.d.ts.map +1 -0
  163. package/dist/rag/index/types.js +2 -0
  164. package/dist/rag/index/types.js.map +1 -0
  165. package/dist/rag/index/vector-rank.d.ts +4 -0
  166. package/dist/rag/index/vector-rank.d.ts.map +1 -0
  167. package/dist/rag/index/vector-rank.js +27 -0
  168. package/dist/rag/index/vector-rank.js.map +1 -0
  169. package/dist/reversibility/diff.d.ts +17 -0
  170. package/dist/reversibility/diff.d.ts.map +1 -0
  171. package/dist/reversibility/diff.js +39 -0
  172. package/dist/reversibility/diff.js.map +1 -0
  173. package/dist/reversibility/receipt-store.d.ts +9 -0
  174. package/dist/reversibility/receipt-store.d.ts.map +1 -0
  175. package/dist/reversibility/receipt-store.js +34 -0
  176. package/dist/reversibility/receipt-store.js.map +1 -0
  177. package/dist/reversibility/revert.d.ts +18 -0
  178. package/dist/reversibility/revert.d.ts.map +1 -0
  179. package/dist/reversibility/revert.js +38 -0
  180. package/dist/reversibility/revert.js.map +1 -0
  181. package/dist/reversibility/types.d.ts +25 -0
  182. package/dist/reversibility/types.d.ts.map +1 -0
  183. package/dist/reversibility/types.js +2 -0
  184. package/dist/reversibility/types.js.map +1 -0
  185. package/dist/reversibility/with-receipts.d.ts +19 -0
  186. package/dist/reversibility/with-receipts.d.ts.map +1 -0
  187. package/dist/reversibility/with-receipts.js +35 -0
  188. package/dist/reversibility/with-receipts.js.map +1 -0
  189. package/dist/runtime/loop.d.ts +11 -0
  190. package/dist/runtime/loop.d.ts.map +1 -0
  191. package/dist/runtime/loop.js +116 -0
  192. package/dist/runtime/loop.js.map +1 -0
  193. package/dist/runtime/repetition.d.ts +16 -0
  194. package/dist/runtime/repetition.d.ts.map +1 -0
  195. package/dist/runtime/repetition.js +38 -0
  196. package/dist/runtime/repetition.js.map +1 -0
  197. package/dist/runtime/retry.d.ts +22 -0
  198. package/dist/runtime/retry.d.ts.map +1 -0
  199. package/dist/runtime/retry.js +69 -0
  200. package/dist/runtime/retry.js.map +1 -0
  201. package/dist/runtime/types.d.ts +78 -0
  202. package/dist/runtime/types.d.ts.map +1 -0
  203. package/dist/runtime/types.js +2 -0
  204. package/dist/runtime/types.js.map +1 -0
  205. package/dist/sandbox/types.d.ts +20 -0
  206. package/dist/sandbox/types.d.ts.map +1 -0
  207. package/dist/sandbox/types.js +2 -0
  208. package/dist/sandbox/types.js.map +1 -0
  209. package/dist/sandbox/with-sandbox.d.ts +26 -0
  210. package/dist/sandbox/with-sandbox.d.ts.map +1 -0
  211. package/dist/sandbox/with-sandbox.js +41 -0
  212. package/dist/sandbox/with-sandbox.js.map +1 -0
  213. package/dist/skills/file-store.d.ts +13 -0
  214. package/dist/skills/file-store.d.ts.map +1 -0
  215. package/dist/skills/file-store.js +73 -0
  216. package/dist/skills/file-store.js.map +1 -0
  217. package/dist/skills/frontmatter.d.ts +11 -0
  218. package/dist/skills/frontmatter.d.ts.map +1 -0
  219. package/dist/skills/frontmatter.js +46 -0
  220. package/dist/skills/frontmatter.js.map +1 -0
  221. package/dist/skills/types.d.ts +19 -0
  222. package/dist/skills/types.d.ts.map +1 -0
  223. package/dist/skills/types.js +2 -0
  224. package/dist/skills/types.js.map +1 -0
  225. package/dist/skin/generate.d.ts +22 -0
  226. package/dist/skin/generate.d.ts.map +1 -0
  227. package/dist/skin/generate.js +144 -0
  228. package/dist/skin/generate.js.map +1 -0
  229. package/dist/subagents/run-subagent.d.ts +10 -0
  230. package/dist/subagents/run-subagent.d.ts.map +1 -0
  231. package/dist/subagents/run-subagent.js +24 -0
  232. package/dist/subagents/run-subagent.js.map +1 -0
  233. package/dist/subagents/types.d.ts +13 -0
  234. package/dist/subagents/types.d.ts.map +1 -0
  235. package/dist/subagents/types.js +2 -0
  236. package/dist/subagents/types.js.map +1 -0
  237. package/dist/subagents/validate.d.ts +8 -0
  238. package/dist/subagents/validate.d.ts.map +1 -0
  239. package/dist/subagents/validate.js +32 -0
  240. package/dist/subagents/validate.js.map +1 -0
  241. package/dist/tools/core/agent-delegate.d.ts +34 -0
  242. package/dist/tools/core/agent-delegate.d.ts.map +1 -0
  243. package/dist/tools/core/agent-delegate.js +41 -0
  244. package/dist/tools/core/agent-delegate.js.map +1 -0
  245. package/dist/tools/core/content.d.ts +81 -0
  246. package/dist/tools/core/content.d.ts.map +1 -0
  247. package/dist/tools/core/content.js +121 -0
  248. package/dist/tools/core/content.js.map +1 -0
  249. package/dist/tools/core/http-fetch.d.ts +33 -0
  250. package/dist/tools/core/http-fetch.d.ts.map +1 -0
  251. package/dist/tools/core/http-fetch.js +63 -0
  252. package/dist/tools/core/http-fetch.js.map +1 -0
  253. package/dist/tools/core/media.d.ts +38 -0
  254. package/dist/tools/core/media.d.ts.map +1 -0
  255. package/dist/tools/core/media.js +93 -0
  256. package/dist/tools/core/media.js.map +1 -0
  257. package/dist/tools/core/site-config.d.ts +19 -0
  258. package/dist/tools/core/site-config.d.ts.map +1 -0
  259. package/dist/tools/core/site-config.js +37 -0
  260. package/dist/tools/core/site-config.js.map +1 -0
  261. package/dist/tools/define.d.ts +12 -0
  262. package/dist/tools/define.d.ts.map +1 -0
  263. package/dist/tools/define.js +28 -0
  264. package/dist/tools/define.js.map +1 -0
  265. package/dist/tools/manifest.d.ts +19 -0
  266. package/dist/tools/manifest.d.ts.map +1 -0
  267. package/dist/tools/manifest.js +70 -0
  268. package/dist/tools/manifest.js.map +1 -0
  269. package/dist/tools/registry.d.ts +8 -0
  270. package/dist/tools/registry.d.ts.map +1 -0
  271. package/dist/tools/registry.js +20 -0
  272. package/dist/tools/registry.js.map +1 -0
  273. package/dist/tools/types.d.ts +51 -0
  274. package/dist/tools/types.d.ts.map +1 -0
  275. package/dist/tools/types.js +2 -0
  276. package/dist/tools/types.js.map +1 -0
  277. package/dist/trace/capture.d.ts +19 -0
  278. package/dist/trace/capture.d.ts.map +1 -0
  279. package/dist/trace/capture.js +31 -0
  280. package/dist/trace/capture.js.map +1 -0
  281. package/dist/trace/file-store.d.ts +12 -0
  282. package/dist/trace/file-store.d.ts.map +1 -0
  283. package/dist/trace/file-store.js +78 -0
  284. package/dist/trace/file-store.js.map +1 -0
  285. package/dist/trace/memory-store.d.ts +9 -0
  286. package/dist/trace/memory-store.d.ts.map +1 -0
  287. package/dist/trace/memory-store.js +36 -0
  288. package/dist/trace/memory-store.js.map +1 -0
  289. package/dist/trace/types.d.ts +37 -0
  290. package/dist/trace/types.d.ts.map +1 -0
  291. package/dist/trace/types.js +2 -0
  292. package/dist/trace/types.js.map +1 -0
  293. package/package.json +44 -0
@@ -0,0 +1,38 @@
1
+ const K1 = 1.5;
2
+ const B = 0.75;
3
+ function tokenize(text) {
4
+ return text.toLowerCase().match(/[\p{L}\p{N}]+/gu) ?? [];
5
+ }
6
+ /** Standard Okapi BM25 over each chunk's text — the keyword half of the hybrid search. */
7
+ export function bm25Rank(chunks, queryText) {
8
+ const queryTerms = tokenize(queryText);
9
+ if (chunks.length === 0 || queryTerms.length === 0)
10
+ return [];
11
+ const docs = chunks.map((indexed) => ({
12
+ id: indexed.chunk.id,
13
+ terms: tokenize(indexed.chunk.text),
14
+ }));
15
+ const avgLength = docs.reduce((sum, doc) => sum + doc.terms.length, 0) / docs.length;
16
+ const docFrequency = new Map();
17
+ for (const term of new Set(queryTerms)) {
18
+ docFrequency.set(term, docs.filter((doc) => doc.terms.includes(term)).length);
19
+ }
20
+ const scored = docs.map((doc) => {
21
+ const termCounts = new Map();
22
+ for (const term of doc.terms)
23
+ termCounts.set(term, (termCounts.get(term) ?? 0) + 1);
24
+ let score = 0;
25
+ for (const term of queryTerms) {
26
+ const documentFrequency = docFrequency.get(term) ?? 0;
27
+ if (documentFrequency === 0)
28
+ continue;
29
+ const idf = Math.log((docs.length - documentFrequency + 0.5) / (documentFrequency + 0.5) + 1);
30
+ const termFrequency = termCounts.get(term) ?? 0;
31
+ const denominator = termFrequency + K1 * (1 - B + (B * doc.terms.length) / (avgLength === 0 ? 1 : avgLength));
32
+ score += idf * ((termFrequency * (K1 + 1)) / denominator);
33
+ }
34
+ return { id: doc.id, score };
35
+ });
36
+ return scored.filter((entry) => entry.score > 0).sort((a, b) => b.score - a.score);
37
+ }
38
+ //# sourceMappingURL=bm25.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../../src/rag/index/bm25.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { RagIndex } from './types.js';
2
+ /**
3
+ * The always-available tier (R1) — every process has memory, nothing to
4
+ * configure. `search` filters to `options.canAccess` first, then ranks only
5
+ * what survived: BM25 and cosine similarity each produce a ranked list over
6
+ * the *filtered* candidate set, fused by RRF. A chunk `canAccess` rejects
7
+ * therefore cannot influence the result even indirectly (e.g. as noise in
8
+ * BM25's document-frequency statistics) — it is as if it were never
9
+ * indexed at all, for the duration of this one query.
10
+ */
11
+ export declare function createMemoryRagIndex(): RagIndex;
12
+ //# sourceMappingURL=memory-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-index.d.ts","sourceRoot":"","sources":["../../../src/rag/index/memory-index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAKV,QAAQ,EACT,MAAM,YAAY,CAAA;AAKnB;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,IAAI,QAAQ,CA8B/C"}
@@ -0,0 +1,44 @@
1
+ import { bm25Rank } from './bm25.js';
2
+ import { reciprocalRankFusion } from './rrf.js';
3
+ import { vectorRank } from './vector-rank.js';
4
+ const DEFAULT_LIMIT = 10;
5
+ /**
6
+ * The always-available tier (R1) — every process has memory, nothing to
7
+ * configure. `search` filters to `options.canAccess` first, then ranks only
8
+ * what survived: BM25 and cosine similarity each produce a ranked list over
9
+ * the *filtered* candidate set, fused by RRF. A chunk `canAccess` rejects
10
+ * therefore cannot influence the result even indirectly (e.g. as noise in
11
+ * BM25's document-frequency statistics) — it is as if it were never
12
+ * indexed at all, for the duration of this one query.
13
+ */
14
+ export function createMemoryRagIndex() {
15
+ const chunks = new Map();
16
+ return {
17
+ upsert(indexed) {
18
+ chunks.set(indexed.chunk.id, indexed);
19
+ },
20
+ remove(chunkId) {
21
+ chunks.delete(chunkId);
22
+ },
23
+ search(query, options) {
24
+ const allowed = [...chunks.values()].filter((indexed) => options.canAccess(indexed));
25
+ const byId = new Map(allowed.map((indexed) => [indexed.chunk.id, indexed]));
26
+ const fused = reciprocalRankFusion([
27
+ bm25Rank(allowed, query.text),
28
+ vectorRank(allowed, query.vector),
29
+ ]);
30
+ const limit = options.limit ?? DEFAULT_LIMIT;
31
+ const results = [];
32
+ for (const { id, score } of fused) {
33
+ const indexed = byId.get(id);
34
+ if (indexed === undefined)
35
+ continue;
36
+ results.push({ chunk: indexed.chunk, siteId: indexed.siteId, score });
37
+ if (results.length >= limit)
38
+ break;
39
+ }
40
+ return results;
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=memory-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-index.js","sourceRoot":"","sources":["../../../src/rag/index/memory-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAQ/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,MAAM,aAAa,GAAG,EAAE,CAAA;AAExB;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAA;IAE9C,OAAO;QACL,MAAM,CAAC,OAAqB;YAC1B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QACvC,CAAC;QACD,MAAM,CAAC,OAAe;YACpB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACxB,CAAC;QACD,MAAM,CAAC,KAAwB,EAAE,OAA4B;YAC3D,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;YACpF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;YAE3E,MAAM,KAAK,GAAG,oBAAoB,CAAC;gBACjC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;gBAC7B,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;aAClC,CAAC,CAAA;YAEF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,aAAa,CAAA;YAC5C,MAAM,OAAO,GAAyB,EAAE,CAAA;YACxC,KAAK,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,CAAC;gBAClC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBAC5B,IAAI,OAAO,KAAK,SAAS;oBAAE,SAAQ;gBACnC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;gBACrE,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK;oBAAE,MAAK;YACpC,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { RankedId } from './types.js';
2
+ /**
3
+ * Reciprocal Rank Fusion — merges any number of independently-ranked lists
4
+ * by rank position, not by raw score (BM25 and cosine similarity live on
5
+ * different, incomparable scales, so fusing their scores directly would be
6
+ * meaningless; fusing their ranks is the whole point of RRF).
7
+ */
8
+ export declare function reciprocalRankFusion(rankings: readonly (readonly RankedId[])[], k?: number): readonly RankedId[];
9
+ //# sourceMappingURL=rrf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rrf.d.ts","sourceRoot":"","sources":["../../../src/rag/index/rrf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAI1C;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,SAAS,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,EAC1C,CAAC,SAAY,GACZ,SAAS,QAAQ,EAAE,CAWrB"}
@@ -0,0 +1,20 @@
1
+ const DEFAULT_K = 60;
2
+ /**
3
+ * Reciprocal Rank Fusion — merges any number of independently-ranked lists
4
+ * by rank position, not by raw score (BM25 and cosine similarity live on
5
+ * different, incomparable scales, so fusing their scores directly would be
6
+ * meaningless; fusing their ranks is the whole point of RRF).
7
+ */
8
+ export function reciprocalRankFusion(rankings, k = DEFAULT_K) {
9
+ const fused = new Map();
10
+ for (const ranking of rankings) {
11
+ ranking.forEach((entry, index) => {
12
+ const rank = index + 1;
13
+ fused.set(entry.id, (fused.get(entry.id) ?? 0) + 1 / (k + rank));
14
+ });
15
+ }
16
+ return [...fused.entries()]
17
+ .map(([id, score]) => ({ id, score }))
18
+ .sort((a, b) => b.score - a.score);
19
+ }
20
+ //# sourceMappingURL=rrf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rrf.js","sourceRoot":"","sources":["../../../src/rag/index/rrf.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,EAAE,CAAA;AAEpB;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAA0C,EAC1C,CAAC,GAAG,SAAS;IAEb,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IACvC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC/B,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAA;YACtB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QAClE,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;SACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;AACtC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import type { Chunk } from '../chunking/types.js';
2
+ /**
3
+ * A chunk (task 15) plus what it needs to be searched and to be filtered: the
4
+ * site it belongs to and the vector task 14's `EmbeddingProvider` produced
5
+ * for it. `{provider, model, dimensions}` is not repeated here — an index
6
+ * mixing vectors from two different models is a caller error, not something
7
+ * this module tries to detect; the lot's own answer to a model change is a
8
+ * parallel index (a second `RagIndex` instance), not a mixed one.
9
+ */
10
+ export interface IndexedChunk {
11
+ readonly chunk: Chunk;
12
+ readonly siteId: string;
13
+ readonly vector: readonly number[];
14
+ }
15
+ export interface HybridSearchQuery {
16
+ readonly text: string;
17
+ readonly vector: readonly number[];
18
+ }
19
+ export interface HybridSearchResult {
20
+ readonly chunk: Chunk;
21
+ readonly siteId: string;
22
+ /** The fused RRF score — a rank signal, not a probability or a distance. */
23
+ readonly score: number;
24
+ }
25
+ export interface HybridSearchOptions {
26
+ readonly limit?: number;
27
+ /**
28
+ * Applied to every candidate **before** BM25/vector scoring even run — a
29
+ * chunk this rejects is invisible to ranking, not merely dropped after the
30
+ * fact. "Filtrage de permissions au moment de la requête — non
31
+ * négociable": this module does not know what a draft, a private entry, or
32
+ * a site boundary is — that stays the caller's real permission system's
33
+ * job, structurally injected here exactly like `ContentServiceLike`
34
+ * (task 5).
35
+ */
36
+ readonly canAccess: (chunk: IndexedChunk) => boolean;
37
+ }
38
+ export interface RagIndex {
39
+ upsert(indexed: IndexedChunk): void;
40
+ remove(chunkId: string): void;
41
+ search(query: HybridSearchQuery, options: HybridSearchOptions): readonly HybridSearchResult[];
42
+ }
43
+ /** One ranked list's entry — BM25's, the vector search's, or RRF's fused output. */
44
+ export interface RankedId {
45
+ readonly id: string;
46
+ readonly score: number;
47
+ }
48
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/rag/index/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAEjD;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB;;;;;;;;OAQG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAA;CACrD;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAA;IACnC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,MAAM,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,mBAAmB,GAAG,SAAS,kBAAkB,EAAE,CAAA;CAC9F;AAED,oFAAoF;AACpF,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/rag/index/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { IndexedChunk, RankedId } from './types.js';
2
+ /** The vector half of the hybrid search — cosine similarity against each chunk's stored embedding. */
3
+ export declare function vectorRank(chunks: readonly IndexedChunk[], queryVector: readonly number[]): readonly RankedId[];
4
+ //# sourceMappingURL=vector-rank.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-rank.d.ts","sourceRoot":"","sources":["../../../src/rag/index/vector-rank.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAkBxD,sGAAsG;AACtG,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,SAAS,QAAQ,EAAE,CAQrB"}
@@ -0,0 +1,27 @@
1
+ function cosineSimilarity(a, b) {
2
+ let dot = 0;
3
+ let magnitudeA = 0;
4
+ let magnitudeB = 0;
5
+ const length = Math.min(a.length, b.length);
6
+ for (let i = 0; i < length; i++) {
7
+ const valueA = a[i] ?? 0;
8
+ const valueB = b[i] ?? 0;
9
+ dot += valueA * valueB;
10
+ magnitudeA += valueA * valueA;
11
+ magnitudeB += valueB * valueB;
12
+ }
13
+ if (magnitudeA === 0 || magnitudeB === 0)
14
+ return 0;
15
+ return dot / (Math.sqrt(magnitudeA) * Math.sqrt(magnitudeB));
16
+ }
17
+ /** The vector half of the hybrid search — cosine similarity against each chunk's stored embedding. */
18
+ export function vectorRank(chunks, queryVector) {
19
+ return chunks
20
+ .map((indexed) => ({
21
+ id: indexed.chunk.id,
22
+ score: cosineSimilarity(indexed.vector, queryVector),
23
+ }))
24
+ .filter((entry) => entry.score > 0)
25
+ .sort((a, b) => b.score - a.score);
26
+ }
27
+ //# sourceMappingURL=vector-rank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-rank.js","sourceRoot":"","sources":["../../../src/rag/index/vector-rank.ts"],"names":[],"mappings":"AAEA,SAAS,gBAAgB,CAAC,CAAoB,EAAE,CAAoB;IAClE,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACxB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACxB,GAAG,IAAI,MAAM,GAAG,MAAM,CAAA;QACtB,UAAU,IAAI,MAAM,GAAG,MAAM,CAAA;QAC7B,UAAU,IAAI,MAAM,GAAG,MAAM,CAAA;IAC/B,CAAC;IACD,IAAI,UAAU,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAClD,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;AAC9D,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,UAAU,CACxB,MAA+B,EAC/B,WAA8B;IAE9B,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACjB,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;QACpB,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC;KACrD,CAAC,CAAC;SACF,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;SAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;AACtC,CAAC"}
@@ -0,0 +1,17 @@
1
+ export type DiffChangeKind = 'added' | 'removed' | 'changed';
2
+ export interface DiffEntry {
3
+ readonly path: string;
4
+ readonly kind: DiffChangeKind;
5
+ readonly before: unknown;
6
+ readonly after: unknown;
7
+ }
8
+ /**
9
+ * "Diffé" — Contract C's own word for what every audited action carries.
10
+ * Not wired into every tool automatically (this runtime has no generic way
11
+ * to read a tool's "before" state); a caller who has both snapshots — a
12
+ * revert, a content-edit tool that read the entry first — hands them here
13
+ * to get the field-by-field record R6 asks for, rather than diffing a raw
14
+ * serialisation.
15
+ */
16
+ export declare function diffValues(before: unknown, after: unknown, path?: string): readonly DiffEntry[];
17
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/reversibility/diff.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;AAE5D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACxB;AAUD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,SAAK,GAAG,SAAS,SAAS,EAAE,CAqB3F"}
@@ -0,0 +1,39 @@
1
+ function isPlainObject(value) {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
3
+ }
4
+ function sameValue(a, b) {
5
+ return a === b || JSON.stringify(a) === JSON.stringify(b);
6
+ }
7
+ /**
8
+ * "Diffé" — Contract C's own word for what every audited action carries.
9
+ * Not wired into every tool automatically (this runtime has no generic way
10
+ * to read a tool's "before" state); a caller who has both snapshots — a
11
+ * revert, a content-edit tool that read the entry first — hands them here
12
+ * to get the field-by-field record R6 asks for, rather than diffing a raw
13
+ * serialisation.
14
+ */
15
+ export function diffValues(before, after, path = '') {
16
+ if (isPlainObject(before) && isPlainObject(after)) {
17
+ const entries = [];
18
+ const keys = new Set([...Object.keys(before), ...Object.keys(after)]);
19
+ for (const key of keys) {
20
+ const childPath = path === '' ? key : `${path}.${key}`;
21
+ const hasBefore = Object.hasOwn(before, key);
22
+ const hasAfter = Object.hasOwn(after, key);
23
+ if (!hasBefore) {
24
+ entries.push({ path: childPath, kind: 'added', before: undefined, after: after[key] });
25
+ }
26
+ else if (!hasAfter) {
27
+ entries.push({ path: childPath, kind: 'removed', before: before[key], after: undefined });
28
+ }
29
+ else {
30
+ entries.push(...diffValues(before[key], after[key], childPath));
31
+ }
32
+ }
33
+ return entries;
34
+ }
35
+ if (sameValue(before, after))
36
+ return [];
37
+ return [{ path: path === '' ? '(root)' : path, kind: 'changed', before, after }];
38
+ }
39
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/reversibility/diff.ts"],"names":[],"mappings":"AASA,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,SAAS,CAAC,CAAU,EAAE,CAAU;IACvC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;AAC3D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe,EAAE,KAAc,EAAE,IAAI,GAAG,EAAE;IACnE,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,OAAO,GAAgB,EAAE,CAAA;QAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACrE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAA;YACtD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;YAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACxF,CAAC;iBAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACrB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;YAC3F,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;YACjE,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACvC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;AAClF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ReceiptStore } from './types.js';
2
+ /**
3
+ * In-process — enough for a single run or a single server process to revert
4
+ * a call it just made. A durable store (surviving a restart) is later work,
5
+ * the same "not needed until something depends on it" reasoning `withAudit`
6
+ * and `captureTrace` already followed for their own stores.
7
+ */
8
+ export declare function createMemoryReceiptStore(): ReceiptStore;
9
+ //# sourceMappingURL=receipt-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt-store.d.ts","sourceRoot":"","sources":["../../src/reversibility/receipt-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAyB,YAAY,EAAE,MAAM,YAAY,CAAA;AAErE;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,YAAY,CA6BvD"}
@@ -0,0 +1,34 @@
1
+ import { CogentaError } from '@cogenta/core';
2
+ /**
3
+ * In-process — enough for a single run or a single server process to revert
4
+ * a call it just made. A durable store (surviving a restart) is later work,
5
+ * the same "not needed until something depends on it" reasoning `withAudit`
6
+ * and `captureTrace` already followed for their own stores.
7
+ */
8
+ export function createMemoryReceiptStore() {
9
+ const receipts = new Map();
10
+ return {
11
+ async save(receipt) {
12
+ receipts.set(receipt.id, receipt);
13
+ },
14
+ async get(id) {
15
+ return receipts.get(id) ?? null;
16
+ },
17
+ async list(query = {}) {
18
+ return [...receipts.values()].filter((receipt) => (query.agentName === undefined || receipt.agentName === query.agentName) &&
19
+ (query.toolName === undefined || receipt.toolName === query.toolName));
20
+ },
21
+ async markReverted(id, revertedAt) {
22
+ const existing = receipts.get(id);
23
+ if (existing === undefined) {
24
+ throw new CogentaError({
25
+ code: 'RECEIPT_UNKNOWN',
26
+ message: `No receipt with id "${id}".`,
27
+ hint: 'Check the id, or list receipts to find the right one.',
28
+ });
29
+ }
30
+ receipts.set(id, { ...existing, revertedAt });
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=receipt-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt-store.js","sourceRoot":"","sources":["../../src/reversibility/receipt-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAG5C;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB;IACtC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAA;IAE3C,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,OAAgB;YACzB,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,EAAU;YAClB,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAA;QACjC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,GAAiB,EAAE;YACjC,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAClC,CAAC,OAAO,EAAE,EAAE,CACV,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAC;gBACxE,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,CACxE,CAAA;QACH,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,EAAU,EAAE,UAAkB;YAC/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,YAAY,CAAC;oBACrB,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,uBAAuB,EAAE,IAAI;oBACtC,IAAI,EAAE,uDAAuD;iBAC9D,CAAC,CAAA;YACJ,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAA;QAC/C,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ExecutableTool, ToolExecutionContext } from '../runtime/types.js';
2
+ import type { Receipt, ReceiptStore } from './types.js';
3
+ export interface RevertReceiptOptions {
4
+ readonly store: ReceiptStore;
5
+ /** The tools this agent was actually run with — `revert` is looked up by name from here, not from the whole registry, so a call can only be undone by the same tool that made it. */
6
+ readonly tools: readonly ExecutableTool[];
7
+ readonly ctx: ToolExecutionContext;
8
+ readonly now?: () => number;
9
+ }
10
+ /**
11
+ * Looks up a past call by its receipt id and calls the tool's own `revert`
12
+ * with exactly what that call produced. Refuses a receipt that was already
13
+ * reverted (undoing an undo is not this function's job — a fresh, explicit
14
+ * action is, if that is really what is wanted) and a tool that never
15
+ * declared `revert` at all, even if the receipt itself is real.
16
+ */
17
+ export declare function revertReceipt(receiptId: string, options: RevertReceiptOptions): Promise<Receipt>;
18
+ //# sourceMappingURL=revert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revert.d.ts","sourceRoot":"","sources":["../../src/reversibility/revert.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEvD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;IAC5B,qLAAqL;IACrL,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAA;IACzC,QAAQ,CAAC,GAAG,EAAE,oBAAoB,CAAA;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAC5B;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,OAAO,CAAC,CA8BlB"}
@@ -0,0 +1,38 @@
1
+ import { CogentaError } from '@cogenta/core';
2
+ /**
3
+ * Looks up a past call by its receipt id and calls the tool's own `revert`
4
+ * with exactly what that call produced. Refuses a receipt that was already
5
+ * reverted (undoing an undo is not this function's job — a fresh, explicit
6
+ * action is, if that is really what is wanted) and a tool that never
7
+ * declared `revert` at all, even if the receipt itself is real.
8
+ */
9
+ export async function revertReceipt(receiptId, options) {
10
+ const receipt = await options.store.get(receiptId);
11
+ if (receipt === null) {
12
+ throw new CogentaError({
13
+ code: 'RECEIPT_UNKNOWN',
14
+ message: `No receipt with id "${receiptId}".`,
15
+ hint: 'Check the id, or list receipts to find the right one.',
16
+ });
17
+ }
18
+ if (receipt.revertedAt !== undefined) {
19
+ throw new CogentaError({
20
+ code: 'RECEIPT_ALREADY_REVERTED',
21
+ message: `Receipt "${receiptId}" was already reverted at ${receipt.revertedAt}.`,
22
+ hint: 'This receipt cannot be reverted twice; take a new action instead.',
23
+ });
24
+ }
25
+ const tool = options.tools.find((candidate) => candidate.spec.name === receipt.toolName);
26
+ if (tool?.revert === undefined) {
27
+ throw new CogentaError({
28
+ code: 'RECEIPT_NOT_REVERTIBLE',
29
+ message: `"${receipt.toolName}" has no revert() available in this run.`,
30
+ hint: 'Only a tool declared reversible: true, and present in the current manifest, can be reverted.',
31
+ });
32
+ }
33
+ await tool.revert(receipt.output, options.ctx);
34
+ const revertedAt = new Date((options.now ?? Date.now)()).toISOString();
35
+ await options.store.markReverted(receiptId, revertedAt);
36
+ return { ...receipt, revertedAt };
37
+ }
38
+ //# sourceMappingURL=revert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revert.js","sourceRoot":"","sources":["../../src/reversibility/revert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAY5C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,SAAiB,EACjB,OAA6B;IAE7B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAClD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,uBAAuB,SAAS,IAAI;YAC7C,IAAI,EAAE,uDAAuD;SAC9D,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE,YAAY,SAAS,6BAA6B,OAAO,CAAC,UAAU,GAAG;YAChF,IAAI,EAAE,mEAAmE;SAC1E,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IACxF,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,IAAI,OAAO,CAAC,QAAQ,0CAA0C;YACvE,IAAI,EAAE,8FAA8F;SACrG,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IAC9C,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IACtE,MAAM,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;IACvD,OAAO,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,CAAA;AACnC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Contract C's "reçu" (receipt): a reversible tool's own output, kept so
3
+ * `revert(receipt, ctx)` can later be called with exactly what the original
4
+ * call produced — nothing here is guessed or reconstructed.
5
+ */
6
+ export interface Receipt {
7
+ readonly id: string;
8
+ readonly agentName: string;
9
+ readonly toolName: string;
10
+ readonly input: Readonly<Record<string, unknown>>;
11
+ readonly output: unknown;
12
+ readonly executedAt: string;
13
+ readonly revertedAt?: string;
14
+ }
15
+ export interface ReceiptQuery {
16
+ readonly agentName?: string;
17
+ readonly toolName?: string;
18
+ }
19
+ export interface ReceiptStore {
20
+ save(receipt: Receipt): Promise<void>;
21
+ get(id: string): Promise<Receipt | null>;
22
+ list(query?: ReceiptQuery): Promise<readonly Receipt[]>;
23
+ markReverted(id: string, revertedAt: string): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/reversibility/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACjD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;IACxC,IAAI,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC,CAAA;IACvD,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/reversibility/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import type { ExecutableTool } from '../runtime/types.js';
2
+ import type { ReceiptStore } from './types.js';
3
+ export interface WithReceiptsOptions {
4
+ readonly agentName: string;
5
+ readonly store: ReceiptStore;
6
+ readonly now?: () => number;
7
+ readonly newId?: () => string;
8
+ }
9
+ /**
10
+ * Captures a `Receipt` after every successful call of a `reversible: true`
11
+ * tool — nothing else changes about the call, and nothing is captured for a
12
+ * tool that is not reversible (there would be nothing to revert it with).
13
+ * Composes with `withAudit`/`withAutonomy`: order does not matter for what
14
+ * gets captured, since this only reads the tool's own output.
15
+ */
16
+ export declare function withReceipts(tool: ExecutableTool, options: WithReceiptsOptions): ExecutableTool;
17
+ /** Applies `withReceipts` to every tool in a manifest. */
18
+ export declare function withReceiptsForManifest(tools: readonly ExecutableTool[], options: WithReceiptsOptions): readonly ExecutableTool[];
19
+ //# sourceMappingURL=with-receipts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-receipts.d.ts","sourceRoot":"","sources":["../../src/reversibility/with-receipts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAwB,MAAM,qBAAqB,CAAA;AAC/E,OAAO,KAAK,EAAW,YAAY,EAAE,MAAM,YAAY,CAAA;AAEvD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAA;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,mBAAmB,GAAG,cAAc,CAsB/F;AAED,0DAA0D;AAC1D,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,OAAO,EAAE,mBAAmB,GAC3B,SAAS,cAAc,EAAE,CAE3B"}
@@ -0,0 +1,35 @@
1
+ import { newId } from '@cogenta/core';
2
+ /**
3
+ * Captures a `Receipt` after every successful call of a `reversible: true`
4
+ * tool — nothing else changes about the call, and nothing is captured for a
5
+ * tool that is not reversible (there would be nothing to revert it with).
6
+ * Composes with `withAudit`/`withAutonomy`: order does not matter for what
7
+ * gets captured, since this only reads the tool's own output.
8
+ */
9
+ export function withReceipts(tool, options) {
10
+ if (tool.reversible !== true)
11
+ return tool;
12
+ const now = options.now ?? Date.now;
13
+ const generateId = options.newId ?? newId;
14
+ return {
15
+ ...tool,
16
+ async execute(input, ctx) {
17
+ const output = await tool.execute(input, ctx);
18
+ const receipt = {
19
+ id: generateId(),
20
+ agentName: options.agentName,
21
+ toolName: tool.spec.name,
22
+ input,
23
+ output,
24
+ executedAt: new Date(now()).toISOString(),
25
+ };
26
+ await options.store.save(receipt);
27
+ return output;
28
+ },
29
+ };
30
+ }
31
+ /** Applies `withReceipts` to every tool in a manifest. */
32
+ export function withReceiptsForManifest(tools, options) {
33
+ return tools.map((tool) => withReceipts(tool, options));
34
+ }
35
+ //# sourceMappingURL=with-receipts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-receipts.js","sourceRoot":"","sources":["../../src/reversibility/with-receipts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAWrC;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAAoB,EAAE,OAA4B;IAC7E,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAEzC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAA;IACnC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IAEzC,OAAO;QACL,GAAG,IAAI;QACP,KAAK,CAAC,OAAO,CAAC,KAAwC,EAAE,GAAyB;YAC/E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YAC7C,MAAM,OAAO,GAAY;gBACvB,EAAE,EAAE,UAAU,EAAE;gBAChB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;gBACxB,KAAK;gBACL,MAAM;gBACN,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE;aAC1C,CAAA;YACD,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACjC,OAAO,MAAM,CAAA;QACf,CAAC;KACF,CAAA;AACH,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,uBAAuB,CACrC,KAAgC,EAChC,OAA4B;IAE5B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;AACzD,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { RunAgentLoopInput, RunResult } from './types.js';
2
+ /**
3
+ * L4 task 2: one model call, tool dispatch, repeat — with the three guards
4
+ * the lot's own "pièges connus" call out by name: a step ceiling, repetition
5
+ * detection, and per-call cost (usage) measured from the first line rather
6
+ * than discovered later. Permission checking (task 4) and budgets (task 8)
7
+ * wrap this from the outside; this loop only knows how to hold a
8
+ * conversation with a model and the tools it was handed.
9
+ */
10
+ export declare function runAgentLoop(input: RunAgentLoopInput): Promise<RunResult>;
11
+ //# sourceMappingURL=loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/runtime/loop.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,iBAAiB,EACjB,SAAS,EAGV,MAAM,YAAY,CAAA;AAkCnB;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,CAoG/E"}