@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
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  export { defaultCommandHandlers, dispatchCommand } from "./commands/registry.js";
2
2
  export * from "./harness/index.js";
3
- export * from "./sessions/agent-memory-file-manager.js";
3
+ export * from "./sessions/chat-history-sync.js";
4
4
  export * from "./sessions/metadata.js";
5
5
  export * from "./sessions/policy.js";
6
6
  export * from "./sessions/store.js";
7
7
  export { createConversationRuntime, } from "./runtime/conversation-runtime.js";
8
- export { SandboxError, createExecutor, getSandboxAdapters, parseSandboxArg, validateSandbox, } from "./sandbox/index.js";
8
+ export { SandboxError, configureGondolinRuntime, createExecutor, getSandboxAdapters, parseSandboxArg, validateSandbox, } from "./sandbox/index.js";
9
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACjF,cAAc,oBAAoB,CAAC;AAEnC,cAAc,yCAAyC,CAAC;AACxD,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,yBAAyB,GAK1B,MAAM,mCAAmC,CAAC;AAc3C,OAAO,EACL,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,oBAAoB,CAAC","sourcesContent":["export { defaultCommandHandlers, dispatchCommand } from \"./commands/registry.js\";\nexport * from \"./harness/index.js\";\nexport type { CommandContext, CommandHandler, CommandServices } from \"./commands/types.js\";\nexport * from \"./sessions/agent-memory-file-manager.js\";\nexport * from \"./sessions/metadata.js\";\nexport * from \"./sessions/policy.js\";\nexport * from \"./sessions/store.js\";\nexport {\n createConversationRuntime,\n type CreateSessionSandboxOptions,\n type RunSessionOptions,\n type ConversationRuntime,\n type ConversationRuntimeOptions,\n} from \"./runtime/conversation-runtime.js\";\nexport type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n ChatAdapter,\n ConversationMessage,\n ConversationResponder,\n ChatToolResult,\n ConversationKind,\n MessagingInfo,\n RunningSession,\n} from \"./adapter.js\";\nexport {\n SandboxError,\n createExecutor,\n getSandboxAdapters,\n parseSandboxArg,\n validateSandbox,\n} from \"./sandbox/index.js\";\nexport type {\n CloudflareSandboxConfig,\n ExecOptions,\n ExecResult,\n Executor,\n SandboxAdapter,\n SandboxConfig,\n} from \"./sandbox/index.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACjF,cAAc,oBAAoB,CAAC;AAEnC,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,yBAAyB,GAI1B,MAAM,mCAAmC,CAAC;AAc3C,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,eAAe,GAEhB,MAAM,oBAAoB,CAAC","sourcesContent":["export { defaultCommandHandlers, dispatchCommand } from \"./commands/registry.js\";\nexport * from \"./harness/index.js\";\nexport type { CommandContext, CommandHandler, CommandServices } from \"./commands/types.js\";\nexport * from \"./sessions/chat-history-sync.js\";\nexport * from \"./sessions/metadata.js\";\nexport * from \"./sessions/policy.js\";\nexport * from \"./sessions/store.js\";\nexport {\n createConversationRuntime,\n type RunSessionOptions,\n type ConversationRuntime,\n type ConversationRuntimeOptions,\n} from \"./runtime/conversation-runtime.js\";\nexport type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n ChatAdapter,\n ConversationMessage,\n ConversationResponder,\n ChatToolResult,\n ConversationKind,\n MessagingInfo,\n RunningSession,\n} from \"./adapter.js\";\nexport {\n SandboxError,\n configureGondolinRuntime,\n createExecutor,\n getSandboxAdapters,\n parseSandboxArg,\n validateSandbox,\n type GondolinBootstrapOptions,\n} from \"./sandbox/index.js\";\nexport type {\n CloudflareSandboxConfig,\n ExecOptions,\n ExecResult,\n Executor,\n SandboxAdapter,\n SandboxConfig,\n} from \"./sandbox/index.js\";\n"]}
package/dist/main.js CHANGED
@@ -1,14 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import "./observability/instrument.js";
3
- import { join, resolve } from "path";
3
+ import { join } from "path";
4
4
  import { mkdirSync, statSync, writeFileSync } from "fs";
5
- import { homedir } from "os";
6
5
  import { fileURLToPath } from "url";
7
6
  import { dirname, join as pathJoin } from "path";
8
7
  import { DiscordMessagingBot } from "./adapters/discord/bot.js";
