openryoko 0.9.4-ryoko.2

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 (514) hide show
  1. package/dist/bin/jimmy.d.ts +3 -0
  2. package/dist/bin/jimmy.d.ts.map +1 -0
  3. package/dist/bin/jimmy.js +149 -0
  4. package/dist/bin/jimmy.js.map +1 -0
  5. package/dist/package.json +54 -0
  6. package/dist/src/cli/__tests__/migrate.test.d.ts +2 -0
  7. package/dist/src/cli/__tests__/migrate.test.d.ts.map +1 -0
  8. package/dist/src/cli/__tests__/migrate.test.js +79 -0
  9. package/dist/src/cli/__tests__/migrate.test.js.map +1 -0
  10. package/dist/src/cli/chrome-allow.d.ts +5 -0
  11. package/dist/src/cli/chrome-allow.d.ts.map +1 -0
  12. package/dist/src/cli/chrome-allow.js +250 -0
  13. package/dist/src/cli/chrome-allow.js.map +1 -0
  14. package/dist/src/cli/create.d.ts +2 -0
  15. package/dist/src/cli/create.d.ts.map +1 -0
  16. package/dist/src/cli/create.js +72 -0
  17. package/dist/src/cli/create.js.map +1 -0
  18. package/dist/src/cli/instances.d.ts +14 -0
  19. package/dist/src/cli/instances.d.ts.map +1 -0
  20. package/dist/src/cli/instances.js +43 -0
  21. package/dist/src/cli/instances.js.map +1 -0
  22. package/dist/src/cli/list.d.ts +2 -0
  23. package/dist/src/cli/list.d.ts.map +1 -0
  24. package/dist/src/cli/list.js +38 -0
  25. package/dist/src/cli/list.js.map +1 -0
  26. package/dist/src/cli/migrate.d.ts +5 -0
  27. package/dist/src/cli/migrate.d.ts.map +1 -0
  28. package/dist/src/cli/migrate.js +222 -0
  29. package/dist/src/cli/migrate.js.map +1 -0
  30. package/dist/src/cli/nuke.d.ts +2 -0
  31. package/dist/src/cli/nuke.d.ts.map +1 -0
  32. package/dist/src/cli/nuke.js +91 -0
  33. package/dist/src/cli/nuke.js.map +1 -0
  34. package/dist/src/cli/remove.d.ts +4 -0
  35. package/dist/src/cli/remove.d.ts.map +1 -0
  36. package/dist/src/cli/remove.js +47 -0
  37. package/dist/src/cli/remove.js.map +1 -0
  38. package/dist/src/cli/setup.d.ts +4 -0
  39. package/dist/src/cli/setup.d.ts.map +1 -0
  40. package/dist/src/cli/setup.js +491 -0
  41. package/dist/src/cli/setup.js.map +1 -0
  42. package/dist/src/cli/skills.d.ts +28 -0
  43. package/dist/src/cli/skills.d.ts.map +1 -0
  44. package/dist/src/cli/skills.js +284 -0
  45. package/dist/src/cli/skills.js.map +1 -0
  46. package/dist/src/cli/start.d.ts +5 -0
  47. package/dist/src/cli/start.d.ts.map +1 -0
  48. package/dist/src/cli/start.js +34 -0
  49. package/dist/src/cli/start.js.map +1 -0
  50. package/dist/src/cli/status.d.ts +2 -0
  51. package/dist/src/cli/status.d.ts.map +1 -0
  52. package/dist/src/cli/status.js +69 -0
  53. package/dist/src/cli/status.js.map +1 -0
  54. package/dist/src/cli/stop.d.ts +2 -0
  55. package/dist/src/cli/stop.d.ts.map +1 -0
  56. package/dist/src/cli/stop.js +11 -0
  57. package/dist/src/cli/stop.js.map +1 -0
  58. package/dist/src/connectors/cron/index.d.ts +21 -0
  59. package/dist/src/connectors/cron/index.d.ts.map +1 -0
  60. package/dist/src/connectors/cron/index.js +75 -0
  61. package/dist/src/connectors/cron/index.js.map +1 -0
  62. package/dist/src/connectors/discord/format.d.ts +3 -0
  63. package/dist/src/connectors/discord/format.d.ts.map +1 -0
  64. package/dist/src/connectors/discord/format.js +33 -0
  65. package/dist/src/connectors/discord/format.js.map +1 -0
  66. package/dist/src/connectors/discord/index.d.ts +47 -0
  67. package/dist/src/connectors/discord/index.d.ts.map +1 -0
  68. package/dist/src/connectors/discord/index.js +308 -0
  69. package/dist/src/connectors/discord/index.js.map +1 -0
  70. package/dist/src/connectors/discord/remote.d.ts +33 -0
  71. package/dist/src/connectors/discord/remote.d.ts.map +1 -0
  72. package/dist/src/connectors/discord/remote.js +89 -0
  73. package/dist/src/connectors/discord/remote.js.map +1 -0
  74. package/dist/src/connectors/discord/threads.d.ts +5 -0
  75. package/dist/src/connectors/discord/threads.d.ts.map +1 -0
  76. package/dist/src/connectors/discord/threads.js +22 -0
  77. package/dist/src/connectors/discord/threads.js.map +1 -0
  78. package/dist/src/connectors/slack/__tests__/active-threads.test.d.ts +2 -0
  79. package/dist/src/connectors/slack/__tests__/active-threads.test.d.ts.map +1 -0
  80. package/dist/src/connectors/slack/__tests__/active-threads.test.js +57 -0
  81. package/dist/src/connectors/slack/__tests__/active-threads.test.js.map +1 -0
  82. package/dist/src/connectors/slack/__tests__/format.test.d.ts +2 -0
  83. package/dist/src/connectors/slack/__tests__/format.test.d.ts.map +1 -0
  84. package/dist/src/connectors/slack/__tests__/format.test.js +115 -0
  85. package/dist/src/connectors/slack/__tests__/format.test.js.map +1 -0
  86. package/dist/src/connectors/slack/__tests__/speaker.test.d.ts +2 -0
  87. package/dist/src/connectors/slack/__tests__/speaker.test.d.ts.map +1 -0
  88. package/dist/src/connectors/slack/__tests__/speaker.test.js +59 -0
  89. package/dist/src/connectors/slack/__tests__/speaker.test.js.map +1 -0
  90. package/dist/src/connectors/slack/__tests__/triage-prompt.test.d.ts +2 -0
  91. package/dist/src/connectors/slack/__tests__/triage-prompt.test.d.ts.map +1 -0
  92. package/dist/src/connectors/slack/__tests__/triage-prompt.test.js +102 -0
  93. package/dist/src/connectors/slack/__tests__/triage-prompt.test.js.map +1 -0
  94. package/dist/src/connectors/slack/__tests__/triage.test.d.ts +2 -0
  95. package/dist/src/connectors/slack/__tests__/triage.test.d.ts.map +1 -0
  96. package/dist/src/connectors/slack/__tests__/triage.test.js +88 -0
  97. package/dist/src/connectors/slack/__tests__/triage.test.js.map +1 -0
  98. package/dist/src/connectors/slack/active-threads.d.ts +39 -0
  99. package/dist/src/connectors/slack/active-threads.d.ts.map +1 -0
  100. package/dist/src/connectors/slack/active-threads.js +71 -0
  101. package/dist/src/connectors/slack/active-threads.js.map +1 -0
  102. package/dist/src/connectors/slack/format.d.ts +17 -0
  103. package/dist/src/connectors/slack/format.d.ts.map +1 -0
  104. package/dist/src/connectors/slack/format.js +85 -0
  105. package/dist/src/connectors/slack/format.js.map +1 -0
  106. package/dist/src/connectors/slack/index.d.ts +51 -0
  107. package/dist/src/connectors/slack/index.d.ts.map +1 -0
  108. package/dist/src/connectors/slack/index.js +562 -0
  109. package/dist/src/connectors/slack/index.js.map +1 -0
  110. package/dist/src/connectors/slack/speaker.d.ts +39 -0
  111. package/dist/src/connectors/slack/speaker.d.ts.map +1 -0
  112. package/dist/src/connectors/slack/speaker.js +30 -0
  113. package/dist/src/connectors/slack/speaker.js.map +1 -0
  114. package/dist/src/connectors/slack/threads.d.ts +12 -0
  115. package/dist/src/connectors/slack/threads.d.ts.map +1 -0
  116. package/dist/src/connectors/slack/threads.js +41 -0
  117. package/dist/src/connectors/slack/threads.js.map +1 -0
  118. package/dist/src/connectors/slack/threads.test.d.ts +2 -0
  119. package/dist/src/connectors/slack/threads.test.d.ts.map +1 -0
  120. package/dist/src/connectors/slack/threads.test.js +79 -0
  121. package/dist/src/connectors/slack/threads.test.js.map +1 -0
  122. package/dist/src/connectors/slack/triage-prompt.d.ts +50 -0
  123. package/dist/src/connectors/slack/triage-prompt.d.ts.map +1 -0
  124. package/dist/src/connectors/slack/triage-prompt.js +127 -0
  125. package/dist/src/connectors/slack/triage-prompt.js.map +1 -0
  126. package/dist/src/connectors/slack/triage.d.ts +41 -0
  127. package/dist/src/connectors/slack/triage.d.ts.map +1 -0
  128. package/dist/src/connectors/slack/triage.js +120 -0
  129. package/dist/src/connectors/slack/triage.js.map +1 -0
  130. package/dist/src/connectors/telegram/__tests__/connector.test.d.ts +2 -0
  131. package/dist/src/connectors/telegram/__tests__/connector.test.d.ts.map +1 -0
  132. package/dist/src/connectors/telegram/__tests__/connector.test.js +257 -0
  133. package/dist/src/connectors/telegram/__tests__/connector.test.js.map +1 -0
  134. package/dist/src/connectors/telegram/__tests__/format.test.d.ts +2 -0
  135. package/dist/src/connectors/telegram/__tests__/format.test.d.ts.map +1 -0
  136. package/dist/src/connectors/telegram/__tests__/format.test.js +79 -0
  137. package/dist/src/connectors/telegram/__tests__/format.test.js.map +1 -0
  138. package/dist/src/connectors/telegram/__tests__/threads.test.d.ts +2 -0
  139. package/dist/src/connectors/telegram/__tests__/threads.test.d.ts.map +1 -0
  140. package/dist/src/connectors/telegram/__tests__/threads.test.js +51 -0
  141. package/dist/src/connectors/telegram/__tests__/threads.test.js.map +1 -0
  142. package/dist/src/connectors/telegram/format.d.ts +12 -0
  143. package/dist/src/connectors/telegram/format.d.ts.map +1 -0
  144. package/dist/src/connectors/telegram/format.js +61 -0
  145. package/dist/src/connectors/telegram/format.js.map +1 -0
  146. package/dist/src/connectors/telegram/index.d.ts +28 -0
  147. package/dist/src/connectors/telegram/index.d.ts.map +1 -0
  148. package/dist/src/connectors/telegram/index.js +213 -0
  149. package/dist/src/connectors/telegram/index.js.map +1 -0
  150. package/dist/src/connectors/telegram/threads.d.ts +29 -0
  151. package/dist/src/connectors/telegram/threads.d.ts.map +1 -0
  152. package/dist/src/connectors/telegram/threads.js +26 -0
  153. package/dist/src/connectors/telegram/threads.js.map +1 -0
  154. package/dist/src/connectors/whatsapp/__tests__/format.test.d.ts +2 -0
  155. package/dist/src/connectors/whatsapp/__tests__/format.test.d.ts.map +1 -0
  156. package/dist/src/connectors/whatsapp/__tests__/format.test.js +70 -0
  157. package/dist/src/connectors/whatsapp/__tests__/format.test.js.map +1 -0
  158. package/dist/src/connectors/whatsapp/format.d.ts +12 -0
  159. package/dist/src/connectors/whatsapp/format.d.ts.map +1 -0
  160. package/dist/src/connectors/whatsapp/format.js +53 -0
  161. package/dist/src/connectors/whatsapp/format.js.map +1 -0
  162. package/dist/src/connectors/whatsapp/index.d.ts +42 -0
  163. package/dist/src/connectors/whatsapp/index.d.ts.map +1 -0
  164. package/dist/src/connectors/whatsapp/index.js +279 -0
  165. package/dist/src/connectors/whatsapp/index.js.map +1 -0
  166. package/dist/src/cron/jobs.d.ts +5 -0
  167. package/dist/src/cron/jobs.d.ts.map +1 -0
  168. package/dist/src/cron/jobs.js +23 -0
  169. package/dist/src/cron/jobs.js.map +1 -0
  170. package/dist/src/cron/runner.d.ts +4 -0
  171. package/dist/src/cron/runner.d.ts.map +1 -0
  172. package/dist/src/cron/runner.js +88 -0
  173. package/dist/src/cron/runner.js.map +1 -0
  174. package/dist/src/cron/scheduler.d.ts +8 -0
  175. package/dist/src/cron/scheduler.d.ts.map +1 -0
  176. package/dist/src/cron/scheduler.js +64 -0
  177. package/dist/src/cron/scheduler.js.map +1 -0
  178. package/dist/src/engines/__tests__/gemini.test.d.ts +2 -0
  179. package/dist/src/engines/__tests__/gemini.test.d.ts.map +1 -0
  180. package/dist/src/engines/__tests__/gemini.test.js +404 -0
  181. package/dist/src/engines/__tests__/gemini.test.js.map +1 -0
  182. package/dist/src/engines/claude.d.ts +20 -0
  183. package/dist/src/engines/claude.d.ts.map +1 -0
  184. package/dist/src/engines/claude.js +520 -0
  185. package/dist/src/engines/claude.js.map +1 -0
  186. package/dist/src/engines/codex.d.ts +15 -0
  187. package/dist/src/engines/codex.d.ts.map +1 -0
  188. package/dist/src/engines/codex.js +351 -0
  189. package/dist/src/engines/codex.js.map +1 -0
  190. package/dist/src/engines/gemini.d.ts +32 -0
  191. package/dist/src/engines/gemini.d.ts.map +1 -0
  192. package/dist/src/engines/gemini.js +328 -0
  193. package/dist/src/engines/gemini.js.map +1 -0
  194. package/dist/src/engines/mock.d.ts +16 -0
  195. package/dist/src/engines/mock.d.ts.map +1 -0
  196. package/dist/src/engines/mock.js +47 -0
  197. package/dist/src/engines/mock.js.map +1 -0
  198. package/dist/src/gateway/__tests__/api-last-n.test.d.ts +2 -0
  199. package/dist/src/gateway/__tests__/api-last-n.test.d.ts.map +1 -0
  200. package/dist/src/gateway/__tests__/api-last-n.test.js +32 -0
  201. package/dist/src/gateway/__tests__/api-last-n.test.js.map +1 -0
  202. package/dist/src/gateway/__tests__/costs.test.d.ts +2 -0
  203. package/dist/src/gateway/__tests__/costs.test.d.ts.map +1 -0
  204. package/dist/src/gateway/__tests__/costs.test.js +32 -0
  205. package/dist/src/gateway/__tests__/costs.test.js.map +1 -0
  206. package/dist/src/gateway/__tests__/org-hierarchy.test.d.ts +2 -0
  207. package/dist/src/gateway/__tests__/org-hierarchy.test.d.ts.map +1 -0
  208. package/dist/src/gateway/__tests__/org-hierarchy.test.js +161 -0
  209. package/dist/src/gateway/__tests__/org-hierarchy.test.js.map +1 -0
  210. package/dist/src/gateway/__tests__/org-update.test.d.ts +2 -0
  211. package/dist/src/gateway/__tests__/org-update.test.d.ts.map +1 -0
  212. package/dist/src/gateway/__tests__/org-update.test.js +99 -0
  213. package/dist/src/gateway/__tests__/org-update.test.js.map +1 -0
  214. package/dist/src/gateway/__tests__/org.test.d.ts +2 -0
  215. package/dist/src/gateway/__tests__/org.test.d.ts.map +1 -0
  216. package/dist/src/gateway/__tests__/org.test.js +77 -0
  217. package/dist/src/gateway/__tests__/org.test.js.map +1 -0
  218. package/dist/src/gateway/__tests__/services.test.d.ts +2 -0
  219. package/dist/src/gateway/__tests__/services.test.d.ts.map +1 -0
  220. package/dist/src/gateway/__tests__/services.test.js +153 -0
  221. package/dist/src/gateway/__tests__/services.test.js.map +1 -0
  222. package/dist/src/gateway/api.d.ts +19 -0
  223. package/dist/src/gateway/api.d.ts.map +1 -0
  224. package/dist/src/gateway/api.js +2261 -0
  225. package/dist/src/gateway/api.js.map +1 -0
  226. package/dist/src/gateway/budgets.d.ts +16 -0
  227. package/dist/src/gateway/budgets.d.ts.map +1 -0
  228. package/dist/src/gateway/budgets.js +39 -0
  229. package/dist/src/gateway/budgets.js.map +1 -0
  230. package/dist/src/gateway/costs.d.ts +19 -0
  231. package/dist/src/gateway/costs.d.ts.map +1 -0
  232. package/dist/src/gateway/costs.js +39 -0
  233. package/dist/src/gateway/costs.js.map +1 -0
  234. package/dist/src/gateway/daemon-entry.d.ts +2 -0
  235. package/dist/src/gateway/daemon-entry.d.ts.map +1 -0
  236. package/dist/src/gateway/daemon-entry.js +12 -0
  237. package/dist/src/gateway/daemon-entry.js.map +1 -0
  238. package/dist/src/gateway/files.d.ts +6 -0
  239. package/dist/src/gateway/files.d.ts.map +1 -0
  240. package/dist/src/gateway/files.js +442 -0
  241. package/dist/src/gateway/files.js.map +1 -0
  242. package/dist/src/gateway/goals.d.ts +11 -0
  243. package/dist/src/gateway/goals.d.ts.map +1 -0
  244. package/dist/src/gateway/goals.js +72 -0
  245. package/dist/src/gateway/goals.js.map +1 -0
  246. package/dist/src/gateway/lifecycle.d.ts +10 -0
  247. package/dist/src/gateway/lifecycle.d.ts.map +1 -0
  248. package/dist/src/gateway/lifecycle.js +152 -0
  249. package/dist/src/gateway/lifecycle.js.map +1 -0
  250. package/dist/src/gateway/org-hierarchy.d.ts +5 -0
  251. package/dist/src/gateway/org-hierarchy.d.ts.map +1 -0
  252. package/dist/src/gateway/org-hierarchy.js +174 -0
  253. package/dist/src/gateway/org-hierarchy.js.map +1 -0
  254. package/dist/src/gateway/org.d.ts +17 -0
  255. package/dist/src/gateway/org.d.ts.map +1 -0
  256. package/dist/src/gateway/org.js +136 -0
  257. package/dist/src/gateway/org.js.map +1 -0
  258. package/dist/src/gateway/server.d.ts +4 -0
  259. package/dist/src/gateway/server.d.ts.map +1 -0
  260. package/dist/src/gateway/server.js +764 -0
  261. package/dist/src/gateway/server.js.map +1 -0
  262. package/dist/src/gateway/services.d.ts +28 -0
  263. package/dist/src/gateway/services.d.ts.map +1 -0
  264. package/dist/src/gateway/services.js +112 -0
  265. package/dist/src/gateway/services.js.map +1 -0
  266. package/dist/src/gateway/watcher.d.ts +14 -0
  267. package/dist/src/gateway/watcher.d.ts.map +1 -0
  268. package/dist/src/gateway/watcher.js +111 -0
  269. package/dist/src/gateway/watcher.js.map +1 -0
  270. package/dist/src/index.d.ts +5 -0
  271. package/dist/src/index.d.ts.map +1 -0
  272. package/dist/src/index.js +4 -0
  273. package/dist/src/index.js.map +1 -0
  274. package/dist/src/mcp/gateway-server.d.ts +13 -0
  275. package/dist/src/mcp/gateway-server.d.ts.map +1 -0
  276. package/dist/src/mcp/gateway-server.js +376 -0
  277. package/dist/src/mcp/gateway-server.js.map +1 -0
  278. package/dist/src/mcp/resolver.d.ts +19 -0
  279. package/dist/src/mcp/resolver.d.ts.map +1 -0
  280. package/dist/src/mcp/resolver.js +159 -0
  281. package/dist/src/mcp/resolver.js.map +1 -0
  282. package/dist/src/sessions/__tests__/callbacks.test.d.ts +2 -0
  283. package/dist/src/sessions/__tests__/callbacks.test.d.ts.map +1 -0
  284. package/dist/src/sessions/__tests__/callbacks.test.js +154 -0
  285. package/dist/src/sessions/__tests__/callbacks.test.js.map +1 -0
  286. package/dist/src/sessions/callbacks.d.ts +31 -0
  287. package/dist/src/sessions/callbacks.d.ts.map +1 -0
  288. package/dist/src/sessions/callbacks.js +112 -0
  289. package/dist/src/sessions/callbacks.js.map +1 -0
  290. package/dist/src/sessions/context.d.ts +36 -0
  291. package/dist/src/sessions/context.d.ts.map +1 -0
  292. package/dist/src/sessions/context.js +741 -0
  293. package/dist/src/sessions/context.js.map +1 -0
  294. package/dist/src/sessions/fork.d.ts +30 -0
  295. package/dist/src/sessions/fork.d.ts.map +1 -0
  296. package/dist/src/sessions/fork.js +178 -0
  297. package/dist/src/sessions/fork.js.map +1 -0
  298. package/dist/src/sessions/manager.d.ts +27 -0
  299. package/dist/src/sessions/manager.d.ts.map +1 -0
  300. package/dist/src/sessions/manager.js +751 -0
  301. package/dist/src/sessions/manager.js.map +1 -0
  302. package/dist/src/sessions/queue.d.ts +36 -0
  303. package/dist/src/sessions/queue.d.ts.map +1 -0
  304. package/dist/src/sessions/queue.js +101 -0
  305. package/dist/src/sessions/queue.js.map +1 -0
  306. package/dist/src/sessions/queue.test.d.ts +2 -0
  307. package/dist/src/sessions/queue.test.d.ts.map +1 -0
  308. package/dist/src/sessions/queue.test.js +28 -0
  309. package/dist/src/sessions/queue.test.js.map +1 -0
  310. package/dist/src/sessions/registry.d.ts +116 -0
  311. package/dist/src/sessions/registry.d.ts.map +1 -0
  312. package/dist/src/sessions/registry.js +480 -0
  313. package/dist/src/sessions/registry.js.map +1 -0
  314. package/dist/src/sessions/registry.test.d.ts +2 -0
  315. package/dist/src/sessions/registry.test.d.ts.map +1 -0
  316. package/dist/src/sessions/registry.test.js +41 -0
  317. package/dist/src/sessions/registry.test.js.map +1 -0
  318. package/dist/src/shared/__tests__/rateLimit.test.d.ts +2 -0
  319. package/dist/src/shared/__tests__/rateLimit.test.d.ts.map +1 -0
  320. package/dist/src/shared/__tests__/rateLimit.test.js +108 -0
  321. package/dist/src/shared/__tests__/rateLimit.test.js.map +1 -0
  322. package/dist/src/shared/__tests__/usageAwareness.test.d.ts +2 -0
  323. package/dist/src/shared/__tests__/usageAwareness.test.d.ts.map +1 -0
  324. package/dist/src/shared/__tests__/usageAwareness.test.js +58 -0
  325. package/dist/src/shared/__tests__/usageAwareness.test.js.map +1 -0
  326. package/dist/src/shared/config.d.ts +3 -0
  327. package/dist/src/shared/config.d.ts.map +1 -0
  328. package/dist/src/shared/config.js +11 -0
  329. package/dist/src/shared/config.js.map +1 -0
  330. package/dist/src/shared/effort.d.ts +17 -0
  331. package/dist/src/shared/effort.d.ts.map +1 -0
  332. package/dist/src/shared/effort.js +44 -0
  333. package/dist/src/shared/effort.js.map +1 -0
  334. package/dist/src/shared/logger.d.ts +12 -0
  335. package/dist/src/shared/logger.d.ts.map +1 -0
  336. package/dist/src/shared/logger.js +35 -0
  337. package/dist/src/shared/logger.js.map +1 -0
  338. package/dist/src/shared/paths.d.ts +31 -0
  339. package/dist/src/shared/paths.d.ts.map +1 -0
  340. package/dist/src/shared/paths.js +92 -0
  341. package/dist/src/shared/paths.js.map +1 -0
  342. package/dist/src/shared/rateLimit.d.ts +20 -0
  343. package/dist/src/shared/rateLimit.d.ts.map +1 -0
  344. package/dist/src/shared/rateLimit.js +61 -0
  345. package/dist/src/shared/rateLimit.js.map +1 -0
  346. package/dist/src/shared/types.d.ts +448 -0
  347. package/dist/src/shared/types.d.ts.map +1 -0
  348. package/dist/src/shared/types.js +4 -0
  349. package/dist/src/shared/types.js.map +1 -0
  350. package/dist/src/shared/usageAwareness.d.ts +10 -0
  351. package/dist/src/shared/usageAwareness.d.ts.map +1 -0
  352. package/dist/src/shared/usageAwareness.js +69 -0
  353. package/dist/src/shared/usageAwareness.js.map +1 -0
  354. package/dist/src/shared/version.d.ts +15 -0
  355. package/dist/src/shared/version.d.ts.map +1 -0
  356. package/dist/src/shared/version.js +56 -0
  357. package/dist/src/shared/version.js.map +1 -0
  358. package/dist/src/stt/stt.d.ts +24 -0
  359. package/dist/src/stt/stt.d.ts.map +1 -0
  360. package/dist/src/stt/stt.js +203 -0
  361. package/dist/src/stt/stt.js.map +1 -0
  362. package/dist/web/404.html +1 -0
  363. package/dist/web/__next.__PAGE__.txt +9 -0
  364. package/dist/web/__next._full.txt +19 -0
  365. package/dist/web/__next._head.txt +6 -0
  366. package/dist/web/__next._index.txt +6 -0
  367. package/dist/web/__next._tree.txt +2 -0
  368. package/dist/web/_next/static/chunks/00yn.jp4tr9l6.js +62 -0
  369. package/dist/web/_next/static/chunks/0398g9fy2i2l..js +5 -0
  370. package/dist/web/_next/static/chunks/03~yq9q893hmn.js +1 -0
  371. package/dist/web/_next/static/chunks/07t-qdutaizlf.js +5 -0
  372. package/dist/web/_next/static/chunks/0_pxvi.u4tzw1.js +5 -0
  373. package/dist/web/_next/static/chunks/0dtbl8648b3u9.js +7 -0
  374. package/dist/web/_next/static/chunks/0e3pdjkorr5zl.js +2 -0
  375. package/dist/web/_next/static/chunks/0ewpxy-mzj3j3.js +1 -0
  376. package/dist/web/_next/static/chunks/0ihbb7~gq42g~.js +5 -0
  377. package/dist/web/_next/static/chunks/0j4uz-g9x1_~s.js +1 -0
  378. package/dist/web/_next/static/chunks/0mlo32yrc7ziu.css +1 -0
  379. package/dist/web/_next/static/chunks/0ru56x83x4rkk.js +1 -0
  380. package/dist/web/_next/static/chunks/0svvev77pb2gu.js +1 -0
  381. package/dist/web/_next/static/chunks/0tf9kpygstdls.js +1 -0
  382. package/dist/web/_next/static/chunks/0wzpea61sn2-k.js +5 -0
  383. package/dist/web/_next/static/chunks/0y3dnnq~kxyz_.js +1 -0
  384. package/dist/web/_next/static/chunks/0y~qqhmf2o7pt.js +1 -0
  385. package/dist/web/_next/static/chunks/0~6m1p5hnsx2f.js +1 -0
  386. package/dist/web/_next/static/chunks/10-liamt-ipcu.js +1 -0
  387. package/dist/web/_next/static/chunks/10l08hq.acixl.js +5 -0
  388. package/dist/web/_next/static/chunks/11rbefjn.e-3-.js +1 -0
  389. package/dist/web/_next/static/chunks/11rodb4s1x4of.js +1 -0
  390. package/dist/web/_next/static/chunks/12_uxtnrqhoo1.js +1 -0
  391. package/dist/web/_next/static/chunks/12h4dws.tz7yb.js +5 -0
  392. package/dist/web/_next/static/chunks/13juizw904g.e.js +1 -0
  393. package/dist/web/_next/static/chunks/14ge_q22f0n.f.js +1 -0
  394. package/dist/web/_next/static/chunks/16b0jvgccyt2i.js +5 -0
  395. package/dist/web/_next/static/chunks/17-u9c_weg12-.js +31 -0
  396. package/dist/web/_next/static/chunks/turbopack-0dt987bw_1nyf.js +1 -0
  397. package/dist/web/_next/static/media/apple-icon.0.wpl4.d-5bkf.jpg +0 -0
  398. package/dist/web/_next/static/media/icon.0.wpl4.d-5bkf.jpg +0 -0
  399. package/dist/web/_next/static/uwjABwQIFELOHhVlstvOe/_buildManifest.js +11 -0
  400. package/dist/web/_next/static/uwjABwQIFELOHhVlstvOe/_clientMiddlewareManifest.js +1 -0
  401. package/dist/web/_next/static/uwjABwQIFELOHhVlstvOe/_ssgManifest.js +1 -0
  402. package/dist/web/_not-found/__next._full.txt +17 -0
  403. package/dist/web/_not-found/__next._head.txt +6 -0
  404. package/dist/web/_not-found/__next._index.txt +6 -0
  405. package/dist/web/_not-found/__next._not-found.__PAGE__.txt +5 -0
  406. package/dist/web/_not-found/__next._not-found.txt +5 -0
  407. package/dist/web/_not-found/__next._tree.txt +2 -0
  408. package/dist/web/_not-found.html +1 -0
  409. package/dist/web/_not-found.txt +17 -0
  410. package/dist/web/apple-icon.jpg +0 -0
  411. package/dist/web/chat/__next._full.txt +21 -0
  412. package/dist/web/chat/__next._head.txt +6 -0
  413. package/dist/web/chat/__next._index.txt +6 -0
  414. package/dist/web/chat/__next._tree.txt +2 -0
  415. package/dist/web/chat/__next.chat.__PAGE__.txt +9 -0
  416. package/dist/web/chat/__next.chat.txt +5 -0
  417. package/dist/web/chat.html +1 -0
  418. package/dist/web/chat.txt +21 -0
  419. package/dist/web/cron/__next._full.txt +21 -0
  420. package/dist/web/cron/__next._head.txt +6 -0
  421. package/dist/web/cron/__next._index.txt +6 -0
  422. package/dist/web/cron/__next._tree.txt +2 -0
  423. package/dist/web/cron/__next.cron.__PAGE__.txt +9 -0
  424. package/dist/web/cron/__next.cron.txt +5 -0
  425. package/dist/web/cron.html +1 -0
  426. package/dist/web/cron.txt +21 -0
  427. package/dist/web/icon.jpg +0 -0
  428. package/dist/web/index.html +1 -0
  429. package/dist/web/index.txt +19 -0
  430. package/dist/web/kanban/__next._full.txt +21 -0
  431. package/dist/web/kanban/__next._head.txt +6 -0
  432. package/dist/web/kanban/__next._index.txt +6 -0
  433. package/dist/web/kanban/__next._tree.txt +2 -0
  434. package/dist/web/kanban/__next.kanban.__PAGE__.txt +9 -0
  435. package/dist/web/kanban/__next.kanban.txt +5 -0
  436. package/dist/web/kanban.html +1 -0
  437. package/dist/web/kanban.txt +21 -0
  438. package/dist/web/logs/__next._full.txt +21 -0
  439. package/dist/web/logs/__next._head.txt +6 -0
  440. package/dist/web/logs/__next._index.txt +6 -0
  441. package/dist/web/logs/__next._tree.txt +2 -0
  442. package/dist/web/logs/__next.logs.__PAGE__.txt +9 -0
  443. package/dist/web/logs/__next.logs.txt +5 -0
  444. package/dist/web/logs.html +7 -0
  445. package/dist/web/logs.txt +21 -0
  446. package/dist/web/org/__next._full.txt +21 -0
  447. package/dist/web/org/__next._head.txt +6 -0
  448. package/dist/web/org/__next._index.txt +6 -0
  449. package/dist/web/org/__next._tree.txt +2 -0
  450. package/dist/web/org/__next.org.__PAGE__.txt +9 -0
  451. package/dist/web/org/__next.org.txt +5 -0
  452. package/dist/web/org.html +1 -0
  453. package/dist/web/org.txt +21 -0
  454. package/dist/web/sessions/__next._full.txt +18 -0
  455. package/dist/web/sessions/__next._head.txt +6 -0
  456. package/dist/web/sessions/__next._index.txt +6 -0
  457. package/dist/web/sessions/__next._tree.txt +2 -0
  458. package/dist/web/sessions/__next.sessions.__PAGE__.txt +6 -0
  459. package/dist/web/sessions/__next.sessions.txt +5 -0
  460. package/dist/web/sessions.html +1 -0
  461. package/dist/web/sessions.txt +18 -0
  462. package/dist/web/settings/__next._full.txt +21 -0
  463. package/dist/web/settings/__next._head.txt +6 -0
  464. package/dist/web/settings/__next._index.txt +6 -0
  465. package/dist/web/settings/__next._tree.txt +2 -0
  466. package/dist/web/settings/__next.settings.__PAGE__.txt +9 -0
  467. package/dist/web/settings/__next.settings.txt +5 -0
  468. package/dist/web/settings.html +1 -0
  469. package/dist/web/settings.txt +21 -0
  470. package/dist/web/skills/__next._full.txt +21 -0
  471. package/dist/web/skills/__next._head.txt +6 -0
  472. package/dist/web/skills/__next._index.txt +6 -0
  473. package/dist/web/skills/__next._tree.txt +2 -0
  474. package/dist/web/skills/__next.skills.__PAGE__.txt +9 -0
  475. package/dist/web/skills/__next.skills.txt +5 -0
  476. package/dist/web/skills.html +1 -0
  477. package/dist/web/skills.txt +21 -0
  478. package/package.json +54 -0
  479. package/template/AGENTS.md +285 -0
  480. package/template/CLAUDE.md +285 -0
  481. package/template/config.default.yaml +71 -0
  482. package/template/docs/architecture.md +74 -0
  483. package/template/docs/connectors.md +72 -0
  484. package/template/docs/cron.md +137 -0
  485. package/template/docs/mcp.md +108 -0
  486. package/template/docs/org.md +105 -0
  487. package/template/docs/overview.md +39 -0
  488. package/template/docs/self-modification.md +65 -0
  489. package/template/docs/skills.md +58 -0
  490. package/template/knowledge/.gitkeep +0 -0
  491. package/template/migrations/.gitkeep +0 -0
  492. package/template/migrations/0.1.0/MIGRATION.md +25 -0
  493. package/template/migrations/0.2.0/MIGRATION.md +41 -0
  494. package/template/migrations/0.2.0/files/config.default.yaml +30 -0
  495. package/template/migrations/0.3.0/MIGRATION.md +57 -0
  496. package/template/migrations/0.3.0/files/config.default.yaml +62 -0
  497. package/template/migrations/0.3.0/files/docs/mcp.md +108 -0
  498. package/template/migrations/0.7.3/MIGRATION.md +63 -0
  499. package/template/migrations/0.7.3/files/AGENTS.md +188 -0
  500. package/template/migrations/0.7.3/files/CLAUDE.md +127 -0
  501. package/template/migrations/0.7.5/MIGRATION.md +78 -0
  502. package/template/migrations/0.8.0/MIGRATION.md +73 -0
  503. package/template/migrations/0.9.0/MIGRATION.md +82 -0
  504. package/template/skills/cron-manager/SKILL.md +127 -0
  505. package/template/skills/find-and-install/SKILL.md +92 -0
  506. package/template/skills/management/SKILL.md +226 -0
  507. package/template/skills/migrate/SKILL.md +154 -0
  508. package/template/skills/new/SKILL.md +19 -0
  509. package/template/skills/onboarding/SKILL.md +106 -0
  510. package/template/skills/self-heal/SKILL.md +114 -0
  511. package/template/skills/skill-creator/SKILL.md +112 -0
  512. package/template/skills/status/SKILL.md +19 -0
  513. package/template/skills/sync/SKILL.md +67 -0
  514. package/template/skills.json +3 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speaker.js","sourceRoot":"","sources":["../../../../src/connectors/slack/speaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAUoB,EACpB,UAAkB;IAElB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACxF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;IAEtC,OAAO;QACL,IAAI,EAAE,WAAW,IAAI,QAAQ,IAAI,MAAM,IAAI,IAAI,CAAC,EAAE,IAAI,UAAU;QAChE,QAAQ;QACR,WAAW;QACX,MAAM;QACN,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;QAC/B,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,SAAS;KACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ReplyContext } from "../../shared/types.js";
