@minionry/minion 0.7.36

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 (476) hide show
  1. package/LICENSE +14 -0
  2. package/PRIVACY.md +357 -0
  3. package/README.md +57 -0
  4. package/THIRD_PARTY_NOTICES.md +245 -0
  5. package/bin/branding.js +4 -0
  6. package/bin/commands/browser-install.js +483 -0
  7. package/bin/commands/create-sandbox.js +542 -0
  8. package/bin/commands/fingerprint.js +101 -0
  9. package/bin/commands/login.js +400 -0
  10. package/bin/commands/logout.js +93 -0
  11. package/bin/commands/minions.js +211 -0
  12. package/bin/commands/sandboxes.js +309 -0
  13. package/bin/commands/status.js +298 -0
  14. package/bin/commands/whoami.js +153 -0
  15. package/bin/launch-env.js +35 -0
  16. package/bin/machine-identity.js +221 -0
  17. package/bin/machine-layout.js +200 -0
  18. package/bin/minion.js +839 -0
  19. package/bin/platform-endpoints.js +8 -0
  20. package/bin/postinstall.js +52 -0
  21. package/bin/pty-doctor.js +326 -0
  22. package/bin/pty-locator.js +110 -0
  23. package/bin/pty-provision.js +186 -0
  24. package/bin/sandbox/Dockerfile +78 -0
  25. package/bin/sandbox/entrypoint.sh +14 -0
  26. package/bin/sandbox/install-repo.sh +53 -0
  27. package/bin/sandbox/seccomp-userns.json +883 -0
  28. package/bin/sandbox-config.js +306 -0
  29. package/dist/bin/machine-identity.js +221 -0
  30. package/dist/bin/machine-layout.js +200 -0
  31. package/dist/electron-host/agent-lease.js +141 -0
  32. package/dist/electron-host/dom-driver.js +642 -0
  33. package/dist/electron-host/ipc-protocol.js +89 -0
  34. package/dist/electron-host/js-driver.js +216 -0
  35. package/dist/electron-host/view-manager.js +254 -0
  36. package/dist/server/cli/engine-resume.js +49 -0
  37. package/dist/server/cli/eta-estimator.js +278 -0
  38. package/dist/server/cli/headless/background-activity.js +109 -0
  39. package/dist/server/cli/headless/claude-invoker-process.js +614 -0
  40. package/dist/server/cli/headless/claude-invoker-stall.js +150 -0
  41. package/dist/server/cli/headless/claude-invoker-stream.js +555 -0
  42. package/dist/server/cli/headless/claude-invoker-tools.js +148 -0
  43. package/dist/server/cli/headless/claude-invoker.js +151 -0
  44. package/dist/server/cli/headless/engine-availability.js +92 -0
  45. package/dist/server/cli/headless/engine-notice.js +185 -0
  46. package/dist/server/cli/headless/haiku-assessments.js +293 -0
  47. package/dist/server/cli/headless/headless-logger.js +75 -0
  48. package/dist/server/cli/headless/index.js +9 -0
  49. package/dist/server/cli/headless/mcp-config.js +314 -0
  50. package/dist/server/cli/headless/native-timeout-detector.js +72 -0
  51. package/dist/server/cli/headless/output-utils.js +71 -0
  52. package/dist/server/cli/headless/prompt-utils.js +82 -0
  53. package/dist/server/cli/headless/resilient-runner.js +326 -0
  54. package/dist/server/cli/headless/retry-strategies.js +292 -0
  55. package/dist/server/cli/headless/runner.js +245 -0
  56. package/dist/server/cli/headless/stall-assessor.js +295 -0
  57. package/dist/server/cli/headless/tool-watchdog.js +447 -0
  58. package/dist/server/cli/headless/types.js +18 -0
  59. package/dist/server/cli/history-portability.js +85 -0
  60. package/dist/server/cli/improvisation-attachments.js +99 -0
  61. package/dist/server/cli/improvisation-history-store.js +121 -0
  62. package/dist/server/cli/improvisation-movements.js +137 -0
  63. package/dist/server/cli/improvisation-output-queue.js +34 -0
  64. package/dist/server/cli/improvisation-retry.js +8 -0
  65. package/dist/server/cli/improvisation-session-manager.js +1016 -0
  66. package/dist/server/cli/improvisation-types.js +31 -0
  67. package/dist/server/cli/plan-lifecycle.js +72 -0
  68. package/dist/server/cli/prompt-builders.js +371 -0
  69. package/dist/server/cli/retry/retry-best-result.js +28 -0
  70. package/dist/server/cli/retry/retry-context-loss.js +75 -0
  71. package/dist/server/cli/retry/retry-recovery-strategies.js +213 -0
  72. package/dist/server/cli/retry/retry-resume-strategy.js +20 -0
  73. package/dist/server/cli/retry/retry-runner-factory.js +92 -0
  74. package/dist/server/cli/retry/retry-tool-results.js +22 -0
  75. package/dist/server/cli/retry/retry-types.js +3 -0
  76. package/dist/server/engines/EngineEvent.js +57 -0
  77. package/dist/server/engines/claude/ClaudeCodeEngine.js +316 -0
  78. package/dist/server/engines/claude/claude-command.js +32 -0
  79. package/dist/server/engines/codex/CodexEngine.js +469 -0
  80. package/dist/server/engines/codex/codex-auth.js +203 -0
  81. package/dist/server/engines/codex/codex-invoker.js +205 -0
  82. package/dist/server/engines/codex/codex-provision.js +215 -0
  83. package/dist/server/engines/credentials/credential-probe.js +88 -0
  84. package/dist/server/engines/credentials/model-profiles.js +249 -0
  85. package/dist/server/engines/credentials/provider-credentials.js +146 -0
  86. package/dist/server/engines/engine-event-stream.js +52 -0
  87. package/dist/server/engines/execution/engine-session.js +380 -0
  88. package/dist/server/engines/factory.js +42 -0
  89. package/dist/server/engines/hermes/HermesEngine.js +628 -0
  90. package/dist/server/engines/hermes/hermes-auth.js +159 -0
  91. package/dist/server/engines/hermes/hermes-gateway-home.js +271 -0
  92. package/dist/server/engines/hermes/hermes-invoker.js +350 -0
  93. package/dist/server/engines/hermes/hermes-provision.js +318 -0
  94. package/dist/server/engines/read-only.js +20 -0
  95. package/dist/server/engines/types.js +27 -0
  96. package/dist/server/handlers/company-execution-registry.js +67 -0
  97. package/dist/server/handlers/company-handlers.js +514 -0
  98. package/dist/server/handlers/company-triggers.js +189 -0
  99. package/dist/server/handlers/company-types.js +3 -0
  100. package/dist/server/index.js +244 -0
  101. package/dist/server/mcp/app-tools-bridge.js +110 -0
  102. package/dist/server/mcp/app-tools-mcp-server.js +99 -0
  103. package/dist/server/mcp/bouncer-integration.js +744 -0
  104. package/dist/server/mcp/browser-mcp-server.js +915 -0
  105. package/dist/server/mcp/browser-redaction.js +103 -0
  106. package/dist/server/mcp/classifier/BouncerClassifier.js +3 -0
  107. package/dist/server/mcp/classifier/ClaudeBouncerClassifier.js +212 -0
  108. package/dist/server/mcp/classifier/factory.js +124 -0
  109. package/dist/server/mcp/classifier/health.js +54 -0
  110. package/dist/server/mcp/classifier/telemetry.js +0 -0
  111. package/dist/server/mcp/company-patterns.js +104 -0
  112. package/dist/server/mcp/department-profiles.js +133 -0
  113. package/dist/server/mcp/quality-bridge.js +153 -0
  114. package/dist/server/mcp/quality-mcp-server.js +105 -0
  115. package/dist/server/mcp/security-analysis.js +384 -0
  116. package/dist/server/mcp/security-audit.js +152 -0
  117. package/dist/server/mcp/security-patterns.js +314 -0
  118. package/dist/server/mcp/server.js +194 -0
  119. package/dist/server/mcp/test-utils/agent-simulator.js +301 -0
  120. package/dist/server/mcp/test-utils/e2e-agent.js +103 -0
  121. package/dist/server/mcp/test-utils/e2e-capture.js +92 -0
  122. package/dist/server/mcp/test-utils/e2e-client.js +116 -0
  123. package/dist/server/mcp/test-utils/e2e-fixtures.js +87 -0
  124. package/dist/server/mcp/test-utils/e2e-gating.js +8 -0
  125. package/dist/server/mcp/test-utils/e2e-harness.js +8 -0
  126. package/dist/server/mcp/test-utils/e2e-scenarios.js +105 -0
  127. package/dist/server/routes/files.js +18 -0
  128. package/dist/server/routes/improvise.js +64 -0
  129. package/dist/server/routes/index.js +7 -0
  130. package/dist/server/routes/instances.js +41 -0
  131. package/dist/server/routes/internal.js +900 -0
  132. package/dist/server/routes/notifications.js +110 -0
  133. package/dist/server/server-setup.js +282 -0
  134. package/dist/server/services/agent-push.js +148 -0
  135. package/dist/server/services/analytics.js +197 -0
  136. package/dist/server/services/apps/build.js +249 -0
  137. package/dist/server/services/apps/greenlight.js +199 -0
  138. package/dist/server/services/apps/install.js +101 -0
  139. package/dist/server/services/apps/layout.js +35 -0
  140. package/dist/server/services/apps/serve.js +665 -0
  141. package/dist/server/services/apps/space-apps.js +248 -0
  142. package/dist/server/services/auth.js +48 -0
  143. package/dist/server/services/browser/chrome-sandbox.js +245 -0
  144. package/dist/server/services/browser/chromium-launch-spec.js +51 -0
  145. package/dist/server/services/browser/claude-reasoner.js +669 -0
  146. package/dist/server/services/browser/debug-log.js +3 -0
  147. package/dist/server/services/browser/driver-state.js +546 -0
  148. package/dist/server/services/browser/electron-provision.js +256 -0
  149. package/dist/server/services/browser/host-internal.js +245 -0
  150. package/dist/server/services/browser/host-mock.js +334 -0
  151. package/dist/server/services/browser/host-types.js +3 -0
  152. package/dist/server/services/browser/host.js +1067 -0
  153. package/dist/server/services/browser/index.js +4 -0
  154. package/dist/server/services/browser/ipc-client.js +354 -0
  155. package/dist/server/services/browser/pipewire-sink.js +199 -0
  156. package/dist/server/services/browser/preflight.js +590 -0
  157. package/dist/server/services/browser/reasoning-agent.js +659 -0
  158. package/dist/server/services/browser/sandbox-policy.js +169 -0
  159. package/dist/server/services/browser/stderr-noise-filter.js +26 -0
  160. package/dist/server/services/browser/telemetry.js +107 -0
  161. package/dist/server/services/browser/xvfb-supervisor.js +139 -0
  162. package/dist/server/services/browser-frame-policy.js +56 -0
  163. package/dist/server/services/client-id.js +32 -0
  164. package/dist/server/services/collab/registry.js +408 -0
  165. package/dist/server/services/collab/session.js +489 -0
  166. package/dist/server/services/collab/text-diff.js +28 -0
  167. package/dist/server/services/collab/types.js +19 -0
  168. package/dist/server/services/e2ee-group-key.js +197 -0
  169. package/dist/server/services/e2ee-identity.js +203 -0
  170. package/dist/server/services/file-explorer-ops.js +328 -0
  171. package/dist/server/services/file-transfer-zip.js +188 -0
  172. package/dist/server/services/files.js +111 -0
  173. package/dist/server/services/git/branch-ops.js +62 -0
  174. package/dist/server/services/git/command.js +68 -0
  175. package/dist/server/services/git/commit-message.js +74 -0
  176. package/dist/server/services/git/diff-ops.js +56 -0
  177. package/dist/server/services/git/haiku.js +76 -0
  178. package/dist/server/services/git/head-watcher.js +226 -0
  179. package/dist/server/services/git/index.js +17 -0
  180. package/dist/server/services/git/log-ops.js +98 -0
  181. package/dist/server/services/git/merge-ops.js +314 -0
  182. package/dist/server/services/git/parsers.js +401 -0
  183. package/dist/server/services/git/remote-ops.js +192 -0
  184. package/dist/server/services/git/status-ops.js +105 -0
  185. package/dist/server/services/git/suggestion-ops.js +80 -0
  186. package/dist/server/services/git/tag-ops.js +36 -0
  187. package/dist/server/services/git/types.js +4 -0
  188. package/dist/server/services/git/worktree-ops.js +114 -0
  189. package/dist/server/services/instances.js +337 -0
  190. package/dist/server/services/model-catalog.js +247 -0
  191. package/dist/server/services/observability/posthog.js +153 -0
  192. package/dist/server/services/pathUtils.js +114 -0
  193. package/dist/server/services/plan/agent-loader.js +97 -0
  194. package/dist/server/services/plan/agent-manager.js +363 -0
  195. package/dist/server/services/plan/agent-resolver.js +74 -0
  196. package/dist/server/services/plan/agents/assess-stall.md +33 -0
  197. package/dist/server/services/plan/agents/browser-planner.md +53 -0
  198. package/dist/server/services/plan/agents/browser-reasoner.md +114 -0
  199. package/dist/server/services/plan/agents/check-injection.md +95 -0
  200. package/dist/server/services/plan/agents/classify-error.md +30 -0
  201. package/dist/server/services/plan/agents/code-review.md +142 -0
  202. package/dist/server/services/plan/agents/commit-message.md +28 -0
  203. package/dist/server/services/plan/agents/detect-context-loss.md +30 -0
  204. package/dist/server/services/plan/agents/execute-issue.md +58 -0
  205. package/dist/server/services/plan/agents/fix-quality.md +25 -0
  206. package/dist/server/services/plan/agents/plan-coordinator.md +72 -0
  207. package/dist/server/services/plan/agents/pr-description.md +29 -0
  208. package/dist/server/services/plan/agents/retry-task.md +27 -0
  209. package/dist/server/services/plan/agents/review-code.md +38 -0
  210. package/dist/server/services/plan/agents/review-quality.md +45 -0
  211. package/dist/server/services/plan/agents/triage-findings.md +78 -0
  212. package/dist/server/services/plan/agents/verify-review.md +57 -0
  213. package/dist/server/services/plan/approval-evaluator.js +143 -0
  214. package/dist/server/services/plan/board-archive.js +102 -0
  215. package/dist/server/services/plan/board-config.js +108 -0
  216. package/dist/server/services/plan/board-export.js +214 -0
  217. package/dist/server/services/plan/composer-prompt.js +115 -0
  218. package/dist/server/services/plan/composer.js +664 -0
  219. package/dist/server/services/plan/config-installer.js +103 -0
  220. package/dist/server/services/plan/dependency-resolver.js +137 -0
  221. package/dist/server/services/plan/executor.js +696 -0
  222. package/dist/server/services/plan/front-matter.js +43 -0
  223. package/dist/server/services/plan/issue-classification.js +10 -0
  224. package/dist/server/services/plan/issue-effort.js +182 -0
  225. package/dist/server/services/plan/issue-loader.js +35 -0
  226. package/dist/server/services/plan/issue-prompt-builder.js +152 -0
  227. package/dist/server/services/plan/issue-retry.js +42 -0
  228. package/dist/server/services/plan/issue-writer.js +102 -0
  229. package/dist/server/services/plan/metrics-collector.js +272 -0
  230. package/dist/server/services/plan/output-manager.js +77 -0
  231. package/dist/server/services/plan/parser-core.js +435 -0
  232. package/dist/server/services/plan/parser-migration.js +108 -0
  233. package/dist/server/services/plan/parser.js +258 -0
  234. package/dist/server/services/plan/plan-runner-factory.js +68 -0
  235. package/dist/server/services/plan/pm-timeline.js +320 -0
  236. package/dist/server/services/plan/progress-log.js +101 -0
  237. package/dist/server/services/plan/prompt-builder.js +142 -0
  238. package/dist/server/services/plan/quality-delta.js +274 -0
  239. package/dist/server/services/plan/readiness-planner.js +34 -0
  240. package/dist/server/services/plan/review-gate.js +409 -0
  241. package/dist/server/services/plan/review-report.js +134 -0
  242. package/dist/server/services/plan/review-verdict-stream.js +161 -0
  243. package/dist/server/services/plan/state-reconciler.js +238 -0
  244. package/dist/server/services/plan/template-diff.js +175 -0
  245. package/dist/server/services/plan/template-instantiator.js +516 -0
  246. package/dist/server/services/plan/template-manifest.js +56 -0
  247. package/dist/server/services/plan/template-types.js +3 -0
  248. package/dist/server/services/plan/trigger-evaluator.js +211 -0
  249. package/dist/server/services/plan/types.js +3 -0
  250. package/dist/server/services/plan/watcher.js +73 -0
  251. package/dist/server/services/platform-credentials.js +56 -0
  252. package/dist/server/services/platform-e2ee.js +421 -0
  253. package/dist/server/services/platform-envelope.js +102 -0
  254. package/dist/server/services/platform-heartbeat.js +88 -0
  255. package/dist/server/services/platform-reconnect.js +60 -0
  256. package/dist/server/services/platform-token-lifecycle.js +95 -0
  257. package/dist/server/services/platform-url.js +17 -0
  258. package/dist/server/services/platform.js +656 -0
  259. package/dist/server/services/runtime-info.js +9 -0
  260. package/dist/server/services/schedule/agent-schedule-store.js +232 -0
  261. package/dist/server/services/schedule/agent-scheduler.js +323 -0
  262. package/dist/server/services/schedule/daily-timing.js +105 -0
  263. package/dist/server/services/schedule/quality-schedule-launch.js +11 -0
  264. package/dist/server/services/schedule/quality-schedule-store.js +211 -0
  265. package/dist/server/services/schedule/quality-scheduler.js +215 -0
  266. package/dist/server/services/schedule/run-bootstrap.js +329 -0
  267. package/dist/server/services/schedule/schedule-store.js +238 -0
  268. package/dist/server/services/schedule/schedule-wire.js +77 -0
  269. package/dist/server/services/schedule/scheduler.js +310 -0
  270. package/dist/server/services/schedule/template-source.js +97 -0
  271. package/dist/server/services/sdk/agent-sessions.js +264 -0
  272. package/dist/server/services/sdk/agents.js +557 -0
  273. package/dist/server/services/sdk/app-endpoints.js +48 -0
  274. package/dist/server/services/sdk/app-tools.js +303 -0
  275. package/dist/server/services/sdk/audit.js +48 -0
  276. package/dist/server/services/sdk/browser-transport.js +188 -0
  277. package/dist/server/services/sdk/browser.js +605 -0
  278. package/dist/server/services/sdk/composer.js +129 -0
  279. package/dist/server/services/sdk/connect.js +273 -0
  280. package/dist/server/services/sdk/consent-cooldown.js +31 -0
  281. package/dist/server/services/sdk/endpoint-url.js +141 -0
  282. package/dist/server/services/sdk/endpoints.js +314 -0
  283. package/dist/server/services/sdk/file-change-notify.js +36 -0
  284. package/dist/server/services/sdk/files-app.js +163 -0
  285. package/dist/server/services/sdk/files-search.js +131 -0
  286. package/dist/server/services/sdk/files-transfer.js +279 -0
  287. package/dist/server/services/sdk/files-workspace.js +233 -0
  288. package/dist/server/services/sdk/git.js +520 -0
  289. package/dist/server/services/sdk/grant-store.js +318 -0
  290. package/dist/server/services/sdk/host-ops.js +84 -0
  291. package/dist/server/services/sdk/inference-claude.js +214 -0
  292. package/dist/server/services/sdk/inference.js +247 -0
  293. package/dist/server/services/sdk/live-registry.js +42 -0
  294. package/dist/server/services/sdk/local-app-bindings.js +71 -0
  295. package/dist/server/services/sdk/pipeline.js +190 -0
  296. package/dist/server/services/sdk/pm-execute.js +228 -0
  297. package/dist/server/services/sdk/pm-planning-tap.js +29 -0
  298. package/dist/server/services/sdk/pm-schedule.js +165 -0
  299. package/dist/server/services/sdk/pm.js +634 -0
  300. package/dist/server/services/sdk/quality-change-notify.js +20 -0
  301. package/dist/server/services/sdk/quality-schedule.js +165 -0
  302. package/dist/server/services/sdk/quality.js +602 -0
  303. package/dist/server/services/sdk/rate-limits.js +198 -0
  304. package/dist/server/services/sdk/registry.js +597 -0
  305. package/dist/server/services/sdk/revoke.js +86 -0
  306. package/dist/server/services/sdk/run-profile.js +41 -0
  307. package/dist/server/services/sdk/sandbox.js +89 -0
  308. package/dist/server/services/sdk/storage.js +110 -0
  309. package/dist/server/services/sdk/streams.js +147 -0
  310. package/dist/server/services/sdk/terminal.js +201 -0
  311. package/dist/server/services/sdk/test-utils/workshop-browser-app.js +466 -0
  312. package/dist/server/services/sentry.js +99 -0
  313. package/dist/server/services/settings.js +374 -0
  314. package/dist/server/services/snippets/expander.js +87 -0
  315. package/dist/server/services/snippets/index.js +6 -0
  316. package/dist/server/services/snippets/loader.js +119 -0
  317. package/dist/server/services/snippets/parser.js +52 -0
  318. package/dist/server/services/snippets/types.js +3 -0
  319. package/dist/server/services/snippets/watcher.js +60 -0
  320. package/dist/server/services/space-layout.js +80 -0
  321. package/dist/server/services/system-prompts.js +219 -0
  322. package/dist/server/services/terminal/pty-manager.js +206 -0
  323. package/dist/server/services/terminal/pty-utils.js +150 -0
  324. package/dist/server/services/timeline/assembler.js +890 -0
  325. package/dist/server/services/timeline/contract.js +196 -0
  326. package/dist/server/services/timeline/index.js +4 -0
  327. package/dist/server/services/websocket/agent-schedule-handlers.js +217 -0
  328. package/dist/server/services/websocket/apps-handlers.js +399 -0
  329. package/dist/server/services/websocket/ask-user-question-bridge.js +112 -0
  330. package/dist/server/services/websocket/autocomplete-index.js +415 -0
  331. package/dist/server/services/websocket/autocomplete-match.js +243 -0
  332. package/dist/server/services/websocket/autocomplete.js +407 -0
  333. package/dist/server/services/websocket/browser-agent-runtime.js +208 -0
  334. package/dist/server/services/websocket/browser-device-profile.js +46 -0
  335. package/dist/server/services/websocket/browser-handlers.js +377 -0
  336. package/dist/server/services/websocket/browser-host-broadcast.js +179 -0
  337. package/dist/server/services/websocket/browser-ice-config.js +121 -0
  338. package/dist/server/services/websocket/browser-payloads.js +222 -0
  339. package/dist/server/services/websocket/browser-viewer-lifecycle.js +84 -0
  340. package/dist/server/services/websocket/browser-viewer-registry.js +118 -0
  341. package/dist/server/services/websocket/collab-broadcast.js +11 -0
  342. package/dist/server/services/websocket/collab-handlers.js +116 -0
  343. package/dist/server/services/websocket/commit-suggestion-service.js +132 -0
  344. package/dist/server/services/websocket/debug-log.js +38 -0
  345. package/dist/server/services/websocket/dispatch-util.js +10 -0
  346. package/dist/server/services/websocket/engine-auth-handlers.js +323 -0
  347. package/dist/server/services/websocket/engine-credential-watcher.js +83 -0
  348. package/dist/server/services/websocket/engine-profile-handlers.js +92 -0
  349. package/dist/server/services/websocket/file-definition-handlers.js +180 -0
  350. package/dist/server/services/websocket/file-download-handler.js +291 -0
  351. package/dist/server/services/websocket/file-explorer-handlers.js +291 -0
  352. package/dist/server/services/websocket/file-search-handlers.js +267 -0
  353. package/dist/server/services/websocket/file-share-handlers.js +328 -0
  354. package/dist/server/services/websocket/file-transfer-http.js +361 -0
  355. package/dist/server/services/websocket/file-upload-handler.js +267 -0
  356. package/dist/server/services/websocket/file-utils.js +346 -0
  357. package/dist/server/services/websocket/git-branch-handlers.js +90 -0
  358. package/dist/server/services/websocket/git-diff-handlers.js +59 -0
  359. package/dist/server/services/websocket/git-handlers.js +212 -0
  360. package/dist/server/services/websocket/git-head-watcher.js +85 -0
  361. package/dist/server/services/websocket/git-log-handlers.js +104 -0
  362. package/dist/server/services/websocket/git-pr-handlers.js +56 -0
  363. package/dist/server/services/websocket/git-tag-handlers.js +53 -0
  364. package/dist/server/services/websocket/git-utils.js +11 -0
  365. package/dist/server/services/websocket/git-worktree-handlers.js +521 -0
  366. package/dist/server/services/websocket/handler-context.js +113 -0
  367. package/dist/server/services/websocket/handler.js +1197 -0
  368. package/dist/server/services/websocket/index.js +5 -0
  369. package/dist/server/services/websocket/movement-written-files.js +26 -0
  370. package/dist/server/services/websocket/msg-id-tracker.js +48 -0
  371. package/dist/server/services/websocket/plan-board-handlers.js +410 -0
  372. package/dist/server/services/websocket/plan-execution-handlers.js +244 -0
  373. package/dist/server/services/websocket/plan-handlers.js +67 -0
  374. package/dist/server/services/websocket/plan-helpers.js +161 -0
  375. package/dist/server/services/websocket/plan-issue-handlers.js +168 -0
  376. package/dist/server/services/websocket/plan-sprint-handlers.js +190 -0
  377. package/dist/server/services/websocket/plan-transfer-handlers.js +310 -0
  378. package/dist/server/services/websocket/pm-timeline-broadcast.js +28 -0
  379. package/dist/server/services/websocket/post-session-scan.js +132 -0
  380. package/dist/server/services/websocket/prompt-queue-handlers.js +96 -0
  381. package/dist/server/services/websocket/quality-agent-cost.js +229 -0
  382. package/dist/server/services/websocket/quality-agent-notes.js +113 -0
  383. package/dist/server/services/websocket/quality-change-activity.js +187 -0
  384. package/dist/server/services/websocket/quality-complexity.js +345 -0
  385. package/dist/server/services/websocket/quality-dependencies.js +445 -0
  386. package/dist/server/services/websocket/quality-duplication.js +162 -0
  387. package/dist/server/services/websocket/quality-eta.js +65 -0
  388. package/dist/server/services/websocket/quality-fingerprint.js +104 -0
  389. package/dist/server/services/websocket/quality-grading.js +575 -0
  390. package/dist/server/services/websocket/quality-handlers.js +48 -0
  391. package/dist/server/services/websocket/quality-linting.js +270 -0
  392. package/dist/server/services/websocket/quality-operations.js +54 -0
  393. package/dist/server/services/websocket/quality-persistence.js +410 -0
  394. package/dist/server/services/websocket/quality-review-agent.js +526 -0
  395. package/dist/server/services/websocket/quality-run.js +220 -0
  396. package/dist/server/services/websocket/quality-secrets.js +0 -0
  397. package/dist/server/services/websocket/quality-service.js +775 -0
  398. package/dist/server/services/websocket/quality-tools.js +383 -0
  399. package/dist/server/services/websocket/quality-triage-agent.js +101 -0
  400. package/dist/server/services/websocket/quality-types.js +149 -0
  401. package/dist/server/services/websocket/recommended-answers.js +28 -0
  402. package/dist/server/services/websocket/schedule-handlers.js +197 -0
  403. package/dist/server/services/websocket/sdk-agent-host.js +569 -0
  404. package/dist/server/services/websocket/sdk-browser-host.js +459 -0
  405. package/dist/server/services/websocket/sdk-composer-host.js +10 -0
  406. package/dist/server/services/websocket/sdk-git-host.js +115 -0
  407. package/dist/server/services/websocket/sdk-handlers.js +242 -0
  408. package/dist/server/services/websocket/sdk-pm-execution-host.js +63 -0
  409. package/dist/server/services/websocket/sdk-pm-schedule-host.js +21 -0
  410. package/dist/server/services/websocket/sdk-quality-schedule-host.js +34 -0
  411. package/dist/server/services/websocket/sdk-terminal-host.js +140 -0
  412. package/dist/server/services/websocket/session-handlers.js +565 -0
  413. package/dist/server/services/websocket/session-history.js +335 -0
  414. package/dist/server/services/websocket/session-initialization.js +315 -0
  415. package/dist/server/services/websocket/session-registry.js +340 -0
  416. package/dist/server/services/websocket/session-role-directory.js +39 -0
  417. package/dist/server/services/websocket/settings-handlers.js +276 -0
  418. package/dist/server/services/websocket/skill-handlers.js +324 -0
  419. package/dist/server/services/websocket/skill-watcher.js +83 -0
  420. package/dist/server/services/websocket/snippet-handlers.js +261 -0
  421. package/dist/server/services/websocket/tab-broadcast.js +35 -0
  422. package/dist/server/services/websocket/tab-event-buffer.js +110 -0
  423. package/dist/server/services/websocket/tab-event-replay.js +47 -0
  424. package/dist/server/services/websocket/tab-handlers.js +211 -0
  425. package/dist/server/services/websocket/terminal-handlers.js +268 -0
  426. package/dist/server/services/websocket/types.js +96 -0
  427. package/dist/server/types/company-messages.js +102 -0
  428. package/dist/server/utils/agent-manager.js +202 -0
  429. package/dist/server/utils/console-timestamps.js +24 -0
  430. package/dist/server/utils/file-store.js +112 -0
  431. package/dist/server/utils/paths.js +28 -0
  432. package/dist/server/utils/port-manager.js +43 -0
  433. package/dist/server/utils/port.js +204 -0
  434. package/electron-host/dist/agent-lease.js +141 -0
  435. package/electron-host/dist/capture-recovery.js +77 -0
  436. package/electron-host/dist/codec-policy.js +37 -0
  437. package/electron-host/dist/controller-channel.js +60 -0
  438. package/electron-host/dist/controller-handlers.js +153 -0
  439. package/electron-host/dist/device-emulator.js +106 -0
  440. package/electron-host/dist/dom-driver.js +642 -0
  441. package/electron-host/dist/domain-registry.js +159 -0
  442. package/electron-host/dist/domain-validators.js +308 -0
  443. package/electron-host/dist/editable-focus-reporter.js +143 -0
  444. package/electron-host/dist/fake-peer.test-util.js +105 -0
  445. package/electron-host/dist/host-log.js +31 -0
  446. package/electron-host/dist/host-wire.js +11 -0
  447. package/electron-host/dist/input-router.js +421 -0
  448. package/electron-host/dist/ipc-protocol.js +89 -0
  449. package/electron-host/dist/ipc-server.js +193 -0
  450. package/electron-host/dist/js-driver.js +216 -0
  451. package/electron-host/dist/main-guards.js +70 -0
  452. package/electron-host/dist/main.js +716 -0
  453. package/electron-host/dist/roster-sync.js +87 -0
  454. package/electron-host/dist/rpc-context.js +1 -0
  455. package/electron-host/dist/rpc-tab-methods.js +138 -0
  456. package/electron-host/dist/rpc-webrtc-methods.js +121 -0
  457. package/electron-host/dist/screen-capture-cache.js +147 -0
  458. package/electron-host/dist/sdk-injector.js +166 -0
  459. package/electron-host/dist/sdp.js +102 -0
  460. package/electron-host/dist/session-surface.js +78 -0
  461. package/electron-host/dist/surface-sizing.js +59 -0
  462. package/electron-host/dist/view-manager.js +254 -0
  463. package/electron-host/dist/viewer-registry.js +46 -0
  464. package/electron-host/dist/viewer-session.js +288 -0
  465. package/electron-host/dist/webrtc-channels.js +14 -0
  466. package/electron-host/dist/webrtc-controller.js +57 -0
  467. package/electron-host/dist/webrtc-ice-filter.js +13 -0
  468. package/electron-host/dist/webrtc-peer.js +45 -0
  469. package/electron-host/package.json +12 -0
  470. package/electron-host/tsconfig.json +23 -0
  471. package/electron-host/webrtc-controller-preload.cjs +3 -0
  472. package/electron-host/webrtc-controller.html +14 -0
  473. package/package.json +85 -0
  474. package/vendor/e2ee/LICENSE +14 -0
  475. package/vendor/e2ee/package.json +14 -0
  476. package/vendor/e2ee/src/index.js +310 -0
