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,609 @@
1
+ /**
2
+ * MiniMax Quota Scraper — RFC-0031
3
+ *
4
+ * Automatically fetches quota data from MiniMax console using Playwright.
5
+ * Uses cookie-based authentication to access the usage page.
6
+ *
7
+ * Based on the tactic in pi-harness-runtime/AGENTS.md:
8
+ * - Cookie-backed fetch returns static HTML only
9
+ * - Must use headless Playwright with injected cookies
10
+ * - Capture API responses for usage data
11
+ */
12
+
13
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
14
+ import { join } from "node:path";
15
+ import { homedir } from "node:os";
16
+ import { parseMiniMaxQuotaText } from "./minimax-quota-parser.js";
17
+
18
+ export interface MiniMaxQuotaData {
19
+ provider: "minimax";
20
+ /** 5-hour window usage percentage (0-100) */
21
+ h5UsedPct: number;
22
+ /** When the 5h window resets (e.g., "in 4 hr 56 min") */
23
+ h5ResetsAt?: string;
24
+ /** Epoch ms when the 5h window resets — precise UTC timestamp. */
25
+ h5ResetsAtEpoch?: number;
26
+ /** Weekly usage percentage (0-100) */
27
+ weeklyUsedPct: number;
28
+ /** When the weekly window resets */
29
+ weeklyResetsAt?: string;
30
+ /** Epoch ms when the weekly window resets — precise UTC timestamp. */
31
+ weeklyResetsAtEpoch?: number;
32
+ /** Monthly usage percentage (0-100) */
33
+ monthlyUsedPct?: number;
34
+ /** When the monthly window resets */
35
+ monthlyResetsAt?: string;
36
+ /** Credit balance remaining */
37
+ creditBalance?: string;
38
+ /** Token usage stats */
39
+ tokenUsage?: {
40
+ currentMonth: string;
41
+ last7Days: string;
42
+ last30Days: string;
43
+ total: string;
44
+ };
45
+ /** Raw API responses captured */
46
+ apiEndpoints?: string[];
47
+ /** Timestamp of scrape */
48
+ scrapedAt: string;
49
+ }
50
+
51
+ export interface MiniMaxScraperConfig {
52
+ /** Path to Netscape-format cookie file */
53
+ cookieFile?: string;
54
+ /** MiniMax console URL */
55
+ url?: string;
56
+ /** Headless mode (default: true) */
57
+ headless?: boolean;
58
+ /** Timeout in ms (default: 90000) */
59
+ timeout?: number;
60
+ /** Chrome executable path (optional) */
61
+ chromePath?: string;
62
+ /** Suppress console output — for background/auto-fetch use */
63
+ quiet?: boolean;
64
+ }
65
+
66
+ const DEFAULT_URL = "https://platform.minimax.io/console/usage?cycle_type=1";
67
+ const DEFAULT_COOKIE_FILE = join(homedir(), ".config", "minimax-cookies.txt");
68
+
69
+ // API endpoints to capture
70
+ const API_TERMS = [
71
+ "api",
72
+ "usage",
73
+ "billing",
74
+ "quota",
75
+ "consumption",
76
+ "recharge",
77
+ "resource",
78
+ "plan",
79
+ "subscription",
80
+ "token_plan",
81
+ ];
82
+
83
+ /**
84
+ * Load Netscape-format cookies from file
85
+ */
86
+ function loadNetscapeCookies(path: string): Array<{
87
+ name: string;
88
+ value: string;
89
+ domain: string;
90
+ path: string;
91
+ secure: boolean;
92
+ httpOnly: boolean;
93
+ expires?: number;
94
+ }> {
95
+ const cookies: Array<{
96
+ name: string;
97
+ value: string;
98
+ domain: string;
99
+ path: string;
100
+ secure: boolean;
101
+ httpOnly: boolean;
102
+ expires?: number;
103
+ }> = [];
104
+
105
+ if (!existsSync(path)) {
106
+ return cookies;
107
+ }
108
+
109
+ const lines = readFileSync(path, "utf-8").split("\n");
110
+ for (const line of lines) {
111
+ if (!line || (line.startsWith("#") && !line.startsWith("#HttpOnly_"))) {
112
+ continue;
113
+ }
114
+
115
+ let httpOnly = false;
116
+ let trimmed = line;
117
+ if (trimmed.startsWith("#HttpOnly_")) {
118
+ httpOnly = true;
119
+ trimmed = trimmed.slice("#HttpOnly_".length);
120
+ }
121
+
122
+ const parts = trimmed.split("\t");
123
+ if (parts.length < 7) continue;
124
+
125
+ const [domain, _flag, cookiePath, secure, expires, name, value] = parts;
126
+
127
+ cookies.push({
128
+ name,
129
+ value,
130
+ domain,
131
+ path: cookiePath || "/",
132
+ secure: secure.toUpperCase() === "TRUE",
133
+ httpOnly,
134
+ expires: parseInt(expires, 10) || undefined,
135
+ });
136
+ }
137
+
138
+ return cookies;
139
+ }
140
+
141
+ /**
142
+ * Redact sensitive values from text
143
+ */
144
+ function redact(text: string): string {
145
+ return text
146
+ .replace(
147
+ /eyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{10,}/g,
148
+ "[JWT_REDACTED]",
149
+ )
150
+ .replace(
151
+ /api[_ -]?key|access[_ -]?token|refresh[_ -]?token|authorization|cookie|session|secret/gi,
152
+ (match) => `${match}=[REDACTED]`,
153
+ )
154
+ .replace(/Bearer\s+[A-Za-z0-9._-]+/gi, "Bearer [REDACTED]");
155
+ }
156
+
157
+ /**
158
+ * Parse a percentage string like "50%" or "2%" into a number.
159
+ */
160
+ function parsePctStr(value: unknown): number | undefined {
161
+ if (typeof value !== "string") return undefined;
162
+ const m = value.match(/(\d+(?:\.\d+)?)/);
163
+ return m ? parseFloat(m[1]) : undefined;
164
+ }
165
+
166
+ /**
167
+ * Format remaining time until an epoch-ms deadline (e.g. "4 hr 37 min").
168
+ */
169
+ function formatRemainsMs(epochMs: number | undefined): string | undefined {
170
+ if (typeof epochMs !== "number" || epochMs <= 0) return undefined;
171
+ const ms = epochMs - Date.now();
172
+ if (ms <= 0) return "soon";
173
+ const totalMin = Math.floor(ms / 60000);
174
+ const days = Math.floor(totalMin / 1440);
175
+ const hr = Math.floor((totalMin % 1440) / 60);
176
+ const min = totalMin % 60;
177
+ const parts: string[] = [];
178
+ if (days > 0) parts.push(`${days} day${days > 1 ? "s" : ""}`);
179
+ if (hr > 0) parts.push(`${hr} hr`);
180
+ if (min > 0) parts.push(`${min} min`);
181
+ return parts.join(" ") || "0 min";
182
+ }
183
+
184
+ /**
185
+ * MiniMax Quota Scraper
186
+ *
187
+ * Uses headless Playwright to fetch quota data from the MiniMax console.
188
+ */
189
+ export class MiniMaxQuotaScraper {
190
+ private readonly config: Required<MiniMaxScraperConfig>;
191
+ private capturedEndpoints: string[] = [];
192
+
193
+ constructor(config: MiniMaxScraperConfig = {}) {
194
+ this.config = {
195
+ cookieFile: config.cookieFile ?? DEFAULT_COOKIE_FILE,
196
+ url: config.url ?? DEFAULT_URL,
197
+ headless: config.headless ?? true,
198
+ timeout: config.timeout ?? 90000,
199
+ chromePath: config.chromePath ?? "",
200
+ quiet: config.quiet ?? false,
201
+ };
202
+ }
203
+
204
+ /**
205
+ * Set cookie file path
206
+ */
207
+ setCookieFile(path: string): this {
208
+ this.config.cookieFile = path;
209
+ return this;
210
+ }
211
+
212
+ /**
213
+ * Enable/disable quiet mode
214
+ */
215
+ setQuiet(quiet: boolean): this {
216
+ this.config.quiet = quiet;
217
+ return this;
218
+ }
219
+
220
+ /**
221
+ * Set MiniMax console URL
222
+ */
223
+ setUrl(url: string): this {
224
+ this.config.url = url;
225
+ return this;
226
+ }
227
+
228
+ /**
229
+ * Scrape quota data. Tries the direct MiniMax API first (fast, no
230
+ * browser — ~200ms), then falls back to a headless browser scrape.
231
+ */
232
+ async scrape(): Promise<MiniMaxQuotaData> {
233
+ try {
234
+ const apiData = await this.scrapeViaDirectApi();
235
+ if (apiData) {
236
+ if (!this.config.quiet) {
237
+ // console.log("[MiniMaxQuotaScraper] direct API success");
238
+ }
239
+ return apiData;
240
+ }
241
+ if (!this.config.quiet) {
242
+ // console.log(
243
+ // "[MiniMaxQuotaScraper] direct API unavailable, falling back to browser",
244
+ // );
245
+ }
246
+ } catch (error) {
247
+ if (!this.config.quiet) {
248
+ console.warn(
249
+ "[MiniMaxQuotaScraper] direct API failed:",
250
+ error instanceof Error ? error.message : String(error),
251
+ );
252
+ }
253
+ }
254
+ return this.scrapeViaBrowser();
255
+ }
256
+
257
+ /**
258
+ * Fetch quota directly from the MiniMax API using cookies (no browser).
259
+ * Uses the same cookie file as the browser path. Returns null when not
260
+ * authenticated so the caller can decide whether to fall back.
261
+ */
262
+ private async scrapeViaDirectApi(): Promise<MiniMaxQuotaData | null> {
263
+ const cookies = loadNetscapeCookies(this.config.cookieFile!);
264
+ if (cookies.length === 0) return null;
265
+
266
+ const cookieHeader = cookies
267
+ .map((c) => `${c.name}=${String(c.value).trim()}`)
268
+ .join("; ");
269
+
270
+ const headers: Record<string, string> = {
271
+ Cookie: cookieHeader,
272
+ Accept: "application/json, text/plain, */*",
273
+ "User-Agent": "Mozilla/5.0",
274
+ Referer: "https://platform.minimax.io/console/usage",
275
+ };
276
+ const base = "https://platform.minimax.io";
277
+
278
+ // Primary: remains_percent gives 5h + weekly used % and reset times
279
+ let general: Record<string, unknown> | null = null;
280
+ try {
281
+ const resp = await fetch(
282
+ `${base}/backend/account/token_plan/remains_percent`,
283
+ { headers },
284
+ );
285
+ if (resp.ok) {
286
+ const json = (await resp.json()) as {
287
+ model_remains?: Array<Record<string, unknown>>;
288
+ };
289
+ const arr = json?.model_remains;
290
+ if (Array.isArray(arr)) {
291
+ general =
292
+ arr.find((m) => m.model_name === "general") ?? arr[0] ?? null;
293
+ }
294
+ }
295
+ } catch {
296
+ /* fall through to null */
297
+ }
298
+
299
+ // Not authenticated (or request failed) → no data
300
+ if (!general) return null;
301
+
302
+ const h5UsedPct = parsePctStr(
303
+ general.current_interval_used_percent as unknown,
304
+ );
305
+ const weeklyUsedPct = parsePctStr(
306
+ general.current_weekly_used_percent as unknown,
307
+ );
308
+ const h5ResetsAtEpoch = general.end_time as number | undefined;
309
+ const h5ResetsAt = formatRemainsMs(h5ResetsAtEpoch);
310
+ const weeklyResetsAtEpoch = general.weekly_end_time as number | undefined;
311
+ const weeklyResetsAt = formatRemainsMs(weeklyResetsAtEpoch);
312
+
313
+ // Best-effort: token usage summary
314
+ let tokenUsage: MiniMaxQuotaData["tokenUsage"];
315
+ try {
316
+ const resp = await fetch(
317
+ `${base}/backend/account/token_plan/usage_summary`,
318
+ { headers },
319
+ );
320
+ if (resp.ok) {
321
+ const json = (await resp.json()) as {
322
+ total_token_consumed?: string;
323
+ };
324
+ if (json?.total_token_consumed) {
325
+ tokenUsage = {
326
+ total: json.total_token_consumed,
327
+ last30Days: "",
328
+ last7Days: "",
329
+ currentMonth: "",
330
+ };
331
+ }
332
+ }
333
+ } catch {
334
+ /* best-effort */
335
+ }
336
+
337
+ // Best-effort: credit balance. NOTE: the API response includes an
338
+ // `api_key` field — we deliberately do NOT read or persist it.
339
+ let creditBalance: string | undefined;
340
+ try {
341
+ const resp = await fetch(`${base}/backend/account/token_plan_credit`, {
342
+ headers,
343
+ });
344
+ if (resp.ok) {
345
+ const json = (await resp.json()) as {
346
+ remaining_credits?: number;
347
+ total_credits?: number;
348
+ };
349
+ if (
350
+ typeof json?.remaining_credits === "number" &&
351
+ typeof json?.total_credits === "number"
352
+ ) {
353
+ creditBalance = `${json.remaining_credits} / ${json.total_credits}`;
354
+ }
355
+ }
356
+ } catch {
357
+ /* best-effort */
358
+ }
359
+
360
+ return {
361
+ provider: "minimax",
362
+ h5UsedPct: h5UsedPct ?? 0,
363
+ h5ResetsAt,
364
+ h5ResetsAtEpoch,
365
+ weeklyUsedPct: weeklyUsedPct ?? 0,
366
+ weeklyResetsAt,
367
+ weeklyResetsAtEpoch,
368
+ creditBalance,
369
+ tokenUsage,
370
+ apiEndpoints: [
371
+ `${base}/backend/account/token_plan/remains_percent`,
372
+ `${base}/backend/account/token_plan/usage_summary`,
373
+ `${base}/backend/account/token_plan_credit`,
374
+ ],
375
+ scrapedAt: new Date().toISOString(),
376
+ };
377
+ }
378
+
379
+ /**
380
+ * Scrape quota data from MiniMax console using a headless browser.
381
+ */
382
+ private async scrapeViaBrowser(): Promise<MiniMaxQuotaData> {
383
+ // Dynamic import for Playwright
384
+ let playwright: typeof import("playwright") | null = null;
385
+ try {
386
+ playwright = await import("playwright");
387
+ } catch {
388
+ const msg =
389
+ "Playwright not installed. Install with: bun add playwright\nThen install browsers: bunx playwright install chromium";
390
+ if (!this.config.quiet)
391
+ console.error("[DEBUG MiniMaxQuotaScraper] " + msg);
392
+ throw new Error(msg);
393
+ }
394
+
395
+ // Pre-load the canonical cache so that the runtime-owned file
396
+ // (written by packages/cookie-sanitizer) takes precedence over
397
+ // whatever `this.config.cookieFile` points at. Both eventually
398
+ // resolve to the same standard Netscape format.
399
+ const cookies = loadNetscapeCookies(this.config.cookieFile!);
400
+
401
+ if (cookies.length === 0) {
402
+ const dropHint = join(homedir(), ".pi-harness-runtime", "cookies");
403
+ const msg = `No cookies found.
404
+ Drop your platform.minimax.io cookies (Netscape or EditThisCookie JSON) into:
405
+ ${dropHint}
406
+ …or run: bun packages/auth/src/run-minimax-auth.ts auth`;
407
+ if (!this.config.quiet) console.error(`[MiniMaxQuotaScraper] ${msg}`);
408
+ throw new Error(msg);
409
+ }
410
+
411
+ // Launch browser
412
+ const browser = await playwright.chromium.launch({
413
+ executablePath: this.config.chromePath,
414
+ headless: this.config.headless,
415
+ args: ["--no-sandbox", "--disable-dev-shm-usage"],
416
+ });
417
+
418
+ const context = await browser.newContext({
419
+ locale: "en-US",
420
+ viewport: { width: 1440, height: 1000 },
421
+ });
422
+
423
+ // Inject cookies
424
+ await context.addCookies(cookies);
425
+
426
+ const page = await context.newPage();
427
+ const capturedResponses: Array<{
428
+ url: string;
429
+ body: string;
430
+ }> = [];
431
+
432
+ // Capture API responses
433
+ page.on("response", (resp) => {
434
+ const url = resp.url();
435
+ if (API_TERMS.some((term) => url.toLowerCase().includes(term))) {
436
+ capturedResponses.push({
437
+ url,
438
+ body: "",
439
+ });
440
+ // We capture the URL, body will be fetched later
441
+ }
442
+ });
443
+
444
+ try {
445
+ // Navigate to usage page
446
+ await page.goto(this.config.url!, {
447
+ waitUntil: "domcontentloaded",
448
+ timeout: this.config.timeout,
449
+ });
450
+
451
+ // Wait for content to load
452
+ try {
453
+ await page.waitForLoadState("networkidle", { timeout: 45000 });
454
+ } catch {
455
+ // Network idle might not be achievable
456
+ }
457
+
458
+ // Additional wait for JS rendering
459
+ await page.waitForTimeout(5000);
460
+
461
+ // Extract visible text
462
+ const visibleText = redact(
463
+ await page.locator("body").innerText({ timeout: 10000 }),
464
+ );
465
+
466
+ // Parse the visible text
467
+ const quotaData = parseMiniMaxQuotaText(visibleText);
468
+
469
+ // Capture API endpoint URLs
470
+ this.capturedEndpoints = capturedResponses.map((r) => r.url);
471
+
472
+ const result: MiniMaxQuotaData = {
473
+ provider: "minimax",
474
+ h5UsedPct: quotaData.h5UsedPct ?? 0,
475
+ h5ResetsAt: quotaData.h5ResetsAt,
476
+ weeklyUsedPct: quotaData.weeklyUsedPct ?? 0,
477
+ weeklyResetsAt: quotaData.weeklyResetsAt,
478
+ monthlyUsedPct: quotaData.monthlyUsedPct,
479
+ monthlyResetsAt: quotaData.monthlyResetsAt,
480
+ creditBalance: quotaData.creditBalance,
481
+ tokenUsage: quotaData.tokenUsage,
482
+ apiEndpoints: this.capturedEndpoints,
483
+ scrapedAt: new Date().toISOString(),
484
+ };
485
+ return result;
486
+ } finally {
487
+ await browser.close();
488
+ }
489
+ }
490
+
491
+ /**
492
+ * Check if any cookie source exists.
493
+ *
494
+ * "Source" can be either:
495
+ * - the canonical cache (this.config.cookieFile) — runtime-owned,
496
+ * populated by packages/cookie-sanitizer
497
+ * - the user-facing drop folder — ~/.pi-harness-runtime/cookies/
498
+ * — populated by humans (any name, any format)
499
+ *
500
+ * Either is enough to attempt the scrape.
501
+ */
502
+ hasCookieFile(): boolean {
503
+ // Canonical cache present?
504
+ if (existsSync(this.config.cookieFile!)) return true;
505
+
506
+ // Drop folder has anything readable? (Sync would normalize it on the next trigger.)
507
+ try {
508
+ const dropDir = join(homedir(), ".pi-harness-runtime", "cookies");
509
+ if (existsSync(dropDir)) {
510
+ const entries = readdirSync(dropDir);
511
+ if (entries.length > 0) return true;
512
+ // One-level walk into subfolders.
513
+ for (const name of entries) {
514
+ try {
515
+ if (statSync(join(dropDir, name)).isDirectory()) {
516
+ const sub = readdirSync(join(dropDir, name));
517
+ if (sub.length > 0) return true;
518
+ }
519
+ } catch {
520
+ // ignore unreadable sub-entry
521
+ }
522
+ }
523
+ }
524
+ } catch {
525
+ // best-effort; treat as no
526
+ }
527
+
528
+ return false;
529
+ }
530
+
531
+ /**
532
+ * Get instructions for setting up cookies
533
+ */
534
+ static getSetupInstructions(): string {
535
+ return `
536
+ MiniMax Quota Scraper Setup Instructions
537
+ ======================================
538
+
539
+ 1. Install Playwright:
540
+ bun add playwright
541
+ bunx playwright install chromium
542
+
543
+ 2. Export cookies from your browser:
544
+ - Install "EditThisCookie" Chrome extension
545
+ - Go to https://platform.minimax.io
546
+ - Click the extension icon
547
+ - Click "Export" → "Netscape"
548
+ - Save to ~/.config/minimax-cookies.txt
549
+
550
+ 3. Use the scraper:
551
+ const scraper = new MiniMaxQuotaScraper();
552
+ const quota = await scraper.scrape();
553
+ console.log("[DEBUG MiniMaxQuotaScraper] 5h usage:", quota.h5UsedPct, "%");
554
+ `;
555
+ }
556
+ }
557
+
558
+ // --- Quota Manager Integration -----------------------------------------------
559
+
560
+ /**
561
+ * Quota Manager that periodically fetches MiniMax quota data
562
+ */
563
+ export class MiniMaxQuotaManager {
564
+ private scraper: MiniMaxQuotaScraper;
565
+ private lastQuota?: MiniMaxQuotaData;
566
+ private lastFetchTime = 0;
567
+ private readonly cacheDurationMs: number;
568
+
569
+ constructor(
570
+ config: MiniMaxScraperConfig & { cacheDurationMs?: number } = {},
571
+ ) {
572
+ this.scraper = new MiniMaxQuotaScraper(config);
573
+ this.cacheDurationMs = config.cacheDurationMs ?? 5 * 60 * 1000; // 5 min default
574
+ }
575
+
576
+ /**
577
+ * Get current quota (uses cache)
578
+ */
579
+ async getQuota(forceRefresh = false): Promise<MiniMaxQuotaData> {
580
+ const now = Date.now();
581
+
582
+ if (
583
+ !forceRefresh &&
584
+ this.lastQuota &&
585
+ now - this.lastFetchTime < this.cacheDurationMs
586
+ ) {
587
+ return this.lastQuota;
588
+ }
589
+
590
+ try {
591
+ this.lastQuota = await this.scraper.scrape();
592
+ this.lastFetchTime = now;
593
+ return this.lastQuota;
594
+ } catch (error) {
595
+ // Return cached value if available
596
+ if (this.lastQuota) {
597
+ return this.lastQuota;
598
+ }
599
+ throw error;
600
+ }
601
+ }
602
+
603
+ /**
604
+ * Check if quota is available
605
+ */
606
+ isAvailable(): boolean {
607
+ return this.scraper.hasCookieFile();
608
+ }
609
+ }