agentic-flow 3.1.0 → 3.3.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 (81) hide show
  1. package/.agents/skills/agentic-flow-ecosystem/SKILL.md +51 -0
  2. package/.claude/skills/agentic-flow-ecosystem/skill.md +59 -0
  3. package/.claude/skills/agentic-flow-quickstart/skill.md +6 -6
  4. package/.claude/skills/hooks-automation/skill.md +11 -11
  5. package/.claude/skills/memory-patterns/skill.md +7 -7
  6. package/.claude/skills/sparc-methodology/skill.md +13 -13
  7. package/.claude/skills/swarm-coordination/skill.md +5 -5
  8. package/.claude/skills/worker-benchmarks/skill.md +5 -5
  9. package/.claude/skills/worker-integration/skill.md +5 -5
  10. package/CHANGELOG.md +50 -0
  11. package/README.md +82 -67
  12. package/dist/.tsbuildinfo +1 -1
  13. package/dist/cli/commands/init.d.ts.map +1 -1
  14. package/dist/cli/commands/init.js +9 -0
  15. package/dist/cli/commands/init.js.map +1 -1
  16. package/dist/config/claudeFlow.d.ts +1 -1
  17. package/dist/core/agentdb-fast.d.ts +21 -11
  18. package/dist/core/agentdb-fast.d.ts.map +1 -1
  19. package/dist/core/agentdb-fast.js +39 -14
  20. package/dist/core/agentdb-fast.js.map +1 -1
  21. package/dist/integrations/agent-booster.d.ts +35 -0
  22. package/dist/integrations/agent-booster.d.ts.map +1 -0
  23. package/dist/integrations/agent-booster.js +45 -0
  24. package/dist/integrations/agent-booster.js.map +1 -0
  25. package/dist/integrations/index.d.ts +15 -0
  26. package/dist/integrations/index.d.ts.map +1 -0
  27. package/dist/integrations/index.js +11 -0
  28. package/dist/integrations/index.js.map +1 -0
  29. package/dist/integrations/onnx-wasm-embedder.d.ts +59 -0
  30. package/dist/integrations/onnx-wasm-embedder.d.ts.map +1 -0
  31. package/dist/integrations/onnx-wasm-embedder.js +145 -0
  32. package/dist/integrations/onnx-wasm-embedder.js.map +1 -0
  33. package/dist/integrations/optional.d.ts +32 -0
  34. package/dist/integrations/optional.d.ts.map +1 -0
  35. package/dist/integrations/optional.js +83 -0
  36. package/dist/integrations/optional.js.map +1 -0
  37. package/dist/integrations/prompt-injection.d.ts +52 -0
  38. package/dist/integrations/prompt-injection.d.ts.map +1 -0
  39. package/dist/integrations/prompt-injection.js +126 -0
  40. package/dist/integrations/prompt-injection.js.map +1 -0
  41. package/dist/integrations/sublinear.d.ts +99 -0
  42. package/dist/integrations/sublinear.d.ts.map +1 -0
  43. package/dist/integrations/sublinear.js +303 -0
  44. package/dist/integrations/sublinear.js.map +1 -0
  45. package/dist/integrations/task-partition.d.ts +40 -0
  46. package/dist/integrations/task-partition.d.ts.map +1 -0
  47. package/dist/integrations/task-partition.js +173 -0
  48. package/dist/integrations/task-partition.js.map +1 -0
  49. package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -1
  50. package/dist/intelligence/RuVectorIntelligence.js +4 -3
  51. package/dist/intelligence/RuVectorIntelligence.js.map +1 -1
  52. package/dist/mcp/mcp-policy.d.ts.map +1 -1
  53. package/dist/mcp/mcp-policy.js +2 -0
  54. package/dist/mcp/mcp-policy.js.map +1 -1
  55. package/dist/mcp/standalone-stdio.js +12 -26
  56. package/dist/mcp/standalone-stdio.js.map +1 -1
  57. package/dist/mcp/tools/ecosystem-tools.d.ts +49 -0
  58. package/dist/mcp/tools/ecosystem-tools.d.ts.map +1 -0
  59. package/dist/mcp/tools/ecosystem-tools.js +148 -0
  60. package/dist/mcp/tools/ecosystem-tools.js.map +1 -0
  61. package/dist/optimizations/configuration-tuning.d.ts +1 -1
  62. package/dist/routing/SemanticRouter.d.ts +25 -9
  63. package/dist/routing/SemanticRouter.d.ts.map +1 -1
  64. package/dist/routing/SemanticRouter.js +63 -12
  65. package/dist/routing/SemanticRouter.js.map +1 -1
  66. package/dist/services/sona-loader.d.ts +15 -1
  67. package/dist/services/sona-loader.d.ts.map +1 -1
  68. package/dist/services/sona-loader.js +54 -2
  69. package/dist/services/sona-loader.js.map +1 -1
  70. package/dist/utils/input-validator.d.ts +10 -2
  71. package/dist/utils/input-validator.d.ts.map +1 -1
  72. package/dist/utils/input-validator.js +30 -2
  73. package/dist/utils/input-validator.js.map +1 -1
  74. package/dist/utils/model-cache.d.ts.map +1 -1
  75. package/dist/utils/model-cache.js +6 -25
  76. package/dist/utils/model-cache.js.map +1 -1
  77. package/dist/wasm/onnx-embeddings-wasm.d.ts.map +1 -1
  78. package/dist/wasm/onnx-embeddings-wasm.js +21 -10
  79. package/dist/wasm/onnx-embeddings-wasm.js.map +1 -1
  80. package/docs/integrations/FASTMCP_CLI_INTEGRATION.md +1 -1
  81. package/package.json +13 -8