8
+ import { GithubMessagingBot } from "./adapters/github/bot.js";
9
+ import { createGithubToolPack } from "./adapters/github/tool-pack.js";
10
+ import { GcpTokenProvider } from "./adapters/github/gcp-auth.js";
9
11
  import { TelegramMessagingBot } from "./adapters/telegram/bot.js";
10
12
  import { SlackMessagingBot as SlackMessagingBotClass } from "./adapters/slack/bot.js";
11
- import { downloadChannel } from "./download.js";
13
+ import { downloadChannel } from "./cli/download.js";
12
14
  import { EventsWatcher } from "./events.js";
13
15
  import * as log from "./log.js";
14
16
  import { startWebServer } from "./web/server.js";
@@ -16,13 +18,23 @@ import { InMemoryAdminTokenStore } from "./web/admin/store.js";
16
18
  import { InMemoryLinkTokenStore } from "./web/login/store.js";
17
19
  import { InMemorySessionViewTokenStore } from "./web/session-view/store.js";
18
20
  import { DockerContainerManager } from "./provisioner.js";
19
- import { assertStateDirOutsideWorkspace, createGlobalSettingsFile, loadGlobalSettings, MissingGlobalSettingsError, } from "./config.js";
21
+ import { assertStateDirOutsideWorkspace, createGlobalSettingsFile, loadGlobalSettings, MissingGlobalSettingsError, resolveLinkBaseUrl, } from "./config.js";
20
22
  import { configureHttpDispatcher, defaultAuthPath, defaultModelsJsonPath, parseHttpIdleTimeoutMs, } from "./harness/index.js";
21
23
  import { existsSync, readFileSync } from "fs";
22
24
  import { readEnv, setEnvAliases } from "./utils/env.js";
23
25
  import { ensureDirExists, isRecord, readJsonFileIfExists } from "./utils/file-guards.js";
24
- import { SandboxError, parseSandboxArg, validateSandbox, } from "./sandbox/index.js";
26
+ import { SandboxError, validateSandbox } from "./sandbox/index.js";
27
+ import { helpText, resolveBoot } from "./cli/boot.js";
28
+ import { envReport, noPlatformsMessage, platformIsActive } from "./env-manifest.js";
29
+ import { disconnectAllGondolinRuntimes, gondolinResources, stopIdleGondolinVms, sweepUnadoptedGondolinWorkers, } from "./sandbox/gondolin.js";
30
+ import { configureGondolinRuntime } from "./sandbox/gondolin-bootstrap.js";
31
+ import { gondolinInventory } from "./sandbox/gondolin-inventory.js";
32
+ import { gondolinFleet } from "./sandbox/gondolin-fleet.js";
33
+ import { gondolinGateway } from "./sandbox/gondolin-gateway.js";
34
+ import { gondolinJoin } from "./sandbox/gondolin-join.js";
35
+ import { checkWorkspaceExported } from "./sandbox/gondolin-nfs-advisory.js";
25
36
  import { FileVaultManager } from "./vault/index.js";
37
+ import { runExtCommand } from "./cli/ext.js";
26
38
  import { createConversationRuntime } from "./runtime/conversation-runtime.js";
27
39
  import { ChannelStore } from "./store.js";
28
40
  import * as Sentry from "@sentry/node";
@@ -44,56 +56,19 @@ const SLACK_APP_TOKEN = readEnv("SLACK_APP_TOKEN");
44
56
  const SLACK_BOT_TOKEN = readEnv("SLACK_BOT_TOKEN");
45
57
  const TELEGRAM_BOT_TOKEN = readEnv("TELEGRAM_BOT_TOKEN");
46
58
  const DISCORD_BOT_TOKEN = readEnv("DISCORD_BOT_TOKEN");
