@geminixiang/mikan 1.0.0-beta.76 → 1.0.0-beta.78

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 (535) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/adapters/commands/login.d.ts.map +1 -1
  3. package/dist/adapters/commands/login.js +0 -9
  4. package/dist/adapters/commands/login.js.map +1 -1
  5. package/dist/adapters/commands/manifest.d.ts +0 -19
  6. package/dist/adapters/commands/manifest.d.ts.map +1 -1
  7. package/dist/adapters/commands/manifest.js +0 -34
  8. package/dist/adapters/commands/manifest.js.map +1 -1
  9. package/dist/adapters/commands/model.d.ts +0 -5
  10. package/dist/adapters/commands/model.d.ts.map +1 -1
  11. package/dist/adapters/commands/model.js +0 -5
  12. package/dist/adapters/commands/model.js.map +1 -1
  13. package/dist/adapters/commands/new.d.ts.map +1 -1
  14. package/dist/adapters/commands/new.js +0 -2
  15. package/dist/adapters/commands/new.js.map +1 -1
  16. package/dist/adapters/commands/registry.d.ts +0 -1
  17. package/dist/adapters/commands/registry.d.ts.map +1 -1
  18. package/dist/adapters/commands/registry.js +0 -8
  19. package/dist/adapters/commands/registry.js.map +1 -1
  20. package/dist/adapters/commands/session-view.d.ts.map +1 -1
  21. package/dist/adapters/commands/session-view.js +0 -2
  22. package/dist/adapters/commands/session-view.js.map +1 -1
  23. package/dist/adapters/commands/types.d.ts +0 -29
  24. package/dist/adapters/commands/types.d.ts.map +1 -1
  25. package/dist/adapters/commands/types.js.map +1 -1
  26. package/dist/adapters/commands/utils.d.ts +0 -3
  27. package/dist/adapters/commands/utils.d.ts.map +1 -1
  28. package/dist/adapters/commands/utils.js +0 -3
  29. package/dist/adapters/commands/utils.js.map +1 -1
  30. package/dist/adapters/discord/bot.d.ts +0 -4
  31. package/dist/adapters/discord/bot.d.ts.map +1 -1
  32. package/dist/adapters/discord/bot.js +5 -41
  33. package/dist/adapters/discord/bot.js.map +1 -1
  34. package/dist/adapters/discord/components.d.ts +0 -23
  35. package/dist/adapters/discord/components.d.ts.map +1 -1
  36. package/dist/adapters/discord/components.js +0 -23
  37. package/dist/adapters/discord/components.js.map +1 -1
  38. package/dist/adapters/discord/context.d.ts.map +1 -1
  39. package/dist/adapters/discord/context.js +1 -11
  40. package/dist/adapters/discord/context.js.map +1 -1
  41. package/dist/adapters/discord/format.d.ts +0 -1
  42. package/dist/adapters/discord/format.d.ts.map +1 -1
  43. package/dist/adapters/discord/format.js +0 -37
  44. package/dist/adapters/discord/format.js.map +1 -1
  45. package/dist/adapters/github/bot.d.ts +0 -44
  46. package/dist/adapters/github/bot.d.ts.map +1 -1
  47. package/dist/adapters/github/bot.js +1 -120
  48. package/dist/adapters/github/bot.js.map +1 -1
  49. package/dist/adapters/github/client.d.ts +0 -57
  50. package/dist/adapters/github/client.d.ts.map +1 -1
  51. package/dist/adapters/github/client.js +0 -59
  52. package/dist/adapters/github/client.js.map +1 -1
  53. package/dist/adapters/github/context.d.ts.map +1 -1
  54. package/dist/adapters/github/context.js +1 -8
  55. package/dist/adapters/github/context.js.map +1 -1
  56. package/dist/adapters/github/github-ops.d.ts +0 -55
  57. package/dist/adapters/github/github-ops.d.ts.map +1 -1
  58. package/dist/adapters/github/github-ops.js +0 -59
  59. package/dist/adapters/github/github-ops.js.map +1 -1
  60. package/dist/adapters/github/ids.d.ts +0 -27
  61. package/dist/adapters/github/ids.d.ts.map +1 -1
  62. package/dist/adapters/github/ids.js +0 -29
  63. package/dist/adapters/github/ids.js.map +1 -1
  64. package/dist/adapters/github/repo.d.ts +0 -25
  65. package/dist/adapters/github/repo.d.ts.map +1 -1
  66. package/dist/adapters/github/repo.js +0 -49
  67. package/dist/adapters/github/repo.js.map +1 -1
  68. package/dist/adapters/github/tool-pack.d.ts +0 -10
  69. package/dist/adapters/github/tool-pack.d.ts.map +1 -1
  70. package/dist/adapters/github/tool-pack.js +0 -10
  71. package/dist/adapters/github/tool-pack.js.map +1 -1
  72. package/dist/adapters/github/tools/checks.d.ts +0 -6
  73. package/dist/adapters/github/tools/checks.d.ts.map +1 -1
  74. package/dist/adapters/github/tools/checks.js +0 -7
  75. package/dist/adapters/github/tools/checks.js.map +1 -1
  76. package/dist/adapters/github/tools/issue.d.ts +0 -5
  77. package/dist/adapters/github/tools/issue.d.ts.map +1 -1
  78. package/dist/adapters/github/tools/issue.js +0 -5
  79. package/dist/adapters/github/tools/issue.js.map +1 -1
  80. package/dist/adapters/github/tools/pr.d.ts +0 -7
  81. package/dist/adapters/github/tools/pr.d.ts.map +1 -1
  82. package/dist/adapters/github/tools/pr.js +0 -7
  83. package/dist/adapters/github/tools/pr.js.map +1 -1
  84. package/dist/adapters/github/tools/read.d.ts +0 -6
  85. package/dist/adapters/github/tools/read.d.ts.map +1 -1
  86. package/dist/adapters/github/tools/read.js +0 -8
  87. package/dist/adapters/github/tools/read.js.map +1 -1
  88. package/dist/adapters/github/tools/review-reply.d.ts +0 -5
  89. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -1
  90. package/dist/adapters/github/tools/review-reply.js +0 -5
  91. package/dist/adapters/github/tools/review-reply.js.map +1 -1
  92. package/dist/adapters/github/tools/sync.d.ts +0 -6
  93. package/dist/adapters/github/tools/sync.d.ts.map +1 -1
  94. package/dist/adapters/github/tools/sync.js +0 -6
  95. package/dist/adapters/github/tools/sync.js.map +1 -1
  96. package/dist/adapters/github/types.d.ts +0 -88
  97. package/dist/adapters/github/types.d.ts.map +1 -1
  98. package/dist/adapters/github/types.js.map +1 -1
  99. package/dist/adapters/github/webhook.d.ts +0 -13
  100. package/dist/adapters/github/webhook.d.ts.map +1 -1
  101. package/dist/adapters/github/webhook.js +0 -16
  102. package/dist/adapters/github/webhook.js.map +1 -1
  103. package/dist/adapters/index.d.ts +3 -4
  104. package/dist/adapters/index.d.ts.map +1 -1
  105. package/dist/adapters/index.js +4 -4
  106. package/dist/adapters/index.js.map +1 -1
  107. package/dist/adapters/intake.d.ts +0 -17
  108. package/dist/adapters/intake.d.ts.map +1 -1
  109. package/dist/adapters/intake.js +6 -32
  110. package/dist/adapters/intake.js.map +1 -1
  111. package/dist/adapters/markdown-tables.d.ts +0 -10
  112. package/dist/adapters/markdown-tables.d.ts.map +1 -1
  113. package/dist/adapters/markdown-tables.js +1 -42
  114. package/dist/adapters/markdown-tables.js.map +1 -1
  115. package/dist/adapters/progressive-renderer.d.ts.map +1 -1
  116. package/dist/adapters/progressive-renderer.js +3 -25
  117. package/dist/adapters/progressive-renderer.js.map +1 -1
  118. package/dist/adapters/shared.d.ts +0 -57
  119. package/dist/adapters/shared.d.ts.map +1 -1
  120. package/dist/adapters/shared.js +0 -71
  121. package/dist/adapters/shared.js.map +1 -1
  122. package/dist/adapters/slack/assistant.d.ts +0 -49
  123. package/dist/adapters/slack/assistant.d.ts.map +1 -1
  124. package/dist/adapters/slack/assistant.js +0 -97
  125. package/dist/adapters/slack/assistant.js.map +1 -1
  126. package/dist/adapters/slack/auto-reply-context.d.ts +0 -7
  127. package/dist/adapters/slack/auto-reply-context.d.ts.map +1 -1
  128. package/dist/adapters/slack/auto-reply-context.js +0 -7
  129. package/dist/adapters/slack/auto-reply-context.js.map +1 -1
  130. package/dist/adapters/slack/blocks.d.ts +0 -9
  131. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  132. package/dist/adapters/slack/blocks.js +0 -20
  133. package/dist/adapters/slack/blocks.js.map +1 -1
  134. package/dist/adapters/slack/bot.d.ts +0 -116
  135. package/dist/adapters/slack/bot.d.ts.map +1 -1
  136. package/dist/adapters/slack/bot.js +7 -231
  137. package/dist/adapters/slack/bot.js.map +1 -1
  138. package/dist/adapters/slack/context.d.ts.map +1 -1
  139. package/dist/adapters/slack/context.js +1 -3
  140. package/dist/adapters/slack/context.js.map +1 -1
  141. package/dist/adapters/slack/jev-context.d.ts +0 -13
  142. package/dist/adapters/slack/jev-context.d.ts.map +1 -1
  143. package/dist/adapters/slack/jev-context.js +0 -12
  144. package/dist/adapters/slack/jev-context.js.map +1 -1
  145. package/dist/adapters/slack/markdown.d.ts +0 -1
  146. package/dist/adapters/slack/markdown.d.ts.map +1 -1
  147. package/dist/adapters/slack/markdown.js +0 -5
  148. package/dist/adapters/slack/markdown.js.map +1 -1
  149. package/dist/adapters/slack/persona.d.ts +0 -9
  150. package/dist/adapters/slack/persona.d.ts.map +1 -1
  151. package/dist/adapters/slack/persona.js +0 -9
  152. package/dist/adapters/slack/persona.js.map +1 -1
  153. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  154. package/dist/adapters/slack/response-lifecycle.js +1 -45
  155. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  156. package/dist/adapters/slack/session.d.ts +2 -1
  157. package/dist/adapters/slack/session.d.ts.map +1 -1
  158. package/dist/adapters/slack/session.js +2 -2
  159. package/dist/adapters/slack/session.js.map +1 -1
  160. package/dist/adapters/slack/stream-limits.d.ts +0 -25
  161. package/dist/adapters/slack/stream-limits.d.ts.map +1 -1
  162. package/dist/adapters/slack/stream-limits.js +0 -34
  163. package/dist/adapters/slack/stream-limits.js.map +1 -1
  164. package/dist/adapters/slack/task-intent.d.ts +0 -13
  165. package/dist/adapters/slack/task-intent.d.ts.map +1 -1
  166. package/dist/adapters/slack/task-intent.js +0 -7
  167. package/dist/adapters/slack/task-intent.js.map +1 -1
  168. package/dist/adapters/slack/task-status.d.ts +0 -1
  169. package/dist/adapters/slack/task-status.d.ts.map +1 -1
  170. package/dist/adapters/slack/task-status.js +1 -9
  171. package/dist/adapters/slack/task-status.js.map +1 -1
  172. package/dist/adapters/slack/tool-pack.d.ts +0 -6
  173. package/dist/adapters/slack/tool-pack.d.ts.map +1 -1
  174. package/dist/adapters/slack/tool-pack.js +0 -6
  175. package/dist/adapters/slack/tool-pack.js.map +1 -1
  176. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -1
  177. package/dist/adapters/slack/tools/blockkit.js +0 -11
  178. package/dist/adapters/slack/tools/blockkit.js.map +1 -1
  179. package/dist/adapters/slack/types.d.ts +0 -19
  180. package/dist/adapters/slack/types.d.ts.map +1 -1
  181. package/dist/adapters/slack/types.js.map +1 -1
  182. package/dist/adapters/slack/update-diagnostics.d.ts +0 -1
  183. package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -1
  184. package/dist/adapters/slack/update-diagnostics.js +1 -7
  185. package/dist/adapters/slack/update-diagnostics.js.map +1 -1
  186. package/dist/adapters/telegram/bot.d.ts +0 -6
  187. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  188. package/dist/adapters/telegram/bot.js +1 -50
  189. package/dist/adapters/telegram/bot.js.map +1 -1
  190. package/dist/adapters/telegram/context.d.ts.map +1 -1
  191. package/dist/adapters/telegram/context.js +1 -8
  192. package/dist/adapters/telegram/context.js.map +1 -1
  193. package/dist/adapters/types.d.ts +0 -57
  194. package/dist/adapters/types.d.ts.map +1 -1
  195. package/dist/adapters/types.js.map +1 -1
  196. package/dist/adapters/web/admin/client-assets.d.ts +4 -0
  197. package/dist/adapters/web/admin/client-assets.d.ts.map +1 -0
  198. package/dist/adapters/web/admin/client-assets.js +1765 -0
  199. package/dist/adapters/web/admin/client-assets.js.map +1 -0
  200. package/dist/adapters/web/admin/portal.d.ts +0 -10
  201. package/dist/adapters/web/admin/portal.d.ts.map +1 -1
  202. package/dist/adapters/web/admin/portal.js +6 -1909
  203. package/dist/adapters/web/admin/portal.js.map +1 -1
  204. package/dist/adapters/web/admin/types.d.ts +0 -3
  205. package/dist/adapters/web/admin/types.d.ts.map +1 -1
  206. package/dist/adapters/web/admin/types.js.map +1 -1
  207. package/dist/adapters/web/login/oauth.d.ts.map +1 -1
  208. package/dist/adapters/web/login/oauth.js +3 -7
  209. package/dist/adapters/web/login/oauth.js.map +1 -1
  210. package/dist/adapters/web/login/portal.d.ts +0 -10
  211. package/dist/adapters/web/login/portal.d.ts.map +1 -1
  212. package/dist/adapters/web/login/portal.js +4 -37
  213. package/dist/adapters/web/login/portal.js.map +1 -1
  214. package/dist/adapters/web/login/types.d.ts +0 -5
  215. package/dist/adapters/web/login/types.d.ts.map +1 -1
  216. package/dist/adapters/web/login/types.js.map +1 -1
  217. package/dist/adapters/web/portal-shell.d.ts +0 -12
  218. package/dist/adapters/web/portal-shell.d.ts.map +1 -1
  219. package/dist/adapters/web/portal-shell.js +8 -25
  220. package/dist/adapters/web/portal-shell.js.map +1 -1
  221. package/dist/adapters/web/server.d.ts +0 -1
  222. package/dist/adapters/web/server.d.ts.map +1 -1
  223. package/dist/adapters/web/server.js +0 -2
  224. package/dist/adapters/web/server.js.map +1 -1
  225. package/dist/adapters/web/session-view/portal.d.ts.map +1 -1
  226. package/dist/adapters/web/session-view/portal.js +13 -24
  227. package/dist/adapters/web/session-view/portal.js.map +1 -1
  228. package/dist/adapters/web/session-view/types.d.ts.map +1 -1
  229. package/dist/adapters/web/session-view/types.js.map +1 -1
  230. package/dist/adapters/web/token-store.d.ts +0 -2
  231. package/dist/adapters/web/token-store.d.ts.map +1 -1
  232. package/dist/adapters/web/token-store.js +0 -2
  233. package/dist/adapters/web/token-store.js.map +1 -1
  234. package/dist/cli/arg-grammar.d.ts +0 -3
  235. package/dist/cli/arg-grammar.d.ts.map +1 -1
  236. package/dist/cli/arg-grammar.js +0 -3
  237. package/dist/cli/arg-grammar.js.map +1 -1
  238. package/dist/cli/boot.d.ts.map +1 -1
  239. package/dist/cli/boot.js +3 -12
  240. package/dist/cli/boot.js.map +1 -1
  241. package/dist/cli/download.d.ts.map +1 -1
  242. package/dist/cli/download.js +2 -6
  243. package/dist/cli/download.js.map +1 -1
  244. package/dist/cli/office.d.ts.map +1 -1
  245. package/dist/cli/office.js +0 -31
  246. package/dist/cli/office.js.map +1 -1
  247. package/dist/cli/onboard.d.ts +0 -2
  248. package/dist/cli/onboard.d.ts.map +1 -1
  249. package/dist/cli/onboard.js +0 -30
  250. package/dist/cli/onboard.js.map +1 -1
  251. package/dist/cli/process-lifecycle.d.ts +0 -5
  252. package/dist/cli/process-lifecycle.d.ts.map +1 -1
  253. package/dist/cli/process-lifecycle.js +0 -6
  254. package/dist/cli/process-lifecycle.js.map +1 -1
  255. package/dist/cli/sandbox.d.ts +3 -0
  256. package/dist/cli/sandbox.d.ts.map +1 -0
  257. package/dist/cli/sandbox.js +79 -0
  258. package/dist/cli/sandbox.js.map +1 -0
  259. package/dist/cli/sessions.d.ts.map +1 -1
  260. package/dist/cli/sessions.js +0 -11
  261. package/dist/cli/sessions.js.map +1 -1
  262. package/dist/cli/types.d.ts +2 -6
  263. package/dist/cli/types.d.ts.map +1 -1
  264. package/dist/cli/types.js.map +1 -1
  265. package/dist/env-manifest.d.ts +0 -21
  266. package/dist/env-manifest.d.ts.map +1 -1
  267. package/dist/env-manifest.js +0 -11
  268. package/dist/env-manifest.js.map +1 -1
  269. package/dist/events/index.d.ts +0 -51
  270. package/dist/events/index.d.ts.map +1 -1
  271. package/dist/events/index.js +0 -42
  272. package/dist/events/index.js.map +1 -1
  273. package/dist/events/scheduler.d.ts +0 -8
  274. package/dist/events/scheduler.d.ts.map +1 -1
  275. package/dist/events/scheduler.js +0 -8
  276. package/dist/events/scheduler.js.map +1 -1
  277. package/dist/file-guards.d.ts +0 -15
  278. package/dist/file-guards.d.ts.map +1 -1
  279. package/dist/file-guards.js +2 -26
  280. package/dist/file-guards.js.map +1 -1
  281. package/dist/harness/execution-env.d.ts +0 -15
  282. package/dist/harness/execution-env.d.ts.map +1 -1
  283. package/dist/harness/execution-env.js +4 -55
  284. package/dist/harness/execution-env.js.map +1 -1
  285. package/dist/harness/http.d.ts +0 -12
  286. package/dist/harness/http.d.ts.map +1 -1
  287. package/dist/harness/http.js +0 -34
  288. package/dist/harness/http.js.map +1 -1
  289. package/dist/harness/index.d.ts +4 -7
  290. package/dist/harness/index.d.ts.map +1 -1
  291. package/dist/harness/index.js +4 -7
  292. package/dist/harness/index.js.map +1 -1
  293. package/dist/harness/jev.d.ts +0 -28
  294. package/dist/harness/jev.d.ts.map +1 -1
  295. package/dist/harness/jev.js +0 -45
  296. package/dist/harness/jev.js.map +1 -1
  297. package/dist/harness/mcp-result.d.ts +20 -0
  298. package/dist/harness/mcp-result.d.ts.map +1 -0
  299. package/dist/harness/mcp-result.js +171 -0
  300. package/dist/harness/mcp-result.js.map +1 -0
  301. package/dist/harness/mcp.d.ts +0 -19
  302. package/dist/harness/mcp.d.ts.map +1 -1
  303. package/dist/harness/mcp.js +7 -66
  304. package/dist/harness/mcp.js.map +1 -1
  305. package/dist/harness/models.d.ts +0 -19
  306. package/dist/harness/models.d.ts.map +1 -1
  307. package/dist/harness/models.js +0 -52
  308. package/dist/harness/models.js.map +1 -1
  309. package/dist/harness/open-connector.d.ts +0 -12
  310. package/dist/harness/open-connector.d.ts.map +1 -1
  311. package/dist/harness/open-connector.js +0 -22
  312. package/dist/harness/open-connector.js.map +1 -1
  313. package/dist/harness/presenter.d.ts +1 -0
  314. package/dist/harness/presenter.d.ts.map +1 -1
  315. package/dist/harness/presenter.js +16 -66
  316. package/dist/harness/presenter.js.map +1 -1
  317. package/dist/harness/prompt.d.ts +0 -11
  318. package/dist/harness/prompt.d.ts.map +1 -1
  319. package/dist/harness/prompt.js +1 -18
  320. package/dist/harness/prompt.js.map +1 -1
  321. package/dist/harness/runner.d.ts.map +1 -1
  322. package/dist/harness/runner.js +8 -28
  323. package/dist/harness/runner.js.map +1 -1
  324. package/dist/harness/session.d.ts +11 -28
  325. package/dist/harness/session.d.ts.map +1 -1
  326. package/dist/harness/session.js +100 -38
  327. package/dist/harness/session.js.map +1 -1
  328. package/dist/harness/skills.d.ts +0 -22
  329. package/dist/harness/skills.d.ts.map +1 -1
  330. package/dist/harness/skills.js +0 -20
  331. package/dist/harness/skills.js.map +1 -1
  332. package/dist/harness/subagent-profiles.d.ts +0 -4
  333. package/dist/harness/subagent-profiles.d.ts.map +1 -1
  334. package/dist/harness/subagent-profiles.js +0 -29
  335. package/dist/harness/subagent-profiles.js.map +1 -1
  336. package/dist/harness/subagent.d.ts +0 -25
  337. package/dist/harness/subagent.d.ts.map +1 -1
  338. package/dist/harness/subagent.js +1 -70
  339. package/dist/harness/subagent.js.map +1 -1
  340. package/dist/harness/tools/event.d.ts.map +1 -1
  341. package/dist/harness/tools/event.js +0 -9
  342. package/dist/harness/tools/event.js.map +1 -1
  343. package/dist/harness/tools/generate-image.d.ts +0 -6
  344. package/dist/harness/tools/generate-image.d.ts.map +1 -1
  345. package/dist/harness/tools/generate-image.js.map +1 -1
  346. package/dist/harness/tools/host-fn-tool.d.ts +0 -17
  347. package/dist/harness/tools/host-fn-tool.d.ts.map +1 -1
  348. package/dist/harness/tools/host-fn-tool.js +0 -16
  349. package/dist/harness/tools/host-fn-tool.js.map +1 -1
  350. package/dist/harness/tools/index.d.ts +1 -7
  351. package/dist/harness/tools/index.d.ts.map +1 -1
  352. package/dist/harness/tools/index.js +3 -14
  353. package/dist/harness/tools/index.js.map +1 -1
  354. package/dist/harness/tools/jev-browser.d.ts +4 -94
  355. package/dist/harness/tools/jev-browser.d.ts.map +1 -1
  356. package/dist/harness/tools/jev-browser.js +203 -92
  357. package/dist/harness/tools/jev-browser.js.map +1 -1
  358. package/dist/harness/tools/jev.d.ts +0 -8
  359. package/dist/harness/tools/jev.d.ts.map +1 -1
  360. package/dist/harness/tools/jev.js +0 -11
  361. package/dist/harness/tools/jev.js.map +1 -1
  362. package/dist/harness/tools/pi-tools.d.ts +1 -11
  363. package/dist/harness/tools/pi-tools.d.ts.map +1 -1
  364. package/dist/harness/tools/pi-tools.js +1 -30
  365. package/dist/harness/tools/pi-tools.js.map +1 -1
  366. package/dist/harness/tools/react.d.ts +0 -5
  367. package/dist/harness/tools/react.d.ts.map +1 -1
  368. package/dist/harness/tools/react.js +0 -5
  369. package/dist/harness/tools/react.js.map +1 -1
  370. package/dist/harness/tools/secret-redaction.d.ts +0 -25
  371. package/dist/harness/tools/secret-redaction.d.ts.map +1 -1
  372. package/dist/harness/tools/secret-redaction.js +3 -36
  373. package/dist/harness/tools/secret-redaction.js.map +1 -1
  374. package/dist/harness/tools/subagent.d.ts +0 -34
  375. package/dist/harness/tools/subagent.d.ts.map +1 -1
  376. package/dist/harness/tools/subagent.js +0 -92
  377. package/dist/harness/tools/subagent.js.map +1 -1
  378. package/dist/harness/tools/task.d.ts +0 -1
  379. package/dist/harness/tools/task.d.ts.map +1 -1
  380. package/dist/harness/tools/task.js +0 -1
  381. package/dist/harness/tools/task.js.map +1 -1
  382. package/dist/harness/tools/types.d.ts +0 -16
  383. package/dist/harness/tools/types.d.ts.map +1 -1
  384. package/dist/harness/tools/types.js.map +1 -1
  385. package/dist/harness/types.d.ts +1 -77
  386. package/dist/harness/types.d.ts.map +1 -1
  387. package/dist/harness/types.js.map +1 -1
  388. package/dist/index.d.ts.map +1 -1
  389. package/dist/index.js +0 -2
  390. package/dist/index.js.map +1 -1
  391. package/dist/log.d.ts.map +1 -1
  392. package/dist/log.js +0 -13
  393. package/dist/log.js.map +1 -1
  394. package/dist/main.js +7 -52
  395. package/dist/main.js.map +1 -1
  396. package/dist/memory-capture/index.d.ts +16 -0
  397. package/dist/memory-capture/index.d.ts.map +1 -0
  398. package/dist/memory-capture/index.js +194 -0
  399. package/dist/memory-capture/index.js.map +1 -0
  400. package/dist/memory-capture/types.d.ts +27 -0
  401. package/dist/memory-capture/types.d.ts.map +1 -0
  402. package/dist/memory-capture/types.js.map +1 -0
  403. package/dist/observability/index.d.ts +0 -9
  404. package/dist/observability/index.d.ts.map +1 -1
  405. package/dist/observability/index.js +0 -9
  406. package/dist/observability/index.js.map +1 -1
  407. package/dist/observability/instrument.js +0 -5
  408. package/dist/observability/instrument.js.map +1 -1
  409. package/dist/observability/otel.js +0 -1
  410. package/dist/observability/otel.js.map +1 -1
  411. package/dist/observability/sentry.d.ts +0 -18
  412. package/dist/observability/sentry.d.ts.map +1 -1
  413. package/dist/observability/sentry.js +0 -36
  414. package/dist/observability/sentry.js.map +1 -1
  415. package/dist/observability/types.d.ts +1 -10
  416. package/dist/observability/types.d.ts.map +1 -1
  417. package/dist/observability/types.js.map +1 -1
  418. package/dist/office/index.d.ts +0 -76
  419. package/dist/office/index.d.ts.map +1 -1
  420. package/dist/office/index.js +4 -154
  421. package/dist/office/index.js.map +1 -1
  422. package/dist/office/projection.d.ts +0 -29
  423. package/dist/office/projection.d.ts.map +1 -1
  424. package/dist/office/projection.js +5 -41
  425. package/dist/office/projection.js.map +1 -1
  426. package/dist/office/types.d.ts +0 -66
  427. package/dist/office/types.d.ts.map +1 -1
  428. package/dist/office/types.js.map +1 -1
  429. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  430. package/dist/runtime/conversation-runtime.js +22 -83
  431. package/dist/runtime/conversation-runtime.js.map +1 -1
  432. package/dist/runtime/session-lifecycle.d.ts +0 -10
  433. package/dist/runtime/session-lifecycle.d.ts.map +1 -1
  434. package/dist/runtime/session-lifecycle.js +0 -12
  435. package/dist/runtime/session-lifecycle.js.map +1 -1
  436. package/dist/runtime/types.d.ts +2 -29
  437. package/dist/runtime/types.d.ts.map +1 -1
  438. package/dist/runtime/types.js.map +1 -1
  439. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  440. package/dist/sandbox/cloudflare.js +2 -1
  441. package/dist/sandbox/cloudflare.js.map +1 -1
  442. package/dist/sandbox/container.d.ts.map +1 -1
  443. package/dist/sandbox/container.js +21 -15
  444. package/dist/sandbox/container.js.map +1 -1
  445. package/dist/sandbox/host.d.ts.map +1 -1
  446. package/dist/sandbox/host.js +0 -2
  447. package/dist/sandbox/host.js.map +1 -1
  448. package/dist/sandbox/identity.d.ts +0 -28
  449. package/dist/sandbox/identity.d.ts.map +1 -1
  450. package/dist/sandbox/identity.js +0 -28
  451. package/dist/sandbox/identity.js.map +1 -1
  452. package/dist/sandbox/index.d.ts +0 -18
  453. package/dist/sandbox/index.d.ts.map +1 -1
  454. package/dist/sandbox/index.js +2 -19
  455. package/dist/sandbox/index.js.map +1 -1
  456. package/dist/sandbox/layout.d.ts +7 -0
  457. package/dist/sandbox/layout.d.ts.map +1 -0
  458. package/dist/sandbox/layout.js +13 -0
  459. package/dist/sandbox/layout.js.map +1 -0
  460. package/dist/sandbox/provisioner.d.ts +24 -65
  461. package/dist/sandbox/provisioner.d.ts.map +1 -1
  462. package/dist/sandbox/provisioner.js +213 -125
  463. package/dist/sandbox/provisioner.js.map +1 -1
  464. package/dist/sandbox/types.d.ts +0 -39
  465. package/dist/sandbox/types.d.ts.map +1 -1
  466. package/dist/sandbox/types.js.map +1 -1
  467. package/dist/sandbox/utils.d.ts +2 -5
  468. package/dist/sandbox/utils.d.ts.map +1 -1
  469. package/dist/sandbox/utils.js +31 -31
  470. package/dist/sandbox/utils.js.map +1 -1
  471. package/dist/sessions/chat-history-sync.d.ts +0 -6
  472. package/dist/sessions/chat-history-sync.d.ts.map +1 -1
  473. package/dist/sessions/chat-history-sync.js +1 -33
  474. package/dist/sessions/chat-history-sync.js.map +1 -1
  475. package/dist/sessions/history-line.d.ts +0 -20
  476. package/dist/sessions/history-line.d.ts.map +1 -1
  477. package/dist/sessions/history-line.js +0 -20
  478. package/dist/sessions/history-line.js.map +1 -1
  479. package/dist/sessions/migrate-common.d.ts +0 -15
  480. package/dist/sessions/migrate-common.d.ts.map +1 -1
  481. package/dist/sessions/migrate-common.js +0 -19
  482. package/dist/sessions/migrate-common.js.map +1 -1
  483. package/dist/sessions/migrate-pi-084.d.ts.map +1 -1
  484. package/dist/sessions/migrate-pi-084.js +0 -7
  485. package/dist/sessions/migrate-pi-084.js.map +1 -1
  486. package/dist/sessions/migrate-v3.d.ts +0 -7
  487. package/dist/sessions/migrate-v3.d.ts.map +1 -1
  488. package/dist/sessions/migrate-v3.js +1 -67
  489. package/dist/sessions/migrate-v3.js.map +1 -1
  490. package/dist/sessions/session-key.d.ts +3 -17
  491. package/dist/sessions/session-key.d.ts.map +1 -1
  492. package/dist/sessions/session-key.js +8 -35
  493. package/dist/sessions/session-key.js.map +1 -1
  494. package/dist/sessions/session-store.d.ts +1 -7
  495. package/dist/sessions/session-store.d.ts.map +1 -1
  496. package/dist/sessions/session-store.js +8 -50
  497. package/dist/sessions/session-store.js.map +1 -1
  498. package/dist/sessions/store.d.ts +0 -60
  499. package/dist/sessions/store.d.ts.map +1 -1
  500. package/dist/sessions/store.js +0 -113
  501. package/dist/sessions/store.js.map +1 -1
  502. package/dist/sessions/types.d.ts +0 -17
  503. package/dist/sessions/types.d.ts.map +1 -1
  504. package/dist/sessions/types.js.map +1 -1
  505. package/dist/settings/apply.d.ts +0 -6
  506. package/dist/settings/apply.d.ts.map +1 -1
  507. package/dist/settings/apply.js +0 -29
  508. package/dist/settings/apply.js.map +1 -1
  509. package/dist/settings/index.d.ts +0 -53
  510. package/dist/settings/index.d.ts.map +1 -1
  511. package/dist/settings/index.js +0 -77
  512. package/dist/settings/index.js.map +1 -1
  513. package/dist/settings/migrate.d.ts +0 -5
  514. package/dist/settings/migrate.d.ts.map +1 -1
  515. package/dist/settings/migrate.js +0 -17
  516. package/dist/settings/migrate.js.map +1 -1
  517. package/dist/types.d.ts +9 -159
  518. package/dist/types.d.ts.map +1 -1
  519. package/dist/types.js.map +1 -1
  520. package/dist/vault/index.d.ts +2 -36
  521. package/dist/vault/index.d.ts.map +1 -1
  522. package/dist/vault/index.js +135 -65
  523. package/dist/vault/index.js.map +1 -1
  524. package/dist/vault/types.d.ts +0 -15
  525. package/dist/vault/types.d.ts.map +1 -1
  526. package/dist/vault/types.js.map +1 -1
  527. package/package.json +1 -1
  528. package/dist/dream/index.d.ts +0 -20
  529. package/dist/dream/index.d.ts.map +0 -1
  530. package/dist/dream/index.js +0 -264
  531. package/dist/dream/index.js.map +0 -1
  532. package/dist/dream/types.d.ts +0 -30
  533. package/dist/dream/types.d.ts.map +0 -1
  534. package/dist/dream/types.js.map +0 -1
  535. /package/dist/{dream → memory-capture}/types.js +0 -0
