@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,169 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { existsSync, readFileSync } from 'node:fs';
4
+ import { defaultGeteuid } from './chrome-sandbox.js';
5
+ export const CHROMIUM_SANDBOX_ENV = 'MINIONRY_CHROMIUM_SANDBOX';
6
+ export const LEGACY_NO_SANDBOX_ENV = 'MINIONRY_CHROMIUM_NO_SANDBOX';
7
+ const ON_VALUES = new Set(['on', '1', 'true', 'strict']);
8
+ const OFF_VALUES = new Set(['off', '0', 'false', 'none']);
9
+ export function parseChromiumSandboxMode(env) {
10
+ const raw = env[CHROMIUM_SANDBOX_ENV];
11
+ if (typeof raw === 'string' && raw.trim() !== '') {
12
+ const value = raw.trim().toLowerCase();
13
+ if (value === 'auto')
14
+ return { mode: 'auto', source: 'env' };
15
+ if (ON_VALUES.has(value))
16
+ return { mode: 'on', source: 'env' };
17
+ if (OFF_VALUES.has(value))
18
+ return { mode: 'off', source: 'env' };
19
+ return { mode: 'on', source: 'invalid', invalid: raw };
20
+ }
21
+ if (env[LEGACY_NO_SANDBOX_ENV] === '1')
22
+ return { mode: 'off', source: 'legacy-env' };
23
+ return { mode: 'auto', source: 'default' };
24
+ }
25
+ function defaultReadFile(p) {
26
+ try {
27
+ return readFileSync(p, 'utf8');
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ export function probablyInContainer(deps = {}) {
34
+ const pathExists = deps.pathExists ?? existsSync;
35
+ const readFile = deps.readFile ?? defaultReadFile;
36
+ if (pathExists('/.dockerenv') || pathExists('/run/.containerenv') || pathExists('/run/systemd/container')) {
37
+ return true;
38
+ }
39
+ const cgroup = readFile('/proc/self/cgroup');
40
+ if (cgroup !== null && /(?:^|[/:-])(?:docker|containerd|kubepods|lxc|libpod|podman)[/-]/m.test(cgroup))
41
+ return true;
42
+ const mountinfo = readFile('/proc/self/mountinfo');
43
+ if (mountinfo !== null && /\/docker\/containers\/|\/containers\/storage\//.test(mountinfo))
44
+ return true;
45
+ return false;
46
+ }
47
+ function describeFailure(kind) {
48
+ switch (kind) {
49
+ case 'namespaces-blocked':
50
+ return "creating PID/network namespaces is blocked — the norm under Docker's default seccomp profile";
51
+ case 'no-usable-sandbox':
52
+ return 'user namespaces are unavailable on this kernel and its SUID helper (chrome-sandbox) is not usable — root-owned, mode 4755';
53
+ case 'root-without-flag':
54
+ return 'Chromium refuses to run its sandbox as root';
55
+ }
56
+ }
57
+ export class ChromiumSandboxPolicy {
58
+ parsed;
59
+ mode;
60
+ platform;
61
+ geteuid;
62
+ containerProbe;
63
+ containerCached = null;
64
+ fallenBack = null;
65
+ constructor(deps = {}) {
66
+ const env = deps.env ?? process.env;
67
+ this.parsed = parseChromiumSandboxMode(env);
68
+ this.mode = this.parsed.mode;
69
+ this.platform = deps.platform ?? process.platform;
70
+ this.geteuid = deps.geteuid ?? defaultGeteuid;
71
+ this.containerProbe = deps.probablyInContainer ?? (() => probablyInContainer());
72
+ }
73
+ get hasFallenBack() {
74
+ return this.fallenBack !== null;
75
+ }
76
+ decide() {
77
+ if (this.platform !== 'linux') {
78
+ return {
79
+ enabled: true,
80
+ reason: 'platform-unmanaged',
81
+ detail: `Chromium sandbox on (${this.platform}: not managed by ${CHROMIUM_SANDBOX_ENV})`,
82
+ };
83
+ }
84
+ switch (this.mode) {
85
+ case 'off':
86
+ return {
87
+ enabled: false,
88
+ reason: 'mode-off',
89
+ detail: this.parsed.source === 'legacy-env'
90
+ ? `Chromium sandbox off (${LEGACY_NO_SANDBOX_ENV}=1)`
91
+ : `Chromium sandbox off (${CHROMIUM_SANDBOX_ENV}=off)`,
92
+ };
93
+ case 'on':
94
+ return { enabled: true, reason: 'mode-on', detail: `Chromium sandbox on, strict (${CHROMIUM_SANDBOX_ENV}=on)` };
95
+ case 'auto':
96
+ return this.decideAuto();
97
+ }
98
+ }
99
+ decideAuto() {
100
+ if (this.fallenBack !== null) {
101
+ return {
102
+ enabled: false,
103
+ reason: 'auto-fallback',
104
+ detail: `Chromium sandbox off — ${describeFailure(this.fallenBack)} (learned this process; ${CHROMIUM_SANDBOX_ENV}=auto)`,
105
+ };
106
+ }
107
+ if (this.geteuid() === 0) {
108
+ return {
109
+ enabled: false,
110
+ reason: 'auto-root',
111
+ detail: `Chromium sandbox off — running as root, and Chromium refuses its sandbox as root (${CHROMIUM_SANDBOX_ENV}=auto)`,
112
+ };
113
+ }
114
+ return { enabled: true, reason: 'auto-default', detail: `Chromium sandbox on (${CHROMIUM_SANDBOX_ENV}=auto)` };
115
+ }
116
+ recordFailure(kind) {
117
+ const current = this.decide();
118
+ if (current.reason === 'platform-unmanaged') {
119
+ return {
120
+ fallBack: false,
121
+ notice: `Chromium reported a Linux sandbox failure (${describeFailure(kind)}) on ${this.platform}, where the sandbox is not managed by ${CHROMIUM_SANDBOX_ENV}`,
122
+ };
123
+ }
124
+ if (!current.enabled) {
125
+ return {
126
+ fallBack: false,
127
+ notice: current.reason === 'auto-fallback'
128
+ ? `Chromium's sandbox already failed on this machine (${describeFailure(this.fallenBack ?? kind)}); the browser runs with --no-sandbox from now on`
129
+ : `Chromium reported a sandbox failure (${describeFailure(kind)}) although the sandbox was already off (${current.reason}) — not a sandbox-policy failure`,
130
+ };
131
+ }
132
+ if (this.mode === 'on') {
133
+ const alternative = kind === 'root-without-flag'
134
+ ? 'or run minion as a non-root user.'
135
+ : 'or start the container with a seccomp profile that allows user namespaces.';
136
+ return {
137
+ fallBack: false,
138
+ notice: `Chromium's sandbox cannot start on this machine: ${describeFailure(kind)}. ${CHROMIUM_SANDBOX_ENV}=on forbids running without it — ` +
139
+ 'unset it (auto) or set it to off, so the container is the isolation boundary the way Playwright and Puppeteer run Chromium in Docker, ' +
140
+ alternative,
141
+ };
142
+ }
143
+ if (kind === 'no-usable-sandbox' && !this.inContainer()) {
144
+ return {
145
+ fallBack: false,
146
+ notice: "Chromium found no usable sandbox: this kernel offers no user namespaces and the SUID helper (chrome-sandbox) is not root-owned mode 4755 — " +
147
+ `run \`minion doctor browser\` for the one-line fix, or set ${CHROMIUM_SANDBOX_ENV}=off to run without the sandbox.`,
148
+ };
149
+ }
150
+ this.fallenBack = kind;
151
+ return {
152
+ fallBack: true,
153
+ notice: `Chromium's sandbox cannot start on this machine (${describeFailure(kind)}); the browser runs with --no-sandbox from now on — ` +
154
+ 'the container is the isolation boundary here, which is how Playwright and Puppeteer run Chromium in Docker. ' +
155
+ `Set ${CHROMIUM_SANDBOX_ENV}=on to forbid this, or =off to skip the sandboxed attempt.`,
156
+ };
157
+ }
158
+ inContainer() {
159
+ if (this.containerCached === null) {
160
+ try {
161
+ this.containerCached = this.containerProbe();
162
+ }
163
+ catch {
164
+ this.containerCached = false;
165
+ }
166
+ }
167
+ return this.containerCached;
168
+ }
169
+ }
@@ -0,0 +1,26 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ const SUPPRESS_PATTERNS = [
4
+ /WARNING:ui\/gfx\/linux\/gbm_support_x11\.cc.*dri3 extension not supported/,
5
+ /WARNING:third_party\/webrtc\/rtc_base\/openssl_stream_adapter\.cc.*WebRTC-ForceDtls13/,
6
+ /INFO:third_party\/blink\/renderer\/modules\/peerconnection\/peer_connection_dependency_factory\.cc.*Running WebRTC/,
7
+ /INFO:third_party\/blink\/renderer\/platform\/p2p\/ipc_socket_factory\.cc.*Setting new p2p socket buffer limit/,
8
+ /WARNING:third_party\/webrtc\/call\/rtp_video_sender\.cc.*ULPFEC/,
9
+ /\[OpenH264\].*Warning:/,
10
+ /ERROR:third_party\/webrtc\/media\/engine\/simulcast_encoder_adapter\.cc.*\[SEA\] StreamContext ctor parent is null/,
11
+ /Inconsistent congestion control feedback types/,
12
+ /Failed to resolve address for [\w-]+\.local/,
13
+ /Failed to resolve ICE candidate hostname [\w-]+\.local/,
14
+ /INFO:CONSOLE[:(]\d+.*source: (?:https?|blob:https?|chrome-extension):/,
15
+ ];
16
+ export function shouldForwardStderrLine(line, opts) {
17
+ if (opts.debug)
18
+ return true;
19
+ if (!line.trim())
20
+ return false;
21
+ for (const pattern of SUPPRESS_PATTERNS) {
22
+ if (pattern.test(line))
23
+ return false;
24
+ }
25
+ return true;
26
+ }
@@ -0,0 +1,107 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { trackEvent } from '../analytics.js';
4
+ export const BrowserWebrtcEvents = {
5
+ CANVAS_STATS: 'browser_canvas_stats',
6
+ SESSION_STATS: 'browser_session_stats',
7
+ ICE_STATE: 'browser_webrtc_ice_state',
8
+ STATS: 'browser_webrtc_stats',
9
+ PATH: 'browser_webrtc_path',
10
+ FALLBACK: 'browser_webrtc_fallback',
11
+ TURN_FETCH: 'browser_webrtc_turn_fetch',
12
+ };
13
+ export const DEFAULT_WEBRTC_STATS_INTERVAL_MS = 10_000;
14
+ export const MIN_WEBRTC_STATS_INTERVAL_MS = 5_000;
15
+ const PII_KEY_DENYLIST = new Set([
16
+ 'url',
17
+ 'href',
18
+ 'src',
19
+ 'origin',
20
+ 'host',
21
+ 'hostname',
22
+ 'pathname',
23
+ 'search',
24
+ 'hash',
25
+ 'title',
26
+ 'document',
27
+ 'dom',
28
+ 'html',
29
+ 'innerhtml',
30
+ 'outerhtml',
31
+ 'content',
32
+ 'text',
33
+ 'textcontent',
34
+ 'value',
35
+ 'placeholder',
36
+ 'cookie',
37
+ ]);
38
+ export function sanitizeTelemetryProps(props) {
39
+ const out = {};
40
+ for (const [key, value] of Object.entries(props)) {
41
+ if (PII_KEY_DENYLIST.has(key.toLowerCase()))
42
+ continue;
43
+ const sanitized = sanitizeValue(value);
44
+ if (sanitized !== undefined)
45
+ out[key] = sanitized;
46
+ }
47
+ return out;
48
+ }
49
+ function sanitizeString(value) {
50
+ if (value.includes('://'))
51
+ return undefined;
52
+ if (value.length > 256)
53
+ return `${value.slice(0, 256)}…[${value.length}]`;
54
+ return value;
55
+ }
56
+ function isPrimitiveArrayItem(item) {
57
+ if (typeof item === 'number' || typeof item === 'boolean')
58
+ return true;
59
+ return typeof item === 'string' && !item.includes('://') && item.length <= 256;
60
+ }
61
+ function sanitizeValue(value) {
62
+ if (value === null)
63
+ return null;
64
+ if (typeof value === 'string')
65
+ return sanitizeString(value);
66
+ if (typeof value === 'number')
67
+ return Number.isFinite(value) ? value : undefined;
68
+ if (typeof value === 'boolean')
69
+ return value;
70
+ if (Array.isArray(value))
71
+ return value.filter(isPrimitiveArrayItem);
72
+ return undefined;
73
+ }
74
+ export function classifyWebrtcPath(candidateType, relayProtocol) {
75
+ if (!candidateType)
76
+ return 'unknown';
77
+ const ct = candidateType.toLowerCase();
78
+ if (ct === 'relay') {
79
+ const proto = (relayProtocol ?? 'udp').toLowerCase();
80
+ if (proto === 'tls' || proto === 'turns')
81
+ return 'turn_tls';
82
+ if (proto === 'tcp')
83
+ return 'turn_tcp';
84
+ return 'turn_udp';
85
+ }
86
+ if (ct === 'host' || ct === 'srflx' || ct === 'prflx')
87
+ return 'p2p';
88
+ return 'unknown';
89
+ }
90
+ function asProps(props) {
91
+ return props;
92
+ }
93
+ export function trackWebrtcIceState(props) {
94
+ trackEvent(BrowserWebrtcEvents.ICE_STATE, sanitizeTelemetryProps(asProps(props)));
95
+ }
96
+ export function trackWebrtcPath(props) {
97
+ trackEvent(BrowserWebrtcEvents.PATH, sanitizeTelemetryProps(asProps(props)));
98
+ }
99
+ export function trackWebrtcFallback(props) {
100
+ trackEvent(BrowserWebrtcEvents.FALLBACK, sanitizeTelemetryProps(asProps(props)));
101
+ }
102
+ export function trackWebrtcStats(props) {
103
+ trackEvent(BrowserWebrtcEvents.STATS, sanitizeTelemetryProps(asProps(props)));
104
+ }
105
+ export function trackTurnFetch(props) {
106
+ trackEvent(BrowserWebrtcEvents.TURN_FETCH, sanitizeTelemetryProps(asProps(props)));
107
+ }
@@ -0,0 +1,139 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { spawn as defaultSpawn } from 'node:child_process';
4
+ import { existsSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ export const XVFB_FB_WIDTH = 3840;
7
+ export const XVFB_FB_HEIGHT = 2160;
8
+ export const XVFB_REAP_GRACE_MS = 2_000;
9
+ export function allocateXvfbDisplayNumber(lockDir = '/tmp', start = 99, range = 100) {
10
+ for (let n = start; n < start + range; n++) {
11
+ if (!existsSync(join(lockDir, `.X${n}-lock`))) {
12
+ return n;
13
+ }
14
+ }
15
+ throw new Error(`No free X display number found in :${start}-:${start + range - 1}`);
16
+ }
17
+ export function shouldRunXvfb(platform = process.platform, env = process.env) {
18
+ if (platform !== 'linux')
19
+ return false;
20
+ if (env.MINIONRY_NO_XVFB === '1')
21
+ return false;
22
+ return true;
23
+ }
24
+ export function buildXvfbArgs(displayNumber, fbWidth = XVFB_FB_WIDTH, fbHeight = XVFB_FB_HEIGHT) {
25
+ return [
26
+ `:${displayNumber}`,
27
+ '-screen', '0', `${fbWidth}x${fbHeight}x24`,
28
+ '+extension', 'RANDR',
29
+ '-nolisten', 'tcp',
30
+ '-ac',
31
+ ];
32
+ }
33
+ export class XvfbSupervisor {
34
+ spawnFn;
35
+ platform;
36
+ env;
37
+ allocateDisplayNumberFn;
38
+ reapGraceMs;
39
+ fbWidth;
40
+ fbHeight;
41
+ current = null;
42
+ exitHook = null;
43
+ constructor(options = {}) {
44
+ this.spawnFn = options.spawn ?? defaultSpawn;
45
+ this.platform = options.platform ?? process.platform;
46
+ this.env = options.env ?? process.env;
47
+ this.allocateDisplayNumberFn = options.allocateDisplayNumber ?? (() => allocateXvfbDisplayNumber());
48
+ this.reapGraceMs = options.reapGraceMs ?? XVFB_REAP_GRACE_MS;
49
+ this.fbWidth = options.fbWidth ?? XVFB_FB_WIDTH;
50
+ this.fbHeight = options.fbHeight ?? XVFB_FB_HEIGHT;
51
+ }
52
+ start(onError) {
53
+ if (this.current)
54
+ return this.current;
55
+ if (!shouldRunXvfb(this.platform, this.env)) {
56
+ this.current = { proc: null, displayNumber: null };
57
+ return this.current;
58
+ }
59
+ const displayNumber = this.allocateDisplayNumberFn();
60
+ const args = buildXvfbArgs(displayNumber, this.fbWidth, this.fbHeight);
61
+ const spawnOpts = {
62
+ stdio: 'ignore',
63
+ detached: false,
64
+ };
65
+ const proc = this.spawnFn('Xvfb', args, spawnOpts);
66
+ if (onError) {
67
+ proc.on('error', (err) => onError(err));
68
+ }
69
+ this.current = { proc, displayNumber };
70
+ this.installExitHook(proc);
71
+ return this.current;
72
+ }
73
+ getHandle() {
74
+ return this.current;
75
+ }
76
+ async stop() {
77
+ const handle = this.current;
78
+ this.current = null;
79
+ this.uninstallExitHook();
80
+ if (!handle?.proc)
81
+ return;
82
+ const proc = handle.proc;
83
+ if (proc.exitCode !== null || proc.signalCode !== null) {
84
+ return;
85
+ }
86
+ await new Promise((resolve) => {
87
+ let settled = false;
88
+ const onExit = () => {
89
+ if (settled)
90
+ return;
91
+ settled = true;
92
+ clearTimeout(timer);
93
+ resolve();
94
+ };
95
+ proc.once('exit', onExit);
96
+ const timer = setTimeout(() => {
97
+ if (settled)
98
+ return;
99
+ settled = true;
100
+ try {
101
+ proc.kill('SIGKILL');
102
+ }
103
+ catch { }
104
+ resolve();
105
+ }, this.reapGraceMs);
106
+ try {
107
+ proc.kill('SIGTERM');
108
+ }
109
+ catch {
110
+ settled = true;
111
+ clearTimeout(timer);
112
+ resolve();
113
+ }
114
+ });
115
+ }
116
+ installExitHook(proc) {
117
+ if (this.exitHook)
118
+ return;
119
+ const hook = () => {
120
+ try {
121
+ proc.kill('SIGTERM');
122
+ }
123
+ catch {
124
+ }
125
+ };
126
+ this.exitHook = hook;
127
+ process.once('exit', hook);
128
+ }
129
+ uninstallExitHook() {
130
+ if (!this.exitHook)
131
+ return;
132
+ try {
133
+ process.off('exit', this.exitHook);
134
+ }
135
+ catch {
136
+ }
137
+ this.exitHook = null;
138
+ }
139
+ }
@@ -0,0 +1,56 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ export const BROWSER_CONTENT_FRAME_TYPES = new Set([
4
+ 'browser_tab_state',
5
+ 'browser_navigation_state',
6
+ 'browser_error',
7
+ 'browser_resize_ack',
8
+ 'browser_preflight_result',
9
+ 'browser_webrtc_offer',
10
+ 'browser_driver_state',
11
+ 'browser_status',
12
+ 'browser_state_update',
13
+ 'browser_session_reset',
14
+ 'browser_input_rejected',
15
+ 'browser_input_focus',
16
+ 'browser_agent_proposed',
17
+ 'browser_agent_step',
18
+ 'browser_agent_done',
19
+ 'browser_webrtc_ice',
20
+ 'browser_webrtc_state',
21
+ 'agent_tab_state',
22
+ ]);
23
+ export const E2EE_REQUIRED_ERROR_CODE = 'e2ee_required';
24
+ export function mustRefuseWhenCleartext(type) {
25
+ return BROWSER_CONTENT_FRAME_TYPES.has(type);
26
+ }
27
+ export function buildE2eeRequiredBrowserError(type) {
28
+ return {
29
+ type: 'browser_error',
30
+ data: {
31
+ code: E2EE_REQUIRED_ERROR_CODE,
32
+ message: `Refused to send "${type}": end-to-end encryption is not active for this Space (public Space, or a legacy/incapable viewer is connected).`,
33
+ },
34
+ };
35
+ }
36
+ export const BROWSER_CONTENT_SDK_METHODS = new Set([
37
+ 'browser.tabs.list',
38
+ 'browser.tabs.subscribe',
39
+ 'browser.snapshot',
40
+ 'browser.screenshot',
41
+ 'browser.evaluate',
42
+ 'browser.automate',
43
+ 'browser.view.attach',
44
+ 'browser.view.answer',
45
+ 'browser.view.ice',
46
+ 'browser.view.state',
47
+ 'browser.view.input',
48
+ ]);
49
+ export function mustRefuseSdkMethodWhenCleartext(method) {
50
+ return BROWSER_CONTENT_SDK_METHODS.has(method);
51
+ }
52
+ export function e2eeRequiredSdkMessage(method) {
53
+ return (`${E2EE_REQUIRED_ERROR_CODE}: refused to answer "${method}" — end-to-end encryption is not active ` +
54
+ `for this Space (public Space, or a legacy/incapable viewer is connected), and browser page content ` +
55
+ `has no safe cleartext fallback.`);
56
+ }
@@ -0,0 +1,32 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { resolveClientId } from '../../bin/machine-identity.js';
4
+ import { machineFile } from '../../bin/machine-layout.js';
5
+ function clientIdFile() {
6
+ return machineFile('clientId');
7
+ }
8
+ let resolved = null;
9
+ function resolveOnce() {
10
+ if (resolved)
11
+ return resolved;
12
+ const outcome = resolveClientId();
13
+ if (outcome.rotated) {
14
+ console.warn(`[identity] This home directory was last used on a different machine. `
15
+ + `Minted a new device identity ${outcome.clientId} (was ${outcome.previousClientId}) `
16
+ + `so this machine does not evict the original. Run "minion login --force" to register it.`);
17
+ }
18
+ resolved = { clientId: outcome.clientId, fingerprint: outcome.fingerprint };
19
+ return resolved;
20
+ }
21
+ export function getClientId() {
22
+ return resolveOnce().clientId;
23
+ }
24
+ export function getMachineFingerprint() {
25
+ return resolveOnce().fingerprint;
26
+ }
27
+ export function getClientIdPath() {
28
+ return clientIdFile();
29
+ }
30
+ export function _resetClientIdCacheForTests() {
31
+ resolved = null;
32
+ }