@geminixiang/mikan 1.0.0-beta.3 → 1.0.0-beta.30

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 (545) hide show
  1. package/CHANGELOG.md +563 -0
  2. package/README.md +60 -24
  3. package/dist/adapter.d.ts +1 -1
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js.map +1 -1
  6. package/dist/adapters/discord/bot.d.ts +1 -0
  7. package/dist/adapters/discord/bot.d.ts.map +1 -1
  8. package/dist/adapters/discord/bot.js +47 -65
  9. package/dist/adapters/discord/bot.js.map +1 -1
  10. package/dist/adapters/discord/context.d.ts.map +1 -1
  11. package/dist/adapters/discord/context.js +46 -211
  12. package/dist/adapters/discord/context.js.map +1 -1
  13. package/dist/adapters/github/bot.d.ts +86 -0
  14. package/dist/adapters/github/bot.d.ts.map +1 -0
  15. package/dist/adapters/github/bot.js +640 -0
  16. package/dist/adapters/github/bot.js.map +1 -0
  17. package/dist/adapters/github/client.d.ts +122 -0
  18. package/dist/adapters/github/client.d.ts.map +1 -0
  19. package/dist/adapters/github/client.js +314 -0
  20. package/dist/adapters/github/client.js.map +1 -0
  21. package/dist/adapters/github/cloudbuild.d.ts +19 -0
  22. package/dist/adapters/github/cloudbuild.d.ts.map +1 -0
  23. package/dist/adapters/github/cloudbuild.js +71 -0
  24. package/dist/adapters/github/cloudbuild.js.map +1 -0
  25. package/dist/adapters/github/context.d.ts +9 -0
  26. package/dist/adapters/github/context.d.ts.map +1 -0
  27. package/dist/adapters/github/context.js +98 -0
  28. package/dist/adapters/github/context.js.map +1 -0
  29. package/dist/adapters/github/gcp-auth.d.ts +28 -0
  30. package/dist/adapters/github/gcp-auth.d.ts.map +1 -0
  31. package/dist/adapters/github/gcp-auth.js +196 -0
  32. package/dist/adapters/github/gcp-auth.js.map +1 -0
  33. package/dist/adapters/github/github-ops.d.ts +90 -0
  34. package/dist/adapters/github/github-ops.d.ts.map +1 -0
  35. package/dist/adapters/github/github-ops.js +405 -0
  36. package/dist/adapters/github/github-ops.js.map +1 -0
  37. package/dist/adapters/github/ids.d.ts +34 -0
  38. package/dist/adapters/github/ids.d.ts.map +1 -0
  39. package/dist/adapters/github/ids.js +53 -0
  40. package/dist/adapters/github/ids.js.map +1 -0
  41. package/dist/adapters/github/repo.d.ts +32 -0
  42. package/dist/adapters/github/repo.d.ts.map +1 -0
  43. package/dist/adapters/github/repo.js +141 -0
  44. package/dist/adapters/github/repo.js.map +1 -0
  45. package/dist/adapters/github/tool-pack.d.ts +14 -0
  46. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  47. package/dist/adapters/github/tool-pack.js +56 -0
  48. package/dist/adapters/github/tool-pack.js.map +1 -0
  49. package/dist/adapters/github/tools/checks.d.ts +19 -0
  50. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  51. package/dist/adapters/github/tools/checks.js +105 -0
  52. package/dist/adapters/github/tools/checks.js.map +1 -0
  53. package/dist/adapters/github/tools/issue.d.ts +21 -0
  54. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  55. package/dist/adapters/github/tools/issue.js +48 -0
  56. package/dist/adapters/github/tools/issue.js.map +1 -0
  57. package/dist/adapters/github/tools/pr.d.ts +22 -0
  58. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  59. package/dist/adapters/github/tools/pr.js +48 -0
  60. package/dist/adapters/github/tools/pr.js.map +1 -0
  61. package/dist/adapters/github/tools/read.d.ts +21 -0
  62. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  63. package/dist/adapters/github/tools/read.js +141 -0
  64. package/dist/adapters/github/tools/read.js.map +1 -0
  65. package/dist/adapters/github/tools/review-reply.d.ts +17 -0
  66. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  67. package/dist/adapters/github/tools/review-reply.js +38 -0
  68. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  69. package/dist/adapters/github/tools/sync.d.ts +17 -0
  70. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  71. package/dist/adapters/github/tools/sync.js +34 -0
  72. package/dist/adapters/github/tools/sync.js.map +1 -0
  73. package/dist/adapters/github/types.d.ts +372 -0
  74. package/dist/adapters/github/types.d.ts.map +1 -0
  75. package/dist/adapters/github/types.js +2 -0
  76. package/dist/adapters/github/types.js.map +1 -0
  77. package/dist/adapters/intake.d.ts +16 -5
  78. package/dist/adapters/intake.d.ts.map +1 -1
  79. package/dist/adapters/intake.js +84 -22
  80. package/dist/adapters/intake.js.map +1 -1
  81. package/dist/adapters/progressive-renderer.d.ts +7 -0
  82. package/dist/adapters/progressive-renderer.d.ts.map +1 -0
  83. package/dist/adapters/progressive-renderer.js +383 -0
  84. package/dist/adapters/progressive-renderer.js.map +1 -0
  85. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  86. package/dist/adapters/slack/blocks.js +111 -111
  87. package/dist/adapters/slack/blocks.js.map +1 -1
  88. package/dist/adapters/slack/bot.d.ts +10 -6
  89. package/dist/adapters/slack/bot.d.ts.map +1 -1
  90. package/dist/adapters/slack/bot.js +173 -145
  91. package/dist/adapters/slack/bot.js.map +1 -1
  92. package/dist/adapters/slack/context.d.ts.map +1 -1
  93. package/dist/adapters/slack/context.js +3 -14
  94. package/dist/adapters/slack/context.js.map +1 -1
  95. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  96. package/dist/adapters/slack/response-lifecycle.js +126 -323
  97. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  98. package/dist/adapters/slack/session.d.ts.map +1 -1
  99. package/dist/adapters/slack/session.js +5 -8
  100. package/dist/adapters/slack/session.js.map +1 -1
  101. package/dist/adapters/slack/tool-pack.d.ts +11 -0
  102. package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
  103. package/dist/adapters/slack/tool-pack.js +45 -0
  104. package/dist/adapters/slack/tool-pack.js.map +1 -0
  105. package/dist/adapters/slack/tools/blockkit.d.ts +14 -0
  106. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
  107. package/dist/adapters/slack/tools/blockkit.js +106 -0
  108. package/dist/adapters/slack/tools/blockkit.js.map +1 -0
  109. package/dist/adapters/slack/types.d.ts +37 -0
  110. package/dist/adapters/slack/types.d.ts.map +1 -1
  111. package/dist/adapters/slack/types.js.map +1 -1
  112. package/dist/adapters/telegram/bot.d.ts +1 -2
  113. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  114. package/dist/adapters/telegram/bot.js +51 -63
  115. package/dist/adapters/telegram/bot.js.map +1 -1
  116. package/dist/adapters/telegram/context.d.ts.map +1 -1
  117. package/dist/adapters/telegram/context.js +55 -182
  118. package/dist/adapters/telegram/context.js.map +1 -1
  119. package/dist/adapters/types.d.ts +86 -10
  120. package/dist/adapters/types.d.ts.map +1 -1
  121. package/dist/adapters/types.js.map +1 -1
  122. package/dist/agent.d.ts +14 -19
  123. package/dist/agent.d.ts.map +1 -1
  124. package/dist/agent.js +745 -243
  125. package/dist/agent.js.map +1 -1
  126. package/dist/cli/arg-grammar.d.ts +25 -0
  127. package/dist/cli/arg-grammar.d.ts.map +1 -0
  128. package/dist/cli/arg-grammar.js +59 -0
  129. package/dist/cli/arg-grammar.js.map +1 -0
  130. package/dist/cli/boot.d.ts +5 -0
  131. package/dist/cli/boot.d.ts.map +1 -0
  132. package/dist/cli/boot.js +112 -0
  133. package/dist/cli/boot.js.map +1 -0
  134. package/dist/cli/download.d.ts.map +1 -0
  135. package/dist/cli/download.js.map +1 -0
  136. package/dist/cli/ext-dev.d.ts +2 -0
  137. package/dist/cli/ext-dev.d.ts.map +1 -0
  138. package/dist/cli/ext-dev.js +177 -0
  139. package/dist/cli/ext-dev.js.map +1 -0
  140. package/dist/cli/ext-git.d.ts +17 -0
  141. package/dist/cli/ext-git.d.ts.map +1 -0
  142. package/dist/cli/ext-git.js +107 -0
  143. package/dist/cli/ext-git.js.map +1 -0
  144. package/dist/cli/ext.d.ts +2 -0
  145. package/dist/cli/ext.d.ts.map +1 -0
  146. package/dist/cli/ext.js +222 -0
  147. package/dist/cli/ext.js.map +1 -0
  148. package/dist/cli/types.d.ts +20 -0
  149. package/dist/cli/types.d.ts.map +1 -0
  150. package/dist/cli/types.js +2 -0
  151. package/dist/cli/types.js.map +1 -0
  152. package/dist/commands/admin.d.ts.map +1 -1
  153. package/dist/commands/admin.js +2 -1
  154. package/dist/commands/admin.js.map +1 -1
  155. package/dist/commands/auto-reply.d.ts.map +1 -1
  156. package/dist/commands/auto-reply.js +2 -6
  157. package/dist/commands/auto-reply.js.map +1 -1
  158. package/dist/commands/extensions.d.ts.map +1 -1
  159. package/dist/commands/extensions.js +18 -8
  160. package/dist/commands/extensions.js.map +1 -1
  161. package/dist/commands/login.d.ts +2 -1
  162. package/dist/commands/login.d.ts.map +1 -1
  163. package/dist/commands/login.js +35 -3
  164. package/dist/commands/login.js.map +1 -1
  165. package/dist/commands/manifest.d.ts +30 -0
  166. package/dist/commands/manifest.d.ts.map +1 -0
  167. package/dist/commands/manifest.js +121 -0
  168. package/dist/commands/manifest.js.map +1 -0
  169. package/dist/commands/model.d.ts +2 -3
  170. package/dist/commands/model.d.ts.map +1 -1
  171. package/dist/commands/model.js +57 -20
  172. package/dist/commands/model.js.map +1 -1
  173. package/dist/commands/new.d.ts.map +1 -1
  174. package/dist/commands/new.js +10 -2
  175. package/dist/commands/new.js.map +1 -1
  176. package/dist/commands/registry.d.ts +2 -2
  177. package/dist/commands/registry.d.ts.map +1 -1
  178. package/dist/commands/registry.js +1 -2
  179. package/dist/commands/registry.js.map +1 -1
  180. package/dist/commands/sandbox.d.ts.map +1 -1
  181. package/dist/commands/sandbox.js +23 -17
  182. package/dist/commands/sandbox.js.map +1 -1
  183. package/dist/commands/text.d.ts +2 -0
  184. package/dist/commands/text.d.ts.map +1 -0
  185. package/dist/commands/text.js +16 -0
  186. package/dist/commands/text.js.map +1 -0
  187. package/dist/commands/types.d.ts +70 -2
  188. package/dist/commands/types.d.ts.map +1 -1
  189. package/dist/commands/types.js.map +1 -1
  190. package/dist/config.d.ts +1 -3
  191. package/dist/config.d.ts.map +1 -1
  192. package/dist/config.js +102 -95
  193. package/dist/config.js.map +1 -1
  194. package/dist/env-manifest.d.ts +28 -0
  195. package/dist/env-manifest.d.ts.map +1 -0
  196. package/dist/env-manifest.js +214 -0
  197. package/dist/env-manifest.js.map +1 -0
  198. package/dist/events.d.ts.map +1 -1
  199. package/dist/events.js +9 -73
  200. package/dist/events.js.map +1 -1
  201. package/dist/execution-resolver.d.ts +7 -6
  202. package/dist/execution-resolver.d.ts.map +1 -1
  203. package/dist/execution-resolver.js +105 -110
  204. package/dist/execution-resolver.js.map +1 -1
  205. package/dist/harness/auth.d.ts +2 -1
  206. package/dist/harness/auth.d.ts.map +1 -1
  207. package/dist/harness/auth.js +6 -0
  208. package/dist/harness/auth.js.map +1 -1
  209. package/dist/harness/event-format.d.ts +25 -0
  210. package/dist/harness/event-format.d.ts.map +1 -0
  211. package/dist/harness/event-format.js +159 -0
  212. package/dist/harness/event-format.js.map +1 -0
  213. package/dist/harness/extensions/blockkit.d.ts +19 -0
  214. package/dist/harness/extensions/blockkit.d.ts.map +1 -0
  215. package/dist/harness/extensions/blockkit.js +42 -0
  216. package/dist/harness/extensions/blockkit.js.map +1 -0
  217. package/dist/harness/extensions/loader.d.ts +25 -48
  218. package/dist/harness/extensions/loader.d.ts.map +1 -1
  219. package/dist/harness/extensions/loader.js +373 -113
  220. package/dist/harness/extensions/loader.js.map +1 -1
  221. package/dist/harness/extensions/registry.d.ts +75 -2
  222. package/dist/harness/extensions/registry.d.ts.map +1 -1
  223. package/dist/harness/extensions/registry.js +239 -0
  224. package/dist/harness/extensions/registry.js.map +1 -1
  225. package/dist/harness/extensions/types.d.ts +318 -25
  226. package/dist/harness/extensions/types.d.ts.map +1 -1
  227. package/dist/harness/extensions/types.js.map +1 -1
  228. package/dist/harness/index.d.ts +18 -8
  229. package/dist/harness/index.d.ts.map +1 -1
  230. package/dist/harness/index.js +7 -4
  231. package/dist/harness/index.js.map +1 -1
  232. package/dist/harness/models.d.ts +7 -4
  233. package/dist/harness/models.d.ts.map +1 -1
  234. package/dist/harness/models.js +10 -0
  235. package/dist/harness/models.js.map +1 -1
  236. package/dist/harness/runner.d.ts +50 -54
  237. package/dist/harness/runner.d.ts.map +1 -1
  238. package/dist/harness/runner.js +230 -44
  239. package/dist/harness/runner.js.map +1 -1
  240. package/dist/harness/session-store.d.ts +9 -5
  241. package/dist/harness/session-store.d.ts.map +1 -1
  242. package/dist/harness/session-store.js +131 -30
  243. package/dist/harness/session-store.js.map +1 -1
  244. package/dist/harness/settings.d.ts +2 -20
  245. package/dist/harness/settings.d.ts.map +1 -1
  246. package/dist/harness/settings.js +11 -0
  247. package/dist/harness/settings.js.map +1 -1
  248. package/dist/harness/skills.d.ts +2 -29
  249. package/dist/harness/skills.d.ts.map +1 -1
  250. package/dist/harness/skills.js.map +1 -1
  251. package/dist/harness/subagent-profiles.d.ts +8 -0
  252. package/dist/harness/subagent-profiles.d.ts.map +1 -0
  253. package/dist/harness/subagent-profiles.js +290 -0
  254. package/dist/harness/subagent-profiles.js.map +1 -0
  255. package/dist/harness/subagent-runner.d.ts +39 -0
  256. package/dist/harness/subagent-runner.d.ts.map +1 -0
  257. package/dist/harness/subagent-runner.js +615 -0
  258. package/dist/harness/subagent-runner.js.map +1 -0
  259. package/dist/harness/types.d.ts +263 -1
  260. package/dist/harness/types.d.ts.map +1 -1
  261. package/dist/harness/types.js.map +1 -1
  262. package/dist/harness/usage.d.ts +6 -0
  263. package/dist/harness/usage.d.ts.map +1 -0
  264. package/dist/harness/usage.js +32 -0
  265. package/dist/harness/usage.js.map +1 -0
  266. package/dist/index.d.ts +33 -8
  267. package/dist/index.d.ts.map +1 -1
  268. package/dist/index.js +20 -6
  269. package/dist/index.js.map +1 -1
  270. package/dist/main.js +253 -109
  271. package/dist/main.js.map +1 -1
  272. package/dist/observability/instrument.js +6 -4
  273. package/dist/observability/instrument.js.map +1 -1
  274. package/dist/observability/sentry.d.ts.map +1 -1
  275. package/dist/observability/sentry.js +3 -2
  276. package/dist/observability/sentry.js.map +1 -1
  277. package/dist/packages/admin.d.ts +17 -0
  278. package/dist/packages/admin.d.ts.map +1 -0
  279. package/dist/packages/admin.js +96 -0
  280. package/dist/packages/admin.js.map +1 -0
  281. package/dist/packages/index.d.ts +6 -0
  282. package/dist/packages/index.d.ts.map +1 -0
  283. package/dist/packages/index.js +6 -0
  284. package/dist/packages/index.js.map +1 -0
  285. package/dist/packages/inspect.d.ts +11 -0
  286. package/dist/packages/inspect.d.ts.map +1 -0
  287. package/dist/packages/inspect.js +100 -0
  288. package/dist/packages/inspect.js.map +1 -0
  289. package/dist/packages/materialize.d.ts +39 -0
  290. package/dist/packages/materialize.d.ts.map +1 -0
  291. package/dist/packages/materialize.js +300 -0
  292. package/dist/packages/materialize.js.map +1 -0
  293. package/dist/packages/resolve.d.ts +25 -0
  294. package/dist/packages/resolve.d.ts.map +1 -0
  295. package/dist/packages/resolve.js +212 -0
  296. package/dist/packages/resolve.js.map +1 -0
  297. package/dist/packages/source.d.ts +33 -0
  298. package/dist/packages/source.d.ts.map +1 -0
  299. package/dist/packages/source.js +177 -0
  300. package/dist/packages/source.js.map +1 -0
  301. package/dist/packages/types.d.ts +104 -0
  302. package/dist/packages/types.d.ts.map +1 -0
  303. package/dist/packages/types.js +2 -0
  304. package/dist/packages/types.js.map +1 -0
  305. package/dist/provisioner.d.ts.map +1 -1
  306. package/dist/provisioner.js +6 -6
  307. package/dist/provisioner.js.map +1 -1
  308. package/dist/runtime/conversation-runtime.d.ts +1 -1
  309. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  310. package/dist/runtime/conversation-runtime.js +481 -98
  311. package/dist/runtime/conversation-runtime.js.map +1 -1
  312. package/dist/runtime/session-lifecycle.d.ts +28 -0
  313. package/dist/runtime/session-lifecycle.d.ts.map +1 -0
  314. package/dist/runtime/session-lifecycle.js +161 -0
  315. package/dist/runtime/session-lifecycle.js.map +1 -0
  316. package/dist/runtime/types.d.ts +45 -5
  317. package/dist/runtime/types.d.ts.map +1 -1
  318. package/dist/runtime/types.js.map +1 -1
  319. package/dist/sandbox/cloudflare.d.ts +3 -0
  320. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  321. package/dist/sandbox/cloudflare.js +11 -0
  322. package/dist/sandbox/cloudflare.js.map +1 -1
  323. package/dist/sandbox/container.d.ts +4 -0
  324. package/dist/sandbox/container.d.ts.map +1 -1
  325. package/dist/sandbox/container.js +12 -2
  326. package/dist/sandbox/container.js.map +1 -1
  327. package/dist/sandbox/firecracker.d.ts +3 -0
  328. package/dist/sandbox/firecracker.d.ts.map +1 -1
  329. package/dist/sandbox/firecracker.js +11 -1
  330. package/dist/sandbox/firecracker.js.map +1 -1
  331. package/dist/sandbox/gondolin.d.ts +57 -0
  332. package/dist/sandbox/gondolin.d.ts.map +1 -0
  333. package/dist/sandbox/gondolin.js +764 -0
  334. package/dist/sandbox/gondolin.js.map +1 -0
  335. package/dist/sandbox/host.d.ts +4 -0
  336. package/dist/sandbox/host.d.ts.map +1 -1
  337. package/dist/sandbox/host.js +52 -0
  338. package/dist/sandbox/host.js.map +1 -1
  339. package/dist/sandbox/identity.d.ts +16 -0
  340. package/dist/sandbox/identity.d.ts.map +1 -0
  341. package/dist/sandbox/identity.js +42 -0
  342. package/dist/sandbox/identity.js.map +1 -0
  343. package/dist/sandbox/image.d.ts.map +1 -1
  344. package/dist/sandbox/image.js +1 -0
  345. package/dist/sandbox/image.js.map +1 -1
  346. package/dist/sandbox/index.d.ts +15 -4
  347. package/dist/sandbox/index.d.ts.map +1 -1
  348. package/dist/sandbox/index.js +25 -3
  349. package/dist/sandbox/index.js.map +1 -1
  350. package/dist/sandbox/path-context.js +18 -8
  351. package/dist/sandbox/path-context.js.map +1 -1
  352. package/dist/sandbox/types.d.ts +65 -1
  353. package/dist/sandbox/types.d.ts.map +1 -1
  354. package/dist/sandbox/types.js.map +1 -1
  355. package/dist/sandbox/utils.d.ts +12 -0
  356. package/dist/sandbox/utils.d.ts.map +1 -1
  357. package/dist/sandbox/utils.js +38 -0
  358. package/dist/sandbox/utils.js.map +1 -1
  359. package/dist/sessions/chat-history-sync.d.ts +25 -0
  360. package/dist/sessions/chat-history-sync.d.ts.map +1 -0
  361. package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +98 -124
  362. package/dist/sessions/chat-history-sync.js.map +1 -0
  363. package/dist/sessions/conversation-log.d.ts +9 -0
  364. package/dist/sessions/conversation-log.d.ts.map +1 -0
  365. package/dist/sessions/conversation-log.js +47 -0
  366. package/dist/sessions/conversation-log.js.map +1 -0
  367. package/dist/sessions/history-line.d.ts +20 -0
  368. package/dist/sessions/history-line.d.ts.map +1 -0
  369. package/dist/sessions/history-line.js +24 -0
  370. package/dist/sessions/history-line.js.map +1 -0
  371. package/dist/sessions/policy.d.ts.map +1 -1
  372. package/dist/sessions/policy.js +5 -3
  373. package/dist/sessions/policy.js.map +1 -1
  374. package/dist/sessions/rotation.d.ts +2 -0
  375. package/dist/sessions/rotation.d.ts.map +1 -0
  376. package/dist/sessions/rotation.js +39 -0
  377. package/dist/sessions/rotation.js.map +1 -0
  378. package/dist/sessions/session-key.d.ts +40 -0
  379. package/dist/sessions/session-key.d.ts.map +1 -0
  380. package/dist/sessions/session-key.js +92 -0
  381. package/dist/sessions/session-key.js.map +1 -0
  382. package/dist/sessions/store.d.ts.map +1 -1
  383. package/dist/sessions/store.js +40 -18
  384. package/dist/sessions/store.js.map +1 -1
  385. package/dist/sessions/types.d.ts +17 -4
  386. package/dist/sessions/types.d.ts.map +1 -1
  387. package/dist/sessions/types.js.map +1 -1
  388. package/dist/settings-mutation.d.ts +8 -0
  389. package/dist/settings-mutation.d.ts.map +1 -0
  390. package/dist/settings-mutation.js +43 -0
  391. package/dist/settings-mutation.js.map +1 -0
  392. package/dist/subagent-progress.d.ts +43 -0
  393. package/dist/subagent-progress.d.ts.map +1 -0
  394. package/dist/subagent-progress.js +220 -0
  395. package/dist/subagent-progress.js.map +1 -0
  396. package/dist/tools/bash.d.ts +3 -1
  397. package/dist/tools/bash.d.ts.map +1 -1
  398. package/dist/tools/bash.js +25 -17
  399. package/dist/tools/bash.js.map +1 -1
  400. package/dist/tools/edit.d.ts.map +1 -1
  401. package/dist/tools/edit.js +10 -12
  402. package/dist/tools/edit.js.map +1 -1
  403. package/dist/tools/event.d.ts +1 -1
  404. package/dist/tools/event.d.ts.map +1 -1
  405. package/dist/tools/event.js +53 -43
  406. package/dist/tools/event.js.map +1 -1
  407. package/dist/tools/generate-image.d.ts +17 -0
  408. package/dist/tools/generate-image.d.ts.map +1 -0
  409. package/dist/tools/generate-image.js +63 -0
  410. package/dist/tools/generate-image.js.map +1 -0
  411. package/dist/tools/host-fn-tool.d.ts +21 -0
  412. package/dist/tools/host-fn-tool.d.ts.map +1 -0
  413. package/dist/tools/host-fn-tool.js +32 -0
  414. package/dist/tools/host-fn-tool.js.map +1 -0
  415. package/dist/tools/index.d.ts +14 -2
  416. package/dist/tools/index.d.ts.map +1 -1
  417. package/dist/tools/index.js +28 -3
  418. package/dist/tools/index.js.map +1 -1
  419. package/dist/tools/react.d.ts +15 -0
  420. package/dist/tools/react.d.ts.map +1 -0
  421. package/dist/tools/react.js +29 -0
  422. package/dist/tools/react.js.map +1 -0
  423. package/dist/tools/read.d.ts +1 -0
  424. package/dist/tools/read.d.ts.map +1 -1
  425. package/dist/tools/read.js +37 -31
  426. package/dist/tools/read.js.map +1 -1
  427. package/dist/tools/sandbox.d.ts +2 -2
  428. package/dist/tools/sandbox.d.ts.map +1 -1
  429. package/dist/tools/sandbox.js +14 -9
  430. package/dist/tools/sandbox.js.map +1 -1
  431. package/dist/tools/subagent-slots.d.ts +28 -0
  432. package/dist/tools/subagent-slots.d.ts.map +1 -0
  433. package/dist/tools/subagent-slots.js +72 -0
  434. package/dist/tools/subagent-slots.js.map +1 -0
  435. package/dist/tools/subagent.d.ts +54 -0
  436. package/dist/tools/subagent.d.ts.map +1 -0
  437. package/dist/tools/subagent.js +401 -0
  438. package/dist/tools/subagent.js.map +1 -0
  439. package/dist/tools/types.d.ts +40 -6
  440. package/dist/tools/types.d.ts.map +1 -1
  441. package/dist/tools/types.js.map +1 -1
  442. package/dist/tools/write.d.ts.map +1 -1
  443. package/dist/tools/write.js +2 -8
  444. package/dist/tools/write.js.map +1 -1
  445. package/dist/trigger.d.ts.map +1 -1
  446. package/dist/trigger.js +1 -2
  447. package/dist/trigger.js.map +1 -1
  448. package/dist/types.d.ts +232 -32
  449. package/dist/types.d.ts.map +1 -1
  450. package/dist/types.js.map +1 -1
  451. package/dist/utils/date.d.ts +1 -1
  452. package/dist/utils/date.js +1 -1
  453. package/dist/utils/date.js.map +1 -1
  454. package/dist/vault/disabled.d.ts +9 -0
  455. package/dist/vault/disabled.d.ts.map +1 -0
  456. package/dist/vault/disabled.js +22 -0
  457. package/dist/vault/disabled.js.map +1 -0
  458. package/dist/vault/index.d.ts +0 -2
  459. package/dist/vault/index.d.ts.map +1 -1
  460. package/dist/vault/index.js +30 -33
  461. package/dist/vault/index.js.map +1 -1
  462. package/dist/vault/injection.d.ts +10 -0
  463. package/dist/vault/injection.d.ts.map +1 -0
  464. package/dist/vault/injection.js +30 -0
  465. package/dist/vault/injection.js.map +1 -0
  466. package/dist/vault/policy.d.ts +20 -0
  467. package/dist/vault/policy.d.ts.map +1 -0
  468. package/dist/vault/policy.js +20 -0
  469. package/dist/vault/policy.js.map +1 -0
  470. package/dist/vault/types.d.ts +4 -2
  471. package/dist/vault/types.d.ts.map +1 -1
  472. package/dist/vault/types.js.map +1 -1
  473. package/dist/web/admin/portal.d.ts +17 -2
  474. package/dist/web/admin/portal.d.ts.map +1 -1
  475. package/dist/web/admin/portal.js +385 -155
  476. package/dist/web/admin/portal.js.map +1 -1
  477. package/dist/web/admin/types.d.ts +18 -0
  478. package/dist/web/admin/types.d.ts.map +1 -1
  479. package/dist/web/admin/types.js.map +1 -1
  480. package/dist/web/agent-events/portal.d.ts.map +1 -1
  481. package/dist/web/agent-events/portal.js +2 -1
  482. package/dist/web/agent-events/portal.js.map +1 -1
  483. package/dist/web/login/oauth.d.ts +2 -3
  484. package/dist/web/login/oauth.d.ts.map +1 -1
  485. package/dist/web/login/oauth.js +0 -31
  486. package/dist/web/login/oauth.js.map +1 -1
  487. package/dist/web/login/portal.js +1 -1
  488. package/dist/web/login/portal.js.map +1 -1
  489. package/dist/web/login/types.d.ts +0 -11
  490. package/dist/web/login/types.d.ts.map +1 -1
  491. package/dist/web/login/types.js.map +1 -1
  492. package/dist/web/portal-shell.d.ts +4 -0
  493. package/dist/web/portal-shell.d.ts.map +1 -0
  494. package/dist/{portal-shell.js → web/portal-shell.js} +2 -2
  495. package/dist/web/portal-shell.js.map +1 -0
  496. package/dist/web/server.d.ts.map +1 -1
  497. package/dist/web/server.js +7 -0
  498. package/dist/web/server.js.map +1 -1
  499. package/dist/web/session-view/command.d.ts.map +1 -1
  500. package/dist/web/session-view/command.js +4 -1
  501. package/dist/web/session-view/command.js.map +1 -1
  502. package/dist/web/session-view/portal.d.ts.map +1 -1
  503. package/dist/web/session-view/portal.js +4 -3
  504. package/dist/web/session-view/portal.js.map +1 -1
  505. package/dist/web/session-view/service.d.ts.map +1 -1
  506. package/dist/web/session-view/service.js +2 -1
  507. package/dist/web/session-view/service.js.map +1 -1
  508. package/dist/web/session-view/types.d.ts +2 -1
  509. package/dist/web/session-view/types.d.ts.map +1 -1
  510. package/dist/web/session-view/types.js.map +1 -1
  511. package/dist/workspace-projection/index.d.ts +5 -0
  512. package/dist/workspace-projection/index.d.ts.map +1 -0
  513. package/dist/workspace-projection/index.js +71 -0
  514. package/dist/workspace-projection/index.js.map +1 -0
  515. package/dist/workspace-projection/types.d.ts +7 -0
  516. package/dist/workspace-projection/types.d.ts.map +1 -0
  517. package/dist/workspace-projection/types.js +2 -0
  518. package/dist/workspace-projection/types.js.map +1 -0
  519. package/package.json +28 -15
  520. package/dist/adapters/streaming.d.ts +0 -18
  521. package/dist/adapters/streaming.d.ts.map +0 -1
  522. package/dist/adapters/streaming.js +0 -44
  523. package/dist/adapters/streaming.js.map +0 -1
  524. package/dist/download.d.ts.map +0 -1
  525. package/dist/download.js.map +0 -1
  526. package/dist/model-registry.d.ts +0 -4
  527. package/dist/model-registry.d.ts.map +0 -1
  528. package/dist/model-registry.js +0 -7
  529. package/dist/model-registry.js.map +0 -1
  530. package/dist/portal-shell.d.ts +0 -4
  531. package/dist/portal-shell.d.ts.map +0 -1
  532. package/dist/portal-shell.js.map +0 -1
  533. package/dist/runtime/agent-run-controller.d.ts +0 -31
  534. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  535. package/dist/runtime/agent-run-controller.js +0 -195
  536. package/dist/runtime/agent-run-controller.js.map +0 -1
  537. package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
  538. package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
  539. package/dist/sessions/agent-memory-file-manager.js.map +0 -1
  540. package/dist/vault/routing.d.ts +0 -3
  541. package/dist/vault/routing.d.ts.map +0 -1
  542. package/dist/vault/routing.js +0 -13
  543. package/dist/vault/routing.js.map +0 -1
  544. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
  545. /package/dist/{download.js → cli/download.js} +0 -0
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;AAGjF,gFAAgF;AAChF,6DAA6D;AAC7D,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACxF,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,iBAAiB,GAClB,MAAM,gCAAgC,CAAC;AA8FxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AAWzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAEpF,OAAO,EACL,wBAAwB,EACxB,8BAA8B,EAC9B,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,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 type { CommandContext, CommandHandler, CommandServices } from \"./commands/types.js\";\n\n// Public harness interface. Keep this list explicit: adding an internal harness\n// helper must not silently expand the npm package interface.\nexport { FileCredentialStore, defaultAuthPath } from \"./harness/auth.js\";\nexport {\n DEFAULT_HTTP_IDLE_TIMEOUT_MS,\n configureHttpDispatcher,\n parseHttpIdleTimeoutMs,\n} from \"./harness/http.js\";\nexport { MikanModels, defaultModelsJsonPath } from \"./harness/models.js\";\nexport {\n SessionStore,\n loadSessionFileEntries,\n parseSessionFileEntries,\n} from \"./harness/session-store.js\";\nexport { MikanAgentSession } from \"./harness/runner.js\";\nexport { formatSkillsForPrompt, loadSkillsFromDir, parseFrontmatter } from \"./harness/skills.js\";\nexport { loadSubagentProfiles } from \"./harness/subagent-profiles.js\";\nexport {\n DEFAULT_BUDGET_SETTINGS,\n DEFAULT_EVENT_BUDGET,\n DEFAULT_RETRY_SETTINGS,\n resolveHarnessSettings,\n} from \"./harness/settings.js\";\nexport { buildEventPayload, EventTypeSchema, parseEventPayload } from \"./harness/event-format.js\";\nexport { ExtensionRegistry, parseCommandInput } from \"./harness/extensions/registry.js\";\nexport {\n EXT_ACTION_PREFIX,\n namespaceActionIds,\n parseExtActionId,\n} from \"./harness/extensions/blockkit.js\";\nexport {\n defaultExtensionDirs,\n extensionSlug,\n listInstalledExtensions,\n loadExtensions,\n validateExtension,\n} from \"./harness/extensions/loader.js\";\nexport type { CreateMikanModelsOptions } from \"./harness/models.js\";\nexport type {\n CompactionReason,\n HarnessEvent,\n HarnessEventListener,\n MikanAgentSessionOptions,\n PromptBlockedOutcome,\n} from \"./harness/runner.js\";\nexport type { LoadSkillsResult, MikanSkill, SkillDiagnostic } from \"./harness/skills.js\";\nexport type {\n LoadSubagentProfilesResult,\n SubagentProfileDiagnostic,\n} from \"./harness/subagent-profiles.js\";\nexport type {\n BudgetSettings,\n CompactionSettings,\n HarnessSettings,\n RetrySettings,\n} from \"./harness/settings.js\";\nexport type {\n EventConversationKind,\n EventFilePayload,\n EventPayloadInput,\n EventType,\n ImmediateEventPayload,\n OneShotEventPayload,\n PeriodicEventPayload,\n} from \"./harness/event-format.js\";\nexport type {\n ExtensionValidation,\n InstalledExtensionInfo,\n LoadExtensionsOptions,\n LoadExtensionsResult,\n} from \"./harness/extensions/loader.js\";\nexport type {\n AgentErrorHookEvent,\n BeforeAgentStartHookEvent,\n BeforeAgentStartHookResult,\n BudgetExceededHookEvent,\n ContextHookEvent,\n ContextHookResult,\n ExtensionBlockAction,\n ExtensionBlockActionHandler,\n ExtensionBlockKitMessage,\n ExtensionCommand,\n ExtensionCommandContext,\n ExtensionDisposer,\n ExtensionHostServices,\n ExtensionLoadError,\n ExtensionManifest,\n ExtensionScheduleInfo,\n ExtensionSchedulePayload,\n ExtensionScheduleSpec,\n ExtensionScheduleStore,\n LoadedExtension,\n MessageEndHookEvent,\n MessageEndHookResult,\n MikanExtensionActivate,\n MikanExtensionApi,\n MikanExtensionModule,\n MikanHookMap,\n MikanHookName,\n RunOrigin,\n SessionCompactHookEvent,\n SubagentApi,\n ToolCallHookEvent,\n ToolCallHookResult,\n ToolResultHookEvent,\n ToolResultHookResult,\n TurnEndHookEvent,\n} from \"./harness/extensions/types.js\";\nexport type {\n BranchSummaryEntry,\n CompactionEntry,\n CustomEntry,\n CustomMessageEntry,\n SessionContext,\n SessionEntry,\n SessionFileEntry,\n SessionHeader,\n SessionInfoEntry,\n SessionMessageEntry,\n SubagentModelSpec,\n SubagentParentContext,\n SubagentProfile,\n SubagentRunBudget,\n SubagentRunOutput,\n SubagentRunRequest,\n SubagentRunResult,\n SubagentRunStatus,\n SubagentUsage,\n SubagentUsageSink,\n} from \"./harness/types.js\";\nexport { CURRENT_SESSION_VERSION } from \"./harness/types.js\";\n\nexport {\n ChatHistorySync,\n hasMaterializedChatSession,\n registerThreadSession,\n waitForThreadSessionBootstrap,\n} from \"./sessions/chat-history-sync.js\";\nexport type {\n ChatHistorySyncOptions,\n ChatSyncReport,\n HasMaterializedSessionOptions,\n RegisterThreadSessionOptions,\n ResetChatSessionOptions,\n ResolveChatSessionScopeOptions,\n SyncChatSessionOptions,\n ThreadBootstrapWaitOptions,\n} from \"./sessions/chat-history-sync.js\";\nexport { isPlatformHistorySession } from \"./sessions/metadata.js\";\nexport type { MikanSessionHeader } from \"./sessions/metadata.js\";\nexport { inferConversationKind, resolveChatSessionKey } from \"./sessions/policy.js\";\nexport type { ResolveSessionKeyOptions } from \"./sessions/policy.js\";\nexport {\n createManagedSessionFile,\n createManagedSessionFileAtPath,\n createNewSessionFile,\n extractSessionSuffix,\n extractSessionUuid,\n getChannelSessionDir,\n getThreadSessionFile,\n openManagedSession,\n resolveChannelSessionFile,\n resolveManagedSessionFile,\n resolveSessionFile,\n tryResolveCurrentSession,\n tryResolveThreadSession,\n} from \"./sessions/store.js\";\nexport type { ResolvedSessionScope, ThreadRootMessage } from \"./sessions/store.js\";\nexport {\n createConversationRuntime,\n type ConversationRuntime,\n type ConversationRuntimeOptions,\n type RunSessionOptions,\n} from \"./runtime/conversation-runtime.js\";\nexport type {\n ChatAdapter,\n ChatToolResult,\n ConversationContext,\n ConversationEvent,\n ConversationKind,\n ConversationMessage,\n ConversationResponder,\n MessagingBot,\n MessagingEventHandler,\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,17 @@
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 { createSlackToolPack } from "./adapters/slack/tool-pack.js";
14
+ import { downloadChannel } from "./cli/download.js";
12
15
  import { EventsWatcher } from "./events.js";