@@ -0,0 +1,148 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { applyToolEventToBackground, hasPendingBackgroundWork } from './background-activity.js';
4
+ import { HUMAN_WAIT_TOOLS } from './claude-invoker-stall.js';
5
+ import { verboseLog } from './claude-invoker-stream.js';
6
+ import { killProcessGroup } from './runner.js';
7
+ import { assessToolTimeout } from './stall-assessor.js';
8
+ import { ToolWatchdog } from './tool-watchdog.js';
9
+ function summarizeToolInput(input) {
10
+ try {
11
+ if (input.description)
12
+ return String(input.description).slice(0, 200);
13
+ if (input.prompt)
14
+ return String(input.prompt).slice(0, 200);
15
+ if (input.command)
16
+ return String(input.command).slice(0, 200);
17
+ if (input.pattern)
18
+ return `pattern: ${String(input.pattern).slice(0, 100)}`;
19
+ return JSON.stringify(input).slice(0, 200);
20
+ }
21
+ catch {
22
+ return undefined;
23
+ }
24
+ }
25
+ const INPUT_STREAMING_TOOLS = new Set(['Write', 'Edit', 'MultiEdit', 'NotebookEdit', 'Bash']);
26
+ function hasToolResult(id, s) {
27
+ if (s.completedToolIds.has(id))
28
+ return true;
29
+ return s.ctx.accumulatedToolUse.find((t) => t.toolId === id)?.result !== undefined;
30
+ }
31
+ function onToolStart(event, s) {
32
+ const id = event.toolId;
33
+ const toolName = event.toolName;
34
+ s.pendingTools.set(id, toolName);
35
+ s.counters.totalToolCalls++;
36
+ s.toolIdToName.set(id, toolName);
37
+ if (s.watchdog && !HUMAN_WAIT_TOOLS.has(toolName) && !INPUT_STREAMING_TOOLS.has(toolName)) {
38
+ s.watchdog.startWatch(id, toolName, {}, () => { s.onTimeout(id); });
39
+ }
40
+ }
41
+ function onToolComplete(event, s) {
42
+ const id = event.toolId;
43
+ const input = event.completeInput ?? {};
44
+ s.counters.lastToolInputSummary = summarizeToolInput(input);
45
+ s.toolIdToInput.set(id, input);
46
+ if (!s.watchdog)
47
+ return;
48
+ if (hasToolResult(id, s))
49
+ return;
50
+ const toolName = s.toolIdToName.get(id);
51
+ if (toolName && !HUMAN_WAIT_TOOLS.has(toolName)) {
52
+ s.watchdog.startWatch(id, toolName, input, () => { s.onTimeout(id); });
53
+ }
54
+ }
55
+ function onToolResult(event, s) {
56
+ const id = event.toolId;
57
+ s.pendingTools.delete(id);
58
+ s.completedToolIds.add(id);
59
+ s.stallState.stallWarningEmitted = false;
60
+ s.stallState.lastActivityTime = Date.now();
61
+ s.ctx.lastTokenActivityTime = Date.now();
62
+ if (!s.watchdog)
63
+ return;
64
+ s.watchdog.clearWatch(id);
65
+ const toolEntry = s.ctx.accumulatedToolUse.find(t => t.toolId === id);
66
+ const toolName = s.toolIdToName.get(id);
67
+ if (toolEntry && toolName && toolEntry.duration) {
68
+ s.watchdog.recordCompletion(toolName, toolEntry.duration);
69
+ }
70
+ }
71
+ function resolveToolUrl(toolInput) {
72
+ if (toolInput.url)
73
+ return String(toolInput.url);
74
+ if (toolInput.query)
75
+ return String(toolInput.query);
76
+ return undefined;
77
+ }
78
+ function executeToolTimeout(hungToolId, watchdog, killCtx, s, config, prompt, sessionCapture, perfStart) {
79
+ const checkpoint = watchdog.buildCheckpoint(prompt, s.ctx.accumulatedAssistantResponse, s.ctx.accumulatedThinking, s.ctx.accumulatedToolUse, hungToolId, sessionCapture.claudeSessionId, perfStart);
80
+ const toolName = s.toolIdToName.get(hungToolId) || 'unknown';
81
+ const toolInput = s.toolIdToInput.get(hungToolId) || {};
82
+ const timeoutMs = watchdog.getActiveWatch(hungToolId)?.timeoutMs ?? watchdog.getTimeout(toolName);
83
+ const url = resolveToolUrl(toolInput);
84
+ config.outputCallback?.(`\n[[MINIONRY_TOOL_TIMEOUT]] ${toolName} timed out after ${Math.round(timeoutMs / 1000)}s${url ? ` fetching: ${url.slice(0, 100)}` : ''}. ${s.ctx.accumulatedToolUse.filter(t => t.result !== undefined).length} completed results preserved.\n`);
85
+ if (checkpoint) {
86
+ config.onToolTimeout?.(checkpoint);
87
+ }
88
+ verboseLog(config.verbose, `[WATCHDOG] Killing process due to ${toolName} timeout`);
89
+ watchdog.clearAll();
90
+ clearInterval(killCtx.stallCheckInterval);
91
+ if (killCtx.claudeProcess.pid)
92
+ killProcessGroup(killCtx.claudeProcess.pid, 'SIGTERM');
93
+ const proc = killCtx.claudeProcess;
94
+ setTimeout(() => { if (!proc.killed && proc.pid)
95
+ killProcessGroup(proc.pid, 'SIGKILL'); }, 5000);
96
+ }
97
+ export function setupToolTracking(config, stallState, ctx, sessionCapture, prompt, perfStart) {
98
+ const pendingTools = new Map();
99
+ const counters = { lastToolInputSummary: undefined, totalToolCalls: 0 };
100
+ const toolWatchdogActive = config.enableToolWatchdog !== false;
101
+ const watchdog = toolWatchdogActive
102
+ ? new ToolWatchdog({
103
+ profiles: config.toolTimeoutProfiles,
104
+ verbose: config.verbose,
105
+ onTiebreaker: async (toolName, toolInput, elapsedMs, tokenSilenceMs, declaredTimeoutMs) => {
106
+ const backgroundWorkPending = hasPendingBackgroundWork(ctx.backgroundActivity, Date.now());
107
+ return assessToolTimeout(toolName, toolInput, elapsedMs, config.claudeCommand, config.verbose, tokenSilenceMs, backgroundWorkPending, declaredTimeoutMs);
108
+ },
109
+ getTokenSilenceMs: () => {
110
+ const last = ctx.lastTokenActivityTime;
111
+ return last > 0 ? Date.now() - last : undefined;
112
+ },
113
+ shouldDeferKill: () => hasPendingBackgroundWork(ctx.backgroundActivity, Date.now()) ? 'background tasks pending' : null,
114
+ })
115
+ : null;
116
+ let killCtx = null;
117
+ const trackingState = {
118
+ pendingTools, counters,
119
+ toolIdToName: new Map(), toolIdToInput: new Map(),
120
+ completedToolIds: new Set(),
121
+ watchdog, stallState, ctx,
122
+ onTimeout: (hungToolId) => {
123
+ if (!watchdog || !killCtx)
124
+ return;
125
+ executeToolTimeout(hungToolId, watchdog, killCtx, trackingState, config, prompt, sessionCapture, perfStart);
126
+ },
127
+ };
128
+ const origToolUseCallback = config.toolUseCallback;
129
+ config.toolUseCallback = (event) => {
130
+ applyToolEventToBackground(ctx.backgroundActivity, event);
131
+ if (event.type === 'tool_start' && event.toolName && event.toolId) {
132
+ onToolStart(event, trackingState);
133
+ }
134
+ else if (event.type === 'tool_complete' && event.completeInput && event.toolId) {
135
+ onToolComplete(event, trackingState);
136
+ }
137
+ else if (event.type === 'tool_result' && event.toolId) {
138
+ onToolResult(event, trackingState);
139
+ }
140
+ origToolUseCallback?.(event);
141
+ };
142
+ return {
143
+ pendingTools, watchdog, toolWatchdogActive, counters,
144
+ setKillContext: (claudeProcess, stallCheckInterval) => {
145
+ killCtx = { claudeProcess, stallCheckInterval };
146
+ },
147
+ };
148
+ }
@@ -0,0 +1,151 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { createBackgroundActivityState } from './background-activity.js';
4
+ import { buildCloseResult, handleSpawnError, spawnAndRegister, spawnProvedEngineAvailable } from './claude-invoker-process.js';
5
+ import { runStallCheckTick } from './claude-invoker-stall.js';
6
+ import { classifyUnmatchedStderr, processStreamLines, verboseLog } from './claude-invoker-stream.js';
7
+ import { setupToolTracking } from './claude-invoker-tools.js';
8
+ import { engineAvailability } from './engine-availability.js';
9
+ import { NativeTimeoutDetector } from './native-timeout-detector.js';
10
+ import { detectErrorInStderr } from './output-utils.js';
11
+ import { killProcessGroup } from './runner.js';
12
+ import { emptyTokenUsage } from './types.js';
13
+ export async function executeClaudeCommand(prompt, _movementId, _sessionNumber, options) {
14
+ const { config, runningProcesses } = options;
15
+ const perfStart = Date.now();
16
+ verboseLog(config.verbose, '[PERF] executeMovement started');
17
+ const hasImageAttachments = config.imageAttachments && config.imageAttachments.length > 0;
18
+ const useStreamJson = hasImageAttachments || config.thinkingCallback || config.outputCallback || config.toolUseCallback;
19
+ const claudeProcess = await spawnAndRegister(config, prompt, !!hasImageAttachments, !!useStreamJson, runningProcesses, perfStart);
20
+ let stdout = '';
21
+ let stderr = '';
22
+ let thinkingBuffer = '';
23
+ let firstStdoutReceived = false;
24
+ let errorAlreadySurfaced = false;
25
+ const sessionCapture = {};
26
+ const isResumeMode = !!(config.continueSession && config.claudeSessionId);
27
+ const ctx = {
28
+ config,
29
+ accumulatedAssistantResponse: '',
30
+ accumulatedThinking: '',
31
+ accumulatedToolUse: [],
32
+ toolInputBuffers: new Map(),
33
+ nativeTimeoutDetector: new NativeTimeoutDetector(),
34
+ resumeAssessmentActive: isResumeMode,
35
+ resumeAssessmentBuffer: '',
36
+ apiTokenUsage: emptyTokenUsage(),
37
+ seenMessageIds: new Set(),
38
+ currentStepOutputTokens: 0,
39
+ lastTokenActivityTime: Date.now(),
40
+ hasReceivedTextDeltas: false,
41
+ hasReceivedThinkingDeltas: false,
42
+ sessionNotFound: false,
43
+ resultInterrupted: false,
44
+ backgroundActivity: createBackgroundActivityState(),
45
+ };
46
+ const stallState = {
47
+ lastActivityTime: Date.now(),
48
+ stallWarningEmitted: false,
49
+ assessmentInProgress: false,
50
+ extensionsGranted: 0,
51
+ currentKillDeadline: Date.now() + (config.stallKillMs ?? 1_800_000),
52
+ nextWarningAfter: 0,
53
+ };
54
+ const toolTracking = setupToolTracking(config, stallState, ctx, sessionCapture, prompt, perfStart);
55
+ const { pendingTools, watchdog, toolWatchdogActive } = toolTracking;
56
+ const toolCounters = toolTracking.counters;
57
+ ctx.onEngineAbort = () => watchdog?.clearAll();
58
+ options.onLiveContext?.({ ctx, sessionCapture });
59
+ const firstEventDeadlineMs = config.firstEventDeadlineMs ?? 90_000;
60
+ const spawnedAt = Date.now();
61
+ const firstEventTimer = firstEventDeadlineMs > 0
62
+ ? setTimeout(() => {
63
+ if (firstStdoutReceived || claudeProcess.exitCode !== null)
64
+ return;
65
+ ctx.startupTimedOut = true;
66
+ const seconds = Math.round((Date.now() - spawnedAt) / 1000);
67
+ verboseLog(config.verbose, `[STARTUP] No stream event within ${seconds}s of spawn — terminating attempt`);
68
+ config.outputCallback?.(`\n[[MINIONRY_ERROR:ENGINE_NO_OUTPUT]] The engine produced no output within ${seconds}s of starting. Stopping this attempt.\n`);
69
+ if (claudeProcess.pid)
70
+ killProcessGroup(claudeProcess.pid, 'SIGTERM');
71
+ const proc = claudeProcess;
72
+ setTimeout(() => { if (!proc.killed && proc.pid && proc.exitCode === null)
73
+ killProcessGroup(proc.pid, 'SIGKILL'); }, 5000);
74
+ }, firstEventDeadlineMs)
75
+ : null;
76
+ claudeProcess.stdout.on('data', (data) => {
77
+ stallState.lastActivityTime = Date.now();
78
+ stallState.stallWarningEmitted = false;
79
+ stallState.nextWarningAfter = 0;
80
+ const killMs = config.stallKillMs ?? 1_800_000;
81
+ stallState.currentKillDeadline = Date.now() + killMs;
82
+ if (!firstStdoutReceived) {
83
+ firstStdoutReceived = true;
84
+ if (firstEventTimer)
85
+ clearTimeout(firstEventTimer);
86
+ verboseLog(config.verbose, `[PERF] First stdout data: ${Date.now() - perfStart}ms`);
87
+ }
88
+ const chunk = data.toString();
89
+ stdout += chunk;
90
+ if (useStreamJson) {
91
+ thinkingBuffer = processStreamLines(thinkingBuffer + chunk, sessionCapture, ctx);
92
+ }
93
+ });
94
+ claudeProcess.stderr.on('data', async (data) => {
95
+ const chunk = data.toString();
96
+ stderr += chunk;
97
+ if (errorAlreadySurfaced)
98
+ return;
99
+ const error = detectErrorInStderr(stderr);
100
+ if (error) {
101
+ errorAlreadySurfaced = true;
102
+ if (config.outputCallback) {
103
+ config.outputCallback(`\n[[MINIONRY_ERROR:${error.errorCode}]] ${error.message}\n`);
104
+ }
105
+ }
106
+ });
107
+ const stallWarningMs = config.stallWarningMs ?? 300_000;
108
+ const stallHardCapMs = config.stallHardCapMs ?? 14_400_000;
109
+ const maxExtensions = config.stallMaxExtensions ?? 3;
110
+ const stallAssessEnabled = config.stallAssessEnabled !== false;
111
+ let stallCheckInterval;
112
+ stallCheckInterval = setInterval(() => {
113
+ runStallCheckTick(stallState, {
114
+ perfStart, stallWarningMs, stallHardCapMs, maxExtensions, stallAssessEnabled,
115
+ toolWatchdogActive, prompt, pendingTools, lastToolInputSummary: toolCounters.lastToolInputSummary, totalToolCalls: toolCounters.totalToolCalls,
116
+ claudeProcess, stallCheckInterval, config, lastTokenActivityTime: ctx.lastTokenActivityTime,
117
+ backgroundActivity: ctx.backgroundActivity,
118
+ });
119
+ }, 10_000);
120
+ toolTracking.setKillContext(claudeProcess, stallCheckInterval);
121
+ return new Promise((resolve, reject) => {
122
+ claudeProcess.on('close', async (code, signal) => {
123
+ clearInterval(stallCheckInterval);
124
+ if (firstEventTimer)
125
+ clearTimeout(firstEventTimer);
126
+ watchdog?.clearAll();
127
+ await classifyUnmatchedStderr(stderr, errorAlreadySurfaced, code, config);
128
+ if (claudeProcess.pid)
129
+ runningProcesses.delete(claudeProcess.pid);
130
+ const result = buildCloseResult(ctx, stdout, stderr, code, signal, sessionCapture, spawnedAt);
131
+ if (ctx.startupTimedOut) {
132
+ result.error = `The engine produced no output within ${Math.round(firstEventDeadlineMs / 1000)}s of starting.`;
133
+ }
134
+ if (spawnProvedEngineAvailable(result)) {
135
+ engineAvailability.noteSuccessfulSpawn();
136
+ }
137
+ options.onLiveContext?.(null);
138
+ resolve(result);
139
+ });
140
+ claudeProcess.on('error', (error) => {
141
+ clearInterval(stallCheckInterval);
142
+ if (firstEventTimer)
143
+ clearTimeout(firstEventTimer);
144
+ watchdog?.clearAll();
145
+ if (claudeProcess.pid)
146
+ runningProcesses.delete(claudeProcess.pid);
147
+ options.onLiveContext?.(null);
148
+ handleSpawnError(error, config, reject);
149
+ });
150
+ });
151
+ }
@@ -0,0 +1,92 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { EventEmitter } from 'node:events';
4
+ import { describeParkUntil } from './engine-notice.js';
5
+ export class EngineAvailability extends EventEmitter {
6
+ clock;
7
+ parkedUntil = null;
8
+ parkNotice = null;
9
+ authNotice = null;
10
+ constructor(clock = Date.now) {
11
+ super();
12
+ this.clock = clock;
13
+ }
14
+ observe(notice, now = this.clock()) {
15
+ if (notice.kind === 'limit') {
16
+ this.park(notice.resetAt ?? now, notice, now);
17
+ }
18
+ else if (notice.kind === 'auth') {
19
+ this.blockAuth(notice, now);
20
+ }
21
+ }
22
+ park(until, notice, now = this.clock()) {
23
+ if (this.parkedUntil !== null && this.parkedUntil >= until)
24
+ return;
25
+ this.parkedUntil = until;
26
+ this.parkNotice = notice;
27
+ this.emit('changed', this.snapshot(now));
28
+ }
29
+ blockAuth(notice, now = this.clock()) {
30
+ this.authNotice = notice;
31
+ this.emit('changed', this.snapshot(now));
32
+ }
33
+ noteSuccessfulSpawn() {
34
+ if (this.authNotice === null && this.parkedUntil === null)
35
+ return;
36
+ this.authNotice = null;
37
+ this.parkedUntil = null;
38
+ this.parkNotice = null;
39
+ this.emit('changed', this.snapshot());
40
+ }
41
+ clearPark() {
42
+ if (this.parkedUntil === null)
43
+ return;
44
+ this.parkedUntil = null;
45
+ this.parkNotice = null;
46
+ this.emit('changed', this.snapshot());
47
+ }
48
+ clearAuthBlock() {
49
+ if (this.authNotice === null)
50
+ return;
51
+ this.authNotice = null;
52
+ this.emit('changed', this.snapshot());
53
+ }
54
+ reset() {
55
+ this.parkedUntil = null;
56
+ this.parkNotice = null;
57
+ this.authNotice = null;
58
+ this.emit('changed', this.snapshot());
59
+ }
60
+ isParked(now = this.clock()) {
61
+ return this.activePark(now) !== null;
62
+ }
63
+ isAuthBlocked() {
64
+ return this.authNotice !== null;
65
+ }
66
+ automaticDispatchBlocker(now = this.clock()) {
67
+ if (this.authNotice)
68
+ return { kind: 'auth', notice: this.authNotice };
69
+ const park = this.activePark(now);
70
+ return park ? { kind: 'limit', notice: park.notice, until: park.until } : null;
71
+ }
72
+ snapshot(now = this.clock()) {
73
+ const park = this.activePark(now);
74
+ return {
75
+ ...(park ? { parkedUntil: park.until } : {}),
76
+ authBlocked: this.authNotice !== null,
77
+ ...(this.authNotice ? { notice: this.authNotice } : park ? { notice: park.notice } : {}),
78
+ };
79
+ }
80
+ activePark(now) {
81
+ if (this.parkedUntil === null || this.parkNotice === null || now >= this.parkedUntil)
82
+ return null;
83
+ return { until: this.parkedUntil, notice: this.parkNotice };
84
+ }
85
+ }
86
+ export function describeDispatchBlocker(blocker, now = Date.now()) {
87
+ if (blocker.kind === 'limit') {
88
+ return `usage limit reached — resets ${blocker.until !== undefined ? describeParkUntil(blocker.until, now) : 'later'}`;
89
+ }
90
+ return `Claude Code is not authenticated (${blocker.notice.text.slice(0, 120)}) — run \`claude login\``;
91
+ }
92
+ export const engineAvailability = new EngineAvailability();
@@ -0,0 +1,185 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ const NOTICE_TEXT_MAX = 600;
4
+ export const LIMIT_DEFAULT_PARK_MS = 15 * 60_000;
5
+ export const LIMIT_SESSION_PARK_MAX_MS = 6 * 60 * 60_000;
6
+ export const LIMIT_WEEKLY_PARK_MAX_MS = 8 * 24 * 60 * 60_000;
7
+ const LIMIT_PARK_MIN_MS = 60_000;
8
+ const LIMIT_PATTERNS = [
9
+ /you(?:'|’)?ve (?:hit|reached) your (?:[\w .-]{0,40}?)?limit/i,
10
+ /(?:session|weekly|daily|monthly|usage) limit (?:reached|hit|exceeded)/i,
11
+ /\/usage-credits/i,
12
+ /usage[- ]limit/i,
13
+ /quota (?:exceeded|reached)/i,
14
+ /out of (?:usage )?credits/i,
15
+ ];
16
+ const AUTH_PATTERNS = [
17
+ /not logged in/i,
18
+ /please run \/login/i,
19
+ /failed to authenticate/i,
20
+ /authentication[_ ](?:error|failed|required)/i,
21
+ /oauth (?:token|session)[\w ]{0,20}expired/i,
22
+ /invalid (?:api[- ]?key|credentials)/i,
23
+ /organization has (?:been )?disabled/i,
24
+ /\b(?:401|403)\b[^\n]{0,60}(?:unauthorized|forbidden|permission|authenticat)/i,
25
+ /api error:\s*(?:401|403)\b/i,
26
+ ];
27
+ const SERVER_ERROR_PATTERNS = [
28
+ /api error:\s*5\d\d\b/i,
29
+ /\b(?:500|502|503|504|529)\b[^\n]{0,60}(?:internal server error|bad gateway|service unavailable|gateway timeout|overloaded)/i,
30
+ /(?:internal server error|bad gateway|service unavailable|gateway timeout|overloaded)[^\n]{0,60}\b(?:500|502|503|504|529)\b/i,
31
+ /\boverloaded_error\b/i,
32
+ /\brate_limit_error\b/i,
33
+ /api error:\s*429\b/i,
34
+ /too many requests/i,
35
+ ];
36
+ export const SYNTHETIC_MODEL = '<synthetic>';
37
+ export function isSyntheticModel(model) {
38
+ return model === SYNTHETIC_MODEL;
39
+ }
40
+ function matchesAny(patterns, text) {
41
+ return patterns.some((re) => re.test(text));
42
+ }
43
+ export function classifyEngineNotice(raw, source, now = Date.now()) {
44
+ if (!raw)
45
+ return null;
46
+ const text = raw.trim().slice(0, NOTICE_TEXT_MAX);
47
+ if (!text)
48
+ return null;
49
+ if (matchesAny(LIMIT_PATTERNS, text)) {
50
+ const parsed = parseLimitResetAt(text, now);
51
+ return {
52
+ kind: 'limit',
53
+ text,
54
+ source,
55
+ resetAt: parsed ?? now + LIMIT_DEFAULT_PARK_MS,
56
+ resetParsed: parsed !== undefined,
57
+ };
58
+ }
59
+ if (matchesAny(AUTH_PATTERNS, text))
60
+ return { kind: 'auth', text, source };
61
+ if (matchesAny(SERVER_ERROR_PATTERNS, text))
62
+ return { kind: 'server_error', text, source };
63
+ return null;
64
+ }
65
+ export function toEngineNoticeRecord(notice) {
66
+ return {
67
+ kind: notice.kind,
68
+ text: notice.text,
69
+ source: notice.source,
70
+ ...(notice.resetAt !== undefined ? { resetAt: new Date(notice.resetAt).toISOString() } : {}),
71
+ };
72
+ }
73
+ export function describeParkUntil(resetAt, now = Date.now()) {
74
+ const minutes = Math.max(1, Math.round((resetAt - now) / 60_000));
75
+ const when = new Date(resetAt).toISOString().replace('T', ' ').slice(0, 16);
76
+ return `${when} UTC (~${minutes} min)`;
77
+ }
78
+ const MONTHS = {
79
+ jan: 0, feb: 1, mar: 2, apr: 3, may: 4, jun: 5, jul: 6, aug: 7, sep: 8, sept: 8, oct: 9, nov: 10, dec: 11,
80
+ };
81
+ const RESET_RE = /resets?\s+(?:at\s+)?(?:(?:on\s+)?([A-Za-z]{3,9})\s+(\d{1,2})(?:st|nd|rd|th)?,?\s+)?(\d{1,2})(?::(\d{2}))?\s*(am|pm)?\s*(?:\(([^)]+)\)|([A-Z]{2,5})\b)?/i;
82
+ const WEEKLY_RE = /weekly limit|resets?\s+(?:on\s+)?[A-Za-z]{3,9}\s+\d{1,2}/i;
83
+ export function parseLimitResetAt(text, now = Date.now()) {
84
+ const match = RESET_RE.exec(text);
85
+ if (!match)
86
+ return undefined;
87
+ const [, monthName, dayStr, hourStr, minuteStr, meridiem, zoneParen, zoneBare] = match;
88
+ const clock = parseClockTime(hourStr, minuteStr, meridiem);
89
+ if (!clock)
90
+ return undefined;
91
+ const zone = normalizeZone(zoneParen ?? zoneBare);
92
+ const nowParts = zonedParts(now, zone);
93
+ const calendar = resolveCalendarDay(monthName, dayStr, nowParts);
94
+ if (!calendar)
95
+ return undefined;
96
+ const resetAt = rollForward(zonedToUtc(nowParts.year, calendar.month, calendar.day, clock.hour, clock.minute, zone), { ...calendar, ...clock, year: nowParts.year, zone, named: calendar.named }, now);
97
+ const maxPark = WEEKLY_RE.test(text) ? LIMIT_WEEKLY_PARK_MAX_MS : LIMIT_SESSION_PARK_MAX_MS;
98
+ return Math.min(Math.max(resetAt, now + LIMIT_PARK_MIN_MS), now + maxPark);
99
+ }
100
+ function parseClockTime(hourStr, minuteStr, meridiem) {
101
+ let hour = Number.parseInt(hourStr, 10);
102
+ const minute = minuteStr ? Number.parseInt(minuteStr, 10) : 0;
103
+ if (!Number.isFinite(hour) || hour > 23 || minute > 59)
104
+ return undefined;
105
+ if (meridiem) {
106
+ const pm = meridiem.toLowerCase() === 'pm';
107
+ if (hour === 12)
108
+ hour = pm ? 12 : 0;
109
+ else if (pm)
110
+ hour += 12;
111
+ }
112
+ return { hour, minute };
113
+ }
114
+ function resolveCalendarDay(monthName, dayStr, nowParts) {
115
+ if (!monthName || !dayStr)
116
+ return { month: nowParts.month, day: nowParts.day, named: false };
117
+ const month = MONTHS[monthName.toLowerCase().slice(0, 4)] ?? MONTHS[monthName.toLowerCase().slice(0, 3)];
118
+ const day = Number.parseInt(dayStr, 10);
119
+ if (month === undefined || !Number.isFinite(day) || day < 1 || day > 31)
120
+ return undefined;
121
+ return { month, day, named: true };
122
+ }
123
+ function rollForward(resetAt, at, now) {
124
+ if (at.named) {
125
+ return resetAt < now - 24 * 60 * 60_000 ? zonedToUtc(at.year + 1, at.month, at.day, at.hour, at.minute, at.zone) : resetAt;
126
+ }
127
+ return resetAt <= now ? zonedToUtc(at.year, at.month, at.day + 1, at.hour, at.minute, at.zone) : resetAt;
128
+ }
129
+ function normalizeZone(zone) {
130
+ if (!zone)
131
+ return 'UTC';
132
+ const trimmed = zone.trim();
133
+ if (/^(utc|gmt|z)$/i.test(trimmed))
134
+ return 'UTC';
135
+ try {
136
+ new Intl.DateTimeFormat('en-US', { timeZone: trimmed });
137
+ return trimmed;
138
+ }
139
+ catch {
140
+ return 'UTC';
141
+ }
142
+ }
143
+ function zonedParts(utcMs, zone) {
144
+ const parts = new Intl.DateTimeFormat('en-US', {
145
+ timeZone: zone,
146
+ hourCycle: 'h23',
147
+ year: 'numeric', month: 'numeric', day: 'numeric',
148
+ hour: 'numeric', minute: 'numeric', second: 'numeric',
149
+ }).formatToParts(new Date(utcMs));
150
+ const get = (type) => Number.parseInt(parts.find((p) => p.type === type)?.value ?? '0', 10);
151
+ return { year: get('year'), month: get('month') - 1, day: get('day'), hour: get('hour') % 24, minute: get('minute'), second: get('second') };
152
+ }
153
+ function zoneOffsetMs(utcMs, zone) {
154
+ const p = zonedParts(utcMs, zone);
155
+ return Date.UTC(p.year, p.month, p.day, p.hour, p.minute, p.second) - utcMs;
156
+ }
157
+ function zonedToUtc(year, month, day, hour, minute, zone) {
158
+ const guess = Date.UTC(year, month, day, hour, minute);
159
+ const first = guess - zoneOffsetMs(guess, zone);
160
+ return guess - zoneOffsetMs(first, zone);
161
+ }
162
+ const BENIGN_STDERR_PATTERNS = [
163
+ /ignoring \d+ permissions\.allow entr(?:y|ies)/i,
164
+ /this workspace has not been trusted/i,
165
+ /^\s*\[?(?:deprecat|warn(?:ing)?)\]?[:\s]/i,
166
+ /punycode/i,
167
+ /ExperimentalWarning/i,
168
+ /^\s*\(Use `node --trace/i,
169
+ ];
170
+ export function filterBenignStderr(stderr) {
171
+ if (!stderr)
172
+ return '';
173
+ return stderr
174
+ .split('\n')
175
+ .filter((line) => line.trim().length > 0 && !BENIGN_STDERR_PATTERNS.some((re) => re.test(line)))
176
+ .join('\n')
177
+ .trim();
178
+ }
179
+ export const STDERR_TAIL_MAX = 2_000;
180
+ export function stderrTailOf(stderr) {
181
+ const trimmed = (stderr ?? '').trim();
182
+ if (!trimmed)
183
+ return undefined;
184
+ return trimmed.length > STDERR_TAIL_MAX ? trimmed.slice(-STDERR_TAIL_MAX) : trimmed;
185
+ }