@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,557 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { randomBytes } from 'node:crypto';
4
+ import { ModelProfileStore } from '../../engines/credentials/model-profiles.js';
5
+ import { ENGINE_EFFORT_LEVELS, engineForModel, parseProfileModelValue } from '../../engines/EngineEvent.js';
6
+ import { hermesAvailability, MINIMUM_HERMES_APP_RUN_VERSION } from '../../engines/hermes/hermes-provision.js';
7
+ import { getQualityEffortLevel, getQualityEngine, getQualityFastMode, getQualityModel } from '../settings.js';
8
+ import { resolveAppOwnedModel } from './app-endpoints.js';
9
+ import { logAppAudit } from './audit.js';
10
+ import { deregisterLiveRun, findLiveRunByTab, listLiveSubscriptions, registerLiveRun } from './live-registry.js';
11
+ import { SdkMethodError } from './registry.js';
12
+ import { dropSubscription } from './revoke.js';
13
+ import { deriveRunProfile } from './run-profile.js';
14
+ import { recordSdkStreamEvent } from './streams.js';
15
+ export const MAX_SYSTEM_PROMPT_CHARS = 32_000;
16
+ export const MAX_RUN_TURNS = 50;
17
+ export const MAX_RUN_SECONDS = 1_800;
18
+ export const DEFAULT_RUN_TURNS = 20;
19
+ export const DEFAULT_RUN_SECONDS = 900;
20
+ export const AGENT_RUN_MODEL_SELECTIONS = ['quality'];
21
+ let agentHost = null;
22
+ export function setSdkAgentHost(host) {
23
+ agentHost = host;
24
+ }
25
+ export function resetSdkAgentHost() {
26
+ agentHost = null;
27
+ }
28
+ const runsById = new Map();
29
+ const MAX_TERMINAL_RECORDS = 200;
30
+ function pruneTerminalRecords() {
31
+ let excess = runsById.size - MAX_TERMINAL_RECORDS;
32
+ if (excess <= 0)
33
+ return;
34
+ for (const [runId, record] of runsById) {
35
+ if (excess <= 0)
36
+ break;
37
+ if (record.outcome) {
38
+ runsById.delete(runId);
39
+ excess -= 1;
40
+ }
41
+ }
42
+ }
43
+ const sessionsByTab = new Map();
44
+ export function resetSdkAgentRuns() {
45
+ runsById.clear();
46
+ sessionsByTab.clear();
47
+ }
48
+ function runStreamIdentity(record) {
49
+ return {
50
+ requestId: record.requestId,
51
+ appId: record.appId,
52
+ spaceKey: record.spaceKey,
53
+ kind: 'agents.run',
54
+ };
55
+ }
56
+ function emitRunEvent(record, event, payload) {
57
+ const seq = recordSdkStreamEvent(runStreamIdentity(record), event, payload);
58
+ const data = { requestId: record.requestId, event, payload, seq };
59
+ record.broadcast({ type: 'sdkEvent', tabId: record.bridgeTabId, data });
60
+ }
61
+ function settleRun(record, outcome) {
62
+ if (record.outcome)
63
+ return;
64
+ const final = record.cancelledBy
65
+ ? { status: 'cancelled', text: outcome.text }
66
+ : outcome;
67
+ record.outcome = final;
68
+ deregisterLiveRun(record.runId);
69
+ emitRunEvent(record, 'status', { status: final.status });
70
+ const waiters = record.waiters.splice(0);
71
+ for (const waiter of waiters)
72
+ waiter(final);
73
+ logAppAudit({
74
+ appId: record.appId,
75
+ origin: record.origin,
76
+ method: 'agents.run.end',
77
+ decision: 'allow',
78
+ requestId: record.requestId,
79
+ spaceKey: record.spaceKey,
80
+ reason: `run ${record.runId} ${final.status}${record.cancelledBy ? ` (${record.cancelledBy})` : ''}${runAuditSuffix(record)}`,
81
+ });
82
+ }
83
+ function runAuditSuffix(record) {
84
+ return `${record.modelValue ? ` target=${record.modelValue}` : ''}${record.turn > 1 ? ` turn=${record.turn}` : ''}`;
85
+ }
86
+ function cancelRunRecord(record, cause) {
87
+ if (record.outcome)
88
+ return;
89
+ if (!record.cancelledBy)
90
+ record.cancelledBy = cause;
91
+ record.cancelRun();
92
+ }
93
+ const RUN_PARAMS_SHAPE = '{ prompt, title?, model?, modelSelection?, systemPrompt?, budget?: { maxTurns?, maxSeconds? }, sessionId? }';
94
+ const RUN_PARAM_KEYS = new Set([
95
+ 'prompt',
96
+ 'title',
97
+ 'model',
98
+ 'modelSelection',
99
+ 'systemPrompt',
100
+ 'budget',
101
+ 'sessionId',
102
+ ]);
103
+ const BUDGET_KEYS = new Set(['maxTurns', 'maxSeconds']);
104
+ function badRequest(message) {
105
+ return new SdkMethodError('BAD_REQUEST', message);
106
+ }
107
+ function displayValue(value) {
108
+ const cleaned = value.replace(/[\u0000-\u001f\u007f]/g, ' ');
109
+ return cleaned.length > 120 ? `${cleaned.slice(0, 119)}…` : cleaned;
110
+ }
111
+ function refuseUnknownKeys(raw, allowed, what, shape) {
112
+ const unknown = Object.keys(raw).filter((key) => !allowed.has(key));
113
+ if (unknown.length === 0)
114
+ return;
115
+ const named = unknown.slice(0, 5).map((key) => `'${displayValue(key)}'`).join(', ');
116
+ throw badRequest(`${what}: unknown param${unknown.length > 1 ? 's' : ''} ${named}${unknown.length > 5 ? ', …' : ''} — expected ${shape}`);
117
+ }
118
+ function parseCeiling(raw, field, max, fallback) {
119
+ if (raw === undefined)
120
+ return fallback;
121
+ if (typeof raw !== 'number' || !Number.isSafeInteger(raw) || raw <= 0) {
122
+ throw badRequest(`agents.run budget.${field} must be a positive integer when present`);
123
+ }
124
+ return Math.min(raw, max);
125
+ }
126
+ function parseBudget(raw) {
127
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
128
+ throw badRequest('agents.run budget must be an object { maxTurns?, maxSeconds? }');
129
+ }
130
+ const budget = raw;
131
+ refuseUnknownKeys(budget, BUDGET_KEYS, 'agents.run budget', '{ maxTurns?, maxSeconds? }');
132
+ return {
133
+ maxTurns: parseCeiling(budget.maxTurns, 'maxTurns', MAX_RUN_TURNS, DEFAULT_RUN_TURNS),
134
+ maxSeconds: parseCeiling(budget.maxSeconds, 'maxSeconds', MAX_RUN_SECONDS, DEFAULT_RUN_SECONDS),
135
+ };
136
+ }
137
+ function optionalString(raw, field, nonEmpty) {
138
+ const value = raw[field];
139
+ if (value === undefined)
140
+ return undefined;
141
+ if (typeof value !== 'string' || (nonEmpty && value === '')) {
142
+ throw badRequest(`agents.run ${field} must be a ${nonEmpty ? 'non-empty ' : ''}string when present`);
143
+ }
144
+ return value;
145
+ }
146
+ function parseSystemPrompt(raw) {
147
+ if (raw === undefined)
148
+ return undefined;
149
+ if (typeof raw !== 'string' || raw.length > MAX_SYSTEM_PROMPT_CHARS) {
150
+ throw badRequest(`agents.run systemPrompt must be a string of at most ${MAX_SYSTEM_PROMPT_CHARS} characters`);
151
+ }
152
+ return raw;
153
+ }
154
+ function parseModelSelection(raw) {
155
+ if (raw === undefined)
156
+ return undefined;
157
+ const name = AGENT_RUN_MODEL_SELECTIONS.find((known) => known === raw);
158
+ if (!name) {
159
+ const known = AGENT_RUN_MODEL_SELECTIONS.map((value) => `'${value}'`).join(', ');
160
+ throw badRequest(`agents.run modelSelection must be one of ${known} when present`);
161
+ }
162
+ return name;
163
+ }
164
+ function assertRunFieldsCombine({ model, modelSelection, systemPrompt, budget, sessionId }) {
165
+ const choosesModel = model !== undefined || modelSelection !== undefined;
166
+ if (sessionId !== undefined && (choosesModel || systemPrompt !== undefined || budget !== undefined)) {
167
+ throw badRequest('agents.run with sessionId continues that session on its own model, systemPrompt and budget — omit model, modelSelection, systemPrompt and budget');
168
+ }
169
+ if (model !== undefined && modelSelection !== undefined) {
170
+ throw badRequest('agents.run takes model or modelSelection, not both');
171
+ }
172
+ if (model === undefined && (systemPrompt !== undefined || budget !== undefined)) {
173
+ throw badRequest('agents.run systemPrompt and budget apply only to a run on an app-registered model — pass model');
174
+ }
175
+ }
176
+ function parseRunParams(params) {
177
+ if (typeof params !== 'object' || params === null || Array.isArray(params)) {
178
+ throw badRequest(`agents.run requires params ${RUN_PARAMS_SHAPE}`);
179
+ }
180
+ const raw = params;
181
+ refuseUnknownKeys(raw, RUN_PARAM_KEYS, 'agents.run', RUN_PARAMS_SHAPE);
182
+ if (typeof raw.prompt !== 'string' || raw.prompt.trim() === '') {
183
+ throw badRequest('agents.run requires a non-empty string prompt');
184
+ }
185
+ const title = optionalString(raw, 'title', false);
186
+ const model = optionalString(raw, 'model', true);
187
+ const modelSelection = parseModelSelection(raw.modelSelection);
188
+ const sessionId = optionalString(raw, 'sessionId', true);
189
+ const systemPrompt = parseSystemPrompt(raw.systemPrompt);
190
+ const budget = raw.budget === undefined ? undefined : parseBudget(raw.budget);
191
+ assertRunFieldsCombine({ model, modelSelection, systemPrompt, budget, sessionId });
192
+ return {
193
+ prompt: raw.prompt,
194
+ ...(title !== undefined ? { title } : {}),
195
+ ...(model !== undefined ? { model } : {}),
196
+ ...(modelSelection !== undefined ? { modelSelection } : {}),
197
+ ...(systemPrompt !== undefined ? { systemPrompt } : {}),
198
+ ...(budget !== undefined ? { budget } : {}),
199
+ ...(sessionId !== undefined ? { sessionId } : {}),
200
+ };
201
+ }
202
+ async function admitAppOwnedModel(modelValue, args) {
203
+ const profile = resolveAppOwnedModel(modelValue, { appId: args.appId, spaceKey: args.spaceKey }, Date.now());
204
+ if (!profile) {
205
+ throw new SdkMethodError('MODEL_NOT_ALLOWED', `agents.run: model '${displayValue(modelValue)}' is not a live endpoint this app registered in this Space — register one with endpoints.register and pass its modelValue`);
206
+ }
207
+ if (profile.engine !== 'hermes') {
208
+ throw new SdkMethodError('ENGINE_UNAVAILABLE', `agents.run: the ${profile.engine} engine cannot run an app session`);
209
+ }
210
+ let availability;
211
+ try {
212
+ availability = await hermesAvailability();
213
+ }
214
+ catch {
215
+ throw new SdkMethodError('ENGINE_UNAVAILABLE', 'agents.run: could not verify the hermes engine on this machine');
216
+ }
217
+ if (!availability.available) {
218
+ const why = availability.state === 'missing'
219
+ ? 'is not installed on this machine'
220
+ : availability.state === 'too-old'
221
+ ? `is older than ${MINIMUM_HERMES_APP_RUN_VERSION}, the minimum for app runs`
222
+ : 'cannot be confined for an app run on this machine';
223
+ throw new SdkMethodError('ENGINE_UNAVAILABLE', `agents.run: the hermes engine ${why}`);
224
+ }
225
+ return profile.engine;
226
+ }
227
+ export function resolveAgentsRunScopes(params) {
228
+ const raw = typeof params === 'object' && params !== null && !Array.isArray(params) ? params : {};
229
+ return raw.modelSelection === undefined ? ['agents:run'] : ['agents:run', 'quality:read'];
230
+ }
231
+ function assertUserClaudeProfile(model) {
232
+ const parsed = parseProfileModelValue(model);
233
+ if (!parsed)
234
+ return;
235
+ const profile = new ModelProfileStore().get(parsed.profileId);
236
+ if (!profile || profile.owner || profile.engine !== 'claude-code' || parsed.engine !== 'claude-code') {
237
+ throw new SdkMethodError('MODEL_NOT_ALLOWED', `agents.run: the Quality model '${displayValue(model)}' is not a Claude Code model added on this machine — choose another model for Quality`);
238
+ }
239
+ }
240
+ function admitModelSelection(name, args) {
241
+ const granted = args.grant?.scopes ?? [];
242
+ if (!granted.includes('quality:read')) {
243
+ throw new SdkMethodError('SCOPE_DENIED', `agents.run: modelSelection '${name}' needs the quality:read scope`);
244
+ }
245
+ const engine = getQualityEngine();
246
+ if (engine !== 'claude-code') {
247
+ throw new SdkMethodError('ENGINE_UNAVAILABLE', `agents.run: the Quality model runs on ${engine}, and only Claude Code can run an app session with tools — choose a Claude Code model for Quality`);
248
+ }
249
+ const stored = getQualityModel();
250
+ const model = stored !== 'default' && engineForModel(stored) === engine ? stored : undefined;
251
+ if (model)
252
+ assertUserClaudeProfile(model);
253
+ const effortLevel = getQualityEffortLevel();
254
+ return {
255
+ name,
256
+ engine,
257
+ ...(model ? { model } : {}),
258
+ effortLevel: ENGINE_EFFORT_LEVELS[engine].includes(effortLevel) ? effortLevel : 'auto',
259
+ fastMode: getQualityFastMode(),
260
+ };
261
+ }
262
+ function findAppRunSession(args, sessionId) {
263
+ const session = sessionsByTab.get(sessionId);
264
+ if (!session || session.appId !== args.appId || session.spaceKey !== args.spaceKey) {
265
+ throw badRequest(`unknown sessionId '${displayValue(sessionId)}' — agents.run continues only an open session this app started with agents.run in this Space`);
266
+ }
267
+ const granted = args.grant?.scopes ?? [];
268
+ if (session.profile.scopes.some((scope) => !granted.includes(scope))) {
269
+ throw badRequest(`session '${session.tabId}' started under scopes this app's grant no longer holds — start a new run`);
270
+ }
271
+ return session;
272
+ }
273
+ function assertSessionIdle(session) {
274
+ const inFlight = [...runsById.values()].some((record) => record.tabId === session.tabId && !record.outcome);
275
+ if (inFlight || session.claimed || session.isExecuting?.()) {
276
+ throw badRequest(`session_busy: session '${session.tabId}' is still running a turn — wait for its result() before continuing it`);
277
+ }
278
+ }
279
+ export async function admitAgentRun(args, claim = false) {
280
+ const request = parseRunParams(args.params);
281
+ if (request.sessionId !== undefined) {
282
+ let session = findAppRunSession(args, request.sessionId);
283
+ let engine;
284
+ if (session.modelValue) {
285
+ engine = await admitAppOwnedModel(session.modelValue, args);
286
+ session = findAppRunSession(args, request.sessionId);
287
+ }
288
+ assertSessionIdle(session);
289
+ if (claim)
290
+ session.claimed = true;
291
+ return {
292
+ kind: 'continue',
293
+ request,
294
+ session,
295
+ turn: session.turns + 1,
296
+ ...(engine && session.modelValue ? { model: { engine, value: session.modelValue } } : {}),
297
+ };
298
+ }
299
+ if (request.modelSelection !== undefined) {
300
+ return { kind: 'start', request, selection: admitModelSelection(request.modelSelection, args) };
301
+ }
302
+ if (request.model === undefined)
303
+ return { kind: 'start', request };
304
+ const engine = await admitAppOwnedModel(request.model, args);
305
+ const budget = request.budget ?? { maxTurns: DEFAULT_RUN_TURNS, maxSeconds: DEFAULT_RUN_SECONDS };
306
+ return {
307
+ kind: 'start',
308
+ request,
309
+ model: {
310
+ value: request.model,
311
+ engine,
312
+ ...(request.systemPrompt !== undefined ? { systemPrompt: request.systemPrompt } : {}),
313
+ maxTurns: budget.maxTurns,
314
+ maxSeconds: budget.maxSeconds,
315
+ },
316
+ };
317
+ }
318
+ export async function agentsRunAdmit(args) {
319
+ await admitAgentRun(args);
320
+ }
321
+ export function agentsRunBouncerInput(params) {
322
+ if (typeof params !== 'object' || params === null || Array.isArray(params)) {
323
+ return params === undefined ? {} : { params };
324
+ }
325
+ const raw = params;
326
+ if (!('systemPrompt' in raw))
327
+ return raw;
328
+ const { systemPrompt, ...rest } = raw;
329
+ return { ...rest, systemPrompt: typeof systemPrompt === 'string' ? `[${systemPrompt.length} characters]` : 'invalid' };
330
+ }
331
+ const MAX_RUN_TITLE_LENGTH = 60;
332
+ export function sanitizeRunTitle(title, appId) {
333
+ const cleaned = (title ?? '').replace(/[\u0000-\u001f\u007f]/g, ' ').replace(/\s+/g, ' ').trim();
334
+ const base = cleaned || `${appId.replace(/-[a-f0-9]{12}$/, '')} run`;
335
+ return base.length > MAX_RUN_TITLE_LENGTH ? `${base.slice(0, MAX_RUN_TITLE_LENGTH - 1)}…` : base;
336
+ }
337
+ export async function agentsRunHandler(args) {
338
+ const host = agentHost;
339
+ if (!host) {
340
+ throw new SdkMethodError('INTERNAL', 'agents.run host is not wired — the WebSocket handler installs it at startup');
341
+ }
342
+ const admission = await admitAgentRun(args, true);
343
+ try {
344
+ return await startAdmittedRun(host, args, admission);
345
+ }
346
+ finally {
347
+ if (admission.kind === 'continue')
348
+ admission.session.claimed = false;
349
+ }
350
+ }
351
+ async function startAdmittedRun(host, args, admission) {
352
+ const { prompt, title } = admission.request;
353
+ const runId = `run-${Date.now()}-${randomBytes(4).toString('hex')}`;
354
+ const grantScopes = args.grant ? [...args.grant.scopes] : [];
355
+ const profile = deriveRunProfile({
356
+ appId: args.appId,
357
+ origin: args.origin,
358
+ grantScopes,
359
+ workingDir: args.workingDir,
360
+ });
361
+ const continued = admission.kind === 'continue' ? admission : undefined;
362
+ const model = admission.kind === 'start' ? admission.model : undefined;
363
+ const selection = admission.kind === 'start' ? admission.selection : undefined;
364
+ const turn = continued ? continued.turn : 1;
365
+ const handle = await host({
366
+ appId: args.appId,
367
+ origin: args.origin,
368
+ spaceKey: args.spaceKey,
369
+ workingDir: args.workingDir,
370
+ runId,
371
+ tabName: sanitizeRunTitle(title, args.appId),
372
+ prompt,
373
+ grantScopes,
374
+ profile,
375
+ ...(model ? { model } : {}),
376
+ ...(selection ? { selection } : {}),
377
+ ...(continued ? { continuation: continuationOf(continued) } : {}),
378
+ });
379
+ const modelValue = handle.modelValue ?? model?.value ?? continued?.session.modelValue;
380
+ const record = {
381
+ runId,
382
+ appId: args.appId,
383
+ origin: args.origin,
384
+ spaceKey: args.spaceKey,
385
+ requestId: args.requestId,
386
+ bridgeTabId: args.tabId,
387
+ tabId: handle.tabId,
388
+ broadcast: handle.broadcast,
389
+ cancelRun: handle.cancel,
390
+ ...(modelValue ? { modelValue } : {}),
391
+ turn,
392
+ waiters: [],
393
+ };
394
+ runsById.set(runId, record);
395
+ pruneTerminalRecords();
396
+ if (continued) {
397
+ continued.session.turns = turn;
398
+ }
399
+ else {
400
+ rememberAppRunSession(args, handle, profile, modelValue);
401
+ }
402
+ registerLiveRun({
403
+ runId,
404
+ appId: args.appId,
405
+ origin: args.origin,
406
+ spaceKey: args.spaceKey,
407
+ requestId: args.requestId,
408
+ tabId: handle.tabId,
409
+ sessionId: handle.sessionId,
410
+ cancel: () => cancelRunRecord(record, 'grant revoked'),
411
+ });
412
+ logAppAudit({
413
+ appId: args.appId,
414
+ origin: args.origin,
415
+ method: 'agents.run.start',
416
+ decision: 'allow',
417
+ requestId: args.requestId,
418
+ spaceKey: args.spaceKey,
419
+ reason: `${runStartReason(record, continued ? continued.session.profile : profile, continued !== undefined, model)}${selectionAuditSuffix(selection)}`,
420
+ });
421
+ void handle.start().then((outcome) => settleRun(record, outcome));
422
+ return { runId, sessionId: handle.tabId };
423
+ }
424
+ function continuationOf(continued) {
425
+ return {
426
+ tabId: continued.session.tabId,
427
+ turn: continued.turn,
428
+ ...(continued.model ? { model: continued.model } : {}),
429
+ };
430
+ }
431
+ function rememberAppRunSession(args, handle, profile, modelValue) {
432
+ sessionsByTab.set(handle.tabId, {
433
+ tabId: handle.tabId,
434
+ appId: args.appId,
435
+ spaceKey: args.spaceKey,
436
+ profile,
437
+ ...(modelValue ? { modelValue } : {}),
438
+ turns: 1,
439
+ ...(handle.isExecuting ? { isExecuting: handle.isExecuting } : {}),
440
+ });
441
+ }
442
+ function runStartReason(record, ceiling, continued, model) {
443
+ const scopes = ceiling.scopes.join(',') || 'none';
444
+ const disallowedTools = ceiling.disallowedTools.join(',') || 'none';
445
+ const ceilings = model ? ` engine=${model.engine} maxTurns=${model.maxTurns} maxSeconds=${model.maxSeconds}` : '';
446
+ return `run ${record.runId} ${continued ? 'continued' : 'started'} in tab ${record.tabId} [profile cwd=app-sandbox scopes=${scopes} disallowedTools=${disallowedTools}]${runAuditSuffix(record)}${ceilings}`;
447
+ }
448
+ function selectionAuditSuffix(selection) {
449
+ if (!selection)
450
+ return '';
451
+ return ` selection=${selection.name} engine=${selection.engine} model=${displayValue(selection.model ?? 'default')}`;
452
+ }
453
+ export function agentsResultHandler(args) {
454
+ const raw = (typeof args.params === 'object' && args.params !== null && !Array.isArray(args.params))
455
+ ? args.params
456
+ : {};
457
+ const runId = typeof raw.runId === 'string' ? raw.runId : '';
458
+ const record = runId ? runsById.get(runId) : undefined;
459
+ if (!record || record.appId !== args.appId || record.spaceKey !== args.spaceKey) {
460
+ throw new SdkMethodError('BAD_REQUEST', `unknown runId '${runId}' — agents.result answers only this app's runs in this Space`);
461
+ }
462
+ if (record.outcome)
463
+ return record.outcome;
464
+ return new Promise((resolve) => record.waiters.push(resolve));
465
+ }
466
+ export function sdkCancelHandler(args) {
467
+ const raw = (typeof args.params === 'object' && args.params !== null && !Array.isArray(args.params))
468
+ ? args.params
469
+ : {};
470
+ const requestId = typeof raw.requestId === 'string' ? raw.requestId : '';
471
+ if (requestId === '') {
472
+ throw new SdkMethodError('BAD_REQUEST', 'cancel requires params { requestId } naming the request to cancel');
473
+ }
474
+ let record;
475
+ for (const candidate of runsById.values()) {
476
+ if (candidate.requestId === requestId && candidate.appId === args.appId && candidate.spaceKey === args.spaceKey) {
477
+ record = candidate;
478
+ break;
479
+ }
480
+ }
481
+ if (record) {
482
+ cancelRunRecord(record, 'app cancel');
483
+ return null;
484
+ }
485
+ const subscription = listLiveSubscriptions().find((sub) => sub.requestId === requestId && sub.appId === args.appId && sub.spaceKey === args.spaceKey);
486
+ if (subscription) {
487
+ dropSubscription(subscription, 'cancel.subscriptionDropped', 'app cancel');
488
+ return null;
489
+ }
490
+ throw new SdkMethodError('BAD_REQUEST', `nothing cancellable for requestId '${requestId}' — no agent run or live subscription of this app rode it`);
491
+ }
492
+ export function cancelRunsForModel(appId, spaceKey, modelValue) {
493
+ const bound = [...runsById.values()].filter((record) => !record.outcome && record.appId === appId && record.spaceKey === spaceKey && record.modelValue === modelValue);
494
+ for (const record of bound)
495
+ cancelRunRecord(record, 'endpoint removed');
496
+ return bound.length;
497
+ }
498
+ export function cancelAppRunForClosedTab(tabId) {
499
+ sessionsByTab.delete(tabId);
500
+ const live = findLiveRunByTab(tabId);
501
+ if (!live)
502
+ return;
503
+ const record = runsById.get(live.runId);
504
+ if (record)
505
+ cancelRunRecord(record, 'tab closed');
506
+ }
507
+ export function mirrorTabEventToSdk(tabId, type, data, broadcast) {
508
+ const live = findLiveRunByTab(tabId);
509
+ if (!live)
510
+ return;
511
+ const record = runsById.get(live.runId);
512
+ if (!record || record.outcome)
513
+ return;
514
+ const translated = translateTabEvent(type, data);
515
+ if (!translated)
516
+ return;
517
+ const seq = recordSdkStreamEvent(runStreamIdentity(record), translated.event, translated.payload);
518
+ const payload = { requestId: record.requestId, event: translated.event, payload: translated.payload, seq };
519
+ broadcast({ type: 'sdkEvent', tabId: record.bridgeTabId, data: payload });
520
+ }
521
+ const WITHHELD_TIMELINE_KINDS = new Set(['question', 'question_state']);
522
+ function translateOutputEvent(raw) {
523
+ const text = typeof raw.text === 'string' ? raw.text : '';
524
+ return text === '' ? null : { event: 'output', payload: { text } };
525
+ }
526
+ function translateToolUseEvent(raw) {
527
+ if (raw.type !== 'tool_complete' || typeof raw.toolName !== 'string')
528
+ return null;
529
+ return {
530
+ event: 'toolUse',
531
+ payload: {
532
+ tool: raw.toolName,
533
+ ...(raw.completeInput !== undefined ? { input: raw.completeInput } : {}),
534
+ },
535
+ };
536
+ }
537
+ function translateTimelineEvent(raw, data) {
538
+ const kind = typeof raw.kind === 'string' ? raw.kind : '';
539
+ if (WITHHELD_TIMELINE_KINDS.has(kind))
540
+ return null;
541
+ return { event: 'timelineEvent', payload: data };
542
+ }
543
+ function translateTabEvent(type, data) {
544
+ const raw = (typeof data === 'object' && data !== null) ? data : {};
545
+ switch (type) {
546
+ case 'output':
547
+ return translateOutputEvent(raw);
548
+ case 'movementStart':
549
+ return { event: 'status', payload: { status: 'running' } };
550
+ case 'toolUse':
551
+ return translateToolUseEvent(raw);
552
+ case 'timelineEvent':
553
+ return translateTimelineEvent(raw, data);
554
+ default:
555
+ return null;
556
+ }
557
+ }
@@ -0,0 +1,48 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { ModelProfileStore, parseProfileExpiry, parseProfileModelValue, profileCredentialId, } from '../../engines/credentials/model-profiles.js';
4
+ export function appProfileId(appId, slug) {
5
+ return `app-${appId}-${slug}`;
6
+ }
7
+ export function isAppOwnedProfile(profile) {
8
+ return profile.owner !== undefined;
9
+ }
10
+ function ownedBy(profile, owner) {
11
+ return (isAppOwnedProfile(profile) &&
12
+ profile.owner.appId === owner.appId &&
13
+ profile.owner.spaceKey === owner.spaceKey);
14
+ }
15
+ function isExpired(profile, now) {
16
+ const expiresMs = parseProfileExpiry(profile.expiresAt);
17
+ return expiresMs === undefined || expiresMs <= now;
18
+ }
19
+ function removeProfiles(store, credentials, profiles) {
20
+ for (const profile of profiles) {
21
+ credentials.remove(profileCredentialId(profile.id));
22
+ store.remove(profile.id);
23
+ }
24
+ return profiles.map((profile) => profile.id);
25
+ }
26
+ export function listAppProfiles(store, owner) {
27
+ return store.list().filter((profile) => ownedBy(profile, owner));
28
+ }
29
+ export function purgeExpiredAppProfiles(store, credentials, now) {
30
+ const expired = store.list().filter((profile) => isAppOwnedProfile(profile) && isExpired(profile, now));
31
+ return removeProfiles(store, credentials, expired);
32
+ }
33
+ export function removeAppProfiles(store, credentials, owner) {
34
+ return removeProfiles(store, credentials, listAppProfiles(store, owner));
35
+ }
36
+ export function resolveAppOwnedModel(modelValue, owner, now, deps = {}) {
37
+ if (typeof modelValue !== 'string')
38
+ return undefined;
39
+ const parsed = parseProfileModelValue(modelValue);
40
+ if (!parsed)
41
+ return undefined;
42
+ const profile = (deps.profiles ?? new ModelProfileStore()).get(parsed.profileId);
43
+ if (!profile || profile.id !== parsed.profileId || !ownedBy(profile, owner))
44
+ return undefined;
45
+ if (profile.engine !== parsed.engine || isExpired(profile, now))
46
+ return undefined;
47
+ return profile;
48
+ }