pi-harness-runtime 0.10.11 → 0.10.12

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 (584) hide show
  1. package/cli.ts +111 -0
  2. package/footer-status.ts +204 -0
  3. package/harness/agent-handoff.ts +189 -0
  4. package/harness/auto-compact.ts +309 -0
  5. package/harness/auto-quota-resume.ts +132 -0
  6. package/harness/autonomous-review.ts +88 -0
  7. package/harness/blackboard.ts +291 -0
  8. package/harness/context-compact-orchestrator.ts +551 -0
  9. package/harness/context-window-manager.ts +464 -0
  10. package/harness/continue-prompt.ts +242 -0
  11. package/harness/e2e/index.ts +44 -0
  12. package/harness/e2e/minimax-quota-parser.ts +88 -0
  13. package/harness/e2e/minimax-quota-scraper.ts +609 -0
  14. package/harness/e2e/openai-quota-scraper.ts +447 -0
  15. package/harness/e2e/playwright-runner.ts +204 -0
  16. package/harness/e2e/quota-status.ts +194 -0
  17. package/harness/e2e/test-engine.ts +398 -0
  18. package/harness/forked-summarizer.ts +304 -0
  19. package/harness/herdr-agents.ts +91 -0
  20. package/harness/index.ts +232 -0
  21. package/harness/job-state-machine.ts +363 -0
  22. package/harness/loop-code-agent.ts +284 -0
  23. package/harness/loop-controller.ts +201 -0
  24. package/harness/loop-review-agent.ts +295 -0
  25. package/harness/loop-runtime.ts +760 -0
  26. package/harness/loop-types.ts +118 -0
  27. package/harness/master-planner.ts +327 -0
  28. package/harness/notification-events.ts +299 -0
  29. package/harness/output-limit-handler.ts +316 -0
  30. package/harness/partial-recovery.ts +531 -0
  31. package/harness/project-detector/detector.ts +328 -0
  32. package/harness/repair-engine.ts +340 -0
  33. package/harness/session-memory.ts +401 -0
  34. package/harness/task-graph.d.ts +51 -0
  35. package/harness/task-graph.ts +143 -0
  36. package/mirror.ts +278 -0
  37. package/package.json +8 -12
  38. package/packages/a2a-adapter/src/agent.ts +139 -0
  39. package/packages/a2a-adapter/src/client.ts +107 -0
  40. package/packages/a2a-adapter/src/discovery.ts +106 -0
  41. package/packages/a2a-adapter/src/index.ts +38 -0
  42. package/packages/a2a-adapter/src/protocol.ts +46 -0
  43. package/packages/a2a-adapter/src/transport.ts +142 -0
  44. package/packages/a2a-adapter/src/types.ts +117 -0
  45. package/packages/auth/src/minimax-browser-auth.ts +1109 -0
  46. package/packages/auth/src/run-minimax-auth.ts +150 -0
  47. package/packages/autonomous-refactor/src/detector.ts +219 -0
  48. package/packages/autonomous-refactor/src/index.ts +16 -0
  49. package/packages/autonomous-refactor/src/planner.ts +99 -0
  50. package/packages/autonomous-refactor/src/types.ts +57 -0
  51. package/packages/autonomous-runtime/src/inbox.ts +266 -0
  52. package/packages/autonomous-runtime/src/index.ts +22 -0
  53. package/packages/autonomous-runtime/src/lease.ts +318 -0
  54. package/packages/autonomous-runtime/src/types.ts +257 -0
  55. package/packages/cache-strategy/src/cache.ts +213 -0
  56. package/packages/cache-strategy/src/index.ts +6 -0
  57. package/packages/cache-strategy/src/types.ts +40 -0
  58. package/packages/capability-registry/src/defaults.ts +247 -0
  59. package/packages/capability-registry/src/index.ts +43 -0
  60. package/packages/capability-registry/src/query.ts +99 -0
  61. package/packages/capability-registry/src/registry.ts +222 -0
  62. package/packages/capability-registry/src/types.d.ts +47 -0
  63. package/packages/capability-registry/src/types.js +10 -0
  64. package/packages/capability-registry/src/types.ts +83 -0
  65. package/packages/checkpoint/src/checkpoint-manager.ts +33 -0
  66. package/packages/checkpoint/src/differ.ts +281 -0
  67. package/packages/checkpoint/src/engine.ts +532 -0
  68. package/packages/checkpoint/src/index.ts +48 -0
  69. package/packages/checkpoint/src/storage.ts +439 -0
  70. package/packages/checkpoint/src/types.ts +348 -0
  71. package/packages/cli-plugin-sdk/src/index.ts +169 -0
  72. package/packages/cli-plugin-sdk/src/plugin-fs.ts +91 -0
  73. package/packages/cli-plugin-sdk/src/registry.ts +55 -0
  74. package/packages/cli-plugin-sdk/src/types.ts +32 -0
  75. package/packages/clipboard/dist/src/clipboard.d.ts +11 -0
  76. package/packages/clipboard/dist/src/clipboard.js +51 -0
  77. package/packages/clipboard/dist/src/copy-sync.d.ts +27 -0
  78. package/packages/clipboard/dist/src/copy-sync.js +170 -0
  79. package/packages/clipboard/dist/src/gist-relay.d.ts +48 -0
  80. package/packages/clipboard/dist/src/gist-relay.js +186 -0
  81. package/packages/clipboard/dist/src/github-login.d.ts +16 -0
  82. package/packages/clipboard/dist/src/github-login.js +69 -0
  83. package/packages/clipboard/dist/src/index.d.ts +4 -0
  84. package/packages/clipboard/dist/src/index.js +3 -0
  85. package/packages/clipboard/dist/src/types.d.ts +13 -0
  86. package/packages/clipboard/dist/src/types.js +5 -0
  87. package/packages/clipboard/src/clipboard.ts +59 -0
  88. package/packages/clipboard/src/copy-sync.ts +201 -0
  89. package/packages/clipboard/src/gist-relay.ts +240 -0
  90. package/packages/clipboard/src/github-login.ts +107 -0
  91. package/packages/clipboard/src/index.ts +3 -0
  92. package/packages/clipboard/src/types.ts +14 -0
  93. package/packages/code-generation/src/faker.ts +461 -0
  94. package/packages/code-generation/src/generator.ts +421 -0
  95. package/packages/code-generation/src/index.ts +56 -0
  96. package/packages/code-generation/src/templates/ejs-renderer.ts +142 -0
  97. package/packages/code-generation/src/templates/registry.ts +174 -0
  98. package/packages/code-generation/src/types.ts +373 -0
  99. package/packages/code-review/src/engine.ts +408 -0
  100. package/packages/code-review/src/index.ts +46 -0
  101. package/packages/code-review/src/reports/html.ts +143 -0
  102. package/packages/code-review/src/reports/markdown.ts +197 -0
  103. package/packages/code-review/src/reports/text.ts +171 -0
  104. package/packages/code-review/src/types.ts +324 -0
  105. package/packages/codex-adapter/src/executor.ts +83 -0
  106. package/packages/codex-adapter/src/index.ts +16 -0
  107. package/packages/codex-adapter/src/provider.ts +213 -0
  108. package/packages/codex-adapter/src/types.ts +118 -0
  109. package/packages/config-capture/src/index.ts +357 -0
  110. package/packages/context-compiler/src/budget.ts +122 -0
  111. package/packages/context-compiler/src/cache.ts +134 -0
  112. package/packages/context-compiler/src/compiler.ts +314 -0
  113. package/packages/context-compiler/src/deduplicate.ts +171 -0
  114. package/packages/context-compiler/src/filter.ts +135 -0
  115. package/packages/context-compiler/src/index.ts +61 -0
  116. package/packages/context-compiler/src/okf-loader.ts +86 -0
  117. package/packages/context-compiler/src/score.ts +130 -0
  118. package/packages/context-compiler/src/types.ts +246 -0
  119. package/packages/context-discovery/dist/src/discover.d.ts +3 -0
  120. package/packages/context-discovery/dist/src/discover.js +42 -0
  121. package/packages/context-discovery/dist/src/discovery.d.ts +28 -0
  122. package/packages/context-discovery/dist/src/discovery.js +21 -0
  123. package/packages/context-discovery/dist/src/index.d.ts +3 -0
  124. package/packages/context-discovery/dist/src/index.js +2 -0
  125. package/packages/context-discovery/dist/src/types.d.ts +16 -0
  126. package/packages/context-discovery/dist/src/types.js +2 -0
  127. package/packages/context-discovery/src/discover.ts +42 -0
  128. package/packages/context-discovery/src/discovery.ts +44 -0
  129. package/packages/context-discovery/src/index.ts +2 -0
  130. package/packages/context-discovery/src/types.ts +15 -0
  131. package/packages/context-manager/src/compaction.ts +139 -0
  132. package/packages/context-manager/src/core.ts +85 -0
  133. package/packages/context-manager/src/index.ts +22 -0
  134. package/packages/context-manager/src/types.ts +44 -0
  135. package/packages/cookie-sanitizer/src/atomic-write.ts +79 -0
  136. package/packages/cookie-sanitizer/src/detect-format.ts +102 -0
  137. package/packages/cookie-sanitizer/src/index.ts +89 -0
  138. package/packages/cookie-sanitizer/src/infer-provider.ts +103 -0
  139. package/packages/cookie-sanitizer/src/normalize.ts +92 -0
  140. package/packages/cookie-sanitizer/src/parse-json.ts +122 -0
  141. package/packages/cookie-sanitizer/src/parse-netscape.ts +118 -0
  142. package/packages/cookie-sanitizer/src/sync.ts +312 -0
  143. package/packages/cookie-sanitizer/src/types.ts +101 -0
  144. package/packages/cookie-sanitizer/src/watcher.ts +180 -0
  145. package/packages/cost-optimizer/src/budget.ts +138 -0
  146. package/packages/cost-optimizer/src/config.ts +34 -0
  147. package/packages/cost-optimizer/src/forecast.ts +59 -0
  148. package/packages/cost-optimizer/src/index.ts +74 -0
  149. package/packages/cost-optimizer/src/optimizer.ts +277 -0
  150. package/packages/cost-optimizer/src/selection.ts +264 -0
  151. package/packages/cost-optimizer/src/tracker.ts +122 -0
  152. package/packages/cost-optimizer/src/types.ts +134 -0
  153. package/packages/dependency-analyzer/dist/src/analyzer.d.ts +17 -0
  154. package/packages/dependency-analyzer/dist/src/analyzer.js +119 -0
  155. package/packages/dependency-analyzer/dist/src/imports.d.ts +12 -0
  156. package/packages/dependency-analyzer/dist/src/imports.js +73 -0
  157. package/packages/dependency-analyzer/dist/src/index.d.ts +4 -0
  158. package/packages/dependency-analyzer/dist/src/index.js +3 -0
  159. package/packages/dependency-analyzer/dist/src/types.d.ts +28 -0
  160. package/packages/dependency-analyzer/dist/src/types.js +5 -0
  161. package/packages/dependency-analyzer/src/analyzer.ts +140 -0
  162. package/packages/dependency-analyzer/src/imports.ts +93 -0
  163. package/packages/dependency-analyzer/src/index.ts +9 -0
  164. package/packages/dependency-analyzer/src/types.ts +38 -0
  165. package/packages/django-plugin/src/analyzer.ts +284 -0
  166. package/packages/django-plugin/src/index.ts +39 -0
  167. package/packages/django-plugin/src/types.ts +35 -0
  168. package/packages/doc-generator/src/detector.ts +113 -0
  169. package/packages/doc-generator/src/docs.ts +158 -0
  170. package/packages/doc-generator/src/index.ts +7 -0
  171. package/packages/doc-generator/src/types.ts +58 -0
  172. package/packages/evaluation-engine/src/engine.ts +488 -0
  173. package/packages/evaluation-engine/src/index.ts +23 -0
  174. package/packages/evaluation-engine/src/types.ts +136 -0
  175. package/packages/evaluation-runner/src/index.ts +6 -0
  176. package/packages/evaluation-runner/src/runner.ts +182 -0
  177. package/packages/evaluation-runner/src/types.ts +51 -0
  178. package/packages/event-bus/dist/src/bus.d.ts +15 -0
  179. package/packages/event-bus/dist/src/bus.js +98 -0
  180. package/packages/event-bus/dist/src/herdr-bus.d.ts +121 -0
  181. package/packages/event-bus/dist/src/herdr-bus.js +322 -0
  182. package/packages/event-bus/dist/src/index.d.ts +6 -0
  183. package/packages/event-bus/dist/src/index.js +4 -0
  184. package/packages/event-bus/dist/src/types.d.ts +27 -0
  185. package/packages/event-bus/dist/src/types.js +10 -0
  186. package/packages/event-bus/src/bus.ts +111 -0
  187. package/packages/event-bus/src/herdr-bus.ts +525 -0
  188. package/packages/event-bus/src/index.ts +38 -0
  189. package/packages/event-bus/src/types.ts +59 -0
  190. package/packages/event-store/dist/src/index.d.ts +3 -0
  191. package/packages/event-store/dist/src/index.js +2 -0
  192. package/packages/event-store/dist/src/store.d.ts +15 -0
  193. package/packages/event-store/dist/src/store.js +139 -0
  194. package/packages/event-store/dist/src/types.d.ts +48 -0
  195. package/packages/event-store/dist/src/types.js +5 -0
  196. package/packages/event-store/src/index.ts +11 -0
  197. package/packages/event-store/src/store.ts +168 -0
  198. package/packages/event-store/src/types.d.ts +48 -0
  199. package/packages/event-store/src/types.js +5 -0
  200. package/packages/event-store/src/types.ts +65 -0
  201. package/packages/experience-replay/src/index.ts +19 -0
  202. package/packages/experience-replay/src/replay.ts +348 -0
  203. package/packages/experience-replay/src/types.ts +128 -0
  204. package/packages/feedback-collector/src/collector.ts +160 -0
  205. package/packages/feedback-collector/src/index.ts +6 -0
  206. package/packages/feedback-collector/src/types.ts +51 -0
  207. package/packages/framework-detector/src/detector.ts +586 -0
  208. package/packages/framework-detector/src/index.ts +46 -0
  209. package/packages/framework-detector/src/signatures/registry.ts +648 -0
  210. package/packages/framework-detector/src/types.ts +299 -0
  211. package/packages/framework-plugin-sdk/src/index.ts +45 -0
  212. package/packages/framework-plugin-sdk/src/manager.ts +525 -0
  213. package/packages/framework-plugin-sdk/src/types.ts +449 -0
  214. package/packages/frappe-plugin/src/analyzer.ts +454 -0
  215. package/packages/frappe-plugin/src/index.ts +72 -0
  216. package/packages/frappe-plugin/src/types.ts +135 -0
  217. package/packages/generic-web-plugin/src/analyzer.ts +347 -0
  218. package/packages/generic-web-plugin/src/index.ts +61 -0
  219. package/packages/generic-web-plugin/src/types.ts +41 -0
  220. package/packages/health-monitor/src/index.ts +16 -0
  221. package/packages/health-monitor/src/monitor.ts +216 -0
  222. package/packages/health-monitor/src/types.ts +45 -0
  223. package/packages/intent-analyzer/dist/src/analyzer.d.ts +13 -0
  224. package/packages/intent-analyzer/dist/src/analyzer.js +239 -0
  225. package/packages/intent-analyzer/dist/src/index.d.ts +3 -0
  226. package/packages/intent-analyzer/dist/src/index.js +2 -0
  227. package/packages/intent-analyzer/dist/src/types.d.ts +26 -0
  228. package/packages/intent-analyzer/dist/src/types.js +7 -0
  229. package/packages/intent-analyzer/src/analyzer.ts +259 -0
  230. package/packages/intent-analyzer/src/index.ts +8 -0
  231. package/packages/intent-analyzer/src/types.ts +44 -0
  232. package/packages/knowledge-retrieval/src/index.ts +18 -0
  233. package/packages/knowledge-retrieval/src/mcp-client.ts +212 -0
  234. package/packages/knowledge-retrieval/src/types.ts +112 -0
  235. package/packages/laravel-plugin/src/analyzer.ts +323 -0
  236. package/packages/laravel-plugin/src/index.ts +40 -0
  237. package/packages/laravel-plugin/src/types.ts +24 -0
  238. package/packages/learning-engine/src/engine.ts +391 -0
  239. package/packages/learning-engine/src/index.ts +26 -0
  240. package/packages/learning-engine/src/types.ts +201 -0
  241. package/packages/mcp-adapter/src/index.ts +20 -0
  242. package/packages/mcp-adapter/src/server.ts +273 -0
  243. package/packages/mcp-adapter/src/tools.ts +220 -0
  244. package/packages/mcp-adapter/src/types.ts +79 -0
  245. package/packages/memory-engine/src/engine.ts +615 -0
  246. package/packages/memory-engine/src/index.ts +20 -0
  247. package/packages/memory-engine/src/types.ts +159 -0
  248. package/packages/model-registry/src/cost.ts +80 -0
  249. package/packages/model-registry/src/defaults.ts +178 -0
  250. package/packages/model-registry/src/index.ts +57 -0
  251. package/packages/model-registry/src/query.ts +85 -0
  252. package/packages/model-registry/src/registry.ts +188 -0
  253. package/packages/model-registry/src/types.d.ts +63 -0
  254. package/packages/model-registry/src/types.js +5 -0
  255. package/packages/model-registry/src/types.ts +69 -0
  256. package/packages/nextjs-plugin/src/analyzer.ts +247 -0
  257. package/packages/nextjs-plugin/src/index.ts +41 -0
  258. package/packages/nextjs-plugin/src/types.ts +36 -0
  259. package/packages/notification/src/adapters/email-adapter.ts +126 -0
  260. package/packages/notification/src/adapters/ntfy-adapter.ts +100 -0
  261. package/packages/notification/src/adapters/telegram-adapter.ts +107 -0
  262. package/packages/notification/src/adapters/webhook-adapter.ts +75 -0
  263. package/packages/notification/src/base-adapter.ts +75 -0
  264. package/packages/notification/src/index.ts +9 -0
  265. package/packages/notification/src/notification-center.ts +286 -0
  266. package/packages/notification/src/types.ts +89 -0
  267. package/packages/observability/src/alerts.ts +355 -0
  268. package/packages/observability/src/health.ts +325 -0
  269. package/packages/observability/src/index.ts +79 -0
  270. package/packages/observability/src/logger.ts +373 -0
  271. package/packages/observability/src/metrics.ts +475 -0
  272. package/packages/observability/src/tracer.ts +336 -0
  273. package/packages/observability/src/types.ts +391 -0
  274. package/packages/okf-indexer/src/cli.ts +25 -0
  275. package/packages/okf-indexer/src/indexer.ts +186 -0
  276. package/packages/performance-optimizer/src/index.ts +20 -0
  277. package/packages/performance-optimizer/src/optimizer.ts +428 -0
  278. package/packages/performance-optimizer/src/types.ts +112 -0
  279. package/packages/privilege-broker/src/approval.ts +70 -0
  280. package/packages/privilege-broker/src/audit.ts +142 -0
  281. package/packages/privilege-broker/src/executor.ts +110 -0
  282. package/packages/privilege-broker/src/index.ts +46 -0
  283. package/packages/privilege-broker/src/registry.ts +98 -0
  284. package/packages/privilege-broker/src/types.ts +105 -0
  285. package/packages/project-analyzer/src/analyzer.ts +683 -0
  286. package/packages/project-analyzer/src/cache.ts +329 -0
  287. package/packages/project-analyzer/src/command-discovery.ts +239 -0
  288. package/packages/project-analyzer/src/index.ts +123 -0
  289. package/packages/project-analyzer/src/plugins/index.ts +16 -0
  290. package/packages/project-analyzer/src/rule-discovery.ts +282 -0
  291. package/packages/project-analyzer/src/signals.ts +355 -0
  292. package/packages/project-analyzer/src/types.ts +412 -0
  293. package/packages/project-analyzer/src/walker.ts +366 -0
  294. package/packages/projection-engine/dist/src/engine.d.ts +61 -0
  295. package/packages/projection-engine/dist/src/engine.js +87 -0
  296. package/packages/projection-engine/dist/src/index.d.ts +2 -0
  297. package/packages/projection-engine/dist/src/index.js +2 -0
  298. package/packages/projection-engine/dist/src/project.d.ts +3 -0
  299. package/packages/projection-engine/dist/src/project.js +24 -0
  300. package/packages/projection-engine/dist/src/types.d.ts +55 -0
  301. package/packages/projection-engine/dist/src/types.js +5 -0
  302. package/packages/projection-engine/src/engine.ts +134 -0
  303. package/packages/projection-engine/src/index.ts +8 -0
  304. package/packages/projection-engine/src/project.ts +24 -0
  305. package/packages/projection-engine/src/types.d.ts +55 -0
  306. package/packages/projection-engine/src/types.js +5 -0
  307. package/packages/projection-engine/src/types.ts +60 -0
  308. package/packages/prompt-compiler/src/budget.ts +170 -0
  309. package/packages/prompt-compiler/src/compiler.ts +188 -0
  310. package/packages/prompt-compiler/src/deduplicate.ts +84 -0
  311. package/packages/prompt-compiler/src/index.ts +50 -0
  312. package/packages/prompt-compiler/src/normalize.ts +140 -0
  313. package/packages/prompt-compiler/src/render.ts +105 -0
  314. package/packages/prompt-compiler/src/section-builder.ts +279 -0
  315. package/packages/prompt-compiler/src/types.ts +263 -0
  316. package/packages/prompt-compiler/src/validate.ts +157 -0
  317. package/packages/prompt-versioning/src/index.ts +6 -0
  318. package/packages/prompt-versioning/src/types.ts +41 -0
  319. package/packages/prompt-versioning/src/versioning.ts +149 -0
  320. package/packages/provider-adapter-sdk/dist/src/builder.d.ts +140 -0
  321. package/packages/provider-adapter-sdk/dist/src/builder.js +332 -0
  322. package/packages/provider-adapter-sdk/dist/src/errors.d.ts +71 -0
  323. package/packages/provider-adapter-sdk/dist/src/errors.js +111 -0
  324. package/packages/provider-adapter-sdk/dist/src/index.d.ts +15 -0
  325. package/packages/provider-adapter-sdk/dist/src/index.js +19 -0
  326. package/packages/provider-adapter-sdk/dist/src/registry.d.ts +108 -0
  327. package/packages/provider-adapter-sdk/dist/src/registry.js +301 -0
  328. package/packages/provider-adapter-sdk/dist/src/tester.d.ts +71 -0
  329. package/packages/provider-adapter-sdk/dist/src/tester.js +392 -0
  330. package/packages/provider-adapter-sdk/dist/src/types.d.ts +182 -0
  331. package/packages/provider-adapter-sdk/dist/src/types.js +11 -0
  332. package/packages/provider-adapter-sdk/src/builder.ts +442 -0
  333. package/packages/provider-adapter-sdk/src/errors.ts +153 -0
  334. package/packages/provider-adapter-sdk/src/index.ts +84 -0
  335. package/packages/provider-adapter-sdk/src/registry.ts +486 -0
  336. package/packages/provider-adapter-sdk/src/tester.ts +483 -0
  337. package/packages/provider-adapter-sdk/src/types.ts +293 -0
  338. package/packages/provider-router/dist/capability-registry/src/types.d.ts +47 -0
  339. package/packages/provider-router/dist/capability-registry/src/types.js +10 -0
  340. package/packages/provider-router/dist/provider-router/src/index.d.ts +23 -0
  341. package/packages/provider-router/dist/provider-router/src/index.js +25 -0
  342. package/packages/provider-router/dist/provider-router/src/policy.d.ts +10 -0
  343. package/packages/provider-router/dist/provider-router/src/policy.js +45 -0
  344. package/packages/provider-router/dist/provider-router/src/provider-router.d.ts +56 -0
  345. package/packages/provider-router/dist/provider-router/src/provider-router.js +222 -0
  346. package/packages/provider-router/dist/provider-router/src/strategies.d.ts +19 -0
  347. package/packages/provider-router/dist/provider-router/src/strategies.js +110 -0
  348. package/packages/provider-router/dist/provider-router/src/types.d.ts +91 -0
  349. package/packages/provider-router/dist/provider-router/src/types.js +10 -0
  350. package/packages/provider-router/dist/src/index.d.ts +23 -0
  351. package/packages/provider-router/dist/src/index.js +25 -0
  352. package/packages/provider-router/dist/src/policy.d.ts +10 -0
  353. package/packages/provider-router/dist/src/policy.js +45 -0
  354. package/packages/provider-router/dist/src/provider-router.d.ts +56 -0
  355. package/packages/provider-router/dist/src/provider-router.js +222 -0
  356. package/packages/provider-router/dist/src/strategies.d.ts +19 -0
  357. package/packages/provider-router/dist/src/strategies.js +110 -0
  358. package/packages/provider-router/dist/src/types.d.ts +91 -0
  359. package/packages/provider-router/dist/src/types.js +10 -0
  360. package/packages/provider-router/dist/types/src/runtime-types.d.ts +412 -0
  361. package/packages/provider-router/dist/types/src/runtime-types.js +2 -0
  362. package/packages/provider-router/src/index.ts +49 -0
  363. package/packages/provider-router/src/policy.ts +50 -0
  364. package/packages/provider-router/src/provider-router.ts +315 -0
  365. package/packages/provider-router/src/strategies.ts +158 -0
  366. package/packages/provider-router/src/types.ts +130 -0
  367. package/packages/provider-selector/src/index.ts +13 -0
  368. package/packages/provider-selector/src/selector.ts +120 -0
  369. package/packages/provider-selector/src/types.ts +33 -0
  370. package/packages/providers/dist/src/adapters.d.ts +133 -0
  371. package/packages/providers/dist/src/adapters.js +236 -0
  372. package/packages/providers/dist/src/deepagents-adapter.d.ts +78 -0
  373. package/packages/providers/dist/src/deepagents-adapter.js +323 -0
  374. package/packages/providers/dist/src/glm-usage.d.ts +102 -0
  375. package/packages/providers/dist/src/glm-usage.js +197 -0
  376. package/packages/providers/dist/src/index.d.ts +11 -0
  377. package/packages/providers/dist/src/index.js +11 -0
  378. package/packages/providers/dist/src/openai-usage.d.ts +103 -0
  379. package/packages/providers/dist/src/openai-usage.js +208 -0
  380. package/packages/providers/dist/src/provider-id.d.ts +46 -0
  381. package/packages/providers/dist/src/provider-id.js +113 -0
  382. package/packages/providers/src/adapters.ts +362 -0
  383. package/packages/providers/src/deepagents-adapter.ts +458 -0
  384. package/packages/providers/src/glm-usage.ts +248 -0
  385. package/packages/providers/src/index.ts +11 -0
  386. package/packages/providers/src/openai-usage.ts +263 -0
  387. package/packages/providers/src/provider-id.ts +129 -0
  388. package/packages/quota-manager/dist/src/examples/tui-usage-integration.d.ts +35 -0
  389. package/packages/quota-manager/dist/src/examples/tui-usage-integration.js +73 -0
  390. package/packages/quota-manager/dist/src/index.d.ts +8 -0
  391. package/packages/quota-manager/dist/src/index.js +8 -0
  392. package/packages/quota-manager/dist/src/quota-manager.d.ts +70 -0
  393. package/packages/quota-manager/dist/src/quota-manager.js +260 -0
  394. package/packages/quota-manager/dist/src/tui-usage-monitor.d.ts +96 -0
  395. package/packages/quota-manager/dist/src/tui-usage-monitor.js +268 -0
  396. package/packages/quota-manager/src/examples/tui-usage-integration.ts +72 -0
  397. package/packages/quota-manager/src/index.ts +8 -0
  398. package/packages/quota-manager/src/quota-manager.ts +336 -0
  399. package/packages/quota-manager/src/tui-usage-monitor.ts +355 -0
  400. package/packages/rate-limiter/src/index.ts +6 -0
  401. package/packages/rate-limiter/src/limiter.ts +122 -0
  402. package/packages/rate-limiter/src/types.ts +41 -0
  403. package/packages/react-vite-plugin/src/analyzer.ts +226 -0
  404. package/packages/react-vite-plugin/src/index.ts +39 -0
  405. package/packages/react-vite-plugin/src/types.ts +28 -0
  406. package/packages/release-manager/src/changelog.ts +148 -0
  407. package/packages/release-manager/src/index.ts +21 -0
  408. package/packages/release-manager/src/types.ts +50 -0
  409. package/packages/release-manager/src/version.ts +52 -0
  410. package/packages/requirement-compiler/src/ambiguity-detector.ts +302 -0
  411. package/packages/requirement-compiler/src/classifier.ts +145 -0
  412. package/packages/requirement-compiler/src/compiler.ts +328 -0
  413. package/packages/requirement-compiler/src/extractor.ts +155 -0
  414. package/packages/requirement-compiler/src/index.ts +36 -0
  415. package/packages/requirement-compiler/src/normalizer.ts +161 -0
  416. package/packages/requirement-compiler/src/risk-detector.ts +58 -0
  417. package/packages/requirement-compiler/src/types.ts +596 -0
  418. package/packages/runtime/dist/src/command-executor.d.ts +129 -0
  419. package/packages/runtime/dist/src/command-executor.js +383 -0
  420. package/packages/runtime/dist/src/index.d.ts +11 -0
  421. package/packages/runtime/dist/src/index.js +11 -0
  422. package/packages/runtime/dist/src/local-runtime-agent.d.ts +111 -0
  423. package/packages/runtime/dist/src/local-runtime-agent.js +356 -0
  424. package/packages/runtime/dist/src/policy-engine.d.ts +203 -0
  425. package/packages/runtime/dist/src/policy-engine.js +592 -0
  426. package/packages/runtime/dist/src/runtime-api.d.ts +137 -0
  427. package/packages/runtime/dist/src/runtime-api.js +454 -0
  428. package/packages/runtime/dist/src/workspace-manager.d.ts +162 -0
  429. package/packages/runtime/dist/src/workspace-manager.js +451 -0
  430. package/packages/runtime/src/command-executor.ts +523 -0
  431. package/packages/runtime/src/index.ts +11 -0
  432. package/packages/runtime/src/local-runtime-agent.ts +480 -0
  433. package/packages/runtime/src/policy-engine.ts +813 -0
  434. package/packages/runtime/src/runtime-api.ts +665 -0
  435. package/packages/runtime/src/workspace-manager.ts +591 -0
  436. package/packages/scheduler/src/scheduler.ts +50 -0
  437. package/packages/scheduler-adapter/src/cron.ts +123 -0
  438. package/packages/scheduler-adapter/src/index.ts +9 -0
  439. package/packages/scheduler-adapter/src/interface.ts +61 -0
  440. package/packages/scheduler-adapter/src/internal.ts +99 -0
  441. package/packages/scheduler-adapter/src/systemd.ts +221 -0
  442. package/packages/session/src/history.ts +353 -0
  443. package/packages/session/src/index.ts +53 -0
  444. package/packages/session/src/manager.ts +481 -0
  445. package/packages/session/src/policy.ts +363 -0
  446. package/packages/session/src/store.ts +348 -0
  447. package/packages/session/src/types.ts +275 -0
  448. package/packages/session-api/dist/src/api.d.ts +83 -0
  449. package/packages/session-api/dist/src/api.js +49 -0
  450. package/packages/session-api/dist/src/index.d.ts +2 -0
  451. package/packages/session-api/dist/src/index.js +2 -0
  452. package/packages/session-api/dist/src/types.d.ts +22 -0
  453. package/packages/session-api/dist/src/types.js +5 -0
  454. package/packages/session-api/src/api.ts +117 -0
  455. package/packages/session-api/src/index.ts +1 -0
  456. package/packages/session-api/src/types.ts +23 -0
  457. package/packages/session-export/dist/src/exporter.d.ts +28 -0
  458. package/packages/session-export/dist/src/exporter.js +42 -0
  459. package/packages/session-export/dist/src/index.d.ts +2 -0
  460. package/packages/session-export/dist/src/index.js +2 -0
  461. package/packages/session-export/dist/src/types.d.ts +20 -0
  462. package/packages/session-export/dist/src/types.js +5 -0
  463. package/packages/session-export/src/exporter.ts +81 -0
  464. package/packages/session-export/src/index.ts +1 -0
  465. package/packages/session-export/src/types.ts +22 -0
  466. package/packages/shared-context/src/index.ts +7 -0
  467. package/packages/shared-context/src/shared-context.ts +42 -0
  468. package/packages/skill-registry/src/defaults.ts +146 -0
  469. package/packages/skill-registry/src/index.ts +48 -0
  470. package/packages/skill-registry/src/matching.ts +118 -0
  471. package/packages/skill-registry/src/registry.ts +211 -0
  472. package/packages/skill-registry/src/types.ts +97 -0
  473. package/packages/sprint-planner/src/decomposer.ts +57 -0
  474. package/packages/sprint-planner/src/index.ts +16 -0
  475. package/packages/sprint-planner/src/planner.ts +150 -0
  476. package/packages/sprint-planner/src/types.ts +59 -0
  477. package/packages/subscription-engine/dist/src/engine.d.ts +13 -0
  478. package/packages/subscription-engine/dist/src/engine.js +40 -0
  479. package/packages/subscription-engine/dist/src/index.d.ts +2 -0
  480. package/packages/subscription-engine/dist/src/index.js +2 -0
  481. package/packages/subscription-engine/dist/src/subscriptions.d.ts +19 -0
  482. package/packages/subscription-engine/dist/src/subscriptions.js +39 -0
  483. package/packages/subscription-engine/dist/src/types.d.ts +24 -0
  484. package/packages/subscription-engine/dist/src/types.js +5 -0
  485. package/packages/subscription-engine/src/engine.ts +55 -0
  486. package/packages/subscription-engine/src/index.ts +6 -0
  487. package/packages/subscription-engine/src/subscriptions.ts +55 -0
  488. package/packages/subscription-engine/src/types.ts +27 -0
  489. package/packages/task-compiler/src/command-policy.ts +193 -0
  490. package/packages/task-compiler/src/compiler.ts +114 -0
  491. package/packages/task-compiler/src/decompose.ts +265 -0
  492. package/packages/task-compiler/src/file-scope.ts +240 -0
  493. package/packages/task-compiler/src/graph.ts +144 -0
  494. package/packages/task-compiler/src/index.ts +38 -0
  495. package/packages/task-compiler/src/types.ts +225 -0
  496. package/packages/task-compiler/src/validate.ts +218 -0
  497. package/packages/task-compiler/src/verification.ts +248 -0
  498. package/packages/tencentdb-memory/src/client.ts +130 -0
  499. package/packages/tencentdb-memory/src/index.ts +32 -0
  500. package/packages/tencentdb-memory/src/loader.ts +150 -0
  501. package/packages/tencentdb-memory/src/mcp-tools.ts +213 -0
  502. package/packages/tencentdb-memory/src/types.ts +101 -0
  503. package/packages/tencentdb-sync/src/cli.ts +363 -0
  504. package/packages/tencentdb-sync/src/client.ts +268 -0
  505. package/packages/tencentdb-sync/src/config.ts +139 -0
  506. package/packages/tencentdb-sync/src/index.ts +15 -0
  507. package/packages/test-data-generator/src/faker-adapter.ts +657 -0
  508. package/packages/test-data-generator/src/generator.ts +461 -0
  509. package/packages/test-data-generator/src/index.ts +48 -0
  510. package/packages/test-data-generator/src/types.ts +421 -0
  511. package/packages/test-generator/src/generator.ts +144 -0
  512. package/packages/test-generator/src/index.ts +11 -0
  513. package/packages/test-generator/src/types.ts +39 -0
  514. package/packages/todo-bd-sync/src/detector.ts +171 -0
  515. package/packages/todo-bd-sync/src/extension.ts +129 -0
  516. package/packages/todo-bd-sync/src/index.ts +401 -0
  517. package/packages/todo-bd-sync/src/sync.ts +322 -0
  518. package/packages/todo-bd-sync/src/task-analyzer.ts +314 -0
  519. package/packages/todo-bd-sync/src/todo-reminder.ts +418 -0
  520. package/packages/todo-bd-sync/src/types.ts +137 -0
  521. package/packages/token-estimation/src/index.ts +192 -0
  522. package/packages/token-optimizer/src/index.ts +15 -0
  523. package/packages/token-optimizer/src/optimizer.ts +150 -0
  524. package/packages/token-optimizer/src/types.ts +47 -0
  525. package/packages/types/src/agent-worker-types.d.ts +206 -0
  526. package/packages/types/src/agent-worker-types.js +41 -0
  527. package/packages/types/src/agent-worker-types.ts +264 -0
  528. package/packages/types/src/ai-providers.d.ts +36 -0
  529. package/packages/types/src/ai-providers.js +66 -0
  530. package/packages/types/src/ai-providers.ts +73 -0
  531. package/packages/types/src/runtime-types.d.ts +418 -0
  532. package/packages/types/src/runtime-types.js +3 -0
  533. package/packages/types/src/runtime-types.ts +588 -0
  534. package/packages/workflow-events/dist/src/events.d.ts +38 -0
  535. package/packages/workflow-events/dist/src/events.js +55 -0
  536. package/packages/workflow-events/dist/src/index.d.ts +2 -0
  537. package/packages/workflow-events/dist/src/index.js +2 -0
  538. package/packages/workflow-events/dist/src/pipeline.d.ts +21 -0
  539. package/packages/workflow-events/dist/src/pipeline.js +36 -0
  540. package/packages/workflow-events/dist/src/types.d.ts +110 -0
  541. package/packages/workflow-events/dist/src/types.js +5 -0
  542. package/packages/workflow-events/src/events.ts +86 -0
  543. package/packages/workflow-events/src/index.ts +19 -0
  544. package/packages/workflow-events/src/pipeline.ts +41 -0
  545. package/packages/workflow-events/src/types.d.ts +110 -0
  546. package/packages/workflow-events/src/types.js +5 -0
  547. package/packages/workflow-events/src/types.ts +139 -0
  548. package/packages/workspace-scanner/dist/src/detect.d.ts +3 -0
  549. package/packages/workspace-scanner/dist/src/detect.js +60 -0
  550. package/packages/workspace-scanner/dist/src/git.d.ts +7 -0
  551. package/packages/workspace-scanner/dist/src/git.js +75 -0
  552. package/packages/workspace-scanner/dist/src/index.d.ts +5 -0
  553. package/packages/workspace-scanner/dist/src/index.js +4 -0
  554. package/packages/workspace-scanner/dist/src/scanner.d.ts +11 -0
  555. package/packages/workspace-scanner/dist/src/scanner.js +59 -0
  556. package/packages/workspace-scanner/dist/src/types.d.ts +35 -0
  557. package/packages/workspace-scanner/dist/src/types.js +5 -0
  558. package/packages/workspace-scanner/src/detect.ts +77 -0
  559. package/packages/workspace-scanner/src/git.ts +83 -0
  560. package/packages/workspace-scanner/src/index.ts +9 -0
  561. package/packages/workspace-scanner/src/scanner.ts +73 -0
  562. package/packages/workspace-scanner/src/types.ts +48 -0
  563. package/packages/worktree/dist/src/index.d.ts +7 -0
  564. package/packages/worktree/dist/src/index.js +7 -0
  565. package/packages/worktree/dist/src/worktree.d.ts +88 -0
  566. package/packages/worktree/dist/src/worktree.js +239 -0
  567. package/packages/worktree/src/index.ts +7 -0
  568. package/packages/worktree/src/worktree.ts +290 -0
  569. package/packages/write-review/src/blackboard.ts +249 -0
  570. package/packages/write-review/src/gate.ts +169 -0
  571. package/packages/write-review/src/index.ts +18 -0
  572. package/packages/write-review/src/injection.ts +170 -0
  573. package/packages/write-review/src/review.ts +206 -0
  574. package/packages/write-review/src/trigger.ts +133 -0
  575. package/packages/write-review/src/types.ts +90 -0
  576. package/proactive-compact.ts +90 -0
  577. package/prompts/tencentdb-connect.md +35 -0
  578. package/prompts/tencentdb-setup.md +101 -0
  579. package/prompts/tencentdb.md +88 -0
  580. package/renderer.ts +205 -0
  581. package/skills/harness-runtime/SKILL.md +237 -0
  582. package/status-parsers.ts +84 -0
  583. package/tracker.ts +72 -0
  584. package/windows.ts +121 -0
