@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,590 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { execFileSync } from 'node:child_process';
4
+ import { existsSync, statSync } from 'node:fs';
5
+ import { platform as osPlatform } from 'node:os';
6
+ import { delimiter, join } from 'node:path';
7
+ import { MINIONRY_ROOT } from '../../utils/paths.js';
8
+ import { buildFixSteps, isSandboxConfigured, resolveChromeSandboxPath } from './chrome-sandbox.js';
9
+ import { buildElectronRepairCommand } from './electron-provision.js';
10
+ import { resolveDefaultAppDir, resolveDefaultElectronBinary } from './host-internal.js';
11
+ import { parseChromiumSandboxMode, probablyInContainer } from './sandbox-policy.js';
12
+ const PACTL_TIMEOUT_MS = 2_000;
13
+ const LDD_TIMEOUT_MS = 3_000;
14
+ const DEFAULT_SKIP_NOTE = 'Optional step skipped. The browser works without it.';
15
+ export function buildSystemFixCommand(parts, pm) {
16
+ const required = parts.filter((p) => !p.optional).map((p) => p.fix);
17
+ const optional = parts.filter((p) => p.optional).map((p) => p.fix);
18
+ const installs = pm !== null && parts.some((p) => p.fix.packages.length > 0);
19
+ const steps = [];
20
+ if (installs && pm === 'apt')
21
+ steps.push('sudo apt-get update');
22
+ if (pm !== null && required.some((f) => f.packages.length > 0)) {
23
+ steps.push(installCommand(pm, required.map((f) => f.packages)));
24
+ }
25
+ steps.push(...required.flatMap((f) => f.steps));
26
+ for (const fix of optional) {
27
+ const inner = [
28
+ ...(pm !== null && fix.packages.length > 0 ? [installCommand(pm, [fix.packages], ' ')] : []),
29
+ ...fix.steps,
30
+ ];
31
+ if (inner.length === 0)
32
+ continue;
33
+ const note = fix.skipNote ?? DEFAULT_SKIP_NOTE;
34
+ steps.push(`{ ${inner.join(' && \\\n ')} || \\\n echo '${note}'; }`);
35
+ }
36
+ return steps.length > 0 ? steps.join(' && \\\n ') : null;
37
+ }
38
+ function fixBlock(fix, pm, optional = false) {
39
+ const command = buildSystemFixCommand([{ fix, optional }], pm);
40
+ return command ? [command] : [];
41
+ }
42
+ const INSTALL_COMMAND = {
43
+ apt: 'sudo apt-get install -y',
44
+ dnf: 'sudo dnf install -y',
45
+ pacman: 'sudo pacman -S --needed --noconfirm',
46
+ apk: 'sudo apk add --no-cache',
47
+ };
48
+ const ONE_LINE_WIDTH = 72;
49
+ const PACKAGE_LINE_WIDTH = 64;
50
+ function installCommand(pm, groups, indent = ' ') {
51
+ const head = INSTALL_COMMAND[pm];
52
+ const seen = new Set();
53
+ const lines = groups.flatMap((group) => {
54
+ const fresh = group.filter((name) => !seen.has(name));
55
+ for (const name of fresh)
56
+ seen.add(name);
57
+ return wrapWords(fresh, PACKAGE_LINE_WIDTH);
58
+ });
59
+ const oneLine = `${head} ${lines.join(' ')}`;
60
+ if (oneLine.length <= ONE_LINE_WIDTH)
61
+ return oneLine;
62
+ return [head, ...lines].join(` \\\n${indent}`);
63
+ }
64
+ function wrapWords(words, width) {
65
+ const lines = [];
66
+ for (const word of words) {
67
+ const last = lines.length - 1;
68
+ if (last >= 0 && lines[last].length + 1 + word.length <= width)
69
+ lines[last] += ` ${word}`;
70
+ else
71
+ lines.push(word);
72
+ }
73
+ return lines;
74
+ }
75
+ function defaultHasSystemd() {
76
+ return existsSync('/run/systemd/system');
77
+ }
78
+ function defaultProbePactlInfo() {
79
+ try {
80
+ const out = execFileSync('pactl', ['info'], {
81
+ encoding: 'utf8',
82
+ timeout: PACTL_TIMEOUT_MS,
83
+ stdio: ['ignore', 'pipe', 'pipe'],
84
+ });
85
+ return out;
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ }
91
+ function defaultProbeChromeSandbox(electronBinary) {
92
+ const sandboxPath = resolveChromeSandboxPath(electronBinary);
93
+ try {
94
+ const stat = statSync(sandboxPath);
95
+ return { uid: stat.uid, mode: stat.mode };
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ }
101
+ function defaultProbeChromiumLibs(electronBinary) {
102
+ let stdout;
103
+ try {
104
+ stdout = execFileSync('ldd', [electronBinary], {
105
+ encoding: 'utf8',
106
+ timeout: LDD_TIMEOUT_MS,
107
+ stdio: ['ignore', 'pipe', 'pipe'],
108
+ });
109
+ }
110
+ catch (err) {
111
+ const stdoutFromError = err.stdout;
112
+ if (stdoutFromError == null)
113
+ return null;
114
+ stdout = typeof stdoutFromError === 'string' ? stdoutFromError : stdoutFromError.toString('utf8');
115
+ }
116
+ const missing = [];
117
+ for (const line of stdout.split('\n')) {
118
+ const match = line.match(/^\s*([\w./+-]+)\s*=>\s*not found/);
119
+ if (match?.[1])
120
+ missing.push(match[1]);
121
+ }
122
+ return missing;
123
+ }
124
+ export async function preflight(deps = {}) {
125
+ const platform = deps.platform ?? osPlatform();
126
+ const pathExists = deps.pathExists ?? existsSync;
127
+ const pathEnv = deps.pathEnv ?? deps.env?.PATH ?? process.env.PATH;
128
+ const resolveBinary = deps.resolveElectronBinary ?? resolveDefaultElectronBinary;
129
+ const appDir = (deps.resolveAppDir ?? resolveDefaultAppDir)();
130
+ const packageManager = detectPackageManager(pathEnv, pathExists);
131
+ const selfRepairAvailable = deps.selfRepairAvailable ?? true;
132
+ const checks = [
133
+ checkElectronBinary(resolveBinary, pathExists, selfRepairAvailable),
134
+ checkElectronHostDist(appDir, pathExists),
135
+ ];
136
+ if (platform === 'linux') {
137
+ checks.push(checkXvfb(pathEnv, pathExists, packageManager));
138
+ const probePactl = deps.probePactlInfo ?? defaultProbePactlInfo;
139
+ const hasSystemd = (deps.hasSystemd ?? defaultHasSystemd)();
140
+ checks.push(checkPipeWire(probePactl, packageManager, hasSystemd, pathEnv, pathExists));
141
+ const probeLibs = deps.probeChromiumLibs ?? defaultProbeChromiumLibs;
142
+ const electronBinary = resolveBinary();
143
+ checks.push(checkChromiumLibs(electronBinary, probeLibs, packageManager));
144
+ const probeSandbox = deps.probeChromeSandbox ?? defaultProbeChromeSandbox;
145
+ const sandboxMode = deps.sandboxMode ?? parseChromiumSandboxMode(deps.env ?? process.env).mode;
146
+ const inContainer = deps.probablyInContainer ?? probablyInContainer;
147
+ checks.push(checkChromeSandbox(electronBinary, probeSandbox, { sandboxMode, inContainer }));
148
+ }
149
+ const ok = checks.every((c) => c.ok || c.advisory === true);
150
+ return {
151
+ ok,
152
+ platform,
153
+ checks,
154
+ packageManager,
155
+ };
156
+ }
157
+ export function toBrowserPreflightPayload(result, opts) {
158
+ return {
159
+ ok: result.ok,
160
+ platform: result.platform,
161
+ packageManager: result.packageManager,
162
+ chromiumInstalling: opts.chromiumInstalling,
163
+ missing: result.checks
164
+ .filter((c) => !c.ok)
165
+ .map((c) => ({
166
+ id: c.id,
167
+ label: c.label,
168
+ reason: c.reason,
169
+ fixCommands: c.fixCommands,
170
+ advisory: c.advisory === true,
171
+ })),
172
+ };
173
+ }
174
+ function checkElectronBinary(resolveBinary, pathExists, selfRepairAvailable) {
175
+ const path = resolveBinary();
176
+ if (path && pathExists(path)) {
177
+ return {
178
+ id: 'electron',
179
+ label: 'Electron runtime',
180
+ ok: true,
181
+ detected: path,
182
+ reason: null,
183
+ fixCommands: [],
184
+ };
185
+ }
186
+ return {
187
+ id: 'electron',
188
+ label: 'Electron runtime',
189
+ ok: false,
190
+ detected: path,
191
+ reason: path
192
+ ? `Electron resolved to ${path} but its binary is missing on disk — the download was skipped at install time. Reinstall the browser runtime.`
193
+ : selfRepairAvailable
194
+ ?
195
+ 'The browser runtime (Electron) is not installed yet. Minionry installs it automatically when you open the Browser; if that cannot finish, run the command below — it installs Electron into the cli, so it works from any Space.'
196
+ : 'The browser runtime (Electron) is not installed and could not be installed automatically. Run the command below — it installs Electron into the cli itself, so the Browser works from any Space.',
197
+ fixCommands: selfRepairAvailable
198
+ ? ['minion install browser']
199
+ : [buildElectronRepairCommand(MINIONRY_ROOT)],
200
+ };
201
+ }
202
+ function checkElectronHostDist(appDir, pathExists) {
203
+ const mainPath = join(appDir, 'dist', 'main.js');
204
+ if (pathExists(mainPath)) {
205
+ return {
206
+ id: 'electron-host-dist',
207
+ label: 'Electron host build',
208
+ ok: true,
209
+ detected: mainPath,
210
+ reason: null,
211
+ fixCommands: [],
212
+ };
213
+ }
214
+ return {
215
+ id: 'electron-host-dist',
216
+ label: 'Electron host build',
217
+ ok: false,
218
+ detected: null,
219
+ reason: `electron-host build artifact not found at ${mainPath}. Run \`npm run build:electron-host\`.`,
220
+ fixCommands: ['npm run build:electron-host'],
221
+ };
222
+ }
223
+ function checkXvfb(pathEnv, pathExists, pm) {
224
+ const detected = lookupOnPath('Xvfb', pathEnv, pathExists);
225
+ if (detected) {
226
+ return {
227
+ id: 'xvfb',
228
+ label: 'Xvfb (virtual X display)',
229
+ ok: true,
230
+ detected,
231
+ reason: null,
232
+ fixCommands: [],
233
+ };
234
+ }
235
+ return {
236
+ id: 'xvfb',
237
+ label: 'Xvfb (virtual X display)',
238
+ ok: false,
239
+ detected: null,
240
+ reason: 'Xvfb not found on PATH. The Electron browser host needs a virtual X display on Linux — install Xvfb so headless Chromium can render.',
241
+ fixCommands: xvfbInstallCommands(pm),
242
+ systemFix: pm ? { packages: XVFB_PACKAGES[pm], steps: [] } : undefined,
243
+ };
244
+ }
245
+ function checkPipeWire(probePactlInfo, pm, hasSystemd, pathEnv, pathExists) {
246
+ const info = probePactlInfo();
247
+ if (info && /pipewire/i.test(info)) {
248
+ const serverNameLine = info.split('\n').find((l) => /server name/i.test(l));
249
+ return {
250
+ id: 'pipewire',
251
+ label: 'PipeWire audio server',
252
+ ok: true,
253
+ detected: serverNameLine?.trim() ?? 'pactl reports PipeWire',
254
+ reason: null,
255
+ fixCommands: [],
256
+ };
257
+ }
258
+ if (info && /pulseaudio/i.test(info)) {
259
+ return {
260
+ id: 'pipewire',
261
+ label: 'PipeWire audio server',
262
+ ok: false,
263
+ advisory: true,
264
+ detected: 'PulseAudio',
265
+ reason: 'Audio capture is using PulseAudio. Install PipeWire for monotonic timestamps (production-quality A/V sync). The browser host will still start.',
266
+ fixCommands: pipewireInstallCommands(pm, hasSystemd),
267
+ };
268
+ }
269
+ const pipewire = lookupOnPath('pipewire', pathEnv, pathExists);
270
+ const pactl = lookupOnPath('pactl', pathEnv, pathExists);
271
+ if (pipewire && !pactl) {
272
+ const fix = pm ? { packages: [PACTL_PACKAGE[pm]], steps: [], skipNote: AUDIO_SKIP_NOTE } : undefined;
273
+ return {
274
+ id: 'pipewire',
275
+ label: 'PipeWire audio server',
276
+ ok: false,
277
+ advisory: true,
278
+ detected: pipewire,
279
+ reason: 'PipeWire is installed, but `pactl` is not — the browser host needs it to route page audio. Install it to enable audio capture.',
280
+ fixCommands: fix
281
+ ? fixBlock(fix, pm, true)
282
+ : ['# Install `pactl` for your distribution (usually in pulseaudio-utils).'],
283
+ systemFix: fix,
284
+ };
285
+ }
286
+ if (pipewire) {
287
+ if (!hasSystemd) {
288
+ return {
289
+ id: 'pipewire',
290
+ label: 'PipeWire audio server',
291
+ ok: false,
292
+ advisory: true,
293
+ detected: pipewire,
294
+ reason: 'PipeWire is installed but not running, and nothing here can start it — this machine has no systemd (typical in a container). Audio capture stays off; the browser works without it.',
295
+ fixCommands: [
296
+ '# Nothing to install: PipeWire is installed, but this machine has no',
297
+ '# systemd to start it (typical in a container). Audio capture stays off.',
298
+ ],
299
+ };
300
+ }
301
+ const fix = { packages: [], steps: userServiceEnableSteps(hasSystemd), skipNote: AUDIO_SERVICE_SKIP_NOTE };
302
+ return {
303
+ id: 'pipewire',
304
+ label: 'PipeWire audio server',
305
+ ok: false,
306
+ advisory: true,
307
+ detected: pipewire,
308
+ reason: 'PipeWire is installed but not running for this user. Enable its user services to turn on audio capture.',
309
+ fixCommands: fixBlock(fix, pm, true),
310
+ systemFix: fix,
311
+ };
312
+ }
313
+ return {
314
+ id: 'pipewire',
315
+ label: 'PipeWire audio server',
316
+ ok: false,
317
+ advisory: true,
318
+ detected: null,
319
+ reason: 'No sound server answered `pactl info`. Audio capture will be disabled. Install PipeWire (recommended) to enable it.',
320
+ fixCommands: pipewireInstallCommands(pm, hasSystemd),
321
+ systemFix: pm ? pipewireFix(pm, hasSystemd) : undefined,
322
+ };
323
+ }
324
+ function checkChromiumLibs(electronBinary, probe, pm) {
325
+ if (!electronBinary) {
326
+ return {
327
+ id: 'chromium-libs',
328
+ label: 'Chromium runtime libraries',
329
+ ok: true,
330
+ detected: 'not checked — Electron runtime missing',
331
+ reason: null,
332
+ fixCommands: [],
333
+ };
334
+ }
335
+ const missing = probe(electronBinary);
336
+ if (missing === null) {
337
+ return {
338
+ id: 'chromium-libs',
339
+ label: 'Chromium runtime libraries',
340
+ ok: true,
341
+ detected: 'ldd unavailable — skipped',
342
+ reason: null,
343
+ fixCommands: [],
344
+ };
345
+ }
346
+ if (missing.length === 0) {
347
+ return {
348
+ id: 'chromium-libs',
349
+ label: 'Chromium runtime libraries',
350
+ ok: true,
351
+ detected: 'all libraries present',
352
+ reason: null,
353
+ fixCommands: [],
354
+ };
355
+ }
356
+ return {
357
+ id: 'chromium-libs',
358
+ label: 'Chromium runtime libraries',
359
+ ok: false,
360
+ detected: missing.join(', '),
361
+ reason: `Electron's Chromium can't start — the dynamic linker reports these libraries as not found: ${missing.join(', ')}. ` +
362
+ 'Install the system-wide Chromium runtime dependencies.',
363
+ fixCommands: chromiumLibsInstallCommands(pm),
364
+ systemFix: pm ? chromiumLibsFix(pm) : undefined,
365
+ };
366
+ }
367
+ function checkChromeSandbox(electronBinary, probe, policy) {
368
+ if (policy.sandboxMode === 'off') {
369
+ return {
370
+ id: 'chrome-sandbox',
371
+ label: 'Chromium sandbox helper',
372
+ ok: true,
373
+ detected: 'not needed — Chromium sandbox off (MINIONRY_CHROMIUM_SANDBOX=off)',
374
+ reason: null,
375
+ fixCommands: [],
376
+ };
377
+ }
378
+ if (!electronBinary) {
379
+ return {
380
+ id: 'chrome-sandbox',
381
+ label: 'Chromium sandbox helper',
382
+ ok: true,
383
+ detected: 'not checked — Electron runtime missing',
384
+ reason: null,
385
+ fixCommands: [],
386
+ };
387
+ }
388
+ const stat = probe(electronBinary);
389
+ if (stat === null) {
390
+ return {
391
+ id: 'chrome-sandbox',
392
+ label: 'Chromium sandbox helper',
393
+ ok: true,
394
+ detected: 'chrome-sandbox not present — skipped (older Electron build)',
395
+ reason: null,
396
+ fixCommands: [],
397
+ };
398
+ }
399
+ if (isSandboxConfigured(stat.uid, stat.mode)) {
400
+ return {
401
+ id: 'chrome-sandbox',
402
+ label: 'Chromium sandbox helper',
403
+ ok: true,
404
+ detected: 'root-owned, mode 4755',
405
+ reason: null,
406
+ fixCommands: [],
407
+ };
408
+ }
409
+ const sandboxPath = resolveChromeSandboxPath(electronBinary);
410
+ const actualMode = (stat.mode & 0o7777).toString(8).padStart(4, '0');
411
+ const misconfigured = `${sandboxPath} must be owned by root with mode 4755 (currently uid=${stat.uid}, mode=${actualMode}). `;
412
+ if (policy.sandboxMode === 'auto' && policy.inContainer()) {
413
+ const fix = {
414
+ packages: [],
415
+ steps: buildFixSteps(sandboxPath),
416
+ skipNote: 'Chromium sandbox helper not fixed. The browser runs without its sandbox in this container.',
417
+ };
418
+ return {
419
+ id: 'chrome-sandbox',
420
+ label: 'Chromium sandbox helper',
421
+ ok: false,
422
+ advisory: true,
423
+ detected: `uid=${stat.uid} mode=${actualMode}`,
424
+ reason: `${misconfigured}Not blocking inside a container: when Chromium cannot start its sandbox here, the browser host ` +
425
+ 'relaunches without it and the container is the isolation boundary (MINIONRY_CHROMIUM_SANDBOX=auto). ' +
426
+ 'Fix the helper to keep the sandbox on when the container is started with a seccomp profile that allows user namespaces.',
427
+ fixCommands: fixBlock(fix, null, true),
428
+ systemFix: fix,
429
+ };
430
+ }
431
+ const fix = { packages: [], steps: buildFixSteps(sandboxPath) };
432
+ return {
433
+ id: 'chrome-sandbox',
434
+ label: 'Chromium sandbox helper',
435
+ ok: false,
436
+ detected: `uid=${stat.uid} mode=${actualMode}`,
437
+ reason: `${misconfigured}Chromium aborts at launch otherwise — this is npm's standard post-install gap for the Electron tarball. ` +
438
+ 'Re-run this after each Minionry update: reinstalling the package re-extracts Electron and strips the setuid bit again.',
439
+ fixCommands: fixBlock(fix, null),
440
+ systemFix: fix,
441
+ };
442
+ }
443
+ export class BrowserPreflightError extends Error {
444
+ code = 'BROWSER_PREFLIGHT_FAILED';
445
+ missing;
446
+ packageManager;
447
+ platform;
448
+ constructor(result) {
449
+ const missing = result.checks.filter((c) => !c.ok && !c.advisory);
450
+ const summary = missing.map((c) => c.label).join(', ');
451
+ super(`Browser preflight failed — missing: ${summary || 'unknown'}.`);
452
+ this.name = 'BrowserPreflightError';
453
+ this.missing = missing;
454
+ this.packageManager = result.packageManager;
455
+ this.platform = result.platform;
456
+ }
457
+ toJSON() {
458
+ return {
459
+ code: this.code,
460
+ message: this.message,
461
+ platform: this.platform,
462
+ packageManager: this.packageManager,
463
+ missing: this.missing,
464
+ };
465
+ }
466
+ }
467
+ export function lookupOnPath(name, pathEnv, pathExists = existsSync) {
468
+ if (!pathEnv)
469
+ return null;
470
+ for (const dir of pathEnv.split(delimiter)) {
471
+ if (!dir)
472
+ continue;
473
+ const candidate = join(dir, name);
474
+ if (pathExists(candidate))
475
+ return candidate;
476
+ }
477
+ return null;
478
+ }
479
+ export function detectPackageManager(pathEnv, pathExists = existsSync) {
480
+ if (lookupOnPath('apt-get', pathEnv, pathExists))
481
+ return 'apt';
482
+ if (lookupOnPath('dnf', pathEnv, pathExists))
483
+ return 'dnf';
484
+ if (lookupOnPath('pacman', pathEnv, pathExists))
485
+ return 'pacman';
486
+ if (lookupOnPath('apk', pathEnv, pathExists))
487
+ return 'apk';
488
+ return null;
489
+ }
490
+ const XVFB_PACKAGES = {
491
+ apt: ['xvfb', 'xauth'],
492
+ dnf: ['xorg-x11-server-Xvfb', 'xorg-x11-xauth'],
493
+ pacman: ['xorg-server-xvfb', 'xorg-xauth'],
494
+ apk: ['xvfb', 'xauth'],
495
+ };
496
+ export function xvfbInstallCommands(pm) {
497
+ if (pm === null) {
498
+ return [
499
+ '# No supported package manager detected (apt/dnf/pacman/apk).',
500
+ '# Install Xvfb manually for your distribution — the canonical',
501
+ '# binary name is `Xvfb` (case-sensitive) on PATH.',
502
+ ];
503
+ }
504
+ return fixBlock({ packages: XVFB_PACKAGES[pm], steps: [] }, pm);
505
+ }
506
+ const PIPEWIRE_PACKAGES = {
507
+ apt: ['pipewire', 'pipewire-pulse', 'wireplumber', 'pulseaudio-utils'],
508
+ dnf: ['pipewire', 'pipewire-pulseaudio', 'wireplumber', 'pulseaudio-utils'],
509
+ pacman: ['pipewire', 'pipewire-pulse', 'wireplumber', 'libpulse'],
510
+ apk: ['pipewire', 'pipewire-pulse', 'wireplumber', 'pulseaudio-utils'],
511
+ };
512
+ const PACTL_PACKAGE = {
513
+ apt: 'pulseaudio-utils',
514
+ dnf: 'pulseaudio-utils',
515
+ pacman: 'libpulse',
516
+ apk: 'pulseaudio-utils',
517
+ };
518
+ const AUDIO_SKIP_NOTE = 'Audio setup did not finish. It is optional: the browser works without it.';
519
+ const AUDIO_SERVICE_SKIP_NOTE = 'Audio did not start yet (optional: the browser works without it). Log in once or reboot, then run this again.';
520
+ function pipewireFix(pm, hasSystemd) {
521
+ const steps = pm === 'apk' ? [] : userServiceEnableSteps(hasSystemd);
522
+ return {
523
+ packages: PIPEWIRE_PACKAGES[pm],
524
+ steps,
525
+ skipNote: steps.length > 0 ? AUDIO_SERVICE_SKIP_NOTE : AUDIO_SKIP_NOTE,
526
+ };
527
+ }
528
+ export function pipewireInstallCommands(pm, hasSystemd = defaultHasSystemd()) {
529
+ if (pm === null) {
530
+ return [
531
+ '# No supported package manager detected (apt/dnf/pacman/apk).',
532
+ '# Install pipewire + pipewire-pulse (or pipewire-pulseaudio on Fedora)',
533
+ '# + wireplumber + pactl (pulseaudio-utils) for your distribution,',
534
+ '# then enable the user services.',
535
+ ];
536
+ }
537
+ return fixBlock(pipewireFix(pm, hasSystemd), pm, true);
538
+ }
539
+ function userServiceEnableSteps(hasSystemd) {
540
+ if (!hasSystemd)
541
+ return [];
542
+ return [
543
+ 'sudo loginctl enable-linger "$USER"',
544
+ 'XDG_RUNTIME_DIR="/run/user/$(id -u)" systemctl --user --now enable pipewire pipewire-pulse wireplumber',
545
+ ];
546
+ }
547
+ export function chromiumInstallCommands(_platform) {
548
+ return ['minion install browser'];
549
+ }
550
+ const CHROMIUM_LIB_PACKAGES = {
551
+ apt: [
552
+ 'libnss3', 'libnspr4', 'libdbus-1-3', 'libatk1.0-0', 'libatk-bridge2.0-0',
553
+ 'libcups2', 'libdrm2', 'libxkbcommon0', 'libxcomposite1', 'libxdamage1',
554
+ 'libxfixes3', 'libxrandr2', 'libgbm1', 'libpango-1.0-0', 'libcairo2',
555
+ 'libxshmfence1', 'libxtst6', 'libatspi2.0-0', 'libnotify4', 'libsecret-1-0',
556
+ ],
557
+ dnf: [
558
+ 'nss', 'nspr', 'at-spi2-atk', 'cups-libs', 'libdrm', 'libXcomposite', 'libXdamage',
559
+ 'libXfixes', 'libXrandr', 'libXScrnSaver', 'libXtst', 'libxshmfence',
560
+ 'mesa-libgbm', 'pango', 'cairo', 'alsa-lib', 'libnotify', 'libsecret', 'gtk3',
561
+ ],
562
+ pacman: [
563
+ 'nss', 'nspr', 'at-spi2-atk', 'libcups', 'libdrm', 'libxcomposite', 'libxdamage',
564
+ 'libxfixes', 'libxrandr', 'libxss', 'libxtst', 'libxshmfence',
565
+ 'mesa', 'pango', 'cairo', 'alsa-lib', 'libnotify', 'libsecret', 'gtk3',
566
+ ],
567
+ apk: [
568
+ 'nss', 'nspr', 'dbus-libs', 'at-spi2-atk', 'cups-libs', 'libdrm', 'libxkbcommon',
569
+ 'libxcomposite', 'libxdamage', 'libxfixes', 'libxrandr', 'libxscrnsaver', 'libxtst',
570
+ 'mesa-gbm', 'pango', 'cairo', 'alsa-lib', 'libnotify', 'libsecret', 'gtk+3.0',
571
+ ],
572
+ };
573
+ const APT_TIME64_STEP = '{ sudo apt-get install -y libasound2t64 libgtk-3-0t64 || \\\n sudo apt-get install -y libasound2 libgtk-3-0; }';
574
+ function chromiumLibsFix(pm) {
575
+ return { packages: CHROMIUM_LIB_PACKAGES[pm], steps: pm === 'apt' ? [APT_TIME64_STEP] : [] };
576
+ }
577
+ export function chromiumLibsInstallCommands(pm) {
578
+ if (pm === null) {
579
+ return [
580
+ '# No supported package manager detected (apt/dnf/pacman/apk).',
581
+ '# Install the Chromium runtime libraries for your distribution.',
582
+ '# Canonical Debian/Ubuntu names: libnss3, libnspr4, libdbus-1-3,',
583
+ '# libatk1.0, libatk-bridge2.0, libcups2, libdrm2, libxkbcommon0,',
584
+ '# libxcomposite1, libxdamage1, libxfixes3, libxrandr2, libgbm1,',
585
+ '# libpango-1.0, libcairo2, libasound2, libgtk-3-0, libxss1,',
586
+ '# libxtst6, libatspi2.0-0, libnotify4, libsecret-1-0, libxshmfence1.',
587
+ ];
588
+ }
589
+ return fixBlock(chromiumLibsFix(pm), pm);
590
+ }