@kaleidorg/mind 0.0.1 → 0.2.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 (191) hide show
  1. package/dist/capabilities.d.ts +34 -0
  2. package/dist/capabilities.d.ts.map +1 -0
  3. package/dist/capabilities.js +34 -0
  4. package/dist/capabilities.js.map +1 -0
  5. package/dist/context/budget.d.ts +29 -0
  6. package/dist/context/budget.d.ts.map +1 -0
  7. package/dist/context/budget.js +36 -0
  8. package/dist/context/budget.js.map +1 -0
  9. package/dist/context/builder.d.ts +39 -0
  10. package/dist/context/builder.d.ts.map +1 -0
  11. package/dist/context/builder.js +77 -0
  12. package/dist/context/builder.js.map +1 -0
  13. package/dist/engine.d.ts +9 -0
  14. package/dist/engine.d.ts.map +1 -1
  15. package/dist/engine.js +18 -2
  16. package/dist/engine.js.map +1 -1
  17. package/dist/fastpath/fastpath.d.ts +38 -0
  18. package/dist/fastpath/fastpath.d.ts.map +1 -0
  19. package/dist/fastpath/fastpath.js +52 -0
  20. package/dist/fastpath/fastpath.js.map +1 -0
  21. package/dist/funnel.d.ts +111 -0
  22. package/dist/funnel.d.ts.map +1 -0
  23. package/dist/funnel.js +175 -0
  24. package/dist/funnel.js.map +1 -0
  25. package/dist/index.d.ts +43 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +32 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/knowledge/bitcoin-copilot.d.ts +11 -0
  30. package/dist/knowledge/bitcoin-copilot.d.ts.map +1 -0
  31. package/dist/knowledge/bitcoin-copilot.js +155 -0
  32. package/dist/knowledge/bitcoin-copilot.js.map +1 -0
  33. package/dist/knowledge/merchants.d.ts +24 -0
  34. package/dist/knowledge/merchants.d.ts.map +1 -0
  35. package/dist/knowledge/merchants.js +34 -0
  36. package/dist/knowledge/merchants.js.map +1 -0
  37. package/dist/knowledge/wallet.d.ts +34 -0
  38. package/dist/knowledge/wallet.d.ts.map +1 -0
  39. package/dist/knowledge/wallet.js +63 -0
  40. package/dist/knowledge/wallet.js.map +1 -0
  41. package/dist/memory/store.d.ts +34 -0
  42. package/dist/memory/store.d.ts.map +1 -0
  43. package/dist/memory/store.js +103 -0
  44. package/dist/memory/store.js.map +1 -0
  45. package/dist/memory/tool.d.ts +9 -0
  46. package/dist/memory/tool.d.ts.map +1 -0
  47. package/dist/memory/tool.js +70 -0
  48. package/dist/memory/tool.js.map +1 -0
  49. package/dist/memory/types.d.ts +56 -0
  50. package/dist/memory/types.d.ts.map +1 -0
  51. package/dist/memory/types.js +14 -0
  52. package/dist/memory/types.js.map +1 -0
  53. package/dist/rag/retriever.d.ts +30 -0
  54. package/dist/rag/retriever.d.ts.map +1 -0
  55. package/dist/rag/retriever.js +72 -0
  56. package/dist/rag/retriever.js.map +1 -0
  57. package/dist/rag/tool.d.ts +15 -0
  58. package/dist/rag/tool.d.ts.map +1 -0
  59. package/dist/rag/tool.js +42 -0
  60. package/dist/rag/tool.js.map +1 -0
  61. package/dist/rag/types.d.ts +44 -0
  62. package/dist/rag/types.d.ts.map +1 -0
  63. package/dist/rag/types.js +11 -0
  64. package/dist/rag/types.js.map +1 -0
  65. package/dist/rag/vector-store.d.ts +23 -0
  66. package/dist/rag/vector-store.d.ts.map +1 -0
  67. package/dist/rag/vector-store.js +72 -0
  68. package/dist/rag/vector-store.js.map +1 -0
  69. package/dist/recipe/asset-send.d.ts +15 -0
  70. package/dist/recipe/asset-send.d.ts.map +1 -0
  71. package/dist/recipe/asset-send.js +83 -0
  72. package/dist/recipe/asset-send.js.map +1 -0
  73. package/dist/recipe/payments.d.ts +15 -0
  74. package/dist/recipe/payments.d.ts.map +1 -0
  75. package/dist/recipe/payments.js +119 -0
  76. package/dist/recipe/payments.js.map +1 -0
  77. package/dist/recipe/receive.d.ts +14 -0
  78. package/dist/recipe/receive.d.ts.map +1 -0
  79. package/dist/recipe/receive.js +109 -0
  80. package/dist/recipe/receive.js.map +1 -0
  81. package/dist/recipe/runner.d.ts +42 -0
  82. package/dist/recipe/runner.d.ts.map +1 -0
  83. package/dist/recipe/runner.js +94 -0
  84. package/dist/recipe/runner.js.map +1 -0
  85. package/dist/recipe/swap.d.ts +16 -0
  86. package/dist/recipe/swap.d.ts.map +1 -0
  87. package/dist/recipe/swap.js +73 -0
  88. package/dist/recipe/swap.js.map +1 -0
  89. package/dist/recipe/types.d.ts +71 -0
  90. package/dist/recipe/types.d.ts.map +1 -0
  91. package/dist/recipe/types.js +13 -0
  92. package/dist/recipe/types.js.map +1 -0
  93. package/dist/skills/bundle.d.ts +30 -0
  94. package/dist/skills/bundle.d.ts.map +1 -0
  95. package/dist/skills/bundle.js +24 -0
  96. package/dist/skills/bundle.js.map +1 -0
  97. package/dist/skills/loader.d.ts +33 -0
  98. package/dist/skills/loader.d.ts.map +1 -0
  99. package/dist/skills/loader.js +59 -0
  100. package/dist/skills/loader.js.map +1 -0
  101. package/dist/skills/reference-source.d.ts +18 -0
  102. package/dist/skills/reference-source.d.ts.map +1 -0
  103. package/dist/skills/reference-source.js +53 -0
  104. package/dist/skills/reference-source.js.map +1 -0
  105. package/dist/skills/registry.d.ts +41 -0
  106. package/dist/skills/registry.d.ts.map +1 -0
  107. package/dist/skills/registry.js +167 -0
  108. package/dist/skills/registry.js.map +1 -0
  109. package/dist/skills/types.d.ts +53 -0
  110. package/dist/skills/types.d.ts.map +1 -0
  111. package/dist/skills/types.js +18 -0
  112. package/dist/skills/types.js.map +1 -0
  113. package/dist/tools/cli.d.ts +43 -0
  114. package/dist/tools/cli.d.ts.map +1 -0
  115. package/dist/tools/cli.js +61 -0
  116. package/dist/tools/cli.js.map +1 -0
  117. package/dist/tools/l402.d.ts +47 -0
  118. package/dist/tools/l402.d.ts.map +1 -0
  119. package/dist/tools/l402.js +84 -0
  120. package/dist/tools/l402.js.map +1 -0
  121. package/dist/tools/mcp.d.ts +3 -2
  122. package/dist/tools/mcp.d.ts.map +1 -1
  123. package/dist/tools/mcp.js +3 -2
  124. package/dist/tools/mcp.js.map +1 -1
  125. package/dist/wallet/contract.d.ts +57 -0
  126. package/dist/wallet/contract.d.ts.map +1 -0
  127. package/dist/wallet/contract.js +113 -0
  128. package/dist/wallet/contract.js.map +1 -0
  129. package/package.json +16 -5
  130. package/scripts/bundle-skills.mjs +84 -0
  131. package/skills/README.md +74 -0
  132. package/skills/bitrefill/SKILL.md +66 -0
  133. package/skills/bitrefill/references/api.md +99 -0
  134. package/skills/bitrefill/references/browse.md +71 -0
  135. package/skills/bitrefill/references/capability-matrix.md +115 -0
  136. package/skills/bitrefill/references/cli-headless-auth.md +133 -0
  137. package/skills/bitrefill/references/cli.md +237 -0
  138. package/skills/bitrefill/references/host-openclaw.md +167 -0
  139. package/skills/bitrefill/references/mcp.md +150 -0
  140. package/skills/bitrefill/references/safeguards.md +138 -0
  141. package/skills/bitrefill/references/troubleshooting.md +182 -0
  142. package/skills/kaleido-trading/SKILL.md +31 -0
  143. package/skills/kaleido-wallet/SKILL.md +28 -0
  144. package/src/capabilities.ts +67 -0
  145. package/src/context/budget.ts +46 -0
  146. package/src/context/builder.ts +100 -0
  147. package/src/context/context.test.ts +83 -0
  148. package/src/engine.test.ts +204 -0
  149. package/src/engine.ts +27 -2
  150. package/src/fastpath/fastpath.test.ts +34 -0
  151. package/src/fastpath/fastpath.ts +70 -0
  152. package/src/funnel.test.ts +207 -0
  153. package/src/funnel.ts +260 -0
  154. package/src/index.ts +102 -0
  155. package/src/knowledge/bitcoin-copilot.ts +177 -0
  156. package/src/knowledge/knowledge.test.ts +63 -0
  157. package/src/knowledge/merchants.ts +49 -0
  158. package/src/knowledge/wallet.ts +84 -0
  159. package/src/memory/memory.test.ts +85 -0
  160. package/src/memory/store.ts +129 -0
  161. package/src/memory/tool.ts +76 -0
  162. package/src/memory/types.ts +63 -0
  163. package/src/rag/rag.test.ts +85 -0
  164. package/src/rag/retriever.ts +94 -0
  165. package/src/rag/tool.ts +55 -0
  166. package/src/rag/types.ts +49 -0
  167. package/src/rag/vector-store.ts +78 -0
  168. package/src/recipe/asset-send.ts +79 -0
  169. package/src/recipe/payments.ts +116 -0
  170. package/src/recipe/receive.ts +98 -0
  171. package/src/recipe/recipe.test.ts +193 -0
  172. package/src/recipe/runner.ts +122 -0
  173. package/src/recipe/swap.ts +74 -0
  174. package/src/recipe/types.ts +76 -0
  175. package/src/skills/bundle.ts +42 -0
  176. package/src/skills/loader.ts +63 -0
  177. package/src/skills/reference-source.ts +60 -0
  178. package/src/skills/registry.ts +183 -0
  179. package/src/skills/skills.test.ts +191 -0
  180. package/src/skills/types.ts +55 -0
  181. package/src/tools/cli.test.ts +53 -0
  182. package/src/tools/cli.ts +98 -0
  183. package/src/tools/l402.test.ts +113 -0
  184. package/src/tools/l402.ts +122 -0
  185. package/src/tools/mcp.ts +3 -2
  186. package/src/wallet/contract.test.ts +89 -0
  187. package/src/wallet/contract.ts +157 -0
  188. package/dist/providers/qvac.d.ts +0 -89
  189. package/dist/providers/qvac.d.ts.map +0 -1
  190. package/dist/providers/qvac.js +0 -150
  191. package/dist/providers/qvac.js.map +0 -1
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Personal wallet knowledge — turn a user's transaction history + contacts into
3
+ * `RagDocument[]` so the agent can answer "what did I spend on coffee last
4
+ * month?", "who did I pay 50k sats to?", "summarise my swaps" — all on-device,
5
+ * nothing leaving the phone.
6
+ *
7
+ * Pure transforms over minimal, generic shapes (hosts map their own types in).
8
+ * No deps, no PII leaves: the host decides what to ingest.
9
+ */
10
+ function isoDate(ts) {
11
+ if (!ts)
12
+ return 'an unknown date';
13
+ // Avoid Date formatting differences — just YYYY-MM-DD from the ISO string.
14
+ try {
15
+ return new Date(ts).toISOString().slice(0, 10);
16
+ }
17
+ catch {
18
+ return 'an unknown date';
19
+ }
20
+ }
21
+ /** One short, searchable sentence per transaction. */
22
+ export function walletHistoryToDocuments(txs) {
23
+ return txs.map((tx, i) => {
24
+ const date = isoDate(tx.timestamp);
25
+ const asset = tx.asset ?? 'sats';
26
+ const amount = tx.amountSats != null ? `${tx.amountSats} ${asset === 'BTC' ? 'sats' : asset}` : 'an amount';
27
+ const verb = tx.type === 'receive' || tx.type === 'deposit'
28
+ ? 'received'
29
+ : tx.type === 'swap'
30
+ ? 'swapped'
31
+ : tx.type === 'withdraw'
32
+ ? 'withdrew'
33
+ : 'sent';
34
+ const who = tx.counterparty ? ` ${verb === 'received' ? 'from' : 'to'} ${tx.counterparty}` : '';
35
+ const memo = tx.memo ? ` — "${tx.memo}"` : '';
36
+ const status = tx.status && tx.status !== 'complete' ? ` (${tx.status})` : '';
37
+ return {
38
+ id: tx.id ?? `tx_${i}`,
39
+ text: `On ${date} you ${verb} ${amount}${who}${memo}${status}.`,
40
+ metadata: { kind: 'transaction', type: tx.type, asset: tx.asset, timestamp: tx.timestamp },
41
+ };
42
+ });
43
+ }
44
+ /** One doc per contact, so "who is Bob?" / "pay my friend" can resolve. */
45
+ export function contactsToDocuments(contacts) {
46
+ return contacts
47
+ .filter((c) => c.name || c.lightningAddress || c.npub)
48
+ .map((c, i) => {
49
+ const parts = [];
50
+ if (c.lightningAddress)
51
+ parts.push(`Lightning address ${c.lightningAddress}`);
52
+ if (c.npub)
53
+ parts.push(`Nostr ${c.npub}`);
54
+ if (c.note)
55
+ parts.push(c.note);
56
+ return {
57
+ id: `contact_${c.name ?? c.lightningAddress ?? i}`,
58
+ text: `Contact: ${c.name ?? 'unnamed'}${parts.length ? ` — ${parts.join(', ')}` : ''}.`,
59
+ metadata: { kind: 'contact', name: c.name },
60
+ };
61
+ });
62
+ }
63
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/knowledge/wallet.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAyBH,SAAS,OAAO,CAAC,EAAW;IAC1B,IAAI,CAAC,EAAE;QAAE,OAAO,iBAAiB,CAAC;IAClC,2EAA2E;IAC3E,IAAI,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,iBAAiB,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,wBAAwB,CAAC,GAAe;IACtD,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,IAAI,MAAM,CAAC;QACjC,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,UAAU,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;QAC5G,MAAM,IAAI,GACR,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS;YAC5C,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM;gBAClB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,UAAU;oBACtB,CAAC,CAAC,UAAU;oBACZ,CAAC,CAAC,MAAM,CAAC;QACjB,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,OAAO;YACL,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE;YACtB,IAAI,EAAE,MAAM,IAAI,QAAQ,IAAI,IAAI,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM,GAAG;YAC/D,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE;SAC3F,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,QAAmB;IACrD,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,IAAI,CAAC;SACrD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACZ,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,gBAAgB;YAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO;YACL,EAAE,EAAE,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,EAAE;YAClD,IAAI,EAAE,YAAY,CAAC,CAAC,IAAI,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;YACvF,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;SAC5C,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * MemoryStore implementation — in-memory, with optional injected persistence
3
+ * and optional semantic ranking. Pure TS, zero deps.
4
+ *
5
+ * const store = new InMemoryMemoryStore(); // ephemeral
6
+ * const store = new InMemoryMemoryStore({ io }); // persisted (RN/Node)
7
+ * const store = new InMemoryMemoryStore({ io, embed }); // + semantic recall
8
+ */
9
+ import type { MemoryIO, MemoryItem, MemoryQuery, MemoryStore, NewMemory } from './types.js';
10
+ export interface MemoryStoreOptions {
11
+ /** Persistence (load on first use, save on writes). Omit for ephemeral memory. */
12
+ io?: MemoryIO;
13
+ /** Embed text for semantic recall. Omit to fall back to substring matching. */
14
+ embed?: (text: string) => Promise<number[]>;
15
+ /** Clock — injectable for deterministic tests. */
16
+ now?: () => number;
17
+ }
18
+ export declare class InMemoryMemoryStore implements MemoryStore {
19
+ private items;
20
+ private hydrated;
21
+ private counter;
22
+ private readonly io?;
23
+ private readonly embed?;
24
+ private readonly now;
25
+ constructor(opts?: MemoryStoreOptions);
26
+ private hydrate;
27
+ private persist;
28
+ add(item: NewMemory): Promise<MemoryItem>;
29
+ all(): Promise<MemoryItem[]>;
30
+ search(query: MemoryQuery): Promise<MemoryItem[]>;
31
+ remove(id: string): Promise<void>;
32
+ clear(): Promise<void>;
33
+ }
34
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,kBAAkB;IACjC,kFAAkF;IAClF,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd,+EAA+E;IAC/E,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAW;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAsC;IAC7D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,IAAI,GAAE,kBAAuB;YAM3B,OAAO;YAaP,OAAO;IAIf,GAAG,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAiBzC,GAAG,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAK5B,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAqCjD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * MemoryStore implementation — in-memory, with optional injected persistence
3
+ * and optional semantic ranking. Pure TS, zero deps.
4
+ *
5
+ * const store = new InMemoryMemoryStore(); // ephemeral
6
+ * const store = new InMemoryMemoryStore({ io }); // persisted (RN/Node)
7
+ * const store = new InMemoryMemoryStore({ io, embed }); // + semantic recall
8
+ */
9
+ import { cosineSimilarity } from '../rag/vector-store.js';
10
+ export class InMemoryMemoryStore {
11
+ items = [];
12
+ hydrated = false;
13
+ counter = 0;
14
+ io;
15
+ embed;
16
+ now;
17
+ constructor(opts = {}) {
18
+ this.io = opts.io;
19
+ this.embed = opts.embed;
20
+ this.now = opts.now ?? (() => Date.now());
21
+ }
22
+ async hydrate() {
23
+ if (this.hydrated)
24
+ return;
25
+ this.hydrated = true;
26
+ if (this.io) {
27
+ try {
28
+ this.items = await this.io.load();
29
+ this.counter = this.items.length;
30
+ }
31
+ catch {
32
+ this.items = [];
33
+ }
34
+ }
35
+ }
36
+ async persist() {
37
+ if (this.io)
38
+ await this.io.save(this.items);
39
+ }
40
+ async add(item) {
41
+ await this.hydrate();
42
+ const embedding = item.embedding ?? (this.embed ? await this.embed(item.text).catch(() => undefined) : undefined);
43
+ const full = {
44
+ id: item.id ?? `mem_${this.now()}_${++this.counter}`,
45
+ text: item.text,
46
+ kind: item.kind,
47
+ tags: item.tags,
48
+ createdAt: item.createdAt ?? this.now(),
49
+ ...(embedding ? { embedding } : {}),
50
+ };
51
+ this.items.push(full);
52
+ await this.persist();
53
+ return full;
54
+ }
55
+ async all() {
56
+ await this.hydrate();
57
+ return [...this.items];
58
+ }
59
+ async search(query) {
60
+ await this.hydrate();
61
+ const limit = query.limit ?? 5;
62
+ let pool = this.items;
63
+ if (query.kind)
64
+ pool = pool.filter((m) => m.kind === query.kind);
65
+ if (query.tags?.length) {
66
+ pool = pool.filter((m) => query.tags.every((t) => m.tags?.includes(t)));
67
+ }
68
+ const text = query.text?.trim();
69
+ if (!text) {
70
+ // No query text → most recent first.
71
+ return [...pool].sort((a, b) => b.createdAt - a.createdAt).slice(0, limit);
72
+ }
73
+ // Semantic ranking when both the query and items are embedded.
74
+ if (this.embed && pool.some((m) => m.embedding)) {
75
+ const qv = await this.embed(text).catch(() => null);
76
+ if (qv) {
77
+ return [...pool]
78
+ .map((m) => ({ m, score: m.embedding ? cosineSimilarity(qv, m.embedding) : -1 }))
79
+ .sort((a, b) => b.score - a.score)
80
+ .slice(0, limit)
81
+ .map((x) => x.m);
82
+ }
83
+ }
84
+ // Fallback: substring score + recency.
85
+ const q = text.toLowerCase();
86
+ return [...pool]
87
+ .map((m) => ({ m, hit: m.text.toLowerCase().includes(q) ? 1 : 0 }))
88
+ .sort((a, b) => b.hit - a.hit || b.m.createdAt - a.m.createdAt)
89
+ .slice(0, limit)
90
+ .map((x) => x.m);
91
+ }
92
+ async remove(id) {
93
+ await this.hydrate();
94
+ this.items = this.items.filter((m) => m.id !== id);
95
+ await this.persist();
96
+ }
97
+ async clear() {
98
+ await this.hydrate();
99
+ this.items = [];
100
+ await this.persist();
101
+ }
102
+ }
103
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Memory tool source — lets the agent persist and recall things across
3
+ * sessions (`remember`, `recall`). Pairs with auto-recall in the
4
+ * ContextBuilder; this is the explicit, agent-driven side.
5
+ */
6
+ import type { ToolSource } from '../tools/source.js';
7
+ import type { MemoryStore } from './types.js';
8
+ export declare function createMemoryToolSource(store: MemoryStore): ToolSource;
9
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/memory/tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,YAAY,CAAC;AAM1D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CA6DrE"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Memory tool source — lets the agent persist and recall things across
3
+ * sessions (`remember`, `recall`). Pairs with auto-recall in the
4
+ * ContextBuilder; this is the explicit, agent-driven side.
5
+ */
6
+ const REMEMBER = 'remember';
7
+ const RECALL = 'recall';
8
+ const KINDS = ['fact', 'preference', 'event', 'note'];
9
+ export function createMemoryToolSource(store) {
10
+ const tools = [
11
+ {
12
+ name: REMEMBER,
13
+ description: 'Save something to long-term memory so you recall it in future sessions ' +
14
+ '— a user preference, a fact, or an event. Use sparingly for durable info.',
15
+ parameters: {
16
+ type: 'object',
17
+ properties: {
18
+ text: { type: 'string', description: 'What to remember (a short sentence)' },
19
+ kind: { type: 'string', enum: KINDS, description: 'fact | preference | event | note' },
20
+ tags: { type: 'array', items: { type: 'string' }, description: 'Optional tags' },
21
+ },
22
+ required: ['text'],
23
+ },
24
+ },
25
+ {
26
+ name: RECALL,
27
+ description: 'Search your long-term memory for what you know about something before answering.',
28
+ parameters: {
29
+ type: 'object',
30
+ properties: {
31
+ query: { type: 'string', description: 'What to recall' },
32
+ limit: { type: 'number', description: 'Max items (default 5)' },
33
+ },
34
+ required: ['query'],
35
+ },
36
+ },
37
+ ];
38
+ async function execute(name, args) {
39
+ if (name === REMEMBER) {
40
+ const text = String(args.text ?? '').trim();
41
+ if (!text)
42
+ throw new Error('remember: text is required');
43
+ const kind = KINDS.includes(String(args.kind))
44
+ ? args.kind
45
+ : 'note';
46
+ const tags = Array.isArray(args.tags) ? args.tags.map(String) : undefined;
47
+ const item = await store.add({ text, kind, tags });
48
+ return `Remembered (${item.kind}): ${item.text}`;
49
+ }
50
+ if (name === RECALL) {
51
+ const query = String(args.query ?? '').trim();
52
+ if (!query)
53
+ throw new Error('recall: query is required');
54
+ const limit = Number(args.limit) > 0 ? Number(args.limit) : 5;
55
+ const items = await store.search({ text: query, limit });
56
+ if (items.length === 0)
57
+ return 'Nothing relevant in memory.';
58
+ return items.map((m) => `- (${m.kind}) ${m.text}`).join('\n');
59
+ }
60
+ throw new Error(`memory: unknown tool ${name}`);
61
+ }
62
+ const names = new Set([REMEMBER, RECALL]);
63
+ return {
64
+ id: 'memory',
65
+ listTools: () => tools,
66
+ has: (name) => names.has(name),
67
+ execute,
68
+ };
69
+ }
70
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/memory/tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Memory — the agent's persistent identity + what it has learned.
3
+ *
4
+ * Two layers, mirroring how nanobot splits SOUL.md / AGENTS.md / memory:
5
+ * - AgentProfile — static identity ("who am I, how do I behave"). Injected.
6
+ * - MemoryStore — durable, growing facts/preferences/events the agent
7
+ * remembers across sessions. Pluggable storage.
8
+ *
9
+ * Pure data + interfaces — no storage or embedding deps. The host injects
10
+ * persistence (AsyncStorage on RN, fs/SQLite on Node) and, optionally, an
11
+ * EmbeddingProvider for semantic recall.
12
+ */
13
+ /** Static agent identity, composed into the system prompt every turn. */
14
+ export interface AgentProfile {
15
+ /** Display name, e.g. "KaleidoMind". */
16
+ name: string;
17
+ /** Persona / identity — the "soul". Who the agent is, its voice, its values. */
18
+ soul: string;
19
+ /** Operating instructions / house rules (optional). */
20
+ instructions?: string;
21
+ }
22
+ export type MemoryKind = 'fact' | 'preference' | 'event' | 'note';
23
+ export interface MemoryItem {
24
+ id: string;
25
+ text: string;
26
+ kind: MemoryKind;
27
+ /** Epoch ms. */
28
+ createdAt: number;
29
+ tags?: string[];
30
+ /** Optional embedding for semantic recall (set when an embedder is wired). */
31
+ embedding?: number[];
32
+ }
33
+ /** What to add — id/createdAt/embedding are filled in by the store. */
34
+ export type NewMemory = Omit<MemoryItem, 'id' | 'createdAt' | 'embedding'> & Partial<Pick<MemoryItem, 'id' | 'createdAt' | 'embedding'>>;
35
+ export interface MemoryQuery {
36
+ /** Free text to match (semantic if embeddings are available, else substring). */
37
+ text?: string;
38
+ kind?: MemoryKind;
39
+ tags?: string[];
40
+ /** Max items to return (default 5). */
41
+ limit?: number;
42
+ }
43
+ export interface MemoryStore {
44
+ add(item: NewMemory): Promise<MemoryItem>;
45
+ all(): Promise<MemoryItem[]>;
46
+ /** Best-matching items for the query (recency-ranked, or semantic if embedded). */
47
+ search(query: MemoryQuery): Promise<MemoryItem[]>;
48
+ remove(id: string): Promise<void>;
49
+ clear(): Promise<void>;
50
+ }
51
+ /** Injected persistence — load once, save on every mutation. RN/Node provide it. */
52
+ export interface MemoryIO {
53
+ load(): Promise<MemoryItem[]>;
54
+ save(items: MemoryItem[]): Promise<void>;
55
+ }
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,uEAAuE;AACvE,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GACxE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,GAAG,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7B,mFAAmF;IACnF,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,oFAAoF;AACpF,MAAM,WAAW,QAAQ;IACvB,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Memory — the agent's persistent identity + what it has learned.
3
+ *
4
+ * Two layers, mirroring how nanobot splits SOUL.md / AGENTS.md / memory:
5
+ * - AgentProfile — static identity ("who am I, how do I behave"). Injected.
6
+ * - MemoryStore — durable, growing facts/preferences/events the agent
7
+ * remembers across sessions. Pluggable storage.
8
+ *
9
+ * Pure data + interfaces — no storage or embedding deps. The host injects
10
+ * persistence (AsyncStorage on RN, fs/SQLite on Node) and, optionally, an
11
+ * EmbeddingProvider for semantic recall.
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Retriever — ties an injected EmbeddingProvider to a VectorStore: ingest
3
+ * documents (chunk → embed → upsert) and search (embed query → top-k). Pure
4
+ * TS; the embedding model is the host's (QVAC `embed()` on device).
5
+ */
6
+ import type { EmbeddingProvider, RagDocument, RetrievedChunk, VectorStore } from './types.js';
7
+ export interface RetrieverOptions {
8
+ embeddings: EmbeddingProvider;
9
+ /** Vector index (defaults to a fresh in-memory cosine store). */
10
+ store?: VectorStore;
11
+ /** Approx chars per chunk (default 800 ≈ 200 tokens). */
12
+ chunkSize?: number;
13
+ /** Chars of overlap between chunks (default 100). */
14
+ chunkOverlap?: number;
15
+ }
16
+ /** Split text into overlapping chunks, preferring paragraph/sentence breaks. */
17
+ export declare function chunkText(text: string, size?: number, overlap?: number): string[];
18
+ export declare class Retriever {
19
+ private readonly embeddings;
20
+ private readonly store;
21
+ private readonly chunkSize;
22
+ private readonly chunkOverlap;
23
+ constructor(opts: RetrieverOptions);
24
+ /** Chunk, embed, and index documents. Returns the number of chunks stored. */
25
+ ingest(docs: RagDocument[]): Promise<number>;
26
+ /** Embed the query and return the top-k most similar chunks. */
27
+ search(query: string, k?: number): Promise<RetrievedChunk[]>;
28
+ vectorStore(): VectorStore;
29
+ }
30
+ //# sourceMappingURL=retriever.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retriever.d.ts","sourceRoot":"","sources":["../../src/rag/retriever.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,iEAAiE;IACjE,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAM,EAAE,OAAO,SAAM,GAAG,MAAM,EAAE,CAwB3E;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,IAAI,EAAE,gBAAgB;IAOlC,8EAA8E;IACxE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBlD,gEAAgE;IAC1D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,SAAI,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAO7D,WAAW,IAAI,WAAW;CAG3B"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Retriever — ties an injected EmbeddingProvider to a VectorStore: ingest
3
+ * documents (chunk → embed → upsert) and search (embed query → top-k). Pure
4
+ * TS; the embedding model is the host's (QVAC `embed()` on device).
5
+ */
6
+ import { InMemoryVectorStore } from './vector-store.js';
7
+ /** Split text into overlapping chunks, preferring paragraph/sentence breaks. */
8
+ export function chunkText(text, size = 800, overlap = 100) {
9
+ const clean = text.replace(/\r\n/g, '\n').trim();
10
+ if (clean.length <= size)
11
+ return clean ? [clean] : [];
12
+ const chunks = [];
13
+ let start = 0;
14
+ while (start < clean.length) {
15
+ let end = Math.min(start + size, clean.length);
16
+ if (end < clean.length) {
17
+ // Back up to the nearest paragraph/sentence/space boundary.
18
+ const slice = clean.slice(start, end);
19
+ const brk = Math.max(slice.lastIndexOf('\n\n'), slice.lastIndexOf('\n'), slice.lastIndexOf('. '), slice.lastIndexOf(' '));
20
+ if (brk > size * 0.5)
21
+ end = start + brk + 1;
22
+ }
23
+ const piece = clean.slice(start, end).trim();
24
+ if (piece)
25
+ chunks.push(piece);
26
+ if (end >= clean.length)
27
+ break;
28
+ start = Math.max(end - overlap, start + 1);
29
+ }
30
+ return chunks;
31
+ }
32
+ export class Retriever {
33
+ embeddings;
34
+ store;
35
+ chunkSize;
36
+ chunkOverlap;
37
+ constructor(opts) {
38
+ this.embeddings = opts.embeddings;
39
+ this.store = opts.store ?? new InMemoryVectorStore();
40
+ this.chunkSize = opts.chunkSize ?? 800;
41
+ this.chunkOverlap = opts.chunkOverlap ?? 100;
42
+ }
43
+ /** Chunk, embed, and index documents. Returns the number of chunks stored. */
44
+ async ingest(docs) {
45
+ const pending = [];
46
+ for (const doc of docs) {
47
+ const pieces = chunkText(doc.text, this.chunkSize, this.chunkOverlap);
48
+ pieces.forEach((text, i) => {
49
+ const baseId = doc.id ?? `doc_${pending.length}`;
50
+ pending.push({ id: `${baseId}#${i}`, text, metadata: doc.metadata });
51
+ });
52
+ }
53
+ if (pending.length === 0)
54
+ return 0;
55
+ const vectors = await this.embeddings.embed(pending.map((p) => p.text));
56
+ await this.store.upsert(pending.map((p, i) => ({ ...p, embedding: vectors[i] })));
57
+ return pending.length;
58
+ }
59
+ /** Embed the query and return the top-k most similar chunks. */
60
+ async search(query, k = 4) {
61
+ if (!query.trim())
62
+ return [];
63
+ const [qv] = await this.embeddings.embed([query]);
64
+ if (!qv)
65
+ return [];
66
+ return this.store.query(qv, k);
67
+ }
68
+ vectorStore() {
69
+ return this.store;
70
+ }
71
+ }
72
+ //# sourceMappingURL=retriever.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retriever.js","sourceRoot":"","sources":["../../src/rag/retriever.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * RAG tool source — exposes `search_knowledge` so the model can pull in
3
+ * relevant context on demand (agentic RAG). Preferred over always-injecting
4
+ * retrieved text, which burns the small-model context window.
5
+ */
6
+ import type { ToolSource } from '../tools/source.js';
7
+ import type { Retriever } from './retriever.js';
8
+ export interface RagToolOptions {
9
+ /** Chunks to return (default 4). */
10
+ k?: number;
11
+ /** Override the tool description for your corpus, e.g. "Search the docs." */
12
+ description?: string;
13
+ }
14
+ export declare function createRagToolSource(retriever: Retriever, opts?: RagToolOptions): ToolSource;
15
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/rag/tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIhD,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,GAAE,cAAmB,GAAG,UAAU,CAmC/F"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * RAG tool source — exposes `search_knowledge` so the model can pull in
3
+ * relevant context on demand (agentic RAG). Preferred over always-injecting
4
+ * retrieved text, which burns the small-model context window.
5
+ */
6
+ const SEARCH = 'search_knowledge';
7
+ export function createRagToolSource(retriever, opts = {}) {
8
+ const tool = {
9
+ name: SEARCH,
10
+ description: opts.description ??
11
+ 'Search the knowledge base for passages relevant to a question and return ' +
12
+ 'the best matches. Use this before answering when the answer might be in ' +
13
+ 'ingested documents.',
14
+ parameters: {
15
+ type: 'object',
16
+ properties: {
17
+ query: { type: 'string', description: 'What to look up' },
18
+ k: { type: 'number', description: 'How many passages (default 4)' },
19
+ },
20
+ required: ['query'],
21
+ },
22
+ };
23
+ async function execute(_name, args) {
24
+ const query = String(args.query ?? '').trim();
25
+ if (!query)
26
+ throw new Error('search_knowledge: query is required');
27
+ const k = Number(args.k) > 0 ? Number(args.k) : (opts.k ?? 4);
28
+ const hits = await retriever.search(query, k);
29
+ if (hits.length === 0)
30
+ return 'No relevant passages found.';
31
+ return hits
32
+ .map((h, i) => `[${i + 1}] (score ${h.score.toFixed(2)}) ${h.text}`)
33
+ .join('\n\n');
34
+ }
35
+ return {
36
+ id: 'rag',
37
+ listTools: () => [tool],
38
+ has: (name) => name === SEARCH,
39
+ execute,
40
+ };
41
+ }
42
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/rag/tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,MAAM,GAAG,kBAAkB,CAAC;AASlC,MAAM,UAAU,mBAAmB,CAAC,SAAoB,EAAE,OAAuB,EAAE;IACjF,MAAM,IAAI,GAAY;QACpB,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,IAAI,CAAC,WAAW;YAChB,2EAA2E;gBACzE,0EAA0E;gBAC1E,qBAAqB;QACzB,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE;gBACzD,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE;aACpE;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF,CAAC;IAEF,KAAK,UAAU,OAAO,CAAC,KAAa,EAAE,IAA6B;QACjE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACnE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,6BAA6B,CAAC;QAC5D,OAAO,IAAI;aACR,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;aACnE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK;QACT,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC;QACvB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM;QAC9B,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * RAG types — retrieval-augmented generation primitives.
3
+ *
4
+ * The heavy parts (the embedding model, the vector index) are interfaces the
5
+ * host injects. On QVAC the EmbeddingProvider wraps the SDK `embed()` API
6
+ * (on-device); a server host could inject a remote embedder. The default
7
+ * VectorStore is a pure-JS in-memory cosine index (good for thousands of
8
+ * chunks); a host can swap in SQLite/native for more.
9
+ */
10
+ /** Turns text into vectors. Injected — QVAC `embed()` on device, etc. */
11
+ export interface EmbeddingProvider {
12
+ embed(texts: string[]): Promise<number[][]>;
13
+ /** Vector dimension, when known (informational). */
14
+ dimension?: number;
15
+ }
16
+ export interface Chunk {
17
+ id: string;
18
+ text: string;
19
+ metadata?: Record<string, unknown>;
20
+ embedding?: number[];
21
+ }
22
+ export interface RetrievedChunk extends Chunk {
23
+ /** Similarity score in [-1, 1] (cosine). */
24
+ score: number;
25
+ }
26
+ /** A document to ingest; chunked + embedded by the Retriever. */
27
+ export interface RagDocument {
28
+ id?: string;
29
+ text: string;
30
+ metadata?: Record<string, unknown>;
31
+ }
32
+ export interface VectorStore {
33
+ upsert(chunks: Chunk[]): Promise<void>;
34
+ /** Top-k by cosine similarity to `embedding`. */
35
+ query(embedding: number[], k: number): Promise<RetrievedChunk[]>;
36
+ size(): Promise<number>;
37
+ clear(): Promise<void>;
38
+ }
39
+ /** Injected persistence for the vector store (optional). */
40
+ export interface VectorStoreIO {
41
+ load(): Promise<Chunk[]>;
42
+ save(chunks: Chunk[]): Promise<void>;
43
+ }
44
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rag/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAe,SAAQ,KAAK;IAC3C,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,iEAAiE;AACjE,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,iDAAiD;IACjD,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACjE,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACzB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * RAG types — retrieval-augmented generation primitives.
3
+ *
4
+ * The heavy parts (the embedding model, the vector index) are interfaces the
5
+ * host injects. On QVAC the EmbeddingProvider wraps the SDK `embed()` API
6
+ * (on-device); a server host could inject a remote embedder. The default
7
+ * VectorStore is a pure-JS in-memory cosine index (good for thousands of
8
+ * chunks); a host can swap in SQLite/native for more.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=types.js.map