47
- const LINK_URL = readEnv("LINK_URL");
59
+ const GITHUB_APP_ID = readEnv("GITHUB_APP_ID");
60
+ const GITHUB_APP_PRIVATE_KEY = readEnv("GITHUB_APP_PRIVATE_KEY");
61
+ const GITHUB_APP_PRIVATE_KEY_PATH = readEnv("GITHUB_APP_PRIVATE_KEY_PATH");
62
+ const GITHUB_INSTALLATION_ID = readEnv("GITHUB_INSTALLATION_ID");
63
+ const GITHUB_REPOS = readEnv("GITHUB_REPOS");
64
+ const GITHUB_POLL_INTERVAL = readEnv("GITHUB_POLL_INTERVAL");
65
+ const GOOGLE_APPLICATION_CREDENTIALS = readEnv("GOOGLE_APPLICATION_CREDENTIALS");
66
+ const GOOGLE_CLOUD_PROJECT = readEnv("GOOGLE_CLOUD_PROJECT");
67
+ // Externally-visible base URL of the link/OAuth server; the env read and
68
+ // trailing-slash normalization live in config.resolveLinkBaseUrl.
69
+ const LINK_BASE_URL = resolveLinkBaseUrl();
48
70
  const LINK_PORT_RAW = readEnv("LINK_PORT");
49
- const LINK_PORT = LINK_PORT_RAW ? parseInt(LINK_PORT_RAW, 10) : LINK_URL ? 8181 : undefined;
50
- function parseArgs() {
51
- const args = process.argv.slice(2);
52
- let sandbox = { type: "host" };
53
- let workingDir;
54
- let stateDirArg;
55
- let downloadChannelId;
56
- let showOnboard = false;
57
- let showVersion = false;
58
- for (let i = 0; i < args.length; i++) {
59
- const arg = args[i];
60
- if (arg === "--version" || arg === "-v" || arg === "-V") {
61
- showVersion = true;
62
- }
63
- else if (arg === "--onboard") {
64
- showOnboard = true;
65
- }
66
- else if (arg.startsWith("--sandbox=")) {
67
- sandbox = parseSandboxArg(arg.slice("--sandbox=".length));
68
- }
69
- else if (arg === "--sandbox") {
70
- sandbox = parseSandboxArg(args[++i] || "");
71
- }
72
- else if (arg.startsWith("--state-dir=")) {
73
- stateDirArg = arg.slice("--state-dir=".length);
74
- }
75
- else if (arg === "--state-dir") {
76
- stateDirArg = args[++i];
77
- }
78
- else if (arg.startsWith("--download=")) {
79
- downloadChannelId = arg.slice("--download=".length);
80
- }
81
- else if (arg === "--download") {
82
- downloadChannelId = args[++i];
83
- }
84
- else if (!arg.startsWith("-")) {
85
- workingDir = arg;
86
- }
87
- }
88
- return {
89
- workingDir: workingDir ? resolve(workingDir) : undefined,
90
- stateDir: stateDirArg ? resolve(stateDirArg) : undefined,
91
- sandbox,
92
- downloadChannel: downloadChannelId,
93
- showOnboard,
94
- showVersion,
95
- };
96
- }
71
+ const LINK_PORT = LINK_PORT_RAW ? parseInt(LINK_PORT_RAW, 10) : LINK_BASE_URL ? 8181 : undefined;
97
72
  const WORLD_WRITABLE_MODE = 0o002;
