@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,303 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { randomUUID } from 'node:crypto';
4
+ import { logAppAudit } from './audit.js';
5
+ import { getLiveSubscriptionsForApp, listLiveSubscriptions, registerLiveSubscription } from './live-registry.js';
6
+ import { SdkMethodError } from './registry.js';
7
+ export const APP_TOOL_CALL_TIMEOUT_MS = 30_000;
8
+ export const APP_TOOL_CALL_TIMEOUT_MAX_MS = 120_000;
9
+ export const APP_TOOL_MAX_PENDING_CALLS = 8;
10
+ export const APP_TOOL_MAX_RESULT_BYTES = 1024 * 1024;
11
+ const registrations = new Map();
12
+ const senders = new Map();
13
+ const pending = new Map();
14
+ export class AppToolCallError extends Error {
15
+ code;
16
+ constructor(code, message) {
17
+ super(message);
18
+ this.name = 'AppToolCallError';
19
+ this.code = code;
20
+ }
21
+ }
22
+ function paramsObject(params, method) {
23
+ if (typeof params !== 'object' || params === null || Array.isArray(params)) {
24
+ throw new SdkMethodError('BAD_REQUEST', `${method} requires an object params payload`);
25
+ }
26
+ return params;
27
+ }
28
+ function requireString(raw, field, method) {
29
+ const value = raw[field];
30
+ if (typeof value !== 'string' || value === '') {
31
+ throw new SdkMethodError('BAD_REQUEST', `${method} requires a non-empty string ${field}`);
32
+ }
33
+ return value;
34
+ }
35
+ function parseToolSpec(raw, seen, method) {
36
+ const entry = paramsObject(raw, method);
37
+ const name = requireString(entry, 'name', `${method} tools[].name:`);
38
+ if (name.includes('__')) {
39
+ throw new SdkMethodError('BAD_REQUEST', `${method}: invalid tool name '${name}' — must contain no '__' (the agent sees '<appId>__<tool>')`);
40
+ }
41
+ if (seen.has(name)) {
42
+ throw new SdkMethodError('BAD_REQUEST', `${method}: duplicate tool name '${name}'`);
43
+ }
44
+ const description = requireString(entry, 'description', `${method} tools[].description:`);
45
+ const inputSchema = entry.inputSchema;
46
+ if (typeof inputSchema !== 'object' || inputSchema === null || Array.isArray(inputSchema)) {
47
+ throw new SdkMethodError('BAD_REQUEST', `${method}: '${name}' needs an inputSchema object`);
48
+ }
49
+ const timeoutMs = entry.timeoutMs;
50
+ if (timeoutMs !== undefined && (typeof timeoutMs !== 'number' || !Number.isInteger(timeoutMs) || timeoutMs <= 0)) {
51
+ throw new SdkMethodError('BAD_REQUEST', `${method}: '${name}' timeoutMs must be a positive integer`);
52
+ }
53
+ return {
54
+ name,
55
+ description,
56
+ inputSchema: inputSchema,
57
+ ...(timeoutMs !== undefined ? { timeoutMs: timeoutMs } : {}),
58
+ };
59
+ }
60
+ function buildToolTable(rawTools, appId, spaceKey) {
61
+ const served = new Map();
62
+ for (const live of registrations.values()) {
63
+ if (live.appId !== appId || live.spaceKey !== spaceKey)
64
+ continue;
65
+ for (const name of live.tools.keys())
66
+ served.set(name, live.requestId);
67
+ }
68
+ const tools = new Map();
69
+ for (const entry of rawTools) {
70
+ const spec = parseToolSpec(entry, tools, 'tools.register');
71
+ const owner = served.get(spec.name);
72
+ if (owner !== undefined) {
73
+ throw new SdkMethodError('BAD_REQUEST', `tools.register: '${spec.name}' is already served by registration '${owner}'`);
74
+ }
75
+ tools.set(spec.name, spec);
76
+ }
77
+ return tools;
78
+ }
79
+ export function toolsRegisterHandler(args) {
80
+ const raw = paramsObject(args.params, 'tools.register');
81
+ const rawTools = raw.tools;
82
+ if (!Array.isArray(rawTools) || rawTools.length === 0) {
83
+ throw new SdkMethodError('BAD_REQUEST', 'tools.register: tools must be a non-empty array');
84
+ }
85
+ const rawProfile = raw.profile;
86
+ if (rawProfile !== undefined && rawProfile !== 'browser') {
87
+ throw new SdkMethodError('BAD_REQUEST', `tools.register: unknown profile '${String(rawProfile)}' (fail closed)`);
88
+ }
89
+ if (listLiveSubscriptions().some((sub) => sub.requestId === args.requestId)) {
90
+ throw new SdkMethodError('BAD_REQUEST', `requestId '${args.requestId}' already holds a live subscription`);
91
+ }
92
+ if (!args.notify) {
93
+ throw new SdkMethodError('UNSUPPORTED', 'tools.register needs a host session to deliver calls over — this transport has none');
94
+ }
95
+ const tools = buildToolTable(rawTools, args.appId, args.spaceKey);
96
+ const registration = {
97
+ requestId: args.requestId,
98
+ appId: args.appId,
99
+ origin: args.origin,
100
+ spaceKey: args.spaceKey,
101
+ viewerId: args.viewerId,
102
+ ...(rawProfile !== undefined ? { profile: rawProfile } : {}),
103
+ tools,
104
+ };
105
+ const sub = {
106
+ requestId: args.requestId,
107
+ appId: args.appId,
108
+ origin: args.origin,
109
+ spaceKey: args.spaceKey,
110
+ kind: 'tools.register',
111
+ viewerId: args.viewerId,
112
+ teardown: () => retireAppToolRegistration(args.requestId, 'registration torn down'),
113
+ };
114
+ registrations.set(args.requestId, registration);
115
+ senders.set(args.requestId, args.notify);
116
+ registerLiveSubscription(sub);
117
+ return { registered: true };
118
+ }
119
+ export function toolsResultHandler(args) {
120
+ const raw = paramsObject(args.params, 'tools.result');
121
+ const callId = requireString(raw, 'callId', 'tools.result');
122
+ let failure;
123
+ if (raw.ok === false) {
124
+ const error = paramsObject(raw.error, 'tools.result error:');
125
+ const code = requireString(error, 'code', 'tools.result error:');
126
+ const message = requireString(error, 'message', 'tools.result error:');
127
+ failure = new AppToolCallError(code === 'APP_UNAVAILABLE' || code === 'APP_TIMEOUT' ? code : 'APP_ERROR', message);
128
+ }
129
+ else if (raw.ok !== true) {
130
+ throw new SdkMethodError('BAD_REQUEST', "tools.result: 'ok' must be a boolean");
131
+ }
132
+ const call = pending.get(callId);
133
+ if (!call)
134
+ return null;
135
+ if (call.appId !== args.appId || call.spaceKey !== args.spaceKey) {
136
+ console.warn(`[SdkAppTools] dropped tools.result for '${callId}' from '${args.appId}' — the call belongs to another app`);
137
+ logAppAudit({
138
+ appId: args.appId,
139
+ origin: args.origin,
140
+ method: 'tools.result.rejected',
141
+ decision: 'scope_denied',
142
+ requestId: args.requestId,
143
+ spaceKey: args.spaceKey,
144
+ reason: `answer for call '${callId}' does not belong to this app in this Space`,
145
+ });
146
+ return null;
147
+ }
148
+ if (failure) {
149
+ settlePending(call, `app reported ${failure.code}`, () => call.fail(failure));
150
+ return null;
151
+ }
152
+ const result = raw.result;
153
+ const oversize = serializedBytes(result);
154
+ if (oversize > APP_TOOL_MAX_RESULT_BYTES) {
155
+ settlePending(call, 'result over cap', () => call.fail(new AppToolCallError('APP_ERROR', `'${call.tool}' returned ${oversize} bytes, over the ${APP_TOOL_MAX_RESULT_BYTES}-byte result cap`)));
156
+ return null;
157
+ }
158
+ settlePending(call, 'ok', () => call.settle(result));
159
+ return null;
160
+ }
161
+ function serializedBytes(value) {
162
+ if (value === undefined)
163
+ return 0;
164
+ try {
165
+ return Buffer.byteLength(JSON.stringify(value) ?? '', 'utf8');
166
+ }
167
+ catch {
168
+ return Number.POSITIVE_INFINITY;
169
+ }
170
+ }
171
+ function settlePending(call, outcomeLabel, outcome) {
172
+ if (!pending.delete(call.callId))
173
+ return;
174
+ clearTimeout(call.timer);
175
+ const registration = registrations.get(call.registrationId);
176
+ logAppAudit({
177
+ appId: call.appId,
178
+ origin: registration?.origin ?? '',
179
+ method: 'tools.call',
180
+ decision: 'allow',
181
+ requestId: call.registrationId,
182
+ spaceKey: call.spaceKey,
183
+ reason: `host call '${call.callId}' to '${call.tool}' settled: ${outcomeLabel}`,
184
+ });
185
+ outcome();
186
+ }
187
+ function sendToolCall(registration, data) {
188
+ const notify = senders.get(registration.requestId);
189
+ if (!notify)
190
+ return;
191
+ try {
192
+ notify({ type: 'sdkToolCall', data, targetViewerId: registration.viewerId });
193
+ }
194
+ catch (error) {
195
+ console.error(`[SdkAppTools] failed to deliver ${data.op} '${data.callId}' to app '${registration.appId}':`, error);
196
+ }
197
+ }
198
+ function findServingRegistration(appId, spaceKey, tool) {
199
+ for (const registration of registrations.values()) {
200
+ if (registration.appId === appId && registration.spaceKey === spaceKey && registration.tools.has(tool)) {
201
+ return registration;
202
+ }
203
+ }
204
+ return undefined;
205
+ }
206
+ function pendingForApp(appId, spaceKey) {
207
+ let count = 0;
208
+ for (const call of pending.values()) {
209
+ if (call.appId === appId && call.spaceKey === spaceKey)
210
+ count += 1;
211
+ }
212
+ return count;
213
+ }
214
+ export function callAppTool(args) {
215
+ const registration = findServingRegistration(args.appId, args.spaceKey, args.tool);
216
+ if (!registration) {
217
+ return Promise.reject(new AppToolCallError('APP_UNAVAILABLE', `no connected app serves '${args.tool}' for '${args.appId}' in this Space`));
218
+ }
219
+ if (pendingForApp(args.appId, args.spaceKey) >= APP_TOOL_MAX_PENDING_CALLS) {
220
+ return Promise.reject(new AppToolCallError('RATE_LIMITED', `'${args.appId}' already has ${APP_TOOL_MAX_PENDING_CALLS} tool calls in flight — wait for one to finish`));
221
+ }
222
+ const spec = registration.tools.get(args.tool);
223
+ const timeoutMs = Math.min(args.timeoutMs ?? spec.timeoutMs ?? APP_TOOL_CALL_TIMEOUT_MS, APP_TOOL_CALL_TIMEOUT_MAX_MS);
224
+ const callId = `tc-${randomUUID()}`;
225
+ return new Promise((resolve, reject) => {
226
+ const timer = setTimeout(() => {
227
+ const call = pending.get(callId);
228
+ if (!call)
229
+ return;
230
+ settlePending(call, 'deadline elapsed', () => reject(new AppToolCallError('APP_TIMEOUT', `'${args.tool}' did not answer within ${timeoutMs}ms`)));
231
+ sendToolCall(registration, { op: 'cancel', callId, requestId: registration.requestId });
232
+ }, timeoutMs);
233
+ if (typeof timer.unref === 'function')
234
+ timer.unref();
235
+ pending.set(callId, {
236
+ callId,
237
+ registrationId: registration.requestId,
238
+ appId: args.appId,
239
+ spaceKey: args.spaceKey,
240
+ tool: args.tool,
241
+ timer,
242
+ settle: resolve,
243
+ fail: reject,
244
+ });
245
+ sendToolCall(registration, {
246
+ op: 'call',
247
+ callId,
248
+ requestId: registration.requestId,
249
+ tool: args.tool,
250
+ ...(args.input !== undefined ? { input: args.input } : {}),
251
+ });
252
+ });
253
+ }
254
+ export function cancelAppToolCall(callId, cause = 'cancelled by the host') {
255
+ const call = pending.get(callId);
256
+ if (!call)
257
+ return false;
258
+ settlePending(call, `cancelled: ${cause}`, () => call.fail(new AppToolCallError('APP_UNAVAILABLE', `call '${callId}' to '${call.tool}' was cancelled: ${cause}`)));
259
+ const registration = registrations.get(call.registrationId);
260
+ if (registration)
261
+ sendToolCall(registration, { op: 'cancel', callId, requestId: registration.requestId });
262
+ return true;
263
+ }
264
+ export function retireAppToolRegistration(requestId, cause) {
265
+ const registration = registrations.get(requestId);
266
+ if (!registration)
267
+ return false;
268
+ registrations.delete(requestId);
269
+ senders.delete(requestId);
270
+ for (const call of [...pending.values()]) {
271
+ if (call.registrationId !== requestId)
272
+ continue;
273
+ settlePending(call, `registration retired: ${cause}`, () => call.fail(new AppToolCallError('APP_UNAVAILABLE', `'${call.tool}' is no longer served by '${call.appId}': ${cause}`)));
274
+ }
275
+ return true;
276
+ }
277
+ export function listAppToolRegistrations() {
278
+ return [...registrations.values()];
279
+ }
280
+ export function listAppToolRegistrationsForApp(appId, spaceKey) {
281
+ return [...registrations.values()].filter((r) => r.appId === appId && r.spaceKey === spaceKey);
282
+ }
283
+ export function listAppToolsForApp(appId, spaceKey) {
284
+ return listAppToolRegistrationsForApp(appId, spaceKey).flatMap((r) => [...r.tools.values()]);
285
+ }
286
+ export function pendingAppToolCallCount() {
287
+ return pending.size;
288
+ }
289
+ export function retireAppToolsForApp(appId, spaceKey, cause) {
290
+ let retired = 0;
291
+ for (const sub of getLiveSubscriptionsForApp(appId, spaceKey)) {
292
+ if (sub.kind === 'tools.register' && retireAppToolRegistration(sub.requestId, cause))
293
+ retired += 1;
294
+ }
295
+ return retired;
296
+ }
297
+ export function resetAppTools() {
298
+ for (const call of pending.values())
299
+ clearTimeout(call.timer);
300
+ pending.clear();
301
+ registrations.clear();
302
+ senders.clear();
303
+ }
@@ -0,0 +1,48 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { machinePath } from '../../../bin/machine-layout.js';
6
+ function logsDir() {
7
+ return machinePath('logs');
8
+ }
9
+ function auditFilePath() {
10
+ return join(logsDir(), 'app-audit.jsonl');
11
+ }
12
+ export function logAppAudit(entry) {
13
+ const record = { ...entry, timestamp: entry.timestamp ?? new Date().toISOString() };
14
+ try {
15
+ const dir = logsDir();
16
+ if (!existsSync(dir)) {
17
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
18
+ }
19
+ appendFileSync(auditFilePath(), `${JSON.stringify(record)}\n`, { encoding: 'utf-8', mode: 0o600 });
20
+ }
21
+ catch (error) {
22
+ console.error('[AppAudit] Failed to write app-audit.jsonl:', error);
23
+ }
24
+ }
25
+ export function readAppAudit(opts) {
26
+ const path = auditFilePath();
27
+ if (!existsSync(path))
28
+ return [];
29
+ let content;
30
+ try {
31
+ content = readFileSync(path, 'utf-8');
32
+ }
33
+ catch (error) {
34
+ console.error('[AppAudit] Failed to read app-audit.jsonl:', error);
35
+ return [];
36
+ }
37
+ const lines = content.split('\n').filter((line) => line.trim().length > 0);
38
+ const selected = opts?.limit && opts.limit > 0 ? lines.slice(-opts.limit) : lines;
39
+ const entries = [];
40
+ for (const line of selected) {
41
+ try {
42
+ entries.push(JSON.parse(line));
43
+ }
44
+ catch {
45
+ }
46
+ }
47
+ return entries;
48
+ }
@@ -0,0 +1,188 @@
1
+ // Copyright (c) 2025-present Minionry, Inc.
2
+ // SPDX-License-Identifier: LicenseRef-Minionry-Software
3
+ import { createHash } from 'node:crypto';
4
+ import { deriveAppId } from '@minionry/app-manifest';
5
+ import { getLocalAppBinding, isLoopbackHostname } from './local-app-bindings.js';
6
+ import { runSdkPipeline } from './pipeline.js';
7
+ import { SDK_METHOD_REGISTRY } from './registry.js';
8
+ const SDK_REQUEST_TYPE = 'minionry:request';
9
+ const SDK_RESPONSE_TYPE = 'minionry:response';
10
+ const SDK_EVENT_TYPE = 'minionry:event';
11
+ const BROWSER_TRANSPORT_ROLE = 'owner';
12
+ export const BROWSER_TRANSPORT_VIEWER_ID = 'minionry-browser-transport';
13
+ const sha256Hex = (input) => createHash('sha256').update(input, 'utf8').digest('hex');
14
+ function parseBindingPayload(payload) {
15
+ let data;
16
+ try {
17
+ data = JSON.parse(payload);
18
+ }
19
+ catch {
20
+ return {
21
+ ok: false,
22
+ requestId: '',
23
+ error: { code: 'BAD_REQUEST', message: 'binding payload is not parseable JSON' },
24
+ };
25
+ }
26
+ if (typeof data !== 'object' || data === null || Array.isArray(data)) {
27
+ return {
28
+ ok: false,
29
+ requestId: '',
30
+ error: { code: 'BAD_REQUEST', message: 'binding payload is not a frame object' },
31
+ };
32
+ }
33
+ const raw = data;
34
+ const requestId = typeof raw.requestId === 'string' ? raw.requestId : '';
35
+ if (raw.type !== SDK_REQUEST_TYPE) {
36
+ return {
37
+ ok: false,
38
+ requestId,
39
+ error: { code: 'BAD_REQUEST', message: `binding payload is not a ${SDK_REQUEST_TYPE} frame` },
40
+ };
41
+ }
42
+ if (requestId === '' || typeof raw.method !== 'string' || raw.method === '') {
43
+ return {
44
+ ok: false,
45
+ requestId,
46
+ error: { code: 'BAD_REQUEST', message: 'request frame has missing or invalid requestId/method' },
47
+ };
48
+ }
49
+ return {
50
+ ok: true,
51
+ frame: { requestId, method: raw.method, params: raw.params },
52
+ };
53
+ }
54
+ export function attachSdkBrowserTransport(host, deps) {
55
+ const onSdkRequest = (event) => {
56
+ void handleBrowserSdkRequest(host, deps, event).catch((error) => {
57
+ console.error('[SdkBrowserTransport] request handling failed:', error);
58
+ });
59
+ };
60
+ host.on('sdkRequest', onSdkRequest);
61
+ return () => {
62
+ host.off('sdkRequest', onSdkRequest);
63
+ };
64
+ }
65
+ async function deliverFrame(host, pageId, frame) {
66
+ try {
67
+ await host.sdk.deliver({ pageId, frame: JSON.stringify(frame) });
68
+ }
69
+ catch (error) {
70
+ console.warn(`[SdkBrowserTransport] deliver to page ${pageId} failed: ${error instanceof Error ? error.message : String(error)}`);
71
+ }
72
+ }
73
+ function originPort(url) {
74
+ if (url.port !== '')
75
+ return Number(url.port);
76
+ return url.protocol === 'https:' ? 443 : 80;
77
+ }
78
+ async function resolveCallerIdentity(url) {
79
+ const binding = isLoopbackHostname(url.hostname) ? getLocalAppBinding(originPort(url)) : undefined;
80
+ if (binding)
81
+ return { appId: binding.appId, binding };
82
+ return { appId: await deriveAppId(url.hostname, url.origin, sha256Hex), binding: undefined };
83
+ }
84
+ function requestedScopeStrings(params) {
85
+ if (typeof params !== 'object' || params === null || Array.isArray(params))
86
+ return [];
87
+ const raw = params.scopes;
88
+ if (!Array.isArray(raw))
89
+ return [];
90
+ return raw.filter((scope) => typeof scope === 'string');
91
+ }
92
+ function connectManifestEnvelope(origin, binding, params) {
93
+ if (binding)
94
+ return binding.manifest;
95
+ return {
96
+ hash: `browser-unpinned-${sha256Hex(origin)}`,
97
+ scopes: requestedScopeStrings(params),
98
+ optionalScopes: [],
99
+ };
100
+ }
101
+ async function handleBrowserSdkRequest(host, deps, event) {
102
+ const respond = (payload) => deliverFrame(host, event.pageId, { ...payload, type: SDK_RESPONSE_TYPE });
103
+ const parsed = parseBindingPayload(event.payload);
104
+ if (!parsed.ok) {
105
+ if (parsed.requestId === '') {
106
+ console.warn(`[SdkBrowserTransport] dropped an uncorrelatable request from ${event.origin}: ${parsed.error.message}`);
107
+ return;
108
+ }
109
+ await respond({ requestId: parsed.requestId, ok: false, error: parsed.error });
110
+ return;
111
+ }
112
+ const { frame } = parsed;
113
+ let url;
114
+ try {
115
+ url = new URL(new URL(event.origin).origin);
116
+ if (url.origin === 'null')
117
+ throw new Error('opaque origin');
118
+ }
119
+ catch {
120
+ await respond({
121
+ requestId: frame.requestId,
122
+ ok: false,
123
+ error: { code: 'BAD_REQUEST', message: `this page's origin ('${event.origin}') cannot use the Minionry SDK` },
124
+ });
125
+ return;
126
+ }
127
+ const origin = url.origin;
128
+ const workingDir = deps.getWorkingDir();
129
+ if (!workingDir) {
130
+ await respond({
131
+ requestId: frame.requestId,
132
+ ok: false,
133
+ error: { code: 'INTERNAL', message: 'no Space is attached to this browser yet — open the Space in Minionry first' },
134
+ });
135
+ return;
136
+ }
137
+ if (frame.method === 'auth.getToken') {
138
+ await respond({
139
+ requestId: frame.requestId,
140
+ ok: false,
141
+ error: {
142
+ code: 'SPACE_DISCONNECTED',
143
+ message: 'auth.getToken is unavailable on the Minionry Browser transport (v1) — tokens are minted by an ' +
144
+ 'attached authenticated web host session; open the app inside the Minionry web shell instead',
145
+ },
146
+ });
147
+ return;
148
+ }
149
+ const { appId, binding } = await resolveCallerIdentity(url);
150
+ const wireType = SDK_METHOD_REGISTRY[frame.method]?.type ?? 'sdkRequest';
151
+ const response = await runSdkPipeline({
152
+ wireType,
153
+ appId,
154
+ origin,
155
+ requestId: frame.requestId,
156
+ method: frame.method,
157
+ params: frame.params,
158
+ role: BROWSER_TRANSPORT_ROLE,
159
+ viewerId: BROWSER_TRANSPORT_VIEWER_ID,
160
+ tabId: event.tabId,
161
+ workingDir,
162
+ ...(frame.method === 'connect'
163
+ ? { manifest: connectManifestEnvelope(origin, binding, frame.params) }
164
+ : {}),
165
+ consentRouting: { mode: 'owner-sessions', listSessions: deps.consent.listOwnerSessions },
166
+ ...(binding ? { verifiedLocalBinding: true } : {}),
167
+ emit: (evt, payload, seq) => {
168
+ void deliverFrame(host, event.pageId, {
169
+ type: SDK_EVENT_TYPE,
170
+ requestId: frame.requestId,
171
+ event: evt,
172
+ ...(payload !== undefined ? { payload } : {}),
173
+ seq,
174
+ });
175
+ },
176
+ notify: (sessionFrame) => {
177
+ if (sessionFrame.broadcast) {
178
+ deps.consent.broadcast({ type: sessionFrame.type, data: sessionFrame.data });
179
+ return;
180
+ }
181
+ const target = sessionFrame.targetViewerId;
182
+ if (target !== undefined && target !== BROWSER_TRANSPORT_VIEWER_ID) {
183
+ deps.consent.deliverToSession(target, { type: sessionFrame.type, data: sessionFrame.data });
184
+ }
185
+ },
186
+ });
187
+ await respond(response);
188
+ }