@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,314 @@
1
+ import { existsSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join, resolve } from 'node:path';
4
+ import { ensureMachineDir } from '../../../bin/machine-layout.js';
5
+ import { APP_TOOLS_MCP_SERVER_PATH, BROWSER_MCP_SERVER_PATH, IS_COMPILED, MCP_SERVER_PATH, MINIONRY_ROOT, QUALITY_MCP_SERVER_PATH, } from '../../utils/paths.js';
6
+ import { herror, hlog } from './headless-logger.js';
7
+ const APP_TOOLS_MCP_SERVER_NAME = 'minionry-app-tools';
8
+ export const BROWSER_MCP_SERVER_NAME = 'minionry-browser';
9
+ export const QUALITY_MCP_SERVER_NAME = 'minionry-quality';
10
+ const QUALITY_REVIEW_TAB_PREFIX = 'quality-review-';
11
+ let browserHostAttached = false;
12
+ let browserPreflightProbe = null;
13
+ const BROWSER_PREFLIGHT_CACHE_MS = 60_000;
14
+ export function setAgentBrowserHostAttached(attached) {
15
+ browserHostAttached = attached;
16
+ browserPreflightProbe = null;
17
+ }
18
+ async function probeBrowserPreflight() {
19
+ try {
20
+ const { preflight } = await import('../../services/browser/preflight.js');
21
+ const result = await preflight();
22
+ return !result.checks.some((check) => !check.ok && !check.advisory);
23
+ }
24
+ catch (error) {
25
+ herror(`[${new Date().toISOString()}] Browser preflight unavailable, withholding the agent browser surface: ${error instanceof Error ? error.message : String(error)}`);
26
+ return false;
27
+ }
28
+ }
29
+ export async function isAgentBrowserSurfaceAvailable(now = Date.now()) {
30
+ if (!browserHostAttached)
31
+ return false;
32
+ if (!existsSync(BROWSER_MCP_SERVER_PATH))
33
+ return false;
34
+ if (!browserPreflightProbe || now - browserPreflightProbe.at > BROWSER_PREFLIGHT_CACHE_MS) {
35
+ browserPreflightProbe = { at: now, ok: probeBrowserPreflight() };
36
+ }
37
+ return browserPreflightProbe.ok;
38
+ }
39
+ export const COMPETING_BROWSER_SERVER_PATTERNS = [
40
+ 'playwright',
41
+ 'puppeteer',
42
+ 'browser-use',
43
+ 'browsermcp',
44
+ 'browser-mcp',
45
+ 'chrome-devtools',
46
+ 'chromedevtools',
47
+ 'selenium',
48
+ ];
49
+ export function isCompetingBrowserServer(name) {
50
+ const lc = name.toLowerCase();
51
+ if (lc === BROWSER_MCP_SERVER_NAME || lc === APP_TOOLS_MCP_SERVER_NAME || lc === QUALITY_MCP_SERVER_NAME)
52
+ return false;
53
+ return COMPETING_BROWSER_SERVER_PATTERNS.some((p) => lc.includes(p));
54
+ }
55
+ export function resolveMcpLauncher() {
56
+ if (IS_COMPILED)
57
+ return { command: process.execPath, argsPrefix: [] };
58
+ const candidates = [
59
+ resolve(MINIONRY_ROOT, 'node_modules/.bin/tsx'),
60
+ resolve(MINIONRY_ROOT, '../node_modules/.bin/tsx'),
61
+ resolve(MINIONRY_ROOT, '../../node_modules/.bin/tsx'),
62
+ ];
63
+ for (const bin of candidates) {
64
+ if (existsSync(bin))
65
+ return { command: bin, argsPrefix: [] };
66
+ }
67
+ return { command: 'npx', argsPrefix: ['-y', 'tsx'] };
68
+ }
69
+ function loadUserMcpServers(workingDir, verbose) {
70
+ const servers = {};
71
+ const claudeConfigPath = join(homedir(), '.claude.json');
72
+ if (!existsSync(claudeConfigPath)) {
73
+ return servers;
74
+ }
75
+ try {
76
+ const claudeConfig = JSON.parse(readFileSync(claudeConfigPath, 'utf-8'));
77
+ if (claudeConfig.mcpServers && typeof claudeConfig.mcpServers === 'object') {
78
+ Object.assign(servers, claudeConfig.mcpServers);
79
+ }
80
+ if (claudeConfig.projects && typeof claudeConfig.projects === 'object') {
81
+ for (const [projectPath, projectConfig] of Object.entries(claudeConfig.projects)) {
82
+ const projectServers = projectConfig?.mcpServers;
83
+ if (workingDir.startsWith(projectPath) && typeof projectServers === 'object') {
84
+ Object.assign(servers, projectServers);
85
+ }
86
+ }
87
+ }
88
+ if (verbose) {
89
+ hlog(`[${new Date().toISOString()}] Loaded ${Object.keys(servers).length} user MCP servers from ~/.claude.json`);
90
+ }
91
+ }
92
+ catch (parseError) {
93
+ herror(`[${new Date().toISOString()}] Failed to parse ~/.claude.json: ${parseError instanceof Error ? parseError.message : String(parseError)}`);
94
+ }
95
+ return servers;
96
+ }
97
+ const MAX_USER_PROMPT_LENGTH = 4000;
98
+ function truncatePrompt(prompt) {
99
+ const truncated = prompt.slice(0, MAX_USER_PROMPT_LENGTH);
100
+ const lastSpace = truncated.lastIndexOf(' ');
101
+ const clean = lastSpace > MAX_USER_PROMPT_LENGTH * 0.8 ? truncated.slice(0, lastSpace) : truncated;
102
+ return `${clean}... [truncated]`;
103
+ }
104
+ export function sessionGetsQualityMcp(session) {
105
+ if (!session.tabId)
106
+ return false;
107
+ if (session.tabId.startsWith(QUALITY_REVIEW_TAB_PREFIX))
108
+ return false;
109
+ if (session.appRunProfile !== undefined)
110
+ return false;
111
+ if (session.appTools?.onlyAppId)
112
+ return false;
113
+ return true;
114
+ }
115
+ export function resolveQualityMcpOptions(session, transport) {
116
+ if (!sessionGetsQualityMcp(session))
117
+ return null;
118
+ if (!transport.port || !transport.bouncerSecret || !transport.capabilityToken)
119
+ return null;
120
+ return { port: transport.port, bouncerSecret: transport.bouncerSecret, capabilityToken: transport.capabilityToken };
121
+ }
122
+ export async function resolveAppToolsMcpContext(runContext, transport) {
123
+ if (!runContext || !transport.port || !transport.bouncerSecret || !transport.capabilityToken) {
124
+ return null;
125
+ }
126
+ try {
127
+ const { hasExposedAppTools } = await import('../../mcp/app-tools-bridge.js');
128
+ if (!hasExposedAppTools(runContext))
129
+ return null;
130
+ }
131
+ catch (error) {
132
+ herror(`[${new Date().toISOString()}] App-tools roster unavailable, exposing no app tools: ${error instanceof Error ? error.message : String(error)}`);
133
+ return null;
134
+ }
135
+ return {
136
+ ...runContext,
137
+ port: transport.port,
138
+ bouncerSecret: transport.bouncerSecret,
139
+ capabilityToken: transport.capabilityToken,
140
+ };
141
+ }
142
+ export function buildAppToolsMcpEntry(ctx) {
143
+ if (!existsSync(APP_TOOLS_MCP_SERVER_PATH)) {
144
+ herror(`[${new Date().toISOString()}] App-tools MCP server not found at ${APP_TOOLS_MCP_SERVER_PATH}`);
145
+ return null;
146
+ }
147
+ const launcher = resolveMcpLauncher();
148
+ return {
149
+ command: launcher.command,
150
+ args: [...launcher.argsPrefix, APP_TOOLS_MCP_SERVER_PATH],
151
+ description: 'Operations served by the Workshop apps connected to this Space',
152
+ env: {
153
+ MINIONRY_PORT: String(ctx.port),
154
+ MINIONRY_BOUNCER_SECRET: ctx.bouncerSecret,
155
+ MINIONRY_CAPABILITY_TOKEN: ctx.capabilityToken,
156
+ },
157
+ };
158
+ }
159
+ export function buildBrowserMcpEntry(opts) {
160
+ const env = {
161
+ MINIONRY_PORT: String(opts.port),
162
+ MINIONRY_BOUNCER_SECRET: opts.bouncerSecret,
163
+ MINIONRY_CAPABILITY_TOKEN: opts.capabilityToken,
164
+ };
165
+ if (opts.defaultTabId)
166
+ env.MINIONRY_DEFAULT_TAB_ID = opts.defaultTabId;
167
+ if (opts.agentLabel)
168
+ env.MINIONRY_AGENT_LABEL = opts.agentLabel;
169
+ const launcher = resolveMcpLauncher();
170
+ return {
171
+ command: launcher.command,
172
+ args: [...launcher.argsPrefix, BROWSER_MCP_SERVER_PATH],
173
+ description: "The user's real, visible browser — navigation, reading, and input on live web pages",
174
+ env,
175
+ };
176
+ }
177
+ export function buildQualityMcpEntry(opts) {
178
+ if (!existsSync(QUALITY_MCP_SERVER_PATH)) {
179
+ herror(`[${new Date().toISOString()}] Quality MCP server not found at ${QUALITY_MCP_SERVER_PATH}`);
180
+ return null;
181
+ }
182
+ const launcher = resolveMcpLauncher();
183
+ return {
184
+ command: launcher.command,
185
+ args: [...launcher.argsPrefix, QUALITY_MCP_SERVER_PATH],
186
+ description: "On-demand, read-only quality checks of named files in this Space's code",
187
+ env: {
188
+ MINIONRY_PORT: String(opts.port),
189
+ MINIONRY_BOUNCER_SECRET: opts.bouncerSecret,
190
+ MINIONRY_CAPABILITY_TOKEN: opts.capabilityToken,
191
+ },
192
+ };
193
+ }
194
+ export const BROWSER_SYSTEM_PROMPT = [
195
+ `This session is connected to the user's REAL browser — the window they can see — through the mcp__${BROWSER_MCP_SERVER_NAME}__browser_* tools. Those tools drive the open web: any site, any page, visibly, as it happens.`,
196
+ 'For ANY interaction with a web page — navigating, reading, clicking, typing, filling a form — you MUST use those browser_* tools, so the user watches every step happen in front of them.',
197
+ `The mcp__${APP_TOOLS_MCP_SERVER_NAME}__<appId>__<tool> tools are a DIFFERENT surface: operations a connected Minionry app serves over its own content, not the web. Use them for that app's own data, never as a substitute for browsing a page, and never expect them to reach a site.`,
198
+ 'NEVER drive a browser the user cannot see. Do not use your own or another browser (playwright, puppeteer, chromium, browser-use), curl, or WebFetch to visit or act on a page the user asked you to work with; that executes invisibly and is a failure even when the result looks right.',
199
+ 'Work the page in observe->act steps: break the request into small sequential actions, and after each mutating action (click/type/fill) call browser_snapshot to observe the result before choosing the next one.',
200
+ 'If a browser_* tool fails, or an element you expect is missing from the snapshot, call browser_take_screenshot to see the page visually and re-orient; do not silently switch to non-browser tools.',
201
+ 'If browser tools are unavailable or keep failing (connection errors, browser_host_unavailable), STOP and report the problem to the user instead of completing the task another way.',
202
+ ].join(' ');
203
+ function eligibleUserServers(workingDir, verbose, browserSession) {
204
+ const servers = loadUserMcpServers(workingDir, verbose);
205
+ if (!browserSession)
206
+ return servers;
207
+ for (const name of Object.keys(servers)) {
208
+ if (isCompetingBrowserServer(name)) {
209
+ delete servers[name];
210
+ hlog(`[${new Date().toISOString()}] Excluding user MCP server "${name}" for this browser session (${BROWSER_MCP_SERVER_NAME} owns the browser surface)`);
211
+ }
212
+ }
213
+ return servers;
214
+ }
215
+ function buildBouncerEnv(options) {
216
+ const { userPrompt, deployMode, askUserQuestionRouting, sdkAppRun } = options;
217
+ const bouncerEnv = {
218
+ BOUNCER_USE_AI: 'true',
219
+ MINIONRY_ROOT: MINIONRY_ROOT,
220
+ };
221
+ if (deployMode) {
222
+ bouncerEnv.BOUNCER_DEPLOY_MODE = 'true';
223
+ }
224
+ if (userPrompt) {
225
+ bouncerEnv.BOUNCER_USER_PROMPT = userPrompt.length > MAX_USER_PROMPT_LENGTH
226
+ ? truncatePrompt(userPrompt)
227
+ : userPrompt;
228
+ }
229
+ if (askUserQuestionRouting) {
230
+ bouncerEnv.MINIONRY_PORT = String(askUserQuestionRouting.port);
231
+ bouncerEnv.MINIONRY_TAB_ID = askUserQuestionRouting.tabId;
232
+ bouncerEnv.MINIONRY_BOUNCER_SECRET = askUserQuestionRouting.bouncerSecret;
233
+ bouncerEnv.MINIONRY_CAPABILITY_TOKEN = askUserQuestionRouting.capabilityToken;
234
+ }
235
+ if (sdkAppRun) {
236
+ bouncerEnv.BOUNCER_SDK_APP_ID = sdkAppRun.appId;
237
+ bouncerEnv.BOUNCER_SDK_APP_ORIGIN = sdkAppRun.origin;
238
+ bouncerEnv.BOUNCER_SDK_SCOPES = sdkAppRun.scopes.join(',');
239
+ bouncerEnv.BOUNCER_SDK_WORKSPACE_DIR = sdkAppRun.workspaceDir;
240
+ bouncerEnv.BOUNCER_SDK_SANDBOX_DIR = sdkAppRun.sandboxDir;
241
+ }
242
+ return bouncerEnv;
243
+ }
244
+ const MCP_CONFIG_MAX_AGE_MS = 24 * 60 * 60 * 1000;
245
+ const MCP_CONFIG_FILE_RE = /^mcp-config-[0-9a-f-]{36}\.json$/i;
246
+ export function removeMcpConfig(configPath) {
247
+ if (!configPath)
248
+ return;
249
+ try {
250
+ rmSync(configPath, { force: true });
251
+ }
252
+ catch (error) {
253
+ herror(`[${new Date().toISOString()}] Failed to remove MCP config ${configPath}: ${error instanceof Error ? error.message : String(error)}`);
254
+ }
255
+ }
256
+ export function sweepStaleMcpConfigs(configDir, now = Date.now()) {
257
+ let names;
258
+ try {
259
+ names = readdirSync(configDir);
260
+ }
261
+ catch {
262
+ return;
263
+ }
264
+ for (const name of names) {
265
+ if (!MCP_CONFIG_FILE_RE.test(name))
266
+ continue;
267
+ const file = join(configDir, name);
268
+ try {
269
+ if (now - statSync(file).mtimeMs > MCP_CONFIG_MAX_AGE_MS)
270
+ rmSync(file, { force: true });
271
+ }
272
+ catch {
273
+ }
274
+ }
275
+ }
276
+ export function generateMcpConfig(workingDir, verbose = false, options = {}) {
277
+ const { sessionId, appTools, browserMcp, qualityMcp } = options;
278
+ try {
279
+ if (!existsSync(MCP_SERVER_PATH)) {
280
+ herror(`[${new Date().toISOString()}] MCP server not found at ${MCP_SERVER_PATH}`);
281
+ return null;
282
+ }
283
+ const bouncerEnv = buildBouncerEnv(options);
284
+ const launcher = resolveMcpLauncher();
285
+ const appToolsEntry = appTools ? buildAppToolsMcpEntry(appTools) : null;
286
+ const browserEntry = browserMcp ? buildBrowserMcpEntry(browserMcp) : null;
287
+ const qualityEntry = qualityMcp ? buildQualityMcpEntry(qualityMcp) : null;
288
+ const mcpServers = {
289
+ 'minionry-bouncer': {
290
+ command: launcher.command,
291
+ args: [...launcher.argsPrefix, MCP_SERVER_PATH],
292
+ description: 'Minionry security bouncer for approving/denying Claude Code tool use',
293
+ env: bouncerEnv,
294
+ },
295
+ ...eligibleUserServers(workingDir, verbose, !!browserEntry),
296
+ ...(appToolsEntry ? { [APP_TOOLS_MCP_SERVER_NAME]: appToolsEntry } : {}),
297
+ ...(browserEntry ? { [BROWSER_MCP_SERVER_NAME]: browserEntry } : {}),
298
+ ...(qualityEntry ? { [QUALITY_MCP_SERVER_NAME]: qualityEntry } : {}),
299
+ };
300
+ const configDir = ensureMachineDir('run');
301
+ sweepStaleMcpConfigs(configDir);
302
+ const configFileName = sessionId ? `mcp-config-${sessionId}.json` : 'mcp-config.json';
303
+ const configPath = join(configDir, configFileName);
304
+ writeFileSync(configPath, JSON.stringify({ mcpServers }, null, 2));
305
+ if (verbose) {
306
+ hlog(`[${new Date().toISOString()}] Generated MCP config at ${configPath} (${Object.keys(mcpServers).length} servers)`);
307
+ }
308
+ return configPath;
309
+ }
310
+ catch (error) {
311
+ herror(`[${new Date().toISOString()}] Failed to generate MCP config: ${error instanceof Error ? error.message : String(error)}`);
312
+ return null;
313
+ }
314
+ }
@@ -0,0 +1,72 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ export const NATIVE_TIMEOUT_PATTERN = /^(\w+) timed out — (continuing|retrying) with (\d+) results? preserved$/;
4
+ export const TIMEOUT_PREFIX_PATTERN = /^[A-Z]\w* timed/;
5
+ export class NativeTimeoutDetector {
6
+ lineBuffer = '';
7
+ detectedTimeouts = [];
8
+ postTimeoutBuffer = '';
9
+ processChunk(text) {
10
+ const timeouts = [];
11
+ let passthrough = '';
12
+ this.lineBuffer += text;
13
+ const lines = this.lineBuffer.split('\n');
14
+ const incomplete = lines.pop() ?? '';
15
+ for (const line of lines) {
16
+ const trimmed = line.trim();
17
+ const match = trimmed.match(NATIVE_TIMEOUT_PATTERN);
18
+ if (match) {
19
+ const event = {
20
+ toolName: match[1],
21
+ action: match[2],
22
+ preservedCount: parseInt(match[3], 10),
23
+ };
24
+ timeouts.push(event);
25
+ this.detectedTimeouts.push(event);
26
+ }
27
+ else {
28
+ passthrough += `${line}\n`;
29
+ }
30
+ }
31
+ if (incomplete) {
32
+ if (TIMEOUT_PREFIX_PATTERN.test(incomplete)) {
33
+ this.lineBuffer = incomplete;
34
+ }
35
+ else {
36
+ passthrough += incomplete;
37
+ this.lineBuffer = '';
38
+ }
39
+ }
40
+ else {
41
+ this.lineBuffer = '';
42
+ }
43
+ if (this.detectedTimeouts.length > 0 && passthrough) {
44
+ this.postTimeoutBuffer += passthrough;
45
+ passthrough = '';
46
+ }
47
+ return { passthrough, timeouts };
48
+ }
49
+ flush() {
50
+ const remaining = this.lineBuffer;
51
+ this.lineBuffer = '';
52
+ if (remaining) {
53
+ const trimmed = remaining.trim();
54
+ const match = trimmed.match(NATIVE_TIMEOUT_PATTERN);
55
+ if (match) {
56
+ this.detectedTimeouts.push({
57
+ toolName: match[1],
58
+ action: match[2],
59
+ preservedCount: parseInt(match[3], 10),
60
+ });
61
+ return '';
62
+ }
63
+ }
64
+ return remaining;
65
+ }
66
+ get timeoutCount() {
67
+ return this.detectedTimeouts.length;
68
+ }
69
+ get bufferedPostTimeoutOutput() {
70
+ return this.postTimeoutBuffer;
71
+ }
72
+ }
@@ -0,0 +1,71 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ export function extractCleanOutput(rawOutput) {
4
+ const lines = rawOutput.split('\n');
5
+ const cleanLines = lines.filter(line => {
6
+ const trimmed = line.trim();
7
+ if (trimmed.startsWith('{') && trimmed.includes('"type"')) {
8
+ return false;
9
+ }
10
+ return trimmed.length > 0;
11
+ });
12
+ return cleanLines.join('\n')
13
+ .replace(/\x1b\[[0-9;]*m/g, '')
14
+ .replace(/\r\n/g, '\n')
15
+ .trim();
16
+ }
17
+ export function estimateTokensFromOutput(output) {
18
+ return Math.floor(output.length / 4);
19
+ }
20
+ export function extractModifiedFiles(output) {
21
+ const filePattern = /(?:wrote|modified|created|edited)\s+(?:file\s+)?['"]?([^\s'"]+\.[a-z0-9]+)['"]?/gi;
22
+ const matches = output.matchAll(filePattern);
23
+ const files = new Set();
24
+ for (const match of matches) {
25
+ files.add(match[1]);
26
+ }
27
+ return Array.from(files);
28
+ }
29
+ export const ERROR_PATTERNS = [
30
+ { pattern: /not logged in|login required|must be authenticated|session.*expired|token.*invalid|token.*expired/i,
31
+ message: 'Claude Code authentication required. Please run "claude login" in your terminal to authenticate.',
32
+ errorCode: 'AUTH_REQUIRED' },
33
+ { pattern: /account.*not.*found|user.*not.*found/i,
34
+ message: 'Claude account not found. Please verify your account at claude.ai.',
35
+ errorCode: 'ACCOUNT_NOT_FOUND' },
36
+ { pattern: /api key|invalid key|unauthorized|forbidden.*api/i,
37
+ message: 'API key error. Please check your Claude Code configuration.',
38
+ errorCode: 'API_KEY_INVALID' },
39
+ { pattern: /quota exceeded|usage.*limit|billing.*issue|payment.*required|subscription.*expired/i,
40
+ message: 'Usage quota or subscription issue. Please check your account billing at claude.ai.',
41
+ errorCode: 'QUOTA_EXCEEDED' },
42
+ { pattern: /rate limit|too many requests|429|throttl/i,
43
+ message: 'Rate limit exceeded. Please wait a moment before trying again.',
44
+ errorCode: 'RATE_LIMITED' },
45
+ { pattern: /no internet|network error|connection refused|ENOTFOUND|ECONNREFUSED|ETIMEDOUT|socket hang up/i,
46
+ message: 'Network error. Please check your internet connection.',
47
+ errorCode: 'NETWORK_ERROR' },
48
+ { pattern: /SSL|certificate|TLS|CERT_/i,
49
+ message: 'SSL/TLS certificate error. Please check your network configuration.',
50
+ errorCode: 'SSL_ERROR' },
51
+ { pattern: /model not found|model unavailable|service unavailable|503|502|504/i,
52
+ message: 'Claude service temporarily unavailable. Please try again in a few moments.',
53
+ errorCode: 'SERVICE_UNAVAILABLE' },
54
+ { pattern: /internal server error|500/i,
55
+ message: 'Claude service encountered an internal error. Please try again.',
56
+ errorCode: 'INTERNAL_ERROR' },
57
+ { pattern: /context.*too.*long|context.*limit|token.*limit.*exceeded/i,
58
+ message: 'Context too long. Please start a new session or reduce prompt size.',
59
+ errorCode: 'CONTEXT_TOO_LONG' },
60
+ { pattern: /session.*not.*found|invalid.*session/i,
61
+ message: 'Session not found. Starting a new session may help.',
62
+ errorCode: 'SESSION_NOT_FOUND' },
63
+ ];
64
+ export function detectErrorInStderr(stderrBuffer) {
65
+ for (const { pattern, message, errorCode } of ERROR_PATTERNS) {
66
+ if (pattern.test(stderrBuffer)) {
67
+ return { message, errorCode };
68
+ }
69
+ }
70
+ return null;
71
+ }
@@ -0,0 +1,82 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { resolveClaudeCommand } from '../../engines/claude/claude-command.js';
4
+ import { assessApproval } from './stall-assessor.js';
5
+ export async function enrichPromptWithContext(prompt, context) {
6
+ let enriched = prompt;
7
+ const isApprovalOrContinuation = await detectApproval(prompt);
8
+ if (context.accumulatedKnowledge) {
9
+ if (isApprovalOrContinuation) {
10
+ enriched = `## Context from Previous Work\n${context.accumulatedKnowledge}\n\n## User Response\nThe user has responded with: "${prompt}"\n\nThis is a continuation/approval of the previous conversation. If you asked a question or requested approval in the previous movement, the user is responding to that question. Please proceed accordingly without asking the same question again.`;
11
+ }
12
+ else {
13
+ enriched = `## Context from Previous Work\n${context.accumulatedKnowledge}\n\n## Current Task\n${prompt}`;
14
+ }
15
+ }
16
+ if (context.filesModified && context.filesModified.length > 0) {
17
+ enriched += `\n\n## Files Modified in This Session\n${context.filesModified.join('\n')}`;
18
+ }
19
+ return enriched;
20
+ }
21
+ async function detectApproval(prompt) {
22
+ if (isApprovalPromptFast(prompt))
23
+ return true;
24
+ if (prompt.trim().length <= 100) {
25
+ try {
26
+ const claudeCmd = resolveClaudeCommand();
27
+ const verdict = await assessApproval(prompt, claudeCmd, false);
28
+ return verdict.isApproval;
29
+ }
30
+ catch {
31
+ }
32
+ }
33
+ return false;
34
+ }
35
+ export function isApprovalPrompt(prompt) {
36
+ return isApprovalPromptFast(prompt);
37
+ }
38
+ function isApprovalPromptFast(prompt) {
39
+ const lower = prompt.toLowerCase().trim();
40
+ if (['yes', 'y', 'ok', 'okay', 'sure', 'go', 'proceed', 'continue'].includes(lower)) {
41
+ return true;
42
+ }
43
+ const approvalPatterns = [
44
+ /^yes[,\s]/,
45
+ /^y[,\s]/,
46
+ /^okay[,\s]/,
47
+ /^ok[,\s]/,
48
+ /^sure[,\s]/,
49
+ /^go ahead/,
50
+ /^proceed/,
51
+ /^continue/,
52
+ /^from the (first|previous|last)/i,
53
+ /approval/i,
54
+ /approved/i
55
+ ];
56
+ return approvalPatterns.some(pattern => pattern.test(lower));
57
+ }
58
+ export function buildMultimodalMessage(textPrompt, imageAttachments) {
59
+ const content = [];
60
+ for (const attachment of imageAttachments) {
61
+ content.push({
62
+ type: 'image',
63
+ source: {
64
+ type: 'base64',
65
+ media_type: attachment.mimeType || 'image/png',
66
+ data: attachment.content
67
+ }
68
+ });
69
+ }
70
+ content.push({
71
+ type: 'text',
72
+ text: textPrompt
73
+ });
74
+ const message = {
75
+ type: 'user',
76
+ message: {
77
+ role: 'user',
78
+ content
79
+ }
80
+ };
81
+ return JSON.stringify(message);
82
+ }