98
73
  function ensureSecureStateDir(path) {
99
74
  let stat;
@@ -149,31 +124,79 @@ function handleStartupError(error) {
149
124
  console.error(String(error));
150
125
  process.exit(1);
151
126
  }
152
- let parsedArgs;
127
+ let plan;
153
128
  try {
154
- parsedArgs = parseArgs();
129
+ plan = resolveBoot();
155
130
  }
156
131
  catch (error) {
157
132
  handleStartupError(error);
158
133
  }
134
+ // `mikan ext …` manages extensions and exits; handle it before the normal
135
+ // bot-mode startup (which requires platform tokens).
136
+ if (plan.mode === "ext") {
137
+ const code = await runExtCommand(plan.extArgs ?? []);
138
+ process.exit(code);
139
+ }
159
140
  // Global fetch: proxy support (HTTP_PROXY/HTTPS_PROXY/NO_PROXY) and idle
160
141
  // timeouts so a stalled LLM stream errors out instead of hanging a session.
161
142
  const httpIdleTimeoutMs = parseHttpIdleTimeoutMs(readEnv("HTTP_IDLE_TIMEOUT"));
162
143
  configureHttpDispatcher(httpIdleTimeoutMs);
163
- // Handle --version
164
- if (parsedArgs.showVersion) {
144
+ if (plan.mode === "help") {
145
+ console.log(helpText());
146
+ process.exit(0);
147
+ }
148
+ if (plan.mode === "env") {
149
+ console.log(envReport());
150
+ process.exit(0);
151
+ }
152
+ if (plan.mode === "version") {
165
153
  console.log(getVersion());
166
154
  process.exit(0);
167
155
  }
156
+ // Handle --worker-token: mint a one-time join token for a dial-home worker
157
+ if (plan.mode === "worker-token") {
158
+ const stateDir = plan.stateDir;
159
+ setEnvAliases("STATE_DIR", stateDir);
160
+ ensureSecureStateDir(stateDir);
161
+ gondolinJoin.configure(join(stateDir, "gondolin-gateway"));
162
+ try {
163
+ let gatewayPort = 8433;
164
+ let gatewayHost;
165
+ try {
166
+ const gateway = loadGlobalSettings().sandbox?.gondolin?.remote?.gateway;
167
+ if (gateway) {
168
+ gatewayPort = gateway.port;
169
+ gatewayHost = gateway.hostnames?.[0];
170
+ }
171
+ }
172
+ catch {
173
+ // settings are optional for minting; the CA lives in the state dir
174
+ }
175
+ const minted = await gondolinJoin.mintToken();
176
+ const host = gatewayHost ?? "<mikan-host>";
177
+ console.log("Worker join token (single use, expires in 15 minutes):");
178
+ console.log("");
179
+ console.log(` mikan-worker join https://${host}:${gatewayPort} \\`);
180
+ console.log(` --token ${minted.token} \\`);
181
+ console.log(` --ca-pin ${minted.fingerprint} \\`);
182
+ console.log(` --name <worker-name> --workspace-root <shared-workspace-path> \\`);
183
+ console.log(` --worker-entry /opt/mikan/dist/sandbox/gondolin-worker-main.js`);
184
+ process.exit(0);
185
+ }
186
+ catch (err) {
187
+ console.error(err instanceof Error ? err.message : String(err));
188
+ process.exit(1);
189
+ }
190
+ }
168
191
  // Handle --onboard mode
169
- if (parsedArgs.showOnboard) {
170
- const stateDir = parsedArgs.stateDir ?? join(homedir(), ".mikan");
192
+ if (plan.mode === "onboard") {
193
+ const stateDir = plan.stateDir;
171
194
  setEnvAliases("STATE_DIR", stateDir);
172
195
  ensureSecureStateDir(stateDir);
173
196
  try {
174
197
  const settingsPath = createGlobalSettingsFile(stateDir);
175
198
  console.log(`Created global settings at ${settingsPath}`);
176
- console.log("Review the file, then start mikan with your working directory.");
199
+ console.log(`Review the file, then start mikan (workspace defaults to ${join(stateDir, "workspace")}).`);
177
200
  process.exit(0);
178
201
  }
179
202
  catch (err) {
@@ -182,40 +205,36 @@ if (parsedArgs.showOnboard) {
182
205
  }
183
206
  }
184
207
  // Handle --download mode (Slack only)
185
- if (parsedArgs.downloadChannel) {
208
+ if (plan.mode === "download" && plan.downloadChannel) {
186
209
  if (!SLACK_BOT_TOKEN) {
187
210
  console.error("Missing env: SLACK_BOT_TOKEN");
188
211
  process.exit(1);
189
212
  }
190
- await downloadChannel(parsedArgs.downloadChannel, SLACK_BOT_TOKEN);
213
+ await downloadChannel(plan.downloadChannel, SLACK_BOT_TOKEN);
191
214
  process.exit(0);
192
215
  }
193
- // Normal bot mode - require working dir
194
- if (!parsedArgs.workingDir) {
195
- console.error("Usage: mikan [--state-dir=<dir>] [--sandbox=host|container:<name>|image:<image>|firecracker:<vm-id>:<host-path>|cloudflare:<sandbox-id>] <working-directory>");
196
- console.error(" mikan --onboard [--state-dir=<dir>]");
197
- console.error(" mikan --download <channel-id>");
198
- process.exit(1);
199
- }
200
- const { workingDir, sandbox } = { workingDir: parsedArgs.workingDir, sandbox: parsedArgs.sandbox };
201
- const stateDir = parsedArgs.stateDir ?? join(homedir(), ".mikan");
216
+ // Normal bot mode - working dir is optional and defaults under the state dir
217
+ const sandbox = plan.sandbox;
218
+ const stateDir = plan.stateDir;
219
+ const workingDir = plan.workingDir;
202
220
  setEnvAliases("STATE_DIR", stateDir);
203
221
  ensureSecureStateDir(stateDir);
222
+ if (!plan.workingDirExplicit) {
223
+ ensureDirExists(workingDir);
224
+ }
204
225
  try {
205
226
  assertStateDirOutsideWorkspace(stateDir, workingDir, sandbox.type);
206
227
  }
207
228
  catch (error) {
208
229
  handleStartupError(error);
209
230
  }
210
- // Validate platform tokens
211
- const hasSlack = !!(SLACK_APP_TOKEN && SLACK_BOT_TOKEN);
212
- const hasTelegram = !!TELEGRAM_BOT_TOKEN;
213
- const hasDiscord = !!DISCORD_BOT_TOKEN;
214
- if (!hasSlack && !hasTelegram && !hasDiscord) {
215
- console.error("No platform tokens found. Set one of:\n" +
216
- " Slack: SLACK_APP_TOKEN + SLACK_BOT_TOKEN\n" +
217
- " Telegram: TELEGRAM_BOT_TOKEN\n" +
218
- " Discord: DISCORD_BOT_TOKEN");
231
+ // Validate platform tokens — activation rules live in the env manifest.
232
+ const hasSlack = platformIsActive("slack");
233
+ const hasTelegram = platformIsActive("telegram");
234
+ const hasDiscord = platformIsActive("discord");
235
+ const hasGithub = platformIsActive("github");
236
+ if (!hasSlack && !hasTelegram && !hasDiscord && !hasGithub) {
237
+ console.error(noPlatformsMessage());
219
238
  process.exit(1);
220
239
  }
221
240
  try {
@@ -228,7 +247,10 @@ const vaultManager = new FileVaultManager(stateDir);
228
247
  if (vaultManager.isEnabled()) {
229
248
  console.log(sandbox.type === "container"
230
249
  ? " Vault system enabled. Container vault active."
231
- : sandbox.type === "image" || sandbox.type === "firecracker" || sandbox.type === "cloudflare"
250
+ : sandbox.type === "image" ||
251
+ sandbox.type === "gondolin" ||
252
+ sandbox.type === "firecracker" ||
253
+ sandbox.type === "cloudflare"
232
254
  ? " Vault system enabled. Conversation-scoped credential routing active."
233
255
  : " Vault system enabled. Host mode will not inject vault env.");
234
256
  }
@@ -240,11 +262,12 @@ const startupConfig = (() => {
240
262
  handleStartupError(error);
241
263
  }
242
264
  })();
243
- const sandboxLimits = startupConfig.sandboxCpus || startupConfig.sandboxMemory
244
- ? { cpus: startupConfig.sandboxCpus, memory: startupConfig.sandboxMemory }
265
+ const sandboxSettings = startupConfig.sandbox;
266
+ const sandboxLimits = sandboxSettings?.cpus || sandboxSettings?.memory
267
+ ? { cpus: sandboxSettings?.cpus, memory: sandboxSettings?.memory }
245
268
  : undefined;
246
- const sandboxBoostLimits = startupConfig.sandboxBoostCpus || startupConfig.sandboxBoostMemory
247
- ? { cpus: startupConfig.sandboxBoostCpus, memory: startupConfig.sandboxBoostMemory }
269
+ const sandboxBoostLimits = sandboxSettings?.boost?.cpus || sandboxSettings?.boost?.memory
270
+ ? { cpus: sandboxSettings?.boost?.cpus, memory: sandboxSettings?.boost?.memory }
248
271
  : undefined;
249
272
  const provisioner = sandbox.type === "image"
250
273
  ? new DockerContainerManager(sandbox.image, {
@@ -252,7 +275,26 @@ const provisioner = sandbox.type === "image"
252
275
  boostLimits: sandboxBoostLimits,
253
276
  })
254
277
  : undefined;
255
- if (sandbox.type === "image") {
278
+ if (sandbox.type === "gondolin") {
279
+ try {
280
+ configureGondolinRuntime({
281
+ stateDir,
282
+ limits: sandboxLimits,
283
+ boostLimits: sandboxBoostLimits,
284
+ remote: sandboxSettings?.gondolin?.remote,
285
+ requireRemote: sandbox.profile === "remote",
286
+ });
287
+ }
288
+ catch (error) {
289
+ handleStartupError(error);
290
+ }
291
+ }
292
+ const resourceController = sandbox.type === "image"
293
+ ? provisioner
294
+ : sandbox.type === "gondolin"
295
+ ? gondolinResources
296
+ : undefined;
297
+ if (sandbox.type === "image" || sandbox.type === "gondolin") {
256
298
  ensureDirExists(join(workingDir, "skills"));
257
299
  ensureDirExists(join(workingDir, "events"));
258
300
  try {
@@ -270,50 +312,119 @@ setInterval(() => linkTokenStore.purge(), 5 * 60 * 1000).unref();
270
312
  setInterval(() => sessionViewTokenStore.purge(), 5 * 60 * 1000).unref();
271
313
  setInterval(() => adminTokenStore.purge(), 5 * 60 * 1000).unref();
272
314
  function portalBaseUrl() {
273
- if (LINK_URL)
274
- return LINK_URL.replace(/\/+$/, "");
315
+ if (LINK_BASE_URL)
316
+ return LINK_BASE_URL;
275
317
  if (LINK_PORT)
276
318
  return `http://localhost:${LINK_PORT}`;
277
319
  return undefined;
278
320
  }
279
- /** Idle timeout for managed image containers (10 minutes) */
280
- const IMAGE_IDLE_TIMEOUT_MS = 10 * 60 * 1000;
321
+ /** Idle timeout for managed sandboxes (10 minutes) */
322
+ const MANAGED_SANDBOX_IDLE_TIMEOUT_MS = 10 * 60 * 1000;
281
323
  if (provisioner) {
282
324
  await provisioner.reconcile();
283
- await provisioner.stopIdle(IMAGE_IDLE_TIMEOUT_MS);
284
- setInterval(() => provisioner.stopIdle(IMAGE_IDLE_TIMEOUT_MS), IMAGE_IDLE_TIMEOUT_MS).unref();
325
+ await provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);
326
+ setInterval(() => provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS), MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();
327
+ }
328
+ if (sandbox.type === "gondolin" && sandbox.profile === "remote") {
329
+ checkWorkspaceExported(workingDir, sandboxSettings?.gondolin?.remote?.gateway?.hostnames?.[0]);
330
+ await gondolinGateway.start();
331
+ await gondolinFleet.reconcile();
332
+ setInterval(() => {
333
+ void stopIdleGondolinVms(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);
334
+ void gondolinFleet.reconcile();
335
+ }, MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();
336
+ }
337
+ else if (sandbox.type === "gondolin") {
338
+ gondolinInventory.touchHeartbeat();
339
+ await gondolinInventory.reconcile();
340
+ setInterval(() => {
341
+ gondolinInventory.touchHeartbeat();
342
+ void stopIdleGondolinVms(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);
343
+ void sweepUnadoptedGondolinWorkers();
344
+ }, MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();
285
345
  }
286
- // Declared before the runtime so the notifier closure can capture them;
287
- // bots register below once their platforms initialize.
288
- const bots = [];
289
346
  const botsByPlatform = {};
290
347
  /**
291
- * Extension `api.notify` backend: post into a conversation without an agent
292
- * run. Platform resolution mirrors event files — explicit platform, or the
293
- * sole running platform.
348
+ * Resolve which platform bot to use: an explicit platform, or the sole
349
+ * running one. Mirrors event-file platform resolution.
294
350
  */
295
- const platformNotifier = async (conversationId, text, platform) => {
351
+ function resolvePlatformBot(op, platform) {
296
352
  const available = Object.keys(botsByPlatform);
297
353
  const key = platform?.trim().toLowerCase() || (available.length === 1 ? available[0] : undefined);
298
354
  const bot = key ? botsByPlatform[key] : undefined;
299
355
  if (!bot) {
300
356
  throw new Error(platform
301
- ? `notify: unknown platform '${platform}' (available: ${available.join(", ") || "none"})`
302
- : `notify: multiple platforms active (${available.join(", ")}); specify platform`);
357
+ ? `${op}: unknown platform '${platform}' (available: ${available.join(", ") || "none"})`
358
+ : `${op}: multiple platforms active (${available.join(", ")}); specify platform`);
303
359
  }
360
+ return [key, bot];
361
+ }
362
+ /** Extension `api.notify` backend: post into a conversation without a run. */
363
+ const platformNotifier = async (conversationId, text, platform) => {
364
+ const [key, bot] = resolvePlatformBot("notify", platform);
304
365
  await bot.postMessage(conversationId, text);
305
366
  log.logInfo(`[notify] posted to ${key}/${conversationId} (${text.length} chars)`);
306
367
  };
368
+ /** Extension `api.react` backend: add a reaction to a message. */
369
+ const platformReactor = async (conversationId, messageTs, emoji, platform) => {
370
+ const [key, bot] = resolvePlatformBot("react", platform);
371
+ if (!bot.addReaction) {
372
+ throw new Error(`react: platform '${key}' does not support reactions`);
373
+ }
374
+ await bot.addReaction(conversationId, messageTs, emoji);
375
+ log.logInfo(`[react] :${emoji}: on ${key}/${conversationId}`);
376
+ };
377
+ /** Extension `api.uploadFile` backend: send a host file into a conversation. */
378
+ const platformUploader = async (conversationId, filePath, title, platform) => {
379
+ const [key, bot] = resolvePlatformBot("upload", platform);
380
+ if (!bot.uploadFile) {
381
+ throw new Error(`upload: platform '${key}' does not support file uploads`);
382
+ }
383
+ await bot.uploadFile(conversationId, filePath, title);
384
+ log.logInfo(`[upload] ${filePath} to ${key}/${conversationId}`);
385
+ };
386
+ /** github_* tool backends: PR push/create and CI checks, host-side. */
387
+ function requireGithubBot(op) {
388
+ const bot = botsByPlatform.github;
389
+ if (!bot) {
390
+ throw new Error(`${op}: the GitHub platform is not running`);
391
+ }
392
+ return bot;
393
+ }
394
+ /**
395
+ * Platform capability pack factories — only when the corresponding bot is
396
+ * configured. Factories, not instances: each runner materializes its own
397
+ * pack so per-run bind state never crosses conversations.
398
+ */
399
+ function buildPlatformToolPackFactories() {
400
+ if (!hasGithub)
401
+ return [];
402
+ const platformGithubOps = {
403
+ pushAndCreatePr: (conversationId, request) => requireGithubBot("github_pr").ops.pushAndCreatePr(conversationId, request),
404
+ getChecks: (conversationId, branch) => requireGithubBot("github_checks").ops.getChecks(conversationId, branch),
405
+ getJobLog: (conversationId, jobId) => requireGithubBot("github_checks").ops.getJobLog(conversationId, jobId),
406
+ getBuildLog: (conversationId, buildId) => requireGithubBot("github_checks").ops.getBuildLog(conversationId, buildId),
407
+ replyToReviewThread: (conversationId, commentId, body) => requireGithubBot("github_review_reply").ops.replyToReviewThread(conversationId, commentId, body),
408
+ syncRepo: (conversationId, branch) => requireGithubBot("github_sync").ops.syncRepo(conversationId, branch),
409
+ readGithub: (conversationId, request) => requireGithubBot("github_read").ops.readGithub(conversationId, request),
410
+ manageIssue: (conversationId, request) => requireGithubBot("github_issue").ops.manageIssue(conversationId, request),
411
+ };
412
+ return [() => createGithubToolPack(platformGithubOps)];
413
+ }
307
414
  const handler = createConversationRuntime({
308
415
  workingDir,
309
416
  sandbox,
310
417
  vaultManager,
311
418
  provisioner,
419
+ resourceController,
312
420
  linkTokenStore,
313
421
  sessionViewTokenStore,
314
422
  adminTokenStore,
315
423
  portalBaseUrl: portalBaseUrl(),
316
424
  platformNotifier,
425
+ platformReactor,
426
+ platformUploader,
427
+ platformToolPackFactories: buildPlatformToolPackFactories(),
317
428
  });
318
429
  const sandboxDesc = sandbox.type === "host"
319
430
  ? "host"
@@ -321,9 +432,11 @@ const sandboxDesc = sandbox.type === "host"
321
432
  ? `container:${sandbox.container}`
322
433
  : sandbox.type === "image"
323
434
  ? `image:${sandbox.image}`
324
- : sandbox.type === "firecracker"
325
- ? `firecracker:${sandbox.vmId}`
326
- : `cloudflare:${sandbox.sandboxId}`;
435
+ : sandbox.type === "gondolin"
436
+ ? `gondolin:${sandbox.profile}`
437
+ : sandbox.type === "firecracker"
438
+ ? `firecracker:${sandbox.vmId}`
439
+ : `cloudflare:${sandbox.sandboxId}`;
327
440
  log.logStartup(workingDir, sandboxDesc);
328
441
  logHarnessStartupSummary();
329
442
  /**
@@ -368,7 +481,6 @@ if (hasSlack) {
368
481
  workingDir,
369
482
  store: sharedStore,
370
483
  });
371
- bots.push(slackMessagingBot);
372
484
  botsByPlatform.slack = slackMessagingBot;
373
485
  log.logInfo("Platform: Slack");
374
486
  }
@@ -381,7 +493,6 @@ if (hasTelegram) {
381
493
  token: telegramToken,
382
494
  workingDir,
383
495
  });
384
- bots.push(telegramMessagingBot);
385
496
  botsByPlatform.telegram = telegramMessagingBot;
386
497
  log.logInfo("Platform: Telegram");
387
498
  }
@@ -394,10 +505,49 @@ if (hasDiscord) {
394
505
  token: discordToken,
395
506
  workingDir,
396
507
  });
397
- bots.push(discordMessagingBot);
398
508
  botsByPlatform.discord = discordMessagingBot;
399
509
  log.logInfo("Platform: Discord");
400
510
  }
511
+ if (hasGithub) {
512
+ if (!GITHUB_APP_ID || !GITHUB_INSTALLATION_ID) {
513
+ throw new Error("GitHub startup requires GITHUB_APP_ID and GITHUB_INSTALLATION_ID");
514
+ }
515
+ // Env vars flatten PEM newlines to literal `\n`; a key file avoids that.
516
+ const githubPrivateKey = GITHUB_APP_PRIVATE_KEY_PATH
517
+ ? readFileSync(GITHUB_APP_PRIVATE_KEY_PATH, "utf-8")
518
+ : GITHUB_APP_PRIVATE_KEY?.replace(/\\n/g, "\n");
519
+ if (!githubPrivateKey) {
520
+ throw new Error("GitHub startup requires GITHUB_APP_PRIVATE_KEY or GITHUB_APP_PRIVATE_KEY_PATH");
521
+ }
522
+ const pollIntervalSeconds = GITHUB_POLL_INTERVAL ? parseInt(GITHUB_POLL_INTERVAL, 10) : NaN;
523
+ const githubMessagingBot = new GithubMessagingBot(handler, {
524
+ appId: GITHUB_APP_ID,
525
+ privateKey: githubPrivateKey,
526
+ installationId: GITHUB_INSTALLATION_ID,
527
+ repos: GITHUB_REPOS
528
+ ? GITHUB_REPOS.split(",")
529
+ .map((repo) => repo.trim())
530
+ .filter(Boolean)
531
+ : [],
532
+ pollIntervalMs: (Number.isFinite(pollIntervalSeconds) && pollIntervalSeconds > 0 ? pollIntervalSeconds : 60) *
533
+ 1000,
534
+ workingDir,
535
+ syncStatePath: join(stateDir, "github-sync.json"),
536
+ // Host-side GCP creds (e.g. a WIF external_account file) unlock Cloud
537
+ // Build logs in github_checks; without them external CI degrades to
538
+ // guidance text. Credentials never enter the sandbox.
539
+ cloudBuild: GOOGLE_APPLICATION_CREDENTIALS
540
+ ? {
541
+ tokenProvider: new GcpTokenProvider({
542
+ credentialsPath: GOOGLE_APPLICATION_CREDENTIALS,
543
+ }),
544
+ projectFallback: GOOGLE_CLOUD_PROJECT,
545
+ }
546
+ : undefined,
547
+ });
548
+ botsByPlatform.github = githubMessagingBot;
549
+ log.logInfo(`Platform: GitHub${GOOGLE_APPLICATION_CREDENTIALS ? " (Cloud Build logs enabled)" : ""}`);
550
+ }
401
551
  if (LINK_PORT) {
402
552
  startWebServer({
403
553
  port: LINK_PORT,
@@ -424,13 +574,14 @@ eventsWatcher.start();
424
574
  async function shutdown() {
425
575
  await handler.shutdown();
426
576
  eventsWatcher.stop();
577
+ await disconnectAllGondolinRuntimes();
427
578
  await Sentry.close(5000);
428
579
  process.exit(0);
429
580
  }
430
581
  process.on("SIGINT", shutdown);
431
582
  process.on("SIGTERM", shutdown);
432
583
  // Start all bots
433
- await Promise.all(bots.map((bot) => bot.start().catch((err) => {
584
+ await Promise.all(Object.values(botsByPlatform).map((bot) => bot.start().catch((err) => {
434
585
  log.logWarning("Failed to start bot", err instanceof Error ? err.message : String(err));
435
586
  process.exit(1);
436
587
  })));