13
16
  import * as log from "./log.js";
14
17
  import { startWebServer } from "./web/server.js";
@@ -16,13 +19,17 @@ import { InMemoryAdminTokenStore } from "./web/admin/store.js";
16
19
  import { InMemoryLinkTokenStore } from "./web/login/store.js";
17
20
  import { InMemorySessionViewTokenStore } from "./web/session-view/store.js";
18
21
  import { DockerContainerManager } from "./provisioner.js";
19
- import { assertStateDirOutsideWorkspace, createGlobalSettingsFile, loadGlobalSettings, MissingGlobalSettingsError, } from "./config.js";
22
+ import { assertStateDirOutsideWorkspace, createGlobalSettingsFile, loadGlobalSettings, MissingGlobalSettingsError, resolveLinkBaseUrl, } from "./config.js";
20
23
  import { configureHttpDispatcher, defaultAuthPath, defaultModelsJsonPath, parseHttpIdleTimeoutMs, } from "./harness/index.js";
21
24
  import { existsSync, readFileSync } from "fs";
22
25
  import { readEnv, setEnvAliases } from "./utils/env.js";
23
26
  import { ensureDirExists, isRecord, readJsonFileIfExists } from "./utils/file-guards.js";
24
- import { SandboxError, parseSandboxArg, validateSandbox, } from "./sandbox/index.js";
27
+ import { SandboxError, validateSandbox } from "./sandbox/index.js";
28
+ import { helpText, resolveBoot } from "./cli/boot.js";
29
+ import { envReport, noPlatformsMessage, platformIsActive } from "./env-manifest.js";
30
+ import { configureGondolinRuntime, gondolinResources, reconcileGondolinRuntimes, stopAllGondolinRuntimes, stopIdleGondolinVms, } from "./sandbox/gondolin.js";
25
31
  import { FileVaultManager } from "./vault/index.js";
