@geminixiang/mikan 1.0.0-beta.7 → 1.0.0-beta.71

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 (856) hide show
  1. package/CHANGELOG.md +1052 -0
  2. package/README.md +98 -38
  3. package/dist/adapters/commands/admin.d.ts.map +1 -0
  4. package/dist/{commands → adapters/commands}/admin.js +11 -8
  5. package/dist/adapters/commands/admin.js.map +1 -0
  6. package/dist/{commands → adapters/commands}/auto-reply.d.ts +0 -3
  7. package/dist/adapters/commands/auto-reply.d.ts.map +1 -0
  8. package/dist/adapters/commands/auto-reply.js +47 -0
  9. package/dist/adapters/commands/auto-reply.js.map +1 -0
  10. package/dist/adapters/commands/login.d.ts +6 -0
  11. package/dist/adapters/commands/login.d.ts.map +1 -0
  12. package/dist/adapters/commands/login.js +166 -0
  13. package/dist/adapters/commands/login.js.map +1 -0
  14. package/dist/adapters/commands/manifest.d.ts +37 -0
  15. package/dist/adapters/commands/manifest.d.ts.map +1 -0
  16. package/dist/adapters/commands/manifest.js +155 -0
  17. package/dist/adapters/commands/manifest.js.map +1 -0
  18. package/dist/adapters/commands/model.d.ts +15 -0
  19. package/dist/adapters/commands/model.d.ts.map +1 -0
  20. package/dist/adapters/commands/model.js +153 -0
  21. package/dist/adapters/commands/model.js.map +1 -0
  22. package/dist/adapters/commands/new.d.ts.map +1 -0
  23. package/dist/adapters/commands/new.js +41 -0
  24. package/dist/adapters/commands/new.js.map +1 -0
  25. package/dist/adapters/commands/registry.d.ts +5 -0
  26. package/dist/adapters/commands/registry.d.ts.map +1 -0
  27. package/dist/adapters/commands/registry.js +43 -0
  28. package/dist/adapters/commands/registry.js.map +1 -0
  29. package/dist/adapters/commands/sandbox.d.ts.map +1 -0
  30. package/dist/adapters/commands/sandbox.js +125 -0
  31. package/dist/adapters/commands/sandbox.js.map +1 -0
  32. package/dist/adapters/commands/session-view.d.ts.map +1 -0
  33. package/dist/{commands → adapters/commands}/session-view.js +23 -16
  34. package/dist/adapters/commands/session-view.js.map +1 -0
  35. package/dist/adapters/commands/types.d.ts +145 -0
  36. package/dist/adapters/commands/types.d.ts.map +1 -0
  37. package/dist/adapters/commands/types.js.map +1 -0
  38. package/dist/adapters/commands/utils.d.ts +14 -0
  39. package/dist/adapters/commands/utils.d.ts.map +1 -0
  40. package/dist/{commands → adapters/commands}/utils.js +18 -1
  41. package/dist/adapters/commands/utils.js.map +1 -0
  42. package/dist/adapters/discord/bot.d.ts +11 -8
  43. package/dist/adapters/discord/bot.d.ts.map +1 -1
  44. package/dist/adapters/discord/bot.js +223 -256
  45. package/dist/adapters/discord/bot.js.map +1 -1
  46. package/dist/adapters/discord/components.d.ts +28 -0
  47. package/dist/adapters/discord/components.d.ts.map +1 -0
  48. package/dist/adapters/discord/components.js +32 -0
  49. package/dist/adapters/discord/components.js.map +1 -0
  50. package/dist/adapters/discord/context.d.ts +2 -6
  51. package/dist/adapters/discord/context.d.ts.map +1 -1
  52. package/dist/adapters/discord/context.js +64 -218
  53. package/dist/adapters/discord/context.js.map +1 -1
  54. package/dist/adapters/discord/format.d.ts +3 -0
  55. package/dist/adapters/discord/format.d.ts.map +1 -0
  56. package/dist/adapters/discord/format.js +84 -0
  57. package/dist/adapters/discord/format.js.map +1 -0
  58. package/dist/adapters/discord/types.d.ts +8 -1
  59. package/dist/adapters/discord/types.d.ts.map +1 -1
  60. package/dist/adapters/discord/types.js.map +1 -1
  61. package/dist/adapters/github/bot.d.ts +102 -0
  62. package/dist/adapters/github/bot.d.ts.map +1 -0
  63. package/dist/adapters/github/bot.js +720 -0
  64. package/dist/adapters/github/bot.js.map +1 -0
  65. package/dist/adapters/github/client.d.ts +122 -0
  66. package/dist/adapters/github/client.d.ts.map +1 -0
  67. package/dist/adapters/github/client.js +301 -0
  68. package/dist/adapters/github/client.js.map +1 -0
  69. package/dist/adapters/github/context.d.ts +5 -0
  70. package/dist/adapters/github/context.d.ts.map +1 -0
  71. package/dist/adapters/github/context.js +101 -0
  72. package/dist/adapters/github/context.js.map +1 -0
  73. package/dist/adapters/github/github-ops.d.ts +78 -0
  74. package/dist/adapters/github/github-ops.d.ts.map +1 -0
  75. package/dist/adapters/github/github-ops.js +337 -0
  76. package/dist/adapters/github/github-ops.js.map +1 -0
  77. package/dist/adapters/github/ids.d.ts +34 -0
  78. package/dist/adapters/github/ids.d.ts.map +1 -0
  79. package/dist/adapters/github/ids.js +57 -0
  80. package/dist/adapters/github/ids.js.map +1 -0
  81. package/dist/adapters/github/repo.d.ts +33 -0
  82. package/dist/adapters/github/repo.d.ts.map +1 -0
  83. package/dist/adapters/github/repo.js +141 -0
  84. package/dist/adapters/github/repo.js.map +1 -0
  85. package/dist/adapters/github/tool-pack.d.ts +14 -0
  86. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  87. package/dist/adapters/github/tool-pack.js +55 -0
  88. package/dist/adapters/github/tool-pack.js.map +1 -0
  89. package/dist/adapters/github/tools/checks.d.ts +18 -0
  90. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  91. package/dist/adapters/github/tools/checks.js +86 -0
  92. package/dist/adapters/github/tools/checks.js.map +1 -0
  93. package/dist/adapters/github/tools/issue.d.ts +21 -0
  94. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  95. package/dist/adapters/github/tools/issue.js +48 -0
  96. package/dist/adapters/github/tools/issue.js.map +1 -0
  97. package/dist/adapters/github/tools/pr.d.ts +22 -0
  98. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  99. package/dist/adapters/github/tools/pr.js +48 -0
  100. package/dist/adapters/github/tools/pr.js.map +1 -0
  101. package/dist/adapters/github/tools/read.d.ts +21 -0
  102. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  103. package/dist/adapters/github/tools/read.js +141 -0
  104. package/dist/adapters/github/tools/read.js.map +1 -0
  105. package/dist/adapters/github/tools/review-reply.d.ts +17 -0
  106. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  107. package/dist/adapters/github/tools/review-reply.js +38 -0
  108. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  109. package/dist/adapters/github/tools/sync.d.ts +17 -0
  110. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  111. package/dist/adapters/github/tools/sync.js +34 -0
  112. package/dist/adapters/github/tools/sync.js.map +1 -0
  113. package/dist/adapters/github/types.d.ts +345 -0
  114. package/dist/adapters/github/types.d.ts.map +1 -0
  115. package/dist/adapters/github/types.js.map +1 -0
  116. package/dist/adapters/github/webhook.d.ts +20 -0
  117. package/dist/adapters/github/webhook.d.ts.map +1 -0
  118. package/dist/adapters/github/webhook.js +78 -0
  119. package/dist/adapters/github/webhook.js.map +1 -0
  120. package/dist/adapters/index.d.ts +12 -0
  121. package/dist/adapters/index.d.ts.map +1 -0
  122. package/dist/adapters/index.js +19 -0
  123. package/dist/adapters/index.js.map +1 -0
  124. package/dist/adapters/intake.d.ts +17 -6
  125. package/dist/adapters/intake.d.ts.map +1 -1
  126. package/dist/adapters/intake.js +96 -27
  127. package/dist/adapters/intake.js.map +1 -1
  128. package/dist/adapters/markdown-tables.d.ts +19 -0
  129. package/dist/adapters/markdown-tables.d.ts.map +1 -0
  130. package/dist/adapters/markdown-tables.js +152 -0
  131. package/dist/adapters/markdown-tables.js.map +1 -0
  132. package/dist/{platform-messages.d.ts → adapters/messages.d.ts} +3 -2
  133. package/dist/adapters/messages.d.ts.map +1 -0
  134. package/dist/{platform-messages.js → adapters/messages.js} +4 -1
  135. package/dist/adapters/messages.js.map +1 -0
  136. package/dist/adapters/progressive-renderer.d.ts +7 -0
  137. package/dist/adapters/progressive-renderer.d.ts.map +1 -0
  138. package/dist/adapters/progressive-renderer.js +443 -0
  139. package/dist/adapters/progressive-renderer.js.map +1 -0
  140. package/dist/adapters/shared.d.ts +37 -11
  141. package/dist/adapters/shared.d.ts.map +1 -1
  142. package/dist/adapters/shared.js +130 -24
  143. package/dist/adapters/shared.js.map +1 -1
  144. package/dist/adapters/slack/assistant.d.ts +73 -0
  145. package/dist/adapters/slack/assistant.d.ts.map +1 -0
  146. package/dist/adapters/slack/assistant.js +205 -0
  147. package/dist/adapters/slack/assistant.js.map +1 -0
  148. package/dist/adapters/slack/auto-reply-context.d.ts +21 -0
  149. package/dist/adapters/slack/auto-reply-context.d.ts.map +1 -0
  150. package/dist/adapters/slack/auto-reply-context.js +28 -0
  151. package/dist/adapters/slack/auto-reply-context.js.map +1 -0
  152. package/dist/adapters/slack/blocks.d.ts +14 -0
  153. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  154. package/dist/adapters/slack/blocks.js +104 -148
  155. package/dist/adapters/slack/blocks.js.map +1 -1
  156. package/dist/adapters/slack/bot.d.ts +154 -21
  157. package/dist/adapters/slack/bot.d.ts.map +1 -1
  158. package/dist/adapters/slack/bot.js +1037 -484
  159. package/dist/adapters/slack/bot.js.map +1 -1
  160. package/dist/adapters/slack/context.d.ts +2 -6
  161. package/dist/adapters/slack/context.d.ts.map +1 -1
  162. package/dist/adapters/slack/context.js +11 -17
  163. package/dist/adapters/slack/context.js.map +1 -1
  164. package/dist/adapters/slack/jev-context.d.ts +30 -0
  165. package/dist/adapters/slack/jev-context.d.ts.map +1 -0
  166. package/dist/adapters/slack/jev-context.js +67 -0
  167. package/dist/adapters/slack/jev-context.js.map +1 -0
  168. package/dist/adapters/slack/markdown.d.ts +3 -0
  169. package/dist/adapters/slack/markdown.d.ts.map +1 -0
  170. package/dist/adapters/slack/markdown.js +48 -0
  171. package/dist/adapters/slack/markdown.js.map +1 -0
  172. package/dist/adapters/slack/persona.d.ts +15 -0
  173. package/dist/adapters/slack/persona.d.ts.map +1 -0
  174. package/dist/adapters/slack/persona.js +22 -0
  175. package/dist/adapters/slack/persona.js.map +1 -0
  176. package/dist/adapters/slack/response-lifecycle.d.ts +1 -1
  177. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  178. package/dist/adapters/slack/response-lifecycle.js +261 -345
  179. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  180. package/dist/adapters/slack/session.d.ts.map +1 -1
  181. package/dist/adapters/slack/session.js +7 -11
  182. package/dist/adapters/slack/session.js.map +1 -1
  183. package/dist/adapters/slack/stream-limits.d.ts +35 -0
  184. package/dist/adapters/slack/stream-limits.d.ts.map +1 -0
  185. package/dist/adapters/slack/stream-limits.js +56 -0
  186. package/dist/adapters/slack/stream-limits.js.map +1 -0
  187. package/dist/adapters/slack/task-intent.d.ts +32 -0
  188. package/dist/adapters/slack/task-intent.d.ts.map +1 -0
  189. package/dist/adapters/slack/task-intent.js +72 -0
  190. package/dist/adapters/slack/task-intent.js.map +1 -0
  191. package/dist/adapters/slack/task-status.d.ts +7 -0
  192. package/dist/adapters/slack/task-status.d.ts.map +1 -0
  193. package/dist/adapters/slack/task-status.js +107 -0
  194. package/dist/adapters/slack/task-status.js.map +1 -0
  195. package/dist/adapters/slack/tool-pack.d.ts +11 -0
  196. package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
  197. package/dist/adapters/slack/tool-pack.js +45 -0
  198. package/dist/adapters/slack/tool-pack.js.map +1 -0
  199. package/dist/adapters/slack/tools/blockkit.d.ts +14 -0
  200. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
  201. package/dist/adapters/slack/tools/blockkit.js +106 -0
  202. package/dist/adapters/slack/tools/blockkit.js.map +1 -0
  203. package/dist/adapters/slack/types.d.ts +73 -2
  204. package/dist/adapters/slack/types.d.ts.map +1 -1
  205. package/dist/adapters/slack/types.js.map +1 -1
  206. package/dist/adapters/slack/update-diagnostics.d.ts +14 -0
  207. package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -0
  208. package/dist/adapters/slack/update-diagnostics.js +134 -0
  209. package/dist/adapters/slack/update-diagnostics.js.map +1 -0
  210. package/dist/adapters/telegram/bot.d.ts +10 -9
  211. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  212. package/dist/adapters/telegram/bot.js +133 -202
  213. package/dist/adapters/telegram/bot.js.map +1 -1
  214. package/dist/adapters/telegram/context.d.ts +2 -6
  215. package/dist/adapters/telegram/context.d.ts.map +1 -1
  216. package/dist/adapters/telegram/context.js +53 -190
  217. package/dist/adapters/telegram/context.js.map +1 -1
  218. package/dist/adapters/telegram/types.d.ts +1 -1
  219. package/dist/adapters/telegram/types.d.ts.map +1 -1
  220. package/dist/adapters/telegram/types.js.map +1 -1
  221. package/dist/adapters/types.d.ts +144 -13
  222. package/dist/adapters/types.d.ts.map +1 -1
  223. package/dist/adapters/types.js.map +1 -1
  224. package/dist/adapters/web/admin/portal.d.ts +44 -0
  225. package/dist/adapters/web/admin/portal.d.ts.map +1 -0
  226. package/dist/adapters/web/admin/portal.js +3207 -0
  227. package/dist/adapters/web/admin/portal.js.map +1 -0
  228. package/dist/{web → adapters/web}/admin/provider-models.d.ts +1 -1
  229. package/dist/adapters/web/admin/provider-models.d.ts.map +1 -0
  230. package/dist/{web → adapters/web}/admin/provider-models.js +1 -1
  231. package/dist/adapters/web/admin/provider-models.js.map +1 -0
  232. package/dist/adapters/web/admin/types.d.ts +53 -0
  233. package/dist/adapters/web/admin/types.d.ts.map +1 -0
  234. package/dist/adapters/web/admin/types.js.map +1 -0
  235. package/dist/adapters/web/login/oauth.d.ts +5 -0
  236. package/dist/adapters/web/login/oauth.d.ts.map +1 -0
  237. package/dist/{web → adapters/web}/login/oauth.js +50 -85
  238. package/dist/adapters/web/login/oauth.js.map +1 -0
  239. package/dist/{web → adapters/web}/login/portal.d.ts +9 -3
  240. package/dist/adapters/web/login/portal.d.ts.map +1 -0
  241. package/dist/{web → adapters/web}/login/portal.js +161 -119
  242. package/dist/adapters/web/login/portal.js.map +1 -0
  243. package/dist/{web → adapters/web}/login/types.d.ts +1 -12
  244. package/dist/adapters/web/login/types.d.ts.map +1 -0
  245. package/dist/adapters/web/login/types.js.map +1 -0
  246. package/dist/adapters/web/portal-shell.d.ts +22 -0
  247. package/dist/adapters/web/portal-shell.d.ts.map +1 -0
  248. package/dist/{portal-shell.js → adapters/web/portal-shell.js} +78 -2
  249. package/dist/adapters/web/portal-shell.js.map +1 -0
  250. package/dist/{web → adapters/web}/server.d.ts +14 -8
  251. package/dist/adapters/web/server.d.ts.map +1 -0
  252. package/dist/{web → adapters/web}/server.js +14 -7
  253. package/dist/adapters/web/server.js.map +1 -0
  254. package/dist/adapters/web/session-view/portal.d.ts +20 -0
  255. package/dist/adapters/web/session-view/portal.d.ts.map +1 -0
  256. package/dist/{web → adapters/web}/session-view/portal.js +633 -162
  257. package/dist/adapters/web/session-view/portal.js.map +1 -0
  258. package/dist/{web → adapters/web}/session-view/types.d.ts +11 -6
  259. package/dist/adapters/web/session-view/types.d.ts.map +1 -0
  260. package/dist/adapters/web/session-view/types.js.map +1 -0
  261. package/dist/adapters/web/token-store.d.ts.map +1 -0
  262. package/dist/{web → adapters/web}/token-store.js +1 -1
  263. package/dist/adapters/web/token-store.js.map +1 -0
  264. package/dist/adapters/web/types.d.ts.map +1 -0
  265. package/dist/adapters/web/types.js.map +1 -0
  266. package/dist/cli/arg-grammar.d.ts +11 -0
  267. package/dist/cli/arg-grammar.d.ts.map +1 -0
  268. package/dist/cli/arg-grammar.js +50 -0
  269. package/dist/cli/arg-grammar.js.map +1 -0
  270. package/dist/cli/boot.d.ts +5 -0
  271. package/dist/cli/boot.d.ts.map +1 -0
  272. package/dist/cli/boot.js +90 -0
  273. package/dist/cli/boot.js.map +1 -0
  274. package/dist/cli/download.d.ts.map +1 -0
  275. package/dist/cli/download.js +88 -0
  276. package/dist/cli/download.js.map +1 -0
  277. package/dist/cli/office.d.ts +2 -0
  278. package/dist/cli/office.d.ts.map +1 -0
  279. package/dist/cli/office.js +181 -0
  280. package/dist/cli/office.js.map +1 -0
  281. package/dist/cli/onboard.d.ts +10 -0
  282. package/dist/cli/onboard.d.ts.map +1 -0
  283. package/dist/cli/onboard.js +225 -0
  284. package/dist/cli/onboard.js.map +1 -0
  285. package/dist/cli/process-lifecycle.d.ts +19 -0
  286. package/dist/cli/process-lifecycle.d.ts.map +1 -0
  287. package/dist/cli/process-lifecycle.js +67 -0
  288. package/dist/cli/process-lifecycle.js.map +1 -0
  289. package/dist/cli/sessions.d.ts +2 -0
  290. package/dist/cli/sessions.d.ts.map +1 -0
  291. package/dist/cli/sessions.js +88 -0
  292. package/dist/cli/sessions.js.map +1 -0
  293. package/dist/cli/types.d.ts +25 -0
  294. package/dist/cli/types.d.ts.map +1 -0
  295. package/dist/cli/types.js.map +1 -0
  296. package/dist/dream/index.d.ts +20 -0
  297. package/dist/dream/index.d.ts.map +1 -0
  298. package/dist/dream/index.js +264 -0
  299. package/dist/dream/index.js.map +1 -0
  300. package/dist/dream/types.d.ts +30 -0
  301. package/dist/dream/types.d.ts.map +1 -0
  302. package/dist/dream/types.js +2 -0
  303. package/dist/dream/types.js.map +1 -0
  304. package/dist/env-manifest.d.ts +38 -0
  305. package/dist/env-manifest.d.ts.map +1 -0
  306. package/dist/env-manifest.js +260 -0
  307. package/dist/env-manifest.js.map +1 -0
  308. package/dist/events/index.d.ts +172 -0
  309. package/dist/events/index.d.ts.map +1 -0
  310. package/dist/events/index.js +340 -0
  311. package/dist/events/index.js.map +1 -0
  312. package/dist/events/scheduler.d.ts +34 -0
  313. package/dist/events/scheduler.d.ts.map +1 -0
  314. package/dist/events/scheduler.js +231 -0
  315. package/dist/events/scheduler.js.map +1 -0
  316. package/dist/file-guards.d.ts +26 -0
  317. package/dist/file-guards.d.ts.map +1 -0
  318. package/dist/file-guards.js +133 -0
  319. package/dist/file-guards.js.map +1 -0
  320. package/dist/harness/execution-env.d.ts +19 -0
  321. package/dist/harness/execution-env.d.ts.map +1 -0
  322. package/dist/harness/execution-env.js +262 -0
  323. package/dist/harness/execution-env.js.map +1 -0
  324. package/dist/harness/execution-resolver.d.ts +25 -0
  325. package/dist/harness/execution-resolver.d.ts.map +1 -0
  326. package/dist/harness/execution-resolver.js +156 -0
  327. package/dist/harness/execution-resolver.js.map +1 -0
  328. package/dist/harness/index.d.ts +18 -13
  329. package/dist/harness/index.d.ts.map +1 -1
  330. package/dist/harness/index.js +11 -11
  331. package/dist/harness/index.js.map +1 -1
  332. package/dist/harness/jev.d.ts +86 -0
  333. package/dist/harness/jev.d.ts.map +1 -0
  334. package/dist/harness/jev.js +167 -0
  335. package/dist/harness/jev.js.map +1 -0
  336. package/dist/harness/mcp.d.ts +38 -0
  337. package/dist/harness/mcp.d.ts.map +1 -0
  338. package/dist/harness/mcp.js +304 -0
  339. package/dist/harness/mcp.js.map +1 -0
  340. package/dist/harness/models.d.ts +7 -4
  341. package/dist/harness/models.d.ts.map +1 -1
  342. package/dist/harness/models.js +54 -55
  343. package/dist/harness/models.js.map +1 -1
  344. package/dist/harness/open-connector.d.ts +25 -0
  345. package/dist/harness/open-connector.d.ts.map +1 -0
  346. package/dist/harness/open-connector.js +178 -0
  347. package/dist/harness/open-connector.js.map +1 -0
  348. package/dist/harness/presenter.d.ts +31 -0
  349. package/dist/harness/presenter.d.ts.map +1 -0
  350. package/dist/harness/presenter.js +859 -0
  351. package/dist/harness/presenter.js.map +1 -0
  352. package/dist/harness/prompt.d.ts +30 -0
  353. package/dist/harness/prompt.d.ts.map +1 -0
  354. package/dist/harness/prompt.js +420 -0
  355. package/dist/harness/prompt.js.map +1 -0
  356. package/dist/harness/runner.d.ts +2 -123
  357. package/dist/harness/runner.d.ts.map +1 -1
  358. package/dist/harness/runner.js +551 -416
  359. package/dist/harness/runner.js.map +1 -1
  360. package/dist/harness/session.d.ts +122 -0
  361. package/dist/harness/session.d.ts.map +1 -0
  362. package/dist/harness/session.js +581 -0
  363. package/dist/harness/session.js.map +1 -0
  364. package/dist/harness/skills.d.ts +17 -28
  365. package/dist/harness/skills.d.ts.map +1 -1
  366. package/dist/harness/skills.js +104 -39
  367. package/dist/harness/skills.js.map +1 -1
  368. package/dist/harness/subagent-profiles.d.ts +8 -0
  369. package/dist/harness/subagent-profiles.d.ts.map +1 -0
  370. package/dist/harness/subagent-profiles.js +293 -0
  371. package/dist/harness/subagent-profiles.js.map +1 -0
  372. package/dist/harness/subagent.d.ts +64 -0
  373. package/dist/harness/subagent.d.ts.map +1 -0
  374. package/dist/harness/subagent.js +687 -0
  375. package/dist/harness/subagent.js.map +1 -0
  376. package/dist/harness/tools/attach.d.ts.map +1 -0
  377. package/dist/{adapters/slack → harness}/tools/attach.js +1 -1
  378. package/dist/harness/tools/attach.js.map +1 -0
  379. package/dist/{tools → harness/tools}/event.d.ts +4 -33
  380. package/dist/harness/tools/event.d.ts.map +1 -0
  381. package/dist/harness/tools/event.js +175 -0
  382. package/dist/harness/tools/event.js.map +1 -0
  383. package/dist/harness/tools/generate-image.d.ts +23 -0
  384. package/dist/harness/tools/generate-image.d.ts.map +1 -0
  385. package/dist/harness/tools/generate-image.js +65 -0
  386. package/dist/harness/tools/generate-image.js.map +1 -0
  387. package/dist/harness/tools/host-fn-tool.d.ts +21 -0
  388. package/dist/harness/tools/host-fn-tool.d.ts.map +1 -0
  389. package/dist/harness/tools/host-fn-tool.js +32 -0
  390. package/dist/harness/tools/host-fn-tool.js.map +1 -0
  391. package/dist/harness/tools/index.d.ts +41 -0
  392. package/dist/harness/tools/index.d.ts.map +1 -0
  393. package/dist/harness/tools/index.js +51 -0
  394. package/dist/harness/tools/index.js.map +1 -0
  395. package/dist/harness/tools/jev.d.ts +21 -0
  396. package/dist/harness/tools/jev.d.ts.map +1 -0
  397. package/dist/harness/tools/jev.js +109 -0
  398. package/dist/harness/tools/jev.js.map +1 -0
  399. package/dist/harness/tools/pi-tools.d.ts +18 -0
  400. package/dist/harness/tools/pi-tools.d.ts.map +1 -0
  401. package/dist/harness/tools/pi-tools.js +84 -0
  402. package/dist/harness/tools/pi-tools.js.map +1 -0
  403. package/dist/harness/tools/react.d.ts.map +1 -0
  404. package/dist/{tools → harness/tools}/react.js +6 -17
  405. package/dist/harness/tools/react.js.map +1 -0
  406. package/dist/{tools → harness/tools}/sandbox.d.ts +4 -4
  407. package/dist/harness/tools/sandbox.d.ts.map +1 -0
  408. package/dist/{tools → harness/tools}/sandbox.js +12 -8
  409. package/dist/harness/tools/sandbox.js.map +1 -0
  410. package/dist/harness/tools/subagent.d.ts +85 -0
  411. package/dist/harness/tools/subagent.d.ts.map +1 -0
  412. package/dist/harness/tools/subagent.js +677 -0
  413. package/dist/harness/tools/subagent.js.map +1 -0
  414. package/dist/harness/tools/task.d.ts +20 -0
  415. package/dist/harness/tools/task.d.ts.map +1 -0
  416. package/dist/harness/tools/task.js +79 -0
  417. package/dist/harness/tools/task.js.map +1 -0
  418. package/dist/harness/tools/types.d.ts +29 -0
  419. package/dist/harness/tools/types.d.ts.map +1 -0
  420. package/dist/harness/tools/types.js +2 -0
  421. package/dist/harness/tools/types.js.map +1 -0
  422. package/dist/harness/types.d.ts +384 -25
  423. package/dist/harness/types.d.ts.map +1 -1
  424. package/dist/harness/types.js +1 -1
  425. package/dist/harness/types.js.map +1 -1
  426. package/dist/index.d.ts +33 -9
  427. package/dist/index.d.ts.map +1 -1
  428. package/dist/index.js +19 -6
  429. package/dist/index.js.map +1 -1
  430. package/dist/log.d.ts.map +1 -1
  431. package/dist/log.js +4 -1
  432. package/dist/log.js.map +1 -1
  433. package/dist/main.js +357 -198
  434. package/dist/main.js.map +1 -1
  435. package/dist/observability/index.d.ts +33 -0
  436. package/dist/observability/index.d.ts.map +1 -0
  437. package/dist/observability/index.js +257 -0
  438. package/dist/observability/index.js.map +1 -0
  439. package/dist/observability/instrument.js +14 -6
  440. package/dist/observability/instrument.js.map +1 -1
  441. package/dist/observability/otel.d.ts +10 -0
  442. package/dist/observability/otel.d.ts.map +1 -0
  443. package/dist/observability/otel.js +183 -0
  444. package/dist/observability/otel.js.map +1 -0
  445. package/dist/observability/sentry.d.ts +40 -7
  446. package/dist/observability/sentry.d.ts.map +1 -1
  447. package/dist/observability/sentry.js +176 -32
  448. package/dist/observability/sentry.js.map +1 -1
  449. package/dist/observability/types.d.ts +24 -3
  450. package/dist/observability/types.d.ts.map +1 -1
  451. package/dist/observability/types.js.map +1 -1
  452. package/dist/office/index.d.ts +139 -0
  453. package/dist/office/index.d.ts.map +1 -0
  454. package/dist/office/index.js +1084 -0
  455. package/dist/office/index.js.map +1 -0
  456. package/dist/office/projection.d.ts +42 -0
  457. package/dist/office/projection.d.ts.map +1 -0
  458. package/dist/office/projection.js +182 -0
  459. package/dist/office/projection.js.map +1 -0
  460. package/dist/office/types.d.ts +116 -0
  461. package/dist/office/types.d.ts.map +1 -0
  462. package/dist/office/types.js +2 -0
  463. package/dist/office/types.js.map +1 -0
  464. package/dist/runtime/conversation-runtime.d.ts +1 -1
  465. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  466. package/dist/runtime/conversation-runtime.js +423 -152
  467. package/dist/runtime/conversation-runtime.js.map +1 -1
  468. package/dist/runtime/session-lifecycle.d.ts +76 -0
  469. package/dist/runtime/session-lifecycle.d.ts.map +1 -0
  470. package/dist/runtime/session-lifecycle.js +404 -0
  471. package/dist/runtime/session-lifecycle.js.map +1 -0
  472. package/dist/runtime/types.d.ts +63 -15
  473. package/dist/runtime/types.d.ts.map +1 -1
  474. package/dist/runtime/types.js.map +1 -1
  475. package/dist/sandbox/cloudflare.d.ts +4 -0
  476. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  477. package/dist/sandbox/cloudflare.js +54 -52
  478. package/dist/sandbox/cloudflare.js.map +1 -1
  479. package/dist/sandbox/container.d.ts +3 -0
  480. package/dist/sandbox/container.d.ts.map +1 -1
  481. package/dist/sandbox/container.js +19 -7
  482. package/dist/sandbox/container.js.map +1 -1
  483. package/dist/sandbox/host.d.ts +3 -0
  484. package/dist/sandbox/host.d.ts.map +1 -1
  485. package/dist/sandbox/host.js +44 -35
  486. package/dist/sandbox/host.js.map +1 -1
  487. package/dist/sandbox/identity.d.ts +42 -0
  488. package/dist/sandbox/identity.d.ts.map +1 -0
  489. package/dist/sandbox/identity.js +77 -0
  490. package/dist/sandbox/identity.js.map +1 -0
  491. package/dist/sandbox/index.d.ts +24 -6
  492. package/dist/sandbox/index.d.ts.map +1 -1
  493. package/dist/sandbox/index.js +77 -17
  494. package/dist/sandbox/index.js.map +1 -1
  495. package/dist/sandbox/provisioner.d.ts +139 -0
  496. package/dist/sandbox/provisioner.d.ts.map +1 -0
  497. package/dist/{provisioner.js → sandbox/provisioner.js} +378 -24
  498. package/dist/sandbox/provisioner.js.map +1 -0
  499. package/dist/sandbox/types.d.ts +43 -9
  500. package/dist/sandbox/types.d.ts.map +1 -1
  501. package/dist/sandbox/types.js.map +1 -1
  502. package/dist/sandbox/utils.d.ts +24 -0
  503. package/dist/sandbox/utils.d.ts.map +1 -1
  504. package/dist/sandbox/utils.js +92 -1
  505. package/dist/sandbox/utils.js.map +1 -1
  506. package/dist/sessions/chat-history-sync.d.ts +23 -0
  507. package/dist/sessions/chat-history-sync.d.ts.map +1 -0
  508. package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +239 -175
  509. package/dist/sessions/chat-history-sync.js.map +1 -0
  510. package/dist/sessions/history-line.d.ts +29 -0
  511. package/dist/sessions/history-line.d.ts.map +1 -0
  512. package/dist/sessions/history-line.js +45 -0
  513. package/dist/sessions/history-line.js.map +1 -0
  514. package/dist/sessions/migrate-common.d.ts +43 -0
  515. package/dist/sessions/migrate-common.d.ts.map +1 -0
  516. package/dist/sessions/migrate-common.js +99 -0
  517. package/dist/sessions/migrate-common.js.map +1 -0
  518. package/dist/sessions/migrate-pi-084.d.ts +8 -0
  519. package/dist/sessions/migrate-pi-084.d.ts.map +1 -0
  520. package/dist/sessions/migrate-pi-084.js +302 -0
  521. package/dist/sessions/migrate-pi-084.js.map +1 -0
  522. package/dist/sessions/migrate-v3.d.ts +15 -0
  523. package/dist/sessions/migrate-v3.d.ts.map +1 -0
  524. package/dist/sessions/migrate-v3.js +419 -0
  525. package/dist/sessions/migrate-v3.js.map +1 -0
  526. package/dist/sessions/session-key.d.ts +33 -0
  527. package/dist/sessions/session-key.d.ts.map +1 -0
  528. package/dist/sessions/session-key.js +115 -0
  529. package/dist/sessions/session-key.js.map +1 -0
  530. package/dist/sessions/session-store.d.ts +61 -0
  531. package/dist/sessions/session-store.d.ts.map +1 -0
  532. package/dist/sessions/session-store.js +684 -0
  533. package/dist/sessions/session-store.js.map +1 -0
  534. package/dist/sessions/store.d.ts +17 -10
  535. package/dist/sessions/store.d.ts.map +1 -1
  536. package/dist/sessions/store.js +182 -47
  537. package/dist/sessions/store.js.map +1 -1
  538. package/dist/sessions/types.d.ts +74 -8
  539. package/dist/sessions/types.d.ts.map +1 -1
  540. package/dist/sessions/types.js +1 -1
  541. package/dist/sessions/types.js.map +1 -1
  542. package/dist/settings/apply.d.ts +16 -0
  543. package/dist/settings/apply.d.ts.map +1 -0
  544. package/dist/settings/apply.js +60 -0
  545. package/dist/settings/apply.js.map +1 -0
  546. package/dist/settings/index.d.ts +126 -0
  547. package/dist/settings/index.d.ts.map +1 -0
  548. package/dist/settings/index.js +422 -0
  549. package/dist/settings/index.js.map +1 -0
  550. package/dist/settings/migrate.d.ts +21 -0
  551. package/dist/settings/migrate.d.ts.map +1 -0
  552. package/dist/settings/migrate.js +86 -0
  553. package/dist/settings/migrate.js.map +1 -0
  554. package/dist/types.d.ts +330 -141
  555. package/dist/types.d.ts.map +1 -1
  556. package/dist/types.js +2 -2
  557. package/dist/types.js.map +1 -1
  558. package/dist/vault/index.d.ts +52 -2
  559. package/dist/vault/index.d.ts.map +1 -1
  560. package/dist/vault/index.js +218 -86
  561. package/dist/vault/index.js.map +1 -1
  562. package/dist/vault/types.d.ts +6 -2
  563. package/dist/vault/types.d.ts.map +1 -1
  564. package/dist/vault/types.js.map +1 -1
  565. package/package.json +79 -40
  566. package/dist/adapter.d.ts +0 -2
  567. package/dist/adapter.d.ts.map +0 -1
  568. package/dist/adapter.js +0 -2
  569. package/dist/adapter.js.map +0 -1
  570. package/dist/adapters/slack/tools/attach.d.ts.map +0 -1
  571. package/dist/adapters/slack/tools/attach.js.map +0 -1
  572. package/dist/adapters/streaming.d.ts +0 -18
  573. package/dist/adapters/streaming.d.ts.map +0 -1
  574. package/dist/adapters/streaming.js +0 -44
  575. package/dist/adapters/streaming.js.map +0 -1
  576. package/dist/adapters/telegram/html.d.ts +0 -3
  577. package/dist/adapters/telegram/html.d.ts.map +0 -1
  578. package/dist/adapters/telegram/html.js +0 -98
  579. package/dist/adapters/telegram/html.js.map +0 -1
  580. package/dist/agent-events.d.ts +0 -5
  581. package/dist/agent-events.d.ts.map +0 -1
  582. package/dist/agent-events.js +0 -26
  583. package/dist/agent-events.js.map +0 -1
  584. package/dist/agent.d.ts +0 -39
  585. package/dist/agent.d.ts.map +0 -1
  586. package/dist/agent.js +0 -1291
  587. package/dist/agent.js.map +0 -1
  588. package/dist/cli/ext-git.d.ts +0 -22
  589. package/dist/cli/ext-git.d.ts.map +0 -1
  590. package/dist/cli/ext-git.js +0 -76
  591. package/dist/cli/ext-git.js.map +0 -1
  592. package/dist/cli/ext.d.ts +0 -2
  593. package/dist/cli/ext.d.ts.map +0 -1
  594. package/dist/cli/ext.js +0 -217
  595. package/dist/cli/ext.js.map +0 -1
  596. package/dist/commands/admin.d.ts.map +0 -1
  597. package/dist/commands/admin.js.map +0 -1
  598. package/dist/commands/auto-reply.d.ts.map +0 -1
  599. package/dist/commands/auto-reply.js +0 -76
  600. package/dist/commands/auto-reply.js.map +0 -1
  601. package/dist/commands/extensions.d.ts +0 -14
  602. package/dist/commands/extensions.d.ts.map +0 -1
  603. package/dist/commands/extensions.js +0 -55
  604. package/dist/commands/extensions.js.map +0 -1
  605. package/dist/commands/login.d.ts +0 -5
  606. package/dist/commands/login.d.ts.map +0 -1
  607. package/dist/commands/login.js +0 -115
  608. package/dist/commands/login.js.map +0 -1
  609. package/dist/commands/model.d.ts +0 -10
  610. package/dist/commands/model.d.ts.map +0 -1
  611. package/dist/commands/model.js +0 -102
  612. package/dist/commands/model.js.map +0 -1
  613. package/dist/commands/new.d.ts.map +0 -1
  614. package/dist/commands/new.js +0 -25
  615. package/dist/commands/new.js.map +0 -1
  616. package/dist/commands/parse.d.ts +0 -7
  617. package/dist/commands/parse.d.ts.map +0 -1
  618. package/dist/commands/parse.js +0 -14
  619. package/dist/commands/parse.js.map +0 -1
  620. package/dist/commands/registry.d.ts +0 -5
  621. package/dist/commands/registry.d.ts.map +0 -1
  622. package/dist/commands/registry.js +0 -31
  623. package/dist/commands/registry.js.map +0 -1
  624. package/dist/commands/sandbox.d.ts.map +0 -1
  625. package/dist/commands/sandbox.js +0 -78
  626. package/dist/commands/sandbox.js.map +0 -1
  627. package/dist/commands/session-view.d.ts.map +0 -1
  628. package/dist/commands/session-view.js.map +0 -1
  629. package/dist/commands/types.d.ts +0 -66
  630. package/dist/commands/types.d.ts.map +0 -1
  631. package/dist/commands/types.js.map +0 -1
  632. package/dist/commands/utils.d.ts +0 -11
  633. package/dist/commands/utils.d.ts.map +0 -1
  634. package/dist/commands/utils.js.map +0 -1
  635. package/dist/config.d.ts +0 -78
  636. package/dist/config.d.ts.map +0 -1
  637. package/dist/config.js +0 -450
  638. package/dist/config.js.map +0 -1
  639. package/dist/download.d.ts.map +0 -1
  640. package/dist/download.js +0 -89
  641. package/dist/download.js.map +0 -1
  642. package/dist/events.d.ts +0 -43
  643. package/dist/events.d.ts.map +0 -1
  644. package/dist/events.js +0 -456
  645. package/dist/events.js.map +0 -1
  646. package/dist/execution-resolver.d.ts +0 -21
  647. package/dist/execution-resolver.d.ts.map +0 -1
  648. package/dist/execution-resolver.js +0 -170
  649. package/dist/execution-resolver.js.map +0 -1
  650. package/dist/harness/auth.d.ts +0 -16
  651. package/dist/harness/auth.d.ts.map +0 -1
  652. package/dist/harness/auth.js +0 -86
  653. package/dist/harness/auth.js.map +0 -1
  654. package/dist/harness/extensions/loader.d.ts +0 -86
  655. package/dist/harness/extensions/loader.d.ts.map +0 -1
  656. package/dist/harness/extensions/loader.js +0 -525
  657. package/dist/harness/extensions/loader.js.map +0 -1
  658. package/dist/harness/extensions/registry.d.ts +0 -23
  659. package/dist/harness/extensions/registry.d.ts.map +0 -1
  660. package/dist/harness/extensions/registry.js +0 -45
  661. package/dist/harness/extensions/registry.js.map +0 -1
  662. package/dist/harness/extensions/types.d.ts +0 -248
  663. package/dist/harness/extensions/types.d.ts.map +0 -1
  664. package/dist/harness/extensions/types.js.map +0 -1
  665. package/dist/harness/session-store.d.ts +0 -77
  666. package/dist/harness/session-store.d.ts.map +0 -1
  667. package/dist/harness/session-store.js +0 -248
  668. package/dist/harness/session-store.js.map +0 -1
  669. package/dist/harness/settings.d.ts +0 -47
  670. package/dist/harness/settings.d.ts.map +0 -1
  671. package/dist/harness/settings.js +0 -29
  672. package/dist/harness/settings.js.map +0 -1
  673. package/dist/model-registry.d.ts +0 -4
  674. package/dist/model-registry.d.ts.map +0 -1
  675. package/dist/model-registry.js +0 -7
  676. package/dist/model-registry.js.map +0 -1
  677. package/dist/platform-messages.d.ts.map +0 -1
  678. package/dist/platform-messages.js.map +0 -1
  679. package/dist/portal-shell.d.ts +0 -4
  680. package/dist/portal-shell.d.ts.map +0 -1
  681. package/dist/portal-shell.js.map +0 -1
  682. package/dist/provisioner.d.ts +0 -61
  683. package/dist/provisioner.d.ts.map +0 -1
  684. package/dist/provisioner.js.map +0 -1
  685. package/dist/runtime/agent-run-controller.d.ts +0 -31
  686. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  687. package/dist/runtime/agent-run-controller.js +0 -195
  688. package/dist/runtime/agent-run-controller.js.map +0 -1
  689. package/dist/sandbox/errors.d.ts +0 -6
  690. package/dist/sandbox/errors.d.ts.map +0 -1
  691. package/dist/sandbox/errors.js +0 -11
  692. package/dist/sandbox/errors.js.map +0 -1
  693. package/dist/sandbox/firecracker.d.ts +0 -15
  694. package/dist/sandbox/firecracker.d.ts.map +0 -1
  695. package/dist/sandbox/firecracker.js +0 -212
  696. package/dist/sandbox/firecracker.js.map +0 -1
  697. package/dist/sandbox/image.d.ts +0 -3
  698. package/dist/sandbox/image.d.ts.map +0 -1
  699. package/dist/sandbox/image.js +0 -27
  700. package/dist/sandbox/image.js.map +0 -1
  701. package/dist/sandbox/path-context.d.ts +0 -3
  702. package/dist/sandbox/path-context.d.ts.map +0 -1
  703. package/dist/sandbox/path-context.js +0 -20
  704. package/dist/sandbox/path-context.js.map +0 -1
  705. package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
  706. package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
  707. package/dist/sessions/agent-memory-file-manager.js.map +0 -1
  708. package/dist/sessions/metadata.d.ts +0 -3
  709. package/dist/sessions/metadata.d.ts.map +0 -1
  710. package/dist/sessions/metadata.js +0 -11
  711. package/dist/sessions/metadata.js.map +0 -1
  712. package/dist/sessions/policy.d.ts +0 -6
  713. package/dist/sessions/policy.d.ts.map +0 -1
  714. package/dist/sessions/policy.js +0 -23
  715. package/dist/sessions/policy.js.map +0 -1
  716. package/dist/store.d.ts +0 -46
  717. package/dist/store.d.ts.map +0 -1
  718. package/dist/store.js +0 -177
  719. package/dist/store.js.map +0 -1
  720. package/dist/tools/bash.d.ts +0 -10
  721. package/dist/tools/bash.d.ts.map +0 -1
  722. package/dist/tools/bash.js +0 -80
  723. package/dist/tools/bash.js.map +0 -1
  724. package/dist/tools/edit.d.ts +0 -11
  725. package/dist/tools/edit.d.ts.map +0 -1
  726. package/dist/tools/edit.js +0 -131
  727. package/dist/tools/edit.js.map +0 -1
  728. package/dist/tools/event.d.ts.map +0 -1
  729. package/dist/tools/event.js +0 -252
  730. package/dist/tools/event.js.map +0 -1
  731. package/dist/tools/index.d.ts +0 -24
  732. package/dist/tools/index.d.ts.map +0 -1
  733. package/dist/tools/index.js +0 -31
  734. package/dist/tools/index.js.map +0 -1
  735. package/dist/tools/react.d.ts.map +0 -1
  736. package/dist/tools/react.js.map +0 -1
  737. package/dist/tools/read.d.ts +0 -11
  738. package/dist/tools/read.d.ts.map +0 -1
  739. package/dist/tools/read.js +0 -134
  740. package/dist/tools/read.js.map +0 -1
  741. package/dist/tools/sandbox.d.ts.map +0 -1
  742. package/dist/tools/sandbox.js.map +0 -1
  743. package/dist/tools/truncate.d.ts +0 -33
  744. package/dist/tools/truncate.d.ts.map +0 -1
  745. package/dist/tools/truncate.js +0 -184
  746. package/dist/tools/truncate.js.map +0 -1
  747. package/dist/tools/types.d.ts +0 -54
  748. package/dist/tools/types.d.ts.map +0 -1
  749. package/dist/tools/types.js.map +0 -1
  750. package/dist/tools/write.d.ts +0 -10
  751. package/dist/tools/write.d.ts.map +0 -1
  752. package/dist/tools/write.js +0 -29
  753. package/dist/tools/write.js.map +0 -1
  754. package/dist/trigger.d.ts +0 -22
  755. package/dist/trigger.d.ts.map +0 -1
  756. package/dist/trigger.js +0 -100
  757. package/dist/trigger.js.map +0 -1
  758. package/dist/utils/date.d.ts +0 -10
  759. package/dist/utils/date.d.ts.map +0 -1
  760. package/dist/utils/date.js +0 -23
  761. package/dist/utils/date.js.map +0 -1
  762. package/dist/utils/env.d.ts +0 -3
  763. package/dist/utils/env.d.ts.map +0 -1
  764. package/dist/utils/env.js +0 -12
  765. package/dist/utils/env.js.map +0 -1
  766. package/dist/utils/file-guards.d.ts +0 -9
  767. package/dist/utils/file-guards.d.ts.map +0 -1
  768. package/dist/utils/file-guards.js +0 -59
  769. package/dist/utils/file-guards.js.map +0 -1
  770. package/dist/utils/fs-atomic.d.ts +0 -10
  771. package/dist/utils/fs-atomic.d.ts.map +0 -1
  772. package/dist/utils/fs-atomic.js +0 -45
  773. package/dist/utils/fs-atomic.js.map +0 -1
  774. package/dist/utils/html.d.ts +0 -2
  775. package/dist/utils/html.d.ts.map +0 -1
  776. package/dist/utils/html.js +0 -4
  777. package/dist/utils/html.js.map +0 -1
  778. package/dist/utils/http-body.d.ts +0 -10
  779. package/dist/utils/http-body.d.ts.map +0 -1
  780. package/dist/utils/http-body.js +0 -34
  781. package/dist/utils/http-body.js.map +0 -1
  782. package/dist/vault/routing.d.ts +0 -3
  783. package/dist/vault/routing.d.ts.map +0 -1
  784. package/dist/vault/routing.js +0 -13
  785. package/dist/vault/routing.js.map +0 -1
  786. package/dist/web/admin/portal.d.ts +0 -5
  787. package/dist/web/admin/portal.d.ts.map +0 -1
  788. package/dist/web/admin/portal.js +0 -2572
  789. package/dist/web/admin/portal.js.map +0 -1
  790. package/dist/web/admin/provider-models.d.ts.map +0 -1
  791. package/dist/web/admin/provider-models.js.map +0 -1
  792. package/dist/web/admin/store.d.ts +0 -13
  793. package/dist/web/admin/store.d.ts.map +0 -1
  794. package/dist/web/admin/store.js +0 -14
  795. package/dist/web/admin/store.js.map +0 -1
  796. package/dist/web/admin/types.d.ts +0 -30
  797. package/dist/web/admin/types.d.ts.map +0 -1
  798. package/dist/web/admin/types.js.map +0 -1
  799. package/dist/web/agent-events/portal.d.ts +0 -3
  800. package/dist/web/agent-events/portal.d.ts.map +0 -1
  801. package/dist/web/agent-events/portal.js +0 -18
  802. package/dist/web/agent-events/portal.js.map +0 -1
  803. package/dist/web/login/oauth.d.ts +0 -6
  804. package/dist/web/login/oauth.d.ts.map +0 -1
  805. package/dist/web/login/oauth.js.map +0 -1
  806. package/dist/web/login/portal.d.ts.map +0 -1
  807. package/dist/web/login/portal.js.map +0 -1
  808. package/dist/web/login/store.d.ts +0 -8
  809. package/dist/web/login/store.d.ts.map +0 -1
  810. package/dist/web/login/store.js +0 -15
  811. package/dist/web/login/store.js.map +0 -1
  812. package/dist/web/login/types.d.ts.map +0 -1
  813. package/dist/web/login/types.js.map +0 -1
  814. package/dist/web/request.d.ts +0 -3
  815. package/dist/web/request.d.ts.map +0 -1
  816. package/dist/web/request.js +0 -13
  817. package/dist/web/request.js.map +0 -1
  818. package/dist/web/server.d.ts.map +0 -1
  819. package/dist/web/server.js.map +0 -1
  820. package/dist/web/session-view/command.d.ts +0 -4
  821. package/dist/web/session-view/command.d.ts.map +0 -1
  822. package/dist/web/session-view/command.js +0 -7
  823. package/dist/web/session-view/command.js.map +0 -1
  824. package/dist/web/session-view/portal.d.ts +0 -13
  825. package/dist/web/session-view/portal.d.ts.map +0 -1
  826. package/dist/web/session-view/portal.js.map +0 -1
  827. package/dist/web/session-view/service.d.ts +0 -6
  828. package/dist/web/session-view/service.d.ts.map +0 -1
  829. package/dist/web/session-view/service.js +0 -498
  830. package/dist/web/session-view/service.js.map +0 -1
  831. package/dist/web/session-view/store.d.ts +0 -8
  832. package/dist/web/session-view/store.d.ts.map +0 -1
  833. package/dist/web/session-view/store.js +0 -15
  834. package/dist/web/session-view/store.js.map +0 -1
  835. package/dist/web/session-view/types.d.ts.map +0 -1
  836. package/dist/web/session-view/types.js.map +0 -1
  837. package/dist/web/token-store.d.ts.map +0 -1
  838. package/dist/web/token-store.js.map +0 -1
  839. package/dist/web/types.d.ts.map +0 -1
  840. package/dist/web/types.js.map +0 -1
  841. /package/dist/{commands → adapters/commands}/admin.d.ts +0 -0
  842. /package/dist/{commands → adapters/commands}/new.d.ts +0 -0
  843. /package/dist/{commands → adapters/commands}/sandbox.d.ts +0 -0
  844. /package/dist/{commands → adapters/commands}/session-view.d.ts +0 -0
  845. /package/dist/{commands → adapters/commands}/types.js +0 -0
  846. /package/dist/{harness/extensions → adapters/github}/types.js +0 -0
  847. /package/dist/{tools → adapters/web/admin}/types.js +0 -0
  848. /package/dist/{web/admin → adapters/web/login}/types.js +0 -0
  849. /package/dist/{web/login → adapters/web/session-view}/types.js +0 -0
  850. /package/dist/{web → adapters/web}/token-store.d.ts +0 -0
  851. /package/dist/{web → adapters/web}/types.d.ts +0 -0
  852. /package/dist/{web/session-view → adapters/web}/types.js +0 -0
  853. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
  854. /package/dist/{web → cli}/types.js +0 -0
  855. /package/dist/{adapters/slack → harness}/tools/attach.d.ts +0 -0
  856. /package/dist/{tools → harness/tools}/react.d.ts +0 -0