@@ -1 +1 @@
1
- {"version":3,"file":"input-validator.js","sourceRoot":"","sources":["../../src/utils/input-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACJ;IAApC,YAAY,OAAe,EAAS,KAAc;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,UAAK,GAAL,KAAK,CAAS;QAEhD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,cAAc;IACzB,kDAAkD;IAC1C,MAAM,CAAU,mBAAmB,GAAG;QAC5C,UAAU,EAAqB,cAAc;QAC7C,cAAc,EAAiB,sBAAsB;QACrD,kBAAkB,EAAa,eAAe;QAC9C,YAAY,EAAmB,iBAAiB;QAChD,cAAc,EAAiB,eAAe;QAC9C,kBAAkB,EAAa,uBAAuB;QACtD,WAAW,EAAoB,sBAAsB;QACrD,QAAQ,EAAuB,iBAAiB;QAChD,SAAS,EAAsB,sBAAsB;KACtD,CAAC;IAEF,4CAA4C;IACpC,MAAM,CAAU,mBAAmB,GAAG,kBAAkB,CAAC;IAEjE;;;;;;;OAOG;IACH,MAAM,CAAC,uBAAuB,CAC5B,eAAuB,EACvB,OAA2B;QAE3B,MAAM,IAAI,GAAG;YACX,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,KAAK;YACtC,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC;YAClC,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,KAAK;YACxC,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI;SACpC,CAAC;QAEF,2BAA2B;QAC3B,IAAI,eAAe,KAAK,IAAI,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAC9D,MAAM,IAAI,eAAe,CAAC,8BAA8B,EAAE,iBAAiB,CAAC,CAAC;QAC/E,CAAC;QAED,aAAa;QACb,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,eAAe,CACvB,0CAA0C,OAAO,eAAe,EAAE,EAClE,iBAAiB,CAClB,CAAC;QACJ,CAAC;QAED,cAAc;QACd,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,eAAe,CAAC,kCAAkC,EAAE,iBAAiB,CAAC,CAAC;QACnF,CAAC;QAED,eAAe;QACf,IAAI,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5C,MAAM,IAAI,eAAe,CACvB,mCAAmC,IAAI,CAAC,SAAS,SAAS,EAC1D,iBAAiB,CAClB,CAAC;QACJ,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5C,MAAM,IAAI,eAAe,CACvB,kCAAkC,IAAI,CAAC,SAAS,SAAS,EACzD,iBAAiB,CAClB,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,IAAI,SAAS,GAAG,eAAe,CAAC;QAChC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,4BAA4B;YAC5B,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;YAEtE,gCAAgC;YAChC,KAAK,MAAM,OAAO,IAAI,cAAc,CAAC,mBAAmB,EAAE,CAAC;gBACzD,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC5B,MAAM,IAAI,eAAe,CACvB,8CAA8C,EAC9C,iBAAiB,CAClB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,iBAAiB,CAAC,SAAiB;QACxC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,eAAe,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACnD,MAAM,IAAI,eAAe,CACvB,6CAA6C,EAC7C,WAAW,CACZ,CAAC;QACJ,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,eAAe,CACvB,oEAAoE,EACpE,WAAW,CACZ,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,kBAAkB,CAAC,UAAkB;QAC1C,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,eAAe,CACvB,oCAAoC,OAAO,UAAU,EAAE,EACvD,YAAY,CACb,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,eAAe,CAAC,mCAAmC,EAAE,YAAY,CAAC,CAAC;QAC/E,CAAC;QAED,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,eAAe,CAAC,oCAAoC,EAAE,YAAY,CAAC,CAAC;QAChF,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,eAAe,CACpB,OAAe,EACf,MAAc,GAAG,EACjB,MAAc,MAAM;QAEpB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,eAAe,CACvB,iCAAiC,OAAO,OAAO,EAAE,EACjD,SAAS,CACV,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,eAAe,CAAC,gCAAgC,EAAE,SAAS,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC;YAClB,MAAM,IAAI,eAAe,CAAC,0BAA0B,GAAG,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC;YAClB,MAAM,IAAI,eAAe,CAAC,yBAAyB,GAAG,KAAK,EAAE,SAAS,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,mBAAmB,CACxB,KAAc,EACd,SAAiB,EACjB,WAAmB,GAAG,EACtB,YAAoB,IAAI;QAExB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,eAAe,CAAC,GAAG,SAAS,mBAAmB,EAAE,SAAS,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,eAAe,CACvB,GAAG,SAAS,4BAA4B,QAAQ,GAAG,EACnD,SAAS,CACV,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEtB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,IAAI,eAAe,CACvB,GAAG,SAAS,IAAI,CAAC,oBAAoB,EACrC,SAAS,CACV,CAAC;YACJ,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;gBAC5B,MAAM,IAAI,eAAe,CACvB,GAAG,SAAS,IAAI,CAAC,mBAAmB,SAAS,SAAS,EACtD,SAAS,CACV,CAAC;YACJ,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,cAAc,CACnB,MAAe,EACf,MAQC;QAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,eAAe,CAAC,iCAAiC,EAAE,QAAQ,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,SAAS,GAAQ,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,MAA6B,CAAC;QAEhD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAE7B,iBAAiB;YACjB,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC9D,MAAM,IAAI,eAAe,CAAC,wBAAwB,GAAG,eAAe,EAAE,GAAG,CAAC,CAAC;YAC7E,CAAC;YAED,oCAAoC;YACpC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC/D,SAAS;YACX,CAAC;YAED,aAAa;YACb,IAAI,OAAO,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;gBAChC,MAAM,IAAI,eAAe,CACvB,wBAAwB,GAAG,aAAa,KAAK,CAAC,IAAI,SAAS,OAAO,KAAK,EAAE,EACzE,GAAG,CACJ,CAAC;YACJ,CAAC;YAED,mBAAmB;YACnB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACnD,MAAM,IAAI,eAAe,CACvB,wBAAwB,GAAG,0BAA0B,EACrD,GAAG,CACJ,CAAC;gBACJ,CAAC;gBAED,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;oBACjD,MAAM,IAAI,eAAe,CACvB,wBAAwB,GAAG,gBAAgB,KAAK,CAAC,GAAG,EAAE,EACtD,GAAG,CACJ,CAAC;gBACJ,CAAC;gBAED,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;oBACjD,MAAM,IAAI,eAAe,CACvB,wBAAwB,GAAG,gBAAgB,KAAK,CAAC,GAAG,EAAE,EACtD,GAAG,CACJ,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,mBAAmB;YACnB,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,eAAe,CACvB,wBAAwB,GAAG,qBAAqB,EAChD,GAAG,CACJ,CAAC;YACJ,CAAC;YAED,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,CAAC;QAED,OAAO,SAAc,CAAC;IACxB,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,YAAY,CAAC,IAAY;QAC9B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,sCAAsC;QACtC,OAAO,IAAI;aACR,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;aACvB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;aACtB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,CAAC,KAAa;QAChC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,eAAe,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC;QAED,oBAAoB;QACpB,MAAM,UAAU,GAAG,4BAA4B,CAAC;QAChD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,eAAe,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,eAAe,CAAC,gCAAgC,EAAE,OAAO,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;;AAGH;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,SAA6C;IAE7C,OAAO,KAAK,EAAE,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;gBACrC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,kBAAkB;oBACzB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;iBACnB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,uBAAuB;oBAC9B,OAAO,EAAE,mBAAmB;iBAC7B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Input Validation Utilities\n *\n * Provides secure input validation for RuVector integration:\n * - Task description validation\n * - Configuration validation\n * - Injection attack prevention\n * - Resource exhaustion prevention\n */\n\nexport interface ValidationOptions {\n maxLength?: number;\n minLength?: number;\n allowEmpty?: boolean;\n sanitize?: boolean;\n}\n\nexport class ValidationError extends Error {\n constructor(message: string, public field?: string) {\n super(message);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Input Validator\n *\n * Validates all external inputs to prevent:\n * - Injection attacks (XSS, SQL injection, prompt injection)\n * - Resource exhaustion (excessive length, recursion)\n * - Malicious content (scripts, control characters)\n */\nexport class InputValidator {\n // Suspicious patterns that could indicate attacks\n private static readonly SUSPICIOUS_PATTERNS = [\n /<script/i, // XSS attempt\n /javascript:/i, // JavaScript protocol\n /data:text\\/html/i, // Data URI XSS\n /on\\w+\\s*=/i, // Event handlers\n /\\beval\\s*\\(/i, // eval() calls\n /\\bFunction\\s*\\(/i, // Function constructor\n /__proto__/, // Prototype pollution\n /\\.\\.\\//, // Path traversal\n /[;\\x00]/, // SQL injection chars\n ];\n\n // Control characters that should be removed\n private static readonly CONTROL_CHARS_REGEX = /[\\x00-\\x1F\\x7F]/g;\n\n /**\n * Validate task description\n *\n * @param taskDescription - User-provided task description\n * @param options - Validation options\n * @returns Sanitized task description\n * @throws ValidationError if invalid\n */\n static validateTaskDescription(\n taskDescription: string,\n options?: ValidationOptions\n ): string {\n const opts = {\n maxLength: options?.maxLength ?? 10000,\n minLength: options?.minLength ?? 1,\n allowEmpty: options?.allowEmpty ?? false,\n sanitize: options?.sanitize ?? true,\n };\n\n // Check for null/undefined\n if (taskDescription === null || taskDescription === undefined) {\n throw new ValidationError('Task description is required', 'taskDescription');\n }\n\n // Check type\n if (typeof taskDescription !== 'string') {\n throw new ValidationError(\n `Task description must be a string, got ${typeof taskDescription}`,\n 'taskDescription'\n );\n }\n\n // Check empty\n if (!opts.allowEmpty && taskDescription.trim().length === 0) {\n throw new ValidationError('Task description cannot be empty', 'taskDescription');\n }\n\n // Check length\n if (taskDescription.length < opts.minLength) {\n throw new ValidationError(\n `Task description too short (min ${opts.minLength} chars)`,\n 'taskDescription'\n );\n }\n\n if (taskDescription.length > opts.maxLength) {\n throw new ValidationError(\n `Task description too long (max ${opts.maxLength} chars)`,\n 'taskDescription'\n );\n }\n\n // Sanitize if requested\n let sanitized = taskDescription;\n if (opts.sanitize) {\n // Remove control characters\n sanitized = sanitized.replace(InputValidator.CONTROL_CHARS_REGEX, '');\n\n // Check for suspicious patterns\n for (const pattern of InputValidator.SUSPICIOUS_PATTERNS) {\n if (pattern.test(sanitized)) {\n throw new ValidationError(\n 'Task description contains suspicious content',\n 'taskDescription'\n );\n }\n }\n }\n\n return sanitized.trim();\n }\n\n /**\n * Validate agent name\n *\n * @param agentName - Agent identifier\n * @returns Sanitized agent name\n * @throws ValidationError if invalid\n */\n static validateAgentName(agentName: string): string {\n if (!agentName || typeof agentName !== 'string') {\n throw new ValidationError('Agent name is required', 'agentName');\n }\n\n if (agentName.length < 1 || agentName.length > 100) {\n throw new ValidationError(\n 'Agent name must be between 1-100 characters',\n 'agentName'\n );\n }\n\n // Only allow alphanumeric, dash, underscore\n if (!/^[a-zA-Z0-9_-]+$/.test(agentName)) {\n throw new ValidationError(\n 'Agent name can only contain letters, numbers, dash, and underscore',\n 'agentName'\n );\n }\n\n return agentName.toLowerCase();\n }\n\n /**\n * Validate confidence score\n *\n * @param confidence - Confidence score (0-1)\n * @returns Validated confidence\n * @throws ValidationError if invalid\n */\n static validateConfidence(confidence: number): number {\n if (typeof confidence !== 'number') {\n throw new ValidationError(\n `Confidence must be a number, got ${typeof confidence}`,\n 'confidence'\n );\n }\n\n if (Number.isNaN(confidence) || !Number.isFinite(confidence)) {\n throw new ValidationError('Confidence must be a valid number', 'confidence');\n }\n\n if (confidence < 0 || confidence > 1) {\n throw new ValidationError('Confidence must be between 0 and 1', 'confidence');\n }\n\n return confidence;\n }\n\n /**\n * Validate timeout value\n *\n * @param timeout - Timeout in milliseconds\n * @param min - Minimum allowed timeout (default: 100ms)\n * @param max - Maximum allowed timeout (default: 5 minutes)\n * @returns Validated timeout\n * @throws ValidationError if invalid\n */\n static validateTimeout(\n timeout: number,\n min: number = 100,\n max: number = 300000\n ): number {\n if (typeof timeout !== 'number') {\n throw new ValidationError(\n `Timeout must be a number, got ${typeof timeout}`,\n 'timeout'\n );\n }\n\n if (Number.isNaN(timeout) || !Number.isFinite(timeout)) {\n throw new ValidationError('Timeout must be a valid number', 'timeout');\n }\n\n if (timeout < min) {\n throw new ValidationError(`Timeout too short (min ${min}ms)`, 'timeout');\n }\n\n if (timeout > max) {\n throw new ValidationError(`Timeout too long (max ${max}ms)`, 'timeout');\n }\n\n return Math.floor(timeout);\n }\n\n /**\n * Validate array of strings\n *\n * @param array - Array to validate\n * @param fieldName - Field name for error messages\n * @param maxItems - Maximum number of items\n * @param maxLength - Maximum length per item\n * @returns Validated array\n * @throws ValidationError if invalid\n */\n static validateStringArray(\n array: unknown,\n fieldName: string,\n maxItems: number = 100,\n maxLength: number = 1000\n ): string[] {\n if (!Array.isArray(array)) {\n throw new ValidationError(`${fieldName} must be an array`, fieldName);\n }\n\n if (array.length > maxItems) {\n throw new ValidationError(\n `${fieldName} has too many items (max ${maxItems})`,\n fieldName\n );\n }\n\n const validated: string[] = [];\n for (let i = 0; i < array.length; i++) {\n const item = array[i];\n\n if (typeof item !== 'string') {\n throw new ValidationError(\n `${fieldName}[${i}] must be a string`,\n fieldName\n );\n }\n\n if (item.length > maxLength) {\n throw new ValidationError(\n `${fieldName}[${i}] too long (max ${maxLength} chars)`,\n fieldName\n );\n }\n\n validated.push(item);\n }\n\n return validated;\n }\n\n /**\n * Validate configuration object\n *\n * @param config - Configuration to validate\n * @param schema - Validation schema\n * @returns Validated configuration\n * @throws ValidationError if invalid\n */\n static validateConfig<T extends Record<string, any>>(\n config: unknown,\n schema: {\n [K in keyof T]: {\n type: 'string' | 'number' | 'boolean' | 'object';\n required?: boolean;\n min?: number;\n max?: number;\n validator?: (value: any) => boolean;\n };\n }\n ): T {\n if (!config || typeof config !== 'object') {\n throw new ValidationError('Configuration must be an object', 'config');\n }\n\n const validated: any = {};\n const configObj = config as Record<string, any>;\n\n for (const [key, rules] of Object.entries(schema)) {\n const value = configObj[key];\n\n // Check required\n if (rules.required && (value === undefined || value === null)) {\n throw new ValidationError(`Configuration field '${key}' is required`, key);\n }\n\n // Skip if optional and not provided\n if (!rules.required && (value === undefined || value === null)) {\n continue;\n }\n\n // Check type\n if (typeof value !== rules.type) {\n throw new ValidationError(\n `Configuration field '${key}' must be ${rules.type}, got ${typeof value}`,\n key\n );\n }\n\n // Validate numbers\n if (rules.type === 'number') {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n throw new ValidationError(\n `Configuration field '${key}' must be a valid number`,\n key\n );\n }\n\n if (rules.min !== undefined && value < rules.min) {\n throw new ValidationError(\n `Configuration field '${key}' must be >= ${rules.min}`,\n key\n );\n }\n\n if (rules.max !== undefined && value > rules.max) {\n throw new ValidationError(\n `Configuration field '${key}' must be <= ${rules.max}`,\n key\n );\n }\n }\n\n // Custom validator\n if (rules.validator && !rules.validator(value)) {\n throw new ValidationError(\n `Configuration field '${key}' failed validation`,\n key\n );\n }\n\n validated[key] = value;\n }\n\n return validated as T;\n }\n\n /**\n * Sanitize HTML to prevent XSS\n *\n * @param html - HTML string to sanitize\n * @returns Sanitized HTML (text only)\n */\n static sanitizeHtml(html: string): string {\n if (typeof html !== 'string') {\n return '';\n }\n\n // Strip all HTML tags, keep text only\n return html\n .replace(/<[^>]*>/g, '')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&')\n .replace(/&quot;/g, '\"')\n .replace(/&#x27;/g, \"'\");\n }\n\n /**\n * Validate email address\n *\n * @param email - Email to validate\n * @returns Normalized email\n * @throws ValidationError if invalid\n */\n static validateEmail(email: string): string {\n if (!email || typeof email !== 'string') {\n throw new ValidationError('Email is required', 'email');\n }\n\n // Basic email regex\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n throw new ValidationError('Invalid email format', 'email');\n }\n\n if (email.length > 254) {\n throw new ValidationError('Email too long (max 254 chars)', 'email');\n }\n\n return email.toLowerCase().trim();\n }\n}\n\n/**\n * Validation middleware factory\n *\n * Creates validation middleware for Express/Fastify routes\n */\nexport function createValidationMiddleware(\n validator: (req: any) => void | Promise<void>\n) {\n return async (req: any, res: any, next: any) => {\n try {\n await validator(req);\n next();\n } catch (error) {\n if (error instanceof ValidationError) {\n res.status(400).json({\n error: 'Validation Error',\n message: error.message,\n field: error.field,\n });\n } else {\n res.status(500).json({\n error: 'Internal Server Error',\n message: 'Validation failed',\n });\n }\n }\n };\n}\n"]}
1
+ {"version":3,"file":"input-validator.js","sourceRoot":"","sources":["../../src/utils/input-validator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Input Validation Utilities\n *\n * Provides secure input validation for RuVector integration:\n * - Task description validation\n * - Configuration validation\n * - Injection attack prevention (prompt injection via aidefence when installed)\n * - Resource exhaustion prevention\n */\n\nimport { scanPromptInjection, type InjectionScan } from '../integrations/prompt-injection.js';\n\nexport interface ValidationOptions {\n maxLength?: number;\n minLength?: number;\n allowEmpty?: boolean;\n sanitize?: boolean;\n}\n\nexport class ValidationError extends Error {\n constructor(message: string, public field?: string) {\n super(message);\n this.name = 'ValidationError';\n }\n}\n\n/** Thrown when task text is rejected by the prompt-injection policy. */\nexport class PromptInjectionError extends ValidationError {\n constructor(public scan: InjectionScan, field = 'taskDescription') {\n const top = scan.threats[0];\n super(\n `Task description rejected: possible prompt injection (${scan.maxSeverity}` +\n (top ? `, ${top.type}` : '') + `; engine ${scan.engine})`,\n field,\n );\n this.name = 'PromptInjectionError';\n }\n}\n\n/**\n * Input Validator\n *\n * Validates all external inputs to prevent:\n * - Injection attacks (XSS, SQL injection, and prompt injection — the latter\n * through `scanPromptInjection`, see integrations/prompt-injection.ts)\n * - Resource exhaustion (excessive length, recursion)\n * - Malicious content (scripts, control characters)\n */\nexport class InputValidator {\n // Suspicious patterns that could indicate attacks\n private static readonly SUSPICIOUS_PATTERNS = [\n /<script/i, // XSS attempt\n /javascript:/i, // JavaScript protocol\n /data:text\\/html/i, // Data URI XSS\n /on\\w+\\s*=/i, // Event handlers\n /\\beval\\s*\\(/i, // eval() calls\n /\\bFunction\\s*\\(/i, // Function constructor\n /__proto__/, // Prototype pollution\n /\\.\\.\\//, // Path traversal\n /[;\\x00]/, // SQL injection chars\n ];\n\n private static readonly warnedInjections = new Set<string>();\n\n // Control characters that should be removed\n private static readonly CONTROL_CHARS_REGEX = /[\\x00-\\x1F\\x7F]/g;\n\n /**\n * Validate task description\n *\n * @param taskDescription - User-provided task description\n * @param options - Validation options\n * @returns Sanitized task description\n * @throws ValidationError if invalid\n */\n static validateTaskDescription(\n taskDescription: string,\n options?: ValidationOptions\n ): string {\n const opts = {\n maxLength: options?.maxLength ?? 10000,\n minLength: options?.minLength ?? 1,\n allowEmpty: options?.allowEmpty ?? false,\n sanitize: options?.sanitize ?? true,\n };\n\n // Check for null/undefined\n if (taskDescription === null || taskDescription === undefined) {\n throw new ValidationError('Task description is required', 'taskDescription');\n }\n\n // Check type\n if (typeof taskDescription !== 'string') {\n throw new ValidationError(\n `Task description must be a string, got ${typeof taskDescription}`,\n 'taskDescription'\n );\n }\n\n // Check empty\n if (!opts.allowEmpty && taskDescription.trim().length === 0) {\n throw new ValidationError('Task description cannot be empty', 'taskDescription');\n }\n\n // Check length\n if (taskDescription.length < opts.minLength) {\n throw new ValidationError(\n `Task description too short (min ${opts.minLength} chars)`,\n 'taskDescription'\n );\n }\n\n if (taskDescription.length > opts.maxLength) {\n throw new ValidationError(\n `Task description too long (max ${opts.maxLength} chars)`,\n 'taskDescription'\n );\n }\n\n // Sanitize if requested\n let sanitized = taskDescription;\n if (opts.sanitize) {\n // Remove control characters\n sanitized = sanitized.replace(InputValidator.CONTROL_CHARS_REGEX, '');\n\n // Check for suspicious patterns\n for (const pattern of InputValidator.SUSPICIOUS_PATTERNS) {\n if (pattern.test(sanitized)) {\n throw new ValidationError(\n 'Task description contains suspicious content',\n 'taskDescription'\n );\n }\n }\n\n // Prompt injection (aidefence when installed, built-in patterns otherwise)\n const scan = scanPromptInjection(sanitized);\n if (scan.decision === 'block') {\n throw new PromptInjectionError(scan);\n }\n if (scan.decision === 'warn') {\n const message =\n `possible prompt injection in task description (${scan.maxSeverity}: ` +\n `${scan.threats.map((t) => t.type).join(', ')}; engine ${scan.engine})`;\n // Once per distinct finding: an orchestrator loop would otherwise repeat it.\n if (!InputValidator.warnedInjections.has(message)) {\n InputValidator.warnedInjections.add(message);\n process.emitWarning(message, { code: 'AGENTIC_FLOW_PROMPT_INJECTION' });\n }\n }\n }\n\n return sanitized.trim();\n }\n\n /**\n * Validate agent name\n *\n * @param agentName - Agent identifier\n * @returns Sanitized agent name\n * @throws ValidationError if invalid\n */\n static validateAgentName(agentName: string): string {\n if (!agentName || typeof agentName !== 'string') {\n throw new ValidationError('Agent name is required', 'agentName');\n }\n\n if (agentName.length < 1 || agentName.length > 100) {\n throw new ValidationError(\n 'Agent name must be between 1-100 characters',\n 'agentName'\n );\n }\n\n // Only allow alphanumeric, dash, underscore\n if (!/^[a-zA-Z0-9_-]+$/.test(agentName)) {\n throw new ValidationError(\n 'Agent name can only contain letters, numbers, dash, and underscore',\n 'agentName'\n );\n }\n\n return agentName.toLowerCase();\n }\n\n /**\n * Validate confidence score\n *\n * @param confidence - Confidence score (0-1)\n * @returns Validated confidence\n * @throws ValidationError if invalid\n */\n static validateConfidence(confidence: number): number {\n if (typeof confidence !== 'number') {\n throw new ValidationError(\n `Confidence must be a number, got ${typeof confidence}`,\n 'confidence'\n );\n }\n\n if (Number.isNaN(confidence) || !Number.isFinite(confidence)) {\n throw new ValidationError('Confidence must be a valid number', 'confidence');\n }\n\n if (confidence < 0 || confidence > 1) {\n throw new ValidationError('Confidence must be between 0 and 1', 'confidence');\n }\n\n return confidence;\n }\n\n /**\n * Validate timeout value\n *\n * @param timeout - Timeout in milliseconds\n * @param min - Minimum allowed timeout (default: 100ms)\n * @param max - Maximum allowed timeout (default: 5 minutes)\n * @returns Validated timeout\n * @throws ValidationError if invalid\n */\n static validateTimeout(\n timeout: number,\n min: number = 100,\n max: number = 300000\n ): number {\n if (typeof timeout !== 'number') {\n throw new ValidationError(\n `Timeout must be a number, got ${typeof timeout}`,\n 'timeout'\n );\n }\n\n if (Number.isNaN(timeout) || !Number.isFinite(timeout)) {\n throw new ValidationError('Timeout must be a valid number', 'timeout');\n }\n\n if (timeout < min) {\n throw new ValidationError(`Timeout too short (min ${min}ms)`, 'timeout');\n }\n\n if (timeout > max) {\n throw new ValidationError(`Timeout too long (max ${max}ms)`, 'timeout');\n }\n\n return Math.floor(timeout);\n }\n\n /**\n * Validate array of strings\n *\n * @param array - Array to validate\n * @param fieldName - Field name for error messages\n * @param maxItems - Maximum number of items\n * @param maxLength - Maximum length per item\n * @returns Validated array\n * @throws ValidationError if invalid\n */\n static validateStringArray(\n array: unknown,\n fieldName: string,\n maxItems: number = 100,\n maxLength: number = 1000\n ): string[] {\n if (!Array.isArray(array)) {\n throw new ValidationError(`${fieldName} must be an array`, fieldName);\n }\n\n if (array.length > maxItems) {\n throw new ValidationError(\n `${fieldName} has too many items (max ${maxItems})`,\n fieldName\n );\n }\n\n const validated: string[] = [];\n for (let i = 0; i < array.length; i++) {\n const item = array[i];\n\n if (typeof item !== 'string') {\n throw new ValidationError(\n `${fieldName}[${i}] must be a string`,\n fieldName\n );\n }\n\n if (item.length > maxLength) {\n throw new ValidationError(\n `${fieldName}[${i}] too long (max ${maxLength} chars)`,\n fieldName\n );\n }\n\n validated.push(item);\n }\n\n return validated;\n }\n\n /**\n * Validate configuration object\n *\n * @param config - Configuration to validate\n * @param schema - Validation schema\n * @returns Validated configuration\n * @throws ValidationError if invalid\n */\n static validateConfig<T extends Record<string, any>>(\n config: unknown,\n schema: {\n [K in keyof T]: {\n type: 'string' | 'number' | 'boolean' | 'object';\n required?: boolean;\n min?: number;\n max?: number;\n validator?: (value: any) => boolean;\n };\n }\n ): T {\n if (!config || typeof config !== 'object') {\n throw new ValidationError('Configuration must be an object', 'config');\n }\n\n const validated: any = {};\n const configObj = config as Record<string, any>;\n\n for (const [key, rules] of Object.entries(schema)) {\n const value = configObj[key];\n\n // Check required\n if (rules.required && (value === undefined || value === null)) {\n throw new ValidationError(`Configuration field '${key}' is required`, key);\n }\n\n // Skip if optional and not provided\n if (!rules.required && (value === undefined || value === null)) {\n continue;\n }\n\n // Check type\n if (typeof value !== rules.type) {\n throw new ValidationError(\n `Configuration field '${key}' must be ${rules.type}, got ${typeof value}`,\n key\n );\n }\n\n // Validate numbers\n if (rules.type === 'number') {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n throw new ValidationError(\n `Configuration field '${key}' must be a valid number`,\n key\n );\n }\n\n if (rules.min !== undefined && value < rules.min) {\n throw new ValidationError(\n `Configuration field '${key}' must be >= ${rules.min}`,\n key\n );\n }\n\n if (rules.max !== undefined && value > rules.max) {\n throw new ValidationError(\n `Configuration field '${key}' must be <= ${rules.max}`,\n key\n );\n }\n }\n\n // Custom validator\n if (rules.validator && !rules.validator(value)) {\n throw new ValidationError(\n `Configuration field '${key}' failed validation`,\n key\n );\n }\n\n validated[key] = value;\n }\n\n return validated as T;\n }\n\n /**\n * Sanitize HTML to prevent XSS\n *\n * @param html - HTML string to sanitize\n * @returns Sanitized HTML (text only)\n */\n static sanitizeHtml(html: string): string {\n if (typeof html !== 'string') {\n return '';\n }\n\n // Strip all HTML tags, keep text only\n return html\n .replace(/<[^>]*>/g, '')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&')\n .replace(/&quot;/g, '\"')\n .replace(/&#x27;/g, \"'\");\n }\n\n /**\n * Validate email address\n *\n * @param email - Email to validate\n * @returns Normalized email\n * @throws ValidationError if invalid\n */\n static validateEmail(email: string): string {\n if (!email || typeof email !== 'string') {\n throw new ValidationError('Email is required', 'email');\n }\n\n // Basic email regex\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n throw new ValidationError('Invalid email format', 'email');\n }\n\n if (email.length > 254) {\n throw new ValidationError('Email too long (max 254 chars)', 'email');\n }\n\n return email.toLowerCase().trim();\n }\n}\n\n/**\n * Validation middleware factory\n *\n * Creates validation middleware for Express/Fastify routes\n */\nexport function createValidationMiddleware(\n validator: (req: any) => void | Promise<void>\n) {\n return async (req: any, res: any, next: any) => {\n try {\n await validator(req);\n next();\n } catch (error) {\n if (error instanceof ValidationError) {\n res.status(400).json({\n error: 'Validation Error',\n message: error.message,\n field: error.field,\n });\n } else {\n res.status(500).json({\n error: 'Internal Server Error',\n message: 'Validation failed',\n });\n }\n }\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"model-cache.d.ts","sourceRoot":"","sources":["../../src/utils/model-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,cAAM,UAAU;IACd,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAK;gBAEZ,SAAS,GAAE,MAAY;IAInC;;OAEG;IACG,SAAS,CAAC,CAAC,EACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,YAAY,GAAE,MAAyB,GACtC,OAAO,CAAC,CAAC,CAAC;IA4Bb;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAUlC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,GAAE,MAAyB,GAAG,IAAI;IAW3E;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,QAAQ,IAAI,UAAU;IAoBtB;;OAEG;IACH,OAAO,CAAC,aAAa;CAuBtB;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAC;AAG3C,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,CAgC1D;AAED,wBAAsB,6BAA6B,CACjD,IAAI,GAAE,MAA6B,EACnC,KAAK,GAAE,MAAkC,GACxC,OAAO,CAAC,GAAG,CAAC,CASd;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,CAS1D"}
1
+ {"version":3,"file":"model-cache.d.ts","sourceRoot":"","sources":["../../src/utils/model-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,cAAM,UAAU;IACd,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAK;gBAEZ,SAAS,GAAE,MAAY;IAInC;;OAEG;IACG,SAAS,CAAC,CAAC,EACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,YAAY,GAAE,MAAyB,GACtC,OAAO,CAAC,CAAC,CAAC;IA4Bb;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAUlC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,GAAE,MAAyB,GAAG,IAAI;IAW3E;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,QAAQ,IAAI,UAAU;IAoBtB;;OAEG;IACH,OAAO,CAAC,aAAa;CAuBtB;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAC;AAG3C,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,CAa1D;AAED,wBAAsB,6BAA6B,CACjD,IAAI,GAAE,MAA6B,EACnC,KAAK,GAAE,MAAkC,GACxC,OAAO,CAAC,GAAG,CAAC,CASd;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,CAS1D"}
@@ -132,31 +132,12 @@ export const modelCache = new ModelCache();
132
132
  // Convenience functions
133
133
  export async function getCachedOnnxEmbedder() {
134
134
  return modelCache.getOrLoad('onnx-embeddings', async () => {
135
- // Suppress experimental warning for WASM
136
- const originalEmit = process.emit;
137
- // @ts-ignore
138
- process.emit = function (name, data, ...args) {
139
- if (name === 'warning' && typeof data === 'object' &&
140
- data.name === 'ExperimentalWarning' &&
141
- data.message?.includes('Import')) {
142
- return false;
143
- }
144
- // @ts-ignore
145
- return originalEmit.apply(process, [name, data, ...args]);
146
- };
147
- try {
148
- const onnxModule = await import('ruvector-onnx-embeddings-wasm');
149
- const EmbedderClass = onnxModule.OnnxEmbeddings || onnxModule.default;
150
- if (EmbedderClass) {
151
- const embedder = new EmbedderClass();
152
- await embedder.initialize?.();
153
- return embedder;
154
- }
155
- }
156
- finally {
157
- process.emit = originalEmit;
158
- }
159
- return null;
135
+ // ruvector-onnx-embeddings-wasm exposes WasmEmbedder (not the
136
+ // OnnxEmbeddings class this used to look for) and cannot be import()ed
137
+ // as published; the shared loader handles both. Resolves to an object
138
+ // with async embed(text) -> Float32Array, or null.
139
+ const { getOnnxWasmEmbedder } = await import('../integrations/onnx-wasm-embedder.js');
140
+ return getOnnxWasmEmbedder();
160
141
  }, 100 * 1024 * 1024 // 100MB estimate for ONNX model
161
142
  );
162
143
  }
@@ -1 +1 @@
1
- {"version":3,"file":"model-cache.js","sourceRoot":"","sources":["../../src/utils/model-cache.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Global Model Cache\n *\n * Caches loaded models in memory to avoid repeated initialization overhead.\n * Supports ONNX embeddings, transformers.js pipelines, and other heavy models.\n */\n\ninterface CachedModel {\n model: any;\n loadedAt: number;\n lastUsed: number;\n useCount: number;\n sizeEstimate: number; // bytes\n}\n\ninterface CacheStats {\n models: number;\n totalSize: number;\n size?: number;\n totalHits: number;\n totalMisses: number;\n hits: number;\n misses: number;\n hitRate: number;\n}\n\nclass ModelCache {\n private cache = new Map<string, CachedModel>();\n private maxSize: number; // Max cache size in bytes\n private totalHits = 0;\n private totalMisses = 0;\n\n constructor(maxSizeMB: number = 512) {\n this.maxSize = maxSizeMB * 1024 * 1024;\n }\n\n /**\n * Get a cached model or load it\n */\n async getOrLoad<T>(\n key: string,\n loader: () => Promise<T>,\n sizeEstimate: number = 50 * 1024 * 1024 // Default 50MB estimate\n ): Promise<T> {\n const cached = this.cache.get(key);\n if (cached) {\n cached.lastUsed = Date.now();\n cached.useCount++;\n this.totalHits++;\n return cached.model as T;\n }\n\n this.totalMisses++;\n\n // Evict if needed\n this.evictIfNeeded(sizeEstimate);\n\n // Load model\n const model = await loader();\n\n this.cache.set(key, {\n model,\n loadedAt: Date.now(),\n lastUsed: Date.now(),\n useCount: 1,\n sizeEstimate\n });\n\n return model;\n }\n\n /**\n * Check if model is cached\n */\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n /**\n * Get cached model without loading\n */\n get<T>(key: string): T | undefined {\n const cached = this.cache.get(key);\n if (cached) {\n cached.lastUsed = Date.now();\n cached.useCount++;\n return cached.model as T;\n }\n return undefined;\n }\n\n /**\n * Manually cache a model\n */\n set(key: string, model: any, sizeEstimate: number = 50 * 1024 * 1024): void {\n this.evictIfNeeded(sizeEstimate);\n this.cache.set(key, {\n model,\n loadedAt: Date.now(),\n lastUsed: Date.now(),\n useCount: 1,\n sizeEstimate\n });\n }\n\n /**\n * Remove a model from cache\n */\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all cached models\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n let totalSize = 0;\n for (const cached of this.cache.values()) {\n totalSize += cached.sizeEstimate;\n }\n const hits = this.totalHits;\n const misses = this.totalMisses;\n const total = hits + misses;\n return {\n models: this.cache.size,\n totalSize,\n size: this.cache.size,\n totalHits: hits,\n totalMisses: misses,\n hits,\n misses,\n hitRate: total > 0 ? hits / total : 0\n };\n }\n\n /**\n * Evict least recently used models if cache is full\n */\n private evictIfNeeded(newSize: number): void {\n let currentSize = 0;\n for (const cached of this.cache.values()) {\n currentSize += cached.sizeEstimate;\n }\n\n if (currentSize + newSize <= this.maxSize) {\n return;\n }\n\n // Sort by last used time (LRU)\n const entries = Array.from(this.cache.entries())\n .sort((a, b) => a[1].lastUsed - b[1].lastUsed);\n\n // Evict until we have space\n for (const [key, cached] of entries) {\n if (currentSize + newSize <= this.maxSize) {\n break;\n }\n this.cache.delete(key);\n currentSize -= cached.sizeEstimate;\n }\n }\n}\n\n// Global singleton\nexport const modelCache = new ModelCache();\n\n// Convenience functions\nexport async function getCachedOnnxEmbedder(): Promise<any> {\n return modelCache.getOrLoad(\n 'onnx-embeddings',\n async () => {\n // Suppress experimental warning for WASM\n const originalEmit = process.emit;\n // @ts-ignore\n process.emit = function (name, data, ...args) {\n if (name === 'warning' && typeof data === 'object' &&\n (data as any).name === 'ExperimentalWarning' &&\n (data as any).message?.includes('Import')) {\n return false;\n }\n // @ts-ignore\n return originalEmit.apply(process, [name, data, ...args]);\n };\n\n try {\n const onnxModule = await import('ruvector-onnx-embeddings-wasm') as any;\n const EmbedderClass = onnxModule.OnnxEmbeddings || onnxModule.default;\n if (EmbedderClass) {\n const embedder = new EmbedderClass();\n await embedder.initialize?.();\n return embedder;\n }\n } finally {\n process.emit = originalEmit;\n }\n return null;\n },\n 100 * 1024 * 1024 // 100MB estimate for ONNX model\n );\n}\n\nexport async function getCachedTransformersPipeline(\n task: string = 'feature-extraction',\n model: string = 'Xenova/all-MiniLM-L6-v2'\n): Promise<any> {\n return modelCache.getOrLoad(\n `transformers:${task}:${model}`,\n async () => {\n const { pipeline } = await import('@huggingface/transformers');\n return pipeline(task as any, model);\n },\n 200 * 1024 * 1024 // 200MB estimate for transformers model\n );\n}\n\nexport async function getCachedRuvectorCore(): Promise<any> {\n return modelCache.getOrLoad(\n 'ruvector-core',\n async () => {\n const ruvector = await import('ruvector');\n return ruvector;\n },\n 50 * 1024 * 1024\n );\n}\n"]}
1
+ {"version":3,"file":"model-cache.js","sourceRoot":"","sources":["../../src/utils/model-cache.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Global Model Cache\n *\n * Caches loaded models in memory to avoid repeated initialization overhead.\n * Supports ONNX embeddings, transformers.js pipelines, and other heavy models.\n */\n\ninterface CachedModel {\n model: any;\n loadedAt: number;\n lastUsed: number;\n useCount: number;\n sizeEstimate: number; // bytes\n}\n\ninterface CacheStats {\n models: number;\n totalSize: number;\n size?: number;\n totalHits: number;\n totalMisses: number;\n hits: number;\n misses: number;\n hitRate: number;\n}\n\nclass ModelCache {\n private cache = new Map<string, CachedModel>();\n private maxSize: number; // Max cache size in bytes\n private totalHits = 0;\n private totalMisses = 0;\n\n constructor(maxSizeMB: number = 512) {\n this.maxSize = maxSizeMB * 1024 * 1024;\n }\n\n /**\n * Get a cached model or load it\n */\n async getOrLoad<T>(\n key: string,\n loader: () => Promise<T>,\n sizeEstimate: number = 50 * 1024 * 1024 // Default 50MB estimate\n ): Promise<T> {\n const cached = this.cache.get(key);\n if (cached) {\n cached.lastUsed = Date.now();\n cached.useCount++;\n this.totalHits++;\n return cached.model as T;\n }\n\n this.totalMisses++;\n\n // Evict if needed\n this.evictIfNeeded(sizeEstimate);\n\n // Load model\n const model = await loader();\n\n this.cache.set(key, {\n model,\n loadedAt: Date.now(),\n lastUsed: Date.now(),\n useCount: 1,\n sizeEstimate\n });\n\n return model;\n }\n\n /**\n * Check if model is cached\n */\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n /**\n * Get cached model without loading\n */\n get<T>(key: string): T | undefined {\n const cached = this.cache.get(key);\n if (cached) {\n cached.lastUsed = Date.now();\n cached.useCount++;\n return cached.model as T;\n }\n return undefined;\n }\n\n /**\n * Manually cache a model\n */\n set(key: string, model: any, sizeEstimate: number = 50 * 1024 * 1024): void {\n this.evictIfNeeded(sizeEstimate);\n this.cache.set(key, {\n model,\n loadedAt: Date.now(),\n lastUsed: Date.now(),\n useCount: 1,\n sizeEstimate\n });\n }\n\n /**\n * Remove a model from cache\n */\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all cached models\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n let totalSize = 0;\n for (const cached of this.cache.values()) {\n totalSize += cached.sizeEstimate;\n }\n const hits = this.totalHits;\n const misses = this.totalMisses;\n const total = hits + misses;\n return {\n models: this.cache.size,\n totalSize,\n size: this.cache.size,\n totalHits: hits,\n totalMisses: misses,\n hits,\n misses,\n hitRate: total > 0 ? hits / total : 0\n };\n }\n\n /**\n * Evict least recently used models if cache is full\n */\n private evictIfNeeded(newSize: number): void {\n let currentSize = 0;\n for (const cached of this.cache.values()) {\n currentSize += cached.sizeEstimate;\n }\n\n if (currentSize + newSize <= this.maxSize) {\n return;\n }\n\n // Sort by last used time (LRU)\n const entries = Array.from(this.cache.entries())\n .sort((a, b) => a[1].lastUsed - b[1].lastUsed);\n\n // Evict until we have space\n for (const [key, cached] of entries) {\n if (currentSize + newSize <= this.maxSize) {\n break;\n }\n this.cache.delete(key);\n currentSize -= cached.sizeEstimate;\n }\n }\n}\n\n// Global singleton\nexport const modelCache = new ModelCache();\n\n// Convenience functions\nexport async function getCachedOnnxEmbedder(): Promise<any> {\n return modelCache.getOrLoad(\n 'onnx-embeddings',\n async () => {\n // ruvector-onnx-embeddings-wasm exposes WasmEmbedder (not the\n // OnnxEmbeddings class this used to look for) and cannot be import()ed\n // as published; the shared loader handles both. Resolves to an object\n // with async embed(text) -> Float32Array, or null.\n const { getOnnxWasmEmbedder } = await import('../integrations/onnx-wasm-embedder.js');\n return getOnnxWasmEmbedder();\n },\n 100 * 1024 * 1024 // 100MB estimate for ONNX model\n );\n}\n\nexport async function getCachedTransformersPipeline(\n task: string = 'feature-extraction',\n model: string = 'Xenova/all-MiniLM-L6-v2'\n): Promise<any> {\n return modelCache.getOrLoad(\n `transformers:${task}:${model}`,\n async () => {\n const { pipeline } = await import('@huggingface/transformers');\n return pipeline(task as any, model);\n },\n 200 * 1024 * 1024 // 200MB estimate for transformers model\n );\n}\n\nexport async function getCachedRuvectorCore(): Promise<any> {\n return modelCache.getOrLoad(\n 'ruvector-core',\n async () => {\n const ruvector = await import('ruvector');\n return ruvector;\n },\n 50 * 1024 * 1024\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"onnx-embeddings-wasm.d.ts","sourceRoot":"","sources":["../../src/wasm/onnx-embeddings-wasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAkCH,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAQD;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAoC/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqCtE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAuC1E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAkBzE;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,mBAAmB,CAY9C;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAO9C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AA8BD;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,WAAW,CAAS;IAEtB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAKxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAKjD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAKrD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/D,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM;IAI1D,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,OAAO;IAIxB,QAAQ,IAAI,mBAAmB;IAIzB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC;AAKD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,kBAAkB,CAK1D;;;;;;;;;;;;;;;AAED,wBAaE"}
1
+ {"version":3,"file":"onnx-embeddings-wasm.d.ts","sourceRoot":"","sources":["../../src/wasm/onnx-embeddings-wasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAkCH,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAQD;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CA6C/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqCtE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAuC1E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAkBzE;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,mBAAmB,CAY9C;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAO9C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AA8BD;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,WAAW,CAAS;IAEtB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAKxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAKjD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAKrD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/D,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM;IAI1D,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,OAAO;IAIxB,QAAQ,IAAI,mBAAmB;IAIzB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC;AAKD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,kBAAkB,CAK1D;;;;;;;;;;;;;;;AAED,wBAaE"}
@@ -40,16 +40,27 @@ export async function initOnnxEmbeddingsWasm() {
40
40
  return initPromise;
41
41
  initPromise = (async () => {
42
42
  try {
43
- const mod = await import('ruvector-onnx-embeddings-wasm');
44
- wasmModule = mod;
45
- // Initialize WASM runtime
46
- if (wasmModule.initialize) {
47
- await wasmModule.initialize();
48
- }
49
- // Load default model
50
- if (wasmModule.loadModel && !wasmModule.isModelLoaded?.()) {
51
- await wasmModule.loadModel();
52
- }
43
+ // The package's own exports are WasmEmbedder/cosineSimilarity and its
44
+ // published glue cannot be import()ed directly; adapt the shared loader
45
+ // to this module's interface.
46
+ const { getOnnxWasmEmbedder, loadOnnxWasmModule } = await import('../integrations/onnx-wasm-embedder.js');
47
+ const [mod, embedder] = await Promise.all([loadOnnxWasmModule(), getOnnxWasmEmbedder()]);
48
+ if (!mod || !embedder)
49
+ throw new Error('ruvector-onnx-embeddings-wasm or its model is unavailable');
50
+ wasmModule = {
51
+ embed: (text) => embedder.embed(text),
52
+ embedBatch: (texts) => embedder.embedBatch(texts),
53
+ similarity: async (a, b) => mod.cosineSimilarity(await embedder.embed(a), await embedder.embed(b)),
54
+ cosineSimilarity: (a, b) => mod.cosineSimilarity(a, b),
55
+ loadModel: async () => { },
56
+ isModelLoaded: () => true,
57
+ getModelInfo: () => ({ name: 'all-MiniLM-L6-v2', dimension: embedder.dimension, vocabSize: 30522, maxSequenceLength: 256 }),
58
+ isAvailable: () => true,
59
+ isSIMDEnabled: () => Boolean(mod.simd_available?.()),
60
+ getVersion: () => mod.version(),
61
+ initialize: async () => { },
62
+ shutdown: async () => { },
63
+ };
53
64
  initialized = true;
54
65
  logger.info('ONNX Embeddings WASM initialized', {
55
66
  version: wasmModule.getVersion?.() || 'unknown',
@@ -1 +1 @@
1
- {"version":3,"file":"onnx-embeddings-wasm.js","sourceRoot":"","sources":["../../src/wasm/onnx-embeddings-wasm.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ONNX Embeddings WASM Integration\n *\n * Provides browser-compatible embeddings using ruvector-onnx-embeddings-wasm.\n *\n * Features:\n * - Pure WASM: No native dependencies, runs in browser\n * - all-MiniLM-L6-v2: 384-dimensional semantic embeddings\n * - SIMD Acceleration: Uses WebAssembly SIMD when available\n * - Small Bundle: Optimized WASM binary size\n *\n * Use Cases:\n * - Browser-based semantic search\n * - Client-side RAG applications\n * - Edge computing (Cloudflare Workers, Deno Deploy)\n * - Offline-first applications\n *\n * Performance:\n * - ~50ms per embedding (SIMD enabled)\n * - ~200ms per embedding (SIMD disabled)\n * - Batch processing: ~30ms per embedding\n */\n\nimport { logger } from '../utils/logger.js';\n\n// Module state\nlet wasmModule: OnnxEmbeddingsModule | null = null;\nlet initialized = false;\nlet initPromise: Promise<boolean> | null = null;\n\n/**\n * ONNX Embeddings WASM module interface\n */\ninterface OnnxEmbeddingsModule {\n // Core functions\n embed: (text: string) => Promise<Float32Array>;\n embedBatch: (texts: string[]) => Promise<Float32Array[]>;\n similarity: (text1: string, text2: string) => Promise<number>;\n cosineSimilarity: (a: Float32Array, b: Float32Array) => number;\n\n // Model management\n loadModel: (modelPath?: string) => Promise<void>;\n isModelLoaded: () => boolean;\n getModelInfo: () => ModelInfo;\n\n // Utilities\n isAvailable: () => boolean;\n isSIMDEnabled: () => boolean;\n getVersion: () => string;\n\n // Lifecycle\n initialize: () => Promise<void>;\n shutdown: () => Promise<void>;\n}\n\ninterface ModelInfo {\n name: string;\n dimension: number;\n vocabSize: number;\n maxSequenceLength: number;\n}\n\nexport interface OnnxEmbeddingResult {\n embedding: Float32Array;\n timeMs: number;\n source: 'wasm' | 'fallback';\n}\n\nexport interface OnnxBatchResult {\n embeddings: Float32Array[];\n totalTimeMs: number;\n avgTimeMs: number;\n source: 'wasm' | 'fallback';\n}\n\nexport interface OnnxEmbeddingsStats {\n available: boolean;\n simdEnabled: boolean;\n modelLoaded: boolean;\n modelInfo?: ModelInfo;\n totalEmbeddings: number;\n totalLatencyMs: number;\n avgLatencyMs: number;\n}\n\n// Stats tracking\nlet stats = {\n totalEmbeddings: 0,\n totalLatencyMs: 0,\n};\n\n/**\n * Initialize ONNX Embeddings WASM module\n */\nexport async function initOnnxEmbeddingsWasm(): Promise<boolean> {\n if (initialized) return wasmModule !== null;\n if (initPromise) return initPromise;\n\n initPromise = (async () => {\n try {\n const mod = await import('ruvector-onnx-embeddings-wasm');\n wasmModule = mod as unknown as OnnxEmbeddingsModule;\n\n // Initialize WASM runtime\n if (wasmModule.initialize) {\n await wasmModule.initialize();\n }\n\n // Load default model\n if (wasmModule.loadModel && !wasmModule.isModelLoaded?.()) {\n await wasmModule.loadModel();\n }\n\n initialized = true;\n\n logger.info('ONNX Embeddings WASM initialized', {\n version: wasmModule.getVersion?.() || 'unknown',\n simd: wasmModule.isSIMDEnabled?.() ?? false,\n modelLoaded: wasmModule.isModelLoaded?.() ?? false,\n });\n\n return true;\n } catch (error) {\n logger.debug('ONNX Embeddings WASM not available', { error });\n initialized = true;\n return false;\n }\n })();\n\n return initPromise;\n}\n\n/**\n * Check if ONNX WASM embeddings are available\n */\nexport function isOnnxWasmAvailable(): boolean {\n return wasmModule !== null && (wasmModule.isAvailable?.() ?? false);\n}\n\n/**\n * Check if SIMD acceleration is enabled\n */\nexport function isSIMDEnabled(): boolean {\n return wasmModule?.isSIMDEnabled?.() ?? false;\n}\n\n/**\n * Generate embedding for text using WASM\n */\nexport async function embed(text: string): Promise<OnnxEmbeddingResult> {\n if (!initialized) {\n await initOnnxEmbeddingsWasm();\n }\n\n const startTime = performance.now();\n\n if (wasmModule && wasmModule.isModelLoaded?.()) {\n try {\n const embedding = await wasmModule.embed(text);\n const timeMs = performance.now() - startTime;\n\n stats.totalEmbeddings++;\n stats.totalLatencyMs += timeMs;\n\n return {\n embedding,\n timeMs,\n source: 'wasm',\n };\n } catch (error) {\n logger.warn('WASM embedding failed, using fallback', { error });\n }\n }\n\n // Fallback to simple hash-based embedding\n const embedding = simpleEmbed(text);\n const timeMs = performance.now() - startTime;\n\n stats.totalEmbeddings++;\n stats.totalLatencyMs += timeMs;\n\n return {\n embedding,\n timeMs,\n source: 'fallback',\n };\n}\n\n/**\n * Generate embeddings for multiple texts (batch processing)\n */\nexport async function embedBatch(texts: string[]): Promise<OnnxBatchResult> {\n if (!initialized) {\n await initOnnxEmbeddingsWasm();\n }\n\n const startTime = performance.now();\n\n if (wasmModule && wasmModule.embedBatch && wasmModule.isModelLoaded?.()) {\n try {\n const embeddings = await wasmModule.embedBatch(texts);\n const totalTimeMs = performance.now() - startTime;\n\n stats.totalEmbeddings += texts.length;\n stats.totalLatencyMs += totalTimeMs;\n\n return {\n embeddings,\n totalTimeMs,\n avgTimeMs: totalTimeMs / texts.length,\n source: 'wasm',\n };\n } catch (error) {\n logger.warn('WASM batch embedding failed, using fallback', { error });\n }\n }\n\n // Fallback to sequential simple embeddings\n const embeddings = texts.map((text) => simpleEmbed(text));\n const totalTimeMs = performance.now() - startTime;\n\n stats.totalEmbeddings += texts.length;\n stats.totalLatencyMs += totalTimeMs;\n\n return {\n embeddings,\n totalTimeMs,\n avgTimeMs: totalTimeMs / texts.length,\n source: 'fallback',\n };\n}\n\n/**\n * Compute similarity between two texts\n */\nexport async function similarity(text1: string, text2: string): Promise<number> {\n if (wasmModule && wasmModule.similarity) {\n try {\n return await wasmModule.similarity(text1, text2);\n } catch {\n // Fall through to fallback\n }\n }\n\n // Fallback\n const [result1, result2] = await Promise.all([embed(text1), embed(text2)]);\n return cosineSimilarity(result1.embedding, result2.embedding);\n}\n\n/**\n * Compute cosine similarity between two embeddings\n */\nexport function cosineSimilarity(a: Float32Array, b: Float32Array): number {\n if (wasmModule?.cosineSimilarity) {\n return wasmModule.cosineSimilarity(a, b);\n }\n\n // JS fallback\n let dot = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n return denominator === 0 ? 0 : dot / denominator;\n}\n\n/**\n * Get embedding statistics\n */\nexport function getStats(): OnnxEmbeddingsStats {\n const modelInfo = wasmModule?.getModelInfo?.();\n\n return {\n available: isOnnxWasmAvailable(),\n simdEnabled: isSIMDEnabled(),\n modelLoaded: wasmModule?.isModelLoaded?.() ?? false,\n modelInfo,\n totalEmbeddings: stats.totalEmbeddings,\n totalLatencyMs: stats.totalLatencyMs,\n avgLatencyMs: stats.totalEmbeddings > 0 ? stats.totalLatencyMs / stats.totalEmbeddings : 0,\n };\n}\n\n/**\n * Shutdown WASM module\n */\nexport async function shutdown(): Promise<void> {\n if (wasmModule?.shutdown) {\n await wasmModule.shutdown();\n }\n wasmModule = null;\n initialized = false;\n initPromise = null;\n}\n\n/**\n * Reset stats (for testing)\n */\nexport function resetStats(): void {\n stats = { totalEmbeddings: 0, totalLatencyMs: 0 };\n}\n\n/**\n * Simple hash-based embedding fallback\n * Not semantic, but provides consistent embeddings for testing\n */\nfunction simpleEmbed(text: string, dim: number = 384): Float32Array {\n const embedding = new Float32Array(dim);\n\n // Multi-pass hash for better distribution\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n embedding[i % dim] += code / 255;\n embedding[(i * 7) % dim] += (code * 0.3) / 255;\n embedding[(i * 13) % dim] += (code * 0.2) / 255;\n }\n\n // Normalize\n let norm = 0;\n for (let i = 0; i < dim; i++) {\n norm += embedding[i] * embedding[i];\n }\n norm = Math.sqrt(norm) || 1;\n for (let i = 0; i < dim; i++) {\n embedding[i] /= norm;\n }\n\n return embedding;\n}\n\n/**\n * OnnxEmbeddingsWasm class for object-oriented usage\n */\nexport class OnnxEmbeddingsWasm {\n private initialized = false;\n\n async init(): Promise<boolean> {\n this.initialized = await initOnnxEmbeddingsWasm();\n return this.initialized;\n }\n\n async embed(text: string): Promise<OnnxEmbeddingResult> {\n if (!this.initialized) await this.init();\n return embed(text);\n }\n\n async embedBatch(texts: string[]): Promise<OnnxBatchResult> {\n if (!this.initialized) await this.init();\n return embedBatch(texts);\n }\n\n async similarity(text1: string, text2: string): Promise<number> {\n if (!this.initialized) await this.init();\n return similarity(text1, text2);\n }\n\n cosineSimilarity(a: Float32Array, b: Float32Array): number {\n return cosineSimilarity(a, b);\n }\n\n isAvailable(): boolean {\n return isOnnxWasmAvailable();\n }\n\n isSIMDEnabled(): boolean {\n return isSIMDEnabled();\n }\n\n getStats(): OnnxEmbeddingsStats {\n return getStats();\n }\n\n async shutdown(): Promise<void> {\n await shutdown();\n this.initialized = false;\n }\n}\n\n// Singleton instance\nlet instance: OnnxEmbeddingsWasm | null = null;\n\n/**\n * Get singleton OnnxEmbeddingsWasm instance\n */\nexport function getOnnxEmbeddingsWasm(): OnnxEmbeddingsWasm {\n if (!instance) {\n instance = new OnnxEmbeddingsWasm();\n }\n return instance;\n}\n\nexport default {\n OnnxEmbeddingsWasm,\n getOnnxEmbeddingsWasm,\n initOnnxEmbeddingsWasm,\n isOnnxWasmAvailable,\n isSIMDEnabled,\n embed,\n embedBatch,\n similarity,\n cosineSimilarity,\n getStats,\n shutdown,\n resetStats,\n};\n"]}
1
+ {"version":3,"file":"onnx-embeddings-wasm.js","sourceRoot":"","sources":["../../src/wasm/onnx-embeddings-wasm.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ONNX Embeddings WASM Integration\n *\n * Provides browser-compatible embeddings using ruvector-onnx-embeddings-wasm.\n *\n * Features:\n * - Pure WASM: No native dependencies, runs in browser\n * - all-MiniLM-L6-v2: 384-dimensional semantic embeddings\n * - SIMD Acceleration: Uses WebAssembly SIMD when available\n * - Small Bundle: Optimized WASM binary size\n *\n * Use Cases:\n * - Browser-based semantic search\n * - Client-side RAG applications\n * - Edge computing (Cloudflare Workers, Deno Deploy)\n * - Offline-first applications\n *\n * Performance:\n * - ~50ms per embedding (SIMD enabled)\n * - ~200ms per embedding (SIMD disabled)\n * - Batch processing: ~30ms per embedding\n */\n\nimport { logger } from '../utils/logger.js';\n\n// Module state\nlet wasmModule: OnnxEmbeddingsModule | null = null;\nlet initialized = false;\nlet initPromise: Promise<boolean> | null = null;\n\n/**\n * ONNX Embeddings WASM module interface\n */\ninterface OnnxEmbeddingsModule {\n // Core functions\n embed: (text: string) => Promise<Float32Array>;\n embedBatch: (texts: string[]) => Promise<Float32Array[]>;\n similarity: (text1: string, text2: string) => Promise<number>;\n cosineSimilarity: (a: Float32Array, b: Float32Array) => number;\n\n // Model management\n loadModel: (modelPath?: string) => Promise<void>;\n isModelLoaded: () => boolean;\n getModelInfo: () => ModelInfo;\n\n // Utilities\n isAvailable: () => boolean;\n isSIMDEnabled: () => boolean;\n getVersion: () => string;\n\n // Lifecycle\n initialize: () => Promise<void>;\n shutdown: () => Promise<void>;\n}\n\ninterface ModelInfo {\n name: string;\n dimension: number;\n vocabSize: number;\n maxSequenceLength: number;\n}\n\nexport interface OnnxEmbeddingResult {\n embedding: Float32Array;\n timeMs: number;\n source: 'wasm' | 'fallback';\n}\n\nexport interface OnnxBatchResult {\n embeddings: Float32Array[];\n totalTimeMs: number;\n avgTimeMs: number;\n source: 'wasm' | 'fallback';\n}\n\nexport interface OnnxEmbeddingsStats {\n available: boolean;\n simdEnabled: boolean;\n modelLoaded: boolean;\n modelInfo?: ModelInfo;\n totalEmbeddings: number;\n totalLatencyMs: number;\n avgLatencyMs: number;\n}\n\n// Stats tracking\nlet stats = {\n totalEmbeddings: 0,\n totalLatencyMs: 0,\n};\n\n/**\n * Initialize ONNX Embeddings WASM module\n */\nexport async function initOnnxEmbeddingsWasm(): Promise<boolean> {\n if (initialized) return wasmModule !== null;\n if (initPromise) return initPromise;\n\n initPromise = (async () => {\n try {\n // The package's own exports are WasmEmbedder/cosineSimilarity and its\n // published glue cannot be import()ed directly; adapt the shared loader\n // to this module's interface.\n const { getOnnxWasmEmbedder, loadOnnxWasmModule } = await import('../integrations/onnx-wasm-embedder.js');\n const [mod, embedder] = await Promise.all([loadOnnxWasmModule(), getOnnxWasmEmbedder()]);\n if (!mod || !embedder) throw new Error('ruvector-onnx-embeddings-wasm or its model is unavailable');\n wasmModule = {\n embed: (text: string) => embedder.embed(text),\n embedBatch: (texts: string[]) => embedder.embedBatch(texts),\n similarity: async (a: string, b: string) =>\n mod.cosineSimilarity(await embedder.embed(a), await embedder.embed(b)),\n cosineSimilarity: (a: Float32Array, b: Float32Array) => mod.cosineSimilarity(a, b),\n loadModel: async () => {},\n isModelLoaded: () => true,\n getModelInfo: () => ({ name: 'all-MiniLM-L6-v2', dimension: embedder.dimension, vocabSize: 30522, maxSequenceLength: 256 }),\n isAvailable: () => true,\n isSIMDEnabled: () => Boolean((mod as any).simd_available?.()),\n getVersion: () => mod.version(),\n initialize: async () => {},\n shutdown: async () => {},\n };\n\n initialized = true;\n\n logger.info('ONNX Embeddings WASM initialized', {\n version: wasmModule.getVersion?.() || 'unknown',\n simd: wasmModule.isSIMDEnabled?.() ?? false,\n modelLoaded: wasmModule.isModelLoaded?.() ?? false,\n });\n\n return true;\n } catch (error) {\n logger.debug('ONNX Embeddings WASM not available', { error });\n initialized = true;\n return false;\n }\n })();\n\n return initPromise;\n}\n\n/**\n * Check if ONNX WASM embeddings are available\n */\nexport function isOnnxWasmAvailable(): boolean {\n return wasmModule !== null && (wasmModule.isAvailable?.() ?? false);\n}\n\n/**\n * Check if SIMD acceleration is enabled\n */\nexport function isSIMDEnabled(): boolean {\n return wasmModule?.isSIMDEnabled?.() ?? false;\n}\n\n/**\n * Generate embedding for text using WASM\n */\nexport async function embed(text: string): Promise<OnnxEmbeddingResult> {\n if (!initialized) {\n await initOnnxEmbeddingsWasm();\n }\n\n const startTime = performance.now();\n\n if (wasmModule && wasmModule.isModelLoaded?.()) {\n try {\n const embedding = await wasmModule.embed(text);\n const timeMs = performance.now() - startTime;\n\n stats.totalEmbeddings++;\n stats.totalLatencyMs += timeMs;\n\n return {\n embedding,\n timeMs,\n source: 'wasm',\n };\n } catch (error) {\n logger.warn('WASM embedding failed, using fallback', { error });\n }\n }\n\n // Fallback to simple hash-based embedding\n const embedding = simpleEmbed(text);\n const timeMs = performance.now() - startTime;\n\n stats.totalEmbeddings++;\n stats.totalLatencyMs += timeMs;\n\n return {\n embedding,\n timeMs,\n source: 'fallback',\n };\n}\n\n/**\n * Generate embeddings for multiple texts (batch processing)\n */\nexport async function embedBatch(texts: string[]): Promise<OnnxBatchResult> {\n if (!initialized) {\n await initOnnxEmbeddingsWasm();\n }\n\n const startTime = performance.now();\n\n if (wasmModule && wasmModule.embedBatch && wasmModule.isModelLoaded?.()) {\n try {\n const embeddings = await wasmModule.embedBatch(texts);\n const totalTimeMs = performance.now() - startTime;\n\n stats.totalEmbeddings += texts.length;\n stats.totalLatencyMs += totalTimeMs;\n\n return {\n embeddings,\n totalTimeMs,\n avgTimeMs: totalTimeMs / texts.length,\n source: 'wasm',\n };\n } catch (error) {\n logger.warn('WASM batch embedding failed, using fallback', { error });\n }\n }\n\n // Fallback to sequential simple embeddings\n const embeddings = texts.map((text) => simpleEmbed(text));\n const totalTimeMs = performance.now() - startTime;\n\n stats.totalEmbeddings += texts.length;\n stats.totalLatencyMs += totalTimeMs;\n\n return {\n embeddings,\n totalTimeMs,\n avgTimeMs: totalTimeMs / texts.length,\n source: 'fallback',\n };\n}\n\n/**\n * Compute similarity between two texts\n */\nexport async function similarity(text1: string, text2: string): Promise<number> {\n if (wasmModule && wasmModule.similarity) {\n try {\n return await wasmModule.similarity(text1, text2);\n } catch {\n // Fall through to fallback\n }\n }\n\n // Fallback\n const [result1, result2] = await Promise.all([embed(text1), embed(text2)]);\n return cosineSimilarity(result1.embedding, result2.embedding);\n}\n\n/**\n * Compute cosine similarity between two embeddings\n */\nexport function cosineSimilarity(a: Float32Array, b: Float32Array): number {\n if (wasmModule?.cosineSimilarity) {\n return wasmModule.cosineSimilarity(a, b);\n }\n\n // JS fallback\n let dot = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n return denominator === 0 ? 0 : dot / denominator;\n}\n\n/**\n * Get embedding statistics\n */\nexport function getStats(): OnnxEmbeddingsStats {\n const modelInfo = wasmModule?.getModelInfo?.();\n\n return {\n available: isOnnxWasmAvailable(),\n simdEnabled: isSIMDEnabled(),\n modelLoaded: wasmModule?.isModelLoaded?.() ?? false,\n modelInfo,\n totalEmbeddings: stats.totalEmbeddings,\n totalLatencyMs: stats.totalLatencyMs,\n avgLatencyMs: stats.totalEmbeddings > 0 ? stats.totalLatencyMs / stats.totalEmbeddings : 0,\n };\n}\n\n/**\n * Shutdown WASM module\n */\nexport async function shutdown(): Promise<void> {\n if (wasmModule?.shutdown) {\n await wasmModule.shutdown();\n }\n wasmModule = null;\n initialized = false;\n initPromise = null;\n}\n\n/**\n * Reset stats (for testing)\n */\nexport function resetStats(): void {\n stats = { totalEmbeddings: 0, totalLatencyMs: 0 };\n}\n\n/**\n * Simple hash-based embedding fallback\n * Not semantic, but provides consistent embeddings for testing\n */\nfunction simpleEmbed(text: string, dim: number = 384): Float32Array {\n const embedding = new Float32Array(dim);\n\n // Multi-pass hash for better distribution\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n embedding[i % dim] += code / 255;\n embedding[(i * 7) % dim] += (code * 0.3) / 255;\n embedding[(i * 13) % dim] += (code * 0.2) / 255;\n }\n\n // Normalize\n let norm = 0;\n for (let i = 0; i < dim; i++) {\n norm += embedding[i] * embedding[i];\n }\n norm = Math.sqrt(norm) || 1;\n for (let i = 0; i < dim; i++) {\n embedding[i] /= norm;\n }\n\n return embedding;\n}\n\n/**\n * OnnxEmbeddingsWasm class for object-oriented usage\n */\nexport class OnnxEmbeddingsWasm {\n private initialized = false;\n\n async init(): Promise<boolean> {\n this.initialized = await initOnnxEmbeddingsWasm();\n return this.initialized;\n }\n\n async embed(text: string): Promise<OnnxEmbeddingResult> {\n if (!this.initialized) await this.init();\n return embed(text);\n }\n\n async embedBatch(texts: string[]): Promise<OnnxBatchResult> {\n if (!this.initialized) await this.init();\n return embedBatch(texts);\n }\n\n async similarity(text1: string, text2: string): Promise<number> {\n if (!this.initialized) await this.init();\n return similarity(text1, text2);\n }\n\n cosineSimilarity(a: Float32Array, b: Float32Array): number {\n return cosineSimilarity(a, b);\n }\n\n isAvailable(): boolean {\n return isOnnxWasmAvailable();\n }\n\n isSIMDEnabled(): boolean {\n return isSIMDEnabled();\n }\n\n getStats(): OnnxEmbeddingsStats {\n return getStats();\n }\n\n async shutdown(): Promise<void> {\n await shutdown();\n this.initialized = false;\n }\n}\n\n// Singleton instance\nlet instance: OnnxEmbeddingsWasm | null = null;\n\n/**\n * Get singleton OnnxEmbeddingsWasm instance\n */\nexport function getOnnxEmbeddingsWasm(): OnnxEmbeddingsWasm {\n if (!instance) {\n instance = new OnnxEmbeddingsWasm();\n }\n return instance;\n}\n\nexport default {\n OnnxEmbeddingsWasm,\n getOnnxEmbeddingsWasm,\n initOnnxEmbeddingsWasm,\n isOnnxWasmAvailable,\n isSIMDEnabled,\n embed,\n embedBatch,\n similarity,\n cosineSimilarity,\n getStats,\n shutdown,\n resetStats,\n};\n"]}
@@ -367,7 +367,7 @@ npm run build
367
367
  npm publish
368
368
 
369
369
  # Users can then use:
370
- npx agentic-flow@3.1.0 mcp start
370
+ npx agentic-flow@3.2.0 mcp start
371
371
  ```
372
372
 
373
373
  ## 🚀 Advanced Usage
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-flow",
3
- "version": "3.1.0",
3
+ "version": "3.3.0",
4
4
  "description": "The agentic meta-harness — freeze the model, evolve the harness. An open runtime that routes each query to the cost-optimal model, evolves its own harness (planner/context/reviewer/retry/tool/memory/score policy) and autonomously repairs code, then orchestrates 66 specialized agents, 213 MCP tools, ReasoningBank memory, and multi-agent swarms on top. Built by @ruvnet on the Claude Agent SDK.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -30,6 +30,7 @@
30
30
  "./agent-booster": "./dist/agent-booster/index.js",
31
31
  "./transport/quic": "./dist/transport/quic.js",
32
32
  "./embeddings": "./dist/embeddings/index.js",
33
+ "./integrations": "./dist/integrations/index.js",
33
34
  "./transport/loader": "./dist/transport/quic-loader.js"
34
35
  },
35
36
  "scripts": {
@@ -70,8 +71,9 @@
70
71
  "benchmark:embeddings": "tsx src/benchmarks/embeddings-benchmark.ts",
71
72
  "test:orchestration": "vitest run tests/orchestration/ --reporter=verbose",
72
73
  "test:security": "vitest run tests/security tests/mcp/mcp-policy.test.ts tests/transport/quic-loader.test.ts",
73
- "test:governance": "vitest run tests/harness/provenance.test.ts tests/harness/flywheel-governance.test.ts tests/mcp/mcp-policy.test.ts tests/mcp/package-surface.test.ts tests/embeddings/huggingface-offline.test.ts tests/repair/darwin-repair.test.ts",
74
- "test:orchestration:smoke": "tsx tests/orchestration/orchestration-api.smoke.ts && tsx tests/orchestration/loop-policy.smoke.ts && tsx tests/orchestration/memory-plane.smoke.ts"
74
+ "test:governance": "vitest run tests/harness/provenance.test.ts tests/harness/flywheel-governance.test.ts tests/mcp/mcp-policy.test.ts tests/mcp/package-surface.test.ts tests/embeddings/huggingface-offline.test.ts tests/repair/darwin-repair.test.ts tests/integrations",
75
+ "test:orchestration:smoke": "tsx tests/orchestration/orchestration-api.smoke.ts && tsx tests/orchestration/loop-policy.smoke.ts && tsx tests/orchestration/memory-plane.smoke.ts",
76
+ "test:integrations": "vitest run tests/integrations"
75
77
  },
76
78
  "keywords": [
77
79
  "meta-harness",
@@ -168,14 +170,12 @@
168
170
  "@anthropic-ai/claude-agent-sdk": "^0.1.5",
169
171
  "@anthropic-ai/sdk": "^0.65.0",
170
172
  "@google/genai": "^1.22.0",
173
+ "@huggingface/transformers": "^4.2.0",
171
174
  "@metaharness/router": "^0.3.2",
172
- "@ruvector/core": "^0.1.29",
173
175
  "@ruvector/edge-full": "^0.1.0",
174
176
  "@ruvector/router": "^0.1.30",
175
- "@ruvector/ruvllm": "^2.5.5",
176
177
  "@ruvector/tiny-dancer": "^0.1.17",
177
178
  "@supabase/supabase-js": "^2.78.0",
178
- "@huggingface/transformers": "^4.2.0",
179
179
  "agentdb": "^3.0.0",
180
180
  "axios": "^1.12.2",
181
181
  "dotenv": "^16.4.5",
@@ -194,8 +194,12 @@
194
194
  },
195
195
  "optionalDependencies": {
196
196
  "@rollup/rollup-darwin-arm64": "^4.59.0",
197
- "@ruvector/attention": "^0.1.4",
198
- "@ruvector/sona": "^0.1.4",
197
+ "@ruvector/attention": "^2.2.3",
198
+ "@ruvector/mincut-wasm": "^2.3.0",
199
+ "@ruvector/sona": "^0.1.10",
200
+ "@ruvnet/sublinear-core": "^1.0.0",
201
+ "agent-booster": "^0.2.2",
202
+ "aidefence": "^3.0.1",
199
203
  "better-sqlite3": "^11.10.0",
200
204
  "onnxruntime-node": "^1.23.2",
201
205
  "sharp": "^0.35.5",
@@ -223,6 +227,7 @@
223
227
  "dist",
224
228
  "docs",
225
229
  ".claude",
230
+ ".agents/skills",
226
231
  "validation",
227
232
  "scripts",
228
233
  "wasm",