@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,256 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { spawn } from 'node:child_process';
4
+ import { accessSync, existsSync, constants as fsConstants, mkdirSync, readFileSync, renameSync, rmSync, } from 'node:fs';
5
+ import { createRequire } from 'node:module';
6
+ import { join } from 'node:path';
7
+ import { MINIONRY_ROOT } from '../../utils/paths.js';
8
+ export const PUBLIC_NPM_REGISTRY = 'https://registry.npmjs.org/';
9
+ export const DEFAULT_ELECTRON_VERSION = '^41.8.0';
10
+ const DEFAULT_PACKAGE_ROOT = MINIONRY_ROOT;
11
+ export function electronStagingDir(packageRoot) {
12
+ return join(packageRoot, '.electron-stage');
13
+ }
14
+ export function buildElectronRepairCommand(packageRoot, version) {
15
+ const range = version ?? defaultReadElectronVersion(packageRoot);
16
+ const stage = electronStagingDir(packageRoot);
17
+ const target = join(packageRoot, 'node_modules', 'electron');
18
+ return [
19
+ `rm -rf '${stage}'`,
20
+ `npm install 'electron@${range}' --prefix '${stage}' --no-audit --no-fund --registry=${PUBLIC_NPM_REGISTRY}`,
21
+ `rm -rf '${target}'`,
22
+ `mv '${join(stage, 'node_modules', 'electron')}' '${target}'`,
23
+ `rm -rf '${stage}'`,
24
+ ].join(' && \\\n ');
25
+ }
26
+ function defaultResolveElectronBinary() {
27
+ try {
28
+ const require_ = createRequire(import.meta.url);
29
+ const resolved = require_('electron');
30
+ return typeof resolved === 'string' ? resolved : null;
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ function buildInstallEnv(base) {
37
+ const env = {};
38
+ for (const [key, value] of Object.entries(base)) {
39
+ if (key.toLowerCase().startsWith('npm_') || key === 'INIT_CWD' || key === 'NODE_ENV')
40
+ continue;
41
+ env[key] = value;
42
+ }
43
+ return env;
44
+ }
45
+ function defaultCanWrite(p) {
46
+ try {
47
+ accessSync(p, fsConstants.W_OK);
48
+ return true;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ function defaultReadElectronVersion(packageRoot) {
55
+ try {
56
+ const pkg = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'));
57
+ return (pkg.optionalDependencies?.electron ?? pkg.dependencies?.electron ?? DEFAULT_ELECTRON_VERSION);
58
+ }
59
+ catch {
60
+ return DEFAULT_ELECTRON_VERSION;
61
+ }
62
+ }
63
+ const defaultSpawn = (cmd, args, opts) => new Promise((resolveExit) => {
64
+ const child = spawn(cmd, args, {
65
+ cwd: opts.cwd,
66
+ stdio: ['ignore', 'pipe', 'pipe'],
67
+ env: opts.env ?? process.env,
68
+ windowsHide: true,
69
+ });
70
+ let tail = '';
71
+ const TAIL_CAP = 4_000;
72
+ const append = (chunk) => {
73
+ const text = chunk.toString('utf8');
74
+ tail = (tail + text).slice(-TAIL_CAP);
75
+ if (opts.onLine) {
76
+ for (const line of text.split('\n')) {
77
+ if (line.trim().length > 0)
78
+ opts.onLine(line);
79
+ }
80
+ }
81
+ };
82
+ child.stdout?.on('data', append);
83
+ child.stderr?.on('data', append);
84
+ child.on('error', (err) => {
85
+ tail = `${tail}\nspawn error: ${err.message}`.slice(-TAIL_CAP);
86
+ resolveExit({ ok: false, code: null, tail });
87
+ });
88
+ child.on('exit', (code) => resolveExit({ ok: code === 0, code, tail }));
89
+ });
90
+ export class ElectronRuntimeProvisioner {
91
+ packageRoot;
92
+ resolveElectronBinary;
93
+ pathExists;
94
+ readElectronVersion;
95
+ spawnFn;
96
+ installEnv;
97
+ mkdir;
98
+ rm;
99
+ move;
100
+ canWrite;
101
+ constructor(deps = {}) {
102
+ this.packageRoot = deps.packageRoot ?? DEFAULT_PACKAGE_ROOT;
103
+ this.resolveElectronBinary = deps.resolveElectronBinary ?? defaultResolveElectronBinary;
104
+ this.pathExists = deps.pathExists ?? existsSync;
105
+ this.readElectronVersion =
106
+ deps.readElectronVersion ?? (() => defaultReadElectronVersion(this.packageRoot));
107
+ this.spawnFn = deps.spawn ?? defaultSpawn;
108
+ this.installEnv = buildInstallEnv(deps.env ?? process.env);
109
+ this.mkdir = deps.mkdir ?? ((p) => mkdirSync(p, { recursive: true }));
110
+ this.rm = deps.rm ?? ((p) => rmSync(p, { recursive: true, force: true }));
111
+ this.move = deps.move ?? renameSync;
112
+ this.canWrite = deps.canWrite ?? defaultCanWrite;
113
+ }
114
+ get root() {
115
+ return this.packageRoot;
116
+ }
117
+ status() {
118
+ const resolved = this.resolveElectronBinary();
119
+ if (resolved && this.pathExists(resolved)) {
120
+ return { provisioned: true, binaryPath: resolved, state: 'ok' };
121
+ }
122
+ const pkgManifest = join(this.packageRoot, 'node_modules', 'electron', 'package.json');
123
+ if (this.pathExists(pkgManifest)) {
124
+ return { provisioned: false, binaryPath: resolved, state: 'binary-missing' };
125
+ }
126
+ return { provisioned: false, binaryPath: null, state: 'package-missing' };
127
+ }
128
+ async provision(onLine) {
129
+ const log = onLine ?? (() => { });
130
+ const before = this.status();
131
+ if (before.provisioned) {
132
+ return { ok: true, status: before, action: 'noop' };
133
+ }
134
+ let action = 'failed';
135
+ if (before.state === 'binary-missing') {
136
+ log('Electron package present but its binary is missing — downloading it…');
137
+ action = 'binary-download';
138
+ const installJs = join(this.packageRoot, 'node_modules', 'electron', 'install.js');
139
+ const r = await this.spawnFn(process.execPath, [installJs], {
140
+ cwd: join(this.packageRoot, 'node_modules', 'electron'),
141
+ onLine: log,
142
+ env: this.installEnv,
143
+ });
144
+ if (!r.ok && !this.status().provisioned) {
145
+ log('Binary download failed; reinstalling the electron package…');
146
+ action = 'npm-install';
147
+ await this.runNpmInstall(log, true);
148
+ }
149
+ }
150
+ else {
151
+ action = 'npm-install';
152
+ await this.runNpmInstall(log, false);
153
+ }
154
+ const after = this.status();
155
+ if (after.provisioned) {
156
+ return { ok: true, status: after, action };
157
+ }
158
+ return { ok: false, status: after, action: 'failed', error: this.describeFailure(after) };
159
+ }
160
+ async runNpmInstall(log, force) {
161
+ const version = this.readElectronVersion();
162
+ const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
163
+ const stage = electronStagingDir(this.packageRoot);
164
+ const staged = join(stage, 'node_modules', 'electron');
165
+ const target = join(this.packageRoot, 'node_modules', 'electron');
166
+ log(`Installing electron@${version} into ${this.packageRoot} from ${PUBLIC_NPM_REGISTRY}…`);
167
+ this.rm(stage);
168
+ this.mkdir(stage);
169
+ const args = [
170
+ 'install',
171
+ `electron@${version}`,
172
+ '--prefix',
173
+ stage,
174
+ '--no-audit',
175
+ '--no-fund',
176
+ '--no-package-lock',
177
+ `--registry=${PUBLIC_NPM_REGISTRY}`,
178
+ ];
179
+ if (force)
180
+ args.push('--force');
181
+ const r = await this.spawnFn(npm, args, { cwd: stage, onLine: log, env: this.installEnv });
182
+ if (!r.ok) {
183
+ log(`npm install exited with code ${r.code ?? 'null'}.`);
184
+ this.rm(stage);
185
+ return r;
186
+ }
187
+ if (!this.pathExists(staged)) {
188
+ this.rm(stage);
189
+ return {
190
+ ok: false,
191
+ code: r.code,
192
+ tail: `${r.tail}\nnpm reported success but ${staged} does not exist.`,
193
+ };
194
+ }
195
+ try {
196
+ this.rm(target);
197
+ this.move(staged, target);
198
+ }
199
+ catch (err) {
200
+ const message = err.message;
201
+ log(`Could not move electron into place: ${message}`);
202
+ this.rm(stage);
203
+ return { ok: false, code: r.code, tail: `${r.tail}\n${message}` };
204
+ }
205
+ this.rm(stage);
206
+ return r;
207
+ }
208
+ describeFailure(status) {
209
+ const note = status.state === 'package-missing'
210
+ ? `Could not install electron into ${this.packageRoot}.`
211
+ : `electron is installed at ${this.packageRoot} but its binary is still missing.`;
212
+ if (!this.canWrite(this.packageRoot)) {
213
+ return `${note} ${this.packageRoot} is not writable by this user — re-run with elevated permissions (e.g. \`sudo minion install browser\`) or reinstall the cli.`;
214
+ }
215
+ return `${note} Run the runtime install command printed below.`;
216
+ }
217
+ }
218
+ let inFlight = null;
219
+ let lastFailureAt = 0;
220
+ let lastFailureResult = null;
221
+ export const PROVISION_FAILURE_COOLDOWN_MS = 60_000;
222
+ export function ensureElectronProvisioned(onLine, deps) {
223
+ if (inFlight)
224
+ return inFlight;
225
+ if (lastFailureResult && now() - lastFailureAt < PROVISION_FAILURE_COOLDOWN_MS) {
226
+ return Promise.resolve(lastFailureResult);
227
+ }
228
+ const run = new ElectronRuntimeProvisioner(deps)
229
+ .provision(onLine)
230
+ .then((result) => {
231
+ if (result.ok) {
232
+ lastFailureResult = null;
233
+ }
234
+ else {
235
+ lastFailureResult = result;
236
+ lastFailureAt = now();
237
+ }
238
+ return result;
239
+ })
240
+ .finally(() => {
241
+ inFlight = null;
242
+ });
243
+ inFlight = run;
244
+ return run;
245
+ }
246
+ export function isElectronProvisioning() {
247
+ return inFlight !== null;
248
+ }
249
+ function now() {
250
+ return Date.now();
251
+ }
252
+ export function resetElectronProvisionStateForTests() {
253
+ inFlight = null;
254
+ lastFailureAt = 0;
255
+ lastFailureResult = null;
256
+ }
@@ -0,0 +1,245 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { accessSync, existsSync, constants as fsConstants, readFileSync } from 'node:fs';
4
+ import { createRequire } from 'node:module';
5
+ import { dirname, join } from 'node:path';
6
+ import { MINIONRY_ROOT } from '../../utils/paths.js';
7
+ export const DEFAULT_VIEWPORT = { width: 1280, height: 720 };
8
+ export const DEFAULT_INITIAL_URL = 'about:blank';
9
+ export const LIFECYCLE_EVENTS = new Set([
10
+ 'ready',
11
+ 'restarting',
12
+ 'recovering',
13
+ 'stopped',
14
+ 'crashed',
15
+ ]);
16
+ export const RECOVER_THROTTLE_MS = 5_000;
17
+ export const SIGTERM_GRACE_MS = 5_000;
18
+ export const STARTUP_TIMEOUT_MS = 20_000;
19
+ export const MAX_RESTARTS = 3;
20
+ export const RESTART_BACKOFFS_MS = [1_000, 2_000, 4_000];
21
+ export class TabInfoCache {
22
+ tabs = new Map();
23
+ get(tabId) {
24
+ return this.tabs.get(tabId) ?? null;
25
+ }
26
+ upsert(tabId, info) {
27
+ const prev = this.tabs.get(tabId);
28
+ const next = {
29
+ url: info.url ?? prev?.url ?? '',
30
+ title: info.title ?? prev?.title ?? '',
31
+ ...(info.faviconUrl !== undefined ? { faviconUrl: info.faviconUrl } : prev?.faviconUrl !== undefined ? { faviconUrl: prev.faviconUrl } : {}),
32
+ canGoBack: info.canGoBack ?? prev?.canGoBack ?? false,
33
+ canGoForward: info.canGoForward ?? prev?.canGoForward ?? false,
34
+ ...(info.deviceProfile !== undefined
35
+ ? { deviceProfile: info.deviceProfile }
36
+ : prev?.deviceProfile !== undefined
37
+ ? { deviceProfile: prev.deviceProfile }
38
+ : {}),
39
+ };
40
+ this.tabs.set(tabId, next);
41
+ }
42
+ delete(tabId) {
43
+ this.tabs.delete(tabId);
44
+ }
45
+ clear() {
46
+ this.tabs.clear();
47
+ }
48
+ entries() {
49
+ const out = [];
50
+ for (const [id, info] of this.tabs) {
51
+ out.push({ id, ...info });
52
+ }
53
+ return out;
54
+ }
55
+ has(tabId) {
56
+ return this.tabs.has(tabId);
57
+ }
58
+ }
59
+ export function extractCandidate(raw) {
60
+ if (raw === null || raw === undefined)
61
+ return null;
62
+ if (typeof raw !== 'object')
63
+ return null;
64
+ const obj = raw;
65
+ const out = {};
66
+ if (typeof obj.candidate === 'string')
67
+ out.candidate = obj.candidate;
68
+ if (obj.sdpMLineIndex === null || typeof obj.sdpMLineIndex === 'number') {
69
+ out.sdpMLineIndex = obj.sdpMLineIndex;
70
+ }
71
+ if (obj.sdpMid === null || typeof obj.sdpMid === 'string') {
72
+ out.sdpMid = obj.sdpMid;
73
+ }
74
+ if (obj.usernameFragment === null || typeof obj.usernameFragment === 'string') {
75
+ out.usernameFragment = obj.usernameFragment;
76
+ }
77
+ return out;
78
+ }
79
+ export function extractLeaseExpired(raw) {
80
+ if (!raw || typeof raw !== 'object')
81
+ return null;
82
+ const obj = raw;
83
+ const tabId = typeof obj.tabId === 'string' ? obj.tabId : null;
84
+ const agentId = typeof obj.agentId === 'string' ? obj.agentId : null;
85
+ if (!tabId || !agentId)
86
+ return null;
87
+ const planId = typeof obj.planId === 'string' ? obj.planId : undefined;
88
+ return planId !== undefined ? { tabId, agentId, planId } : { tabId, agentId };
89
+ }
90
+ export function resolveDefaultAppDir() {
91
+ return join(MINIONRY_ROOT, 'electron-host');
92
+ }
93
+ export function buildChildEnv(parent, overrides) {
94
+ const ALLOW = [
95
+ 'DISPLAY',
96
+ 'WAYLAND_DISPLAY',
97
+ 'XDG_RUNTIME_DIR',
98
+ 'XDG_SESSION_TYPE',
99
+ 'HOME',
100
+ 'PATH',
101
+ 'TMPDIR',
102
+ 'TEMP',
103
+ 'TMP',
104
+ 'LANG',
105
+ 'LC_ALL',
106
+ 'ELECTRON_RUN_AS_NODE',
107
+ 'ELECTRON_NO_ASAR',
108
+ 'CHROME_DEVEL_SANDBOX',
109
+ 'MINIONRY_BROWSER_DEBUG',
110
+ 'DBUS_SESSION_BUS_ADDRESS',
111
+ ];
112
+ const out = {};
113
+ for (const key of ALLOW) {
114
+ const value = parent[key];
115
+ if (typeof value === 'string')
116
+ out[key] = value;
117
+ }
118
+ out.ELECTRON_ENABLE_LOGGING = '1';
119
+ if (overrides) {
120
+ for (const [key, value] of Object.entries(overrides)) {
121
+ out[key] = value;
122
+ }
123
+ }
124
+ return out;
125
+ }
126
+ export function resolveDefaultElectronBinary() {
127
+ try {
128
+ const require_ = createRequire(import.meta.url);
129
+ const resolved = require_('electron');
130
+ return typeof resolved === 'string' ? resolved : null;
131
+ }
132
+ catch {
133
+ return null;
134
+ }
135
+ }
136
+ export function readPackageVersion(root) {
137
+ try {
138
+ const parsed = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
139
+ return typeof parsed.version === 'string' ? parsed.version : null;
140
+ }
141
+ catch {
142
+ return null;
143
+ }
144
+ }
145
+ export const BOOT_PACKAGE_VERSION = readPackageVersion(MINIONRY_ROOT);
146
+ function defaultCanExecute(p) {
147
+ try {
148
+ accessSync(p, fsConstants.X_OK);
149
+ return true;
150
+ }
151
+ catch {
152
+ return false;
153
+ }
154
+ }
155
+ export function checkSpawnPreconditions(deps) {
156
+ const pathExists = deps.pathExists ?? existsSync;
157
+ const canExecute = deps.canExecute ?? defaultCanExecute;
158
+ const readInstalled = deps.readInstalledVersion ?? (() => readPackageVersion(MINIONRY_ROOT));
159
+ const installedVersion = readInstalled();
160
+ if (deps.bootVersion !== null && installedVersion !== null && installedVersion !== deps.bootVersion) {
161
+ return (`minion v${installedVersion} is installed on disk but this server is still running v${deps.bootVersion} — ` +
162
+ 'an update replaced the install while it was running. Restart minion, then open the browser again.');
163
+ }
164
+ if (deps.electronBinary === null) {
165
+ return 'the Electron runtime is not installed — run `minion install browser`';
166
+ }
167
+ if (!pathExists(deps.electronBinary)) {
168
+ return `the Electron binary is missing at ${deps.electronBinary} — run \`minion install browser\` to reinstall it`;
169
+ }
170
+ if (!canExecute(deps.electronBinary)) {
171
+ return `the Electron binary at ${deps.electronBinary} is not executable (EACCES) — fix its permissions or run \`minion install browser\``;
172
+ }
173
+ if (!pathExists(join(deps.appDir, 'package.json'))) {
174
+ return (`the browser host app is missing at ${deps.appDir} (no package.json) — ` +
175
+ 'reinstall minion, or run `npm run build:electron-host` in a source checkout');
176
+ }
177
+ return null;
178
+ }
179
+ export function describeSpawnError(err, binary, appDir) {
180
+ const what = `${err.syscall ?? 'spawn'} ${err.path ?? binary}`;
181
+ switch (err.code) {
182
+ case 'ENOENT':
183
+ return (`${what} failed (ENOENT): the Electron binary or the host app dir ${appDir} disappeared — ` +
184
+ 'run `minion install browser`, or restart minion if an update just replaced the install');
185
+ case 'EACCES':
186
+ return `${what} failed (EACCES): ${binary} is not executable — fix its permissions or run \`minion install browser\``;
187
+ default:
188
+ return `${what} failed: ${err.code ?? err.message}`;
189
+ }
190
+ }
191
+ const ROOT_WITHOUT_FLAG = /Running as root without --no-sandbox/;
192
+ const NO_USABLE_SANDBOX = /SUID sandbox helper binary was found, but is not configured correctly|No usable sandbox/;
193
+ const NAMESPACES_BLOCKED = /Failed to move to new namespace|zygote_host_impl_linux\.cc/;
194
+ const EXEC_FAILED = /: exec: .*: (?:not found|Permission denied)/;
195
+ const MISSING_LIBS = /error while loading shared libraries|cannot open shared object file/;
196
+ const APP_MISSING = /Unable to find Electron app|Cannot find module/;
197
+ function classifySandboxFailure(text) {
198
+ if (ROOT_WITHOUT_FLAG.test(text))
199
+ return 'root-without-flag';
200
+ if (NO_USABLE_SANDBOX.test(text))
201
+ return 'no-usable-sandbox';
202
+ if (NAMESPACES_BLOCKED.test(text))
203
+ return 'namespaces-blocked';
204
+ return null;
205
+ }
206
+ export function classifyCrash(reason, stderrTail) {
207
+ const text = [reason, ...stderrTail].join('\n');
208
+ const sandboxFailure = classifySandboxFailure(text);
209
+ if (sandboxFailure !== null) {
210
+ return { permanent: true, hint: null, sandboxFailure };
211
+ }
212
+ if (EXEC_FAILED.test(text)) {
213
+ return {
214
+ permanent: true,
215
+ hint: 'the Electron binary could not be executed — run `minion install browser`, or restart minion if an update just replaced the install',
216
+ sandboxFailure: null,
217
+ };
218
+ }
219
+ if (MISSING_LIBS.test(text)) {
220
+ return {
221
+ permanent: true,
222
+ hint: 'Chromium is missing system libraries — run `minion doctor browser` for the install command',
223
+ sandboxFailure: null,
224
+ };
225
+ }
226
+ if (APP_MISSING.test(text)) {
227
+ return {
228
+ permanent: true,
229
+ hint: 'the browser host app did not load — reinstall minion (`minion update`)',
230
+ sandboxFailure: null,
231
+ };
232
+ }
233
+ return { permanent: false, hint: null, sandboxFailure: null };
234
+ }
235
+ export function resolveSdkStubPath() {
236
+ try {
237
+ const require_ = createRequire(import.meta.url);
238
+ const pkgJsonPath = require_.resolve('@minionry/sdk/package.json');
239
+ const stubPath = join(dirname(pkgJsonPath), 'dist', 'injected', 'v1.js');
240
+ return existsSync(stubPath) ? stubPath : null;
241
+ }
242
+ catch {
243
+ return null;
244
+ }
245
+ }