32
+ import { runExtCommand } from "./cli/ext.js";
26
33
  import { createConversationRuntime } from "./runtime/conversation-runtime.js";
27
34
  import { ChannelStore } from "./store.js";
28
35
  import * as Sentry from "@sentry/node";
@@ -44,56 +51,19 @@ const SLACK_APP_TOKEN = readEnv("SLACK_APP_TOKEN");
44
51
  const SLACK_BOT_TOKEN = readEnv("SLACK_BOT_TOKEN");
45
52
  const TELEGRAM_BOT_TOKEN = readEnv("TELEGRAM_BOT_TOKEN");
46
53
  const DISCORD_BOT_TOKEN = readEnv("DISCORD_BOT_TOKEN");
47
- const LINK_URL = readEnv("LINK_URL");
54
+ const GITHUB_APP_ID = readEnv("GITHUB_APP_ID");
55
+ const GITHUB_APP_PRIVATE_KEY = readEnv("GITHUB_APP_PRIVATE_KEY");
56
+ const GITHUB_APP_PRIVATE_KEY_PATH = readEnv("GITHUB_APP_PRIVATE_KEY_PATH");
57
+ const GITHUB_INSTALLATION_ID = readEnv("GITHUB_INSTALLATION_ID");
58
+ const GITHUB_REPOS = readEnv("GITHUB_REPOS");
59
+ const GITHUB_POLL_INTERVAL = readEnv("GITHUB_POLL_INTERVAL");
60
+ const GOOGLE_APPLICATION_CREDENTIALS = readEnv("GOOGLE_APPLICATION_CREDENTIALS");
61
+ const GOOGLE_CLOUD_PROJECT = readEnv("GOOGLE_CLOUD_PROJECT");
62
+ // Externally-visible base URL of the link/OAuth server; the env read and
63
+ // trailing-slash normalization live in config.resolveLinkBaseUrl.
64
+ const LINK_BASE_URL = resolveLinkBaseUrl();
48
65
  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