@@ -3,16 +3,13 @@ import { resolveChatSessionKey } from "../../sessions/session-key.js";
3
3
  import { createProgressiveRenderer, formatMarkdownToolResult } from "../progressive-renderer.js";
4
4
  import { DISCORD_V2_TEXT_LIMIT } from "./components.js";
5
5
  import { formatDiscordMarkdown } from "./format.js";
6
- // Components V2 allows 4000 characters across a message's text, against 2000
7
- // for classic content — the reason for using it at all. The margin leaves room
8
- // for the working indicator and for the continuation marker on a split.
9
6
  const MAX_LENGTH = DISCORD_V2_TEXT_LIMIT - 100;
10
7
  const formatDiscordContinuation = (partNum) => `*(continued ${partNum})*`;
11
8
  function isDiscordMessageReference(id) {
12
9
  return typeof id === "string" && id !== "" && !id.startsWith("event:");
13
10
  }
14
11
  export function createDiscordAdapters(event, bot) {
15
- const conversationId = event.conversationId;
12
+ const conversationId = event.address.conversationId;
16
13
  const channelId = conversationId;
17
14
  const threadTargetId = isDiscordMessageReference(event.thread_ts) ? event.thread_ts : undefined;
18
15
  const replyTargetId = isDiscordMessageReference(event.ts) ? event.ts : undefined;
@@ -36,7 +33,6 @@ export function createDiscordAdapters(event, bot) {
36
33
  attachments: event.attachments,
37
34
  threadTs: event.thread_ts,
38
35
  });
