agcel 1.0.4 → 2.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 (293) hide show
  1. package/README.md +40 -47
  2. package/dist/cli/commands/create.d.ts +4 -0
  3. package/dist/cli/commands/create.d.ts.map +1 -0
  4. package/dist/cli/commands/create.js +68 -0
  5. package/dist/cli/commands/create.js.map +1 -0
  6. package/dist/cli/commands/init.d.ts +3 -0
  7. package/dist/cli/commands/init.d.ts.map +1 -0
  8. package/dist/cli/commands/init.js +98 -0
  9. package/dist/cli/commands/init.js.map +1 -0
  10. package/dist/cli/commands/install.d.ts +3 -0
  11. package/dist/cli/commands/install.d.ts.map +1 -0
  12. package/dist/cli/commands/install.helpers.d.ts +15 -0
  13. package/dist/cli/commands/install.helpers.d.ts.map +1 -0
  14. package/dist/cli/commands/install.helpers.js +47 -0
  15. package/dist/cli/commands/install.helpers.js.map +1 -0
  16. package/dist/cli/commands/install.helpers.test.d.ts +2 -0
  17. package/dist/cli/commands/install.helpers.test.d.ts.map +1 -0
  18. package/dist/cli/commands/install.helpers.test.js +18 -0
  19. package/dist/cli/commands/install.helpers.test.js.map +1 -0
  20. package/dist/cli/commands/install.js +74 -0
  21. package/dist/cli/commands/install.js.map +1 -0
  22. package/dist/cli/commands/pulse.d.ts +4 -0
  23. package/dist/cli/commands/pulse.d.ts.map +1 -0
  24. package/dist/cli/commands/pulse.js +48 -0
  25. package/dist/cli/commands/pulse.js.map +1 -0
  26. package/dist/cli/commands/pulse.test.d.ts +2 -0
  27. package/dist/cli/commands/pulse.test.d.ts.map +1 -0
  28. package/dist/cli/commands/pulse.test.js +19 -0
  29. package/dist/cli/commands/pulse.test.js.map +1 -0
  30. package/dist/cli/commands/suggest.d.ts +3 -0
  31. package/dist/cli/commands/suggest.d.ts.map +1 -0
  32. package/dist/cli/commands/suggest.js +32 -0
  33. package/dist/cli/commands/suggest.js.map +1 -0
  34. package/dist/cli/index.d.ts +3 -0
  35. package/dist/cli/index.d.ts.map +1 -0
  36. package/dist/cli/index.js +20 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/cli/research-hints.d.ts +5 -0
  39. package/dist/cli/research-hints.d.ts.map +1 -0
  40. package/dist/cli/research-hints.js +109 -0
  41. package/dist/cli/research-hints.js.map +1 -0
  42. package/dist/cli/research-hints.test.d.ts +2 -0
  43. package/dist/cli/research-hints.test.d.ts.map +1 -0
  44. package/dist/cli/research-hints.test.js +50 -0
  45. package/dist/cli/research-hints.test.js.map +1 -0
  46. package/dist/core/agcel-config.d.ts +27 -0
  47. package/dist/core/agcel-config.d.ts.map +1 -0
  48. package/dist/core/agcel-config.js +4 -0
  49. package/dist/core/agcel-config.js.map +1 -0
  50. package/dist/core/build-rag-engine.d.ts +12 -0
  51. package/dist/core/build-rag-engine.d.ts.map +1 -0
  52. package/dist/core/build-rag-engine.js +24 -0
  53. package/dist/core/build-rag-engine.js.map +1 -0
  54. package/dist/core/build-rag-engine.test.d.ts +2 -0
  55. package/dist/core/build-rag-engine.test.d.ts.map +1 -0
  56. package/dist/core/build-rag-engine.test.js +34 -0
  57. package/dist/core/build-rag-engine.test.js.map +1 -0
  58. package/dist/core/chroma-rag.d.ts +20 -0
  59. package/dist/core/chroma-rag.d.ts.map +1 -0
  60. package/dist/core/chroma-rag.js +108 -0
  61. package/dist/core/chroma-rag.js.map +1 -0
  62. package/dist/core/context-hygiene.d.ts +12 -0
  63. package/dist/core/context-hygiene.d.ts.map +1 -0
  64. package/dist/core/context-hygiene.js +43 -0
  65. package/dist/core/context-hygiene.js.map +1 -0
  66. package/dist/core/context-hygiene.test.d.ts +2 -0
  67. package/dist/core/context-hygiene.test.d.ts.map +1 -0
  68. package/dist/core/context-hygiene.test.js +18 -0
  69. package/dist/core/context-hygiene.test.js.map +1 -0
  70. package/dist/core/context.d.ts +44 -0
  71. package/dist/core/context.d.ts.map +1 -0
  72. package/dist/core/context.js +114 -0
  73. package/dist/core/context.js.map +1 -0
  74. package/dist/core/conversation-routing.d.ts +10 -0
  75. package/dist/core/conversation-routing.d.ts.map +1 -0
  76. package/dist/core/conversation-routing.js +27 -0
  77. package/dist/core/conversation-routing.js.map +1 -0
  78. package/dist/core/conversation-routing.test.d.ts +2 -0
  79. package/dist/core/conversation-routing.test.d.ts.map +1 -0
  80. package/dist/core/conversation-routing.test.js +29 -0
  81. package/dist/core/conversation-routing.test.js.map +1 -0
  82. package/dist/core/guardrails.d.ts +26 -0
  83. package/dist/core/guardrails.d.ts.map +1 -0
  84. package/dist/core/guardrails.js +76 -0
  85. package/dist/core/guardrails.js.map +1 -0
  86. package/dist/core/guardrails.test.d.ts +2 -0
  87. package/dist/core/guardrails.test.d.ts.map +1 -0
  88. package/dist/core/guardrails.test.js +35 -0
  89. package/dist/core/guardrails.test.js.map +1 -0
  90. package/dist/core/intent.d.ts +22 -0
  91. package/dist/core/intent.d.ts.map +1 -0
  92. package/dist/core/intent.js +79 -0
  93. package/dist/core/intent.js.map +1 -0
  94. package/dist/core/intent.test.d.ts +2 -0
  95. package/dist/core/intent.test.d.ts.map +1 -0
  96. package/dist/core/intent.test.js +43 -0
  97. package/dist/core/intent.test.js.map +1 -0
  98. package/dist/core/local-rag.d.ts +17 -0
  99. package/dist/core/local-rag.d.ts.map +1 -0
  100. package/dist/core/local-rag.js +74 -0
  101. package/dist/core/local-rag.js.map +1 -0
  102. package/dist/core/local-rag.test.d.ts +2 -0
  103. package/dist/core/local-rag.test.d.ts.map +1 -0
  104. package/dist/core/local-rag.test.js +47 -0
  105. package/dist/core/local-rag.test.js.map +1 -0
  106. package/dist/core/orchestrator.d.ts +47 -0
  107. package/dist/core/orchestrator.d.ts.map +1 -0
  108. package/dist/core/orchestrator.js +138 -0
  109. package/dist/core/orchestrator.js.map +1 -0
  110. package/dist/core/orchestrator.test.d.ts +2 -0
  111. package/dist/core/orchestrator.test.d.ts.map +1 -0
  112. package/dist/core/orchestrator.test.js +118 -0
  113. package/dist/core/orchestrator.test.js.map +1 -0
  114. package/dist/core/pulse.d.ts +13 -0
  115. package/dist/core/pulse.d.ts.map +1 -0
  116. package/dist/core/pulse.js +29 -0
  117. package/dist/core/pulse.js.map +1 -0
  118. package/dist/core/pulse.test.d.ts +2 -0
  119. package/dist/core/pulse.test.d.ts.map +1 -0
  120. package/dist/core/pulse.test.js +18 -0
  121. package/dist/core/pulse.test.js.map +1 -0
  122. package/dist/core/rag-metadata.d.ts +5 -0
  123. package/dist/core/rag-metadata.d.ts.map +1 -0
  124. package/dist/core/rag-metadata.js +13 -0
  125. package/dist/core/rag-metadata.js.map +1 -0
  126. package/dist/core/rag-metadata.test.d.ts +2 -0
  127. package/dist/core/rag-metadata.test.d.ts.map +1 -0
  128. package/dist/core/rag-metadata.test.js +12 -0
  129. package/dist/core/rag-metadata.test.js.map +1 -0
  130. package/dist/core/rag-types.d.ts +18 -0
  131. package/dist/core/rag-types.d.ts.map +1 -0
  132. package/dist/core/rag-types.js +2 -0
  133. package/dist/core/rag-types.js.map +1 -0
  134. package/dist/core/read-agcel-config.d.ts +3 -0
  135. package/dist/core/read-agcel-config.d.ts.map +1 -0
  136. package/dist/core/read-agcel-config.js +13 -0
  137. package/dist/core/read-agcel-config.js.map +1 -0
  138. package/dist/core/registry.d.ts +9 -0
  139. package/dist/core/registry.d.ts.map +1 -0
  140. package/dist/core/registry.js +75 -0
  141. package/dist/core/registry.js.map +1 -0
  142. package/dist/core/registry.test.d.ts +2 -0
  143. package/dist/core/registry.test.d.ts.map +1 -0
  144. package/dist/core/registry.test.js +128 -0
  145. package/dist/core/registry.test.js.map +1 -0
  146. package/dist/core/schema.d.ts +51 -0
  147. package/dist/core/schema.d.ts.map +1 -0
  148. package/dist/core/schema.js +31 -0
  149. package/dist/core/schema.js.map +1 -0
  150. package/dist/core/summarizer.d.ts +23 -0
  151. package/dist/core/summarizer.d.ts.map +1 -0
  152. package/dist/core/summarizer.js +66 -0
  153. package/dist/core/summarizer.js.map +1 -0
  154. package/dist/core/text-similarity.d.ts +7 -0
  155. package/dist/core/text-similarity.d.ts.map +1 -0
  156. package/dist/core/text-similarity.js +35 -0
  157. package/dist/core/text-similarity.js.map +1 -0
  158. package/dist/core/text-similarity.test.d.ts +2 -0
  159. package/dist/core/text-similarity.test.d.ts.map +1 -0
  160. package/dist/core/text-similarity.test.js +11 -0
  161. package/dist/core/text-similarity.test.js.map +1 -0
  162. package/dist/docs-site.test.d.ts +2 -0
  163. package/dist/docs-site.test.d.ts.map +1 -0
  164. package/dist/docs-site.test.js +19 -0
  165. package/dist/docs-site.test.js.map +1 -0
  166. package/dist/index.d.ts +8 -0
  167. package/dist/index.d.ts.map +1 -0
  168. package/dist/index.js +8 -39
  169. package/dist/index.js.map +1 -0
  170. package/dist/providers/adapter.d.ts +23 -0
  171. package/dist/providers/adapter.d.ts.map +1 -0
  172. package/dist/providers/adapter.js +9 -0
  173. package/dist/providers/adapter.js.map +1 -0
  174. package/dist/providers/chatgpt.d.ts +13 -0
  175. package/dist/providers/chatgpt.d.ts.map +1 -0
  176. package/dist/providers/chatgpt.js +33 -0
  177. package/dist/providers/chatgpt.js.map +1 -0
  178. package/dist/providers/chatgpt.test.d.ts +2 -0
  179. package/dist/providers/chatgpt.test.d.ts.map +1 -0
  180. package/dist/providers/chatgpt.test.js +23 -0
  181. package/dist/providers/chatgpt.test.js.map +1 -0
  182. package/dist/providers/claude.d.ts +13 -0
  183. package/dist/providers/claude.d.ts.map +1 -0
  184. package/dist/providers/claude.js +48 -0
  185. package/dist/providers/claude.js.map +1 -0
  186. package/dist/providers/cursor.d.ts +14 -0
  187. package/dist/providers/cursor.d.ts.map +1 -0
  188. package/dist/providers/cursor.js +47 -0
  189. package/dist/providers/cursor.js.map +1 -0
  190. package/dist/providers/gemini.d.ts +13 -0
  191. package/dist/providers/gemini.d.ts.map +1 -0
  192. package/dist/providers/gemini.js +42 -0
  193. package/dist/providers/gemini.js.map +1 -0
  194. package/dist/providers/index.d.ts +5 -0
  195. package/dist/providers/index.d.ts.map +1 -0
  196. package/dist/providers/index.js +18 -0
  197. package/dist/providers/index.js.map +1 -0
  198. package/dist/server/index.d.ts +2 -0
  199. package/dist/server/index.d.ts.map +1 -0
  200. package/dist/server/index.js +288 -154
  201. package/dist/server/index.js.map +1 -0
  202. package/package.json +62 -52
  203. package/.agent/workflows/api-gen.md +0 -63
  204. package/.agent/workflows/architect.md +0 -44
  205. package/.agent/workflows/brainstorm.md +0 -227
  206. package/.agent/workflows/build.md +0 -38
  207. package/.agent/workflows/changelog.md +0 -55
  208. package/.agent/workflows/checkpoint.md +0 -142
  209. package/.agent/workflows/commit.md +0 -227
  210. package/.agent/workflows/debug.md +0 -61
  211. package/.agent/workflows/deploy.md +0 -80
  212. package/.agent/workflows/doc.md +0 -251
  213. package/.agent/workflows/execute-plan.md +0 -229
  214. package/.agent/workflows/feature.md +0 -259
  215. package/.agent/workflows/fix.md +0 -327
  216. package/.agent/workflows/help.md +0 -67
  217. package/.agent/workflows/index.md +0 -152
  218. package/.agent/workflows/load.md +0 -116
  219. package/.agent/workflows/mode.md +0 -174
  220. package/.agent/workflows/optimize.md +0 -57
  221. package/.agent/workflows/plan.md +0 -341
  222. package/.agent/workflows/pr.md +0 -78
  223. package/.agent/workflows/product-plan.md +0 -36
  224. package/.agent/workflows/production-deploy.md +0 -39
  225. package/.agent/workflows/refactor.md +0 -67
  226. package/.agent/workflows/research.md +0 -120
  227. package/.agent/workflows/review.md +0 -348
  228. package/.agent/workflows/security-scan.md +0 -60
  229. package/.agent/workflows/ship.md +0 -225
  230. package/.agent/workflows/spawn.md +0 -181
  231. package/.agent/workflows/status.md +0 -63
  232. package/.agent/workflows/tdd.md +0 -143
  233. package/.agent/workflows/test.md +0 -344
  234. package/.agent/workflows/verify.md +0 -35
  235. package/LICENSE +0 -21
  236. package/dist/commands/init.js +0 -147
  237. package/dist/commands/list.js +0 -43
  238. package/dist/commands/uninstall.js +0 -70
  239. package/dist/utils/index.js +0 -28
  240. package/skills/api-security-best-practices/SKILL.md +0 -291
  241. package/skills/api-security-best-practices/references/examples.md +0 -617
  242. package/skills/architecture/SKILL.md +0 -59
  243. package/skills/architecture/context-discovery.md +0 -43
  244. package/skills/architecture/examples.md +0 -94
  245. package/skills/architecture/pattern-selection.md +0 -68
  246. package/skills/architecture/patterns-reference.md +0 -50
  247. package/skills/architecture/trade-off-analysis.md +0 -77
  248. package/skills/aws-serverless/SKILL.md +0 -327
  249. package/skills/brainstorming/SKILL.md +0 -234
  250. package/skills/c4-context/SKILL.md +0 -154
  251. package/skills/ci-cd-engineer/SKILL.md +0 -50
  252. package/skills/code-auditing/SKILL.md +0 -55
  253. package/skills/copywriting/SKILL.md +0 -248
  254. package/skills/database-engineer/SKILL.md +0 -47
  255. package/skills/doc-coauthoring/SKILL.md +0 -379
  256. package/skills/docker-expert/SKILL.md +0 -412
  257. package/skills/langgraph/SKILL.md +0 -291
  258. package/skills/postgresql/SKILL.md +0 -73
  259. package/skills/pricing-strategy/SKILL.md +0 -360
  260. package/skills/product-manager/SKILL.md +0 -57
  261. package/skills/prompt-engineer/README.md +0 -659
  262. package/skills/prompt-engineer/SKILL.md +0 -256
  263. package/skills/python-patterns/SKILL.md +0 -445
  264. package/skills/qa-engineer/SKILL.md +0 -42
  265. package/skills/rag-engineer/SKILL.md +0 -94
  266. package/skills/react-patterns/SKILL.md +0 -202
  267. package/skills/secure-refactoring/SKILL.md +0 -54
  268. package/skills/security-documentation/SKILL.md +0 -53
  269. package/skills/senior-architect/SKILL.md +0 -213
  270. package/skills/senior-architect/references/architecture_patterns.md +0 -103
  271. package/skills/senior-architect/references/system_design_workflows.md +0 -103
  272. package/skills/senior-architect/references/tech_decision_guide.md +0 -103
  273. package/skills/senior-architect/scripts/architecture_diagram_generator.py +0 -114
  274. package/skills/senior-architect/scripts/dependency_analyzer.py +0 -114
  275. package/skills/senior-architect/scripts/project_architect.py +0 -114
  276. package/skills/seo-audit/SKILL.md +0 -491
  277. package/skills/sql-injection-testing/SKILL.md +0 -452
  278. package/skills/test-driven-development/SKILL.md +0 -375
  279. package/skills/test-driven-development/testing-anti-patterns.md +0 -299
  280. package/skills/test-fixing/SKILL.md +0 -123
  281. package/skills/testing-patterns/SKILL.md +0 -263
  282. package/skills/typescript-expert/SKILL.md +0 -202
  283. package/skills/typescript-expert/references/advanced-topics.md +0 -252
  284. package/skills/typescript-expert/references/tsconfig-strict.json +0 -92
  285. package/skills/typescript-expert/references/typescript-cheatsheet.md +0 -383
  286. package/skills/typescript-expert/references/utility-types.ts +0 -335
  287. package/skills/typescript-expert/scripts/ts_diagnostic.py +0 -203
  288. package/skills/ui-ux-designer/SKILL.md +0 -46
  289. package/skills/vercel-deployment/SKILL.md +0 -83
  290. package/skills/vulnerability-scanner/SKILL.md +0 -280
  291. package/skills/vulnerability-scanner/checklists.md +0 -121
  292. package/skills/vulnerability-scanner/scripts/security_scan.py +0 -458
  293. package/skills/writing-plans/SKILL.md +0 -120