- }
66
+ const LINK_PORT = LINK_PORT_RAW ? parseInt(LINK_PORT_RAW, 10) : LINK_BASE_URL ? 8181 : undefined;
97
67
  const WORLD_WRITABLE_MODE = 0o002;
98
68
  function ensureSecureStateDir(path) {
99
69
  let stat;
@@ -149,31 +119,44 @@ function handleStartupError(error) {
149
119
  console.error(String(error));
150
120
  process.exit(1);
151
121
  }
152
- let parsedArgs;
122
+ let plan;
153
123
  try {
154
- parsedArgs = parseArgs();
124
+ plan = resolveBoot();
155
125
  }
156
126
  catch (error) {
157
127
  handleStartupError(error);
158
128
  }
129
+ // `mikan ext …` manages extensions and exits; handle it before the normal
130
+ // bot-mode startup (which requires platform tokens).
131
+ if (plan.mode === "ext") {
132
+ const code = await runExtCommand(plan.extArgs ?? []);
133
+ process.exit(code);
134
+ }
159
135
  // Global fetch: proxy support (HTTP_PROXY/HTTPS_PROXY/NO_PROXY) and idle
160
136
  // timeouts so a stalled LLM stream errors out instead of hanging a session.
161
137
  const httpIdleTimeoutMs = parseHttpIdleTimeoutMs(readEnv("HTTP_IDLE_TIMEOUT"));
162
138
  configureHttpDispatcher(httpIdleTimeoutMs);
163
- // Handle --version
164
- if (parsedArgs.showVersion) {
139
+ if (plan.mode === "help") {
140
+ console.log(helpText());
141
+ process.exit(0);
142
+ }
143
+ if (plan.mode === "env") {
144
+ console.log(envReport());
145
+ process.exit(0);
146
+ }
147
+ if (plan.mode === "version") {
165
148
  console.log(getVersion());
166
149
  process.exit(0);
167
150
  }
168
151
  // Handle --onboard mode
169
- if (parsedArgs.showOnboard) {
170
- const stateDir = parsedArgs.stateDir ?? join(homedir(), ".mikan");
152
+ if (plan.mode === "onboard") {
153
+ const stateDir = plan.stateDir;
171
154
  setEnvAliases("STATE_DIR", stateDir);
172
155
  ensureSecureStateDir(stateDir);
173
156
  try {
174
157
  const settingsPath = createGlobalSettingsFile(stateDir);
175
158
  console.log(`Created global settings at ${settingsPath}`);
176
- console.log("Review the file, then start mikan with your working directory.");
159
+ console.log(`Review the file, then start mikan (workspace defaults to ${join(stateDir, "workspace")}).`);
177
160
  process.exit(0);
178
161
  }
179
162
  catch (err) {
@@ -182,40 +165,36 @@ if (parsedArgs.showOnboard) {
182
165
  }
183
166
  }
184
167
  // Handle --download mode (Slack only)
185
- if (parsedArgs.downloadChannel) {
168
+ if (plan.mode === "download" && plan.downloadChannel) {
186
169
  if (!SLACK_BOT_TOKEN) {
187
170
  console.error("Missing env: SLACK_BOT_TOKEN");
188
171
  process.exit(1);
189
172
  }
190
- await downloadChannel(parsedArgs.downloadChannel, SLACK_BOT_TOKEN);
173
+ await downloadChannel(plan.downloadChannel, SLACK_BOT_TOKEN);
191
174
  process.exit(0);
192
175
  }
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");
176
+ // Normal bot mode - working dir is optional and defaults under the state dir
177
+ const sandbox = plan.sandbox;
178
+ const stateDir = plan.stateDir;
179
+ const workingDir = plan.workingDir;
202
180
  setEnvAliases("STATE_DIR", stateDir);
203
181
  ensureSecureStateDir(stateDir);
182
+ if (!plan.workingDirExplicit) {
183
+ ensureDirExists(workingDir);
184
+ }
204
185
  try {
205
186
  assertStateDirOutsideWorkspace(stateDir, workingDir, sandbox.type);
206
187
  }
207
188
  catch (error) {
208
189
  handleStartupError(error);
209
190
  }
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");
191
+ // Validate platform tokens — activation rules live in the env manifest.
192
+ const hasSlack = platformIsActive("slack");
193
+ const hasTelegram = platformIsActive("telegram");
194
+ const hasDiscord = platformIsActive("discord");
195
+ const hasGithub = platformIsActive("github");
196
+ if (!hasSlack && !hasTelegram && !hasDiscord && !hasGithub) {
197
+ console.error(noPlatformsMessage());
219
198
  process.exit(1);
220
199
  }
221
200
  try {
@@ -228,7 +207,10 @@ const vaultManager = new FileVaultManager(stateDir);
228
207
  if (vaultManager.isEnabled()) {
229
208
  console.log(sandbox.type === "container"
230
209
  ? " Vault system enabled. Container vault active."
231
- : sandbox.type === "image" || sandbox.type === "firecracker" || sandbox.type === "cloudflare"
210
+ : sandbox.type === "image" ||
211
+ sandbox.type === "gondolin" ||
212
+ sandbox.type === "firecracker" ||
213
+ sandbox.type === "cloudflare"
232
214
  ? " Vault system enabled. Conversation-scoped credential routing active."
233
215
  : " Vault system enabled. Host mode will not inject vault env.");
234
216
  }
@@ -240,11 +222,12 @@ const startupConfig = (() => {
240
222
  handleStartupError(error);
241
223
  }
242
224
  })();
243
- const sandboxLimits = startupConfig.sandboxCpus || startupConfig.sandboxMemory
244
- ? { cpus: startupConfig.sandboxCpus, memory: startupConfig.sandboxMemory }
225
+ const sandboxSettings = startupConfig.sandbox;
226
+ const sandboxLimits = sandboxSettings?.cpus || sandboxSettings?.memory
227
+ ? { cpus: sandboxSettings?.cpus, memory: sandboxSettings?.memory }
245
228
  : undefined;
246
- const sandboxBoostLimits = startupConfig.sandboxBoostCpus || startupConfig.sandboxBoostMemory
247
- ? { cpus: startupConfig.sandboxBoostCpus, memory: startupConfig.sandboxBoostMemory }
229
+ const sandboxBoostLimits = sandboxSettings?.boost?.cpus || sandboxSettings?.boost?.memory
230
+ ? { cpus: sandboxSettings?.boost?.cpus, memory: sandboxSettings?.boost?.memory }
248
231
  : undefined;
249
232
  const provisioner = sandbox.type === "image"
250
233
  ? new DockerContainerManager(sandbox.image, {
@@ -252,9 +235,26 @@ const provisioner = sandbox.type === "image"
252
235
  boostLimits: sandboxBoostLimits,
253
236
  })
254
237
  : undefined;
255
- if (sandbox.type === "image") {
238
+ if (sandbox.type === "gondolin") {
239
+ try {
240
+ configureGondolinRuntime({
241
+ limits: sandboxLimits,
242
+ boostLimits: sandboxBoostLimits,
243
+ });
244
+ }
245
+ catch (error) {
246
+ handleStartupError(error);
247
+ }
248
+ }
249
+ const resourceController = sandbox.type === "image"
250
+ ? provisioner
251
+ : sandbox.type === "gondolin"
252
+ ? gondolinResources
253
+ : undefined;
254
+ if (sandbox.type === "image" || sandbox.type === "gondolin") {
256
255
  ensureDirExists(join(workingDir, "skills"));
257
256
  ensureDirExists(join(workingDir, "events"));
257
+ ensureDirExists(join(workingDir, "agents"));
258
258
  try {
259
259
  writeFileSync(join(workingDir, "MEMORY.md"), "", { flag: "wx" });
260
260
  }
@@ -270,50 +270,154 @@ setInterval(() => linkTokenStore.purge(), 5 * 60 * 1000).unref();
270
270
  setInterval(() => sessionViewTokenStore.purge(), 5 * 60 * 1000).unref();
271
271
  setInterval(() => adminTokenStore.purge(), 5 * 60 * 1000).unref();
272
272
  function portalBaseUrl() {
273
- if (LINK_URL)
274
- return LINK_URL.replace(/\/+$/, "");
273
+ if (LINK_BASE_URL)
274
+ return LINK_BASE_URL;
275
275
  if (LINK_PORT)
276
276
  return `http://localhost:${LINK_PORT}`;
277
277
  return undefined;
278
278
  }
279
- /** Idle timeout for managed image containers (10 minutes) */
280
- const IMAGE_IDLE_TIMEOUT_MS = 10 * 60 * 1000;
279
+ /** Idle timeout for managed sandboxes (10 minutes) */
280
+ const MANAGED_SANDBOX_IDLE_TIMEOUT_MS = 10 * 60 * 1000;
281
281
  if (provisioner) {
282
282
  await provisioner.reconcile();
283
- await provisioner.stopIdle(IMAGE_IDLE_TIMEOUT_MS);
284
- setInterval(() => provisioner.stopIdle(IMAGE_IDLE_TIMEOUT_MS), IMAGE_IDLE_TIMEOUT_MS).unref();
283
+ await provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS);
284
+ setInterval(() => provisioner.stopIdle(MANAGED_SANDBOX_IDLE_TIMEOUT_MS), MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();
285
+ }
286
+ if (sandbox.type === "gondolin") {
287
+ await reconcileGondolinRuntimes();
288
+ setInterval(() => void stopIdleGondolinVms(MANAGED_SANDBOX_IDLE_TIMEOUT_MS), MANAGED_SANDBOX_IDLE_TIMEOUT_MS).unref();
285
289
  }
286
- // Declared before the runtime so the notifier closure can capture them;
287
- // bots register below once their platforms initialize.
288
- const bots = [];
289
290
  const botsByPlatform = {};
290
291
  /**
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.
292
+ * Resolve which platform bot to use: an explicit platform, or the sole
293
+ * running one. Mirrors event-file platform resolution.
294
294
  */
295
- const platformNotifier = async (conversationId, text, platform) => {
295
+ function resolvePlatformBot(op, platform) {
296
296
  const available = Object.keys(botsByPlatform);
297
297
  const key = platform?.trim().toLowerCase() || (available.length === 1 ? available[0] : undefined);
298
298
  const bot = key ? botsByPlatform[key] : undefined;
299
299
  if (!bot) {
300
300
  throw new Error(platform
301
- ? `notify: unknown platform '${platform}' (available: ${available.join(", ") || "none"})`
302
- : `notify: multiple platforms active (${available.join(", ")}); specify platform`);
301
+ ? `${op}: unknown platform '${platform}' (available: ${available.join(", ") || "none"})`
302
+ : `${op}: multiple platforms active (${available.join(", ")}); specify platform`);
303
303
  }
304
+ return [key, bot];
305
+ }
306
+ /** Extension `api.notify` backend: post into a conversation without a run. */
307
+ const platformNotifier = async (conversationId, text, platform) => {
308
+ const [key, bot] = resolvePlatformBot("notify", platform);
304
309
  await bot.postMessage(conversationId, text);
305
310
  log.logInfo(`[notify] posted to ${key}/${conversationId} (${text.length} chars)`);
306
311
  };
312
+ /** Extension `api.react` backend: add a reaction to a message. */
313
+ const platformReactor = async (conversationId, messageTs, emoji, platform) => {
314
+ const [key, bot] = resolvePlatformBot("react", platform);
315
+ if (!bot.addReaction) {
316
+ throw new Error(`react: platform '${key}' does not support reactions`);
317
+ }
318
+ await bot.addReaction(conversationId, messageTs, emoji);
319
+ log.logInfo(`[react] :${emoji}: on ${key}/${conversationId}`);
320
+ };
321
+ /** Extension `api.uploadFile` backend: send a host file into a conversation. */
322
+ const platformUploader = async (conversationId, filePath, title, platform) => {
323
+ const [key, bot] = resolvePlatformBot("upload", platform);
324
+ if (!bot.uploadFile) {
325
+ throw new Error(`upload: platform '${key}' does not support file uploads`);
326
+ }
327
+ await bot.uploadFile(conversationId, filePath, title);
328
+ log.logInfo(`[upload] ${filePath} to ${key}/${conversationId}`);
329
+ };
330
+ /** github_* tool backends: PR push/create and CI checks, host-side. */
331
+ function requireGithubBot(op) {
332
+ const bot = botsByPlatform.github;
333
+ if (!bot) {
334
+ throw new Error(`${op}: the GitHub platform is not running`);
335
+ }
336
+ return bot;
337
+ }
338
+ /** slack_* tool backends: Block Kit posting/updating, host-side. */
339
+ function requireSlackBot(op) {
340
+ const bot = botsByPlatform.slack;
341
+ if (!bot) {
342
+ throw new Error(`${op}: the Slack platform is not running`);
343
+ }
344
+ return bot;
345
+ }
346
+ /** Extension `api.blockkit` backend: interactive Block Kit, Slack-only today. */
347
+ const platformBlockKit = {
348
+ postBlocks: async (conversationId, message, platform) => {
349
+ if (platform && platform !== "slack") {
350
+ throw new Error(`blockkit: platform '${platform}' does not support Block Kit`);
351
+ }
352
+ const bot = requireSlackBot("blockkit");
353
+ const ts = message.threadTs
354
+ ? await bot.postInThreadBlocks(conversationId, message.threadTs, message.text, message.blocks)
355
+ : await bot.postMessageBlocks(conversationId, message.text, message.blocks);
356
+ return { ts };
357
+ },
358
+ updateBlocks: async (conversationId, messageTs, message, platform) => {
359
+ if (platform && platform !== "slack") {
360
+ throw new Error(`blockkit: platform '${platform}' does not support Block Kit`);
361
+ }
362
+ await requireSlackBot("blockkit").updateMessageBlocks(conversationId, messageTs, message.text, message.blocks);
363
+ },
364
+ };
365
+ /**
366
+ * Platform capability pack factories — only when the corresponding bot is
367
+ * configured. Factories, not instances: each runner materializes its own
368
+ * pack so per-run bind state never crosses conversations.
369
+ */
370
+ function buildPlatformToolPackFactories() {
371
+ const factories = [];
372
+ if (hasSlack) {
373
+ const platformSlackOps = {
374
+ postBlocks: async (conversationId, { text, blocks, threadTs }) => {
375
+ const bot = requireSlackBot("slack_blockkit");
376
+ const ts = threadTs
377
+ ? await bot.postInThreadBlocks(conversationId, threadTs, text, blocks)
378
+ : await bot.postMessageBlocks(conversationId, text, blocks);
379
+ bot.logBotResponse(conversationId, text, ts, threadTs, blocks);
380
+ return { ts };
381
+ },
382
+ updateBlocks: async (conversationId, { ts, text, blocks, threadTs }) => {
383
+ const bot = requireSlackBot("slack_blockkit");
384
+ await bot.updateMessageBlocks(conversationId, ts, text, blocks);
385
+ bot.logBotResponse(conversationId, text, ts, threadTs, blocks);
386
+ },
387
+ ownsBlockKitMessage: (conversationId, ts, threadTs) => requireSlackBot("slack_blockkit").ownsBlockKitMessage(conversationId, ts, threadTs),
388
+ };
389
+ factories.push(() => createSlackToolPack(platformSlackOps));
390
+ }
391
+ if (!hasGithub)
392
+ return factories;
393
+ const platformGithubOps = {
394
+ pushAndCreatePr: (conversationId, request) => requireGithubBot("github_pr").ops.pushAndCreatePr(conversationId, request),
395
+ getChecks: (conversationId, branch) => requireGithubBot("github_checks").ops.getChecks(conversationId, branch),
396
+ getJobLog: (conversationId, jobId) => requireGithubBot("github_checks").ops.getJobLog(conversationId, jobId),
397
+ getBuildLog: (conversationId, buildId) => requireGithubBot("github_checks").ops.getBuildLog(conversationId, buildId),
398
+ replyToReviewThread: (conversationId, commentId, body) => requireGithubBot("github_review_reply").ops.replyToReviewThread(conversationId, commentId, body),
399
+ syncRepo: (conversationId, branch) => requireGithubBot("github_sync").ops.syncRepo(conversationId, branch),
400
+ readGithub: (conversationId, request) => requireGithubBot("github_read").ops.readGithub(conversationId, request),
401
+ manageIssue: (conversationId, request) => requireGithubBot("github_issue").ops.manageIssue(conversationId, request),
402
+ };
403
+ factories.push(() => createGithubToolPack(platformGithubOps));
404
+ return factories;
405
+ }
307
406
  const handler = createConversationRuntime({
308
407
  workingDir,
309
408
  sandbox,
310
409
  vaultManager,
311
410
  provisioner,
411
+ resourceController,
312
412
  linkTokenStore,
313
413
  sessionViewTokenStore,
314
414
  adminTokenStore,
315
415
  portalBaseUrl: portalBaseUrl(),
316
416
  platformNotifier,
417
+ platformReactor,
418
+ platformUploader,
419
+ platformBlockKit,
420
+ platformToolPackFactories: buildPlatformToolPackFactories(),
317
421
  });
318
422
  const sandboxDesc = sandbox.type === "host"
319
423
  ? "host"
@@ -321,9 +425,11 @@ const sandboxDesc = sandbox.type === "host"
321
425
  ? `container:${sandbox.container}`
322
426
  : sandbox.type === "image"
323
427
  ? `image:${sandbox.image}`
324
- : sandbox.type === "firecracker"
325
- ? `firecracker:${sandbox.vmId}`
326
- : `cloudflare:${sandbox.sandboxId}`;
428
+ : sandbox.type === "gondolin"
429
+ ? `gondolin:${sandbox.profile}`
430
+ : sandbox.type === "firecracker"
431
+ ? `firecracker:${sandbox.vmId}`
432
+ : `cloudflare:${sandbox.sandboxId}`;
327
433
  log.logStartup(workingDir, sandboxDesc);
328
434
  logHarnessStartupSummary();
329
435
  /**
@@ -368,7 +474,6 @@ if (hasSlack) {
368
474
  workingDir,
369
475
  store: sharedStore,
370
476
  });
371
- bots.push(slackMessagingBot);
372
477
  botsByPlatform.slack = slackMessagingBot;
373
478
  log.logInfo("Platform: Slack");
374
479
  }
@@ -381,7 +486,6 @@ if (hasTelegram) {
381
486
  token: telegramToken,
382
487
  workingDir,
383
488
  });
384
- bots.push(telegramMessagingBot);
385
489
  botsByPlatform.telegram = telegramMessagingBot;
386
490
  log.logInfo("Platform: Telegram");
387
491
  }
@@ -394,10 +498,49 @@ if (hasDiscord) {
394
498
  token: discordToken,
395
499
  workingDir,
396
500
  });
397
- bots.push(discordMessagingBot);
398
501
  botsByPlatform.discord = discordMessagingBot;
399
502
  log.logInfo("Platform: Discord");
400
503
  }
504
+ if (hasGithub) {
505
+ if (!GITHUB_APP_ID || !GITHUB_INSTALLATION_ID) {
506
+ throw new Error("GitHub startup requires GITHUB_APP_ID and GITHUB_INSTALLATION_ID");
507
+ }
508
+ // Env vars flatten PEM newlines to literal `\n`; a key file avoids that.
509
+ const githubPrivateKey = GITHUB_APP_PRIVATE_KEY_PATH
510
+ ? readFileSync(GITHUB_APP_PRIVATE_KEY_PATH, "utf-8")
511
+ : GITHUB_APP_PRIVATE_KEY?.replace(/\\n/g, "\n");
512
+ if (!githubPrivateKey) {
513
+ throw new Error("GitHub startup requires GITHUB_APP_PRIVATE_KEY or GITHUB_APP_PRIVATE_KEY_PATH");
514
+ }
515
+ const pollIntervalSeconds = GITHUB_POLL_INTERVAL ? parseInt(GITHUB_POLL_INTERVAL, 10) : NaN;
516
+ const githubMessagingBot = new GithubMessagingBot(handler, {
517
+ appId: GITHUB_APP_ID,
518
+ privateKey: githubPrivateKey,
519
+ installationId: GITHUB_INSTALLATION_ID,
520
+ repos: GITHUB_REPOS
521
+ ? GITHUB_REPOS.split(",")
522
+ .map((repo) => repo.trim())
523
+ .filter(Boolean)
524
+ : [],
525
+ pollIntervalMs: (Number.isFinite(pollIntervalSeconds) && pollIntervalSeconds > 0 ? pollIntervalSeconds : 60) *
526
+ 1000,
527
+ workingDir,
528
+ syncStatePath: join(stateDir, "github-sync.json"),
529
+ // Host-side GCP creds (e.g. a WIF external_account file) unlock Cloud
530
+ // Build logs in github_checks; without them external CI degrades to
531
+ // guidance text. Credentials never enter the sandbox.
532
+ cloudBuild: GOOGLE_APPLICATION_CREDENTIALS
533
+ ? {
534
+ tokenProvider: new GcpTokenProvider({
535
+ credentialsPath: GOOGLE_APPLICATION_CREDENTIALS,
536
+ }),
537
+ projectFallback: GOOGLE_CLOUD_PROJECT,
538
+ }
539
+ : undefined,
540
+ });
541
+ botsByPlatform.github = githubMessagingBot;
542
+ log.logInfo(`Platform: GitHub${GOOGLE_APPLICATION_CREDENTIALS ? " (Cloud Build logs enabled)" : ""}`);
543
+ }
401
544
  if (LINK_PORT) {
402
545
  startWebServer({
403
546
  port: LINK_PORT,
@@ -424,13 +567,14 @@ eventsWatcher.start();
424
567
  async function shutdown() {
425
568
  await handler.shutdown();
426
569
  eventsWatcher.stop();
570
+ await stopAllGondolinRuntimes();
427
571
  await Sentry.close(5000);
428
572
  process.exit(0);
429
573
  }
430
574
  process.on("SIGINT", shutdown);
431
575
  process.on("SIGTERM", shutdown);
432
576
  // Start all bots
433
- await Promise.all(bots.map((bot) => bot.start().catch((err) => {
577
+ await Promise.all(Object.values(botsByPlatform).map((bot) => bot.start().catch((err) => {
434
578
  log.logWarning("Failed to start bot", err instanceof Error ? err.message : String(err));
435
579
  process.exit(1);
436
580
  })));