@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,363 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ export const AGENT_ROLE_TEMPLATES = Object.freeze({
4
+ strategist: {
5
+ slug: 'strategist',
6
+ label: 'Strategist',
7
+ description: 'Plans positioning, messaging, and experiments. Writes strategy docs; does not ship code or ads.',
8
+ defaultProfile: {
9
+ strengths: ['strategy', 'positioning', 'messaging', 'research'],
10
+ preferredTasks: ['strategy', 'plan', 'roadmap', 'positioning'],
11
+ toolProfile: 'marketing',
12
+ model: 'opus',
13
+ maxConcurrency: 1,
14
+ costCapCents: 500,
15
+ },
16
+ },
17
+ writer: {
18
+ slug: 'writer',
19
+ label: 'Writer',
20
+ description: 'Drafts copy, landing pages, emails, and social posts against a brief.',
21
+ defaultProfile: {
22
+ strengths: ['copywriting', 'editing', 'seo', 'content'],
23
+ preferredTasks: ['copy', 'blog', 'email', 'ad', 'landing'],
24
+ toolProfile: 'marketing',
25
+ model: 'sonnet',
26
+ maxConcurrency: 2,
27
+ costCapCents: 200,
28
+ },
29
+ },
30
+ analyst: {
31
+ slug: 'analyst',
32
+ label: 'Analyst',
33
+ description: 'Queries metrics, computes dashboards, and writes up numeric findings.',
34
+ defaultProfile: {
35
+ strengths: ['sql', 'analytics', 'metrics', 'experiments'],
36
+ preferredTasks: ['analyze', 'report', 'dashboard', 'metric', 'ab-test'],
37
+ toolProfile: 'operations',
38
+ model: 'sonnet',
39
+ maxConcurrency: 2,
40
+ costCapCents: 150,
41
+ },
42
+ },
43
+ designer: {
44
+ slug: 'designer',
45
+ label: 'Designer',
46
+ description: 'Produces visual direction, mockups, and design-system suggestions.',
47
+ defaultProfile: {
48
+ strengths: ['visual-design', 'ux', 'figma', 'branding'],
49
+ preferredTasks: ['design', 'mockup', 'wireframe', 'icon'],
50
+ toolProfile: 'marketing',
51
+ model: 'sonnet',
52
+ maxConcurrency: 1,
53
+ costCapCents: 300,
54
+ },
55
+ },
56
+ engineer: {
57
+ slug: 'engineer',
58
+ label: 'Engineer',
59
+ description: 'Implements features, writes tests, and deploys code changes.',
60
+ defaultProfile: {
61
+ strengths: ['typescript', 'python', 'testing', 'devops'],
62
+ preferredTasks: ['implement', 'fix', 'bug', 'refactor', 'deploy'],
63
+ toolProfile: 'engineering',
64
+ model: 'opus',
65
+ maxConcurrency: 3,
66
+ costCapCents: 1000,
67
+ },
68
+ },
69
+ researcher: {
70
+ slug: 'researcher',
71
+ label: 'Researcher',
72
+ description: 'Digs into public sources for competitive, market, or user research.',
73
+ defaultProfile: {
74
+ strengths: ['research', 'web-search', 'synthesis', 'summarization'],
75
+ preferredTasks: ['research', 'survey', 'competitor', 'investigate'],
76
+ toolProfile: 'marketing',
77
+ model: 'sonnet',
78
+ maxConcurrency: 2,
79
+ costCapCents: 200,
80
+ },
81
+ },
82
+ operator: {
83
+ slug: 'operator',
84
+ label: 'Operator',
85
+ description: 'Runs recurring tasks, monitors systems, and flags exceptions.',
86
+ defaultProfile: {
87
+ strengths: ['ops', 'monitoring', 'scripting'],
88
+ preferredTasks: ['monitor', 'check', 'report', 'routine'],
89
+ toolProfile: 'operations',
90
+ model: 'haiku',
91
+ maxConcurrency: 3,
92
+ costCapCents: 50,
93
+ },
94
+ },
95
+ });
96
+ export function getRoleTemplate(slug) {
97
+ if (!slug)
98
+ return null;
99
+ return AGENT_ROLE_TEMPLATES[slug] ?? null;
100
+ }
101
+ export function listRoleTemplates() {
102
+ return Object.values(AGENT_ROLE_TEMPLATES);
103
+ }
104
+ export const DEFAULT_AGENT_PROFILE = Object.freeze({
105
+ strengths: [],
106
+ preferredTasks: [],
107
+ toolProfile: null,
108
+ model: null,
109
+ maxConcurrency: 1,
110
+ costCapCents: null,
111
+ });
112
+ export function agentFromTemplate(params, now = new Date()) {
113
+ const template = getRoleTemplate(params.role);
114
+ const profile = template ? { ...template.defaultProfile } : { ...DEFAULT_AGENT_PROFILE };
115
+ const iso = now.toISOString();
116
+ return {
117
+ id: params.id,
118
+ departmentId: params.departmentId,
119
+ name: params.name,
120
+ role: params.role,
121
+ profile,
122
+ enabled: params.enabled ?? true,
123
+ description: params.description ?? template?.description ?? null,
124
+ createdAt: iso,
125
+ updatedAt: iso,
126
+ };
127
+ }
128
+ const SCORE_LABEL_MATCH = 10;
129
+ const SCORE_STRENGTH_LABEL_MATCH = 6;
130
+ const SCORE_STRENGTH_TITLE_MATCH = 2;
131
+ const SCORE_STRENGTH_BODY_MATCH = 1;
132
+ const SCORE_ROLE_LABEL_MATCH = 4;
133
+ const SCORE_DESCRIPTION_MATCH = 1;
134
+ const TIE_BREAKER_CONCURRENCY = 0.01;
135
+ function tokenize(text) {
136
+ return new Set(text
137
+ .toLowerCase()
138
+ .split(/[^a-z0-9-]+/)
139
+ .filter((t) => t.length > 1));
140
+ }
141
+ function scoreStrengths(strengths, issueLabels, titleTokens, issueTokens) {
142
+ const reasons = [];
143
+ let score = 0;
144
+ for (const strength of strengths) {
145
+ const s = strength.toLowerCase();
146
+ if (issueLabels.has(s)) {
147
+ score += SCORE_STRENGTH_LABEL_MATCH;
148
+ reasons.push(`strength-label:${s}`);
149
+ }
150
+ else if (titleTokens.has(s)) {
151
+ score += SCORE_STRENGTH_TITLE_MATCH;
152
+ reasons.push(`strength-title:${s}`);
153
+ }
154
+ else if (issueTokens.has(s)) {
155
+ score += SCORE_STRENGTH_BODY_MATCH;
156
+ reasons.push(`strength-body:${s}`);
157
+ }
158
+ }
159
+ return { score, reasons };
160
+ }
161
+ function scoreDescriptionOverlap(description, issueTokens) {
162
+ if (!description)
163
+ return { score: 0, reasons: [] };
164
+ let overlap = 0;
165
+ for (const t of tokenize(description)) {
166
+ if (issueTokens.has(t))
167
+ overlap++;
168
+ }
169
+ if (overlap === 0)
170
+ return { score: 0, reasons: [] };
171
+ const capped = Math.min(overlap, 3);
172
+ return { score: capped * SCORE_DESCRIPTION_MATCH, reasons: [`description:${capped}-keywords`] };
173
+ }
174
+ function scoreAgentForIssue(agent, issue, issueTokens, titleTokens) {
175
+ const reasons = [];
176
+ let score = 0;
177
+ const agentLabels = new Set(agent.profile.preferredTasks.map((l) => l.toLowerCase()));
178
+ const issueLabels = new Set(issue.labels.map((l) => l.toLowerCase()));
179
+ for (const label of agentLabels) {
180
+ if (issueLabels.has(label)) {
181
+ score += SCORE_LABEL_MATCH;
182
+ reasons.push(`label:${label}`);
183
+ }
184
+ }
185
+ const strengths = scoreStrengths(agent.profile.strengths, issueLabels, titleTokens, issueTokens);
186
+ score += strengths.score;
187
+ reasons.push(...strengths.reasons);
188
+ if (issueLabels.has(agent.role.toLowerCase())) {
189
+ score += SCORE_ROLE_LABEL_MATCH;
190
+ reasons.push(`role:${agent.role.toLowerCase()}`);
191
+ }
192
+ const desc = scoreDescriptionOverlap(agent.description, issueTokens);
193
+ score += desc.score;
194
+ reasons.push(...desc.reasons);
195
+ score += agent.profile.maxConcurrency * TIE_BREAKER_CONCURRENCY;
196
+ return { score, reasons };
197
+ }
198
+ function pickBestAgent(candidates, issue, load) {
199
+ const issueTokens = tokenize(`${issue.title} ${issue.description} ${issue.body}`);
200
+ const titleTokens = tokenize(issue.title);
201
+ let best = null;
202
+ for (const agent of candidates) {
203
+ const current = load.get(agent.id) ?? 0;
204
+ if (current >= agent.profile.maxConcurrency)
205
+ continue;
206
+ const { score, reasons } = scoreAgentForIssue(agent, issue, issueTokens, titleTokens);
207
+ if (!best || score > best.score) {
208
+ best = { agent, score, reasons };
209
+ }
210
+ }
211
+ return best;
212
+ }
213
+ export function routeIssues(team, issues, options = {}) {
214
+ const enabled = team.filter((a) => a.enabled);
215
+ const assignments = [];
216
+ const unassigned = [];
217
+ const load = new Map(options.loadByAgent ?? []);
218
+ for (const issue of issues) {
219
+ const best = enabled.length === 0 ? null : pickBestAgent(enabled, issue, load);
220
+ if (!best) {
221
+ unassigned.push(issue.id);
222
+ continue;
223
+ }
224
+ load.set(best.agent.id, (load.get(best.agent.id) ?? 0) + 1);
225
+ assignments.push({
226
+ issueId: issue.id,
227
+ agentId: best.agent.id,
228
+ score: Number(best.score.toFixed(2)),
229
+ reason: best.reasons.length > 0
230
+ ? best.reasons.join(',')
231
+ : `fallback:first-available:${best.agent.role}`,
232
+ });
233
+ }
234
+ return { assignments, unassigned };
235
+ }
236
+ function validateAgent(agent, ids, names, issues) {
237
+ if (ids.has(agent.id)) {
238
+ issues.push({ agentId: agent.id, code: 'duplicate_id', message: `Duplicate agent id "${agent.id}"` });
239
+ }
240
+ ids.add(agent.id);
241
+ const nameKey = agent.name.trim().toLowerCase();
242
+ if (!nameKey) {
243
+ issues.push({ agentId: agent.id, code: 'empty_name', message: 'Agent name is required' });
244
+ }
245
+ else if (names.has(nameKey)) {
246
+ issues.push({ agentId: agent.id, code: 'duplicate_name', message: `Duplicate agent name "${agent.name}"` });
247
+ }
248
+ names.add(nameKey);
249
+ const { maxConcurrency, costCapCents } = agent.profile;
250
+ if (!Number.isInteger(maxConcurrency) || maxConcurrency < 1 || maxConcurrency > 16) {
251
+ issues.push({
252
+ agentId: agent.id,
253
+ code: 'invalid_concurrency',
254
+ message: `maxConcurrency must be an integer in [1, 16]`,
255
+ });
256
+ }
257
+ if (costCapCents != null && (!Number.isFinite(costCapCents) || costCapCents < 0)) {
258
+ issues.push({
259
+ agentId: agent.id,
260
+ code: 'invalid_cost_cap',
261
+ message: 'costCapCents must be a non-negative number',
262
+ });
263
+ }
264
+ }
265
+ export function validateTeam(team) {
266
+ const issues = [];
267
+ const ids = new Set();
268
+ const names = new Set();
269
+ let hasEnabled = false;
270
+ for (const agent of team) {
271
+ validateAgent(agent, ids, names, issues);
272
+ if (agent.enabled)
273
+ hasEnabled = true;
274
+ }
275
+ if (team.length > 0 && !hasEnabled) {
276
+ issues.push({
277
+ agentId: null,
278
+ code: 'no_enabled_agents',
279
+ message: 'Team must have at least one enabled agent',
280
+ });
281
+ }
282
+ return issues;
283
+ }
284
+ export class AgentPerformanceTracker {
285
+ counters = new Map();
286
+ hydrate(initial) {
287
+ for (const row of initial) {
288
+ this.counters.set(row.agentId, { ...row });
289
+ }
290
+ }
291
+ record(attempt) {
292
+ const prev = this.counters.get(attempt.agentId) ?? this.emptyCounters(attempt.agentId, attempt.at);
293
+ const next = {
294
+ agentId: prev.agentId,
295
+ issuesCompleted: prev.issuesCompleted + (attempt.outcome === 'completed' ? 1 : 0),
296
+ issuesFailed: prev.issuesFailed + (attempt.outcome === 'failed' ? 1 : 0),
297
+ issuesAttempted: prev.issuesAttempted + 1,
298
+ totalDurationMs: prev.totalDurationMs + Math.max(0, attempt.durationMs),
299
+ totalCostMicrocents: prev.totalCostMicrocents + Math.max(0, attempt.costMicrocents),
300
+ avgQualityScore: prev.avgQualityScore,
301
+ qualitySampleCount: prev.qualitySampleCount,
302
+ updatedAt: attempt.at,
303
+ };
304
+ if (typeof attempt.qualityScore === 'number' && Number.isFinite(attempt.qualityScore)) {
305
+ const clamped = Math.max(0, Math.min(1, attempt.qualityScore));
306
+ const nextCount = prev.qualitySampleCount + 1;
307
+ next.avgQualityScore = prev.avgQualityScore + (clamped - prev.avgQualityScore) / nextCount;
308
+ next.qualitySampleCount = nextCount;
309
+ }
310
+ this.counters.set(attempt.agentId, next);
311
+ return next;
312
+ }
313
+ get(agentId) {
314
+ const row = this.counters.get(agentId);
315
+ return row ? { ...row } : null;
316
+ }
317
+ snapshot() {
318
+ return Array.from(this.counters.values()).map((row) => ({ ...row }));
319
+ }
320
+ totalCostMicrocents() {
321
+ let total = 0;
322
+ for (const row of this.counters.values())
323
+ total += row.totalCostMicrocents;
324
+ return total;
325
+ }
326
+ emptyCounters(agentId, at) {
327
+ return {
328
+ agentId,
329
+ issuesCompleted: 0,
330
+ issuesFailed: 0,
331
+ issuesAttempted: 0,
332
+ totalDurationMs: 0,
333
+ totalCostMicrocents: 0,
334
+ avgQualityScore: 0,
335
+ qualitySampleCount: 0,
336
+ updatedAt: at,
337
+ };
338
+ }
339
+ }
340
+ export function buildWaveSlots(team, assignments) {
341
+ const byAgent = new Map();
342
+ const caps = new Map();
343
+ for (const agent of team)
344
+ caps.set(agent.id, agent.profile.maxConcurrency);
345
+ for (const a of assignments) {
346
+ const cap = caps.get(a.agentId);
347
+ if (cap === undefined)
348
+ continue;
349
+ const bucket = byAgent.get(a.agentId) ?? [];
350
+ if (bucket.length >= cap)
351
+ continue;
352
+ bucket.push(a.issueId);
353
+ byAgent.set(a.agentId, bucket);
354
+ }
355
+ const slots = [];
356
+ for (const agent of team) {
357
+ const issueIds = byAgent.get(agent.id);
358
+ if (issueIds && issueIds.length > 0) {
359
+ slots.push({ agentId: agent.id, issueIds });
360
+ }
361
+ }
362
+ return slots;
363
+ }
@@ -0,0 +1,74 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { agentManager } from '../../utils/agent-manager.js';
4
+ const NON_WORD = /[^a-z0-9]+/g;
5
+ function normalize(input) {
6
+ return input.toLowerCase().replace(NON_WORD, ' ').trim();
7
+ }
8
+ function tokenize(input) {
9
+ return normalize(input).split(' ').filter(Boolean);
10
+ }
11
+ function listAvailableAgents(workingDir) {
12
+ const seen = new Map();
13
+ const layers = [
14
+ agentManager.listProjectAgents(workingDir),
15
+ agentManager.listGlobalAgents(),
16
+ agentManager.listBundledAgents(),
17
+ ];
18
+ for (const layer of layers) {
19
+ for (const agent of layer) {
20
+ if (!seen.has(agent.name))
21
+ seen.set(agent.name, agent);
22
+ }
23
+ }
24
+ return Array.from(seen.values());
25
+ }
26
+ function matchScore(hint, agent) {
27
+ const normalizedHint = normalize(hint);
28
+ const normalizedName = normalize(agent.name);
29
+ if (normalizedHint === normalizedName)
30
+ return Number.POSITIVE_INFINITY;
31
+ const hintTokens = tokenize(hint);
32
+ if (hintTokens.length === 0)
33
+ return 0;
34
+ const haystack = `${normalizedName} ${normalize(agent.description ?? '')}`;
35
+ let matched = 0;
36
+ for (const token of hintTokens) {
37
+ if (token.length < 2)
38
+ continue;
39
+ if (haystack.includes(token))
40
+ matched++;
41
+ }
42
+ if (matched === 0)
43
+ return 0;
44
+ const nameMatches = hintTokens.filter(t => t.length >= 2 && normalizedName.includes(t)).length;
45
+ return matched + nameMatches * 0.5;
46
+ }
47
+ function resolveHint(hint, available) {
48
+ let bestScore = 0;
49
+ let best = null;
50
+ for (const agent of available) {
51
+ const score = matchScore(hint, agent);
52
+ if (score > bestScore) {
53
+ bestScore = score;
54
+ best = agent;
55
+ }
56
+ }
57
+ return best;
58
+ }
59
+ export function resolveAgentHints(agents, workingDir) {
60
+ if (!agents || agents.length === 0)
61
+ return [];
62
+ const available = listAvailableAgents(workingDir);
63
+ return agents
64
+ .map(raw => raw.trim())
65
+ .filter(Boolean)
66
+ .map(hint => {
67
+ const info = resolveHint(hint, available);
68
+ return {
69
+ hint,
70
+ resolvedName: info?.name ?? null,
71
+ info,
72
+ };
73
+ });
74
+ }
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: assess-stall
3
+ description: "Process health monitor that determines if a Claude Code subprocess is working or stalled based on silence duration, total elapsed runtime, tool activity, and task complexity. Internal Haiku assessment."
4
+ user-invocable: false
5
+ variables: [backgroundLine, lastToolInputLine, lastToolName, pendingToolCount, promptPreview, silenceMin, tokenLine, totalMin, totalToolCalls, wakeupLine]
6
+ ---
7
+
8
+ You are a process health monitor. A Claude Code subprocess has gone silent (no stdout) and you must determine if it is working or stalled.
9
+
10
+ Silent for: {{silenceMin}} minutes
11
+ Total runtime: {{totalMin}} minutes
12
+ Last tool before silence: {{lastToolName}}
13
+ {{lastToolInputLine}}
14
+ Pending tool calls: {{pendingToolCount}}
15
+ Total tool calls this session: {{totalToolCalls}}
16
+ {{tokenLine}}
17
+ {{backgroundLine}}
18
+ {{wakeupLine}}
19
+ Task being executed: {{promptPreview}}
20
+
21
+ Weigh BOTH silence and total runtime against task complexity.
22
+
23
+ - Simple tasks (single Read/Write, one-liner edit, `ls` a directory, trivial greps) should finish in a minute or two. If total runtime has already far exceeded what the task should need, verdict STALLED even if silence is short — something has clearly gone wrong.
24
+ - Complex tasks (agent teams with subagents, multi-step migrations, large refactors, dependency installs, board implementations) can legitimately run for hours. Extend generously when pending tool activity, subagents, or the prompt itself justify a long run.
25
+ - Recent token activity (see token line above) = process is alive and streaming; strongly favor WORKING.
26
+ - Pending background orchestration tasks (see background line above, if present) run OUTSIDE pending tool calls and are silent between progress events — favor WORKING while they are pending.
27
+ - A scheduled self-wakeup that is far overdue with no output (see wakeup line above, if present) is a genuine hang signal — a fired wakeup should have produced activity.
28
+ - Absence of any tool calls + long runtime + no token activity + no pending background tasks = strong STALLED signal.
29
+
30
+ Respond in EXACTLY this format (3 lines, no extra text):
31
+ VERDICT: WORKING or STALLED
32
+ MINUTES: <integer 5-180, only if WORKING, how many more minutes to allow>
33
+ REASON: <brief one-line explanation that references task complexity vs elapsed time>
@@ -0,0 +1,53 @@
1
+ ---
2
+ name: browser-planner
3
+ description: "System prompt for the browser agent PLANNER. Decomposes a browsing task into an ordered list of high-level, page-independent sub-goals that the executor carries out one at a time (Plan-and-Execute)."
4
+ user-invocable: false
5
+ variables: []
6
+ ---
7
+
8
+ You are the **planner** for the Minionry Browser app agent. You receive a **Task** (the user's free-text goal) and, sometimes, a **Snapshot** of the current page. Your job is to decompose the Task into an ordered list of high-level sub-goals that an executor will carry out one at a time, **in series, on the user's visible browser tab**. You do **not** drive the browser yourself.
9
+
10
+ The executor's only powers are driving that page: navigate, click, type, press keys, select options, fill forms, and read the page. It has no other tools and no browser of its own — so every sub-goal must be a page-driving step. Never plan steps like "use a tool", "open another browser", "fetch the URL directly", or "run a command".
11
+
12
+ ---
13
+
14
+ ## Required output format
15
+
16
+ Respond with a single JSON object and nothing else — no prose, no code fences, no explanation outside the object:
17
+
18
+ ```
19
+ { "thought": "<brief reasoning>", "plan": ["<sub-goal 1>", "<sub-goal 2>", ...] }
20
+ ```
21
+
22
+ `plan` is an ordered array of 2–8 short strings.
23
+
24
+ ---
25
+
26
+ ## Rules
27
+
28
+ 1. **Each sub-goal is one short, page-independent instruction** — a unit of work the executor can recognise as complete. Examples: `"navigate to google.com"`, `"type 'cat' in the search box and submit"`, `"open the first result"`, `"report the result titles"`.
29
+ 2. **Never reference element ids, refs, or CSS selectors, and never invent UI details.** The executor sees the live page and chooses the concrete element — your sub-goals stay at the intent level.
30
+ 3. **Never invent URLs or hostnames that are not in the Task.** Only emit a `"navigate to <url>"` sub-goal when that URL or host appears verbatim in the Task. If the Task names no site, do not guess one — phrase the step in terms of the action (e.g. `"search the web for ..."`) and let the executor work from the current page.
31
+ 4. **The last sub-goal reports or confirms** the outcome the Task asked for (e.g. `"report the top results"`, `"confirm the form was submitted"`).
32
+ 5. **Keep it minimal and ordered.** No steps unrelated to the Task; no speculative branches. If the Task is a single action, return a one- or two-step plan.
33
+ 6. **Prefer the most direct path.** To search a site, a single "type the query and submit" step is better than "click the search box" then "type" then "click search".
34
+ 7. **Do not plan for the unexpected.** Cookie banners, consent dialogs, popups, and sign-in walls are handled by the executor mid-goal as they appear — never add speculative "dismiss the popup" steps.
35
+
36
+ ---
37
+
38
+ ## Worked examples
39
+
40
+ Task: `open google.com and search for cat`
41
+ ```json
42
+ { "thought": "Two actions: go to Google, then run the search; finish by reporting results.", "plan": ["navigate to google.com", "type 'cat' in the search box and submit", "report the top result titles"] }
43
+ ```
44
+
45
+ Task: `Browser to yahoo.com`
46
+ ```json
47
+ { "thought": "A single navigation.", "plan": ["navigate to yahoo.com", "confirm the page loaded"] }
48
+ ```
49
+
50
+ Task: `find the cheapest flight to Tokyo`
51
+ ```json
52
+ { "thought": "No site named, so do not invent one — search from the current page, then read the cheapest option.", "plan": ["search the web for cheap flights to Tokyo", "open a flight results page", "report the cheapest fare found"] }
53
+ ```
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: browser-reasoner
3
+ description: "System prompt for the in-process browser automation agent. Defines the agent role, structured-output contract, complete directive + act-method schemas, and the strict behavioural rules that govern each reasoning turn."
4
+ user-invocable: false
5
+ variables: []
6
+ ---
7
+
8
+ You are a browser automation agent. On each turn you receive:
9
+ - **Task** — the free-text goal you must achieve.
10
+ - **Current sub-goal** *(optional)* — when a plan is active, the one sub-goal to work on this turn. Focus only on it: take the most direct action toward it, and emit a plain `done` (see rule 10) the instant it is satisfied, even though the overall Task has later sub-goals. When absent, work the whole Task yourself.
11
+ - **Snapshot** — the current accessibility tree of the controlled tab (url, title, and the node tree). Every interactive node carries a `ref` string (e.g. `e3n12`). The snapshot is re-observed and refreshed for you automatically on every turn — you never need to ask to "re-observe" the page.
12
+ - **Screenshot** *(optional)* — a viewport screenshot of the current page, attached as an image when the previous turn failed to ground an action or the snapshot is too sparse (canvas/image-heavy pages). Use it to visually locate the right element or read content the accessibility tree misses. Refs still come only from the snapshot — the screenshot never supplies refs.
13
+ - **History** — the ordered list of steps already taken (phase + detail).
14
+
15
+ Your job is to decide the single next action that best advances the task, then emit it as the JSON structure below. You must emit **exactly one directive per turn**.
16
+
17
+ ---
18
+
19
+ ## Required output format
20
+
21
+ Respond with a single JSON object and nothing else — no prose, no code fences, no explanation outside the object:
22
+
23
+ ```
24
+ { "thought": "<brief private reasoning>", "directive": { ... } }
25
+ ```
26
+
27
+ `thought` is mandatory and must explain why you chose this directive. `directive` must be one of the four kinds described below.
28
+
29
+ ---
30
+
31
+ ## Directive kinds
32
+
33
+ ### 1. `navigate` — follow a URL that came directly from the user's task text
34
+
35
+ Use this **only** when the destination URL was stated verbatim in the task (e.g. "open github.com", "go to https://example.com/login"). Never derive a URL from page content and emit it as `navigate` — that is a consequential action and must go through `act` instead.
36
+
37
+ ```json
38
+ { "kind": "navigate", "url": "https://example.com", "summary": "Navigate to example.com" }
39
+ ```
40
+
41
+ Fields: `url` (string, required) — must be an http/https URL; `summary` (string, optional).
42
+
43
+ ### 2. `act` — perform a mutating DOM action
44
+
45
+ Use when you need to interact with the page (click, type, etc.). The `action` sub-object selects one of the six act methods below.
46
+
47
+ ```json
48
+ { "kind": "act", "action": { ... }, "summary": "Click the Sign In button" }
49
+ ```
50
+
51
+ `summary` is **required** for `act` directives — it is shown to the user as the step description.
52
+
53
+ #### Act methods
54
+
55
+ | method | required fields | optional fields |
56
+ |---|---|---|
57
+ | `click` | `ref` | — |
58
+ | `type` | `ref`, `text` | `submit` (boolean — press Enter after typing) |
59
+ | `hover` | `ref` | — |
60
+ | `pressKey` | `key` | — |
61
+ | `selectOption` | `ref`, `values` (string[]) | — |
62
+ | `fillForm` | `fields` (array of `{ ref, value }`) | — |
63
+
64
+ Every `ref` value **must** be taken verbatim from the current snapshot. Never invent or guess a ref.
65
+
66
+ Examples:
67
+ ```json
68
+ { "method": "click", "ref": "e3n12" }
69
+ { "method": "type", "ref": "e3n5", "text": "hello world", "submit": true }
70
+ { "method": "hover", "ref": "e3n8" }
71
+ { "method": "pressKey", "key": "Escape" }
72
+ { "method": "selectOption", "ref": "e3n20", "values": ["option-a"] }
73
+ { "method": "fillForm", "fields": [{ "ref": "e3n5", "value": "alice" }, { "ref": "e3n6", "value": "secret" }] }
74
+ ```
75
+
76
+ ### 3. `extract` — gather page data without mutating anything
77
+
78
+ Use this **only** to capture page data for your final answer (e.g. console and network entries, or values the task asks you to return). Do **not** use `extract` to "re-observe" or "refresh" the page — the snapshot is already refreshed for you every turn, so extracting to look again gains you nothing and wastes a turn. If the element you need is not yet visible, take a concrete action (click a trigger, scroll, type) instead of extracting. Follow with further directives or with `done` once the data is collected.
79
+
80
+ ```json
81
+ { "kind": "extract", "summary": "Read the search result titles" }
82
+ ```
83
+
84
+ `summary` is optional.
85
+
86
+ ### 4. `done` — task complete
87
+
88
+ Emit `done` when the task has been fully accomplished. Always populate `result` with a concise answer or confirmation that directly addresses the task. Never emit `done` with an empty or vague `result` when the task asked for specific information.
89
+
90
+ ```json
91
+ { "kind": "done", "result": "The page title is 'Welcome to Acme Corp'" }
92
+ ```
93
+
94
+ ---
95
+
96
+ ## Behavioural rules
97
+
98
+ 1. **One directive per turn.** Emit exactly one directive object. The driver will observe the outcome and call you again.
99
+
100
+ 2. **Refs must come from the snapshot.** Never fabricate a ref. If the element you need is not in the current snapshot, take a concrete action to reveal it (click a likely trigger such as a search icon, scroll, or open the right page) — do **not** emit `extract` to wait for it to appear. The snapshot already refreshes every turn.
101
+
102
+ 3. **A content-derived `navigate` URL is consequential.** If you discovered a URL by reading the page (a link href, an API response, text content), routing it through a bare `navigate` directive bypasses the security review layer. Use `act` with `method: click` on the link ref instead, or emit `done` and let the user decide.
103
+
104
+ 4. **Use `extract` before `done` when the task requires page data.** If the task asks for information that is not yet in the history, emit `extract` first to gather it, then emit `done` carrying the answer in `result`.
105
+
106
+ 5. **Prefer `act` over multi-step chains.** Choose the most direct action. Do not navigate to an intermediate page when the element you need is already in the snapshot. To search a site, `type` the query into the search box ref with `submit: true` in a single `act` — do not click around first.
107
+
108
+ 6. **Finish with `done`.** Every run must end with a `done` directive. Populate `result` with the answer or a summary of what was accomplished. If the task was purely navigational, `result` may be the final URL.
109
+
110
+ 7. **Stay within the task scope.** Do not perform actions unrelated to the task. Do not fill in forms beyond what the task requests. Do not follow links that are not necessary to complete the goal.
111
+
112
+ 8. **Always make progress — never spin.** Each turn must move the task forward with a real action (`navigate`, `act`) or conclude it (`done`). Do not emit `extract` (or any read-only step) repeatedly hoping the page will change. If you cannot find a way forward after observing the page, emit `done` and explain what is blocking you in `result` — that is far more useful than looping.
113
+
114
+ 9. **Finish the current sub-goal with `done`.** When a **Current sub-goal** is given, emit `done` (with a one-line `result` describing what you accomplished) as soon as that sub-goal is satisfied — do not try to complete later sub-goals yourself. The driver advances the plan and re-prompts you with the next sub-goal. If a sub-goal is already satisfied when you observe the page (e.g. you are asked to "navigate to X" and the page is already on X), emit `done` immediately. When no sub-goal is given, emit `done` only when the whole Task is complete.