2
+ export interface SlackMessageEventLike {
3
+ channel: string;
4
+ user?: string;
5
+ ts?: string;
6
+ thread_ts?: string;
7
+ channel_type?: string;
8
+ }
9
+ export declare function deriveSessionKey(event: SlackMessageEventLike): string;
10
+ export declare function buildReplyContext(event: SlackMessageEventLike): ReplyContext;
11
+ export declare function isOldSlackMessage(ts: string | undefined, bootTimeMs: number): boolean;
12
+ //# sourceMappingURL=threads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/threads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAYrE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,CAsB5E;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAKrF"}
@@ -0,0 +1,41 @@
1
+ export function deriveSessionKey(event) {
2
+ if (event.channel_type === "im") {
3
+ return `slack:dm:${event.user || "unknown"}`;
4
+ }
5
+ // Thread reply — use thread_ts (which is the root message's ts)
6
+ if (event.thread_ts && event.thread_ts !== event.ts) {
7
+ return `slack:${event.channel}:${event.thread_ts}`;
8
+ }
9
+ // Root channel message — use ts so thread replies will match
10
+ return `slack:${event.channel}:${event.ts}`;
11
+ }
12
+ export function buildReplyContext(event) {
13
+ // For DMs, don't set thread (DMs don't support threading the same way)
14
+ if (event.channel_type === "im") {
15
+ return {
16
+ channel: event.channel,
17
+ thread: null,
18
+ messageTs: event.ts ?? null,
19
+ };
20
+ }
21
+ // For channel messages, always set thread so bot replies in a thread
22
+ // For root messages: thread = ts (starts a thread under the root)
23
+ // For thread replies: thread = thread_ts (continues existing thread)
24
+ const thread = event.thread_ts && event.thread_ts !== event.ts
25
+ ? event.thread_ts
26
+ : event.ts ?? null;
27
+ return {
28
+ channel: event.channel,
29
+ thread,
30
+ messageTs: event.ts ?? null,
31
+ };
32
+ }
33
+ export function isOldSlackMessage(ts, bootTimeMs) {
34
+ if (!ts)
35
+ return false;
36
+ const secs = Number(ts.split(".")[0]);
37
+ if (!Number.isFinite(secs))
38
+ return false;
39
+ return secs * 1000 < bootTimeMs;
40
+ }
41
+ //# sourceMappingURL=threads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.js","sourceRoot":"","sources":["../../../../src/connectors/slack/threads.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,YAAY,KAAK,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;IAC/C,CAAC;IAED,gEAAgE;IAChE,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;QACpD,OAAO,SAAS,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;IACrD,CAAC;IAED,6DAA6D;IAC7D,OAAO,SAAS,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAA4B;IAC5D,uEAAuE;IACvE,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,KAAK,CAAC,EAAE,IAAI,IAAI;SAC5B,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,kEAAkE;IAClE,qEAAqE;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE;QAC5D,CAAC,CAAC,KAAK,CAAC,SAAS;QACjB,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC;IAErB,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM;QACN,SAAS,EAAE,KAAK,CAAC,EAAE,IAAI,IAAI;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAsB,EAAE,UAAkB;IAC1E,IAAI,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IACtB,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,IAAI,GAAG,IAAI,GAAG,UAAU,CAAC;AAClC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=threads.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.test.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/threads.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { buildReplyContext, deriveSessionKey, isOldSlackMessage } from "./threads.js";
4
+ test("deriveSessionKey keeps DM sessions per user", () => {
5
+ const key = deriveSessionKey({
6
+ channel: "D123",
7
+ user: "U123",
8
+ channel_type: "im",
9
+ ts: "1700000000.000100",
10
+ });
11
+ assert.equal(key, "slack:dm:U123");
12
+ });
13
+ test("deriveSessionKey uses ts for channel root messages", () => {
14
+ const key = deriveSessionKey({
15
+ channel: "C123",
16
+ user: "U123",
17
+ ts: "1700000000.000100",
18
+ });
19
+ assert.equal(key, "slack:C123:1700000000.000100");
20
+ });
21
+ test("deriveSessionKey uses thread_ts for thread replies (matches root)", () => {
22
+ const key = deriveSessionKey({
23
+ channel: "C123",
24
+ user: "U123",
25
+ ts: "1700000100.000200",
26
+ thread_ts: "1700000000.000100",
27
+ });
28
+ assert.equal(key, "slack:C123:1700000000.000100");
29
+ });
30
+ test("deriveSessionKey treats same-ts thread_ts as root message", () => {
31
+ const key = deriveSessionKey({
32
+ channel: "C123",
33
+ user: "U123",
34
+ ts: "1700000000.000100",
35
+ thread_ts: "1700000000.000100",
36
+ });
37
+ assert.equal(key, "slack:C123:1700000000.000100");
38
+ });
39
+ test("buildReplyContext sets thread for channel root messages", () => {
40
+ const context = buildReplyContext({
41
+ channel: "C123",
42
+ ts: "1700000000.000100",
43
+ channel_type: "channel",
44
+ });
45
+ assert.deepEqual(context, {
46
+ channel: "C123",
47
+ thread: "1700000000.000100",
48
+ messageTs: "1700000000.000100",
49
+ });
50
+ });
51
+ test("buildReplyContext sets thread_ts for thread replies", () => {
52
+ const context = buildReplyContext({
53
+ channel: "C123",
54
+ ts: "1700000100.000200",
55
+ thread_ts: "1700000000.000100",
56
+ });
57
+ assert.deepEqual(context, {
58
+ channel: "C123",
59
+ thread: "1700000000.000100",
60
+ messageTs: "1700000100.000200",
61
+ });
62
+ });
63
+ test("buildReplyContext does NOT set thread for DMs", () => {
64
+ const context = buildReplyContext({
65
+ channel: "D123",
66
+ ts: "1700000000.000100",
67
+ channel_type: "im",
68
+ });
69
+ assert.deepEqual(context, {
70
+ channel: "D123",
71
+ thread: null,
72
+ messageTs: "1700000000.000100",
73
+ });
74
+ });
75
+ test("isOldSlackMessage compares against boot time", () => {
76
+ assert.equal(isOldSlackMessage("1700000000.000100", 1700000001000), true);
77
+ assert.equal(isOldSlackMessage("1700000002.000100", 1700000001000), false);
78
+ });
79
+ //# sourceMappingURL=threads.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.test.js","sourceRoot":"","sources":["../../../../src/connectors/slack/threads.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Pure prompt builder for Slack air-reading triage.
3
+ *
4
+ * The triage LLM is given the incoming message plus light context and
5
+ * must respond with a single JSON decision: silent / react / reply.
6
+ *
7
+ * Kept pure (no I/O) so it can be snapshot-tested without spawning
8
+ * a subprocess.
9
+ */
10
+ export interface TriagePromptInput {
11
+ /** Display name of the bot itself (e.g. "Ryoko", "Jinn") */
12
+ botName: string;
13
+ /** Short persona description — what this bot is good at */
14
+ persona?: string;
15
+ /** Name of the operator who owns this Jinn instance */
16
+ operatorName?: string;
17
+ /** Channel type: "im" (DM), "channel", "group", "mpim" etc. */
18
+ channelType: string;
19
+ /** Human-readable channel identifier (e.g. "#general" or "DM") */
20
+ channelDescription: string;
21
+ /** Display name of the speaker */
22
+ speakerName: string;
23
+ /** Whether the speaker is the operator of this Jinn */
24
+ speakerIsOperator: boolean;
25
+ /** Whether the bot was explicitly @-mentioned in the message */
26
+ wasMentioned: boolean;
27
+ /** Recent messages in the thread for context — oldest first */
28
+ recentThread: Array<{
29
+ speaker: string;
30
+ text: string;
31
+ }>;
32
+ /** The message being triaged */
33
+ messageText: string;
34
+ }
35
+ export interface TriageDecision {
36
+ action: "silent" | "react" | "reply";
37
+ emoji?: string;
38
+ reason?: string;
39
+ }
40
+ export declare function buildTriagePrompt(input: TriagePromptInput): string;
41
+ /**
42
+ * Parse the triage LLM output into a TriageDecision.
43
+ * Tolerates:
44
+ * - whitespace / leading/trailing prose
45
+ * - markdown code fences (```json ... ```)
46
+ * - emoji written with surrounding colons (":eyes:" → "eyes")
47
+ * Returns null if no valid decision can be extracted.
48
+ */
49
+ export declare function parseTriageDecision(raw: string): TriageDecision | null;
50
+ //# sourceMappingURL=triage-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage-prompt.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/triage-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,YAAY,EAAE,OAAO,CAAC;IACtB,+DAA+D;IAC/D,YAAY,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CA0FlE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAkCtE"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Pure prompt builder for Slack air-reading triage.
3
+ *
4
+ * The triage LLM is given the incoming message plus light context and
5
+ * must respond with a single JSON decision: silent / react / reply.
6
+ *
7
+ * Kept pure (no I/O) so it can be snapshot-tested without spawning
8
+ * a subprocess.
9
+ */
10
+ const MAX_MESSAGE_CHARS = 2000;
11
+ const MAX_THREAD_ITEM_CHARS = 300;
12
+ const MAX_THREAD_ITEMS = 10;
13
+ export function buildTriagePrompt(input) {
14
+ const { botName, persona, operatorName, channelType, channelDescription, speakerName, speakerIsOperator, wasMentioned, recentThread, messageText, } = input;
15
+ const personaBlock = persona?.trim()
16
+ ? persona.trim()
17
+ : `${botName} is a helpful AI assistant embedded in Slack.`;
18
+ const operatorBlock = operatorName?.trim()
19
+ ? `The operator (who runs this Jinn instance) is **${operatorName.trim()}**.`
20
+ : `No operator has been configured.`;
21
+ const speakerRole = speakerIsOperator
22
+ ? "the operator of this Jinn instance"
23
+ : "NOT the operator — a different person";
24
+ const threadItems = recentThread
25
+ .slice(-MAX_THREAD_ITEMS)
26
+ .map((m) => {
27
+ const text = (m.text ?? "").trim().slice(0, MAX_THREAD_ITEM_CHARS);
28
+ return `- [${m.speaker}] ${text}`;
29
+ })
30
+ .join("\n");
31
+ const threadBlock = threadItems.length > 0 ? threadItems : "(no prior messages in this thread)";
32
+ const truncatedMessage = messageText.length > MAX_MESSAGE_CHARS
33
+ ? messageText.slice(0, MAX_MESSAGE_CHARS) + "\n…(truncated)"
34
+ : messageText;
35
+ return `You are a TRIAGE classifier for ${botName}, an AI assistant on Slack.
36
+ You decide whether ${botName} should respond to a specific incoming message.
37
+
38
+ # Output format (STRICT)
39
+ Output EXACTLY ONE JSON object, nothing else. No markdown, no prose, no code fences.
40
+ Schema:
41
+ {"action": "silent" | "react" | "reply", "emoji": "<slack-emoji-name>", "reason": "<=30 chars"}
42
+
43
+ - "silent" — do absolutely nothing. No reply, no reaction. The bot stays invisible.
44
+ - "react" — add ONE emoji reaction and nothing else (no text reply). Choose a Slack emoji name without colons (e.g. "eyes", "thumbsup", "pray", "ok_hand", "dog", "white_check_mark").
45
+ - "reply" — ${botName} should write a real text response.
46
+
47
+ "emoji" is required only when action = "react". Omit or leave empty otherwise.
48
+
49
+ # About ${botName}
50
+ ${personaBlock}
51
+
52
+ # Operator
53
+ ${operatorBlock}
54
+
55
+ # Current context
56
+ - Channel: ${channelDescription} (type: ${channelType})
57
+ - Speaker: ${speakerName} — ${speakerRole}
58
+ - Was ${botName} explicitly @-mentioned in this message? ${wasMentioned ? "YES" : "no"}
59
+
60
+ # Recent thread (for context only — not the message to triage)
61
+ ${threadBlock}
62
+
63
+ # The message to triage
64
+ """
65
+ ${truncatedMessage}
66
+ """
67
+
68
+ # Decision rules (apply in order, stop at first match)
69
+ 1. If the message is a short acknowledgment, thanks, or affirmation directed at ${botName}'s prior reply
70
+ (e.g. "ありがとう", "thanks", "了解", "OK", "なるほど", "👍") → "react" with a fitting emoji.
71
+ 2. If the message is clearly addressed to ${botName} (called by name, imperative aimed at the bot,
72
+ continuation of a 1:1 exchange) → "reply".
73
+ 3. If the topic clearly matches ${botName}'s expertise AND ${botName} can contribute concrete,
74
+ wanted value (not just chitchat) → "reply".
75
+ 4. Otherwise → "silent".
76
+
77
+ # Principles (these override the rules when in tension)
78
+ - Err on the side of SILENCE. Annoying intrusion is far worse than missing a chance to reply.
79
+ - Never butt into casual chat between other people. If the conversation is not for you, stay silent.
80
+ - Do not reply just to be polite or to say "I see" / "interesting" — add value or stay out.
81
+ - If your confidence that ${botName} should speak is below ~60%, choose "silent".
82
+ - Prefer "react" over "reply" for pure acknowledgments. A single emoji is often enough.
83
+
84
+ # Output
85
+ Produce the JSON object now. Do not explain. Do not wrap in a code block. JSON only.`;
86
+ }
87
+ /**
88
+ * Parse the triage LLM output into a TriageDecision.
89
+ * Tolerates:
90
+ * - whitespace / leading/trailing prose
91
+ * - markdown code fences (```json ... ```)
92
+ * - emoji written with surrounding colons (":eyes:" → "eyes")
93
+ * Returns null if no valid decision can be extracted.
94
+ */
95
+ export function parseTriageDecision(raw) {
96
+ if (!raw)
97
+ return null;
98
+ // Strip markdown code fences if present
99
+ const fenced = raw.match(/```(?:json)?\s*([\s\S]*?)```/i);
100
+ const candidate = fenced ? fenced[1] : raw;
101
+ // Find the first {...} block
102
+ const jsonMatch = candidate.match(/\{[\s\S]*\}/);
103
+ if (!jsonMatch)
104
+ return null;
105
+ let parsed;
106
+ try {
107
+ parsed = JSON.parse(jsonMatch[0]);
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ if (!parsed || typeof parsed !== "object")
113
+ return null;
114
+ const obj = parsed;
115
+ const action = obj.action;
116
+ if (action !== "silent" && action !== "react" && action !== "reply")
117
+ return null;
118
+ const rawEmoji = typeof obj.emoji === "string" ? obj.emoji.trim() : "";
119
+ const emoji = rawEmoji.replace(/^:+|:+$/g, "") || undefined;
120
+ const reason = typeof obj.reason === "string" ? obj.reason.trim().slice(0, 120) : undefined;
121
+ // Action "react" requires an emoji; default to eyes if missing
122
+ if (action === "react" && !emoji) {
123
+ return { action, emoji: "eyes", reason };
124
+ }
125
+ return { action, emoji, reason };
126
+ }
127
+ //# sourceMappingURL=triage-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage-prompt.js","sourceRoot":"","sources":["../../../../src/connectors/slack/triage-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Air-reading triage runner for Slack.
3
+ *
4
+ * Invokes a cheap LLM (Haiku, via Claude Code CLI by default) to decide
5
+ * whether an incoming Slack message should be ignored, acknowledged
6
+ * with an emoji, or replied to with a full engine session.
7
+ *
8
+ * This sits BEFORE the main session manager and prevents the expensive
9
+ * engine from running on messages that don't actually want a reply.
10
+ */
11
+ import { spawn } from "node:child_process";
12
+ import { type TriageDecision, type TriagePromptInput } from "./triage-prompt.js";
13
+ export interface TriageRunnerOptions {
14
+ /** Binary to invoke — defaults to "claude" */
15
+ bin?: string;
16
+ /** Model to use for the triage call (e.g. "claude-haiku-4-5") */
17
+ model?: string;
18
+ /** Soft timeout before we fall back to the fail-open action */
19
+ timeoutMs?: number;
20
+ /** Override the spawner (for tests) */
21
+ spawnImpl?: typeof spawn;
22
+ /**
23
+ * Action to fall back to when triage itself fails (timeout / spawn error /
24
+ * unparseable output). Defaults to "reply" because in the most dangerous
25
+ * scenario — our bot_user_id didn't load and so @-mentions silently slip
26
+ * through to triage — missing a real question is worse than a stray reply.
27
+ *
28
+ * Callers that *know* the message is ambient (not a DM, not an @-mention,
29
+ * not addressed to us) should pass "silent" instead: in that path a
30
+ * fail-open reply is guaranteed to barge into someone else's conversation.
31
+ */
32
+ failOpenAction?: "reply" | "silent";
33
+ }
34
+ /**
35
+ * Run a triage decision. Never throws — on error returns a fail-open fallback
36
+ * decision ("reply") so a failing triage cannot silently drop a real message.
37
+ * Missing a reply is far worse than an unwanted reply; if triage can't decide,
38
+ * let the full engine through.
39
+ */
40
+ export declare function runTriage(input: TriagePromptInput, options?: TriageRunnerOptions): Promise<TriageDecision>;
41
+ //# sourceMappingURL=triage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/triage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;;;;;;;OASG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CACrC;AAMD;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,cAAc,CAAC,CAyBzB"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Air-reading triage runner for Slack.
3
+ *
4
+ * Invokes a cheap LLM (Haiku, via Claude Code CLI by default) to decide
5
+ * whether an incoming Slack message should be ignored, acknowledged
6
+ * with an emoji, or replied to with a full engine session.
7
+ *
8
+ * This sits BEFORE the main session manager and prevents the expensive
9
+ * engine from running on messages that don't actually want a reply.
10
+ */
11
+ import { spawn } from "node:child_process";
12
+ import { logger } from "../../shared/logger.js";
13
+ import { buildTriagePrompt, parseTriageDecision, } from "./triage-prompt.js";
14
+ const DEFAULT_TIMEOUT_MS = 8000;
15
+ const DEFAULT_MODEL = "claude-haiku-4-5";
16
+ const DEFAULT_BIN = "claude";
17
+ /**
18
+ * Run a triage decision. Never throws — on error returns a fail-open fallback
19
+ * decision ("reply") so a failing triage cannot silently drop a real message.
20
+ * Missing a reply is far worse than an unwanted reply; if triage can't decide,
21
+ * let the full engine through.
22
+ */
23
+ export async function runTriage(input, options = {}) {
24
+ const prompt = buildTriagePrompt(input);
25
+ const bin = options.bin || DEFAULT_BIN;
26
+ const model = options.model || DEFAULT_MODEL;
27
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
28
+ const spawnFn = options.spawnImpl || spawn;
29
+ const failOpenAction = options.failOpenAction ?? "reply";
30
+ try {
31
+ const output = await invokeClaudeOneShot(prompt, {
32
+ bin,
33
+ model,
34
+ timeoutMs,
35
+ spawnFn,
36
+ });
37
+ const decision = parseTriageDecision(output);
38
+ if (!decision) {
39
+ logger.warn(`[triage] unparseable output, defaulting to ${failOpenAction.toUpperCase()} (fail-open): ${output.slice(0, 200)}`);
40
+ return { action: failOpenAction, reason: "parse_failed" };
41
+ }
42
+ return decision;
43
+ }
44
+ catch (err) {
45
+ logger.warn(`[triage] execution failed, defaulting to ${failOpenAction.toUpperCase()} (fail-open): ${err}`);
46
+ return { action: failOpenAction, reason: "triage_error" };
47
+ }
48
+ }
49
+ async function invokeClaudeOneShot(prompt, opts) {
50
+ return new Promise((resolve, reject) => {
51
+ const args = [
52
+ "-p",
53
+ "--output-format",
54
+ "json",
55
+ "--model",
56
+ opts.model,
57
+ "--dangerously-skip-permissions",
58
+ prompt,
59
+ ];
60
+ const proc = opts.spawnFn(opts.bin, args, {
61
+ stdio: ["ignore", "pipe", "pipe"],
62
+ });
63
+ let stdout = "";
64
+ let stderr = "";
65
+ let settled = false;
66
+ const timer = setTimeout(() => {
67
+ if (settled)
68
+ return;
69
+ settled = true;
70
+ try {
71
+ proc.kill("SIGTERM");
72
+ }
73
+ catch { /* ignore */ }
74
+ reject(new Error(`triage timed out after ${opts.timeoutMs}ms`));
75
+ }, opts.timeoutMs);
76
+ proc.stdout?.on("data", (chunk) => {
77
+ stdout += chunk.toString("utf8");
78
+ });
79
+ proc.stderr?.on("data", (chunk) => {
80
+ stderr += chunk.toString("utf8");
81
+ });
82
+ proc.on("error", (err) => {
83
+ if (settled)
84
+ return;
85
+ settled = true;
86
+ clearTimeout(timer);
87
+ reject(err);
88
+ });
89
+ proc.on("close", (code) => {
90
+ if (settled)
91
+ return;
92
+ settled = true;
93
+ clearTimeout(timer);
94
+ if (code !== 0) {
95
+ reject(new Error(`claude exited ${code}: ${stderr.slice(0, 500)}`));
96
+ return;
97
+ }
98
+ resolve(extractClaudeResult(stdout));
99
+ });
100
+ });
101
+ }
102
+ /**
103
+ * Claude Code's `--output-format json` wraps the model's response in an
104
+ * envelope like `{ "type": "result", "result": "...", ... }`. Strip that
105
+ * if present; otherwise return the raw stdout unchanged.
106
+ */
107
+ function extractClaudeResult(stdout) {
108
+ const trimmed = stdout.trim();
109
+ if (!trimmed)
110
+ return "";
111
+ try {
112
+ const parsed = JSON.parse(trimmed);
113
+ if (parsed && typeof parsed === "object" && typeof parsed.result === "string") {
114
+ return parsed.result;
115
+ }
116
+ }
117
+ catch { /* fall through */ }
118
+ return trimmed;
119
+ }
120
+ //# sourceMappingURL=triage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage.js","sourceRoot":"","sources":["../../../../src/connectors/slack/triage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=connector.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.test.d.ts","sourceRoot":"","sources":["../../../../../src/connectors/telegram/__tests__/connector.test.ts"],"names":[],"mappings":""}