39
- // The bot's getMessagingInfo() is the single authority for platform info.
40
36
  const platform = bot.getMessagingInfo();
41
37
  function postFirst(text) {
42
38
  if (threadTargetId)
@@ -53,14 +49,10 @@ export function createDiscordAdapters(event, bot) {
53
49
  workingIndicator: " ...",
54
50
  supportsDeltas: true,
55
51
  typing: {
56
- // Send immediately and repeat every 8s (Discord clears indicator after ~10s)
57
52
  send: () => bot.sendTyping(channelId),
58
53
  intervalMs: 8000,
59
54
  stopOnSend: true,
60
55
  },
61
- // The last step before sending: the model writes standard markdown, and
62
- // the parts Discord cannot render are converted here rather than by
63
- // constraining what the model may write.
64
56
  prepareSource: (text) => formatDiscordMarkdown(text),
65
57
  formatToolResult: formatMarkdownToolResult,
66
58
  responseErrorContext: (responseId) => ({
@@ -76,8 +68,6 @@ export function createDiscordAdapters(event, bot) {
76
68
  }),
77
69
  post: postFirst,
78
70
  update: (id, text) => bot.updateMessageRaw(channelId, id, text),
79
- // Returns the id so the renderer can edit this overflow message on the
80
- // next redraw instead of posting another copy of the tail.
81
71
  postExtra: async (text, responseId) => {
82
72
  if (threadTargetId)
83
73
  return bot.postInThread(channelId, threadTargetId, text);
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/discord/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { createConversationMessage, type ConversationContext } from \"../index.js\";\nimport { resolveChatSessionKey } from \"../../sessions/session-key.js\";\nimport { createProgressiveRenderer, formatMarkdownToolResult } from \"../progressive-renderer.js\";\nimport { DISCORD_V2_TEXT_LIMIT } from \"./components.js\";\nimport { formatDiscordMarkdown } from \"./format.js\";\nimport type { DiscordMessagingBot, DiscordEvent } from \"./bot.js\";\n\n// Components V2 allows 4000 characters across a message's text, against 2000\n// for classic content — the reason for using it at all. The margin leaves room\n// for the working indicator and for the continuation marker on a split.\nconst MAX_LENGTH = DISCORD_V2_TEXT_LIMIT - 100;\n\nconst formatDiscordContinuation = (partNum: number): string => `*(continued ${partNum})*`;\n\nfunction isDiscordMessageReference(id: string | undefined): id is string {\n return typeof id === \"string\" && id !== \"\" && !id.startsWith(\"event:\");\n}\n\nexport function createDiscordAdapters(\n event: DiscordEvent,\n bot: DiscordMessagingBot,\n): ConversationContext {\n const conversationId = event.conversationId;\n const channelId = conversationId;\n const threadTargetId = isDiscordMessageReference(event.thread_ts) ? event.thread_ts : undefined;\n const replyTargetId = isDiscordMessageReference(event.ts) ? event.ts : undefined;\n\n const message = createConversationMessage({\n platform: \"discord\",\n conversationId,\n address: event.address,\n id: event.ts,\n sessionKey:\n event.sessionKey ??\n resolveChatSessionKey({\n conversationId,\n conversationKind: event.conversationKind,\n messageId: event.ts,\n persistentTopLevel: true,\n threadTs: event.thread_ts,\n }),\n conversationKind: event.conversationKind,\n userId: event.user,\n userName: event.userName,\n text: event.text,\n attachments: event.attachments,\n threadTs: event.thread_ts,\n });\n\n // The bot's getMessagingInfo() is the single authority for platform info.\n const platform = bot.getMessagingInfo();\n\n function postFirst(text: string): Promise<string> {\n if (threadTargetId) return bot.postInThread(channelId, threadTargetId, text);\n if (replyTargetId) return bot.postReply(channelId, replyTargetId, text);\n return bot.postMessage(channelId, text);\n }\n\n const { responder } = createProgressiveRenderer({\n label: \"Discord\",\n maxLength: MAX_LENGTH,\n formatContinuation: formatDiscordContinuation,\n errorPrefix: \"*Error:* \",\n workingIndicator: \" ...\",\n supportsDeltas: true,\n typing: {\n // Send immediately and repeat every 8s (Discord clears indicator after ~10s)\n send: () => bot.sendTyping(channelId),\n intervalMs: 8000,\n stopOnSend: true,\n },\n // The last step before sending: the model writes standard markdown, and\n // the parts Discord cannot render are converted here rather than by\n // constraining what the model may write.\n prepareSource: (text) => formatDiscordMarkdown(text),\n formatToolResult: formatMarkdownToolResult,\n responseErrorContext: (responseId) => ({\n platform: \"discord\",\n conversationId,\n channelId,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: responseId,\n threadTs: threadTargetId,\n replyTargetId,\n conversationKind: message.conversationKind,\n }),\n post: postFirst,\n update: (id, text) => bot.updateMessageRaw(channelId, id, text),\n // Returns the id so the renderer can edit this overflow message on the\n // next redraw instead of posting another copy of the tail.\n postExtra: async (text, responseId) => {\n if (threadTargetId) return bot.postInThread(channelId, threadTargetId, text);\n if (replyTargetId) return bot.postReply(channelId, replyTargetId, text);\n if (responseId !== null) return bot.postReply(channelId, responseId, text);\n return bot.postMessage(channelId, text);\n },\n delete: (id) => bot.deleteMessageRaw(channelId, id),\n logBotResponse: (text, id) => bot.logBotResponse(channelId, text, id),\n uploadFile: (filePath, title) => bot.uploadFile(channelId, filePath, title),\n react: replyTargetId ? (emoji) => bot.addReaction(channelId, replyTargetId, emoji) : undefined,\n });\n\n return { address: message.address, message, responder, platform };\n}\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/discord/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { createConversationMessage, type ConversationContext } from \"../index.js\";\nimport { resolveChatSessionKey } from \"../../sessions/session-key.js\";\nimport { createProgressiveRenderer, formatMarkdownToolResult } from \"../progressive-renderer.js\";\nimport { DISCORD_V2_TEXT_LIMIT } from \"./components.js\";\nimport { formatDiscordMarkdown } from \"./format.js\";\nimport type { DiscordMessagingBot, DiscordEvent } from \"./bot.js\";\n\nconst MAX_LENGTH = DISCORD_V2_TEXT_LIMIT - 100;\n\nconst formatDiscordContinuation = (partNum: number): string => `*(continued ${partNum})*`;\n\nfunction isDiscordMessageReference(id: string | undefined): id is string {\n return typeof id === \"string\" && id !== \"\" && !id.startsWith(\"event:\");\n}\n\nexport function createDiscordAdapters(\n event: DiscordEvent,\n bot: DiscordMessagingBot,\n): ConversationContext {\n const conversationId = event.address.conversationId;\n const channelId = conversationId;\n const threadTargetId = isDiscordMessageReference(event.thread_ts) ? event.thread_ts : undefined;\n const replyTargetId = isDiscordMessageReference(event.ts) ? event.ts : undefined;\n\n const message = createConversationMessage({\n platform: \"discord\",\n conversationId,\n address: event.address,\n id: event.ts,\n sessionKey:\n event.sessionKey ??\n resolveChatSessionKey({\n conversationId,\n conversationKind: event.conversationKind,\n messageId: event.ts,\n persistentTopLevel: true,\n threadTs: event.thread_ts,\n }),\n conversationKind: event.conversationKind,\n userId: event.user,\n userName: event.userName,\n text: event.text,\n attachments: event.attachments,\n threadTs: event.thread_ts,\n });\n\n const platform = bot.getMessagingInfo();\n\n function postFirst(text: string): Promise<string> {\n if (threadTargetId) return bot.postInThread(channelId, threadTargetId, text);\n if (replyTargetId) return bot.postReply(channelId, replyTargetId, text);\n return bot.postMessage(channelId, text);\n }\n\n const { responder } = createProgressiveRenderer({\n label: \"Discord\",\n maxLength: MAX_LENGTH,\n formatContinuation: formatDiscordContinuation,\n errorPrefix: \"*Error:* \",\n workingIndicator: \" ...\",\n supportsDeltas: true,\n typing: {\n send: () => bot.sendTyping(channelId),\n intervalMs: 8000,\n stopOnSend: true,\n },\n prepareSource: (text) => formatDiscordMarkdown(text),\n formatToolResult: formatMarkdownToolResult,\n responseErrorContext: (responseId) => ({\n platform: \"discord\",\n conversationId,\n channelId,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: responseId,\n threadTs: threadTargetId,\n replyTargetId,\n conversationKind: message.conversationKind,\n }),\n post: postFirst,\n update: (id, text) => bot.updateMessageRaw(channelId, id, text),\n postExtra: async (text, responseId) => {\n if (threadTargetId) return bot.postInThread(channelId, threadTargetId, text);\n if (replyTargetId) return bot.postReply(channelId, replyTargetId, text);\n if (responseId !== null) return bot.postReply(channelId, responseId, text);\n return bot.postMessage(channelId, text);\n },\n delete: (id) => bot.deleteMessageRaw(channelId, id),\n logBotResponse: (text, id) => bot.logBotResponse(channelId, text, id),\n uploadFile: (filePath, title) => bot.uploadFile(channelId, filePath, title),\n react: replyTargetId ? (emoji) => bot.addReaction(channelId, replyTargetId, emoji) : undefined,\n });\n\n return { address: message.address, message, responder, platform };\n}\n"]}
@@ -1,3 +1,2 @@
1
- /** Everything Discord cannot render, converted to something it can. */
2
1
  export declare function formatDiscordMarkdown(source: string): string;
3
2
  //# sourceMappingURL=format.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/format.ts"],"names":[],"mappings":"AA8FA,uEAAuE;AACvE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5D"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/format.ts"],"names":[],"mappings":"AAyDA,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5D"}
@@ -1,27 +1,6 @@
1
1
  import { extractMarkdownTables, normalizeMarkdownTables, renderMonospaceTable, } from "../markdown-tables.js";
2
- /**
3
- * Discord-side presentation of a response.
4
- *
5
- * The model writes standard markdown for every platform; making it write
6
- * Discord-flavoured markdown instead would trade one platform's rendering for
7
- * another's, and Discord is the one that renders the least. So the conversion
8
- * belongs here, at the last step before sending.
9
- *
10
- * Discord renders most of what we emit — headings, lists, quotes, fenced code
11
- * with highlighting, links, spoilers, and its own `-#` subtext. What it does
12
- * not render is handled below, each verified against the real client rather
13
- * than against the docs.
14
- */
15
- /** Fence tables at this width or less; wider ones wrap and look worse aligned. */
16
2
  const MAX_FENCED_TABLE_WIDTH = 120;
17
- /** Stand-in for a horizontal rule, which Discord has no syntax for. */
18
3
  const RULE = "─".repeat(30);
19
- /**
20
- * Replace GFM tables with aligned, fenced equivalents.
21
- *
22
- * Prose is sliced verbatim around each table rather than re-serialized, so
23
- * everything Discord already renders correctly passes through untouched.
24
- */
25
4
  function convertTables(source) {
26
5
  const normalized = normalizeMarkdownTables(source);
27
6
  const tables = extractMarkdownTables(normalized);
@@ -33,8 +12,6 @@ function convertTables(source) {
33
12
  for (const table of tables) {
34
13
  out.push(...lines.slice(cursor, table.startLine));
35
14
  const rendered = renderMonospaceTable(table);
36
- // Too wide to align: Discord soft-wraps inside a fence and the columns
37
- // scatter, which is worse than the pipes. Leave those as they came.
38
15
  if (rendered.split("\n").reduce((max, line) => Math.max(max, line.length), 0) >
39
16
  MAX_FENCED_TABLE_WIDTH) {
40
17
  out.push(...lines.slice(table.startLine, table.endLine));
@@ -47,13 +24,6 @@ function convertTables(source) {
47
24
  out.push(...lines.slice(cursor));
48
25
  return out.join("\n");
49
26
  }
50
- /**
51
- * Line-level rewrites for constructs Discord ignores, applied outside fenced
52
- * code so a code sample keeps whatever it contains.
53
- *
54
- * Runs after table conversion because that step maps source line numbers, and
55
- * a rewrite that changed the line count first would misplace every table.
56
- */
57
27
  function convertUnsupportedSyntax(source) {
58
28
  let inFence = false;
59
29
  return source
@@ -65,19 +35,12 @@ function convertUnsupportedSyntax(source) {
65
35
  }
66
36
  if (inFence)
67
37
  return line;
68
- // A horizontal rule renders as its own literal dashes. Discord has no
69
- // rule syntax, so draw one — dropping the line would lose the section
70
- // break the author meant.
71
38
  if (/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(line))
72
39
  return RULE;
73
- // Discord does not render markdown images: `![alt](url)` arrives as a
74
- // stray "!" followed by a link, and the image never appears. A bare URL
75
- // *does* auto-embed, so emit that and keep the alt text above it.
76
40
  return line.replace(/!\[([^\]]*)\]\(([^)\s]+)\)/g, (_match, alt, url) => alt.trim() ? `${alt}\n${url}` : url);
77
41
  })
78
42
  .join("\n");
79
43
  }
80
- /** Everything Discord cannot render, converted to something it can. */
81
44
  export function formatDiscordMarkdown(source) {
82
45
  return convertUnsupportedSyntax(convertTables(source));
83
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/adapters/discord/format.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n extractMarkdownTables,\n normalizeMarkdownTables,\n renderMonospaceTable,\n} from \"../markdown-tables.js\";\n\n/**\n * Discord-side presentation of a response.\n *\n * The model writes standard markdown for every platform; making it write\n * Discord-flavoured markdown instead would trade one platform's rendering for\n * another's, and Discord is the one that renders the least. So the conversion\n * belongs here, at the last step before sending.\n *\n * Discord renders most of what we emit — headings, lists, quotes, fenced code\n * with highlighting, links, spoilers, and its own `-#` subtext. What it does\n * not render is handled below, each verified against the real client rather\n * than against the docs.\n */\n\n/** Fence tables at this width or less; wider ones wrap and look worse aligned. */\nconst MAX_FENCED_TABLE_WIDTH = 120;\n\n/** Stand-in for a horizontal rule, which Discord has no syntax for. */\nconst RULE = \"─\".repeat(30);\n\n/**\n * Replace GFM tables with aligned, fenced equivalents.\n *\n * Prose is sliced verbatim around each table rather than re-serialized, so\n * everything Discord already renders correctly passes through untouched.\n */\nfunction convertTables(source: string): string {\n const normalized = normalizeMarkdownTables(source);\n const tables = extractMarkdownTables(normalized);\n if (tables.length === 0) return source;\n\n const lines = normalized.split(\"\\n\");\n const out: string[] = [];\n let cursor = 0;\n\n for (const table of tables) {\n out.push(...lines.slice(cursor, table.startLine));\n const rendered = renderMonospaceTable(table);\n // Too wide to align: Discord soft-wraps inside a fence and the columns\n // scatter, which is worse than the pipes. Leave those as they came.\n if (\n rendered.split(\"\\n\").reduce((max, line) => Math.max(max, line.length), 0) >\n MAX_FENCED_TABLE_WIDTH\n ) {\n out.push(...lines.slice(table.startLine, table.endLine));\n } else {\n out.push(\"```\", rendered, \"```\");\n }\n cursor = table.endLine;\n }\n out.push(...lines.slice(cursor));\n\n return out.join(\"\\n\");\n}\n\n/**\n * Line-level rewrites for constructs Discord ignores, applied outside fenced\n * code so a code sample keeps whatever it contains.\n *\n * Runs after table conversion because that step maps source line numbers, and\n * a rewrite that changed the line count first would misplace every table.\n */\nfunction convertUnsupportedSyntax(source: string): string {\n let inFence = false;\n return source\n .split(\"\\n\")\n .map((line) => {\n if (/^\\s*(```|~~~)/.test(line)) {\n inFence = !inFence;\n return line;\n }\n if (inFence) return line;\n\n // A horizontal rule renders as its own literal dashes. Discord has no\n // rule syntax, so draw one — dropping the line would lose the section\n // break the author meant.\n if (/^\\s*(-{3,}|\\*{3,}|_{3,})\\s*$/.test(line)) return RULE;\n\n // Discord does not render markdown images: `![alt](url)` arrives as a\n // stray \"!\" followed by a link, and the image never appears. A bare URL\n // *does* auto-embed, so emit that and keep the alt text above it.\n return line.replace(/!\\[([^\\]]*)\\]\\(([^)\\s]+)\\)/g, (_match, alt: string, url: string) =>\n alt.trim() ? `${alt}\\n${url}` : url,\n );\n })\n .join(\"\\n\");\n}\n\n/** Everything Discord cannot render, converted to something it can. */\nexport function formatDiscordMarkdown(source: string): string {\n return convertUnsupportedSyntax(convertTables(source));\n}\n"]}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/adapters/discord/format.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE5B,SAAS,aAAa,CAAC,MAAc;IACnC,MAAM,UAAU,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAEvC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC7C,IACE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzE,sBAAsB,EACtB,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;IACzB,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjC,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAc;IAC9C,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,GAAG,CAAC,OAAO,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO;YAAE,OAAO,IAAI,CAAC;QAEzB,IAAI,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAE3D,OAAO,IAAI,CAAC,OAAO,CAAC,6BAA6B,EAAE,CAAC,MAAM,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE,CACtF,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CACpC,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,OAAO,wBAAwB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AACzD,CAAC","sourcesContent":["import {\n extractMarkdownTables,\n normalizeMarkdownTables,\n renderMonospaceTable,\n} from \"../markdown-tables.js\";\n\nconst MAX_FENCED_TABLE_WIDTH = 120;\n\nconst RULE = \"─\".repeat(30);\n\nfunction convertTables(source: string): string {\n const normalized = normalizeMarkdownTables(source);\n const tables = extractMarkdownTables(normalized);\n if (tables.length === 0) return source;\n\n const lines = normalized.split(\"\\n\");\n const out: string[] = [];\n let cursor = 0;\n\n for (const table of tables) {\n out.push(...lines.slice(cursor, table.startLine));\n const rendered = renderMonospaceTable(table);\n if (\n rendered.split(\"\\n\").reduce((max, line) => Math.max(max, line.length), 0) >\n MAX_FENCED_TABLE_WIDTH\n ) {\n out.push(...lines.slice(table.startLine, table.endLine));\n } else {\n out.push(\"```\", rendered, \"```\");\n }\n cursor = table.endLine;\n }\n out.push(...lines.slice(cursor));\n\n return out.join(\"\\n\");\n}\n\nfunction convertUnsupportedSyntax(source: string): string {\n let inFence = false;\n return source\n .split(\"\\n\")\n .map((line) => {\n if (/^\\s*(```|~~~)/.test(line)) {\n inFence = !inFence;\n return line;\n }\n if (inFence) return line;\n\n if (/^\\s*(-{3,}|\\*{3,}|_{3,})\\s*$/.test(line)) return RULE;\n\n return line.replace(/!\\[([^\\]]*)\\]\\(([^)\\s]+)\\)/g, (_match, alt: string, url: string) =>\n alt.trim() ? `${alt}\\n${url}` : url,\n );\n })\n .join(\"\\n\");\n}\n\nexport function formatDiscordMarkdown(source: string): string {\n return convertUnsupportedSyntax(convertTables(source));\n}\n"]}
@@ -8,7 +8,6 @@ export declare class GithubMessagingBot implements MessagingBot {
8
8
  private readonly client;
9
9
  private readonly handler;
10
10
  private readonly config;
11
- /** Host-side backend for the github_* tool pack; standalone from polling. */
12
11
  readonly ops: GithubOps;
13
12
  private appSlug;
14
13
  private botEmail;
@@ -35,68 +34,25 @@ export declare class GithubMessagingBot implements MessagingBot {
35
34
  logToFile(conversationId: string, entry: object): void;
36
35
  logBotResponse(conversationId: string, text: string, ts: string): void;
37
36
  private getQueue;
38
- /**
39
- * Webhook poke: run a poll soon. Debounced so a burst of deliveries costs
40
- * one tick; a poke landing mid-poll marks it pending and the tick re-runs,
41
- * because the in-flight pass may already be past the poked repo's feeds.
42
- */
43
37
  requestPoll(debounceMs?: number): void;
44
- /** One poll tick over every watched repo. Public for tests. */
45
38
  poll(): Promise<void>;
46
39
  private pollWatchedRepos;
47
40
  private pollRepo;
48
- /**
49
- * One feed's watermark advance — the same discipline for all three feeds:
50
- * bump the cursor on any fresher updated_at, then let the id watermark plus
51
- * the creation baseline decide what actually triggers (edits re-surface old
52
- * items with a fresh updated_at). Bot-authored items advance the watermark
53
- * without triggering.
54
- */
55
41
  private advanceFeed;
56
42
  private loadSyncState;
57
- /** The persisted form of the current watermarks; the test/inspection surface. */
58
43
  syncStateSnapshot(): GithubSyncState;
59
44
  private persistSyncState;
60
- /** Fresh regex per call: the `g` flag makes `test`/`replace` stateful. */
61
45
  private mentionPattern;
62
46
  private isMentioned;
63
47
  private stripMention;
64
- /** The Conversation office for a GitHub conversation id (one PR/issue). */
65
48
  private office;
66
49
  private isParticipating;
67
- /**
68
- * True when `user` holds at least write permission on the repo. Fails
69
- * closed: a failed lookup denies the trigger (and logs) rather than
70
- * letting an unverified commenter drive the agent.
71
- */
72
50
  private hasTriggerPermission;
73
51
  private handleIncoming;
74
- /**
75
- * First contact: log the issue title/body ahead of the comment so the
76
- * session history starts with what the thread is about. The clone is
77
- * (re)attempted on every trigger while ./repo is missing — a no-op once
78
- * it exists — so a failed first clone (e.g. App permissions granted
79
- * later) heals on the next mention instead of wedging the conversation.
80
- */
81
52
  private prepareConversation;
82
- /**
83
- * Decorates an inline review comment with its diff anchor and (for replies)
84
- * the thread's earlier turns, so the agent knows which code the feedback is
85
- * about without hunting through the PR. The rc-<id> in the header is what
86
- * github_review_reply takes to answer in-thread.
87
- */
88
53
  private formatReviewMessage;
89
- /**
90
- * Earlier turns of one review thread (root + replies before the trigger),
91
- * newest-truncated. Fail-soft: context is a nicety, the trigger is not.
92
- */
93
54
  private reviewThreadContext;
94
55
  private logIssueContext;
95
- /**
96
- * Clone the conversation's repo into its dir (bind-mounted into the
97
- * sandbox) using an ephemeral contents:read token that never leaves the
98
- * host. Non-fatal: a failed clone degrades to the pre-clone experience.
99
- */
100
56
  private ensureRepoClone;
101
57
  }
102
58
  //# sourceMappingURL=bot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/github/bot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/github/bot.ts"],"names":[],"mappings":"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"}
@@ -20,21 +20,12 @@ const SyncStateSchema = Type.Object({
20
20
  cursor: Type.String(),
21
21
  seenComments: Type.Array(Type.Number()),
22
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
23
  seenReviewComments: Type.Optional(Type.Array(Type.Number())),
26
24
  })),
