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

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 (497) hide show
  1. package/CHANGELOG.md +388 -0
  2. package/README.md +49 -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/buffered-responder.d.ts +60 -0
  7. package/dist/adapters/buffered-responder.d.ts.map +1 -0
  8. package/dist/adapters/buffered-responder.js +201 -0
  9. package/dist/adapters/buffered-responder.js.map +1 -0
  10. package/dist/adapters/discord/bot.d.ts +1 -0
  11. package/dist/adapters/discord/bot.d.ts.map +1 -1
  12. package/dist/adapters/discord/bot.js +36 -67
  13. package/dist/adapters/discord/bot.js.map +1 -1
  14. package/dist/adapters/discord/context.d.ts.map +1 -1
  15. package/dist/adapters/discord/context.js +44 -204
  16. package/dist/adapters/discord/context.js.map +1 -1
  17. package/dist/adapters/github/bot.d.ts +86 -0
  18. package/dist/adapters/github/bot.d.ts.map +1 -0
  19. package/dist/adapters/github/bot.js +640 -0
  20. package/dist/adapters/github/bot.js.map +1 -0
  21. package/dist/adapters/github/client.d.ts +122 -0
  22. package/dist/adapters/github/client.d.ts.map +1 -0
  23. package/dist/adapters/github/client.js +314 -0
  24. package/dist/adapters/github/client.js.map +1 -0
  25. package/dist/adapters/github/cloudbuild.d.ts +24 -0
  26. package/dist/adapters/github/cloudbuild.d.ts.map +1 -0
  27. package/dist/adapters/github/cloudbuild.js +71 -0
  28. package/dist/adapters/github/cloudbuild.js.map +1 -0
  29. package/dist/adapters/github/context.d.ts +9 -0
  30. package/dist/adapters/github/context.d.ts.map +1 -0
  31. package/dist/adapters/github/context.js +103 -0
  32. package/dist/adapters/github/context.js.map +1 -0
  33. package/dist/adapters/github/gcp-auth.d.ts +31 -0
  34. package/dist/adapters/github/gcp-auth.d.ts.map +1 -0
  35. package/dist/adapters/github/gcp-auth.js +196 -0
  36. package/dist/adapters/github/gcp-auth.js.map +1 -0
  37. package/dist/adapters/github/github-ops.d.ts +90 -0
  38. package/dist/adapters/github/github-ops.d.ts.map +1 -0
  39. package/dist/adapters/github/github-ops.js +405 -0
  40. package/dist/adapters/github/github-ops.js.map +1 -0
  41. package/dist/adapters/github/ids.d.ts +34 -0
  42. package/dist/adapters/github/ids.d.ts.map +1 -0
  43. package/dist/adapters/github/ids.js +53 -0
  44. package/dist/adapters/github/ids.js.map +1 -0
  45. package/dist/adapters/github/repo.d.ts +32 -0
  46. package/dist/adapters/github/repo.d.ts.map +1 -0
  47. package/dist/adapters/github/repo.js +141 -0
  48. package/dist/adapters/github/repo.js.map +1 -0
  49. package/dist/adapters/github/tool-pack.d.ts +14 -0
  50. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  51. package/dist/adapters/github/tool-pack.js +56 -0
  52. package/dist/adapters/github/tool-pack.js.map +1 -0
  53. package/dist/adapters/github/tools/checks.d.ts +24 -0
  54. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  55. package/dist/adapters/github/tools/checks.js +105 -0
  56. package/dist/adapters/github/tools/checks.js.map +1 -0
  57. package/dist/adapters/github/tools/issue.d.ts +22 -0
  58. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  59. package/dist/adapters/github/tools/issue.js +48 -0
  60. package/dist/adapters/github/tools/issue.js.map +1 -0
  61. package/dist/adapters/github/tools/pr.d.ts +22 -0
  62. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  63. package/dist/adapters/github/tools/pr.js +48 -0
  64. package/dist/adapters/github/tools/pr.js.map +1 -0
  65. package/dist/adapters/github/tools/read.d.ts +22 -0
  66. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  67. package/dist/adapters/github/tools/read.js +141 -0
  68. package/dist/adapters/github/tools/read.js.map +1 -0
  69. package/dist/adapters/github/tools/review-reply.d.ts +19 -0
  70. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  71. package/dist/adapters/github/tools/review-reply.js +38 -0
  72. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  73. package/dist/adapters/github/tools/sync.d.ts +17 -0
  74. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  75. package/dist/adapters/github/tools/sync.js +34 -0
  76. package/dist/adapters/github/tools/sync.js.map +1 -0
  77. package/dist/adapters/github/types.d.ts +350 -0
  78. package/dist/adapters/github/types.d.ts.map +1 -0
  79. package/dist/adapters/github/types.js +2 -0
  80. package/dist/adapters/github/types.js.map +1 -0
  81. package/dist/adapters/intake.d.ts +16 -5
  82. package/dist/adapters/intake.d.ts.map +1 -1
  83. package/dist/adapters/intake.js +79 -22
  84. package/dist/adapters/intake.js.map +1 -1
  85. package/dist/adapters/slack/bot.d.ts +8 -6
  86. package/dist/adapters/slack/bot.d.ts.map +1 -1
  87. package/dist/adapters/slack/bot.js +82 -134
  88. package/dist/adapters/slack/bot.js.map +1 -1
  89. package/dist/adapters/slack/context.d.ts.map +1 -1
  90. package/dist/adapters/slack/context.js +3 -14
  91. package/dist/adapters/slack/context.js.map +1 -1
  92. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  93. package/dist/adapters/slack/response-lifecycle.js +14 -17
  94. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  95. package/dist/adapters/slack/session.d.ts.map +1 -1
  96. package/dist/adapters/slack/session.js +5 -8
  97. package/dist/adapters/slack/session.js.map +1 -1
  98. package/dist/adapters/streaming.d.ts +4 -0
  99. package/dist/adapters/streaming.d.ts.map +1 -1
  100. package/dist/adapters/streaming.js +11 -0
  101. package/dist/adapters/streaming.js.map +1 -1
  102. package/dist/adapters/telegram/bot.d.ts +1 -2
  103. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  104. package/dist/adapters/telegram/bot.js +27 -62
  105. package/dist/adapters/telegram/bot.js.map +1 -1
  106. package/dist/adapters/telegram/context.d.ts.map +1 -1
  107. package/dist/adapters/telegram/context.js +37 -174
  108. package/dist/adapters/telegram/context.js.map +1 -1
  109. package/dist/adapters/types.d.ts +28 -2
  110. package/dist/adapters/types.d.ts.map +1 -1
  111. package/dist/adapters/types.js.map +1 -1
  112. package/dist/agent.d.ts +37 -14
  113. package/dist/agent.d.ts.map +1 -1
  114. package/dist/agent.js +359 -229
  115. package/dist/agent.js.map +1 -1
  116. package/dist/cli/arg-grammar.d.ts +25 -0
  117. package/dist/cli/arg-grammar.d.ts.map +1 -0
  118. package/dist/cli/arg-grammar.js +59 -0
  119. package/dist/cli/arg-grammar.js.map +1 -0
  120. package/dist/cli/boot.d.ts +16 -0
  121. package/dist/cli/boot.d.ts.map +1 -0
  122. package/dist/cli/boot.js +119 -0
  123. package/dist/cli/boot.js.map +1 -0
  124. package/dist/cli/download.d.ts.map +1 -0
  125. package/dist/cli/download.js.map +1 -0
  126. package/dist/cli/ext-git.d.ts +22 -0
  127. package/dist/cli/ext-git.d.ts.map +1 -0
  128. package/dist/cli/ext-git.js +76 -0
  129. package/dist/cli/ext-git.js.map +1 -0
  130. package/dist/cli/ext.d.ts +2 -0
  131. package/dist/cli/ext.d.ts.map +1 -0
  132. package/dist/cli/ext.js +215 -0
  133. package/dist/cli/ext.js.map +1 -0
  134. package/dist/commands/admin.d.ts.map +1 -1
  135. package/dist/commands/admin.js +2 -1
  136. package/dist/commands/admin.js.map +1 -1
  137. package/dist/commands/auto-reply.d.ts.map +1 -1
  138. package/dist/commands/auto-reply.js +2 -6
  139. package/dist/commands/auto-reply.js.map +1 -1
  140. package/dist/commands/extensions.d.ts.map +1 -1
  141. package/dist/commands/extensions.js +18 -8
  142. package/dist/commands/extensions.js.map +1 -1
  143. package/dist/commands/login.d.ts +2 -1
  144. package/dist/commands/login.d.ts.map +1 -1
  145. package/dist/commands/login.js +35 -3
  146. package/dist/commands/login.js.map +1 -1
  147. package/dist/commands/manifest.d.ts +72 -0
  148. package/dist/commands/manifest.d.ts.map +1 -0
  149. package/dist/commands/manifest.js +121 -0
  150. package/dist/commands/manifest.js.map +1 -0
  151. package/dist/commands/model.d.ts.map +1 -1
  152. package/dist/commands/model.js +11 -9
  153. package/dist/commands/model.js.map +1 -1
  154. package/dist/commands/new.d.ts.map +1 -1
  155. package/dist/commands/new.js +2 -1
  156. package/dist/commands/new.js.map +1 -1
  157. package/dist/commands/sandbox.d.ts.map +1 -1
  158. package/dist/commands/sandbox.js +23 -17
  159. package/dist/commands/sandbox.js.map +1 -1
  160. package/dist/commands/text.d.ts +2 -0
  161. package/dist/commands/text.d.ts.map +1 -0
  162. package/dist/commands/text.js +16 -0
  163. package/dist/commands/text.js.map +1 -0
  164. package/dist/commands/types.d.ts +14 -1
  165. package/dist/commands/types.d.ts.map +1 -1
  166. package/dist/commands/types.js.map +1 -1
  167. package/dist/config.d.ts +1 -3
  168. package/dist/config.d.ts.map +1 -1
  169. package/dist/config.js +98 -95
  170. package/dist/config.js.map +1 -1
  171. package/dist/env-manifest.d.ts +35 -0
  172. package/dist/env-manifest.d.ts.map +1 -0
  173. package/dist/env-manifest.js +225 -0
  174. package/dist/env-manifest.js.map +1 -0
  175. package/dist/events.d.ts.map +1 -1
  176. package/dist/events.js +9 -73
  177. package/dist/events.js.map +1 -1
  178. package/dist/execution-resolver.d.ts +4 -2
  179. package/dist/execution-resolver.d.ts.map +1 -1
  180. package/dist/execution-resolver.js +54 -41
  181. package/dist/execution-resolver.js.map +1 -1
  182. package/dist/harness/event-format.d.ts +66 -0
  183. package/dist/harness/event-format.d.ts.map +1 -0
  184. package/dist/harness/event-format.js +112 -0
  185. package/dist/harness/event-format.js.map +1 -0
  186. package/dist/harness/extensions/loader.d.ts +44 -11
  187. package/dist/harness/extensions/loader.d.ts.map +1 -1
  188. package/dist/harness/extensions/loader.js +273 -84
  189. package/dist/harness/extensions/loader.js.map +1 -1
  190. package/dist/harness/extensions/registry.d.ts +48 -1
  191. package/dist/harness/extensions/registry.d.ts.map +1 -1
  192. package/dist/harness/extensions/registry.js +146 -0
  193. package/dist/harness/extensions/registry.js.map +1 -1
  194. package/dist/harness/extensions/types.d.ts +165 -22
  195. package/dist/harness/extensions/types.d.ts.map +1 -1
  196. package/dist/harness/extensions/types.js.map +1 -1
  197. package/dist/harness/index.d.ts +6 -5
  198. package/dist/harness/index.d.ts.map +1 -1
  199. package/dist/harness/index.js +3 -2
  200. package/dist/harness/index.js.map +1 -1
  201. package/dist/harness/models.d.ts +5 -0
  202. package/dist/harness/models.d.ts.map +1 -1
  203. package/dist/harness/models.js +10 -0
  204. package/dist/harness/models.js.map +1 -1
  205. package/dist/harness/runner.d.ts +37 -2
  206. package/dist/harness/runner.d.ts.map +1 -1
  207. package/dist/harness/runner.js +107 -23
  208. package/dist/harness/runner.js.map +1 -1
  209. package/dist/harness/session-store.d.ts +4 -1
  210. package/dist/harness/session-store.d.ts.map +1 -1
  211. package/dist/harness/session-store.js +11 -2
  212. package/dist/harness/session-store.js.map +1 -1
  213. package/dist/harness/subagent-runner.d.ts +34 -0
  214. package/dist/harness/subagent-runner.d.ts.map +1 -0
  215. package/dist/harness/subagent-runner.js +339 -0
  216. package/dist/harness/subagent-runner.js.map +1 -0
  217. package/dist/harness/types.d.ts +53 -0
  218. package/dist/harness/types.d.ts.map +1 -1
  219. package/dist/harness/types.js.map +1 -1
  220. package/dist/index.d.ts +3 -3
  221. package/dist/index.d.ts.map +1 -1
  222. package/dist/index.js +2 -2
  223. package/dist/index.js.map +1 -1
  224. package/dist/main.js +260 -109
  225. package/dist/main.js.map +1 -1
  226. package/dist/observability/instrument.js +6 -4
  227. package/dist/observability/instrument.js.map +1 -1
  228. package/dist/observability/sentry.d.ts.map +1 -1
  229. package/dist/observability/sentry.js +3 -2
  230. package/dist/observability/sentry.js.map +1 -1
  231. package/dist/provisioner.d.ts.map +1 -1
  232. package/dist/provisioner.js +2 -5
  233. package/dist/provisioner.js.map +1 -1
  234. package/dist/runtime/conversation-runtime.d.ts +1 -1
  235. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  236. package/dist/runtime/conversation-runtime.js +276 -43
  237. package/dist/runtime/conversation-runtime.js.map +1 -1
  238. package/dist/runtime/types.d.ts +36 -5
  239. package/dist/runtime/types.d.ts.map +1 -1
  240. package/dist/runtime/types.js.map +1 -1
  241. package/dist/sandbox/cloudflare.d.ts +3 -0
  242. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  243. package/dist/sandbox/cloudflare.js +10 -0
  244. package/dist/sandbox/cloudflare.js.map +1 -1
  245. package/dist/sandbox/container.d.ts +4 -0
  246. package/dist/sandbox/container.d.ts.map +1 -1
  247. package/dist/sandbox/container.js +11 -2
  248. package/dist/sandbox/container.js.map +1 -1
  249. package/dist/sandbox/firecracker.d.ts +3 -0
  250. package/dist/sandbox/firecracker.d.ts.map +1 -1
  251. package/dist/sandbox/firecracker.js +10 -1
  252. package/dist/sandbox/firecracker.js.map +1 -1
  253. package/dist/sandbox/gondolin-bootstrap.d.ts +26 -0
  254. package/dist/sandbox/gondolin-bootstrap.d.ts.map +1 -0
  255. package/dist/sandbox/gondolin-bootstrap.js +27 -0
  256. package/dist/sandbox/gondolin-bootstrap.js.map +1 -0
  257. package/dist/sandbox/gondolin-contract.d.ts +125 -0
  258. package/dist/sandbox/gondolin-contract.d.ts.map +1 -0
  259. package/dist/sandbox/gondolin-contract.js +155 -0
  260. package/dist/sandbox/gondolin-contract.js.map +1 -0
  261. package/dist/sandbox/gondolin-fleet.d.ts +104 -0
  262. package/dist/sandbox/gondolin-fleet.d.ts.map +1 -0
  263. package/dist/sandbox/gondolin-fleet.js +330 -0
  264. package/dist/sandbox/gondolin-fleet.js.map +1 -0
  265. package/dist/sandbox/gondolin-gateway.d.ts +86 -0
  266. package/dist/sandbox/gondolin-gateway.d.ts.map +1 -0
  267. package/dist/sandbox/gondolin-gateway.js +407 -0
  268. package/dist/sandbox/gondolin-gateway.js.map +1 -0
  269. package/dist/sandbox/gondolin-inventory.d.ts +75 -0
  270. package/dist/sandbox/gondolin-inventory.d.ts.map +1 -0
  271. package/dist/sandbox/gondolin-inventory.js +257 -0
  272. package/dist/sandbox/gondolin-inventory.js.map +1 -0
  273. package/dist/sandbox/gondolin-join.d.ts +62 -0
  274. package/dist/sandbox/gondolin-join.d.ts.map +1 -0
  275. package/dist/sandbox/gondolin-join.js +261 -0
  276. package/dist/sandbox/gondolin-join.js.map +1 -0
  277. package/dist/sandbox/gondolin-nfs-advisory.d.ts +15 -0
  278. package/dist/sandbox/gondolin-nfs-advisory.d.ts.map +1 -0
  279. package/dist/sandbox/gondolin-nfs-advisory.js +60 -0
  280. package/dist/sandbox/gondolin-nfs-advisory.js.map +1 -0
  281. package/dist/sandbox/gondolin-placement.d.ts +30 -0
  282. package/dist/sandbox/gondolin-placement.d.ts.map +1 -0
  283. package/dist/sandbox/gondolin-placement.js +77 -0
  284. package/dist/sandbox/gondolin-placement.js.map +1 -0
  285. package/dist/sandbox/gondolin-recovery.d.ts +33 -0
  286. package/dist/sandbox/gondolin-recovery.d.ts.map +1 -0
  287. package/dist/sandbox/gondolin-recovery.js +39 -0
  288. package/dist/sandbox/gondolin-recovery.js.map +1 -0
  289. package/dist/sandbox/gondolin-remote.d.ts +70 -0
  290. package/dist/sandbox/gondolin-remote.d.ts.map +1 -0
  291. package/dist/sandbox/gondolin-remote.js +325 -0
  292. package/dist/sandbox/gondolin-remote.js.map +1 -0
  293. package/dist/sandbox/gondolin-worker-client.d.ts +135 -0
  294. package/dist/sandbox/gondolin-worker-client.d.ts.map +1 -0
  295. package/dist/sandbox/gondolin-worker-client.js +323 -0
  296. package/dist/sandbox/gondolin-worker-client.js.map +1 -0
  297. package/dist/sandbox/gondolin-worker-main.d.ts +2 -0
  298. package/dist/sandbox/gondolin-worker-main.d.ts.map +1 -0
  299. package/dist/sandbox/gondolin-worker-main.js +22 -0
  300. package/dist/sandbox/gondolin-worker-main.js.map +1 -0
  301. package/dist/sandbox/gondolin-worker.d.ts +17 -0
  302. package/dist/sandbox/gondolin-worker.d.ts.map +1 -0
  303. package/dist/sandbox/gondolin-worker.js +201 -0
  304. package/dist/sandbox/gondolin-worker.js.map +1 -0
  305. package/dist/sandbox/gondolin.d.ts +53 -0
  306. package/dist/sandbox/gondolin.d.ts.map +1 -0
  307. package/dist/sandbox/gondolin.js +429 -0
  308. package/dist/sandbox/gondolin.js.map +1 -0
  309. package/dist/sandbox/host.d.ts +3 -0
  310. package/dist/sandbox/host.d.ts.map +1 -1
  311. package/dist/sandbox/host.js +14 -0
  312. package/dist/sandbox/host.js.map +1 -1
  313. package/dist/sandbox/identity.d.ts +21 -0
  314. package/dist/sandbox/identity.d.ts.map +1 -0
  315. package/dist/sandbox/identity.js +36 -0
  316. package/dist/sandbox/identity.js.map +1 -0
  317. package/dist/sandbox/index.d.ts +13 -4
  318. package/dist/sandbox/index.d.ts.map +1 -1
  319. package/dist/sandbox/index.js +19 -3
  320. package/dist/sandbox/index.js.map +1 -1
  321. package/dist/sandbox/types.d.ts +31 -1
  322. package/dist/sandbox/types.d.ts.map +1 -1
  323. package/dist/sandbox/types.js.map +1 -1
  324. package/dist/sandbox/utils.d.ts +12 -0
  325. package/dist/sandbox/utils.d.ts.map +1 -1
  326. package/dist/sandbox/utils.js +38 -0
  327. package/dist/sandbox/utils.js.map +1 -1
  328. package/dist/sessions/chat-history-sync.d.ts +32 -0
  329. package/dist/sessions/chat-history-sync.d.ts.map +1 -0
  330. package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +40 -113
  331. package/dist/sessions/chat-history-sync.js.map +1 -0
  332. package/dist/sessions/conversation-log.d.ts +13 -0
  333. package/dist/sessions/conversation-log.d.ts.map +1 -0
  334. package/dist/sessions/conversation-log.js +47 -0
  335. package/dist/sessions/conversation-log.js.map +1 -0
  336. package/dist/sessions/history-line.d.ts +20 -0
  337. package/dist/sessions/history-line.d.ts.map +1 -0
  338. package/dist/sessions/history-line.js +24 -0
  339. package/dist/sessions/history-line.js.map +1 -0
  340. package/dist/sessions/policy.d.ts.map +1 -1
  341. package/dist/sessions/policy.js +5 -3
  342. package/dist/sessions/policy.js.map +1 -1
  343. package/dist/sessions/rotation.d.ts +2 -0
  344. package/dist/sessions/rotation.d.ts.map +1 -0
  345. package/dist/sessions/rotation.js +39 -0
  346. package/dist/sessions/rotation.js.map +1 -0
  347. package/dist/sessions/session-key.d.ts +31 -0
  348. package/dist/sessions/session-key.d.ts.map +1 -0
  349. package/dist/sessions/session-key.js +44 -0
  350. package/dist/sessions/session-key.js.map +1 -0
  351. package/dist/sessions/store.d.ts.map +1 -1
  352. package/dist/sessions/store.js +6 -12
  353. package/dist/sessions/store.js.map +1 -1
  354. package/dist/sessions/types.d.ts +2 -2
  355. package/dist/sessions/types.d.ts.map +1 -1
  356. package/dist/sessions/types.js.map +1 -1
  357. package/dist/settings-mutation.d.ts +23 -0
  358. package/dist/settings-mutation.d.ts.map +1 -0
  359. package/dist/settings-mutation.js +42 -0
  360. package/dist/settings-mutation.js.map +1 -0
  361. package/dist/tools/bash.d.ts +3 -1
  362. package/dist/tools/bash.d.ts.map +1 -1
  363. package/dist/tools/bash.js +24 -17
  364. package/dist/tools/bash.js.map +1 -1
  365. package/dist/tools/edit.d.ts.map +1 -1
  366. package/dist/tools/edit.js +9 -12
  367. package/dist/tools/edit.js.map +1 -1
  368. package/dist/tools/event.d.ts +1 -1
  369. package/dist/tools/event.d.ts.map +1 -1
  370. package/dist/tools/event.js +53 -43
  371. package/dist/tools/event.js.map +1 -1
  372. package/dist/tools/generate-image.d.ts +17 -0
  373. package/dist/tools/generate-image.d.ts.map +1 -0
  374. package/dist/tools/generate-image.js +63 -0
  375. package/dist/tools/generate-image.js.map +1 -0
  376. package/dist/tools/host-fn-tool.d.ts +21 -0
  377. package/dist/tools/host-fn-tool.d.ts.map +1 -0
  378. package/dist/tools/host-fn-tool.js +32 -0
  379. package/dist/tools/host-fn-tool.js.map +1 -0
  380. package/dist/tools/index.d.ts +17 -2
  381. package/dist/tools/index.d.ts.map +1 -1
  382. package/dist/tools/index.js +28 -3
  383. package/dist/tools/index.js.map +1 -1
  384. package/dist/tools/react.d.ts +15 -0
  385. package/dist/tools/react.d.ts.map +1 -0
  386. package/dist/tools/react.js +29 -0
  387. package/dist/tools/react.js.map +1 -0
  388. package/dist/tools/read.d.ts.map +1 -1
  389. package/dist/tools/read.js +7 -26
  390. package/dist/tools/read.js.map +1 -1
  391. package/dist/tools/sandbox.d.ts +2 -2
  392. package/dist/tools/sandbox.d.ts.map +1 -1
  393. package/dist/tools/sandbox.js +13 -9
  394. package/dist/tools/sandbox.js.map +1 -1
  395. package/dist/tools/subagent-slots.d.ts +28 -0
  396. package/dist/tools/subagent-slots.d.ts.map +1 -0
  397. package/dist/tools/subagent-slots.js +57 -0
  398. package/dist/tools/subagent-slots.js.map +1 -0
  399. package/dist/tools/subagent.d.ts +74 -0
  400. package/dist/tools/subagent.d.ts.map +1 -0
  401. package/dist/tools/subagent.js +335 -0
  402. package/dist/tools/subagent.js.map +1 -0
  403. package/dist/tools/types.d.ts +40 -6
  404. package/dist/tools/types.d.ts.map +1 -1
  405. package/dist/tools/types.js.map +1 -1
  406. package/dist/tools/write.d.ts.map +1 -1
  407. package/dist/tools/write.js +1 -8
  408. package/dist/tools/write.js.map +1 -1
  409. package/dist/trigger.d.ts.map +1 -1
  410. package/dist/trigger.js +1 -2
  411. package/dist/trigger.js.map +1 -1
  412. package/dist/types.d.ts +144 -31
  413. package/dist/types.d.ts.map +1 -1
  414. package/dist/types.js.map +1 -1
  415. package/dist/utils/date.d.ts +1 -1
  416. package/dist/utils/date.js +1 -1
  417. package/dist/utils/date.js.map +1 -1
  418. package/dist/vault/disabled.d.ts +9 -0
  419. package/dist/vault/disabled.d.ts.map +1 -0
  420. package/dist/vault/disabled.js +22 -0
  421. package/dist/vault/disabled.js.map +1 -0
  422. package/dist/vault/index.d.ts +0 -2
  423. package/dist/vault/index.d.ts.map +1 -1
  424. package/dist/vault/index.js +1 -32
  425. package/dist/vault/index.js.map +1 -1
  426. package/dist/vault/injection.d.ts +20 -0
  427. package/dist/vault/injection.d.ts.map +1 -0
  428. package/dist/vault/injection.js +27 -0
  429. package/dist/vault/injection.js.map +1 -0
  430. package/dist/vault/policy.d.ts +20 -0
  431. package/dist/vault/policy.d.ts.map +1 -0
  432. package/dist/vault/policy.js +20 -0
  433. package/dist/vault/policy.js.map +1 -0
  434. package/dist/vault/types.d.ts +0 -2
  435. package/dist/vault/types.d.ts.map +1 -1
  436. package/dist/vault/types.js.map +1 -1
  437. package/dist/web/admin/portal.d.ts +27 -0
  438. package/dist/web/admin/portal.d.ts.map +1 -1
  439. package/dist/web/admin/portal.js +117 -154
  440. package/dist/web/admin/portal.js.map +1 -1
  441. package/dist/web/admin/types.d.ts +6 -0
  442. package/dist/web/admin/types.d.ts.map +1 -1
  443. package/dist/web/admin/types.js.map +1 -1
  444. package/dist/web/agent-events/portal.d.ts.map +1 -1
  445. package/dist/web/agent-events/portal.js +2 -1
  446. package/dist/web/agent-events/portal.js.map +1 -1
  447. package/dist/web/login/oauth.d.ts +2 -3
  448. package/dist/web/login/oauth.d.ts.map +1 -1
  449. package/dist/web/login/oauth.js +0 -31
  450. package/dist/web/login/oauth.js.map +1 -1
  451. package/dist/web/login/portal.js +1 -1
  452. package/dist/web/login/portal.js.map +1 -1
  453. package/dist/web/login/types.d.ts +0 -11
  454. package/dist/web/login/types.d.ts.map +1 -1
  455. package/dist/web/login/types.js.map +1 -1
  456. package/dist/web/portal-shell.d.ts +4 -0
  457. package/dist/web/portal-shell.d.ts.map +1 -0
  458. package/dist/{portal-shell.js → web/portal-shell.js} +2 -2
  459. package/dist/web/portal-shell.js.map +1 -0
  460. package/dist/web/server.d.ts.map +1 -1
  461. package/dist/web/server.js +7 -0
  462. package/dist/web/server.js.map +1 -1
  463. package/dist/web/session-view/command.d.ts.map +1 -1
  464. package/dist/web/session-view/command.js +4 -1
  465. package/dist/web/session-view/command.js.map +1 -1
  466. package/dist/web/session-view/portal.d.ts.map +1 -1
  467. package/dist/web/session-view/portal.js +4 -3
  468. package/dist/web/session-view/portal.js.map +1 -1
  469. package/dist/web/session-view/service.d.ts.map +1 -1
  470. package/dist/web/session-view/service.js +2 -1
  471. package/dist/web/session-view/service.js.map +1 -1
  472. package/dist/web/session-view/types.d.ts +2 -1
  473. package/dist/web/session-view/types.d.ts.map +1 -1
  474. package/dist/web/session-view/types.js.map +1 -1
  475. package/package.json +7 -4
  476. package/dist/download.d.ts.map +0 -1
  477. package/dist/download.js.map +0 -1
  478. package/dist/model-registry.d.ts +0 -4
  479. package/dist/model-registry.d.ts.map +0 -1
  480. package/dist/model-registry.js +0 -7
  481. package/dist/model-registry.js.map +0 -1
  482. package/dist/portal-shell.d.ts +0 -4
  483. package/dist/portal-shell.d.ts.map +0 -1
  484. package/dist/portal-shell.js.map +0 -1
  485. package/dist/runtime/agent-run-controller.d.ts +0 -31
  486. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  487. package/dist/runtime/agent-run-controller.js +0 -195
  488. package/dist/runtime/agent-run-controller.js.map +0 -1
  489. package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
  490. package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
  491. package/dist/sessions/agent-memory-file-manager.js.map +0 -1
  492. package/dist/vault/routing.d.ts +0 -3
  493. package/dist/vault/routing.d.ts.map +0 -1
  494. package/dist/vault/routing.js +0 -13
  495. package/dist/vault/routing.js.map +0 -1
  496. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
  497. /package/dist/{download.js → cli/download.js} +0 -0