@@ -0,0 +1,32 @@
1
+ import { Command } from 'commander';
2
+ import { Registry } from '../../core/registry.js';
3
+ import { IntentEngine } from '../../core/intent.js';
4
+ export const suggestCommand = new Command('suggest')
5
+ .description('Rank registry agents for a task and print next steps when confidence is low')
6
+ .argument('<query...>', 'Natural-language task description')
7
+ .action(async (parts) => {
8
+ const query = parts.join(' ').trim();
9
+ if (!query) {
10
+ console.error('Provide a non-empty query.');
11
+ process.exitCode = 1;
12
+ return;
13
+ }
14
+ const registry = new Registry();
15
+ const agents = await registry.loadAgents();
16
+ const engine = new IntentEngine();
17
+ const result = engine.detectIntent(query, agents, {
18
+ latestUserTurn: query
19
+ });
20
+ console.log(`Query: ${query}`);
21
+ console.log(`Confidence: ${(result.confidence * 100).toFixed(0)}%`);
22
+ if (result.bestAgent) {
23
+ console.log(`Suggested agent: ${result.bestAgent.name}`);
24
+ }
25
+ else {
26
+ console.log('Suggested agent: (none above threshold)');
27
+ }
28
+ if (result.suggestion) {
29
+ console.log(`\n${result.suggestion}`);
30
+ }
31
+ });
32
+ //# sourceMappingURL=suggest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../../src/cli/commands/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CACV,6EAA6E,CAC9E;KACA,QAAQ,CAAC,YAAY,EAAE,mCAAmC,CAAC;KAC3D,MAAM,CAAC,KAAK,EAAE,KAAe,EAAE,EAAE;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE;QAChD,cAAc,EAAE,KAAK;KACtB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACxC,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { initCommand } from './commands/init.js';
4
+ import { installCommand } from './commands/install.js';
5
+ import { createAgentCommand, createSkillCommand } from './commands/create.js';
6
+ import { pulseCommand } from './commands/pulse.js';
7
+ import { suggestCommand } from './commands/suggest.js';
8
+ const program = new Command();
9
+ program
10
+ .name('agcel')
11
+ .description('Agentic Context Engineering Library - CLI Tool')
12
+ .version('1.0.0');
13
+ program.addCommand(initCommand);
14
+ program.addCommand(installCommand);
15
+ program.addCommand(createAgentCommand);
16
+ program.addCommand(createSkillCommand);
17
+ program.addCommand(suggestCommand);
18
+ program.addCommand(pulseCommand);
19
+ program.parse();
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Curated pointers for interactive agent/skill creation (offline-friendly).
3
+ */
4
+ export declare function formatResearchForSkills(skillNames: string[]): string;
5
+ //# sourceMappingURL=research-hints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research-hints.d.ts","sourceRoot":"","sources":["../../src/cli/research-hints.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4FH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAepE"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Curated pointers for interactive agent/skill creation (offline-friendly).
3
+ */
4
+ const DEFAULT_RESEARCH_URLS = [
5
+ 'https://martinfowler.com/bliki/TwoHardThings.html',
6
+ 'https://en.wikipedia.org/wiki/Single_responsibility_principle'
7
+ ];
8
+ const SKILL_RESEARCH = {
9
+ python: [
10
+ 'https://peps.python.org/pep-0008/',
11
+ 'https://docs.python.org/3/library/typing.html',
12
+ 'https://docs.pytest.org/en/stable/',
13
+ 'https://packaging.python.org/en/latest/tutorials/packaging-projects/'
14
+ ],
15
+ java: [
16
+ 'https://docs.oracle.com/en/java/javase/21/docs/api/index.html',
17
+ 'https://junit.org/junit5/docs/current/user-guide/'
18
+ ],
19
+ 'nodejs-typescript': [
20
+ 'https://nodejs.org/en/docs/guides/',
21
+ 'https://www.typescriptlang.org/docs/',
22
+ 'https://vitest.dev/guide/'
23
+ ],
24
+ testing: [
25
+ 'https://docs.pytest.org/en/stable/',
26
+ 'https://vitest.dev/guide/'
27
+ ],
28
+ debugging: [
29
+ 'https://developer.mozilla.org/en-US/docs/Tools/Debugger',
30
+ 'https://12factor.net/logs'
31
+ ],
32
+ 'react-skill': [
33
+ 'https://react.dev/',
34
+ 'https://www.typescriptlang.org/docs/',
35
+ 'https://react.dev/learn/typescript'
36
+ ],
37
+ flutter: [
38
+ 'https://docs.flutter.dev/',
39
+ 'https://dart.dev/language',
40
+ 'https://docs.flutter.dev/testing/overview'
41
+ ],
42
+ 'product-discovery': [
43
+ 'https://www.svpg.com/empowered-product-teams/',
44
+ 'https://www.interaction-design.org/literature/topics/user-research'
45
+ ],
46
+ 'requirements-clarity': [
47
+ 'https://www.agilealliance.org/glossary/invest/',
48
+ 'https://www.mountaingoatsoftware.com/agile/user-stories'
49
+ ],
50
+ 'backlog-roadmap': [
51
+ 'https://www.scrum.org/resources/blog/product-backlog-ordering-techniques',
52
+ 'https://www.productplan.com/learn/what-is-a-product-roadmap/'
53
+ ],
54
+ 'ux-product-design': [
55
+ 'https://www.nngroup.com/articles/ten-usability-heuristics/',
56
+ 'https://www.interaction-design.org/literature/topics/ux-design'
57
+ ],
58
+ 'design-systems': [
59
+ 'https://designsystemsrepo.com/design-systems-releases',
60
+ 'https://www.w3.org/WAI/ARIA/apg/'
61
+ ],
62
+ 'accessibility-design': [
63
+ 'https://www.w3.org/WAI/WCAG22/quickref/',
64
+ 'https://webaim.org/resources/designers/'
65
+ ],
66
+ 'web-ui-patterns': [
67
+ 'https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Responsive_Design',
68
+ 'https://web.dev/articles/responsive-web-design-basics'
69
+ ],
70
+ 'mobile-platform-design': [
71
+ 'https://developer.apple.com/design/human-interface-guidelines/',
72
+ 'https://m3.material.io/'
73
+ ],
74
+ 'api-security': [
75
+ 'https://owasp.org/API-Security/editions/2023/en/0x00-header/',
76
+ 'https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html'
77
+ ],
78
+ observability: [
79
+ 'https://opentelemetry.io/docs/',
80
+ 'https://sre.google/sre-book/monitoring-distributed-systems/'
81
+ ],
82
+ 'technical-writing': [
83
+ 'https://developers.google.com/tech-writing',
84
+ 'https://www.writethedocs.org/guide/'
85
+ ],
86
+ 'system-architecture': [
87
+ 'https://c4model.com/',
88
+ 'https://adr.github.io/',
89
+ 'https://12factor.net/'
90
+ ]
91
+ };
92
+ export function formatResearchForSkills(skillNames) {
93
+ const lines = [
94
+ 'Best-practice references (open in a browser while you refine the skill):'
95
+ ];
96
+ const seen = new Set();
97
+ for (const raw of skillNames) {
98
+ const key = raw.trim().toLowerCase();
99
+ const urls = SKILL_RESEARCH[key] ?? DEFAULT_RESEARCH_URLS;
100
+ for (const u of urls) {
101
+ if (seen.has(u))
102
+ continue;
103
+ seen.add(u);
104
+ lines.push(` - ${u}`);
105
+ }
106
+ }
107
+ return lines.join('\n');
108
+ }
109
+ //# sourceMappingURL=research-hints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research-hints.js","sourceRoot":"","sources":["../../src/cli/research-hints.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,qBAAqB,GAAG;IAC5B,mDAAmD;IACnD,+DAA+D;CAChE,CAAC;AAEF,MAAM,cAAc,GAA6B;IAC/C,MAAM,EAAE;QACN,mCAAmC;QACnC,+CAA+C;QAC/C,oCAAoC;QACpC,sEAAsE;KACvE;IACD,IAAI,EAAE;QACJ,+DAA+D;QAC/D,mDAAmD;KACpD;IACD,mBAAmB,EAAE;QACnB,oCAAoC;QACpC,sCAAsC;QACtC,2BAA2B;KAC5B;IACD,OAAO,EAAE;QACP,oCAAoC;QACpC,2BAA2B;KAC5B;IACD,SAAS,EAAE;QACT,yDAAyD;QACzD,2BAA2B;KAC5B;IACD,aAAa,EAAE;QACb,oBAAoB;QACpB,sCAAsC;QACtC,oCAAoC;KACrC;IACD,OAAO,EAAE;QACP,2BAA2B;QAC3B,2BAA2B;QAC3B,2CAA2C;KAC5C;IACD,mBAAmB,EAAE;QACnB,+CAA+C;QAC/C,oEAAoE;KACrE;IACD,sBAAsB,EAAE;QACtB,gDAAgD;QAChD,yDAAyD;KAC1D;IACD,iBAAiB,EAAE;QACjB,0EAA0E;QAC1E,8DAA8D;KAC/D;IACD,mBAAmB,EAAE;QACnB,4DAA4D;QAC5D,gEAAgE;KACjE;IACD,gBAAgB,EAAE;QAChB,uDAAuD;QACvD,kCAAkC;KACnC;IACD,sBAAsB,EAAE;QACtB,yCAAyC;QACzC,yCAAyC;KAC1C;IACD,iBAAiB,EAAE;QACjB,iFAAiF;QACjF,uDAAuD;KACxD;IACD,wBAAwB,EAAE;QACxB,gEAAgE;QAChE,yBAAyB;KAC1B;IACD,cAAc,EAAE;QACd,8DAA8D;QAC9D,+EAA+E;KAChF;IACD,aAAa,EAAE;QACb,gCAAgC;QAChC,6DAA6D;KAC9D;IACD,mBAAmB,EAAE;QACnB,4CAA4C;QAC5C,qCAAqC;KACtC;IACD,qBAAqB,EAAE;QACrB,sBAAsB;QACtB,wBAAwB;QACxB,uBAAuB;KACxB;CACF,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,UAAoB;IAC1D,MAAM,KAAK,GAAa;QACtB,0EAA0E;KAC3E,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,qBAAqB,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,SAAS;YAC1B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=research-hints.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research-hints.test.d.ts","sourceRoot":"","sources":["../../src/cli/research-hints.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { formatResearchForSkills } from './research-hints.js';
3
+ describe('formatResearchForSkills', () => {
4
+ it('Given python skill when formatting then PEP 8 and packaging links are included', () => {
5
+ const out = formatResearchForSkills(['python']);
6
+ expect(out).toContain('pep-0008');
7
+ expect(out).toContain('packaging.python.org');
8
+ });
9
+ it('Given product-discovery skill when formatting then curated PM link is included', () => {
10
+ const out = formatResearchForSkills(['product-discovery']);
11
+ expect(out).toContain('svpg.com');
12
+ });
13
+ it('Given accessibility-design skill when formatting then WCAG quick reference is included', () => {
14
+ const out = formatResearchForSkills(['accessibility-design']);
15
+ expect(out).toContain('WCAG22');
16
+ });
17
+ it('Given react-skill when formatting then React docs link is included', () => {
18
+ const out = formatResearchForSkills(['react-skill']);
19
+ expect(out).toContain('react.dev');
20
+ });
21
+ it('Given flutter skill when formatting then Flutter docs link is included', () => {
22
+ const out = formatResearchForSkills(['flutter']);
23
+ expect(out).toContain('docs.flutter.dev');
24
+ });
25
+ it('Given java skill when formatting then JUnit guide link is included', () => {
26
+ const out = formatResearchForSkills(['java']);
27
+ expect(out).toContain('junit.org');
28
+ });
29
+ it('Given nodejs-typescript skill when formatting then Node docs link is included', () => {
30
+ const out = formatResearchForSkills(['nodejs-typescript']);
31
+ expect(out).toContain('nodejs.org');
32
+ });
33
+ it('Given api-security skill when formatting then OWASP API Security link is included', () => {
34
+ const out = formatResearchForSkills(['api-security']);
35
+ expect(out).toContain('owasp.org/API-Security');
36
+ });
37
+ it('Given observability skill when formatting then OpenTelemetry docs link is included', () => {
38
+ const out = formatResearchForSkills(['observability']);
39
+ expect(out).toContain('opentelemetry.io');
40
+ });
41
+ it('Given technical-writing skill when formatting then Google tech writing link is included', () => {
42
+ const out = formatResearchForSkills(['technical-writing']);
43
+ expect(out).toContain('developers.google.com/tech-writing');
44
+ });
45
+ it('Given system-architecture skill when formatting then C4 model link is included', () => {
46
+ const out = formatResearchForSkills(['system-architecture']);
47
+ expect(out).toContain('c4model.com');
48
+ });
49
+ });
50
+ //# sourceMappingURL=research-hints.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research-hints.test.js","sourceRoot":"","sources":["../../src/cli/research-hints.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Shape of `.agcel/config.json` relevant to context and RAG.
3
+ */
4
+ export type RagBackend = 'local' | 'chroma';
5
+ export interface ChromaConnectionConfig {
6
+ host?: string;
7
+ port?: number;
8
+ ssl?: boolean;
9
+ collectionName?: string;
10
+ }
11
+ export interface AgcelConfig {
12
+ ragEnabled?: boolean;
13
+ /** When omitted and RAG is on, defaults to `local`. */
14
+ ragBackend?: RagBackend;
15
+ chroma?: ChromaConnectionConfig;
16
+ /** When set, RAG queries only return documents whose metadata matches all key/value pairs. */
17
+ ragQueryMetadataFilter?: Record<string, string>;
18
+ /**
19
+ * When true, `route_query` with `draft_output` sets `guardrails_blocked` if error-severity
20
+ * guardrails fail (host should not treat the draft as shippable).
21
+ */
22
+ strictGuardrailsOnRouteQuery?: boolean;
23
+ }
24
+ export declare const DEFAULT_CHROMA_HOST = "localhost";
25
+ export declare const DEFAULT_CHROMA_PORT = 8000;
26
+ export declare const DEFAULT_CHROMA_COLLECTION = "agcel";
27
+ //# sourceMappingURL=agcel-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agcel-config.d.ts","sourceRoot":"","sources":["../../src/core/agcel-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5C,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uDAAuD;IACvD,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,8FAA8F;IAC9F,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD;;;OAGG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAC/C,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,yBAAyB,UAAU,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const DEFAULT_CHROMA_HOST = 'localhost';
2
+ export const DEFAULT_CHROMA_PORT = 8000;
3
+ export const DEFAULT_CHROMA_COLLECTION = 'agcel';
4
+ //# sourceMappingURL=agcel-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agcel-config.js","sourceRoot":"","sources":["../../src/core/agcel-config.ts"],"names":[],"mappings":"AA0BA,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAC/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACxC,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { AgcelConfig } from './agcel-config.js';
2
+ import type { IRagEngine } from './rag-types.js';
3
+ export type RagEngineMode = 'chroma' | 'local';
4
+ export interface BuildRagEngineResult {
5
+ engine: IRagEngine;
6
+ mode: RagEngineMode;
7
+ }
8
+ /**
9
+ * Builds the active RAG engine from config. Chroma failures fall back to local JSON index.
10
+ */
11
+ export declare function buildRagEngine(basePath: string, config: AgcelConfig): Promise<BuildRagEngineResult>;
12
+ //# sourceMappingURL=build-rag-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-rag-engine.d.ts","sourceRoot":"","sources":["../../src/core/build-rag-engine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/C,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAiBzG"}
@@ -0,0 +1,24 @@
1
+ import * as path from 'node:path';
2
+ import { ChromaRagEngine } from './chroma-rag.js';
3
+ import { LocalRagEngine } from './local-rag.js';
4
+ /**
5
+ * Builds the active RAG engine from config. Chroma failures fall back to local JSON index.
6
+ */
7
+ export async function buildRagEngine(basePath, config) {
8
+ const localPath = path.join(basePath, '.agcel', 'rag');
9
+ const localEngine = new LocalRagEngine(localPath);
10
+ if (config.ragBackend === 'chroma') {
11
+ try {
12
+ const chromaEngine = new ChromaRagEngine(config.chroma);
13
+ await chromaEngine.initialize();
14
+ return { engine: chromaEngine, mode: 'chroma' };
15
+ }
16
+ catch {
17
+ await localEngine.initialize();
18
+ return { engine: localEngine, mode: 'local' };
19
+ }
20
+ }
21
+ await localEngine.initialize();
22
+ return { engine: localEngine, mode: 'local' };
23
+ }
24
+ //# sourceMappingURL=build-rag-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-rag-engine.js","sourceRoot":"","sources":["../../src/core/build-rag-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAUhD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,MAAmB;IACxE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;YAChC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;YAC/B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;IAED,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAChD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=build-rag-engine.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-rag-engine.test.d.ts","sourceRoot":"","sources":["../../src/core/build-rag-engine.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as os from 'node:os';
3
+ import * as path from 'node:path';
4
+ import { afterEach, describe, expect, it } from 'vitest';
5
+ import { buildRagEngine } from './build-rag-engine.js';
6
+ describe('buildRagEngine', () => {
7
+ let tmpDir;
8
+ afterEach(async () => {
9
+ if (tmpDir) {
10
+ await fs.rm(tmpDir, { recursive: true, force: true });
11
+ }
12
+ });
13
+ it('Given chroma backend and no server on port when building then falls back to local engine', async () => {
14
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'agcel-build-rag-'));
15
+ await fs.mkdir(path.join(tmpDir, '.agcel', 'rag'), { recursive: true });
16
+ const { engine, mode } = await buildRagEngine(tmpDir, {
17
+ ragBackend: 'chroma',
18
+ chroma: { host: '127.0.0.1', port: 59987 }
19
+ });
20
+ expect(mode).toBe('local');
21
+ await engine.addDocument('doc1', 'hello world');
22
+ const results = await engine.query('hello', 1);
23
+ expect(results[0]?.content).toBe('hello world');
24
+ });
25
+ it('Given local backend when building then uses local engine', async () => {
26
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'agcel-build-rag-'));
27
+ const { engine, mode } = await buildRagEngine(tmpDir, { ragBackend: 'local' });
28
+ expect(mode).toBe('local');
29
+ await engine.addDocument('a', 'typescript modules');
30
+ const results = await engine.query('typescript', 1);
31
+ expect(results[0]?.id).toBe('a');
32
+ });
33
+ });
34
+ //# sourceMappingURL=build-rag-engine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-rag-engine.test.js","sourceRoot":"","sources":["../../src/core/build-rag-engine.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,MAAc,CAAC;IAEnB,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;QACxG,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACtE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAExE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE;YACpD,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE;SAC3C,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAEtE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QAE/E,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { IRagEngine, RagSearchResult } from './rag-types.js';
2
+ import { type ChromaConnectionConfig } from './agcel-config.js';
3
+ /**
4
+ * ChromaDB-backed RAG over a running Chroma server (`chroma run` or Docker).
5
+ * Uses the official JS client and default local embeddings for documents and queries.
6
+ */
7
+ export declare class ChromaRagEngine implements IRagEngine {
8
+ private collection;
9
+ private readonly client;
10
+ private readonly collectionName;
11
+ private readonly embeddingFunction;
12
+ constructor(chroma?: ChromaConnectionConfig);
13
+ initialize(): Promise<void>;
14
+ private requireCollection;
15
+ addDocument(id: string, content: string, metadata?: Record<string, string>): Promise<void>;
16
+ query(queryText: string, topK?: number, metadataFilter?: Record<string, string>): Promise<RagSearchResult[]>;
17
+ removeDocument(id: string): Promise<void>;
18
+ getDocumentCount(): Promise<number>;
19
+ }
20
+ //# sourceMappingURL=chroma-rag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chroma-rag.d.ts","sourceRoot":"","sources":["../../src/core/chroma-rag.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AA2B3B;;;GAGG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAChD,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2B;gBAEjD,MAAM,CAAC,EAAE,sBAAsB;IASrC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC,OAAO,CAAC,iBAAiB;IAOnB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9F,KAAK,CACT,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,MAAU,EAChB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC;IAuCvB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;CAG1C"}
@@ -0,0 +1,108 @@
1
+ import { ChromaClient } from 'chromadb';
2
+ import { DefaultEmbeddingFunction } from '@chroma-core/default-embed';
3
+ import { DEFAULT_CHROMA_COLLECTION, DEFAULT_CHROMA_HOST, DEFAULT_CHROMA_PORT } from './agcel-config.js';
4
+ import { recencyScoreMultiplier } from './rag-metadata.js';
5
+ function distanceToScore(distance) {
6
+ if (distance == null || Number.isNaN(distance))
7
+ return 0;
8
+ return 1 / (1 + distance);
9
+ }
10
+ function toChromaMetadata(meta) {
11
+ const out = {};
12
+ for (const [k, v] of Object.entries(meta)) {
13
+ out[k] = v;
14
+ }
15
+ return out;
16
+ }
17
+ function chromaWhereFromFilter(filter) {
18
+ const entries = Object.entries(filter);
19
+ if (entries.length === 1) {
20
+ const [k, v] = entries[0];
21
+ return { [k]: v };
22
+ }
23
+ return {
24
+ $and: entries.map(([k, v]) => ({ [k]: v }))
25
+ };
26
+ }
27
+ /**
28
+ * ChromaDB-backed RAG over a running Chroma server (`chroma run` or Docker).
29
+ * Uses the official JS client and default local embeddings for documents and queries.
30
+ */
31
+ export class ChromaRagEngine {
32
+ collection;
33
+ client;
34
+ collectionName;
35
+ embeddingFunction;
36
+ constructor(chroma) {
37
+ const host = chroma?.host ?? DEFAULT_CHROMA_HOST;
38
+ const port = chroma?.port ?? DEFAULT_CHROMA_PORT;
39
+ const ssl = chroma?.ssl ?? false;
40
+ this.collectionName = chroma?.collectionName ?? DEFAULT_CHROMA_COLLECTION;
41
+ this.client = new ChromaClient({ host, port, ssl });
42
+ this.embeddingFunction = new DefaultEmbeddingFunction();
43
+ }
44
+ async initialize() {
45
+ await this.client.heartbeat();
46
+ this.collection = await this.client.getOrCreateCollection({
47
+ name: this.collectionName,
48
+ embeddingFunction: this.embeddingFunction
49
+ });
50
+ }
51
+ requireCollection() {
52
+ if (!this.collection) {
53
+ throw new Error('ChromaRagEngine not initialized; call initialize() first');
54
+ }
55
+ return this.collection;
56
+ }
57
+ async addDocument(id, content, metadata = {}) {
58
+ const col = this.requireCollection();
59
+ const metadatas = Object.keys(metadata).length > 0 ? [toChromaMetadata(metadata)] : undefined;
60
+ await col.upsert({
61
+ ids: [id],
62
+ documents: [content],
63
+ ...(metadatas ? { metadatas } : {})
64
+ });
65
+ }
66
+ async query(queryText, topK = 5, metadataFilter) {
67
+ const col = this.requireCollection();
68
+ const hasFilter = metadataFilter && Object.keys(metadataFilter).length > 0;
69
+ const raw = await col.query({
70
+ queryTexts: [queryText],
71
+ nResults: topK,
72
+ include: ['documents', 'distances', 'metadatas'],
73
+ ...(hasFilter ? { where: chromaWhereFromFilter(metadataFilter) } : {})
74
+ });
75
+ const ids = raw.ids[0] ?? [];
76
+ const docs = raw.documents[0] ?? [];
77
+ const dists = raw.distances[0] ?? [];
78
+ const metas = raw.metadatas?.[0] ?? [];
79
+ const out = [];
80
+ for (let i = 0; i < ids.length; i++) {
81
+ const id = ids[i];
82
+ const content = docs[i];
83
+ if (id == null || content == null)
84
+ continue;
85
+ const metaRaw = metas[i];
86
+ const meta = metaRaw
87
+ ? Object.fromEntries(Object.entries(metaRaw).map(([k, v]) => [k, String(v)]))
88
+ : undefined;
89
+ let score = distanceToScore(dists[i] ?? null);
90
+ score *= recencyScoreMultiplier(meta?.updatedAt);
91
+ out.push({
92
+ id,
93
+ content,
94
+ score,
95
+ ...(meta ? { metadata: meta } : {})
96
+ });
97
+ }
98
+ return out;
99
+ }
100
+ async removeDocument(id) {
101
+ const col = this.requireCollection();
102
+ await col.delete({ ids: [id] });
103
+ }
104
+ async getDocumentCount() {
105
+ return this.requireCollection().count();
106
+ }
107
+ }
108
+ //# sourceMappingURL=chroma-rag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chroma-rag.js","sourceRoot":"","sources":["../../src/core/chroma-rag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Removes near-duplicate blocks from retrieved context to save tokens.
3
+ */
4
+ /**
5
+ * Dedup RAG chunks separated by `\n\n---\n\n`.
6
+ */
7
+ export declare function deduplicateRetrievalBlocks(text: string): string;
8
+ /**
9
+ * Fallback dedup for MEMORY.md style text (paragraph-level).
10
+ */
11
+ export declare function deduplicateLines(text: string): string;
12
+ //# sourceMappingURL=context-hygiene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-hygiene.d.ts","sourceRoot":"","sources":["../../src/core/context-hygiene.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAe/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWrD"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Removes near-duplicate blocks from retrieved context to save tokens.
3
+ */
4
+ function normalizeForDedup(s) {
5
+ return s.replace(/\s+/g, ' ').trim().toLowerCase();
6
+ }
7
+ /**
8
+ * Dedup RAG chunks separated by `\n\n---\n\n`.
9
+ */
10
+ export function deduplicateRetrievalBlocks(text) {
11
+ const sep = '\n\n---\n\n';
12
+ if (!text.includes(sep)) {
13
+ return deduplicateLines(text);
14
+ }
15
+ const blocks = text.split(sep).map((b) => b.trim()).filter(Boolean);
16
+ const seen = new Set();
17
+ const out = [];
18
+ for (const b of blocks) {
19
+ const key = normalizeForDedup(b).slice(0, 800);
20
+ if (key.length === 0 || seen.has(key))
21
+ continue;
22
+ seen.add(key);
23
+ out.push(b);
24
+ }
25
+ return out.join(sep);
26
+ }
27
+ /**
28
+ * Fallback dedup for MEMORY.md style text (paragraph-level).
29
+ */
30
+ export function deduplicateLines(text) {
31
+ const paras = text.split(/\n\n+/).map((p) => p.trim()).filter(Boolean);
32
+ const seen = new Set();
33
+ const out = [];
34
+ for (const p of paras) {
35
+ const key = normalizeForDedup(p).slice(0, 800);
36
+ if (key.length === 0 || seen.has(key))
37
+ continue;
38
+ seen.add(key);
39
+ out.push(p);
40
+ }
41
+ return out.join('\n\n');
42
+ }
43
+ //# sourceMappingURL=context-hygiene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-hygiene.js","sourceRoot":"","sources":["../../src/core/context-hygiene.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,SAAS,iBAAiB,CAAC,CAAS;IAClC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,MAAM,GAAG,GAAG,aAAa,CAAC;IAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAChD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAChD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=context-hygiene.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-hygiene.test.d.ts","sourceRoot":"","sources":["../../src/core/context-hygiene.test.ts"],"names":[],"mappings":""}