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,464 @@
1
+ /**
2
+ * Context Window Manager — RFC-0010
3
+ *
4
+ * Manages context window usage across providers.
5
+ * Tracks utilization and suggests strategies when approaching limits.
6
+ *
7
+ * Enhanced with:
8
+ * - Compact thresholds (proactive at 85%, blocking at 97%)
9
+ * - Circuit breaker for consecutive compact failures
10
+ * - Buffer-aware token estimation
11
+ */
12
+
13
+ import type {
14
+ ContextWindowUpdate,
15
+ ContextWindowStats,
16
+ ContextWindowConfig,
17
+ ProviderMessage,
18
+ CompactableMessage,
19
+ } from "../packages/types/src/runtime-types.ts";
20
+ import {
21
+ roughTokenCount,
22
+ roughMessagesTokens,
23
+ } from "../packages/token-estimation/src/index.ts";
24
+
25
+ // --- Constants ----------------------------------------------------------------
26
+
27
+ /** Proactive compact triggers at this many tokens before limit */
28
+ export const AUTOCOMPACT_BUFFER_TOKENS = 13_000;
29
+
30
+ /** Warning threshold buffer */
31
+ export const WARNING_THRESHOLD_BUFFER_TOKENS = 20_000;
32
+
33
+ /** Blocking threshold buffer */
34
+ export const BLOCKING_THRESHOLD_BUFFER_TOKENS = 20_000;
35
+
36
+ /** Maximum consecutive compact failures before circuit breaker */
37
+ export const MAX_CONSECUTIVE_COMPACT_FAILURES = 3;
38
+
39
+ // --- Types ------------------------------------------------------------------
40
+
41
+ export interface CompactThresholds {
42
+ /** Trigger proactive compact at this utilization (0.85) */
43
+ autoCompactAt: number;
44
+ /** Show warning at this utilization (0.80) */
45
+ warningAt: number;
46
+ /** Block API calls at this utilization (0.97) */
47
+ blockingAt: number;
48
+ /** Max compact retry attempts */
49
+ maxRetries: number;
50
+ /** Reserved tokens for output during compact */
51
+ reservedOutputTokens: number;
52
+ }
53
+
54
+ export interface TokenEstimate {
55
+ total: number;
56
+ bufferRemaining: number;
57
+ utilizationPct: number;
58
+ atRisk: boolean;
59
+ shouldCompact: boolean;
60
+ shouldBlock: boolean;
61
+ }
62
+
63
+ // --- Context Window Manager -------------------------------------------------
64
+
65
+ export class ContextWindowManager {
66
+ private stats: Map<string, ContextWindowStats> = new Map();
67
+ private configs: Map<string, ContextWindowConfig> = new Map();
68
+ private consecutiveFailures = 0;
69
+ private lastCompactTimestamp = 0;
70
+ private modelContextWindows: Map<string, number> = new Map();
71
+
72
+ constructor(defaultConfigs?: Record<string, ContextWindowConfig>) {
73
+ // Initialize with defaults
74
+ const defaults: Record<string, ContextWindowConfig> = {
75
+ minimax: {
76
+ warningThreshold: 0.8,
77
+ criticalThreshold: 0.95,
78
+ strategy: "truncate",
79
+ },
80
+ anthropic: {
81
+ warningThreshold: 0.85,
82
+ criticalThreshold: 0.97,
83
+ strategy: "truncate",
84
+ },
85
+ openai: {
86
+ warningThreshold: 0.8,
87
+ criticalThreshold: 0.95,
88
+ strategy: "truncate",
89
+ },
90
+ ...defaultConfigs,
91
+ };
92
+
93
+ for (const [provider, config] of Object.entries(defaults)) {
94
+ this.configs.set(provider, config);
95
+ }
96
+ }
97
+
98
+ // --- Public API -----------------------------------------------------------
99
+
100
+ /**
101
+ * Update context window stats after a request
102
+ */
103
+ updateStats(update: ContextWindowUpdate): ContextWindowStats {
104
+ const { provider, model, maxTokens, usedTokens } = update;
105
+ const stats: ContextWindowStats = {
106
+ provider,
107
+ model,
108
+ maxTokens,
109
+ usedTokens,
110
+ availableTokens: maxTokens - usedTokens,
111
+ utilizationPct: usedTokens / maxTokens,
112
+ };
113
+ this.stats.set(`${provider}:${model}`, stats);
114
+ return stats;
115
+ }
116
+
117
+ /**
118
+ * Get stats for a provider/model
119
+ */
120
+ getStats(provider: string, model: string): ContextWindowStats | null {
121
+ return this.stats.get(`${provider}:${model}`) ?? null;
122
+ }
123
+
124
+ /**
125
+ * Get all stats
126
+ */
127
+ getAllStats(): ContextWindowStats[] {
128
+ return Array.from(this.stats.values());
129
+ }
130
+
131
+ /**
132
+ * Check utilization status
133
+ */
134
+ getUtilizationStatus(
135
+ provider: string,
136
+ model: string,
137
+ ): "ok" | "warning" | "critical" | "unknown" {
138
+ const stats = this.getStats(provider, model);
139
+ if (!stats) return "unknown";
140
+
141
+ const config = this.configs.get(provider);
142
+ if (!config) return "ok";
143
+
144
+ const pct = stats.utilizationPct;
145
+ if (pct >= config.criticalThreshold) return "critical";
146
+ if (pct >= config.warningThreshold) return "warning";
147
+ return "ok";
148
+ }
149
+
150
+ /**
151
+ * Get compact thresholds for a provider
152
+ */
153
+ getCompactThresholds(provider: string): CompactThresholds {
154
+ const config = this.configs.get(provider);
155
+ return {
156
+ autoCompactAt: 0.85,
157
+ warningAt: config?.warningThreshold ?? 0.8,
158
+ blockingAt: config?.criticalThreshold ?? 0.97,
159
+ maxRetries: MAX_CONSECUTIVE_COMPACT_FAILURES,
160
+ reservedOutputTokens: 20_000,
161
+ };
162
+ }
163
+
164
+ /**
165
+ * Get effective context window size (minus reserved output tokens)
166
+ */
167
+ getEffectiveContextWindow(provider: string, model: string): number {
168
+ const key = `${provider}:${model}`;
169
+ const base = this.modelContextWindows.get(key) ?? 200_000;
170
+ const thresholds = this.getCompactThresholds(provider);
171
+ return base - thresholds.reservedOutputTokens;
172
+ }
173
+
174
+ /**
175
+ * Set the context window size for a model
176
+ */
177
+ setContextWindow(provider: string, model: string, maxTokens: number): void {
178
+ this.modelContextWindows.set(`${provider}:${model}`, maxTokens);
179
+ }
180
+
181
+ /**
182
+ * Estimate remaining capacity
183
+ */
184
+ estimateRemainingRequests(
185
+ provider: string,
186
+ model: string,
187
+ avgTokensPerRequest: number,
188
+ ): number | null {
189
+ const stats = this.getStats(provider, model);
190
+ if (!stats) return null;
191
+ return Math.floor(stats.availableTokens / avgTokensPerRequest);
192
+ }
193
+
194
+ /**
195
+ * Estimate tokens with buffer awareness for compact decisions
196
+ */
197
+ estimateTokensWithBuffer(opts: {
198
+ messages: CompactableMessage[];
199
+ tools?: Array<{
200
+ name: string;
201
+ description?: string;
202
+ input_schema?: Record<string, unknown>;
203
+ }>;
204
+ systemPrompt?: string;
205
+ provider: string;
206
+ model: string;
207
+ }): TokenEstimate {
208
+ const { messages, tools, systemPrompt, provider, model } = opts;
209
+
210
+ // Calculate message tokens
211
+ const messageTokens = roughMessagesTokens(
212
+ messages.map((m) => ({
213
+ role: m.role,
214
+ content: m.content,
215
+ })),
216
+ );
217
+
218
+ // Calculate tool tokens
219
+ const toolTokens = (tools ?? []).reduce(
220
+ (sum, tool) =>
221
+ sum +
222
+ roughTokenCount(tool.name) +
223
+ roughTokenCount(tool.description ?? "") +
224
+ roughTokenCount(JSON.stringify(tool.input_schema ?? {})),
225
+ 0,
226
+ );
227
+
228
+ // Calculate system prompt tokens
229
+ const systemTokens = systemPrompt ? roughTokenCount(systemPrompt) : 0;
230
+
231
+ const total = messageTokens + toolTokens + systemTokens;
232
+ const effectiveWindow = this.getEffectiveContextWindow(provider, model);
233
+ const bufferRemaining = effectiveWindow - total;
234
+
235
+ // Determine if we should compact or block
236
+ const autoCompactTokens = effectiveWindow - AUTOCOMPACT_BUFFER_TOKENS;
237
+ const blockingTokens = effectiveWindow - BLOCKING_THRESHOLD_BUFFER_TOKENS;
238
+
239
+ const shouldCompact = total >= autoCompactTokens;
240
+ const shouldBlock = total >= blockingTokens;
241
+
242
+ return {
243
+ total,
244
+ bufferRemaining,
245
+ utilizationPct: total / effectiveWindow,
246
+ atRisk: bufferRemaining < AUTOCOMPACT_BUFFER_TOKENS,
247
+ shouldCompact,
248
+ shouldBlock,
249
+ };
250
+ }
251
+
252
+ /**
253
+ * Check if we should trigger proactive compact
254
+ */
255
+ shouldProactiveCompact(estimate: TokenEstimate): boolean {
256
+ return estimate.shouldCompact && !this.shouldCircuitBreak();
257
+ }
258
+
259
+ /**
260
+ * Check if we should block (must compact before API call)
261
+ */
262
+ shouldBlockApiCall(estimate: TokenEstimate): boolean {
263
+ return estimate.shouldBlock;
264
+ }
265
+
266
+ /**
267
+ * Record a compact failure (for circuit breaker)
268
+ */
269
+ recordCompactFailure(): number {
270
+ this.consecutiveFailures++;
271
+ return this.consecutiveFailures;
272
+ }
273
+
274
+ /**
275
+ * Record a compact success (reset circuit breaker)
276
+ */
277
+ recordCompactSuccess(): void {
278
+ this.consecutiveFailures = 0;
279
+ this.lastCompactTimestamp = Date.now();
280
+ }
281
+
282
+ /**
283
+ * Check if circuit breaker should activate
284
+ */
285
+ shouldCircuitBreak(): boolean {
286
+ return this.consecutiveFailures >= MAX_CONSECUTIVE_COMPACT_FAILURES;
287
+ }
288
+
289
+ /**
290
+ * Get consecutive failure count
291
+ */
292
+ getConsecutiveFailures(): number {
293
+ return this.consecutiveFailures;
294
+ }
295
+
296
+ /**
297
+ * Reset circuit breaker
298
+ */
299
+ resetCircuitBreaker(): void {
300
+ this.consecutiveFailures = 0;
301
+ }
302
+
303
+ /**
304
+ * Get time since last compact (ms)
305
+ */
306
+ getTimeSinceLastCompact(): number {
307
+ return Date.now() - this.lastCompactTimestamp;
308
+ }
309
+
310
+ /**
311
+ * Prepare messages for a request (truncation/summarization strategy)
312
+ */
313
+ prepareMessages(
314
+ messages: ProviderMessage[],
315
+ maxTokens: number,
316
+ strategy: "truncate" | "summarize" | "split" = "truncate",
317
+ ): ProviderMessage[] {
318
+ const estimateTokens = (text: string) => Math.ceil(text.length / 4);
319
+ let totalTokens = messages.reduce(
320
+ (sum, m) => sum + estimateTokens(m.content),
321
+ 0,
322
+ );
323
+
324
+ if (totalTokens <= maxTokens) {
325
+ return messages;
326
+ }
327
+
328
+ if (strategy === "truncate") {
329
+ // Remove oldest messages first
330
+ const truncated = [...messages];
331
+ while (totalTokens > maxTokens && truncated.length > 1) {
332
+ const removed = truncated.shift();
333
+ if (removed) {
334
+ totalTokens -= estimateTokens(removed.content);
335
+ }
336
+ }
337
+ return truncated;
338
+ }
339
+
340
+ // summarize and split both fall back to truncate for now
341
+ // In a real implementation, split would return multiple message batches
342
+ return this.prepareMessages(messages, maxTokens, "truncate");
343
+ }
344
+
345
+ /**
346
+ * Set config for a provider
347
+ */
348
+ setConfig(provider: string, config: ContextWindowConfig): void {
349
+ this.configs.set(provider, config);
350
+ }
351
+
352
+ /**
353
+ * Get config for a provider
354
+ */
355
+ getConfig(provider: string): ContextWindowConfig | undefined {
356
+ return this.configs.get(provider);
357
+ }
358
+
359
+ /**
360
+ * Generate utilization report
361
+ */
362
+ generateReport(): string {
363
+ const lines = ["Context Window Utilization Report", "=".repeat(40), ""];
364
+
365
+ for (const [, stats] of this.stats.entries()) {
366
+ const config = this.configs.get(stats.provider);
367
+ const bar = this.renderBar(stats.utilizationPct);
368
+ const status = this.getUtilizationStatus(stats.provider, stats.model);
369
+
370
+ lines.push(`${stats.provider}/${stats.model}`);
371
+ lines.push(` ${bar} ${(stats.utilizationPct * 100).toFixed(1)}%`);
372
+ lines.push(
373
+ ` Used: ${stats.usedTokens.toLocaleString()} / ${stats.maxTokens.toLocaleString()} tokens`,
374
+ );
375
+ lines.push(
376
+ ` Available: ${stats.availableTokens.toLocaleString()} tokens`,
377
+ );
378
+ lines.push(` Status: ${status.toUpperCase()}`);
379
+ if (config) {
380
+ lines.push(
381
+ ` Thresholds: warning=${(config.warningThreshold * 100).toFixed(0)}%, critical=${(config.criticalThreshold * 100).toFixed(0)}%`,
382
+ );
383
+ }
384
+ lines.push("");
385
+ }
386
+
387
+ // Add circuit breaker status
388
+ lines.push("Circuit Breaker Status", "-".repeat(20));
389
+ lines.push(`Consecutive failures: ${this.consecutiveFailures}`);
390
+ lines.push(`Circuit broken: ${this.shouldCircuitBreak() ? "YES ⚠️" : "No"}`);
391
+
392
+ return lines.join("\n");
393
+ }
394
+
395
+ private renderBar(pct: number, width: number = 20): string {
396
+ const filled = Math.round(pct * width);
397
+ const empty = width - filled;
398
+ return "[" + "█".repeat(filled) + "░".repeat(empty) + "]";
399
+ }
400
+ }
401
+
402
+ // --- Microcompact Helpers ---------------------------------------------------
403
+
404
+ /**
405
+ * Microcompact: prune old tool results based on time gap.
406
+ * Returns the number of tokens freed.
407
+ */
408
+ export function microcompactToolResults(
409
+ messages: CompactableMessage[],
410
+ options: {
411
+ maxAgeMs?: number;
412
+ keepRecent?: number;
413
+ } = {},
414
+ ): number {
415
+ const maxAgeMs = options.maxAgeMs ?? 30 * 60 * 1000; // 30 minutes
416
+ const keepRecent = options.keepRecent ?? 2;
417
+
418
+ const now = Date.now();
419
+ let freedTokens = 0;
420
+
421
+ for (const msg of messages) {
422
+ if (msg.role !== "assistant" || !msg.toolResults) continue;
423
+
424
+ // Sort by timestamp, newest first
425
+ const sorted = [...msg.toolResults].sort(
426
+ (a, b) => b.timestamp - a.timestamp,
427
+ );
428
+
429
+ // Keep IDs of recent tool results
430
+ const keepIds = new Set(sorted.slice(0, keepRecent).map((r) => r.id));
431
+
432
+ // Prune old ones
433
+ for (const tr of msg.toolResults) {
434
+ if (!keepIds.has(tr.id) && now - tr.timestamp > maxAgeMs) {
435
+ freedTokens += tr.tokens;
436
+ // Truncate content but keep marker
437
+ tr.content = "[Old tool result cleared]";
438
+ tr.tokens = 0;
439
+ }
440
+ }
441
+ }
442
+
443
+ return freedTokens;
444
+ }
445
+
446
+ /**
447
+ * Parse token gap from a prompt-too-long error message.
448
+ * Returns the gap (excess tokens) or undefined if unparseable.
449
+ */
450
+ export function parseTokenGapFromError(
451
+ errorMessage: string,
452
+ ): number | undefined {
453
+ // Match patterns like: "137500 tokens > 135000 maximum"
454
+ const match = errorMessage.match(
455
+ /prompt is too long[^0-9]*(\d+)\s*tokens?\s*>\s*(\d+)/i,
456
+ );
457
+ if (match) {
458
+ const actual = parseInt(match[1], 10);
459
+ const limit = parseInt(match[2], 10);
460
+ const gap = actual - limit;
461
+ return gap > 0 ? gap : undefined;
462
+ }
463
+ return undefined;
464
+ }
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Continue Prompt Generator — RFC-0029
3
+ *
4
+ * Generates context-aware continue prompts after compaction.
5
+ * Based on the reference implementation's buildContinuePrompt() pattern.
6
+ */
7
+
8
+ import type { CompactableMessage } from "../packages/types/src/runtime-types.js";
9
+
10
+ // --- Types ------------------------------------------------------------------
11
+
12
+ export interface ContinueContext {
13
+ /** Task identifier */
14
+ taskId: string;
15
+ /** Original task requirement */
16
+ requirement: string;
17
+ /** What was already completed */
18
+ whatWasCompleted: string[];
19
+ /** What still needs to be done */
20
+ whatNeedsToBeDone: string[];
21
+ /** Files that may have partial content */
22
+ partialFiles: string[];
23
+ /** Key decisions made */
24
+ decisions: string[];
25
+ /** Suggested next step */
26
+ nextStep?: string;
27
+ /** Current working directory */
28
+ workingDir?: string;
29
+ }
30
+
31
+ export interface MinimalContinueContext {
32
+ /** LLM-generated summary */
33
+ summary: string;
34
+ /** Recent messages to preserve */
35
+ recentMessages: CompactableMessage[];
36
+ }
37
+
38
+ // --- Continue Prompt Generator -----------------------------------------------
39
+
40
+ export class ContinuePromptGenerator {
41
+ /**
42
+ * Generate a comprehensive continue prompt for post-compact resume
43
+ */
44
+ generate(context: ContinueContext): string {
45
+ const parts: string[] = [
46
+ "# Continue Previous Task",
47
+ "",
48
+ "## Task",
49
+ context.requirement,
50
+ "",
51
+ ];
52
+
53
+ if (context.whatWasCompleted.length > 0) {
54
+ parts.push("## What Was Completed");
55
+ for (const item of context.whatWasCompleted) {
56
+ parts.push(`- ${item}`);
57
+ }
58
+ parts.push("");
59
+ }
60
+
61
+ if (context.partialFiles.length > 0) {
62
+ parts.push("## Partial Files Created");
63
+ parts.push("Review these files — they may contain incomplete work:");
64
+ for (const file of context.partialFiles) {
65
+ parts.push(`- ${file}`);
66
+ }
67
+ parts.push("");
68
+ }
69
+
70
+ if (context.decisions.length > 0) {
71
+ parts.push("## Key Decisions");
72
+ for (const decision of context.decisions) {
73
+ parts.push(`- ${decision}`);
74
+ }
75
+ parts.push("");
76
+ }
77
+
78
+ if (context.whatNeedsToBeDone.length > 0) {
79
+ parts.push("## What Needs To Be Done");
80
+ for (const item of context.whatNeedsToBeDone) {
81
+ parts.push(`- ${item}`);
82
+ }
83
+ parts.push("");
84
+ }
85
+
86
+ parts.push(
87
+ "## Instructions",
88
+ "",
89
+ "1. Review any partial files created above",
90
+ "2. Continue from where the previous session ended",
91
+ "3. Complete the remaining work listed in 'What Needs To Be Done'",
92
+ "4. Ensure all tests pass before marking complete",
93
+ "",
94
+ "**Do not repeat work that was already completed.**",
95
+ "",
96
+ );
97
+
98
+ if (context.nextStep) {
99
+ parts.push("## Suggested Next Step");
100
+ parts.push(context.nextStep);
101
+ }
102
+
103
+ if (context.workingDir) {
104
+ parts.push("", `Working directory: \`${context.workingDir}\``);
105
+ }
106
+
107
+ return parts.join("\n");
108
+ }
109
+
110
+ /**
111
+ * Generate a minimal continue message for quick resume
112
+ */
113
+ generateMinimal(context: MinimalContinueContext): string {
114
+ const recent = context.recentMessages
115
+ .slice(-5)
116
+ .map((m) => `[${m.role}]\n${this.truncateContent(m.content, 500)}`)
117
+ .join("\n\n");
118
+
119
+ return [
120
+ "Continue from where you left off.",
121
+ "",
122
+ "## Summary of Earlier Work",
123
+ context.summary,
124
+ "",
125
+ "## Recent Context",
126
+ recent,
127
+ "",
128
+ "**Do not repeat work already done.** Focus on completing the remaining work.",
129
+ ].join("\n");
130
+ }
131
+
132
+ /**
133
+ * Generate a compact boundary message for message history
134
+ */
135
+ generateBoundary(options: {
136
+ summary: string;
137
+ reason: string;
138
+ messagesCompacted: number;
139
+ }): string {
140
+ return [
141
+ "## Earlier Conversation Summarized",
142
+ "",
143
+ `[Compacted due to: ${options.reason}]`,
144
+ `[${options.messagesCompacted} messages summarized]`,
145
+ "",
146
+ options.summary,
147
+ "",
148
+ "## Resume Point",
149
+ "Continue from the messages below.",
150
+ ].join("\n");
151
+ }
152
+
153
+ /**
154
+ * Extract continue context from compact result
155
+ */
156
+ static fromCompactResult(
157
+ result: {
158
+ summary?: string;
159
+ messagesCompacted: number;
160
+ trigger: string;
161
+ },
162
+ task: {
163
+ id: string;
164
+ requirement: string;
165
+ },
166
+ ): ContinueContext {
167
+ return {
168
+ taskId: task.id,
169
+ requirement: task.requirement,
170
+ whatWasCompleted: result.summary
171
+ ? ContinuePromptGenerator.extractCompletedWork(result.summary)
172
+ : [],
173
+ whatNeedsToBeDone: ["Continue from where the conversation was compacted"],
174
+ partialFiles: [],
175
+ decisions: result.summary
176
+ ? ContinuePromptGenerator.extractDecisions(result.summary)
177
+ : [],
178
+ };
179
+ }
180
+
181
+ /**
182
+ * Extract completed work items from summary text
183
+ */
184
+ private static extractCompletedWork(summary: string): string[] {
185
+ const completed: string[] = [];
186
+
187
+ // Look for patterns indicating completed work
188
+ const patterns = [
189
+ /completed?:?\s*([^\n.]+)/gi,
190
+ /created?:?\s*([^\n.]+)/gi,
191
+ /implemented?:?\s*([^\n.]+)/gi,
192
+ /fixed?:?\s*([^\n.]+)/gi,
193
+ /passed?:?\s*([^\n.]+)/gi,
194
+ ];
195
+
196
+ for (const pattern of patterns) {
197
+ for (const match of summary.matchAll(pattern)) {
198
+ if (match[1]) {
199
+ completed.push(match[1].trim());
200
+ }
201
+ }
202
+ }
203
+
204
+ return completed.slice(0, 5);
205
+ }
206
+
207
+ /**
208
+ * Extract decisions from summary text
209
+ */
210
+ private static extractDecisions(summary: string): string[] {
211
+ const decisions: string[] = [];
212
+
213
+ const patterns = [
214
+ /decided?:?\s*([^\n.]+)/gi,
215
+ /chose?:?\s*([^\n.]+)/gi,
216
+ /approach?:?\s*([^\n.]+)/gi,
217
+ /using?:?\s*([^\n.]+)/gi,
218
+ ];
219
+
220
+ for (const pattern of patterns) {
221
+ for (const match of summary.matchAll(pattern)) {
222
+ if (match[1]) {
223
+ decisions.push(match[1].trim());
224
+ }
225
+ }
226
+ }
227
+
228
+ return decisions.slice(0, 5);
229
+ }
230
+
231
+ /**
232
+ * Truncate content to max length
233
+ */
234
+ private truncateContent(content: string, maxLength: number): string {
235
+ if (content.length <= maxLength) return content;
236
+ return content.substring(0, maxLength) + "... [truncated]";
237
+ }
238
+ }
239
+
240
+ // --- Singleton Instance ------------------------------------------------------
241
+
242
+ export const continuePromptGenerator = new ContinuePromptGenerator();