pi-harness-runtime 1.1.94 → 1.1.96

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 (226) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/harness/e2e/chatgpt-quota-scraper.ts +28 -4
  3. package/harness/loop-runtime.ts +3 -0
  4. package/index.ts +130 -29
  5. package/package.json +2 -1
  6. package/packages/a2a-adapter/package.json +1 -1
  7. package/packages/architecture-generator/package.json +1 -1
  8. package/packages/auth/package.json +1 -1
  9. package/packages/autonomous-refactor/package.json +1 -1
  10. package/packages/autonomous-runtime/package.json +1 -1
  11. package/packages/cache-strategy/package.json +1 -1
  12. package/packages/capability-registry/package.json +1 -1
  13. package/packages/checkpoint/package.json +1 -1
  14. package/packages/cli-plugin-sdk/package.json +1 -1
  15. package/packages/clipboard/package.json +1 -1
  16. package/packages/clipboard-plugin/package.json +1 -1
  17. package/packages/code-generation/package.json +1 -1
  18. package/packages/code-review/package.json +1 -1
  19. package/packages/codex-adapter/package.json +1 -1
  20. package/packages/config-capture/package.json +1 -1
  21. package/packages/context-compiler/package.json +1 -1
  22. package/packages/context-discovery/package.json +1 -1
  23. package/packages/context-manager/package.json +1 -1
  24. package/packages/cookie-sanitizer/package.json +1 -1
  25. package/packages/cost-optimizer/package.json +1 -1
  26. package/packages/dependency-analyzer/package.json +1 -1
  27. package/packages/django-plugin/package.json +1 -1
  28. package/packages/doc-generator/package.json +1 -1
  29. package/packages/evaluation-engine/package.json +1 -1
  30. package/packages/evaluation-runner/package.json +1 -1
  31. package/packages/event-bus/package.json +1 -1
  32. package/packages/event-store/package.json +1 -1
  33. package/packages/experience-replay/package.json +1 -1
  34. package/packages/feedback-collector/package.json +1 -1
  35. package/packages/file-copy-helper/package.json +1 -1
  36. package/packages/framework-detector/package.json +1 -1
  37. package/packages/framework-plugin-sdk/package.json +1 -1
  38. package/packages/frappe-plugin/package.json +1 -1
  39. package/packages/generic-web-plugin/package.json +1 -1
  40. package/packages/health-monitor/package.json +1 -1
  41. package/packages/intent-analyzer/package.json +1 -1
  42. package/packages/jev-judge/package.json +1 -1
  43. package/packages/knowledge-graph/package.json +1 -1
  44. package/packages/knowledge-retrieval/package.json +1 -1
  45. package/packages/laravel-plugin/package.json +1 -1
  46. package/packages/learning-engine/package.json +1 -1
  47. package/packages/mcp-adapter/package.json +1 -1
  48. package/packages/memory-engine/package.json +1 -1
  49. package/packages/milestone-manager/package.json +1 -1
  50. package/packages/model-registry/package.json +1 -1
  51. package/packages/nextjs-plugin/package.json +1 -1
  52. package/packages/notification/package.json +1 -1
  53. package/packages/observability/package.json +1 -1
  54. package/packages/okf-indexer/package.json +1 -1
  55. package/packages/performance-optimizer/package.json +1 -1
  56. package/packages/privilege-broker/package.json +1 -1
  57. package/packages/project-analyzer/package.json +1 -1
  58. package/packages/project-bootstrap/package.json +1 -1
  59. package/packages/projection-engine/package.json +1 -1
  60. package/packages/prompt-compiler/package.json +1 -1
  61. package/packages/prompt-versioning/package.json +1 -1
  62. package/packages/provider-adapter-sdk/package.json +1 -1
  63. package/packages/provider-router/package.json +1 -1
  64. package/packages/provider-selector/package.json +1 -1
  65. package/packages/providers/package.json +1 -1
  66. package/packages/qdrant-skills/dist/client.d.ts +51 -0
  67. package/packages/qdrant-skills/dist/client.d.ts.map +1 -0
  68. package/packages/qdrant-skills/dist/client.js +105 -0
  69. package/packages/qdrant-skills/dist/client.js.map +1 -0
  70. package/packages/qdrant-skills/dist/embedder.d.ts +39 -0
  71. package/packages/qdrant-skills/dist/embedder.d.ts.map +1 -0
  72. package/packages/qdrant-skills/dist/embedder.js +101 -0
  73. package/packages/qdrant-skills/dist/embedder.js.map +1 -0
  74. package/packages/qdrant-skills/dist/index.d.ts +25 -0
  75. package/packages/qdrant-skills/dist/index.d.ts.map +1 -0
  76. package/packages/qdrant-skills/dist/index.js +25 -0
  77. package/packages/qdrant-skills/dist/index.js.map +1 -0
  78. package/packages/qdrant-skills/package.json +27 -0
  79. package/packages/qdrant-skills/src/client.ts +178 -0
  80. package/packages/qdrant-skills/src/embedder.ts +137 -0
  81. package/packages/qdrant-skills/src/index.ts +42 -0
  82. package/packages/quota-manager/package.json +1 -1
  83. package/packages/rate-limiter/package.json +1 -1
  84. package/packages/react-vite-plugin/package.json +1 -1
  85. package/packages/release-manager/package.json +1 -1
  86. package/packages/requirement-compiler/package.json +1 -1
  87. package/packages/runtime/package.json +1 -1
  88. package/packages/scheduler/package.json +1 -1
  89. package/packages/scheduler-adapter/package.json +1 -1
  90. package/packages/session/package.json +1 -1
  91. package/packages/session-api/package.json +1 -1
  92. package/packages/session-export/package.json +1 -1
  93. package/packages/shared-context/package.json +1 -1
  94. package/packages/skill-mcp-client/package.json +1 -1
  95. package/packages/skill-registry/package.json +1 -1
  96. package/packages/skills/dist/index.d.ts +40 -0
  97. package/packages/skills/dist/index.d.ts.map +1 -0
  98. package/packages/skills/dist/index.js +82 -0
  99. package/packages/skills/dist/index.js.map +1 -0
  100. package/packages/skills/dist/linter.d.ts +38 -0
  101. package/packages/skills/dist/linter.d.ts.map +1 -0
  102. package/packages/skills/dist/linter.js +323 -0
  103. package/packages/skills/dist/linter.js.map +1 -0
  104. package/packages/skills/dist/loader.d.ts +74 -0
  105. package/packages/skills/dist/loader.d.ts.map +1 -0
  106. package/packages/skills/dist/loader.js +280 -0
  107. package/packages/skills/dist/loader.js.map +1 -0
  108. package/packages/skills/dist/parser.d.ts +32 -0
  109. package/packages/skills/dist/parser.d.ts.map +1 -0
  110. package/packages/skills/dist/parser.js +459 -0
  111. package/packages/skills/dist/parser.js.map +1 -0
  112. package/packages/skills/dist/scanner.d.ts +33 -0
  113. package/packages/skills/dist/scanner.d.ts.map +1 -0
  114. package/packages/skills/dist/scanner.js +257 -0
  115. package/packages/skills/dist/scanner.js.map +1 -0
  116. package/packages/skills/dist/skill-commands.d.ts +33 -0
  117. package/packages/skills/dist/skill-commands.d.ts.map +1 -0
  118. package/packages/skills/dist/skill-commands.js +239 -0
  119. package/packages/skills/dist/skill-commands.js.map +1 -0
  120. package/packages/skills/dist/skill-tool.d.ts +120 -0
  121. package/packages/skills/dist/skill-tool.d.ts.map +1 -0
  122. package/packages/skills/dist/skill-tool.js +239 -0
  123. package/packages/skills/dist/skill-tool.js.map +1 -0
  124. package/packages/skills/dist/skill-versioning.d.ts +123 -0
  125. package/packages/skills/dist/skill-versioning.d.ts.map +1 -0
  126. package/packages/skills/dist/skill-versioning.js +240 -0
  127. package/packages/skills/dist/skill-versioning.js.map +1 -0
  128. package/packages/skills/dist/types.d.ts +226 -0
  129. package/packages/skills/dist/types.d.ts.map +1 -0
  130. package/packages/skills/dist/types.js +21 -0
  131. package/packages/skills/dist/types.js.map +1 -0
  132. package/packages/skills/package.json +46 -0
  133. package/packages/skills/src/index.ts +93 -0
  134. package/packages/skills/src/linter.ts +371 -0
  135. package/packages/skills/src/loader.ts +335 -0
  136. package/packages/skills/src/parser.ts +548 -0
  137. package/packages/skills/src/scanner.ts +322 -0
  138. package/packages/skills/src/skill-commands.ts +318 -0
  139. package/packages/skills/src/skill-tool.ts +324 -0
  140. package/packages/skills/src/skill-versioning.ts +345 -0
  141. package/packages/skills/src/types.ts +259 -0
  142. package/packages/sprint-planner/package.json +1 -1
  143. package/packages/subscription-engine/package.json +1 -1
  144. package/packages/task-compiler/package.json +1 -1
  145. package/packages/tencentdb-memory/package.json +1 -1
  146. package/packages/tencentdb-sync/package.json +1 -1
  147. package/packages/test-data-generator/package.json +1 -1
  148. package/packages/test-generator/package.json +1 -1
  149. package/packages/todo-bd-sync/package.json +1 -1
  150. package/packages/token-estimation/package.json +1 -1
  151. package/packages/token-optimizer/package.json +1 -1
  152. package/packages/trajectory/dist/src/curator.d.ts +189 -0
  153. package/packages/trajectory/dist/src/curator.d.ts.map +1 -0
  154. package/packages/trajectory/dist/src/curator.js +340 -0
  155. package/packages/trajectory/dist/src/curator.js.map +1 -0
  156. package/packages/trajectory/dist/src/journey-renderer.d.ts +53 -0
  157. package/packages/trajectory/dist/src/journey-renderer.d.ts.map +1 -0
  158. package/packages/trajectory/dist/src/journey-renderer.js +324 -0
  159. package/packages/trajectory/dist/src/journey-renderer.js.map +1 -0
  160. package/packages/trajectory/dist/src/learning-graph.d.ts +159 -0
  161. package/packages/trajectory/dist/src/learning-graph.d.ts.map +1 -0
  162. package/packages/trajectory/dist/src/learning-graph.js +258 -0
  163. package/packages/trajectory/dist/src/learning-graph.js.map +1 -0
  164. package/packages/trajectory/dist/src/memory-store.d.ts +146 -0
  165. package/packages/trajectory/dist/src/memory-store.d.ts.map +1 -0
  166. package/packages/trajectory/dist/src/memory-store.js +472 -0
  167. package/packages/trajectory/dist/src/memory-store.js.map +1 -0
  168. package/packages/trajectory/dist/src/review-fork.d.ts +164 -0
  169. package/packages/trajectory/dist/src/review-fork.d.ts.map +1 -0
  170. package/packages/trajectory/dist/src/review-fork.js +332 -0
  171. package/packages/trajectory/dist/src/review-fork.js.map +1 -0
  172. package/packages/trajectory/dist/src/write-approval.d.ts +136 -0
  173. package/packages/trajectory/dist/src/write-approval.d.ts.map +1 -0
  174. package/packages/trajectory/dist/src/write-approval.js +281 -0
  175. package/packages/trajectory/dist/src/write-approval.js.map +1 -0
  176. package/packages/trajectory/package.json +1 -1
  177. package/packages/trajectory/src/curator.ts +485 -0
  178. package/packages/trajectory/src/journey-renderer.ts +399 -0
  179. package/packages/trajectory/src/learning-graph.ts +363 -0
  180. package/packages/trajectory/src/memory-store.ts +578 -0
  181. package/packages/trajectory/src/review-fork.ts +450 -0
  182. package/packages/trajectory/src/write-approval.ts +372 -0
  183. package/packages/tui/package.json +1 -1
  184. package/packages/types/package.json +1 -1
  185. package/packages/workflow-events/package.json +1 -1
  186. package/packages/workspace-scanner/package.json +1 -1
  187. package/packages/worktree/package.json +1 -1
  188. package/packages/write-review/dist/blackboard.d.ts +98 -0
  189. package/packages/write-review/dist/blackboard.d.ts.map +1 -0
  190. package/packages/write-review/dist/blackboard.js +289 -0
  191. package/packages/write-review/dist/blackboard.js.map +1 -0
  192. package/packages/write-review/dist/event-bus.d.ts +106 -0
  193. package/packages/write-review/dist/event-bus.d.ts.map +1 -0
  194. package/packages/write-review/dist/event-bus.js +294 -0
  195. package/packages/write-review/dist/event-bus.js.map +1 -0
  196. package/packages/write-review/dist/gate.d.ts +37 -0
  197. package/packages/write-review/dist/gate.d.ts.map +1 -0
  198. package/packages/write-review/dist/gate.js +138 -0
  199. package/packages/write-review/dist/gate.js.map +1 -0
  200. package/packages/write-review/dist/index.d.ts +22 -0
  201. package/packages/write-review/dist/index.d.ts.map +1 -0
  202. package/packages/write-review/dist/index.js +60 -0
  203. package/packages/write-review/dist/index.js.map +1 -0
  204. package/packages/write-review/dist/injection.d.ts +40 -0
  205. package/packages/write-review/dist/injection.d.ts.map +1 -0
  206. package/packages/write-review/dist/injection.js +179 -0
  207. package/packages/write-review/dist/injection.js.map +1 -0
  208. package/packages/write-review/dist/review.d.ts +54 -0
  209. package/packages/write-review/dist/review.d.ts.map +1 -0
  210. package/packages/write-review/dist/review.js +154 -0
  211. package/packages/write-review/dist/review.js.map +1 -0
  212. package/packages/write-review/dist/trigger.d.ts +39 -0
  213. package/packages/write-review/dist/trigger.d.ts.map +1 -0
  214. package/packages/write-review/dist/trigger.js +107 -0
  215. package/packages/write-review/dist/trigger.js.map +1 -0
  216. package/packages/write-review/dist/types.d.ts +78 -0
  217. package/packages/write-review/dist/types.d.ts.map +1 -0
  218. package/packages/write-review/dist/types.js +26 -0
  219. package/packages/write-review/dist/types.js.map +1 -0
  220. package/packages/write-review/package.json +1 -1
  221. package/packages/write-review/src/event-bus.ts +351 -0
  222. package/packages/write-review/src/index.ts +1 -0
  223. package/packages/write-review/src/injection.ts +25 -3
  224. package/proactive-compact.ts +51 -7
  225. package/scripts/sync-skills.ts +275 -0
  226. package/scripts/sync-to-qdrant.ts +398 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/event-bus",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/event-store",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/experience-replay",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Experience replay for debugging and reproducibility (RFC-0059)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/feedback-collector",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "type": "module",
