@geminixiang/mikan 1.0.0-beta.2 → 1.0.0-beta.20

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 (412) hide show
  1. package/CHANGELOG.md +354 -0
  2. package/README.md +42 -16
  3. package/dist/adapter.d.ts +1 -1
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js.map +1 -1
  6. package/dist/adapters/discord/bot.d.ts +1 -0
  7. package/dist/adapters/discord/bot.d.ts.map +1 -1
  8. package/dist/adapters/discord/bot.js +36 -67
  9. package/dist/adapters/discord/bot.js.map +1 -1
  10. package/dist/adapters/discord/context.d.ts.map +1 -1
  11. package/dist/adapters/discord/context.js +17 -42
  12. package/dist/adapters/discord/context.js.map +1 -1
  13. package/dist/adapters/github/bot.d.ts +148 -0
  14. package/dist/adapters/github/bot.d.ts.map +1 -0
  15. package/dist/adapters/github/bot.js +1031 -0
  16. package/dist/adapters/github/bot.js.map +1 -0
  17. package/dist/adapters/github/client.d.ts +118 -0
  18. package/dist/adapters/github/client.d.ts.map +1 -0
  19. package/dist/adapters/github/client.js +309 -0
  20. package/dist/adapters/github/client.js.map +1 -0
  21. package/dist/adapters/github/cloudbuild.d.ts +24 -0
  22. package/dist/adapters/github/cloudbuild.d.ts.map +1 -0
  23. package/dist/adapters/github/cloudbuild.js +71 -0
  24. package/dist/adapters/github/cloudbuild.js.map +1 -0
  25. package/dist/adapters/github/context.d.ts +9 -0
  26. package/dist/adapters/github/context.d.ts.map +1 -0
  27. package/dist/adapters/github/context.js +175 -0
  28. package/dist/adapters/github/context.js.map +1 -0
  29. package/dist/adapters/github/gcp-auth.d.ts +31 -0
  30. package/dist/adapters/github/gcp-auth.d.ts.map +1 -0
  31. package/dist/adapters/github/gcp-auth.js +196 -0
  32. package/dist/adapters/github/gcp-auth.js.map +1 -0
  33. package/dist/adapters/github/ids.d.ts +34 -0
  34. package/dist/adapters/github/ids.d.ts.map +1 -0
  35. package/dist/adapters/github/ids.js +53 -0
  36. package/dist/adapters/github/ids.js.map +1 -0
  37. package/dist/adapters/github/repo.d.ts +30 -0
  38. package/dist/adapters/github/repo.d.ts.map +1 -0
  39. package/dist/adapters/github/repo.js +136 -0
  40. package/dist/adapters/github/repo.js.map +1 -0
  41. package/dist/adapters/github/tool-pack.d.ts +14 -0
  42. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  43. package/dist/adapters/github/tool-pack.js +56 -0
  44. package/dist/adapters/github/tool-pack.js.map +1 -0
  45. package/dist/adapters/github/tools/checks.d.ts +24 -0
  46. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  47. package/dist/adapters/github/tools/checks.js +116 -0
  48. package/dist/adapters/github/tools/checks.js.map +1 -0
  49. package/dist/adapters/github/tools/issue.d.ts +22 -0
  50. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  51. package/dist/adapters/github/tools/issue.js +59 -0
  52. package/dist/adapters/github/tools/issue.js.map +1 -0
  53. package/dist/adapters/github/tools/pr.d.ts +22 -0
  54. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  55. package/dist/adapters/github/tools/pr.js +59 -0
  56. package/dist/adapters/github/tools/pr.js.map +1 -0
  57. package/dist/adapters/github/tools/read.d.ts +22 -0
  58. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  59. package/dist/adapters/github/tools/read.js +152 -0
  60. package/dist/adapters/github/tools/read.js.map +1 -0
  61. package/dist/adapters/github/tools/review-reply.d.ts +19 -0
  62. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  63. package/dist/adapters/github/tools/review-reply.js +49 -0
  64. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  65. package/dist/adapters/github/tools/sync.d.ts +17 -0
  66. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  67. package/dist/adapters/github/tools/sync.js +45 -0
  68. package/dist/adapters/github/tools/sync.js.map +1 -0
  69. package/dist/adapters/github/types.d.ts +350 -0
  70. package/dist/adapters/github/types.d.ts.map +1 -0
  71. package/dist/adapters/github/types.js +2 -0
  72. package/dist/adapters/github/types.js.map +1 -0
  73. package/dist/adapters/intake.d.ts +16 -5
  74. package/dist/adapters/intake.d.ts.map +1 -1
  75. package/dist/adapters/intake.js +79 -22
  76. package/dist/adapters/intake.js.map +1 -1
  77. package/dist/adapters/slack/bot.d.ts +8 -6
  78. package/dist/adapters/slack/bot.d.ts.map +1 -1
  79. package/dist/adapters/slack/bot.js +81 -133
  80. package/dist/adapters/slack/bot.js.map +1 -1
  81. package/dist/adapters/slack/context.d.ts.map +1 -1
  82. package/dist/adapters/slack/context.js +3 -14
  83. package/dist/adapters/slack/context.js.map +1 -1
  84. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  85. package/dist/adapters/slack/response-lifecycle.js +14 -17
  86. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  87. package/dist/adapters/slack/session.d.ts.map +1 -1
  88. package/dist/adapters/slack/session.js +5 -8
  89. package/dist/adapters/slack/session.js.map +1 -1
  90. package/dist/adapters/streaming.d.ts +4 -0
  91. package/dist/adapters/streaming.d.ts.map +1 -1
  92. package/dist/adapters/streaming.js +11 -0
  93. package/dist/adapters/streaming.js.map +1 -1
  94. package/dist/adapters/telegram/bot.d.ts +1 -2
  95. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  96. package/dist/adapters/telegram/bot.js +27 -62
  97. package/dist/adapters/telegram/bot.js.map +1 -1
  98. package/dist/adapters/telegram/context.d.ts.map +1 -1
  99. package/dist/adapters/telegram/context.js +8 -27
  100. package/dist/adapters/telegram/context.js.map +1 -1
  101. package/dist/adapters/types.d.ts +28 -2
  102. package/dist/adapters/types.d.ts.map +1 -1
  103. package/dist/adapters/types.js.map +1 -1
  104. package/dist/agent.d.ts +38 -14
  105. package/dist/agent.d.ts.map +1 -1
  106. package/dist/agent.js +358 -224
  107. package/dist/agent.js.map +1 -1
  108. package/dist/cli/download.d.ts.map +1 -0
  109. package/dist/cli/download.js.map +1 -0
  110. package/dist/cli/ext-git.d.ts +22 -0
  111. package/dist/cli/ext-git.d.ts.map +1 -0
  112. package/dist/cli/ext-git.js +76 -0
  113. package/dist/cli/ext-git.js.map +1 -0
  114. package/dist/cli/ext.d.ts +2 -0
  115. package/dist/cli/ext.d.ts.map +1 -0
  116. package/dist/cli/ext.js +217 -0
  117. package/dist/cli/ext.js.map +1 -0
  118. package/dist/commands/admin.d.ts.map +1 -1
  119. package/dist/commands/admin.js +2 -1
  120. package/dist/commands/admin.js.map +1 -1
  121. package/dist/commands/auto-reply.d.ts.map +1 -1
  122. package/dist/commands/auto-reply.js +2 -6
  123. package/dist/commands/auto-reply.js.map +1 -1
  124. package/dist/commands/extensions.d.ts.map +1 -1
  125. package/dist/commands/extensions.js +16 -6
  126. package/dist/commands/extensions.js.map +1 -1
  127. package/dist/commands/login.d.ts +2 -1
  128. package/dist/commands/login.d.ts.map +1 -1
  129. package/dist/commands/login.js +30 -1
  130. package/dist/commands/login.js.map +1 -1
  131. package/dist/commands/manifest.d.ts +72 -0
  132. package/dist/commands/manifest.d.ts.map +1 -0
  133. package/dist/commands/manifest.js +121 -0
  134. package/dist/commands/manifest.js.map +1 -0
  135. package/dist/commands/model.d.ts.map +1 -1
  136. package/dist/commands/model.js +3 -1
  137. package/dist/commands/model.js.map +1 -1
  138. package/dist/commands/new.d.ts.map +1 -1
  139. package/dist/commands/new.js +2 -1
  140. package/dist/commands/new.js.map +1 -1
  141. package/dist/commands/sandbox.d.ts.map +1 -1
  142. package/dist/commands/sandbox.js +16 -12
  143. package/dist/commands/sandbox.js.map +1 -1
  144. package/dist/commands/text.d.ts +2 -0
  145. package/dist/commands/text.d.ts.map +1 -0
  146. package/dist/commands/text.js +16 -0
  147. package/dist/commands/text.js.map +1 -0
  148. package/dist/commands/types.d.ts +14 -1
  149. package/dist/commands/types.d.ts.map +1 -1
  150. package/dist/commands/types.js.map +1 -1
  151. package/dist/config.d.ts +1 -1
  152. package/dist/config.d.ts.map +1 -1
  153. package/dist/config.js +90 -54
  154. package/dist/config.js.map +1 -1
  155. package/dist/events.d.ts +10 -0
  156. package/dist/events.d.ts.map +1 -1
  157. package/dist/events.js +14 -5
  158. package/dist/events.js.map +1 -1
  159. package/dist/execution-resolver.d.ts +3 -2
  160. package/dist/execution-resolver.d.ts.map +1 -1
  161. package/dist/execution-resolver.js +28 -12
  162. package/dist/execution-resolver.js.map +1 -1
  163. package/dist/harness/extensions/loader.d.ts +39 -9
  164. package/dist/harness/extensions/loader.d.ts.map +1 -1
  165. package/dist/harness/extensions/loader.js +258 -54
  166. package/dist/harness/extensions/loader.js.map +1 -1
  167. package/dist/harness/extensions/registry.d.ts +48 -1
  168. package/dist/harness/extensions/registry.d.ts.map +1 -1
  169. package/dist/harness/extensions/registry.js +146 -0
  170. package/dist/harness/extensions/registry.js.map +1 -1
  171. package/dist/harness/extensions/types.d.ts +161 -14
  172. package/dist/harness/extensions/types.d.ts.map +1 -1
  173. package/dist/harness/extensions/types.js.map +1 -1
  174. package/dist/harness/index.d.ts +5 -5
  175. package/dist/harness/index.d.ts.map +1 -1
  176. package/dist/harness/index.js +2 -2
  177. package/dist/harness/index.js.map +1 -1
  178. package/dist/harness/models.d.ts +5 -0
  179. package/dist/harness/models.d.ts.map +1 -1
  180. package/dist/harness/models.js +10 -0
  181. package/dist/harness/models.js.map +1 -1
  182. package/dist/harness/runner.d.ts +21 -2
  183. package/dist/harness/runner.d.ts.map +1 -1
  184. package/dist/harness/runner.js +80 -22
  185. package/dist/harness/runner.js.map +1 -1
  186. package/dist/harness/session-store.d.ts +4 -1
  187. package/dist/harness/session-store.d.ts.map +1 -1
  188. package/dist/harness/session-store.js +11 -2
  189. package/dist/harness/session-store.js.map +1 -1
  190. package/dist/harness/subagent-runner.d.ts +17 -0
  191. package/dist/harness/subagent-runner.d.ts.map +1 -0
  192. package/dist/harness/subagent-runner.js +307 -0
  193. package/dist/harness/subagent-runner.js.map +1 -0
  194. package/dist/harness/types.d.ts +53 -0
  195. package/dist/harness/types.d.ts.map +1 -1
  196. package/dist/harness/types.js.map +1 -1
  197. package/dist/index.d.ts +1 -1
  198. package/dist/index.d.ts.map +1 -1
  199. package/dist/index.js.map +1 -1
  200. package/dist/main.js +232 -29
  201. package/dist/main.js.map +1 -1
  202. package/dist/provisioner.d.ts.map +1 -1
  203. package/dist/provisioner.js +2 -5
  204. package/dist/provisioner.js.map +1 -1
  205. package/dist/runtime/conversation-runtime.d.ts +1 -1
  206. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  207. package/dist/runtime/conversation-runtime.js +264 -41
  208. package/dist/runtime/conversation-runtime.js.map +1 -1
  209. package/dist/runtime/types.d.ts +32 -5
  210. package/dist/runtime/types.d.ts.map +1 -1
  211. package/dist/runtime/types.js.map +1 -1
  212. package/dist/sandbox/cloudflare.d.ts +2 -0
  213. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  214. package/dist/sandbox/cloudflare.js +7 -0
  215. package/dist/sandbox/cloudflare.js.map +1 -1
  216. package/dist/sandbox/container.d.ts +3 -0
  217. package/dist/sandbox/container.d.ts.map +1 -1
  218. package/dist/sandbox/container.js +8 -2
  219. package/dist/sandbox/container.js.map +1 -1
  220. package/dist/sandbox/firecracker.d.ts +2 -0
  221. package/dist/sandbox/firecracker.d.ts.map +1 -1
  222. package/dist/sandbox/firecracker.js +7 -1
  223. package/dist/sandbox/firecracker.js.map +1 -1
  224. package/dist/sandbox/gondolin-fleet.d.ts +104 -0
  225. package/dist/sandbox/gondolin-fleet.d.ts.map +1 -0
  226. package/dist/sandbox/gondolin-fleet.js +330 -0
  227. package/dist/sandbox/gondolin-fleet.js.map +1 -0
  228. package/dist/sandbox/gondolin-gateway.d.ts +85 -0
  229. package/dist/sandbox/gondolin-gateway.d.ts.map +1 -0
  230. package/dist/sandbox/gondolin-gateway.js +400 -0
  231. package/dist/sandbox/gondolin-gateway.js.map +1 -0
  232. package/dist/sandbox/gondolin-inventory.d.ts +89 -0
  233. package/dist/sandbox/gondolin-inventory.d.ts.map +1 -0
  234. package/dist/sandbox/gondolin-inventory.js +267 -0
  235. package/dist/sandbox/gondolin-inventory.js.map +1 -0
  236. package/dist/sandbox/gondolin-join.d.ts +62 -0
  237. package/dist/sandbox/gondolin-join.d.ts.map +1 -0
  238. package/dist/sandbox/gondolin-join.js +261 -0
  239. package/dist/sandbox/gondolin-join.js.map +1 -0
  240. package/dist/sandbox/gondolin-nfs-advisory.d.ts +15 -0
  241. package/dist/sandbox/gondolin-nfs-advisory.d.ts.map +1 -0
  242. package/dist/sandbox/gondolin-nfs-advisory.js +60 -0
  243. package/dist/sandbox/gondolin-nfs-advisory.js.map +1 -0
  244. package/dist/sandbox/gondolin-placement.d.ts +32 -0
  245. package/dist/sandbox/gondolin-placement.d.ts.map +1 -0
  246. package/dist/sandbox/gondolin-placement.js +83 -0
  247. package/dist/sandbox/gondolin-placement.js.map +1 -0
  248. package/dist/sandbox/gondolin-remote.d.ts +73 -0
  249. package/dist/sandbox/gondolin-remote.d.ts.map +1 -0
  250. package/dist/sandbox/gondolin-remote.js +352 -0
  251. package/dist/sandbox/gondolin-remote.js.map +1 -0
  252. package/dist/sandbox/gondolin-worker-client.d.ts +139 -0
  253. package/dist/sandbox/gondolin-worker-client.d.ts.map +1 -0
  254. package/dist/sandbox/gondolin-worker-client.js +325 -0
  255. package/dist/sandbox/gondolin-worker-client.js.map +1 -0
  256. package/dist/sandbox/gondolin-worker-main.d.ts +2 -0
  257. package/dist/sandbox/gondolin-worker-main.d.ts.map +1 -0
  258. package/dist/sandbox/gondolin-worker-main.js +22 -0
  259. package/dist/sandbox/gondolin-worker-main.js.map +1 -0
  260. package/dist/sandbox/gondolin-worker.d.ts +55 -0
  261. package/dist/sandbox/gondolin-worker.d.ts.map +1 -0
  262. package/dist/sandbox/gondolin-worker.js +201 -0
  263. package/dist/sandbox/gondolin-worker.js.map +1 -0
  264. package/dist/sandbox/gondolin.d.ts +52 -0
  265. package/dist/sandbox/gondolin.d.ts.map +1 -0
  266. package/dist/sandbox/gondolin.js +425 -0
  267. package/dist/sandbox/gondolin.js.map +1 -0
  268. package/dist/sandbox/host.d.ts +2 -0
  269. package/dist/sandbox/host.d.ts.map +1 -1
  270. package/dist/sandbox/host.js +11 -0
  271. package/dist/sandbox/host.js.map +1 -1
  272. package/dist/sandbox/identity.d.ts +21 -0
  273. package/dist/sandbox/identity.d.ts.map +1 -0
  274. package/dist/sandbox/identity.js +36 -0
  275. package/dist/sandbox/identity.js.map +1 -0
  276. package/dist/sandbox/index.d.ts +4 -3
  277. package/dist/sandbox/index.d.ts.map +1 -1
  278. package/dist/sandbox/index.js +5 -3
  279. package/dist/sandbox/index.js.map +1 -1
  280. package/dist/sandbox/types.d.ts +26 -1
  281. package/dist/sandbox/types.d.ts.map +1 -1
  282. package/dist/sandbox/types.js.map +1 -1
  283. package/dist/sandbox/utils.d.ts +11 -0
  284. package/dist/sandbox/utils.d.ts.map +1 -1
  285. package/dist/sandbox/utils.js +35 -0
  286. package/dist/sandbox/utils.js.map +1 -1
  287. package/dist/sessions/agent-memory-file-manager.d.ts.map +1 -1
  288. package/dist/sessions/agent-memory-file-manager.js +16 -30
  289. package/dist/sessions/agent-memory-file-manager.js.map +1 -1
  290. package/dist/sessions/history-line.d.ts +20 -0
  291. package/dist/sessions/history-line.d.ts.map +1 -0
  292. package/dist/sessions/history-line.js +24 -0
  293. package/dist/sessions/history-line.js.map +1 -0
  294. package/dist/sessions/policy.d.ts.map +1 -1
  295. package/dist/sessions/policy.js +5 -3
  296. package/dist/sessions/policy.js.map +1 -1
  297. package/dist/sessions/session-key.d.ts +31 -0
  298. package/dist/sessions/session-key.d.ts.map +1 -0
  299. package/dist/sessions/session-key.js +44 -0
  300. package/dist/sessions/session-key.js.map +1 -0
  301. package/dist/sessions/store.d.ts.map +1 -1
  302. package/dist/sessions/store.js +2 -2
  303. package/dist/sessions/store.js.map +1 -1
  304. package/dist/tools/bash.d.ts +3 -1
  305. package/dist/tools/bash.d.ts.map +1 -1
  306. package/dist/tools/bash.js +24 -17
  307. package/dist/tools/bash.js.map +1 -1
  308. package/dist/tools/edit.d.ts.map +1 -1
  309. package/dist/tools/edit.js +9 -12
  310. package/dist/tools/edit.js.map +1 -1
  311. package/dist/tools/event.d.ts +1 -1
  312. package/dist/tools/event.d.ts.map +1 -1
  313. package/dist/tools/event.js +33 -4
  314. package/dist/tools/event.js.map +1 -1
  315. package/dist/tools/generate-image.d.ts +17 -0
  316. package/dist/tools/generate-image.d.ts.map +1 -0
  317. package/dist/tools/generate-image.js +63 -0
  318. package/dist/tools/generate-image.js.map +1 -0
  319. package/dist/tools/index.d.ts +16 -2
  320. package/dist/tools/index.d.ts.map +1 -1
  321. package/dist/tools/index.js +27 -3
  322. package/dist/tools/index.js.map +1 -1
  323. package/dist/tools/react.d.ts +15 -0
  324. package/dist/tools/react.d.ts.map +1 -0
  325. package/dist/tools/react.js +40 -0
  326. package/dist/tools/react.js.map +1 -0
  327. package/dist/tools/sandbox.d.ts +2 -2
  328. package/dist/tools/sandbox.d.ts.map +1 -1
  329. package/dist/tools/sandbox.js +8 -7
  330. package/dist/tools/sandbox.js.map +1 -1
  331. package/dist/tools/subagent.d.ts +69 -0
  332. package/dist/tools/subagent.d.ts.map +1 -0
  333. package/dist/tools/subagent.js +286 -0
  334. package/dist/tools/subagent.js.map +1 -0
  335. package/dist/tools/types.d.ts +34 -1
  336. package/dist/tools/types.d.ts.map +1 -1
  337. package/dist/tools/types.js.map +1 -1
  338. package/dist/tools/write.d.ts.map +1 -1
  339. package/dist/tools/write.js +1 -8
  340. package/dist/tools/write.js.map +1 -1
  341. package/dist/trigger.d.ts.map +1 -1
  342. package/dist/trigger.js +1 -2
  343. package/dist/trigger.js.map +1 -1
  344. package/dist/types.d.ts +139 -7
  345. package/dist/types.d.ts.map +1 -1
  346. package/dist/types.js.map +1 -1
  347. package/dist/vault/disabled.d.ts +9 -0
  348. package/dist/vault/disabled.d.ts.map +1 -0
  349. package/dist/vault/disabled.js +23 -0
  350. package/dist/vault/disabled.js.map +1 -0
  351. package/dist/vault/index.d.ts.map +1 -1
  352. package/dist/vault/index.js +3 -24
  353. package/dist/vault/index.js.map +1 -1
  354. package/dist/vault/policy.d.ts +20 -0
  355. package/dist/vault/policy.d.ts.map +1 -0
  356. package/dist/vault/policy.js +20 -0
  357. package/dist/vault/policy.js.map +1 -0
  358. package/dist/vault/routing.d.ts +1 -0
  359. package/dist/vault/routing.d.ts.map +1 -1
  360. package/dist/vault/routing.js +3 -10
  361. package/dist/vault/routing.js.map +1 -1
  362. package/dist/web/admin/portal.d.ts +27 -0
  363. package/dist/web/admin/portal.d.ts.map +1 -1
  364. package/dist/web/admin/portal.js +91 -130
  365. package/dist/web/admin/portal.js.map +1 -1
  366. package/dist/web/admin/types.d.ts +3 -0
  367. package/dist/web/admin/types.d.ts.map +1 -1
  368. package/dist/web/admin/types.js.map +1 -1
  369. package/dist/web/login/oauth.d.ts +2 -3
  370. package/dist/web/login/oauth.d.ts.map +1 -1
  371. package/dist/web/login/oauth.js +0 -31
  372. package/dist/web/login/oauth.js.map +1 -1
  373. package/dist/web/login/portal.js +1 -1
  374. package/dist/web/login/portal.js.map +1 -1
  375. package/dist/web/login/types.d.ts +0 -11
  376. package/dist/web/login/types.d.ts.map +1 -1
  377. package/dist/web/login/types.js.map +1 -1
  378. package/dist/web/portal-shell.d.ts +4 -0
  379. package/dist/web/portal-shell.d.ts.map +1 -0
  380. package/dist/{portal-shell.js → web/portal-shell.js} +2 -2
  381. package/dist/web/portal-shell.js.map +1 -0
  382. package/dist/web/server.d.ts.map +1 -1
  383. package/dist/web/server.js +7 -0
  384. package/dist/web/server.js.map +1 -1
  385. package/dist/web/session-view/command.d.ts.map +1 -1
  386. package/dist/web/session-view/command.js +4 -1
  387. package/dist/web/session-view/command.js.map +1 -1
  388. package/dist/web/session-view/portal.d.ts.map +1 -1
  389. package/dist/web/session-view/portal.js +4 -3
  390. package/dist/web/session-view/portal.js.map +1 -1
  391. package/dist/web/session-view/service.d.ts.map +1 -1
  392. package/dist/web/session-view/service.js +2 -1
  393. package/dist/web/session-view/service.js.map +1 -1
  394. package/dist/web/session-view/types.d.ts +2 -1
  395. package/dist/web/session-view/types.d.ts.map +1 -1
  396. package/dist/web/session-view/types.js.map +1 -1
  397. package/package.json +7 -4
  398. package/dist/download.d.ts.map +0 -1
  399. package/dist/download.js.map +0 -1
  400. package/dist/model-registry.d.ts +0 -4
  401. package/dist/model-registry.d.ts.map +0 -1
  402. package/dist/model-registry.js +0 -7
  403. package/dist/model-registry.js.map +0 -1
  404. package/dist/portal-shell.d.ts +0 -4
  405. package/dist/portal-shell.d.ts.map +0 -1
  406. package/dist/portal-shell.js.map +0 -1
  407. package/dist/runtime/agent-run-controller.d.ts +0 -31
  408. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  409. package/dist/runtime/agent-run-controller.js +0 -195
  410. package/dist/runtime/agent-run-controller.js.map +0 -1
  411. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
  412. /package/dist/{download.js → cli/download.js} +0 -0