@@ -0,0 +1,27 @@
1
+ import { join } from "node:path";
2
+ import { assertRemoteConfigured, gondolinResources } from "./gondolin.js";
3
+ import { gondolinFleet } from "./gondolin-fleet.js";
4
+ import { gondolinGateway } from "./gondolin-gateway.js";
5
+ import { gondolinInventory } from "./gondolin-inventory.js";
6
+ import { gondolinJoin } from "./gondolin-join.js";
7
+ import { gondolinPlacements } from "./gondolin-placement.js";
8
+ /**
9
+ * Configure every gondolin runtime singleton for one process — resources,
10
+ * inventory, placements, fleet, join, gateway — from one options object.
11
+ * This is the managed-sandbox bootstrap seam: main.ts and embedders
12
+ * (src/index.ts) call it before creating conversation runtimes with a
13
+ * gondolin sandbox config; nothing else may call the individual configure()
14
+ * methods outside tests.
15
+ */
16
+ export function configureGondolinRuntime(options) {
17
+ gondolinResources.configure(options.limits, options.boostLimits);
18
+ gondolinInventory.configure(join(options.stateDir, "gondolin-runtimes"));
19
+ gondolinPlacements.configure(join(options.stateDir, "gondolin-placement.json"));
20
+ gondolinFleet.configure(options.remote);
21
+ gondolinJoin.configure(join(options.stateDir, "gondolin-gateway"));
22
+ gondolinGateway.configure(options.remote?.gateway);
23
+ if (options.requireRemote) {
24
+ assertRemoteConfigured();
25
+ }
26
+ }
27
+ //# sourceMappingURL=gondolin-bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gondolin-bootstrap.js","sourceRoot":"","sources":["../../src/sandbox/gondolin-bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAkB7D;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAiC;IACxE,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACjE,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACzE,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC,CAAC;IAChF,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACnE,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,sBAAsB,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC","sourcesContent":["import { join } from \"node:path\";\nimport type { GondolinRemoteSettings, ResourceLimits } from \"../types.js\";\nimport { assertRemoteConfigured, gondolinResources } from \"./gondolin.js\";\nimport { gondolinFleet } from \"./gondolin-fleet.js\";\nimport { gondolinGateway } from \"./gondolin-gateway.js\";\nimport { gondolinInventory } from \"./gondolin-inventory.js\";\nimport { gondolinJoin } from \"./gondolin-join.js\";\nimport { gondolinPlacements } from \"./gondolin-placement.js\";\n\nexport interface GondolinBootstrapOptions {\n /** Host-only state dir; inventory, placements, and gateway CA live under it. */\n stateDir: string;\n /** Default per-runtime resource limits. */\n limits?: ResourceLimits;\n /** Boosted limits applied while a runtime holds a boost. */\n boostLimits?: ResourceLimits;\n /** Remote fleet settings (workers, gateway); omit for local-only gondolin. */\n remote?: GondolinRemoteSettings;\n /**\n * Fail loudly when the remote profile is requested but no worker source is\n * configured, instead of discovering it on the first runtime ensure.\n */\n requireRemote?: boolean;\n}\n\n/**\n * Configure every gondolin runtime singleton for one process — resources,\n * inventory, placements, fleet, join, gateway — from one options object.\n * This is the managed-sandbox bootstrap seam: main.ts and embedders\n * (src/index.ts) call it before creating conversation runtimes with a\n * gondolin sandbox config; nothing else may call the individual configure()\n * methods outside tests.\n */\nexport function configureGondolinRuntime(options: GondolinBootstrapOptions): void {\n gondolinResources.configure(options.limits, options.boostLimits);\n gondolinInventory.configure(join(options.stateDir, \"gondolin-runtimes\"));\n gondolinPlacements.configure(join(options.stateDir, \"gondolin-placement.json\"));\n gondolinFleet.configure(options.remote);\n gondolinJoin.configure(join(options.stateDir, \"gondolin-gateway\"));\n gondolinGateway.configure(options.remote?.gateway);\n if (options.requireRemote) {\n assertRemoteConfigured();\n }\n}\n"]}
@@ -0,0 +1,125 @@
1
+ import { type Static } from "@sinclair/typebox";
2
+ /**
3
+ * Everything a worker process needs to host one Gondolin VM. Serialized as a
4
+ * single JSON argv entry by both spawners (the local TS worker client and
5
+ * the Go daemon's supervisor).
6
+ */
7
+ export declare const GondolinWorkerConfigSchema: import("@sinclair/typebox").TObject<{
8
+ /** mikan session key the runtime belongs to. */
9
+ instanceId: import("@sinclair/typebox").TString;
10
+ /** Resolved guest image asset directory. */
11
+ image: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
12
+ /** Image selector resolved inside the worker (remote workers, where the
13
+ * spawning host has no image store). Ignored when `image` is set. */
14
+ imageSelector: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
15
+ mounts: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
16
+ source: import("@sinclair/typebox").TString;
17
+ target: import("@sinclair/typebox").TString;
18
+ }>>;
19
+ cpus: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
20
+ memory: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
21
+ /** Desired-runtime fingerprint recorded for adoption checks. */
22
+ fingerprint: import("@sinclair/typebox").TString;
23
+ /** Runtime inventory directory (shared with the spawning mikan). */
24
+ inventoryDir: import("@sinclair/typebox").TString;
25
+ /** Self-stop when the mikan heartbeat file is older than this. 0 disables. */
26
+ heartbeatStaleMs: import("@sinclair/typebox").TNumber;
27
+ }>;
28
+ export type GondolinWorkerConfig = Static<typeof GondolinWorkerConfigSchema>;
29
+ /** First stdout line of a worker, consumed by both spawners. */
30
+ export declare const GondolinWorkerHandshakeSchema: import("@sinclair/typebox").TObject<{
31
+ ready: import("@sinclair/typebox").TBoolean;
32
+ error: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
33
+ sessionId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
34
+ socketPath: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
35
+ workerPid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
36
+ runnerPid: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TNumber, import("@sinclair/typebox").TNull]>>;
37
+ }>;
38
+ export type GondolinWorkerHandshake = Static<typeof GondolinWorkerHandshakeSchema>;
39
+ /**
40
+ * One `<sessionId>.json` inventory record, written by the worker process and
41
+ * read back by the TS inventory and the Go daemon's rediscovery.
42
+ */
43
+ export declare const GondolinRuntimeRecordSchema: import("@sinclair/typebox").TObject<{
44
+ /** Gondolin session id (`vm.id`); also names the record file. */
45
+ sessionId: import("@sinclair/typebox").TString;
46
+ /** mikan session key (vault key) the runtime was created for. */
47
+ instanceId: import("@sinclair/typebox").TString;
48
+ /** Process that owns the runtime (the worker process). */
49
+ ownerPid: import("@sinclair/typebox").TNumber;
50
+ /** Host pid of the active VM runner process (QEMU/krun), if started. */
51
+ runnerPid: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TNumber, import("@sinclair/typebox").TNull]>;
52
+ createdAt: import("@sinclair/typebox").TString;
53
+ /** Session IPC socket for adopting the runtime from a new mikan process. */
54
+ socketPath: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
55
+ /** Desired-runtime fingerprint the VM was created from. */
56
+ fingerprint: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
57
+ }>;
58
+ export type GondolinRuntimeRecord = Static<typeof GondolinRuntimeRecordSchema>;
59
+ export declare function isGondolinRuntimeRecord(value: unknown): value is GondolinRuntimeRecord;
60
+ /** A vault credential shipped by content on the ensure request (never a shared-fs mount). */
61
+ declare const GondolinCredentialFileSchema: import("@sinclair/typebox").TObject<{
62
+ target: import("@sinclair/typebox").TString;
63
+ contentBase64: import("@sinclair/typebox").TString;
64
+ }>;
65
+ export type GondolinCredentialFile = Static<typeof GondolinCredentialFileSchema>;
66
+ /** POST /v1/runtimes body sent to the remote worker daemon. */
67
+ export declare const GondolinEnsureRuntimeRequestSchema: import("@sinclair/typebox").TObject<{
68
+ instanceId: import("@sinclair/typebox").TString;
69
+ imageSelector: import("@sinclair/typebox").TString;
70
+ mounts: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
71
+ source: import("@sinclair/typebox").TString;
72
+ target: import("@sinclair/typebox").TString;
73
+ }>>;
74
+ credentialFiles: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
75
+ target: import("@sinclair/typebox").TString;
76
+ contentBase64: import("@sinclair/typebox").TString;
77
+ }>>;
78
+ /** Fractional cgroup CPU limit as a string; "" when unset. */
79
+ cpus: import("@sinclair/typebox").TString;
80
+ memory: import("@sinclair/typebox").TString;
81
+ fingerprint: import("@sinclair/typebox").TString;
82
+ /** Accepted by the daemon; the TS client currently leaves it unset (0). */
83
+ heartbeatStaleMs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
84
+ }>;
85
+ export type GondolinEnsureRuntimeRequest = Static<typeof GondolinEnsureRuntimeRequestSchema>;
86
+ /**
87
+ * One runtime as reported by the daemon (ensure response, GET, and the
88
+ * elements of the list response). The daemon's socketPath never crosses the
89
+ * wire — sessions reach the runtime through the tunnel, not the socket.
90
+ */
91
+ export declare const GondolinRemoteRuntimeSchema: import("@sinclair/typebox").TObject<{
92
+ sessionId: import("@sinclair/typebox").TString;
93
+ instanceId: import("@sinclair/typebox").TString;
94
+ fingerprint: import("@sinclair/typebox").TString;
95
+ workerPid: import("@sinclair/typebox").TNumber;
96
+ runnerPid: import("@sinclair/typebox").TNumber;
97
+ epoch: import("@sinclair/typebox").TNumber;
98
+ adopted: import("@sinclair/typebox").TBoolean;
99
+ }>;
100
+ export type GondolinRemoteRuntime = Static<typeof GondolinRemoteRuntimeSchema>;
101
+ /** POST /v1/leases response: a fenced, epoch-monotonic per-instance lease. */
102
+ export declare const GondolinLeaseGrantSchema: import("@sinclair/typebox").TObject<{
103
+ id: import("@sinclair/typebox").TString;
104
+ instanceId: import("@sinclair/typebox").TString;
105
+ epoch: import("@sinclair/typebox").TNumber;
106
+ /** RFC 3339 timestamp (Go time.Time marshalling). */
107
+ expiresAt: import("@sinclair/typebox").TString;
108
+ }>;
109
+ /** Structural shape of the JSON messages on the session protocol. */
110
+ export interface SessionFrameCallbacks {
111
+ onJson: (message: {
112
+ type: string;
113
+ id?: number;
114
+ exit_code?: number | null;
115
+ code?: string;
116
+ message?: string;
117
+ }) => void;
118
+ onBinary: (frame: Buffer) => void;
119
+ }
120
+ /** Parses the daemon-to-client session framing: u8 type + u32be length + payload. */
121
+ export declare function createSessionFrameParser(callbacks: SessionFrameCallbacks): (chunk: Buffer) => void;
122
+ /** Encodes a client-to-daemon session message: u32be length + JSON. */
123
+ export declare function encodeSessionMessage(message: object): Buffer;
124
+ export {};
125
+ //# sourceMappingURL=gondolin-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gondolin-contract.d.ts","sourceRoot":"","sources":["../../src/sandbox/gondolin-contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAuBtD;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;IACrC,gDAAgD;;IAEhD,4CAA4C;;IAE5C;yEACqE;;;;;;;;IAKrE,gEAAgE;;IAEhE,oEAAoE;;IAEpE,8EAA8E;;EAE9E,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE7E,gEAAgE;AAChE,eAAO,MAAM,6BAA6B;;;;;;;EAOxC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEnF;;;GAGG;AACH,eAAO,MAAM,2BAA2B;IACtC,iEAAiE;;IAEjE,iEAAiE;;IAEjE,0DAA0D;;IAE1D,wEAAwE;;;IAGxE,4EAA4E;;IAE5E,2DAA2D;;EAE3D,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAE/E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAYtF;AAED,6FAA6F;AAC7F,QAAA,MAAM,4BAA4B;;;EAGhC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAEjF,+DAA+D;AAC/D,eAAO,MAAM,kCAAkC;;;;;;;;;;;IAK7C,8DAA8D;;;;IAI9D,2EAA2E;;EAE3E,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAC,OAAO,kCAAkC,CAAC,CAAC;AAE7F;;;;GAIG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;EAQtC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAE/E,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB;;;;IAInC,qDAAqD;;EAErD,CAAC;AAOH,qEAAqE;AACrE,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,CAAC,OAAO,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,KAAK,IAAI,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,qFAAqF;AACrF,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,qBAAqB,GAC/B,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAqBzB;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAK5D"}
@@ -0,0 +1,155 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { isRecord } from "../utils/file-guards.js";
3
+ /**
4
+ * Single home for every wire shape that crosses the mikan ⇄ gondolin-worker
5
+ * boundary. The Go daemon mirrors these shapes by hand
6
+ * (worker/internal/runtime/supervisor.go, worker/internal/api/server.go,
7
+ * worker/internal/lease/lease.go); the shared fixtures under
8
+ * `worker/contract-fixtures/` pin both sides — the TS test
9
+ * (test/gondolin-contract.test.ts) checks each fixture against the schemas
10
+ * here, and the Go contract tests round-trip the same files through the Go
11
+ * structs. Add a field on one side only and one of those tests fails.
12
+ *
13
+ * Secrets never travel through these shapes: vault env rides per-exec over
14
+ * the session IPC socket, and credential files are shipped by content only
15
+ * on the authenticated ensure request.
16
+ */
17
+ const GondolinMountSchema = Type.Object({
18
+ source: Type.String(),
19
+ target: Type.String(),
20
+ });
21
+ /**
22
+ * Everything a worker process needs to host one Gondolin VM. Serialized as a
23
+ * single JSON argv entry by both spawners (the local TS worker client and
24
+ * the Go daemon's supervisor).
25
+ */
26
+ export const GondolinWorkerConfigSchema = Type.Object({
27
+ /** mikan session key the runtime belongs to. */
28
+ instanceId: Type.String(),
29
+ /** Resolved guest image asset directory. */
30
+ image: Type.Optional(Type.String()),
31
+ /** Image selector resolved inside the worker (remote workers, where the
32
+ * spawning host has no image store). Ignored when `image` is set. */
33
+ imageSelector: Type.Optional(Type.String()),
34
+ mounts: Type.Array(GondolinMountSchema),
35
+ cpus: Type.Optional(Type.Number()),
36
+ memory: Type.Optional(Type.String()),
37
+ /** Desired-runtime fingerprint recorded for adoption checks. */
38
+ fingerprint: Type.String(),
39
+ /** Runtime inventory directory (shared with the spawning mikan). */
40
+ inventoryDir: Type.String(),
41
+ /** Self-stop when the mikan heartbeat file is older than this. 0 disables. */
42
+ heartbeatStaleMs: Type.Number(),
43
+ });
44
+ /** First stdout line of a worker, consumed by both spawners. */
45
+ export const GondolinWorkerHandshakeSchema = Type.Object({
46
+ ready: Type.Boolean(),
47
+ error: Type.Optional(Type.String()),
48
+ sessionId: Type.Optional(Type.String()),
49
+ socketPath: Type.Optional(Type.String()),
50
+ workerPid: Type.Optional(Type.Number()),
51
+ runnerPid: Type.Optional(Type.Union([Type.Number(), Type.Null()])),
52
+ });
53
+ /**
54
+ * One `<sessionId>.json` inventory record, written by the worker process and
55
+ * read back by the TS inventory and the Go daemon's rediscovery.
56
+ */
57
+ export const GondolinRuntimeRecordSchema = Type.Object({
58
+ /** Gondolin session id (`vm.id`); also names the record file. */
59
+ sessionId: Type.String(),
60
+ /** mikan session key (vault key) the runtime was created for. */
61
+ instanceId: Type.String(),
62
+ /** Process that owns the runtime (the worker process). */
63
+ ownerPid: Type.Number(),
64
+ /** Host pid of the active VM runner process (QEMU/krun), if started. */
65
+ runnerPid: Type.Union([Type.Number(), Type.Null()]),
66
+ createdAt: Type.String(),
67
+ /** Session IPC socket for adopting the runtime from a new mikan process. */
68
+ socketPath: Type.Optional(Type.String()),
69
+ /** Desired-runtime fingerprint the VM was created from. */
70
+ fingerprint: Type.Optional(Type.String()),
71
+ });
72
+ export function isGondolinRuntimeRecord(value) {
73
+ return (isRecord(value) &&
74
+ typeof value.sessionId === "string" &&
75
+ value.sessionId.length > 0 &&
76
+ typeof value.instanceId === "string" &&
77
+ typeof value.ownerPid === "number" &&
78
+ (value.runnerPid === null || typeof value.runnerPid === "number") &&
79
+ typeof value.createdAt === "string" &&
80
+ (value.socketPath === undefined || typeof value.socketPath === "string") &&
81
+ (value.fingerprint === undefined || typeof value.fingerprint === "string"));
82
+ }
83
+ /** A vault credential shipped by content on the ensure request (never a shared-fs mount). */
84
+ const GondolinCredentialFileSchema = Type.Object({
85
+ target: Type.String(),
86
+ contentBase64: Type.String(),
87
+ });
88
+ /** POST /v1/runtimes body sent to the remote worker daemon. */
89
+ export const GondolinEnsureRuntimeRequestSchema = Type.Object({
90
+ instanceId: Type.String(),
91
+ imageSelector: Type.String(),
92
+ mounts: Type.Array(GondolinMountSchema),
93
+ credentialFiles: Type.Array(GondolinCredentialFileSchema),
94
+ /** Fractional cgroup CPU limit as a string; "" when unset. */
95
+ cpus: Type.String(),
96
+ memory: Type.String(),
97
+ fingerprint: Type.String(),
98
+ /** Accepted by the daemon; the TS client currently leaves it unset (0). */
99
+ heartbeatStaleMs: Type.Optional(Type.Number()),
100
+ });
101
+ /**
102
+ * One runtime as reported by the daemon (ensure response, GET, and the
103
+ * elements of the list response). The daemon's socketPath never crosses the
104
+ * wire — sessions reach the runtime through the tunnel, not the socket.
105
+ */
106
+ export const GondolinRemoteRuntimeSchema = Type.Object({
107
+ sessionId: Type.String(),
108
+ instanceId: Type.String(),
109
+ fingerprint: Type.String(),
110
+ workerPid: Type.Number(),
111
+ runnerPid: Type.Number(),
112
+ epoch: Type.Number(),
113
+ adopted: Type.Boolean(),
114
+ });
115
+ /** POST /v1/leases response: a fenced, epoch-monotonic per-instance lease. */
116
+ export const GondolinLeaseGrantSchema = Type.Object({
117
+ id: Type.String(),
118
+ instanceId: Type.String(),
119
+ epoch: Type.Number(),
120
+ /** RFC 3339 timestamp (Go time.Time marshalling). */
121
+ expiresAt: Type.String(),
122
+ });
123
+ /** Parses the daemon-to-client session framing: u8 type + u32be length + payload. */
124
+ export function createSessionFrameParser(callbacks) {
125
+ let buffer = Buffer.alloc(0);
126
+ return (chunk) => {
127
+ buffer = Buffer.concat([buffer, chunk]);
128
+ while (buffer.length >= 5) {
129
+ const type = buffer.readUInt8(0);
130
+ const length = buffer.readUInt32BE(1);
131
+ if (buffer.length < 5 + length)
132
+ return;
133
+ const payload = buffer.subarray(5, 5 + length);
134
+ buffer = buffer.subarray(5 + length);
135
+ if (type === 1) {
136
+ callbacks.onBinary(Buffer.from(payload));
137
+ continue;
138
+ }
139
+ try {
140
+ callbacks.onJson(JSON.parse(payload.toString("utf8")));
141
+ }
142
+ catch {
143
+ // ignore malformed frames
144
+ }
145
+ }
146
+ };
147
+ }
148
+ /** Encodes a client-to-daemon session message: u32be length + JSON. */
149
+ export function encodeSessionMessage(message) {
150
+ const payload = Buffer.from(JSON.stringify(message));
151
+ const header = Buffer.alloc(4);
152
+ header.writeUInt32BE(payload.length, 0);
153
+ return Buffer.concat([header, payload]);
154
+ }
155
+ //# sourceMappingURL=gondolin-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gondolin-contract.js","sourceRoot":"","sources":["../../src/sandbox/gondolin-contract.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\nimport { isRecord } from \"../utils/file-guards.js\";\n\n/**\n * Single home for every wire shape that crosses the mikan ⇄ gondolin-worker\n * boundary. The Go daemon mirrors these shapes by hand\n * (worker/internal/runtime/supervisor.go, worker/internal/api/server.go,\n * worker/internal/lease/lease.go); the shared fixtures under\n * `worker/contract-fixtures/` pin both sides — the TS test\n * (test/gondolin-contract.test.ts) checks each fixture against the schemas\n * here, and the Go contract tests round-trip the same files through the Go\n * structs. Add a field on one side only and one of those tests fails.\n *\n * Secrets never travel through these shapes: vault env rides per-exec over\n * the session IPC socket, and credential files are shipped by content only\n * on the authenticated ensure request.\n */\n\nconst GondolinMountSchema = Type.Object({\n source: Type.String(),\n target: Type.String(),\n});\n\n/**\n * Everything a worker process needs to host one Gondolin VM. Serialized as a\n * single JSON argv entry by both spawners (the local TS worker client and\n * the Go daemon's supervisor).\n */\nexport const GondolinWorkerConfigSchema = Type.Object({\n /** mikan session key the runtime belongs to. */\n instanceId: Type.String(),\n /** Resolved guest image asset directory. */\n image: Type.Optional(Type.String()),\n /** Image selector resolved inside the worker (remote workers, where the\n * spawning host has no image store). Ignored when `image` is set. */\n imageSelector: Type.Optional(Type.String()),\n mounts: Type.Array(GondolinMountSchema),\n cpus: Type.Optional(Type.Number()),\n memory: Type.Optional(Type.String()),\n /** Desired-runtime fingerprint recorded for adoption checks. */\n fingerprint: Type.String(),\n /** Runtime inventory directory (shared with the spawning mikan). */\n inventoryDir: Type.String(),\n /** Self-stop when the mikan heartbeat file is older than this. 0 disables. */\n heartbeatStaleMs: Type.Number(),\n});\n\nexport type GondolinWorkerConfig = Static<typeof GondolinWorkerConfigSchema>;\n\n/** First stdout line of a worker, consumed by both spawners. */\nexport const GondolinWorkerHandshakeSchema = Type.Object({\n ready: Type.Boolean(),\n error: Type.Optional(Type.String()),\n sessionId: Type.Optional(Type.String()),\n socketPath: Type.Optional(Type.String()),\n workerPid: Type.Optional(Type.Number()),\n runnerPid: Type.Optional(Type.Union([Type.Number(), Type.Null()])),\n});\n\nexport type GondolinWorkerHandshake = Static<typeof GondolinWorkerHandshakeSchema>;\n\n/**\n * One `<sessionId>.json` inventory record, written by the worker process and\n * read back by the TS inventory and the Go daemon's rediscovery.\n */\nexport const GondolinRuntimeRecordSchema = Type.Object({\n /** Gondolin session id (`vm.id`); also names the record file. */\n sessionId: Type.String(),\n /** mikan session key (vault key) the runtime was created for. */\n instanceId: Type.String(),\n /** Process that owns the runtime (the worker process). */\n ownerPid: Type.Number(),\n /** Host pid of the active VM runner process (QEMU/krun), if started. */\n runnerPid: Type.Union([Type.Number(), Type.Null()]),\n createdAt: Type.String(),\n /** Session IPC socket for adopting the runtime from a new mikan process. */\n socketPath: Type.Optional(Type.String()),\n /** Desired-runtime fingerprint the VM was created from. */\n fingerprint: Type.Optional(Type.String()),\n});\n\nexport type GondolinRuntimeRecord = Static<typeof GondolinRuntimeRecordSchema>;\n\nexport function isGondolinRuntimeRecord(value: unknown): value is GondolinRuntimeRecord {\n return (\n isRecord(value) &&\n typeof value.sessionId === \"string\" &&\n value.sessionId.length > 0 &&\n typeof value.instanceId === \"string\" &&\n typeof value.ownerPid === \"number\" &&\n (value.runnerPid === null || typeof value.runnerPid === \"number\") &&\n typeof value.createdAt === \"string\" &&\n (value.socketPath === undefined || typeof value.socketPath === \"string\") &&\n (value.fingerprint === undefined || typeof value.fingerprint === \"string\")\n );\n}\n\n/** A vault credential shipped by content on the ensure request (never a shared-fs mount). */\nconst GondolinCredentialFileSchema = Type.Object({\n target: Type.String(),\n contentBase64: Type.String(),\n});\n\nexport type GondolinCredentialFile = Static<typeof GondolinCredentialFileSchema>;\n\n/** POST /v1/runtimes body sent to the remote worker daemon. */\nexport const GondolinEnsureRuntimeRequestSchema = Type.Object({\n instanceId: Type.String(),\n imageSelector: Type.String(),\n mounts: Type.Array(GondolinMountSchema),\n credentialFiles: Type.Array(GondolinCredentialFileSchema),\n /** Fractional cgroup CPU limit as a string; \"\" when unset. */\n cpus: Type.String(),\n memory: Type.String(),\n fingerprint: Type.String(),\n /** Accepted by the daemon; the TS client currently leaves it unset (0). */\n heartbeatStaleMs: Type.Optional(Type.Number()),\n});\n\nexport type GondolinEnsureRuntimeRequest = Static<typeof GondolinEnsureRuntimeRequestSchema>;\n\n/**\n * One runtime as reported by the daemon (ensure response, GET, and the\n * elements of the list response). The daemon's socketPath never crosses the\n * wire — sessions reach the runtime through the tunnel, not the socket.\n */\nexport const GondolinRemoteRuntimeSchema = Type.Object({\n sessionId: Type.String(),\n instanceId: Type.String(),\n fingerprint: Type.String(),\n workerPid: Type.Number(),\n runnerPid: Type.Number(),\n epoch: Type.Number(),\n adopted: Type.Boolean(),\n});\n\nexport type GondolinRemoteRuntime = Static<typeof GondolinRemoteRuntimeSchema>;\n\n/** POST /v1/leases response: a fenced, epoch-monotonic per-instance lease. */\nexport const GondolinLeaseGrantSchema = Type.Object({\n id: Type.String(),\n instanceId: Type.String(),\n epoch: Type.Number(),\n /** RFC 3339 timestamp (Go time.Time marshalling). */\n expiresAt: Type.String(),\n});\n\n// ── session tunnel framing ────────────────────────────────────────────────────\n// The session protocol itself is TS⇄TS (worker session server ⇄ client); the\n// Go daemon splices it byte-for-byte through the upgraded tunnel. The framing\n// still lives here because it is part of the boundary a transport must carry.\n\n/** Structural shape of the JSON messages on the session protocol. */\nexport interface SessionFrameCallbacks {\n onJson: (message: {\n type: string;\n id?: number;\n exit_code?: number | null;\n code?: string;\n message?: string;\n }) => void;\n onBinary: (frame: Buffer) => void;\n}\n\n/** Parses the daemon-to-client session framing: u8 type + u32be length + payload. */\nexport function createSessionFrameParser(\n callbacks: SessionFrameCallbacks,\n): (chunk: Buffer) => void {\n let buffer = Buffer.alloc(0);\n return (chunk: Buffer) => {\n buffer = Buffer.concat([buffer, chunk]);\n while (buffer.length >= 5) {\n const type = buffer.readUInt8(0);\n const length = buffer.readUInt32BE(1);\n if (buffer.length < 5 + length) return;\n const payload = buffer.subarray(5, 5 + length);\n buffer = buffer.subarray(5 + length);\n if (type === 1) {\n callbacks.onBinary(Buffer.from(payload));\n continue;\n }\n try {\n callbacks.onJson(JSON.parse(payload.toString(\"utf8\")));\n } catch {\n // ignore malformed frames\n }\n }\n };\n}\n\n/** Encodes a client-to-daemon session message: u32be length + JSON. */\nexport function encodeSessionMessage(message: object): Buffer {\n const payload = Buffer.from(JSON.stringify(message));\n const header = Buffer.alloc(4);\n header.writeUInt32BE(payload.length, 0);\n return Buffer.concat([header, payload]);\n}\n"]}
@@ -0,0 +1,104 @@
1
+ import type { GondolinRemoteSettings, GondolinRemoteWorkerSettings } from "../types.js";
2
+ import { type GondolinPlacementStore } from "./gondolin-placement.js";
3
+ import { type GondolinRemoteOverrides } from "./gondolin-remote.js";
4
+ import type { GondolinRuntimeHandle, GondolinRuntimeSpec, GondolinRuntimeTransport } from "./gondolin-worker-client.js";
5
+ import type { ExecResult } from "./types.js";
6
+ /** The connection surface the fleet needs from each worker. */
7
+ export interface GondolinWorkerConnection {
8
+ health(): Promise<Record<string, unknown>>;
9
+ ensure(instanceId: string, spec: GondolinRuntimeSpec): Promise<GondolinRuntimeHandle>;
10
+ stop(handle: Pick<GondolinRuntimeHandle, "workerPid" | "sessionId" | "instanceId">): Promise<void>;
11
+ exec(handle: GondolinRuntimeHandle, command: string, options?: {
12
+ env?: Record<string, string>;
13
+ signal?: AbortSignal;
14
+ }): Promise<ExecResult>;
15
+ isRuntimeAlive(handle: GondolinRuntimeHandle): Promise<boolean>;
16
+ listRuntimes(): Promise<Array<{
17
+ sessionId: string;
18
+ instanceId: string;
19
+ }>>;
20
+ dispose(): void;
21
+ }
22
+ interface GondolinFleetOverrides {
23
+ createConnection?: (worker: GondolinRemoteWorkerSettings, connectionOverrides: GondolinRemoteOverrides) => GondolinWorkerConnection;
24
+ placements?: GondolinPlacementStore;
25
+ connectionOverrides?: GondolinRemoteOverrides;
26
+ now?: () => number;
27
+ queuePollMs?: number;
28
+ sleep?: (ms: number) => Promise<void>;
29
+ }
30
+ /**
31
+ * Places each conversation's runtime on one worker of the fleet and keeps it
32
+ * there (sticky placement). Failover to another worker happens only when the
33
+ * placed worker is unreachable AND its lease fencing watermark has passed —
34
+ * the point after which the old worker's janitor has provably stopped the
35
+ * runtime, so shared storage never sees two writers.
36
+ */
37
+ declare class GondolinFleetClient implements GondolinRuntimeTransport {
38
+ private settings?;
39
+ private workers;
40
+ private connectionOverrides;
41
+ private placements;
42
+ private leaseTtlMs;
43
+ private queueWaitMs;
44
+ private queuePollMs;
45
+ private now;
46
+ private sleep;
47
+ configure(settings?: GondolinRemoteSettings, overrides?: GondolinFleetOverrides): void;
48
+ isConfigured(): boolean;
49
+ /** Names of statically-configured workers with no workspaceRoot (startup guard). */
50
+ workersMissingWorkspaceRoot(): string[];
51
+ /**
52
+ * Attach a dial-home worker at runtime (the gateway calls this when a
53
+ * worker registers). The factory receives the fleet's connection overrides
54
+ * plus the lease-watermark callback, mirroring configure()'s wiring.
55
+ */
56
+ attachWorker(settings: GondolinRemoteWorkerSettings, createConnection: (overrides: GondolinRemoteOverrides) => GondolinWorkerConnection): void;
57
+ /**
58
+ * Record a worker's shared-workspace health (the gateway pushes this from
59
+ * register and ping frames). A degraded worker keeps its runtimes and its
60
+ * connection, but new placements skip it and runtime operations fail fast
61
+ * with the probe's diagnosis instead of hanging on a dead mount.
62
+ */
63
+ setWorkspaceHealth(name: string, error?: string): void;
64
+ /**
65
+ * Detach a dial-home worker (disconnect). Placements survive: their lease
66
+ * watermarks keep fencing failover until expiry, exactly as for an
67
+ * unreachable static worker.
68
+ */
69
+ detachWorker(name: string): void;
70
+ imageSelector(): string | undefined;
71
+ /** At least one worker must answer for the sandbox mode to come up. */
72
+ health(): Promise<Array<{
73
+ worker: string;
74
+ health?: Record<string, unknown>;
75
+ }>>;
76
+ ensure(instanceId: string, spec: GondolinRuntimeSpec): Promise<GondolinRuntimeHandle>;
77
+ stop(handle: Pick<GondolinRuntimeHandle, "workerPid" | "sessionId" | "instanceId" | "workerName">): Promise<void>;
78
+ exec(handle: GondolinRuntimeHandle, command: string, options?: {
79
+ env?: Record<string, string>;
80
+ signal?: AbortSignal;
81
+ }): Promise<ExecResult>;
82
+ isRuntimeAlive(handle: GondolinRuntimeHandle): Promise<boolean>;
83
+ /**
84
+ * Fleet reconciliation: a runtime whose conversation is placed on a
85
+ * different worker is a stray from a superseded placement — stop it. A
86
+ * runtime with no placement at all (crash between daemon ensure and the
87
+ * placement write) is adopted instead of killed.
88
+ */
89
+ reconcile(): Promise<void>;
90
+ private ensureOn;
91
+ /**
92
+ * Fail fast — with the probe's diagnosis — instead of dispatching work that
93
+ * would hang on a dead shared-workspace mount. Deliberately NOT a
94
+ * GondolinWorkerUnreachableError: a broken mount must not trigger failover,
95
+ * because the workspace is shared and likely broken for every worker.
96
+ */
97
+ private assertWorkspaceUsable;
98
+ private assertFailoverAllowed;
99
+ private selectWorker;
100
+ private workerFor;
101
+ }
102
+ export declare const gondolinFleet: GondolinFleetClient;
103
+ export {};
104
+ //# sourceMappingURL=gondolin-fleet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gondolin-fleet.d.ts","sourceRoot":"","sources":["../../src/sandbox/gondolin-fleet.ts"],"names":[],"mappings":"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"}