5
5
  "description": "Collect and aggregate human/automated feedback (RFC-0021)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/file-copy-helper",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Injects cp/sudo cp rule when user asks to mimic/copy files",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/framework-detector",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Framework detection system for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/framework-plugin-sdk",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Framework plugin SDK for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/frappe-plugin",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Frappe/ERPNext framework analysis — DocTypes, hooks, bench sites, site config",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/generic-web-plugin",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Generic web framework analysis — REST/GraphQL endpoints, OpenAPI, auth",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/health-monitor",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "type": "module",
5
5
  "description": "Health monitoring and auto-healing",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/intent-analyzer",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/jev-judge",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Jev Judge - Structured decision model for agent routing, E2E testing, and automated decisions",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/knowledge-graph",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Knowledge Graph extraction and provenance linking for SKILL.md files",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/knowledge-retrieval",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Knowledge retrieval via TencentDB-Agent-Memory MCP (RFC-0105)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/laravel-plugin",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Laravel framework analysis — artisan commands, Eloquent models, Blade",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/learning-engine",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Learning engine for extracting lessons from runtime execution (RFC-0058)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/mcp-adapter",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "type": "module",
5
5
  "description": "MCP server adapter for pi-harness — exposes harness capabilities as MCP tools/resources/prompts (RFC-0068)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/memory-engine",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Memory engine with OKF integration for durable knowledge management (RFC-0060)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/milestone-manager",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Track milestones and alerts when items are at risk",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/model-registry",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Model Registry for pi-harness-runtime — centralized model metadata with pricing",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/nextjs-plugin",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Next.js framework detection and analysis for pi-harness-runtime (RFC-0062)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/notification",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "pi-harness-runtime — notification",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/observability",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Comprehensive observability system with structured logging, tracing, metrics, and alerting",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/okf-indexer",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "OKF document indexer for SKILL.md files (RFC-0106)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/performance-optimizer",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Performance optimization analyzer for pi-harness runtime (RFC-0056)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/privilege-broker",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Privilege Broker — capability registry and command executor for autonomous runtime (RFC-0101 §7)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/project-analyzer",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Project analysis system for pi-harness-runtime - detects frameworks, rules, and project structure",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/project-bootstrap",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Project scaffolding from typed ProjectSpec",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/projection-engine",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/prompt-compiler",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Deterministic prompt compiler for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/prompt-versioning",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "type": "module",