@@ -0,0 +1,314 @@
1
+ /**
2
+ * Context Compiler - Compiler
3
+ *
4
+ * Main entry point for context compilation.
5
+ * Pipeline: collect → policy filter → score → deduplicate → fit budget → source graph.
6
+ */
7
+
8
+ import type {
9
+ ContextCompileRequest,
10
+ ContextSourceEdge,
11
+ OmissionReason,
12
+ OmittedItem,
13
+ } from "./types.js";
14
+ import { ContextCompileError } from "./types.js";
15
+
16
+ import { estimateTokens, fitToBudget, toCompiledItems } from "./budget.js";
17
+ import { generateCacheKey } from "./cache.js";
18
+ import { deduplicateCandidates, mergeFileSlices } from "./deduplicate.js";
19
+ import { applyPolicyFilter, mergePolicy } from "./filter.js";
20
+ import { mergeWeights, rankCandidates } from "./score.js";
21
+ import {
22
+ loadOkfConcepts,
23
+ okfDirectoryExists,
24
+ getOkfPath,
25
+ } from "./okf-loader.js";
26
+
27
+ /**
28
+ * Default clock for generating timestamps.
29
+ */
30
+ export function createClock() {
31
+ return { now: () => new Date() };
32
+ }
33
+
34
+ export interface Clock {
35
+ now: () => Date;
36
+ }
37
+
38
+ /**
39
+ * Compile context from candidates.
40
+ *
41
+ * Pipeline:
42
+ * 1. Apply policy filter (deny patterns, size limits)
43
+ * 2. Score optional candidates
44
+ * 3. Merge file slices
45
+ * 4. Deduplicate
46
+ * 5. Fit to token budget
47
+ * 6. Generate source graph
48
+ * 7. Return CompiledContext
49
+ */
50
+ export async function compileContext(
51
+ request: ContextCompileRequest,
52
+ clock: Clock = createClock(),
53
+ ): Promise<CompiledContextOutput> {
54
+ const {
55
+ taskId,
56
+ taskObjective,
57
+ maximumTokens,
58
+ candidates,
59
+ scoringWeights,
60
+ policy,
61
+ } = request;
62
+
63
+ // 0. Validate required sources exist
64
+ const missingRequired = candidates
65
+ .filter((c) => c.required)
66
+ .filter((c) => !c.content.trim());
67
+
68
+ if (missingRequired.length > 0) {
69
+ const first = missingRequired[0];
70
+ if (!first)
71
+ throw new Error("Internal: missingRequired should not be empty");
72
+ throw new ContextCompileError(
73
+ "MISSING_REQUIRED_SOURCE",
74
+ `Required source "${first.source}" has no content`,
75
+ {
76
+ missingSources: missingRequired.map((c) => c.source),
77
+ },
78
+ );
79
+ }
80
+
81
+ // 1. Apply policy filter
82
+ const resolvedPolicy = mergePolicy(policy);
83
+ const { passed: policyPassed, denied: policyDenied } = applyPolicyFilter(
84
+ candidates,
85
+ resolvedPolicy,
86
+ );
87
+
88
+ const policyOmitted: OmittedItem[] = policyDenied.map(
89
+ ({ candidate, reason }) => ({
90
+ id: candidate.id,
91
+ kind: candidate.kind,
92
+ reason: "policy_denied" as OmissionReason,
93
+ reasonDetail: reason,
94
+ estimatedTokens: estimateTokens(candidate.content),
95
+ deniedBy: reason,
96
+ }),
97
+ );
98
+
99
+ // 2. Score optional candidates
100
+ const weights = mergeWeights(scoringWeights);
101
+ const scoreContext = {
102
+ directFileReferences: extractDirectReferences(taskObjective),
103
+ taskDependencies: extractDependencies(taskObjective),
104
+ };
105
+
106
+ // 3. Merge file slices (before scoring)
107
+ const merged = mergeFileSlices(policyPassed);
108
+
109
+ // 4. Deduplicate
110
+ const { unique: deduped, duplicates: dupIds } = deduplicateCandidates(merged);
111
+
112
+ const dedupOmitted: OmittedItem[] = dupIds.map((id) => {
113
+ const c = candidates.find((x) => x.id === id);
114
+ return {
115
+ id,
116
+ kind: c?.kind ?? "source_file",
117
+ reason: "duplicate" as OmissionReason,
118
+ reasonDetail: `duplicate of ${c?.source ?? id}`,
119
+ estimatedTokens: estimateTokens(c?.content ?? ""),
120
+ };
121
+ });
122
+
123
+ // 5. Rank by score
124
+ const ranked = rankCandidates(deduped, weights, scoreContext);
125
+
126
+ // 6. Fit to budget
127
+ const { included, omitted: budgetOmitted } = fitToBudget(
128
+ ranked,
129
+ maximumTokens,
130
+ );
131
+
132
+ // 7. Convert to compiled items
133
+ const compiledItems = toCompiledItems(included);
134
+
135
+ // 8. Generate source graph
136
+ const sourceGraph = buildSourceGraph(compiledItems);
137
+
138
+ // 9. Generate cache key
139
+ const cacheKey = generateCacheKey(taskId, compiledItems, taskObjective);
140
+
141
+ // 10. Build mapping
142
+ const mapping: Record<string, string> = {};
143
+ for (const c of candidates) {
144
+ const compiled = compiledItems.find((i) => i.id === c.id);
145
+ if (compiled) {
146
+ mapping[c.id] = compiled.id;
147
+ }
148
+ }
149
+
150
+ const totalOmitted = [...policyOmitted, ...dedupOmitted, ...budgetOmitted];
151
+
152
+ return {
153
+ taskId,
154
+ items: compiledItems,
155
+ omitted: totalOmitted,
156
+ estimatedTokens: compiledItems.reduce(
157
+ (sum, item) => sum + item.estimatedTokens,
158
+ 0,
159
+ ),
160
+ sourceGraph,
161
+ generatedAt: clock.now().toISOString(),
162
+ mapping,
163
+ cacheKey,
164
+ };
165
+ }
166
+
167
+ /**
168
+ * Compiled context output (extended with cache key).
169
+ */
170
+ export interface CompiledContextOutput {
171
+ taskId: string;
172
+ items: ReturnType<typeof toCompiledItems>[number][];
173
+ omitted: OmittedItem[];
174
+ estimatedTokens: number;
175
+ sourceGraph: ContextSourceEdge[];
176
+ generatedAt: string;
177
+ mapping: Record<string, string>;
178
+ cacheKey: string;
179
+ }
180
+
181
+ /**
182
+ * Extract direct file references from task objective.
183
+ * Looks for quoted paths, file patterns.
184
+ */
185
+ function extractDirectReferences(objective: string): Set<string> {
186
+ const refs = new Set<string>();
187
+ // Match quoted paths
188
+ const quotedMatches = objective.matchAll(/(["'`])([^`1]+)\1/g);
189
+ for (const match of quotedMatches) {
190
+ const path = match[2];
191
+ if (path) refs.add(path);
192
+ }
193
+ // Match common file patterns
194
+ const filePattern =
195
+ /[a-zA-Z][a-zA-Z0-9_/-]*\.(ts|tsx|js|jsx|py|go|rs|java|cpp|h|c|md|json|yaml|yml|toml)\b/g;
196
+ for (const match of objective.matchAll(filePattern)) {
197
+ const path = match[0];
198
+ if (path) refs.add(path);
199
+ }
200
+ return refs;
201
+ }
202
+
203
+ /**
204
+ * Extract dependency references from task objective.
205
+ */
206
+ function extractDependencies(objective: string): string[] {
207
+ const deps: string[] = [];
208
+ // Match "depends on X", "related to Y"
209
+ const depPatterns = [
210
+ /(?:depends on|related to|imports from)\s+([A-Za-z][A-Za-z0-9_.-]*)/gi,
211
+ ];
212
+ for (const pattern of depPatterns) {
213
+ for (const match of objective.matchAll(pattern)) {
214
+ const name = match[1];
215
+ if (name) deps.push(name);
216
+ }
217
+ }
218
+ return [...new Set(deps)];
219
+ }
220
+
221
+ /**
222
+ * Build source graph edges between related items.
223
+ */
224
+ function buildSourceGraph(
225
+ items: ReturnType<typeof toCompiledItems>[number][],
226
+ ): ContextSourceEdge[] {
227
+ const edges: ContextSourceEdge[] = [];
228
+
229
+ const okfItems = items.filter((i) => i.kind === "okf_concept");
230
+ const sourceItems = items.filter((i) => i.kind === "source_file");
231
+ const testItems = items.filter((i) => i.kind === "test_failure");
232
+
233
+ // OKF concepts → source files they reference
234
+ for (const okf of okfItems) {
235
+ for (const src of sourceItems) {
236
+ if (
237
+ okf.content.includes(src.source) ||
238
+ (src.filePath && okf.content.includes(src.filePath))
239
+ ) {
240
+ edges.push({
241
+ from: okf.id,
242
+ to: src.id,
243
+ label: "references",
244
+ weight: 3,
245
+ });
246
+ }
247
+ }
248
+ }
249
+
250
+ // Source files → test failures they relate to
251
+ for (const src of sourceItems) {
252
+ for (const test of testItems) {
253
+ if (
254
+ test.content.includes(src.source) ||
255
+ (src.filePath && test.content.includes(src.filePath))
256
+ ) {
257
+ edges.push({
258
+ from: src.id,
259
+ to: test.id,
260
+ label: "causes_failure",
261
+ weight: 5,
262
+ });
263
+ }
264
+ }
265
+ }
266
+
267
+ // Sort edges deterministically
268
+ edges.sort((a, b) => {
269
+ const keyA = `${a.from}:${a.to}:${a.label}`;
270
+ const keyB = `${b.from}:${b.to}:${b.label}`;
271
+ return keyA.localeCompare(keyB);
272
+ });
273
+
274
+ return edges;
275
+ }
276
+
277
+ // --- OKF Integration --------------------------------------------------------
278
+
279
+ /**
280
+ * Enrich context candidates with OKF concepts from ~/.pi/okf/.
281
+ *
282
+ * This is optional - if the OKF directory doesn't exist,
283
+ * candidates remain unchanged.
284
+ *
285
+ * Usage:
286
+ * ```ts
287
+ * const enriched = enrichWithOkf(candidates);
288
+ * const result = await compileContext({ ...request, candidates: enriched });
289
+ * ```
290
+ */
291
+ export function enrichWithOkf(
292
+ candidates: ContextCompileRequest["candidates"],
293
+ okfPath?: string,
294
+ ): ContextCompileRequest["candidates"] {
295
+ const okfConcepts = loadOkfConcepts(okfPath);
296
+
297
+ if (okfConcepts.length === 0) {
298
+ return candidates;
299
+ }
300
+
301
+ // Log for debugging (can be removed in production)
302
+ if (okfDirectoryExists(okfPath)) {
303
+ console.log(
304
+ `[OKF] Loaded ${okfConcepts.length} concepts from ${getOkfPath()}`,
305
+ );
306
+ }
307
+
308
+ // Merge OKF concepts with existing candidates
309
+ // Existing candidates take precedence (won't be overwritten)
310
+ const existingIds = new Set(candidates.map((c) => c.id));
311
+ const newConcepts = okfConcepts.filter((c) => !existingIds.has(c.id));
312
+
313
+ return [...candidates, ...newConcepts];
314
+ }
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Context Compiler - Deduplication
3
+ *
4
+ * Removes duplicate candidates and merges overlapping source file slices.
5
+ * Uses content normalization for deduplication (same as RFC-0041).
6
+ */
7
+
8
+ import type { ContextCandidate } from "./types.js";
9
+
10
+ /**
11
+ * Deduplicate candidates by normalized content.
12
+ * Required candidates are never deduplicated (preserved).
13
+ *
14
+ * For source files with overlapping ranges, merge into a single slice.
15
+ *
16
+ * @returns [uniqueCandidates, duplicateIds]
17
+ */
18
+ export function deduplicateCandidates(candidates: ContextCandidate[]): {
19
+ unique: ContextCandidate[];
20
+ duplicates: string[];
21
+ } {
22
+ const seen = new Map<string, ContextCandidate>();
23
+ const duplicates: string[] = [];
24
+
25
+ for (const candidate of candidates) {
26
+ // Required items are never deduplicated
27
+ if (candidate.required) {
28
+ seen.set(candidate.id, candidate);
29
+ continue;
30
+ }
31
+
32
+ const normalized = normalizeContent(candidate.content);
33
+
34
+ if (seen.has(normalized)) {
35
+ duplicates.push(candidate.id);
36
+ } else {
37
+ seen.set(normalized, candidate);
38
+ }
39
+ }
40
+
41
+ return {
42
+ unique: [...seen.values()],
43
+ duplicates,
44
+ };
45
+ }
46
+
47
+ /**
48
+ * Merge overlapping file slices from the same file.
49
+ * Merges adjacent/overlapping line ranges and deduplicates symbols.
50
+ */
51
+ export function mergeFileSlices(
52
+ candidates: ContextCandidate[],
53
+ ): ContextCandidate[] {
54
+ // Group by file path
55
+ const byFile = new Map<string, ContextCandidate[]>();
56
+ for (const c of candidates) {
57
+ if (c.kind === "source_file" && c.filePath) {
58
+ const existing = byFile.get(c.filePath);
59
+ if (existing) {
60
+ existing.push(c);
61
+ } else {
62
+ byFile.set(c.filePath, [c]);
63
+ }
64
+ } else {
65
+ // Non-source-file candidates pass through
66
+ }
67
+ }
68
+
69
+ const result: ContextCandidate[] = [];
70
+
71
+ for (const candidate of candidates) {
72
+ if (candidate.kind === "source_file" && candidate.filePath) {
73
+ // Only process once (first candidate for each file)
74
+ const slices = byFile.get(candidate.filePath) ?? [];
75
+ if (slices[0] !== candidate) continue;
76
+
77
+ if (slices.length === 1) {
78
+ result.push(candidate);
79
+ } else {
80
+ // Merge multiple slices
81
+ result.push(mergeSlicesForFile(candidate.filePath, slices));
82
+ }
83
+ } else {
84
+ result.push(candidate);
85
+ }
86
+ }
87
+
88
+ return result;
89
+ }
90
+
91
+ /**
92
+ * Merge multiple slices from the same file.
93
+ */
94
+ function mergeSlicesForFile(
95
+ filePath: string,
96
+ slices: ContextCandidate[],
97
+ ): ContextCandidate {
98
+ // Sort by startLine
99
+ const sorted = [...slices].sort(
100
+ (a, b) => (a.startLine ?? 0) - (b.startLine ?? 0),
101
+ );
102
+
103
+ const first = sorted[0] ?? {
104
+ id: "",
105
+ kind: "source_file",
106
+ content: "",
107
+ source: "",
108
+ priority: 0 as const,
109
+ required: false,
110
+ trust: "unverified",
111
+ };
112
+ let endLine = first.endLine ?? 0;
113
+ const allSymbols = new Set<string>();
114
+ const allSources = new Set<string>();
115
+
116
+ for (const slice of sorted) {
117
+ if (slice.endLine && slice.endLine > endLine) {
118
+ endLine = slice.endLine;
119
+ }
120
+ for (const sym of slice.symbols ?? []) {
121
+ allSymbols.add(sym);
122
+ }
123
+ allSources.add(slice.source);
124
+ }
125
+
126
+ // Combine content from all slices
127
+ const combinedContent = sorted.map((s) => s.content).join("\n...\n");
128
+
129
+ return {
130
+ id: first.id,
131
+ kind: "source_file",
132
+ content: combinedContent,
133
+ source: [...allSources].join("; "),
134
+ priority: Math.max(
135
+ ...sorted.map((s) => s.priority),
136
+ ) as ContextCandidate["priority"],
137
+ required: sorted.some((s) => s.required),
138
+ trust: sorted.find((s) => s.trust === "authoritative")
139
+ ? "authoritative"
140
+ : sorted.find((s) => s.trust === "generated")
141
+ ? "generated"
142
+ : "unverified",
143
+ filePath,
144
+ startLine: first.startLine,
145
+ endLine,
146
+ symbols: [...allSymbols],
147
+ contentHash: sorted[0]?.contentHash,
148
+ };
149
+ }
150
+
151
+ /**
152
+ * Normalize content for deduplication comparison.
153
+ * Matches the RFC-0041 deduplication formula.
154
+ */
155
+ function normalizeContent(text: string): string {
156
+ return collapseWhitespace(stripMarkdownDecoration(text.toLowerCase()));
157
+ }
158
+
159
+ function collapseWhitespace(text: string): string {
160
+ return text.replace(/\s+/g, " ").trim();
161
+ }
162
+
163
+ function stripMarkdownDecoration(text: string): string {
164
+ return text
165
+ .replace(/\[([^\]]+)\]\(([^)]*)\)/g, "$1")
166
+ .replace(/!\[([^\]]*)\]\(([^)]*)\)/g, "$1")
167
+ .replace(/[#*_`~>[\]]/g, "")
168
+ .replace(/```[\s\S]*?```/g, "")
169
+ .replace(/`([^`]+)`/g, "$1")
170
+ .trim();
171
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Context Compiler - Policy Filter
3
+ *
4
+ * Enforces deny patterns and size limits before any other processing.
5
+ * This runs first so denied content never reaches the cache.
6
+ */
7
+
8
+ import type { ContextCandidate, ContextPolicy } from "./types.js";
9
+ import { DEFAULT_POLICY } from "./types.js";
10
+
11
+ /**
12
+ * Merge user policy with defaults.
13
+ */
14
+ export function mergePolicy(user?: Partial<ContextPolicy>): ContextPolicy {
15
+ if (!user) return { ...DEFAULT_POLICY };
16
+ return {
17
+ deny: user.deny ?? DEFAULT_POLICY.deny,
18
+ allowLargeFiles: user.allowLargeFiles ?? DEFAULT_POLICY.allowLargeFiles,
19
+ maxFileBytes: user.maxFileBytes ?? DEFAULT_POLICY.maxFileBytes,
20
+ trustThreshold: user.trustThreshold,
21
+ };
22
+ }
23
+
24
+ /**
25
+ * Apply policy filters to candidates.
26
+ * Denied and oversized candidates are marked as omitted.
27
+ * This is the first stage — nothing else runs before this.
28
+ *
29
+ * @returns [passed, denied] - denied candidates with policy_denied reason
30
+ */
31
+ export function applyPolicyFilter(
32
+ candidates: ContextCandidate[],
33
+ policy: ContextPolicy,
34
+ ): {
35
+ passed: ContextCandidate[];
36
+ denied: Array<{ candidate: ContextCandidate; reason: string }>;
37
+ } {
38
+ const passed: ContextCandidate[] = [];
39
+ const denied: Array<{ candidate: ContextCandidate; reason: string }> = [];
40
+
41
+ for (const candidate of candidates) {
42
+ // Check deny patterns
43
+ const denyReason = matchesDenyPattern(candidate, policy.deny);
44
+ if (denyReason) {
45
+ denied.push({ candidate, reason: denyReason });
46
+ continue;
47
+ }
48
+
49
+ // Check file size limit
50
+ if (candidate.filePath && candidate.content.length > policy.maxFileBytes) {
51
+ if (!policy.allowLargeFiles) {
52
+ denied.push({
53
+ candidate,
54
+ reason: `file exceeds ${policy.maxFileBytes} bytes`,
55
+ });
56
+ continue;
57
+ }
58
+ }
59
+
60
+ // Check trust threshold
61
+ if (
62
+ policy.trustThreshold &&
63
+ !meetsTrustThreshold(candidate.trust, policy.trustThreshold)
64
+ ) {
65
+ denied.push({
66
+ candidate,
67
+ reason: `trust level "${candidate.trust}" below threshold`,
68
+ });
69
+ continue;
70
+ }
71
+
72
+ passed.push(candidate);
73
+ }
74
+
75
+ return { passed, denied };
76
+ }
77
+
78
+ /**
79
+ * Check if a candidate matches any deny glob pattern.
80
+ */
81
+ function matchesDenyPattern(
82
+ candidate: ContextCandidate,
83
+ denyPatterns: string[],
84
+ ): string | null {
85
+ const path = candidate.filePath ?? candidate.source;
86
+
87
+ for (const pattern of denyPatterns) {
88
+ if (globMatch(pattern, path)) {
89
+ return `denied by pattern: ${pattern}`;
90
+ }
91
+ }
92
+
93
+ return null;
94
+ }
95
+
96
+ // Simple glob matching for **/*.env style patterns.
97
+ // Handles: *, **, and literal path separators.
98
+ function globMatch(pattern: string, path: string): boolean {
99
+ // Normalize: ensure we match relative paths like .env or /project/.env
100
+ const normalizedPath = path.replace(/^\.\//, "");
101
+ const normalizedPattern = pattern.replace(/^\*\//, "**/");
102
+
103
+ if (normalizedPattern === "**") return true;
104
+
105
+ // Convert glob to regex
106
+ const regexStr = normalizedPattern
107
+ .replace(/\./g, "\\.") // escape dots
108
+ .replace(/\*\*/g, "{{DOUBLE_STAR}}")
109
+ .replace(/\*/g, "[^/]*")
110
+ .replace(/\{\{DOUBLE_STAR\}\}/g, ".*")
111
+ .replace(/\?/g, "."); // single char
112
+
113
+ try {
114
+ const regex = new RegExp(`^${regexStr}$`);
115
+ return regex.test(normalizedPath) || regex.test(`/${normalizedPath}`);
116
+ } catch {
117
+ return false;
118
+ }
119
+ }
120
+
121
+ /**
122
+ * Check if candidate trust meets the threshold.
123
+ * "authoritative" > "generated" > "unverified"
124
+ */
125
+ function meetsTrustThreshold(
126
+ trust: ContextCandidate["trust"],
127
+ threshold: ContextCandidate["trust"],
128
+ ): boolean {
129
+ const levels: Record<ContextCandidate["trust"], number> = {
130
+ authoritative: 3,
131
+ generated: 2,
132
+ unverified: 1,
133
+ };
134
+ return levels[trust] >= levels[threshold];
135
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Context Compiler - Public API
3
+ *
4
+ * Bounded context selection engine for pi-harness-runtime.
5
+ *
6
+ * @example
7
+ * import { compileContext } from "@pi/context-compiler";
8
+ *
9
+ * const ctx = await compileContext({
10
+ * taskId: "task-001",
11
+ * taskObjective: "Add login feature to src/auth/login.ts",
12
+ * maximumTokens: 50_000,
13
+ * candidates: [...],
14
+ * });
15
+ */
16
+
17
+ export { compileContext } from "./compiler.js";
18
+ export { createClock } from "./compiler.js";
19
+ export type { Clock, CompiledContextOutput } from "./compiler.js";
20
+
21
+ export type {
22
+ ContextKind,
23
+ ContextTrust,
24
+ ContextCandidate,
25
+ OmissionReason,
26
+ OmittedItem,
27
+ CompiledContextItem,
28
+ ContextSourceEdge,
29
+ CompiledContext,
30
+ ScoringWeights,
31
+ ContextPolicy,
32
+ ContextCompileRequest,
33
+ InvalidationReason,
34
+ ContextInvalidation,
35
+ ContextCompileErrorCode,
36
+ } from "./types.js";
37
+
38
+ export { DEFAULT_SCORING_WEIGHTS, DEFAULT_POLICY } from "./types.js";
39
+ export { ContextCompileError } from "./types.js";
40
+
41
+ export { mergePolicy, applyPolicyFilter } from "./filter.js";
42
+ export { mergeWeights, rankCandidates } from "./score.js";
43
+ export {
44
+ deduplicateCandidates,
45
+ mergeFileSlices,
46
+ } from "./deduplicate.js";
47
+ export { fitToBudget, estimateTokens } from "./budget.js";
48
+ export {
49
+ generateCacheKey,
50
+ shouldInvalidate,
51
+ extractItemHashes,
52
+ } from "./cache.js";
53
+
54
+ // OKF integration
55
+ export { enrichWithOkf } from "./compiler.js";
56
+ export {
57
+ loadOkfConcepts,
58
+ okfDirectoryExists,
59
+ getOkfPath,
60
+ } from "./okf-loader.js";
61
+ export type { OkfConcept } from "./okf-loader.js";