@@ -0,0 +1,720 @@
1
+ import { existsSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import { Type } from "@sinclair/typebox";
4
+ import { createConversationEvent } from "../index.js";
5
+ import * as log from "../../log.js";
6
+ import { ensureDirExists, readJsonSchemaFileIfExists } from "../../file-guards.js";
7
+ import { atomicWritePrivateFile } from "../../file-guards.js";
8
+ import { resolveChatSessionKey } from "../../sessions/session-key.js";
9
+ import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, splitText, } from "../shared.js";
10
+ import { matchMagicWord, processMessageIntake } from "../intake.js";
11
+ import { GithubClient, GITHUB_MAX_COMMENT_LENGTH, githubRetry } from "./client.js";
12
+ import { createGithubAdapters } from "./context.js";
13
+ import { fetchIsPr, fetchPrHeadBranch, GithubOps } from "./github-ops.js";
14
+ import { cloneRepo, conversationRepoDir } from "./repo.js";
15
+ import { createOfficeAddress } from "../../office/index.js";
16
+ import { buildGithubConversationId, GITHUB_ISSUE_BODY_TS, githubReviewCommentTs, parseGithubConversationId, parseReviewCommentTs, } from "./ids.js";
17
+ const SyncStateSchema = Type.Object({
18
+ repos: Type.Record(Type.String(), Type.Object({
19
+ baseline: Type.String(),
20
+ cursor: Type.String(),
21
+ seenComments: Type.Array(Type.Number()),
22
+ seenIssues: Type.Array(Type.Number()),
23
+ // Optional: state files written before review-comment polling must keep
24
+ // loading — a schema failure re-baselines and silently drops dedup state.
25
+ seenReviewComments: Type.Optional(Type.Array(Type.Number())),
26
+ })),
27
+ });
28
+ /**
29
+ * Re-fetch this far behind the cursor each poll. Dedup is by id (the
30
+ * watermark), so the overlap only costs bandwidth and closes the boundary
31
+ * races of a bare `since` timestamp (DESIGN.md § Event source).
32
+ */
33
+ const POLL_OVERLAP_MS = 5 * 60 * 1000;
34
+ const MAX_SEEN_IDS = 5000;
35
+ /** Webhook pokes within this window collapse into one poll tick. */
36
+ const REQUEST_POLL_DEBOUNCE_MS = 1500;
37
+ /** Effective role → rank, for the trigger-permission gate. */
38
+ const PERMISSION_RANK = {
39
+ none: 0,
40
+ read: 1,
41
+ triage: 2,
42
+ write: 3,
43
+ maintain: 4,
44
+ admin: 5,
45
+ };
46
+ /**
47
+ * Commenters need write or better to trigger the agent. Fixed, not a config
48
+ * knob: it guards public repos (anyone can comment there), and the people who
49
+ * ask an agent to change code are exactly the people with push access.
50
+ */
51
+ const REQUIRED_TRIGGER_RANK = PERMISSION_RANK.write;
52
+ /** Rank for an arbitrary API-reported permission name; unknown names rank 0. */
53
+ function rankOfPermission(name) {
54
+ return PERMISSION_RANK[name] ?? 0;
55
+ }
56
+ /** Permission lookups are cached this long per repo+user. */
57
+ const PERMISSION_CACHE_TTL_MS = 5 * 60 * 1000;
58
+ export const formatGithubContinuation = (partNum) => `*(continued ${partNum})*`;
59
+ /** Slack-style emoji short names → GitHub reaction content values. */
60
+ const GITHUB_REACTIONS = {
61
+ "+1": "+1",
62
+ thumbsup: "+1",
63
+ "-1": "-1",
64
+ thumbsdown: "-1",
65
+ laugh: "laugh",
66
+ smile: "laugh",
67
+ confused: "confused",
68
+ heart: "heart",
69
+ hooray: "hooray",
70
+ tada: "hooray",
71
+ rocket: "rocket",
72
+ eyes: "eyes",
73
+ };
74
+ // Repo refs are lowercased at every entry point (env config here, the
75
+ // installation API in start()) so conversation ids and sync-state keys never
76
+ // depend on how a repo's name was spelled — GitHub is case-insensitive.
77
+ function parseRepoList(repos) {
78
+ return repos.map((entry) => {
79
+ const [owner, repo, ...rest] = entry.split("/");
80
+ if (!owner || !repo || rest.length > 0) {
81
+ throw new Error(`Invalid GITHUB_REPOS entry (expected owner/repo): ${entry}`);
82
+ }
83
+ return { owner: owner.toLowerCase(), repo: repo.toLowerCase() };
84
+ });
85
+ }
86
+ /** Sets iterate in insertion order; drop the oldest ids once over the cap. */
87
+ function pruneSeen(seen) {
88
+ if (seen.size <= MAX_SEEN_IDS)
89
+ return;
90
+ let toDrop = seen.size - MAX_SEEN_IDS / 2;
91
+ for (const id of seen) {
92
+ if (toDrop-- <= 0)
93
+ break;
94
+ seen.delete(id);
95
+ }
96
+ }
97
+ /** Issue number from a comment's `issue_url` (…/repos/o/r/issues/42). */
98
+ function issueNumberFromUrl(issueUrl) {
99
+ const match = /\/issues\/(\d+)$/.exec(issueUrl);
100
+ if (!match) {
101
+ throw new Error(`Cannot parse issue number from ${issueUrl}`);
102
+ }
103
+ return Number(match[1]);
104
+ }
105
+ /** PR number from a review comment's `pull_request_url` (…/repos/o/r/pulls/42). */
106
+ function prNumberFromUrl(pullRequestUrl) {
107
+ const match = /\/pulls\/(\d+)$/.exec(pullRequestUrl);
108
+ if (!match) {
109
+ throw new Error(`Cannot parse PR number from ${pullRequestUrl}`);
110
+ }
111
+ return Number(match[1]);
112
+ }
113
+ /** Keep the tail: a review comment anchors to the hunk's final lines. */
114
+ const MAX_DIFF_HUNK_CHARS = 1500;
115
+ const MAX_THREAD_TURNS = 10;
116
+ const MAX_THREAD_TURN_CHARS = 500;
117
+ export class GithubMessagingBot {
118
+ constructor(handler, config, client) {
119
+ this.appSlug = null;
120
+ this.botEmail = null;
121
+ this.watchedRepos = [];
122
+ this.queues = new Map();
123
+ this.repoState = new Map();
124
+ this.permissionCache = new Map();
125
+ this.stopped = true;
126
+ this.stopping = false;
127
+ this.activePoll = null;
128
+ this.pollPending = false;
129
+ this.pollIntervalTimer = null;
130
+ this.requestPollTimer = null;
131
+ this.handler = handler;
132
+ this.config = config;
133
+ this.client =
134
+ client ??
135
+ new GithubClient({
136
+ appId: config.appId,
137
+ privateKey: config.privateKey,
138
+ installationId: config.installationId,
139
+ });
140
+ this.ops = new GithubOps(this.client, { workspace: config.workspace });
141
+ }
142
+ // ==========================================================================
143
+ // Public API (implements MessagingBot)
144
+ // ==========================================================================
145
+ async start() {
146
+ this.stopped = false;
147
+ this.stopping = false;
148
+ this.appSlug = await this.client.getAppSlug();
149
+ // Canonical noreply author email (<user-id>+<login>@users.noreply.github.com)
150
+ // so the bot's commits link to its avatar/profile; degrade to a plain
151
+ // noreply spelling when the lookup fails.
152
+ try {
153
+ const botUserId = await this.client.getUserId(`${this.appSlug}[bot]`);
154
+ this.botEmail = `${botUserId}+${this.appSlug}[bot]@users.noreply.github.com`;
155
+ }
156
+ catch {
157
+ this.botEmail = `${this.appSlug}[bot]@users.noreply.github.com`;
158
+ }
159
+ this.watchedRepos =
160
+ this.config.repos.length > 0
161
+ ? parseRepoList(this.config.repos)
162
+ : (await this.client.listInstallationRepositories()).map((repository) => ({
163
+ owner: repository.owner.login.toLowerCase(),
164
+ repo: repository.name.toLowerCase(),
165
+ }));
166
+ if (this.watchedRepos.length === 0) {
167
+ log.logWarning("GitHub: installation has no repositories; nothing to poll");
168
+ }
169
+ // Restore persisted watermarks; a repo watched for the first time gets a
170
+ // baseline of "now" so history never triggers (DESIGN.md § Event source).
171
+ const persisted = this.loadSyncState();
172
+ const now = new Date().toISOString();
173
+ for (const repo of this.watchedRepos) {
174
+ const repoKey = `${repo.owner}/${repo.repo}`;
175
+ const saved = persisted?.repos[repoKey];
176
+ this.repoState.set(repoKey, saved
177
+ ? {
178
+ baseline: saved.baseline,
179
+ cursor: saved.cursor,
180
+ seenComments: new Set(saved.seenComments),
181
+ seenIssues: new Set(saved.seenIssues),
182
+ seenReviewComments: new Set(saved.seenReviewComments ?? []),
183
+ }
184
+ : {
185
+ baseline: now,
186
+ cursor: now,
187
+ seenComments: new Set(),
188
+ seenIssues: new Set(),
189
+ seenReviewComments: new Set(),
190
+ });
191
+ }
192
+ this.persistSyncState();
193
+ if (this.stopping)
194
+ return;
195
+ this.stopped = false;
196
+ this.pollIntervalTimer = setInterval(() => {
197
+ void this.poll();
198
+ }, this.config.pollIntervalMs);
199
+ this.pollIntervalTimer.unref();
200
+ log.logConnected("GitHub");
201
+ log.logInfo(`GitHub bot started as @${this.appSlug}[bot], polling ${this.watchedRepos.length} repo(s) every ${Math.round(this.config.pollIntervalMs / 1000)}s`);
202
+ }
203
+ async stop() {
204
+ this.stopping = true;
205
+ this.pollPending = false;
206
+ if (this.pollIntervalTimer)
207
+ clearInterval(this.pollIntervalTimer);
208
+ if (this.requestPollTimer)
209
+ clearTimeout(this.requestPollTimer);
210
+ this.pollIntervalTimer = null;
211
+ this.requestPollTimer = null;
212
+ try {
213
+ if (this.activePoll)
214
+ await this.activePoll;
215
+ }
216
+ finally {
217
+ this.stopped = true;
218
+ await Promise.all([...this.queues.values()].map((queue) => queue.close()));
219
+ }
220
+ }
221
+ async postMessage(channel, text) {
222
+ const ref = parseGithubConversationId(channel);
223
+ const parts = splitText(text, GITHUB_MAX_COMMENT_LENGTH, formatGithubContinuation);
224
+ const firstId = await this.postComment(ref, parts[0] ?? text);
225
+ for (const part of parts.slice(1)) {
226
+ await this.postComment(ref, part);
227
+ }
228
+ return String(firstId);
229
+ }
230
+ async updateMessage(channel, ts, text) {
231
+ const ref = parseGithubConversationId(channel);
232
+ await githubRetry(() => this.client.updateIssueComment(ref.owner, ref.repo, Number(ts), text));
233
+ }
234
+ async addReaction(channel, messageTs, emoji) {
235
+ const ref = parseGithubConversationId(channel);
236
+ const content = GITHUB_REACTIONS[emoji.replace(/^:|:$/g, "")];
237
+ if (!content) {
238
+ throw new Error(`GitHub does not support reaction '${emoji}' (supported: ${Object.keys(GITHUB_REACTIONS).join(", ")})`);
239
+ }
240
+ const reviewCommentId = parseReviewCommentTs(messageTs);
241
+ await githubRetry(() => {
242
+ if (messageTs === GITHUB_ISSUE_BODY_TS) {
243
+ return this.client.createIssueReaction(ref.owner, ref.repo, ref.number, content);
244
+ }
245
+ if (reviewCommentId !== null) {
246
+ return this.client.createReviewCommentReaction(ref.owner, ref.repo, reviewCommentId, content);
247
+ }
248
+ return this.client.createCommentReaction(ref.owner, ref.repo, Number(messageTs), content);
249
+ });
250
+ }
251
+ enqueueEvent(event) {
252
+ if (this.stopped)
253
+ return false;
254
+ const conversationId = event.conversationId;
255
+ const queue = this.getQueue(conversationId);
256
+ if (queue.size() >= 5) {
257
+ log.logWarning(`Event queue full for ${conversationId}, discarding: ${event.text.substring(0, 50)}`);
258
+ return false;
259
+ }
260
+ log.logInfo(`Enqueueing event for ${conversationId}: ${event.text.substring(0, 50)}`);
261
+ return queue.enqueue(() => {
262
+ const context = createGithubAdapters(event, this);
263
+ return this.handler.handleEvent(event, this, context);
264
+ });
265
+ }
266
+ getMessagingInfo() {
267
+ return {
268
+ name: "github",
269
+ trustModel: "open-trigger",
270
+ formattingGuide: "## GitHub Formatting (GitHub Flavored Markdown)\n" +
271
+ "Standard Markdown plus tables, task lists, fenced code blocks, and ```suggestion blocks.\n" +
272
+ "Reference issues/PRs as #123 and users as @login (mentions notify people — use sparingly).",
273
+ channels: [],
274
+ users: [],
275
+ };
276
+ }
277
+ // ==========================================================================
278
+ // Internal helpers (used by context.ts)
279
+ // ==========================================================================
280
+ async postComment(ref, text) {
281
+ const comment = await githubRetry(() => this.client.createIssueComment(ref.owner, ref.repo, ref.number, text));
282
+ return comment.id;
283
+ }
284
+ async deleteComment(ref, commentId) {
285
+ await githubRetry(() => this.client.deleteIssueComment(ref.owner, ref.repo, commentId));
286
+ }
287
+ logToFile(conversationId, entry) {
288
+ appendChannelLog(this.office(conversationId), entry);
289
+ }
290
+ logBotResponse(conversationId, text, ts) {
291
+ appendBotResponseLog(this.office(conversationId), text, ts);
292
+ }
293
+ // ==========================================================================
294
+ // Private - polling
295
+ // ==========================================================================
296
+ getQueue(conversationId) {
297
+ let queue = this.queues.get(conversationId);
298
+ if (!queue) {
299
+ queue = new MessagingEventQueue("GitHub");
300
+ this.queues.set(conversationId, queue);
301
+ }
302
+ return queue;
303
+ }
304
+ /**
305
+ * Webhook poke: run a poll soon. Debounced so a burst of deliveries costs
306
+ * one tick; a poke landing mid-poll marks it pending and the tick re-runs,
307
+ * because the in-flight pass may already be past the poked repo's feeds.
308
+ */
309
+ requestPoll(debounceMs = REQUEST_POLL_DEBOUNCE_MS) {
310
+ if (this.stopped || this.stopping)
311
+ return;
312
+ if (this.activePoll) {
313
+ this.pollPending = true;
314
+ return;
315
+ }
316
+ if (this.requestPollTimer)
317
+ return;
318
+ this.requestPollTimer = setTimeout(() => {
319
+ this.requestPollTimer = null;
320
+ void this.poll();
321
+ }, debounceMs);
322
+ this.requestPollTimer.unref();
323
+ }
324
+ /** One poll tick over every watched repo. Public for tests. */
325
+ async poll() {
326
+ if (this.stopped || this.stopping)
327
+ return;
328
+ if (this.activePoll) {
329
+ this.pollPending = true;
330
+ return;
331
+ }
332
+ const activePoll = this.pollWatchedRepos();
333
+ this.activePoll = activePoll;
334
+ try {
335
+ await activePoll;
336
+ }
337
+ finally {
338
+ this.activePoll = null;
339
+ if (this.pollPending) {
340
+ this.pollPending = false;
341
+ this.requestPoll();
342
+ }
343
+ }
344
+ }
345
+ async pollWatchedRepos() {
346
+ let changed = false;
347
+ for (const repo of this.watchedRepos) {
348
+ try {
349
+ changed = (await this.pollRepo(repo)) || changed;
350
+ }
351
+ catch (err) {
352
+ log.logWarning(`GitHub poll failed for ${repo.owner}/${repo.repo}`, err instanceof Error ? err.message : String(err));
353
+ }
354
+ }
355
+ if (changed)
356
+ this.persistSyncState();
357
+ }
358
+ async pollRepo(repo) {
359
+ const repoKey = `${repo.owner}/${repo.repo}`;
360
+ const state = this.repoState.get(repoKey);
361
+ if (!state)
362
+ return false;
363
+ const since = new Date(Date.parse(state.cursor) - POLL_OVERLAP_MS).toISOString();
364
+ let changed = false;
365
+ // Comment activity also bumps the parent issue's updated_at, so the issues
366
+ // list mostly echoes the comments list; only issues *created* since the
367
+ // baseline are new conversations (their body is the first message).
368
+ const issues = (await this.client.listIssuesSince(repo.owner, repo.repo, since)) ?? [];
369
+ changed =
370
+ (await this.advanceFeed(state, state.seenIssues, issues, (issue) => ({
371
+ ref: { ...repo, number: issue.number },
372
+ ts: GITHUB_ISSUE_BODY_TS,
373
+ user: issue.user.login,
374
+ text: `# ${issue.title}\n\n${issue.body ?? ""}`.trim(),
375
+ createdAt: issue.created_at,
376
+ isPr: Boolean(issue.pull_request),
377
+ }))) || changed;
378
+ const comments = (await this.client.listIssueCommentsSince(repo.owner, repo.repo, since)) ?? [];
379
+ changed =
380
+ (await this.advanceFeed(state, state.seenComments, comments, (comment) => ({
381
+ ref: { ...repo, number: issueNumberFromUrl(comment.issue_url) },
382
+ ts: String(comment.id),
383
+ user: comment.user.login,
384
+ text: comment.body,
385
+ createdAt: comment.created_at,
386
+ }))) || changed;
387
+ // Inline PR review comments live in their own endpoint and id space; the
388
+ // same watermark discipline applies. The bot's own thread replies (the
389
+ // github_review_reply tool) re-surface here and are dropped as Bot-authored.
390
+ const reviewComments = (await this.client.listPullReviewCommentsSince(repo.owner, repo.repo, since)) ?? [];
391
+ changed =
392
+ (await this.advanceFeed(state, state.seenReviewComments, reviewComments, (comment) => ({
393
+ ref: { ...repo, number: prNumberFromUrl(comment.pull_request_url) },
394
+ ts: githubReviewCommentTs(comment.id),
395
+ user: comment.user.login,
396
+ text: comment.body,
397
+ createdAt: comment.created_at,
398
+ isPr: true,
399
+ review: {
400
+ commentId: comment.id,
401
+ path: comment.path,
402
+ line: comment.line,
403
+ diffHunk: comment.diff_hunk,
404
+ inReplyToId: comment.in_reply_to_id,
405
+ },
406
+ }))) || changed;
407
+ pruneSeen(state.seenComments);
408
+ pruneSeen(state.seenIssues);
409
+ pruneSeen(state.seenReviewComments);
410
+ return changed;
411
+ }
412
+ /**
413
+ * One feed's watermark advance — the same discipline for all three feeds:
414
+ * bump the cursor on any fresher updated_at, then let the id watermark plus
415
+ * the creation baseline decide what actually triggers (edits re-surface old
416
+ * items with a fresh updated_at). Bot-authored items advance the watermark
417
+ * without triggering.
418
+ */
419
+ async advanceFeed(state, seen, items, toIncoming) {
420
+ let changed = false;
421
+ for (const item of items) {
422
+ if (item.updated_at > state.cursor) {
423
+ state.cursor = item.updated_at;
424
+ changed = true;
425
+ }
426
+ if (item.created_at < state.baseline || seen.has(item.id))
427
+ continue;
428
+ seen.add(item.id);
429
+ changed = true;
430
+ if (item.user.type === "Bot")
431
+ continue;
432
+ await this.handleIncoming(toIncoming(item));
433
+ }
434
+ return changed;
435
+ }
436
+ // ==========================================================================
437
+ // Private - watermark persistence
438
+ // ==========================================================================
439
+ loadSyncState() {
440
+ try {
441
+ return readJsonSchemaFileIfExists(this.config.syncStatePath, SyncStateSchema, (detail) => `Malformed GitHub sync state at ${this.config.syncStatePath}: ${detail}`);
442
+ }
443
+ catch (err) {
444
+ // A bad state file re-baselines (history won't trigger) rather than
445
+ // blocking startup; the next persist overwrites it.
446
+ log.logWarning("GitHub: ignoring unreadable sync state", err instanceof Error ? err.message : String(err));
447
+ return undefined;
448
+ }
449
+ }
450
+ /** The persisted form of the current watermarks; the test/inspection surface. */
451
+ syncStateSnapshot() {
452
+ const state = { repos: {} };
453
+ for (const [repoKey, watermark] of this.repoState) {
454
+ state.repos[repoKey] = {
455
+ baseline: watermark.baseline,
456
+ cursor: watermark.cursor,
457
+ seenComments: [...watermark.seenComments],
458
+ seenIssues: [...watermark.seenIssues],
459
+ seenReviewComments: [...watermark.seenReviewComments],
460
+ };
461
+ }
462
+ return state;
463
+ }
464
+ persistSyncState() {
465
+ ensureDirExists(dirname(this.config.syncStatePath));
466
+ atomicWritePrivateFile(this.config.syncStatePath, JSON.stringify(this.syncStateSnapshot()));
467
+ }
468
+ // ==========================================================================
469
+ // Private - triggering
470
+ // ==========================================================================
471
+ /** Fresh regex per call: the `g` flag makes `test`/`replace` stateful. */
472
+ mentionPattern() {
473
+ return this.appSlug ? new RegExp(`@${this.appSlug}(?![\\w-])`, "gi") : null;
474
+ }
475
+ isMentioned(text) {
476
+ const pattern = this.mentionPattern();
477
+ return pattern ? pattern.test(text) : false;
478
+ }
479
+ stripMention(text) {
480
+ const pattern = this.mentionPattern();
481
+ return (pattern ? text.replace(pattern, "") : text).trim();
482
+ }
483
+ /** The Conversation office for a GitHub conversation id (one PR/issue). */
484
+ office(conversationId) {
485
+ return this.config.workspace.office(createOfficeAddress("github", conversationId));
486
+ }
487
+ isParticipating(conversationId) {
488
+ return existsSync(this.office(conversationId).logPath);
489
+ }
490
+ /**
491
+ * True when `user` holds at least write permission on the repo. Fails
492
+ * closed: a failed lookup denies the trigger (and logs) rather than
493
+ * letting an unverified commenter drive the agent.
494
+ */
495
+ async hasTriggerPermission(ref, user) {
496
+ const cacheKey = `${ref.owner}/${ref.repo}#${user}`;
497
+ const cached = this.permissionCache.get(cacheKey);
498
+ if (cached && Date.now() < cached.expiresAt) {
499
+ return cached.rank >= REQUIRED_TRIGGER_RANK;
500
+ }
501
+ let rank;
502
+ try {
503
+ const role = await githubRetry(() => this.client.getCollaboratorPermission(ref.owner, ref.repo, user));
504
+ // Custom role_name values are unrankable; the legacy permission field
505
+ // still carries their closest standard mapping, so take the stronger.
506
+ rank = Math.max(rankOfPermission(role.role_name ?? ""), rankOfPermission(role.permission));
507
+ }
508
+ catch (err) {
509
+ log.logWarning(`GitHub: permission lookup failed for ${user} on ${ref.owner}/${ref.repo}; denying trigger`, err instanceof Error ? err.message : String(err));
510
+ return false;
511
+ }
512
+ this.permissionCache.set(cacheKey, {
513
+ rank,
514
+ expiresAt: Date.now() + PERMISSION_CACHE_TTL_MS,
515
+ });
516
+ return rank >= REQUIRED_TRIGGER_RANK;
517
+ }
518
+ async handleIncoming(item) {
519
+ const conversationId = buildGithubConversationId(item.ref);
520
+ const mentioned = this.isMentioned(item.text);
521
+ const participating = this.isParticipating(conversationId);
522
+ // Narrow trigger (DESIGN.md): only threads the bot is mentioned in or
523
+ // already participates in. Everything else is ignored without logging so
524
+ // busy repos don't grow conversation dirs for untouched issues.
525
+ if (!mentioned && !participating)
526
+ return;
527
+ // Permission gate: on public repos anyone can comment, so a mention from
528
+ // anyone below write permission is ignored entirely (no log, no state).
529
+ if (!(await this.hasTriggerPermission(item.ref, item.user))) {
530
+ log.logInfo(`GitHub: ignoring ${conversationId} comment from ${item.user} (below write permission)`);
531
+ return;
532
+ }
533
+ const cleanedText = this.stripMention(item.text);
534
+ const sessionKey = resolveChatSessionKey({
535
+ conversationId,
536
+ conversationKind: "shared",
537
+ messageId: item.ts,
538
+ persistentTopLevel: true,
539
+ });
540
+ const messageText = item.review
541
+ ? await this.formatReviewMessage(item, cleanedText)
542
+ : cleanedText;
543
+ const eventBase = createConversationEvent({
544
+ platform: "github",
545
+ type: item.ts === GITHUB_ISSUE_BODY_TS ? "issue" : "message",
546
+ conversationId,
547
+ conversationKind: "shared",
548
+ ts: item.ts,
549
+ sessionKey,
550
+ user: item.user,
551
+ userName: item.user,
552
+ text: messageText,
553
+ });
554
+ await processMessageIntake({
555
+ eventBase,
556
+ addressed: true,
557
+ // Match on the user-typed text, not the review-decorated messageText.
558
+ magicWord: { text: cleanedText, addressed: mentioned, scopeFallback: "never" },
559
+ busyPolicy: "queue",
560
+ logEntryBase: {
561
+ date: item.createdAt,
562
+ ts: item.ts,
563
+ user: item.user,
564
+ userName: item.user,
565
+ text: messageText,
566
+ isMessagingBot: false,
567
+ },
568
+ // log.jsonl existence is the participation authority for this adapter:
569
+ // a first-contact magic word ("@bot stop" on an untouched issue) must
570
+ // not materialize the log, or every later comment from any writer
571
+ // would be treated as addressed to a conversation the bot never joined.
572
+ log: (entry) => {
573
+ if (!participating && matchMagicWord(cleanedText) === "stop")
574
+ return;
575
+ this.logToFile(conversationId, entry);
576
+ },
577
+ // GitHub has no attachments; the prep hook is used to lay down the
578
+ // issue context and repo clone only for messages that will dispatch,
579
+ // and before the comment itself is logged.
580
+ processAttachments: async () => {
581
+ await this.prepareConversation(item, conversationId, participating);
582
+ return [];
583
+ },
584
+ queueKey: conversationId,
585
+ enqueue: (queueKey, work) => this.getQueue(queueKey).enqueue(work),
586
+ handler: this.handler,
587
+ bot: this,
588
+ createContext: (event) => createGithubAdapters(event, this),
589
+ });
590
+ }
591
+ /**
592
+ * First contact: log the issue title/body ahead of the comment so the
593
+ * session history starts with what the thread is about. The clone is
594
+ * (re)attempted on every trigger while ./repo is missing — a no-op once
595
+ * it exists — so a failed first clone (e.g. App permissions granted
596
+ * later) heals on the next mention instead of wedging the conversation.
597
+ */
598
+ async prepareConversation(item, conversationId, participating) {
599
+ let isPrHint = item.isPr;
600
+ if (!participating && item.ts !== GITHUB_ISSUE_BODY_TS) {
601
+ const issue = await this.logIssueContext(item.ref, conversationId, item.createdAt);
602
+ // Only comments arrive without the PR-ness hint; review comments carry
603
+ // isPr: true (they only exist on PRs) and that knowledge is authoritative.
604
+ if (issue && isPrHint === undefined)
605
+ isPrHint = Boolean(issue.pull_request);
606
+ }
607
+ if (!existsSync(conversationRepoDir(this.office(conversationId)))) {
608
+ const isPr = isPrHint ?? (await fetchIsPr(this.client, item.ref));
609
+ await this.ensureRepoClone(item.ref, conversationId, isPr);
610
+ }
611
+ }
612
+ /**
613
+ * Decorates an inline review comment with its diff anchor and (for replies)
614
+ * the thread's earlier turns, so the agent knows which code the feedback is
615
+ * about without hunting through the PR. The rc-<id> in the header is what
616
+ * github_review_reply takes to answer in-thread.
617
+ */
618
+ async formatReviewMessage(item, cleanedText) {
619
+ const review = item.review;
620
+ const location = review.line !== null ? `${review.path}:${review.line}` : review.path;
621
+ const parts = [`[PR review comment ${githubReviewCommentTs(review.commentId)} on ${location}]`];
622
+ if (review.diffHunk) {
623
+ const hunk = review.diffHunk.length > MAX_DIFF_HUNK_CHARS
624
+ ? `…${review.diffHunk.slice(-MAX_DIFF_HUNK_CHARS)}`
625
+ : review.diffHunk;
626
+ parts.push(`\`\`\`diff\n${hunk}\n\`\`\``);
627
+ }
628
+ if (review.inReplyToId !== undefined) {
629
+ const turns = await this.reviewThreadContext(item.ref, review.inReplyToId, review.commentId);
630
+ if (turns.length > 0) {
631
+ parts.push(`Thread so far:\n${turns.join("\n")}`);
632
+ }
633
+ }
634
+ parts.push(cleanedText);
635
+ return parts.join("\n");
636
+ }
637
+ /**
638
+ * Earlier turns of one review thread (root + replies before the trigger),
639
+ * newest-truncated. Fail-soft: context is a nicety, the trigger is not.
640
+ */
641
+ async reviewThreadContext(ref, rootId, beforeId) {
642
+ try {
643
+ const all = await githubRetry(() => this.client.listPullReviewComments(ref.owner, ref.repo, ref.number));
644
+ return all
645
+ .filter((comment) => (comment.id === rootId || comment.in_reply_to_id === rootId) && comment.id < beforeId)
646
+ .slice(-MAX_THREAD_TURNS)
647
+ .map((comment) => {
648
+ const body = comment.body.length > MAX_THREAD_TURN_CHARS
649
+ ? `${comment.body.slice(0, MAX_THREAD_TURN_CHARS)}…`
650
+ : comment.body;
651
+ return `@${comment.user.login}: ${body}`;
652
+ });
653
+ }
654
+ catch (err) {
655
+ log.logWarning(`GitHub: could not fetch review thread context for ${ref.owner}/${ref.repo}#${ref.number}`, err instanceof Error ? err.message : String(err));
656
+ return [];
657
+ }
658
+ }
659
+ async logIssueContext(ref, conversationId, triggerCreatedAt) {
660
+ let issue;
661
+ try {
662
+ issue = await githubRetry(() => this.client.getIssue(ref.owner, ref.repo, ref.number));
663
+ }
664
+ catch (err) {
665
+ log.logWarning(`GitHub: could not fetch issue context for ${conversationId}`, err instanceof Error ? err.message : String(err));
666
+ return null;
667
+ }
668
+ // Dated just before the triggering comment, NOT issue.created_at: history
669
+ // sync date-sorts entries and drops anything older than its recency
670
+ // window, so an old issue's real creation date would silently evict the
671
+ // one message that says what the thread is about.
672
+ const triggerMs = Date.parse(triggerCreatedAt);
673
+ const contextDate = new Date((Number.isFinite(triggerMs) ? triggerMs : Date.now()) - 1000);
674
+ this.logToFile(conversationId, {
675
+ date: contextDate.toISOString(),
676
+ ts: GITHUB_ISSUE_BODY_TS,
677
+ user: issue.user.login,
678
+ userName: issue.user.login,
679
+ text: `# ${issue.title}\n\n${issue.body ?? ""}`.trim(),
680
+ attachments: [],
681
+ isMessagingBot: false,
682
+ });
683
+ return issue;
684
+ }
685
+ // ==========================================================================
686
+ // Repo clone
687
+ // ==========================================================================
688
+ /**
689
+ * Clone the conversation's repo into its dir (bind-mounted into the
690
+ * sandbox) using an ephemeral contents:read token that never leaves the
691
+ * host. Non-fatal: a failed clone degrades to the pre-clone experience.
692
+ */
693
+ async ensureRepoClone(ref, conversationId, isPr) {
694
+ const office = this.office(conversationId);
695
+ const dir = conversationRepoDir(office);
696
+ if (existsSync(dir))
697
+ return;
698
+ try {
699
+ office.ensure();
700
+ const token = await this.client.createScopedInstallationToken(ref.repo, {
701
+ contents: "read",
702
+ });
703
+ const prHeadBranch = isPr ? await fetchPrHeadBranch(this.client, ref) : undefined;
704
+ await cloneRepo({
705
+ url: `https://github.com/${ref.owner}/${ref.repo}.git`,
706
+ dir,
707
+ token,
708
+ botLogin: `${this.appSlug}[bot]`,
709
+ botEmail: this.botEmail ?? `${this.appSlug}[bot]@users.noreply.github.com`,
710
+ prNumber: isPr ? ref.number : undefined,
711
+ prHeadBranch,
712
+ });
713
+ log.logInfo(`[${conversationId}] Cloned ${ref.owner}/${ref.repo}${isPr ? ` and checked out PR #${ref.number} head as ${prHeadBranch ?? `pr-${ref.number}`}` : ""}`);
714
+ }
715
+ catch (err) {
716
+ log.logWarning(`GitHub: repo clone failed for ${conversationId}`, err instanceof Error ? err.message : String(err));
717
+ }
718
+ }
719
+ }
720
+ //# sourceMappingURL=bot.js.map