5
5
  "description": "Version control for prompts with rollback support (RFC-0019)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/provider-adapter-sdk",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "SDK for building, testing, and registering AI provider adapters",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/provider-router",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Enhanced Provider Router for pi-harness-runtime — intelligent routing with capabilities, costs, and quotas",
5
5
  "type": "module",
6
6
  "main": "./dist/provider-router.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/provider-selector",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "Multi-Provider Selector — route requests by cost, quality, and latency (RFC-0012)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/providers",
3
- "version": "1.1.94",
3
+ "version": "1.1.96",
4
4
  "description": "pi-harness-runtime — providers",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Qdrant Client - Official @qdrant/js-client-rest wrapper
3
+ */
4
+ import { QdrantClient } from "@qdrant/js-client-rest";
5
+ export interface QdrantConfig {
6
+ /** Qdrant cluster URL (e.g., https://xxx.qdrant.tech) */
7
+ url: string;
8
+ /** API key for authentication */
9
+ apiKey: string;
10
+ /** Collection name (default: 'pi-harness-skills') */
11
+ collection?: string;
12
+ }
13
+ export interface SkillPoint {
14
+ id: number;
15
+ name: string;
16
+ description: string;
17
+ body: string;
18
+ /** Full text to embed */
19
+ text: string;
20
+ }
21
+ export interface SearchResult {
22
+ id: number;
23
+ name: string;
24
+ description: string;
25
+ score: number;
26
+ }
27
+ /**
28
+ * Create a Qdrant client
29
+ */
30
+ export declare function createQdrantClient(config: QdrantConfig): QdrantClient;
31
+ /**
32
+ * Create a collection with dense vectors
33
+ */
34
+ export declare function createCollection(client: QdrantClient, name: string, dimensions?: number): Promise<void>;
35
+ /**
36
+ * Delete a collection
37
+ */
38
+ export declare function deleteCollection(client: QdrantClient, name: string): Promise<void>;
39
+ /**
40
+ * Upsert skill points with cloud inference
41
+ */
42
+ export declare function upsertSkills(client: QdrantClient, collectionName: string, skills: SkillPoint[], model?: string): Promise<void>;
43
+ /**
44
+ * Search skills with semantic query
45
+ */
46
+ export declare function searchSkills(client: QdrantClient, collectionName: string, query: string, model?: string, limit?: number): Promise<SearchResult[]>;
47
+ /**
48
+ * Get all skills from collection
49
+ */
50
+ export declare function getAllSkills(client: QdrantClient, collectionName: string): Promise<SearchResult[]>;
51
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAaD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAGrE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,MAAY,GACvB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,UAAU,EAAE,EACpB,KAAK,GAAE,MAAiD,GACvD,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAiD,EACxD,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CA0BzB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC,CAyBzB"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Qdrant Client - Official @qdrant/js-client-rest wrapper
3
+ */
4
+ import { QdrantClient } from "@qdrant/js-client-rest";
5
+ /**
6
+ * Parse host:port from URL
7
+ */
8
+ function parseHostPort(url) {
9
+ const match = url.match(/https?:\/\/([^:]+)(?::(\d+))?/);
10
+ return {
11
+ host: match?.[1] || url,
12
+ port: parseInt(match?.[2] || "6333"),
13
+ };
14
+ }
15
+ /**
16
+ * Create a Qdrant client
17
+ */
18
+ export function createQdrantClient(config) {
19
+ const { host, port } = parseHostPort(config.url);
20
+ return new QdrantClient({ host, port, apiKey: config.apiKey });
21
+ }
22
+ /**
23
+ * Create a collection with dense vectors
24
+ */
25
+ export async function createCollection(client, name, dimensions = 384 // all-MiniLM-L6-v2
26
+ ) {
27
+ try {
28
+ await client.createCollection(name, {
29
+ vectors: { size: dimensions, distance: "Cosine" },
30
+ });
31
+ }
32
+ catch (err) {
33
+ // Ignore "already exists" errors
34
+ if (err instanceof Error && !err.message.includes("already exists")) {
35
+ throw err;
36
+ }
37
+ }
38
+ }
39
+ /**
40
+ * Delete a collection
41
+ */
42
+ export async function deleteCollection(client, name) {
43
+ try {
44
+ await client.deleteCollection(name);
45
+ }
46
+ catch {
47
+ // Ignore if not exists
48
+ }
49
+ }
50
+ /**
51
+ * Upsert skill points with cloud inference
52
+ */
53
+ export async function upsertSkills(client, collectionName, skills, model = "sentence-transformers/all-MiniLM-L6-v2") {
54
+ const points = skills.map((skill, idx) => ({
55
+ id: skill.id || idx + 1,
56
+ payload: {
57
+ name: skill.name,
58
+ description: skill.description,
59
+ body: skill.body.slice(0, 2000),
60
+ },
61
+ vector: {
62
+ text: skill.text,
63
+ model,
64
+ },
65
+ }));
66
+ await client.upsert(collectionName, { wait: true, points });
67
+ }
68
+ /**
69
+ * Search skills with semantic query
70
+ */
71
+ export async function searchSkills(client, collectionName, query, model = "sentence-transformers/all-MiniLM-L6-v2", limit = 5) {
72
+ const results = await client.query(collectionName, {
73
+ query: { text: query, model },
74
+ limit,
75
+ with_payload: true,
76
+ });
77
+ // Parse response: { result: { points: [...] } }
78
+ const typedResults = results;
79
+ const points = typedResults?.result?.points || [];
80
+ return points.map((point) => ({
81
+ id: point.id,
82
+ name: point.payload?.name || `skill-${point.id}`,
83
+ description: point.payload?.description || "",
84
+ score: point.score,
85
+ }));
86
+ }
87
+ /**
88
+ * Get all skills from collection
89
+ */
90
+ export async function getAllSkills(client, collectionName) {
91
+ const results = await client.query(collectionName, {
92
+ filter: {}, // Empty filter = all
93
+ limit: 100,
94
+ with_payload: true,
95
+ });
96
+ const typedResults = results;
97
+ const points = typedResults?.result?.points || [];
98
+ return points.map((point) => ({
99
+ id: point.id,
100
+ name: point.payload?.name || `skill-${point.id}`,
101
+ description: point.payload?.description || "",
102
+ score: point.score || 0,
103
+ }));
104
+ }
105
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Skill Embedder
3
+ *
4
+ * Creates embeddings for skill content using OpenAI.
5
+ * Used to store skills in Qdrant for semantic search.
6
+ */
7
+ import type { SkillPoint } from "./client.js";
8
+ /**
9
+ * Embedding result
10
+ */
11
+ export interface EmbeddingResult {
12
+ embedding: number[];
13
+ tokens: number;
14
+ }
15
+ /**
16
+ * Get OpenAI API key for embeddings
17
+ */
18
+ export declare function getOpenAIApiKey(): string | null;
19
+ /**
20
+ * Create embedding for text using OpenAI
21
+ */
22
+ export declare function createEmbedding(text: string, apiKey?: string): Promise<EmbeddingResult>;
23
+ /**
24
+ * Create embedding for a skill document
25
+ */
26
+ export declare function embedSkillDocument(skill: SkillPoint, apiKey?: string): Promise<{
27
+ id: number;
28
+ embedding: number[];
29
+ payload: SkillPoint;
30
+ }>;
31
+ /**
32
+ * Batch embed multiple skills
33
+ */
34
+ export declare function embedSkillsBatch(skills: SkillPoint[], apiKey?: string, onProgress?: (index: number, total: number) => void): Promise<Array<{
35
+ id: number;
36
+ embedding: number[];
37
+ payload: SkillPoint;
38
+ }>>;
39
+ //# sourceMappingURL=embedder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAyB/C;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,CAAC,CAgC1B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC,CAWnE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,UAAU,EAAE,EACpB,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAClD,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC,CAuB1E"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Skill Embedder
3
+ *
4
+ * Creates embeddings for skill content using OpenAI.
5
+ * Used to store skills in Qdrant for semantic search.
6
+ */
7
+ /**
8
+ * Get OpenAI API key for embeddings
9
+ */
10
+ export function getOpenAIApiKey() {
11
+ // Check env vars (same as Jev)
12
+ if (process.env.OPENAI_API_KEY) {
13
+ return process.env.OPENAI_API_KEY;
14
+ }
15
+ if (process.env.TYPESAFE_API_KEY) {
16
+ return process.env.TYPESAFE_API_KEY;
17
+ }
18
+ if (process.env.OPENROUTER_API_KEY) {
19
+ return process.env.OPENROUTER_API_KEY;
20
+ }
21
+ // Check keys file
22
+ try {
23
+ const { existsSync, readFileSync } = require("node:fs");
24
+ const homedir = process.env.HOME || process.env.USERPROFILE || "/home/frappe";
25
+ const keyPath = `${homedir}/.pi-harness-runtime/keys/openai-api-key.txt`;
26
+ if (existsSync(keyPath)) {
27
+ return readFileSync(keyPath, "utf-8").trim();
28
+ }
29
+ }
30
+ catch {
31
+ // ignore
32
+ }
33
+ return null;
34
+ }
35
+ /**
36
+ * Create embedding for text using OpenAI
37
+ */
38
+ export async function createEmbedding(text, apiKey) {
39
+ const key = apiKey || getOpenAIApiKey();
40
+ if (!key) {
41
+ throw new Error("No OpenAI API key available for embeddings");
42
+ }
43
+ const response = await fetch("https://api.openai.com/v1/embeddings", {
44
+ method: "POST",
45
+ headers: {
46
+ "Content-Type": "application/json",
47
+ "Authorization": `Bearer ${key}`,
48
+ },
49
+ body: JSON.stringify({
50
+ model: "text-embedding-3-small",
51
+ input: text.slice(0, 8000), // Limit to avoid token limits
52
+ }),
53
+ });
54
+ if (!response.ok) {
55
+ const error = await response.text();
56
+ throw new Error(`OpenAI embedding failed: ${error}`);
57
+ }
58
+ const data = await response.json();
59
+ return {
60
+ embedding: data.data[0]?.embedding || [],
61
+ tokens: data.usage?.total_tokens || 0,
62
+ };
63
+ }
64
+ /**
65
+ * Create embedding for a skill document
66
+ */
67
+ export async function embedSkillDocument(skill, apiKey) {
68
+ // Combine name and description for embedding
69
+ const textToEmbed = [skill.name, skill.description].join(". ");
70
+ const { embedding } = await createEmbedding(textToEmbed, apiKey);
71
+ return {
72
+ id: skill.id,
73
+ embedding,
74
+ payload: skill,
75
+ };
76
+ }
77
+ /**
78
+ * Batch embed multiple skills
79
+ */
80
+ export async function embedSkillsBatch(skills, apiKey, onProgress) {
81
+ const results = [];
82
+ for (let i = 0; i < skills.length; i++) {
83
+ const skill = skills[i];
84
+ try {
85
+ const result = await embedSkillDocument(skill, apiKey);
86
+ results.push(result);
87
+ }
88
+ catch (err) {
89
+ console.error(`[QdrantSkills] Failed to embed skill ${skill.name}:`, err);
90
+ }
91
+ if (onProgress) {
92
+ onProgress(i + 1, skills.length);
93
+ }
94
+ // Small delay to avoid rate limiting
95
+ if (i < skills.length - 1) {
96
+ await new Promise(resolve => setTimeout(resolve, 100));
97
+ }
98
+ }
99
+ return results;
100
+ }
101
+ //# sourceMappingURL=embedder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder.js","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,+BAA+B;IAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACpC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACxC,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,cAAc,CAAC;QAC9E,MAAM,OAAO,GAAG,GAAG,OAAO,8CAA8C,CAAC;QACzE,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,MAAe;IAEf,MAAM,GAAG,GAAG,MAAM,IAAI,eAAe,EAAE,CAAC;IACxC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,sCAAsC,EAAE;QACnE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,eAAe,EAAE,UAAU,GAAG,EAAE;SACjC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,wBAAwB;YAC/B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,8BAA8B;SAC3D,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAG/B,CAAC;IAEF,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,EAAE;QACxC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC;KACtC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAiB,EACjB,MAAe;IAEf,6CAA6C;IAC7C,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEjE,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,SAAS;QACT,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAoB,EACpB,MAAe,EACf,UAAmD;IAEnD,MAAM,OAAO,GAAoE,EAAE,CAAC;IAEpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,KAAK,CAAC,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAED,qCAAqC;QACrC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}