27
25
  });
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
26
  const POLL_OVERLAP_MS = 5 * 60 * 1000;
34
27
  const MAX_SEEN_IDS = 5000;
35
- /** Webhook pokes within this window collapse into one poll tick. */
36
28
  const REQUEST_POLL_DEBOUNCE_MS = 1500;
37
- /** Effective role → rank, for the trigger-permission gate. */
38
29
  const PERMISSION_RANK = {
39
30
  none: 0,
40
31
  read: 1,
@@ -43,20 +34,12 @@ const PERMISSION_RANK = {
43
34
  maintain: 4,
44
35
  admin: 5,
45
36
  };
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
37
  const REQUIRED_TRIGGER_RANK = PERMISSION_RANK.write;
52
- /** Rank for an arbitrary API-reported permission name; unknown names rank 0. */
53
38
  function rankOfPermission(name) {
54
39
  return PERMISSION_RANK[name] ?? 0;
55
40
  }
56
- /** Permission lookups are cached this long per repo+user. */
57
41
  const PERMISSION_CACHE_TTL_MS = 5 * 60 * 1000;
58
42
  export const formatGithubContinuation = (partNum) => `*(continued ${partNum})*`;
59
- /** Slack-style emoji short names → GitHub reaction content values. */
60
43
  const GITHUB_REACTIONS = {
61
44
  "+1": "+1",
62
45
  thumbsup: "+1",
@@ -71,9 +54,6 @@ const GITHUB_REACTIONS = {
71
54
  rocket: "rocket",
72
55
  eyes: "eyes",
73
56
  };
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
57
  function parseRepoList(repos) {
78
58
  return repos.map((entry) => {
79
59
  const [owner, repo, ...rest] = entry.split("/");
@@ -83,7 +63,6 @@ function parseRepoList(repos) {
83
63
  return { owner: owner.toLowerCase(), repo: repo.toLowerCase() };
84
64
  });
85
65
  }
86
- /** Sets iterate in insertion order; drop the oldest ids once over the cap. */
87
66
  function pruneSeen(seen) {
88
67
  if (seen.size <= MAX_SEEN_IDS)
89
68
  return;
@@ -94,7 +73,6 @@ function pruneSeen(seen) {
94
73
  seen.delete(id);
95
74
  }
96
75
  }
97
- /** Issue number from a comment's `issue_url` (…/repos/o/r/issues/42). */
98
76
  function issueNumberFromUrl(issueUrl) {
99
77
  const match = /\/issues\/(\d+)$/.exec(issueUrl);
100
78
  if (!match) {
@@ -102,7 +80,6 @@ function issueNumberFromUrl(issueUrl) {
102
80
  }
103
81
  return Number(match[1]);
104
82
  }
105
- /** PR number from a review comment's `pull_request_url` (…/repos/o/r/pulls/42). */
106
83
  function prNumberFromUrl(pullRequestUrl) {
107
84
  const match = /\/pulls\/(\d+)$/.exec(pullRequestUrl);
108
85
  if (!match) {
@@ -110,7 +87,6 @@ function prNumberFromUrl(pullRequestUrl) {
110
87
  }
111
88
  return Number(match[1]);
112
89
  }
113
- /** Keep the tail: a review comment anchors to the hunk's final lines. */
114
90
  const MAX_DIFF_HUNK_CHARS = 1500;
115
91
  const MAX_THREAD_TURNS = 10;
116
92
  const MAX_THREAD_TURN_CHARS = 500;
@@ -139,16 +115,10 @@ export class GithubMessagingBot {
139
115
  });
140
116
  this.ops = new GithubOps(this.client, { workspace: config.workspace });
141
117
  }
142
- // ==========================================================================
143
- // Public API (implements MessagingBot)
144
- // ==========================================================================
145
118
  async start() {
146
119
  this.stopped = false;
147
120
  this.stopping = false;
148
121
  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
122
  try {
153
123
  const botUserId = await this.client.getUserId(`${this.appSlug}[bot]`);
154
124
  this.botEmail = `${botUserId}+${this.appSlug}[bot]@users.noreply.github.com`;
@@ -166,8 +136,6 @@ export class GithubMessagingBot {
166
136
  if (this.watchedRepos.length === 0) {
167
137
  log.logWarning("GitHub: installation has no repositories; nothing to poll");
168
138
  }
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
139
  const persisted = this.loadSyncState();
172
140
  const now = new Date().toISOString();
173
141
  for (const repo of this.watchedRepos) {
@@ -251,7 +219,7 @@ export class GithubMessagingBot {
251
219
  enqueueEvent(event) {
252
220
  if (this.stopped)
253
221
  return false;
254
- const conversationId = event.conversationId;
222
+ const conversationId = event.address.conversationId;
255
223
  const queue = this.getQueue(conversationId);
256
224
  if (queue.size() >= 5) {
257
225
  log.logWarning(`Event queue full for ${conversationId}, discarding: ${event.text.substring(0, 50)}`);
@@ -274,9 +242,6 @@ export class GithubMessagingBot {
274
242
  users: [],
275
243
  };
276
244
  }
277
- // ==========================================================================
278
- // Internal helpers (used by context.ts)
279
- // ==========================================================================
280
245
  async postComment(ref, text) {
281
246
  const comment = await githubRetry(() => this.client.createIssueComment(ref.owner, ref.repo, ref.number, text));
282
247
  return comment.id;
@@ -290,9 +255,6 @@ export class GithubMessagingBot {
290
255
  logBotResponse(conversationId, text, ts) {
291
256
  appendBotResponseLog(this.office(conversationId), text, ts);
292
257
  }
293
- // ==========================================================================
294
- // Private - polling
295
- // ==========================================================================
296
258
  getQueue(conversationId) {
297
259
  let queue = this.queues.get(conversationId);
298
260
  if (!queue) {
@@ -301,11 +263,6 @@ export class GithubMessagingBot {
301
263
  }
302
264
  return queue;
303
265
  }
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
266
  requestPoll(debounceMs = REQUEST_POLL_DEBOUNCE_MS) {
310
267
  if (this.stopped || this.stopping)
311
268
  return;
@@ -321,7 +278,6 @@ export class GithubMessagingBot {
321
278
  }, debounceMs);
322
279
  this.requestPollTimer.unref();
323
280
  }
324
- /** One poll tick over every watched repo. Public for tests. */
325
281
  async poll() {
326
282
  if (this.stopped || this.stopping)
327
283
  return;
@@ -362,9 +318,6 @@ export class GithubMessagingBot {
362
318
  return false;
363
319
  const since = new Date(Date.parse(state.cursor) - POLL_OVERLAP_MS).toISOString();
364
320
  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
321
  const issues = (await this.client.listIssuesSince(repo.owner, repo.repo, since)) ?? [];
369
322
  changed =
370
323
  (await this.advanceFeed(state, state.seenIssues, issues, (issue) => ({
@@ -384,9 +337,6 @@ export class GithubMessagingBot {
384
337
  text: comment.body,
385
338
  createdAt: comment.created_at,
386
339
  }))) || 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
340
  const reviewComments = (await this.client.listPullReviewCommentsSince(repo.owner, repo.repo, since)) ?? [];
391
341
  changed =
392
342
  (await this.advanceFeed(state, state.seenReviewComments, reviewComments, (comment) => ({
@@ -409,13 +359,6 @@ export class GithubMessagingBot {
409
359
  pruneSeen(state.seenReviewComments);
410
360
  return changed;
411
361
  }
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
362
  async advanceFeed(state, seen, items, toIncoming) {
420
363
  let changed = false;
421
364
  for (const item of items) {
@@ -433,21 +376,15 @@ export class GithubMessagingBot {
433
376
  }
434
377
  return changed;
435
378
  }
436
- // ==========================================================================
437
- // Private - watermark persistence
438
- // ==========================================================================
439
379
  loadSyncState() {
440
380
  try {
441
381
  return readJsonSchemaFileIfExists(this.config.syncStatePath, SyncStateSchema, (detail) => `Malformed GitHub sync state at ${this.config.syncStatePath}: ${detail}`);
442
382
  }
443
383
  catch (err) {
444
- // A bad state file re-baselines (history won't trigger) rather than
445
- // blocking startup; the next persist overwrites it.
446
384
  log.logWarning("GitHub: ignoring unreadable sync state", err instanceof Error ? err.message : String(err));
447
385
  return undefined;
448
386
  }
449
387
  }
450
- /** The persisted form of the current watermarks; the test/inspection surface. */
451
388
  syncStateSnapshot() {
452
389
  const state = { repos: {} };
453
390
  for (const [repoKey, watermark] of this.repoState) {
@@ -465,10 +402,6 @@ export class GithubMessagingBot {
465
402
  ensureDirExists(dirname(this.config.syncStatePath));
466
403
  atomicWritePrivateFile(this.config.syncStatePath, JSON.stringify(this.syncStateSnapshot()));
467
404
  }
468
- // ==========================================================================
469
- // Private - triggering
470
- // ==========================================================================
471
- /** Fresh regex per call: the `g` flag makes `test`/`replace` stateful. */
472
405
  mentionPattern() {
473
406
  return this.appSlug ? new RegExp(`@${this.appSlug}(?![\\w-])`, "gi") : null;
474
407
  }
@@ -480,18 +413,12 @@ export class GithubMessagingBot {
480
413
  const pattern = this.mentionPattern();
481
414
  return (pattern ? text.replace(pattern, "") : text).trim();
482
415
  }
483
- /** The Conversation office for a GitHub conversation id (one PR/issue). */
484
416
  office(conversationId) {
485
417
  return this.config.workspace.office(createOfficeAddress("github", conversationId));
486
418
  }
487
419
  isParticipating(conversationId) {
488
420
  return existsSync(this.office(conversationId).logPath);
489
421
  }
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
422
  async hasTriggerPermission(ref, user) {
496
423
  const cacheKey = `${ref.owner}/${ref.repo}#${user}`;
497
424
  const cached = this.permissionCache.get(cacheKey);
@@ -501,8 +428,6 @@ export class GithubMessagingBot {
501
428
  let rank;
502
429
  try {
503
430
  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
431
  rank = Math.max(rankOfPermission(role.role_name ?? ""), rankOfPermission(role.permission));
507
432
  }
508
433
  catch (err) {
@@ -519,13 +444,8 @@ export class GithubMessagingBot {
519
444
  const conversationId = buildGithubConversationId(item.ref);
520
445
  const mentioned = this.isMentioned(item.text);
521
446
  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
447
  if (!mentioned && !participating)
526
448
  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
449
  if (!(await this.hasTriggerPermission(item.ref, item.user))) {
530
450
  log.logInfo(`GitHub: ignoring ${conversationId} comment from ${item.user} (below write permission)`);
531
451
  return;
@@ -554,7 +474,6 @@ export class GithubMessagingBot {
554
474
  await processMessageIntake({
555
475
  eventBase,
556
476
  addressed: true,
557
- // Match on the user-typed text, not the review-decorated messageText.
558
477
  magicWord: { text: cleanedText, addressed: mentioned, scopeFallback: "never" },
559
478
  busyPolicy: "queue",
560
479
  logEntryBase: {
@@ -565,18 +484,11 @@ export class GithubMessagingBot {
565
484
  text: messageText,
566
485
  isMessagingBot: false,
567
486
  },
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
487
  log: (entry) => {
573
488
  if (!participating && matchMagicWord(cleanedText) === "stop")
574
489
  return;
575
490
  this.logToFile(conversationId, entry);
576
491
  },
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
492
  processAttachments: async () => {
581
493
  await this.prepareConversation(item, conversationId, participating);
582
494
  return [];
@@ -588,19 +500,10 @@ export class GithubMessagingBot {
588
500
  createContext: (event) => createGithubAdapters(event, this),
589
501
  });
590
502
  }
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
503
  async prepareConversation(item, conversationId, participating) {
599
504
  let isPrHint = item.isPr;
600
505
  if (!participating && item.ts !== GITHUB_ISSUE_BODY_TS) {
601
506
  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
507
  if (issue && isPrHint === undefined)
605
508
  isPrHint = Boolean(issue.pull_request);
606
509
  }
@@ -609,12 +512,6 @@ export class GithubMessagingBot {
609
512
  await this.ensureRepoClone(item.ref, conversationId, isPr);
610
513
  }
611
514
  }
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
515
  async formatReviewMessage(item, cleanedText) {
619
516
  const review = item.review;
620
517
  const location = review.line !== null ? `${review.path}:${review.line}` : review.path;
@@ -634,10 +531,6 @@ export class GithubMessagingBot {
634
531
  parts.push(cleanedText);
635
532
  return parts.join("\n");
636
533
  }
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
534
  async reviewThreadContext(ref, rootId, beforeId) {
642
535
  try {
643
536
  const all = await githubRetry(() => this.client.listPullReviewComments(ref.owner, ref.repo, ref.number));
@@ -665,10 +558,6 @@ export class GithubMessagingBot {
665
558
  log.logWarning(`GitHub: could not fetch issue context for ${conversationId}`, err instanceof Error ? err.message : String(err));
666
559
  return null;
667
560
  }
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
561
  const triggerMs = Date.parse(triggerCreatedAt);
673
562
  const contextDate = new Date((Number.isFinite(triggerMs) ? triggerMs : Date.now()) - 1000);
674
563
  this.logToFile(conversationId, {
@@ -682,14 +571,6 @@ export class GithubMessagingBot {
682
571
  });
683
572
  return issue;
684
573
  }
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
574
  async ensureRepoClone(ref, conversationId, isPr) {
694
575
  const office = this.office(conversationId);
695
576
  const dir = conversationRepoDir(office);