@@ -0,0 +1,400 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import { hostname } from "node:os";
4
+ import { TLSSocket, createServer as createTlsServer } from "node:tls";
5
+ import * as log from "../log.js";
6
+ import { gondolinFleet } from "./gondolin-fleet.js";
7
+ import { gondolinJoin } from "./gondolin-join.js";
8
+ import { GondolinRemoteConnection, GondolinWorkerUnreachableError, createSessionFrameParser, encodeSessionMessage, } from "./gondolin-remote.js";
9
+ const RPC_TIMEOUT_MS = 150_000;
10
+ const TUNNEL_TIMEOUT_MS = 15_000;
11
+ /**
12
+ * Splits a byte stream into u32be-length-prefixed JSON frames, preserving any
13
+ * bytes after the point where the consumer stops parsing (a tunnel connection
14
+ * switches protocols after its preamble frame).
15
+ */
16
+ function createControlFrameReader(onFrame) {
17
+ let buffer = Buffer.alloc(0);
18
+ let stopped = false;
19
+ return {
20
+ push(chunk) {
21
+ if (stopped)
22
+ return;
23
+ buffer = Buffer.concat([buffer, chunk]);
24
+ for (;;) {
25
+ // onFrame may call stop() synchronously (a tunnel switching protocols)
26
+ if (stopped || buffer.length < 4)
27
+ return;
28
+ const length = buffer.readUInt32BE(0);
29
+ if (buffer.length < 4 + length)
30
+ return;
31
+ const payload = buffer.subarray(4, 4 + length);
32
+ buffer = buffer.subarray(4 + length);
33
+ let frame;
34
+ try {
35
+ frame = JSON.parse(payload.toString("utf8"));
36
+ }
37
+ catch {
38
+ continue; // skip malformed frames
39
+ }
40
+ onFrame(frame, buffer);
41
+ }
42
+ },
43
+ stop() {
44
+ stopped = true;
45
+ },
46
+ };
47
+ }
48
+ function encodeControlFrame(frame) {
49
+ return encodeSessionMessage(frame);
50
+ }
51
+ function defaultIsAuthorized(socket) {
52
+ return socket instanceof TLSSocket && socket.authorized;
53
+ }
54
+ /**
55
+ * The host side of dial-home workers: one mTLS listener that accepts worker
56
+ * control channels (register/ping/RPC responses) and per-command dial-back
57
+ * tunnels, keeps the registry of connected workers, and attaches each one to
58
+ * the fleet as a regular worker connection. Placement, leases, fencing, and
59
+ * failover are unchanged — this only reverses who dials whom.
60
+ */
61
+ class GondolinWorkerGateway {
62
+ constructor() {
63
+ this.overrides = {};
64
+ this.workers = new Map();
65
+ this.pendingTunnels = new Map();
66
+ }
67
+ configure(settings, overrides) {
68
+ this.stop();
69
+ this.settings = settings;
70
+ this.overrides = overrides ?? {};
71
+ }
72
+ isConfigured() {
73
+ return this.settings !== undefined;
74
+ }
75
+ /** Registered workers and their liveness (admin/observability surface). */
76
+ list() {
77
+ return Array.from(this.workers.values()).map((worker) => ({
78
+ name: worker.info.name,
79
+ connected: !worker.socket.destroyed,
80
+ activeRuntimes: worker.activeRuntimes,
81
+ workspaceError: worker.workspaceError,
82
+ info: worker.info,
83
+ }));
84
+ }
85
+ /**
86
+ * Start the listener. Without explicit certificate settings the gateway
87
+ * provisions its own: a private worker CA plus a server certificate signed
88
+ * by it (required for join's CA pinning to also authenticate the host).
89
+ */
90
+ async start() {
91
+ if (!this.settings || this.server)
92
+ return;
93
+ const settings = this.settings;
94
+ if (!settings.workspaceRoot) {
95
+ // dial-home workers inherit workspaceRoot from here; without it every
96
+ // runtime is rejected with "escapes the workspace root"
97
+ throw new Error("gondolin gateway requires workspaceRoot (the worker-side shared workspace path); " +
98
+ "set sandbox.gondolin.remote.gateway.workspaceRoot");
99
+ }
100
+ let material;
101
+ if (settings.certFile && settings.keyFile && settings.clientCaFile) {
102
+ material = {
103
+ certFile: settings.certFile,
104
+ keyFile: settings.keyFile,
105
+ clientCaFile: settings.clientCaFile,
106
+ };
107
+ }
108
+ else {
109
+ if (!gondolinJoin.isConfigured()) {
110
+ throw new Error("gondolin gateway auto-init requires the join service to be configured");
111
+ }
112
+ const issued = await gondolinJoin.ensureServerCert(settings.hostnames ?? [hostname()]);
113
+ material = { ...issued, clientCaFile: gondolinJoin.paths().caFile };
114
+ }
115
+ const factory = this.overrides.createServer ??
116
+ ((onConnection) => createTlsServer({
117
+ cert: readFileSync(material.certFile),
118
+ key: readFileSync(material.keyFile),
119
+ ca: readFileSync(material.clientCaFile),
120
+ requestCert: true,
121
+ // unauthenticated connections may only send a join frame; the
122
+ // per-frame authorization gate enforces that below
123
+ rejectUnauthorized: false,
124
+ minVersion: "TLSv1.3",
125
+ }, onConnection));
126
+ this.server = factory((socket) => this.handleConnection(socket));
127
+ this.server.listen(this.settings.port, () => {
128
+ log.logInfo(`Gondolin worker gateway listening on :${this.settings?.port}`);
129
+ });
130
+ }
131
+ stop() {
132
+ for (const worker of this.workers.values()) {
133
+ worker.socket.destroy();
134
+ for (const pending of worker.pendingRpc.values())
135
+ clearTimeout(pending.timer);
136
+ }
137
+ this.workers.clear();
138
+ for (const pending of this.pendingTunnels.values())
139
+ clearTimeout(pending.timer);
140
+ this.pendingTunnels.clear();
141
+ this.server?.close();
142
+ this.server = undefined;
143
+ }
144
+ /** Routes one inbound connection by its first frame: control or tunnel. */
145
+ handleConnection(socket) {
146
+ socket.setNoDelay(true);
147
+ let routed = false;
148
+ const authorized = (this.overrides.isAuthorized ?? defaultIsAuthorized)(socket);
149
+ const reader = createControlFrameReader((frame, leftover) => {
150
+ if (!routed) {
151
+ routed = true;
152
+ if (frame.type === "join") {
153
+ void this.handleJoin(socket, frame);
154
+ }
155
+ else if (!authorized) {
156
+ // everything except join requires a CA-signed client certificate
157
+ socket.destroy();
158
+ }
159
+ else if (frame.type === "register" && frame.name) {
160
+ this.acceptControlChannel(socket, frame, reader);
161
+ }
162
+ else if (frame.type === "tunnel" && frame.nonce) {
163
+ reader.stop();
164
+ socket.removeAllListeners("data");
165
+ this.acceptTunnel(socket, frame.nonce, leftover);
166
+ }
167
+ else {
168
+ socket.destroy();
169
+ }
170
+ return;
171
+ }
172
+ this.handleControlFrame(socket, frame);
173
+ });
174
+ socket.on("data", (chunk) => reader.push(chunk));
175
+ socket.on("error", () => socket.destroy());
176
+ }
177
+ acceptControlChannel(socket, registration, _reader) {
178
+ const name = registration.name;
179
+ const previous = this.workers.get(name);
180
+ if (previous && !previous.socket.destroyed) {
181
+ log.logInfo(`Gondolin worker '${name}' re-registered; superseding previous connection`);
182
+ previous.socket.destroy();
183
+ }
184
+ const worker = {
185
+ info: registration,
186
+ socket,
187
+ connectedAt: Date.now(),
188
+ lastSeen: Date.now(),
189
+ activeRuntimes: registration.runtimes?.length ?? 0,
190
+ pendingRpc: new Map(),
191
+ nextRpcId: 1,
192
+ };
193
+ this.workers.set(name, worker);
194
+ const surviving = registration.runtimes?.length ?? 0;
195
+ log.logInfo(`Gondolin worker joined: ${name} (${registration.os}/${registration.arch}, ` +
196
+ `${registration.accelerator}, ${registration.cpus} cpus, ` +
197
+ `cap ${registration.maxRuntimes ?? "∞"}, ${surviving} runtimes surviving)`);
198
+ const overrides = this.settings?.workers?.[name];
199
+ gondolinFleet.attachWorker({
200
+ name,
201
+ url: `dialhome://${name}`,
202
+ workspaceRoot: this.settings?.workspaceRoot,
203
+ maxRuntimes: overrides?.maxRuntimes ?? registration.maxRuntimes,
204
+ draining: overrides?.draining,
205
+ }, (connectionOverrides) => new GondolinRemoteConnection({ name, url: `dialhome://${name}`, workspaceRoot: this.settings?.workspaceRoot }, {
206
+ ...connectionOverrides,
207
+ ...(this.overrides.leaseTtlSeconds !== undefined
208
+ ? { leaseTtlSeconds: this.overrides.leaseTtlSeconds }
209
+ : {}),
210
+ request: (method, path, body, headers) => this.rpc(name, method, path, body, headers),
211
+ tunnel: (path, headers, callbacks) => this.openTunnel(name, path, headers, callbacks),
212
+ }));
213
+ this.applyWorkspaceHealth(worker, registration.workspaceError);
214
+ // a worker that reconnected may carry runtimes whose placements moved
215
+ void gondolinFleet.reconcile();
216
+ socket.on("close", () => {
217
+ const current = this.workers.get(name);
218
+ if (current !== worker)
219
+ return; // superseded
220
+ for (const pending of worker.pendingRpc.values())
221
+ clearTimeout(pending.timer);
222
+ worker.pendingRpc.clear();
223
+ log.logWarning(`Gondolin worker disconnected: ${name} (placements fence until lease expiry)`);
224
+ gondolinFleet.detachWorker(name);
225
+ this.workers.delete(name);
226
+ });
227
+ }
228
+ handleControlFrame(socket, frame) {
229
+ const worker = this.workerBySocket(socket);
230
+ if (!worker)
231
+ return;
232
+ worker.lastSeen = Date.now();
233
+ if (frame.type === "ping") {
234
+ if (typeof frame.activeRuntimes === "number") {
235
+ worker.activeRuntimes = frame.activeRuntimes;
236
+ }
237
+ // omitted on healthy pings (Go omitempty), so absence means recovered
238
+ this.applyWorkspaceHealth(worker, frame.workspaceError);
239
+ socket.write(encodeControlFrame({ type: "pong" }));
240
+ return;
241
+ }
242
+ if (frame.type === "response" && typeof frame.id === "number") {
243
+ const pending = worker.pendingRpc.get(frame.id);
244
+ if (!pending)
245
+ return;
246
+ worker.pendingRpc.delete(frame.id);
247
+ clearTimeout(pending.timer);
248
+ pending.resolve(frame);
249
+ }
250
+ }
251
+ /**
252
+ * Track shared-workspace health from register/ping frames and push it into
253
+ * the fleet, logging only the transitions. A worker whose NFS mount died
254
+ * keeps its control channel alive — this is what turns that silent state
255
+ * into refused placements and fail-fast execs.
256
+ */
257
+ applyWorkspaceHealth(worker, error) {
258
+ const next = error || undefined;
259
+ if (next === worker.workspaceError) {
260
+ gondolinFleet.setWorkspaceHealth(worker.info.name, next); // attach may have reset it
261
+ return;
262
+ }
263
+ if (next) {
264
+ log.logWarning(`Gondolin worker '${worker.info.name}' workspace is unusable: ${next} — new placements disabled until it recovers`);
265
+ }
266
+ else {
267
+ log.logInfo(`Gondolin worker '${worker.info.name}' workspace recovered`);
268
+ }
269
+ worker.workspaceError = next;
270
+ gondolinFleet.setWorkspaceHealth(worker.info.name, next);
271
+ }
272
+ /** RPC to a worker over its control channel (the reverse of HTTPS requests). */
273
+ rpc(name, method, path, body, headers) {
274
+ const worker = this.workers.get(name);
275
+ if (!worker || worker.socket.destroyed) {
276
+ return Promise.reject(new GondolinWorkerUnreachableError(`worker '${name}' is not connected`));
277
+ }
278
+ const id = worker.nextRpcId++;
279
+ return new Promise((resolve, reject) => {
280
+ const timer = setTimeout(() => {
281
+ worker.pendingRpc.delete(id);
282
+ reject(new GondolinWorkerUnreachableError(`RPC to worker '${name}' timed out (${method} ${path})`));
283
+ }, this.overrides.rpcTimeoutMs ?? RPC_TIMEOUT_MS);
284
+ timer.unref?.();
285
+ worker.pendingRpc.set(id, {
286
+ timer,
287
+ resolve: (frame) => resolve({
288
+ status: frame.status ?? 0,
289
+ json: (frame.body ?? {}),
290
+ }),
291
+ });
292
+ worker.socket.write(encodeControlFrame({ type: "request", id, method, path, body, headers }));
293
+ });
294
+ }
295
+ /** Ask the worker to dial back a data connection for one session tunnel. */
296
+ openTunnel(name, path, headers, callbacks) {
297
+ const worker = this.workers.get(name);
298
+ if (!worker || worker.socket.destroyed) {
299
+ const error = new Error(`worker '${name}' is not connected`);
300
+ error.code = "ECONNREFUSED"; // nothing executed — safe to recreate
301
+ return Promise.reject(error);
302
+ }
303
+ const sessionId = path.split("/")[3];
304
+ const nonce = randomBytes(16).toString("hex");
305
+ return new Promise((resolve, reject) => {
306
+ const timer = setTimeout(() => {
307
+ this.pendingTunnels.delete(nonce);
308
+ const error = new Error(`worker '${name}' did not dial back a tunnel`);
309
+ error.code = "ECONNREFUSED";
310
+ reject(error);
311
+ }, this.overrides.tunnelTimeoutMs ?? TUNNEL_TIMEOUT_MS);
312
+ timer.unref?.();
313
+ this.pendingTunnels.set(nonce, {
314
+ timer,
315
+ resolve: ({ socket, leftover }) => {
316
+ let closed = false;
317
+ const parse = createSessionFrameParser(callbacks);
318
+ if (leftover.length > 0)
319
+ parse(leftover);
320
+ socket.on("data", parse);
321
+ socket.on("error", (error) => {
322
+ if (closed)
323
+ return;
324
+ closed = true;
325
+ callbacks.onClose(error);
326
+ });
327
+ socket.on("close", () => {
328
+ if (closed)
329
+ return;
330
+ closed = true;
331
+ callbacks.onClose();
332
+ });
333
+ resolve({
334
+ send: (message) => {
335
+ if (!closed)
336
+ socket.write(encodeSessionMessage(message));
337
+ },
338
+ close: () => {
339
+ if (closed)
340
+ return;
341
+ closed = true;
342
+ socket.destroy();
343
+ },
344
+ });
345
+ },
346
+ });
347
+ worker.socket.write(encodeControlFrame({ type: "open-tunnel", nonce, sessionId, headers }));
348
+ });
349
+ }
350
+ /**
351
+ * One-time token → CA-signed client certificate. The only operation an
352
+ * unauthenticated connection may perform; the connection closes after the
353
+ * response either way.
354
+ */
355
+ async handleJoin(socket, frame) {
356
+ const refuse = (message) => {
357
+ log.logWarning(`Gondolin worker join refused: ${message}`);
358
+ socket.end(encodeControlFrame({ type: "join-error", message }));
359
+ };
360
+ if (!gondolinJoin.isConfigured()) {
361
+ refuse("join is not enabled on this gateway");
362
+ return;
363
+ }
364
+ if (!frame.token || !frame.csr || !frame.name) {
365
+ refuse("join requires token, csr, and name");
366
+ return;
367
+ }
368
+ if (!gondolinJoin.consumeToken(frame.token)) {
369
+ refuse(`invalid or expired join token (worker '${frame.name}')`);
370
+ return;
371
+ }
372
+ try {
373
+ const signed = await gondolinJoin.signCsr(frame.csr);
374
+ log.logInfo(`Gondolin worker '${frame.name}' joined: client certificate issued`);
375
+ socket.end(encodeControlFrame({ type: "join-ok", cert: signed.certPem, ca: signed.caPem }));
376
+ }
377
+ catch (err) {
378
+ refuse(`certificate issuance failed: ${err instanceof Error ? err.message : String(err)}`);
379
+ }
380
+ }
381
+ acceptTunnel(socket, nonce, leftover) {
382
+ const pending = this.pendingTunnels.get(nonce);
383
+ if (!pending) {
384
+ socket.destroy();
385
+ return;
386
+ }
387
+ this.pendingTunnels.delete(nonce);
388
+ clearTimeout(pending.timer);
389
+ pending.resolve({ socket, leftover: Buffer.from(leftover) });
390
+ }
391
+ workerBySocket(socket) {
392
+ for (const worker of this.workers.values()) {
393
+ if (worker.socket === socket)
394
+ return worker;
395
+ }
396
+ return undefined;
397
+ }
398
+ }
399
+ export const gondolinGateway = new GondolinWorkerGateway();
400
+ //# sourceMappingURL=gondolin-gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gondolin-gateway.js","sourceRoot":"","sources":["../../src/sandbox/gondolin-gateway.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport type { Server, Socket } from \"node:net\";\nimport { hostname } from \"node:os\";\nimport { TLSSocket, createServer as createTlsServer } from \"node:tls\";\nimport * as log from \"../log.js\";\nimport type { GondolinGatewaySettings } from \"../types.js\";\nimport { gondolinFleet } from \"./gondolin-fleet.js\";\nimport { gondolinJoin } from \"./gondolin-join.js\";\nimport {\n GondolinRemoteConnection,\n GondolinWorkerUnreachableError,\n createSessionFrameParser,\n encodeSessionMessage,\n} from \"./gondolin-remote.js\";\nimport type { SessionClient, SessionClientCallbacks } from \"./gondolin-worker-client.js\";\n\nconst RPC_TIMEOUT_MS = 150_000;\nconst TUNNEL_TIMEOUT_MS = 15_000;\n\n/** What a worker announces when it dials home (mirrors the Go register frame). */\ninterface GondolinWorkerRegistration {\n name: string;\n os?: string;\n arch?: string;\n accelerator?: string;\n cpus?: number;\n memoryBytes?: number;\n maxRuntimes?: number;\n protocolVersion?: number;\n runtimes?: Array<{ sessionId: string; instanceId: string }>;\n /** Non-empty when the worker's shared workspace failed its usability probe. */\n workspaceError?: string;\n}\n\ninterface ControlFrame extends GondolinWorkerRegistration {\n type: string;\n id?: number;\n status?: number;\n body?: unknown;\n nonce?: string;\n activeRuntimes?: number;\n /** join exchange */\n token?: string;\n csr?: string;\n}\n\ninterface RegisteredWorker {\n info: GondolinWorkerRegistration;\n socket: Socket;\n connectedAt: number;\n lastSeen: number;\n activeRuntimes: number;\n workspaceError?: string;\n pendingRpc: Map<number, { resolve: (frame: ControlFrame) => void; timer: NodeJS.Timeout }>;\n nextRpcId: number;\n}\n\n/**\n * Splits a byte stream into u32be-length-prefixed JSON frames, preserving any\n * bytes after the point where the consumer stops parsing (a tunnel connection\n * switches protocols after its preamble frame).\n */\nfunction createControlFrameReader(onFrame: (frame: ControlFrame, leftover: Buffer) => void): {\n push: (chunk: Buffer) => void;\n stop: () => void;\n} {\n let buffer = Buffer.alloc(0);\n let stopped = false;\n return {\n push(chunk: Buffer) {\n if (stopped) return;\n buffer = Buffer.concat([buffer, chunk]);\n for (;;) {\n // onFrame may call stop() synchronously (a tunnel switching protocols)\n if (stopped || buffer.length < 4) return;\n const length = buffer.readUInt32BE(0);\n if (buffer.length < 4 + length) return;\n const payload = buffer.subarray(4, 4 + length);\n buffer = buffer.subarray(4 + length);\n let frame: ControlFrame;\n try {\n frame = JSON.parse(payload.toString(\"utf8\")) as ControlFrame;\n } catch {\n continue; // skip malformed frames\n }\n onFrame(frame, buffer);\n }\n },\n stop() {\n stopped = true;\n },\n };\n}\n\nfunction encodeControlFrame(frame: object): Buffer {\n return encodeSessionMessage(frame);\n}\n\ninterface GatewayOverrides {\n /** Server factory (tests substitute a plain net.Server). */\n createServer?: (onConnection: (socket: Socket) => void) => Server;\n /** mTLS verification result for a socket (tests substitute outcomes). */\n isAuthorized?: (socket: Socket) => boolean;\n leaseTtlSeconds?: number;\n rpcTimeoutMs?: number;\n tunnelTimeoutMs?: number;\n}\n\nfunction defaultIsAuthorized(socket: Socket): boolean {\n return socket instanceof TLSSocket && socket.authorized;\n}\n\n/**\n * The host side of dial-home workers: one mTLS listener that accepts worker\n * control channels (register/ping/RPC responses) and per-command dial-back\n * tunnels, keeps the registry of connected workers, and attaches each one to\n * the fleet as a regular worker connection. Placement, leases, fencing, and\n * failover are unchanged — this only reverses who dials whom.\n */\nclass GondolinWorkerGateway {\n private settings?: GondolinGatewaySettings;\n private overrides: GatewayOverrides = {};\n private server?: Server;\n private readonly workers = new Map<string, RegisteredWorker>();\n private readonly pendingTunnels = new Map<\n string,\n { resolve: (value: { socket: Socket; leftover: Buffer }) => void; timer: NodeJS.Timeout }\n >();\n\n configure(settings?: GondolinGatewaySettings, overrides?: GatewayOverrides): void {\n this.stop();\n this.settings = settings;\n this.overrides = overrides ?? {};\n }\n\n isConfigured(): boolean {\n return this.settings !== undefined;\n }\n\n /** Registered workers and their liveness (admin/observability surface). */\n list(): Array<{\n name: string;\n connected: boolean;\n activeRuntimes: number;\n workspaceError?: string;\n info: GondolinWorkerRegistration;\n }> {\n return Array.from(this.workers.values()).map((worker) => ({\n name: worker.info.name,\n connected: !worker.socket.destroyed,\n activeRuntimes: worker.activeRuntimes,\n workspaceError: worker.workspaceError,\n info: worker.info,\n }));\n }\n\n /**\n * Start the listener. Without explicit certificate settings the gateway\n * provisions its own: a private worker CA plus a server certificate signed\n * by it (required for join's CA pinning to also authenticate the host).\n */\n async start(): Promise<void> {\n if (!this.settings || this.server) return;\n const settings = this.settings;\n if (!settings.workspaceRoot) {\n // dial-home workers inherit workspaceRoot from here; without it every\n // runtime is rejected with \"escapes the workspace root\"\n throw new Error(\n \"gondolin gateway requires workspaceRoot (the worker-side shared workspace path); \" +\n \"set sandbox.gondolin.remote.gateway.workspaceRoot\",\n );\n }\n let material: { certFile: string; keyFile: string; clientCaFile: string };\n if (settings.certFile && settings.keyFile && settings.clientCaFile) {\n material = {\n certFile: settings.certFile,\n keyFile: settings.keyFile,\n clientCaFile: settings.clientCaFile,\n };\n } else {\n if (!gondolinJoin.isConfigured()) {\n throw new Error(\"gondolin gateway auto-init requires the join service to be configured\");\n }\n const issued = await gondolinJoin.ensureServerCert(settings.hostnames ?? [hostname()]);\n material = { ...issued, clientCaFile: gondolinJoin.paths().caFile };\n }\n const factory =\n this.overrides.createServer ??\n ((onConnection: (socket: Socket) => void) =>\n createTlsServer(\n {\n cert: readFileSync(material.certFile),\n key: readFileSync(material.keyFile),\n ca: readFileSync(material.clientCaFile),\n requestCert: true,\n // unauthenticated connections may only send a join frame; the\n // per-frame authorization gate enforces that below\n rejectUnauthorized: false,\n minVersion: \"TLSv1.3\",\n },\n onConnection,\n ));\n this.server = factory((socket) => this.handleConnection(socket));\n this.server.listen(this.settings.port, () => {\n log.logInfo(`Gondolin worker gateway listening on :${this.settings?.port}`);\n });\n }\n\n stop(): void {\n for (const worker of this.workers.values()) {\n worker.socket.destroy();\n for (const pending of worker.pendingRpc.values()) clearTimeout(pending.timer);\n }\n this.workers.clear();\n for (const pending of this.pendingTunnels.values()) clearTimeout(pending.timer);\n this.pendingTunnels.clear();\n this.server?.close();\n this.server = undefined;\n }\n\n /** Routes one inbound connection by its first frame: control or tunnel. */\n private handleConnection(socket: Socket): void {\n socket.setNoDelay(true);\n let routed = false;\n const authorized = (this.overrides.isAuthorized ?? defaultIsAuthorized)(socket);\n const reader = createControlFrameReader((frame, leftover) => {\n if (!routed) {\n routed = true;\n if (frame.type === \"join\") {\n void this.handleJoin(socket, frame);\n } else if (!authorized) {\n // everything except join requires a CA-signed client certificate\n socket.destroy();\n } else if (frame.type === \"register\" && frame.name) {\n this.acceptControlChannel(socket, frame, reader);\n } else if (frame.type === \"tunnel\" && frame.nonce) {\n reader.stop();\n socket.removeAllListeners(\"data\");\n this.acceptTunnel(socket, frame.nonce, leftover);\n } else {\n socket.destroy();\n }\n return;\n }\n this.handleControlFrame(socket, frame);\n });\n socket.on(\"data\", (chunk: Buffer) => reader.push(chunk));\n socket.on(\"error\", () => socket.destroy());\n }\n\n private acceptControlChannel(\n socket: Socket,\n registration: ControlFrame,\n _reader: { stop: () => void },\n ): void {\n const name = registration.name as string;\n const previous = this.workers.get(name);\n if (previous && !previous.socket.destroyed) {\n log.logInfo(`Gondolin worker '${name}' re-registered; superseding previous connection`);\n previous.socket.destroy();\n }\n const worker: RegisteredWorker = {\n info: registration,\n socket,\n connectedAt: Date.now(),\n lastSeen: Date.now(),\n activeRuntimes: registration.runtimes?.length ?? 0,\n pendingRpc: new Map(),\n nextRpcId: 1,\n };\n this.workers.set(name, worker);\n const surviving = registration.runtimes?.length ?? 0;\n log.logInfo(\n `Gondolin worker joined: ${name} (${registration.os}/${registration.arch}, ` +\n `${registration.accelerator}, ${registration.cpus} cpus, ` +\n `cap ${registration.maxRuntimes ?? \"∞\"}, ${surviving} runtimes surviving)`,\n );\n\n const overrides = this.settings?.workers?.[name];\n gondolinFleet.attachWorker(\n {\n name,\n url: `dialhome://${name}`,\n workspaceRoot: this.settings?.workspaceRoot,\n maxRuntimes: overrides?.maxRuntimes ?? registration.maxRuntimes,\n draining: overrides?.draining,\n },\n (connectionOverrides) =>\n new GondolinRemoteConnection(\n { name, url: `dialhome://${name}`, workspaceRoot: this.settings?.workspaceRoot },\n {\n ...connectionOverrides,\n ...(this.overrides.leaseTtlSeconds !== undefined\n ? { leaseTtlSeconds: this.overrides.leaseTtlSeconds }\n : {}),\n request: (method, path, body, headers) => this.rpc(name, method, path, body, headers),\n tunnel: (path, headers, callbacks) => this.openTunnel(name, path, headers, callbacks),\n },\n ),\n );\n this.applyWorkspaceHealth(worker, registration.workspaceError);\n // a worker that reconnected may carry runtimes whose placements moved\n void gondolinFleet.reconcile();\n\n socket.on(\"close\", () => {\n const current = this.workers.get(name);\n if (current !== worker) return; // superseded\n for (const pending of worker.pendingRpc.values()) clearTimeout(pending.timer);\n worker.pendingRpc.clear();\n log.logWarning(`Gondolin worker disconnected: ${name} (placements fence until lease expiry)`);\n gondolinFleet.detachWorker(name);\n this.workers.delete(name);\n });\n }\n\n private handleControlFrame(socket: Socket, frame: ControlFrame): void {\n const worker = this.workerBySocket(socket);\n if (!worker) return;\n worker.lastSeen = Date.now();\n if (frame.type === \"ping\") {\n if (typeof frame.activeRuntimes === \"number\") {\n worker.activeRuntimes = frame.activeRuntimes;\n }\n // omitted on healthy pings (Go omitempty), so absence means recovered\n this.applyWorkspaceHealth(worker, frame.workspaceError);\n socket.write(encodeControlFrame({ type: \"pong\" }));\n return;\n }\n if (frame.type === \"response\" && typeof frame.id === \"number\") {\n const pending = worker.pendingRpc.get(frame.id);\n if (!pending) return;\n worker.pendingRpc.delete(frame.id);\n clearTimeout(pending.timer);\n pending.resolve(frame);\n }\n }\n\n /**\n * Track shared-workspace health from register/ping frames and push it into\n * the fleet, logging only the transitions. A worker whose NFS mount died\n * keeps its control channel alive — this is what turns that silent state\n * into refused placements and fail-fast execs.\n */\n private applyWorkspaceHealth(worker: RegisteredWorker, error: string | undefined): void {\n const next = error || undefined;\n if (next === worker.workspaceError) {\n gondolinFleet.setWorkspaceHealth(worker.info.name, next); // attach may have reset it\n return;\n }\n if (next) {\n log.logWarning(\n `Gondolin worker '${worker.info.name}' workspace is unusable: ${next} — new placements disabled until it recovers`,\n );\n } else {\n log.logInfo(`Gondolin worker '${worker.info.name}' workspace recovered`);\n }\n worker.workspaceError = next;\n gondolinFleet.setWorkspaceHealth(worker.info.name, next);\n }\n\n /** RPC to a worker over its control channel (the reverse of HTTPS requests). */\n private rpc(\n name: string,\n method: string,\n path: string,\n body?: object,\n headers?: Record<string, string>,\n ): Promise<{ status: number; json: Record<string, unknown> }> {\n const worker = this.workers.get(name);\n if (!worker || worker.socket.destroyed) {\n return Promise.reject(\n new GondolinWorkerUnreachableError(`worker '${name}' is not connected`),\n );\n }\n const id = worker.nextRpcId++;\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n worker.pendingRpc.delete(id);\n reject(\n new GondolinWorkerUnreachableError(\n `RPC to worker '${name}' timed out (${method} ${path})`,\n ),\n );\n }, this.overrides.rpcTimeoutMs ?? RPC_TIMEOUT_MS);\n timer.unref?.();\n worker.pendingRpc.set(id, {\n timer,\n resolve: (frame) =>\n resolve({\n status: frame.status ?? 0,\n json: (frame.body ?? {}) as Record<string, unknown>,\n }),\n });\n worker.socket.write(encodeControlFrame({ type: \"request\", id, method, path, body, headers }));\n });\n }\n\n /** Ask the worker to dial back a data connection for one session tunnel. */\n private openTunnel(\n name: string,\n path: string,\n headers: Record<string, string>,\n callbacks: SessionClientCallbacks,\n ): Promise<SessionClient> {\n const worker = this.workers.get(name);\n if (!worker || worker.socket.destroyed) {\n const error = new Error(`worker '${name}' is not connected`) as NodeJS.ErrnoException;\n error.code = \"ECONNREFUSED\"; // nothing executed — safe to recreate\n return Promise.reject(error);\n }\n const sessionId = path.split(\"/\")[3];\n const nonce = randomBytes(16).toString(\"hex\");\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingTunnels.delete(nonce);\n const error = new Error(\n `worker '${name}' did not dial back a tunnel`,\n ) as NodeJS.ErrnoException;\n error.code = \"ECONNREFUSED\";\n reject(error);\n }, this.overrides.tunnelTimeoutMs ?? TUNNEL_TIMEOUT_MS);\n timer.unref?.();\n this.pendingTunnels.set(nonce, {\n timer,\n resolve: ({ socket, leftover }) => {\n let closed = false;\n const parse = createSessionFrameParser(callbacks);\n if (leftover.length > 0) parse(leftover);\n socket.on(\"data\", parse);\n socket.on(\"error\", (error: Error) => {\n if (closed) return;\n closed = true;\n callbacks.onClose(error);\n });\n socket.on(\"close\", () => {\n if (closed) return;\n closed = true;\n callbacks.onClose();\n });\n resolve({\n send: (message) => {\n if (!closed) socket.write(encodeSessionMessage(message));\n },\n close: () => {\n if (closed) return;\n closed = true;\n socket.destroy();\n },\n });\n },\n });\n worker.socket.write(encodeControlFrame({ type: \"open-tunnel\", nonce, sessionId, headers }));\n });\n }\n\n /**\n * One-time token → CA-signed client certificate. The only operation an\n * unauthenticated connection may perform; the connection closes after the\n * response either way.\n */\n private async handleJoin(socket: Socket, frame: ControlFrame): Promise<void> {\n const refuse = (message: string): void => {\n log.logWarning(`Gondolin worker join refused: ${message}`);\n socket.end(encodeControlFrame({ type: \"join-error\", message }));\n };\n if (!gondolinJoin.isConfigured()) {\n refuse(\"join is not enabled on this gateway\");\n return;\n }\n if (!frame.token || !frame.csr || !frame.name) {\n refuse(\"join requires token, csr, and name\");\n return;\n }\n if (!gondolinJoin.consumeToken(frame.token)) {\n refuse(`invalid or expired join token (worker '${frame.name}')`);\n return;\n }\n try {\n const signed = await gondolinJoin.signCsr(frame.csr);\n log.logInfo(`Gondolin worker '${frame.name}' joined: client certificate issued`);\n socket.end(encodeControlFrame({ type: \"join-ok\", cert: signed.certPem, ca: signed.caPem }));\n } catch (err) {\n refuse(`certificate issuance failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n private acceptTunnel(socket: Socket, nonce: string, leftover: Buffer): void {\n const pending = this.pendingTunnels.get(nonce);\n if (!pending) {\n socket.destroy();\n return;\n }\n this.pendingTunnels.delete(nonce);\n clearTimeout(pending.timer);\n pending.resolve({ socket, leftover: Buffer.from(leftover) });\n }\n\n private workerBySocket(socket: Socket): RegisteredWorker | undefined {\n for (const worker of this.workers.values()) {\n if (worker.socket === socket) return worker;\n }\n return undefined;\n }\n}\n\nexport const gondolinGateway = new GondolinWorkerGateway();\n"]}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Durable record of one Gondolin runtime. Written beside the state dir (never
3
+ * inside the workspace) by whichever process owns the VM — the worker process
4
+ * hosting it — so a crash that skips every exit hook still leaves enough
5
+ * behind to adopt the runtime back or stop its orphaned VM runner.
6
+ */
7
+ export interface GondolinRuntimeRecord {
8
+ /** Gondolin session id (`vm.id`); also names the record file. */
9
+ sessionId: string;
10
+ /** mikan session key (vault key) the runtime was created for. */
11
+ instanceId: string;
12
+ /** Process that owns the runtime (the worker process). */
13
+ ownerPid: number;
14
+ /** Host pid of the active VM runner process (QEMU/krun), if started. */
15
+ runnerPid: number | null;
16
+ createdAt: string;
17
+ /** Session IPC socket for adopting the runtime from a new mikan process. */
18
+ socketPath?: string;
19
+ /** Desired-runtime fingerprint the VM was created from. */
20
+ fingerprint?: string;
21
+ }
22
+ interface GondolinInventoryOverrides {
23
+ execFile?: (cmd: string, args: string[]) => Promise<string>;
24
+ kill?: (pid: number, signal: NodeJS.Signals | 0) => void;
25
+ gcSessions?: () => Promise<number>;
26
+ killWaitMs?: number;
27
+ killPollIntervalMs?: number;
28
+ }
29
+ declare class GondolinRuntimeInventory {
30
+ private dir?;
31
+ private execFileImpl;
32
+ private killImpl;
33
+ private gcSessionsImpl;
34
+ private killWaitMs;
35
+ private killPollIntervalMs;
36
+ private readonly liveRecords;
37
+ configure(dir?: string, overrides?: GondolinInventoryOverrides): void;
38
+ record(entry: {
39
+ sessionId: string;
40
+ instanceId: string;
41
+ runnerPid: number | null;
42
+ socketPath?: string;
43
+ fingerprint?: string;
44
+ }): void;
45
+ /** Re-persist a runtime whose runner pid changed (late boot, runner restart). */
46
+ refresh(sessionId: string, runnerPid: number | null): void;
47
+ release(sessionId: string): void;
48
+ /**
49
+ * Newest worker-owned record for a session key whose owner is still alive —
50
+ * a candidate for adoption instead of spawning a fresh worker. Records left
51
+ * by dead owners are reaped on the spot.
52
+ */
53
+ findAdoptable(instanceId: string): Promise<GondolinRuntimeRecord | undefined>;
54
+ /** Reap one session's record if its owner is gone (e.g. after force-killing a worker). */
55
+ reapSession(sessionId: string): Promise<void>;
56
+ /** Worker-owned records with live owners (runtimes surviving from a previous mikan). */
57
+ listWorkerRecords(): GondolinRuntimeRecord[];
58
+ /**
59
+ * mikan liveness signal for workers: a worker whose heartbeat goes stale
60
+ * knows every mikan that could adopt it is gone and shuts itself down.
61
+ */
62
+ touchHeartbeat(): void;
63
+ heartbeatPath(): string | undefined;
64
+ directory(): string | undefined;
65
+ /**
66
+ * Startup reconciliation: stop VM runners orphaned by a previous owner
67
+ * process that died without cleanup, drop stale records, and let Gondolin
68
+ * collect its own stale session registry entries. Runtimes whose owner is
69
+ * still alive (workers surviving a mikan restart) are left for adoption.
70
+ * Idempotent — a second run finds an empty inventory.
71
+ */
72
+ reconcile(): Promise<void>;
73
+ /**
74
+ * Reap one dead-owner record: stop its orphaned runner if it is still the
75
+ * process we launched, then drop the record (kept only while the runner
76
+ * refuses to die, so the next reconcile retries).
77
+ */
78
+ reapRecord(record: GondolinRuntimeRecord, path?: string): Promise<"killed" | "gone" | "reused" | "alive">;
79
+ private readRecords;
80
+ private stopOrphan;
81
+ private signal;
82
+ isPidAlive(pid: number): boolean;
83
+ private waitForExit;
84
+ private write;
85
+ private recordPath;
86
+ }
87
+ export declare const gondolinInventory: GondolinRuntimeInventory;
88
+ export {};
89
+ //# sourceMappingURL=gondolin-inventory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gondolin-inventory.d.ts","sourceRoot":"","sources":["../../src/sandbox/gondolin-inventory.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,0BAA0B;IAClC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,IAAI,CAAC;IACzD,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAqBD,cAAM,wBAAwB;IAC5B,OAAO,CAAC,GAAG,CAAC,CAAS;IACrB,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,QAAQ,CACY;IAC5B,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,kBAAkB,CAAO;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4C;IAExE,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAQpE;IAED,MAAM,CAAC,KAAK,EAAE;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,IAAI,CASP;IAED,iFAAiF;IACjF,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAKzD;IAED,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAW/B;IAED;;;;OAIG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAWlF;IAED,0FAA0F;IACpF,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMlD;IAED,wFAAwF;IACxF,iBAAiB,IAAI,qBAAqB,EAAE,CAI3C;IAED;;;OAGG;IACH,cAAc,IAAI,IAAI,CAWrB;IAED,aAAa,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,SAAS,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED;;;;;;OAMG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA8B/B;IAED;;;;OAIG;IACG,UAAU,CACd,MAAM,EAAE,qBAAqB,EAC7B,IAAI,SAAoC,GACvC,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,CAUjD;IAED,OAAO,CAAC,WAAW;YA4BL,UAAU;IA6BxB,OAAO,CAAC,MAAM;IAQd,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO/B;YAEa,WAAW;IASzB,OAAO,CAAC,KAAK;IAab,OAAO,CAAC,UAAU;CAGnB;AAED,eAAO,MAAM,iBAAiB,0BAAiC,CAAC"}