openryoko 2026.10.8 → 2026.10.13

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 (691) hide show
  1. package/dist/bin/jimmy.js +51 -1
  2. package/dist/bin/jimmy.js.map +1 -1
  3. package/dist/package.json +2 -1
  4. package/dist/src/backup/archive.d.ts +65 -0
  5. package/dist/src/backup/archive.d.ts.map +1 -0
  6. package/dist/src/backup/archive.js +214 -0
  7. package/dist/src/backup/archive.js.map +1 -0
  8. package/dist/src/backup/catalog.d.ts +64 -0
  9. package/dist/src/backup/catalog.d.ts.map +1 -0
  10. package/dist/src/backup/catalog.js +252 -0
  11. package/dist/src/backup/catalog.js.map +1 -0
  12. package/dist/src/backup/database-restore.d.ts +63 -0
  13. package/dist/src/backup/database-restore.d.ts.map +1 -0
  14. package/dist/src/backup/database-restore.js +236 -0
  15. package/dist/src/backup/database-restore.js.map +1 -0
  16. package/dist/src/backup/database-source.d.ts +70 -0
  17. package/dist/src/backup/database-source.d.ts.map +1 -0
  18. package/dist/src/backup/database-source.js +70 -0
  19. package/dist/src/backup/database-source.js.map +1 -0
  20. package/dist/src/backup/format.d.ts +4 -0
  21. package/dist/src/backup/format.d.ts.map +1 -0
  22. package/dist/src/backup/format.js +15 -0
  23. package/dist/src/backup/format.js.map +1 -0
  24. package/dist/src/backup/gateway-liveness.d.ts +44 -0
  25. package/dist/src/backup/gateway-liveness.d.ts.map +1 -0
  26. package/dist/src/backup/gateway-liveness.js +120 -0
  27. package/dist/src/backup/gateway-liveness.js.map +1 -0
  28. package/dist/src/backup/inspect.d.ts +45 -0
  29. package/dist/src/backup/inspect.d.ts.map +1 -0
  30. package/dist/src/backup/inspect.js +291 -0
  31. package/dist/src/backup/inspect.js.map +1 -0
  32. package/dist/src/backup/layout.d.ts +11 -0
  33. package/dist/src/backup/layout.d.ts.map +1 -0
  34. package/dist/src/backup/layout.js +16 -0
  35. package/dist/src/backup/layout.js.map +1 -0
  36. package/dist/src/backup/limits.d.ts +54 -0
  37. package/dist/src/backup/limits.d.ts.map +1 -0
  38. package/dist/src/backup/limits.js +59 -0
  39. package/dist/src/backup/limits.js.map +1 -0
  40. package/dist/src/backup/manifest.d.ts +45 -0
  41. package/dist/src/backup/manifest.d.ts.map +1 -0
  42. package/dist/src/backup/manifest.js +77 -0
  43. package/dist/src/backup/manifest.js.map +1 -0
  44. package/dist/src/backup/restore.d.ts +73 -0
  45. package/dist/src/backup/restore.d.ts.map +1 -0
  46. package/dist/src/backup/restore.js +685 -0
  47. package/dist/src/backup/restore.js.map +1 -0
  48. package/dist/src/backup/run.d.ts +76 -0
  49. package/dist/src/backup/run.d.ts.map +1 -0
  50. package/dist/src/backup/run.js +181 -0
  51. package/dist/src/backup/run.js.map +1 -0
  52. package/dist/src/backup/scheduler.d.ts +51 -0
  53. package/dist/src/backup/scheduler.d.ts.map +1 -0
  54. package/dist/src/backup/scheduler.js +198 -0
  55. package/dist/src/backup/scheduler.js.map +1 -0
  56. package/dist/src/backup/settings.d.ts +44 -0
  57. package/dist/src/backup/settings.d.ts.map +1 -0
  58. package/dist/src/backup/settings.js +91 -0
  59. package/dist/src/backup/settings.js.map +1 -0
  60. package/dist/src/backup/space.d.ts +22 -0
  61. package/dist/src/backup/space.d.ts.map +1 -0
  62. package/dist/src/backup/space.js +47 -0
  63. package/dist/src/backup/space.js.map +1 -0
  64. package/dist/src/backup/state.d.ts +46 -0
  65. package/dist/src/backup/state.d.ts.map +1 -0
  66. package/dist/src/backup/state.js +137 -0
  67. package/dist/src/backup/state.js.map +1 -0
  68. package/dist/src/backup/tar.d.ts +64 -0
  69. package/dist/src/backup/tar.d.ts.map +1 -0
  70. package/dist/src/backup/tar.js +274 -0
  71. package/dist/src/backup/tar.js.map +1 -0
  72. package/dist/src/backup/targets.d.ts +85 -0
  73. package/dist/src/backup/targets.d.ts.map +1 -0
  74. package/dist/src/backup/targets.js +104 -0
  75. package/dist/src/backup/targets.js.map +1 -0
  76. package/dist/src/backup/walk.d.ts +42 -0
  77. package/dist/src/backup/walk.d.ts.map +1 -0
  78. package/dist/src/backup/walk.js +324 -0
  79. package/dist/src/backup/walk.js.map +1 -0
  80. package/dist/src/cli/backup.d.ts +45 -0
  81. package/dist/src/cli/backup.d.ts.map +1 -0
  82. package/dist/src/cli/backup.js +344 -0
  83. package/dist/src/cli/backup.js.map +1 -0
  84. package/dist/src/cli/bundled-skills.d.ts +7 -1
  85. package/dist/src/cli/bundled-skills.d.ts.map +1 -1
  86. package/dist/src/cli/bundled-skills.js +12 -2
  87. package/dist/src/cli/bundled-skills.js.map +1 -1
  88. package/dist/src/cli/config-failure.d.ts +18 -0
  89. package/dist/src/cli/config-failure.d.ts.map +1 -0
  90. package/dist/src/cli/config-failure.js +39 -0
  91. package/dist/src/cli/config-failure.js.map +1 -0
  92. package/dist/src/cli/gateway-audit.d.ts +3 -0
  93. package/dist/src/cli/gateway-audit.d.ts.map +1 -1
  94. package/dist/src/cli/gateway-audit.js +61 -14
  95. package/dist/src/cli/gateway-audit.js.map +1 -1
  96. package/dist/src/cli/gateway-url-backup.d.ts +21 -0
  97. package/dist/src/cli/gateway-url-backup.d.ts.map +1 -0
  98. package/dist/src/cli/gateway-url-backup.js +87 -0
  99. package/dist/src/cli/gateway-url-backup.js.map +1 -0
  100. package/dist/src/cli/home-copy.d.ts +37 -0
  101. package/dist/src/cli/home-copy.d.ts.map +1 -0
  102. package/dist/src/cli/home-copy.js +155 -0
  103. package/dist/src/cli/home-copy.js.map +1 -0
  104. package/dist/src/cli/interactive-config.d.ts +5 -0
  105. package/dist/src/cli/interactive-config.d.ts.map +1 -1
  106. package/dist/src/cli/interactive-config.js +16 -7
  107. package/dist/src/cli/interactive-config.js.map +1 -1
  108. package/dist/src/cli/migrate.d.ts +20 -0
  109. package/dist/src/cli/migrate.d.ts.map +1 -1
  110. package/dist/src/cli/migrate.js +365 -68
  111. package/dist/src/cli/migrate.js.map +1 -1
  112. package/dist/src/cli/migration-declarations.d.ts +24 -0
  113. package/dist/src/cli/migration-declarations.d.ts.map +1 -0
  114. package/dist/src/cli/migration-declarations.js +54 -0
  115. package/dist/src/cli/migration-declarations.js.map +1 -0
  116. package/dist/src/cli/start.d.ts.map +1 -1
  117. package/dist/src/cli/start.js +40 -1
  118. package/dist/src/cli/start.js.map +1 -1
  119. package/dist/src/connectors/chunked-send.d.ts +27 -0
  120. package/dist/src/connectors/chunked-send.d.ts.map +1 -0
  121. package/dist/src/connectors/chunked-send.js +40 -0
  122. package/dist/src/connectors/chunked-send.js.map +1 -0
  123. package/dist/src/connectors/cron/index.d.ts +10 -0
  124. package/dist/src/connectors/cron/index.d.ts.map +1 -1
  125. package/dist/src/connectors/cron/index.js +26 -3
  126. package/dist/src/connectors/cron/index.js.map +1 -1
  127. package/dist/src/connectors/discord/attachments.d.ts +25 -0
  128. package/dist/src/connectors/discord/attachments.d.ts.map +1 -0
  129. package/dist/src/connectors/discord/attachments.js +33 -0
  130. package/dist/src/connectors/discord/attachments.js.map +1 -0
  131. package/dist/src/connectors/discord/format.d.ts +17 -1
  132. package/dist/src/connectors/discord/format.d.ts.map +1 -1
  133. package/dist/src/connectors/discord/format.js +36 -6
  134. package/dist/src/connectors/discord/format.js.map +1 -1
  135. package/dist/src/connectors/discord/index.d.ts +12 -0
  136. package/dist/src/connectors/discord/index.d.ts.map +1 -1
  137. package/dist/src/connectors/discord/index.js +47 -40
  138. package/dist/src/connectors/discord/index.js.map +1 -1
  139. package/dist/src/connectors/discord/remote.d.ts +45 -1
  140. package/dist/src/connectors/discord/remote.d.ts.map +1 -1
  141. package/dist/src/connectors/discord/remote.js +147 -22
  142. package/dist/src/connectors/discord/remote.js.map +1 -1
  143. package/dist/src/connectors/slack/attachments.d.ts +25 -0
  144. package/dist/src/connectors/slack/attachments.d.ts.map +1 -0
  145. package/dist/src/connectors/slack/attachments.js +32 -0
  146. package/dist/src/connectors/slack/attachments.js.map +1 -0
  147. package/dist/src/connectors/slack/auth-test-cache.d.ts +22 -0
  148. package/dist/src/connectors/slack/auth-test-cache.d.ts.map +1 -0
  149. package/dist/src/connectors/slack/auth-test-cache.js +34 -0
  150. package/dist/src/connectors/slack/auth-test-cache.js.map +1 -0
  151. package/dist/src/connectors/slack/format.d.ts +6 -1
  152. package/dist/src/connectors/slack/format.d.ts.map +1 -1
  153. package/dist/src/connectors/slack/format.js +65 -13
  154. package/dist/src/connectors/slack/format.js.map +1 -1
  155. package/dist/src/connectors/slack/index.d.ts +4 -0
  156. package/dist/src/connectors/slack/index.d.ts.map +1 -1
  157. package/dist/src/connectors/slack/index.js +64 -52
  158. package/dist/src/connectors/slack/index.js.map +1 -1
  159. package/dist/src/connectors/slack/provider-auth-blocks.d.ts +62 -0
  160. package/dist/src/connectors/slack/provider-auth-blocks.d.ts.map +1 -0
  161. package/dist/src/connectors/slack/provider-auth-blocks.js +204 -0
  162. package/dist/src/connectors/slack/provider-auth-blocks.js.map +1 -0
  163. package/dist/src/connectors/slack/provider-auth.d.ts +126 -0
  164. package/dist/src/connectors/slack/provider-auth.d.ts.map +1 -0
  165. package/dist/src/connectors/slack/provider-auth.js +357 -0
  166. package/dist/src/connectors/slack/provider-auth.js.map +1 -0
  167. package/dist/src/connectors/telegram/index.d.ts +5 -0
  168. package/dist/src/connectors/telegram/index.d.ts.map +1 -1
  169. package/dist/src/connectors/telegram/index.js +14 -22
  170. package/dist/src/connectors/telegram/index.js.map +1 -1
  171. package/dist/src/connectors/whatsapp/index.d.ts +3 -0
  172. package/dist/src/connectors/whatsapp/index.d.ts.map +1 -1
  173. package/dist/src/connectors/whatsapp/index.js +33 -14
  174. package/dist/src/connectors/whatsapp/index.js.map +1 -1
  175. package/dist/src/cron/alert-throttle.d.ts +28 -0
  176. package/dist/src/cron/alert-throttle.d.ts.map +1 -0
  177. package/dist/src/cron/alert-throttle.js +106 -0
  178. package/dist/src/cron/alert-throttle.js.map +1 -0
  179. package/dist/src/cron/jobs.d.ts +8 -0
  180. package/dist/src/cron/jobs.d.ts.map +1 -1
  181. package/dist/src/cron/jobs.js +27 -1
  182. package/dist/src/cron/jobs.js.map +1 -1
  183. package/dist/src/cron/run-outcome.d.ts +28 -0
  184. package/dist/src/cron/run-outcome.d.ts.map +1 -0
  185. package/dist/src/cron/run-outcome.js +66 -0
  186. package/dist/src/cron/run-outcome.js.map +1 -0
  187. package/dist/src/cron/runner.d.ts.map +1 -1
  188. package/dist/src/cron/runner.js +68 -5
  189. package/dist/src/cron/runner.js.map +1 -1
  190. package/dist/src/cron/scheduler.d.ts +8 -1
  191. package/dist/src/cron/scheduler.d.ts.map +1 -1
  192. package/dist/src/cron/scheduler.js +11 -4
  193. package/dist/src/cron/scheduler.js.map +1 -1
  194. package/dist/src/cron/waiting-fires.d.ts +18 -0
  195. package/dist/src/cron/waiting-fires.d.ts.map +1 -0
  196. package/dist/src/cron/waiting-fires.js +49 -0
  197. package/dist/src/cron/waiting-fires.js.map +1 -0
  198. package/dist/src/engines/claude-interactive.d.ts +19 -3
  199. package/dist/src/engines/claude-interactive.d.ts.map +1 -1
  200. package/dist/src/engines/claude-interactive.js +42 -17
  201. package/dist/src/engines/claude-interactive.js.map +1 -1
  202. package/dist/src/engines/claude.d.ts.map +1 -1
  203. package/dist/src/engines/claude.js +38 -5
  204. package/dist/src/engines/claude.js.map +1 -1
  205. package/dist/src/engines/codex.d.ts.map +1 -1
  206. package/dist/src/engines/codex.js +1 -0
  207. package/dist/src/engines/codex.js.map +1 -1
  208. package/dist/src/engines/gemini.d.ts.map +1 -1
  209. package/dist/src/engines/gemini.js +1 -0
  210. package/dist/src/engines/gemini.js.map +1 -1
  211. package/dist/src/gateway/api.d.ts.map +1 -1
  212. package/dist/src/gateway/api.js +184 -160
  213. package/dist/src/gateway/api.js.map +1 -1
  214. package/dist/src/gateway/config-redaction.d.ts +32 -0
  215. package/dist/src/gateway/config-redaction.d.ts.map +1 -0
  216. package/dist/src/gateway/config-redaction.js +139 -0
  217. package/dist/src/gateway/config-redaction.js.map +1 -0
  218. package/dist/src/gateway/config-revision.d.ts +46 -0
  219. package/dist/src/gateway/config-revision.d.ts.map +1 -0
  220. package/dist/src/gateway/config-revision.js +63 -0
  221. package/dist/src/gateway/config-revision.js.map +1 -0
  222. package/dist/src/gateway/connector-config.d.ts +21 -0
  223. package/dist/src/gateway/connector-config.d.ts.map +1 -0
  224. package/dist/src/gateway/connector-config.js +24 -0
  225. package/dist/src/gateway/connector-config.js.map +1 -0
  226. package/dist/src/gateway/daemon-entry.js +5 -0
  227. package/dist/src/gateway/daemon-entry.js.map +1 -1
  228. package/dist/src/gateway/engine-health-monitor.d.ts +67 -0
  229. package/dist/src/gateway/engine-health-monitor.d.ts.map +1 -0
  230. package/dist/src/gateway/engine-health-monitor.js +221 -0
  231. package/dist/src/gateway/engine-health-monitor.js.map +1 -0
  232. package/dist/src/gateway/files.d.ts +7 -1
  233. package/dist/src/gateway/files.d.ts.map +1 -1
  234. package/dist/src/gateway/files.js +110 -217
  235. package/dist/src/gateway/files.js.map +1 -1
  236. package/dist/src/gateway/onboarding-personalize.d.ts +2 -0
  237. package/dist/src/gateway/onboarding-personalize.d.ts.map +1 -1
  238. package/dist/src/gateway/onboarding-personalize.js +17 -1
  239. package/dist/src/gateway/onboarding-personalize.js.map +1 -1
  240. package/dist/src/gateway/portal-config.d.ts +17 -3
  241. package/dist/src/gateway/portal-config.d.ts.map +1 -1
  242. package/dist/src/gateway/portal-config.js +52 -3
  243. package/dist/src/gateway/portal-config.js.map +1 -1
  244. package/dist/src/gateway/request-origin.d.ts +9 -0
  245. package/dist/src/gateway/request-origin.d.ts.map +1 -1
  246. package/dist/src/gateway/request-origin.js +10 -0
  247. package/dist/src/gateway/request-origin.js.map +1 -1
  248. package/dist/src/gateway/server.d.ts.map +1 -1
  249. package/dist/src/gateway/server.js +82 -59
  250. package/dist/src/gateway/server.js.map +1 -1
  251. package/dist/src/gateway/slack-connect-rollback.d.ts +23 -0
  252. package/dist/src/gateway/slack-connect-rollback.d.ts.map +1 -0
  253. package/dist/src/gateway/slack-connect-rollback.js +53 -0
  254. package/dist/src/gateway/slack-connect-rollback.js.map +1 -0
  255. package/dist/src/gateway/status-reconciler.d.ts +25 -7
  256. package/dist/src/gateway/status-reconciler.d.ts.map +1 -1
  257. package/dist/src/gateway/status-reconciler.js +86 -43
  258. package/dist/src/gateway/status-reconciler.js.map +1 -1
  259. package/dist/src/gateway/watcher.d.ts.map +1 -1
  260. package/dist/src/gateway/watcher.js +44 -3
  261. package/dist/src/gateway/watcher.js.map +1 -1
  262. package/dist/src/mcp/gateway-server.js +21 -3
  263. package/dist/src/mcp/gateway-server.js.map +1 -1
  264. package/dist/src/mcp/resolver.d.ts.map +1 -1
  265. package/dist/src/mcp/resolver.js +51 -1
  266. package/dist/src/mcp/resolver.js.map +1 -1
  267. package/dist/src/models/service.d.ts.map +1 -1
  268. package/dist/src/models/service.js +14 -8
  269. package/dist/src/models/service.js.map +1 -1
  270. package/dist/src/provider-auth/discovery.d.ts +16 -0
  271. package/dist/src/provider-auth/discovery.d.ts.map +1 -0
  272. package/dist/src/provider-auth/discovery.js +66 -0
  273. package/dist/src/provider-auth/discovery.js.map +1 -0
  274. package/dist/src/provider-auth/failure-notices.d.ts +29 -0
  275. package/dist/src/provider-auth/failure-notices.d.ts.map +1 -0
  276. package/dist/src/provider-auth/failure-notices.js +48 -0
  277. package/dist/src/provider-auth/failure-notices.js.map +1 -0
  278. package/dist/src/provider-auth/failure-signal.d.ts +22 -0
  279. package/dist/src/provider-auth/failure-signal.d.ts.map +1 -0
  280. package/dist/src/provider-auth/failure-signal.js +79 -0
  281. package/dist/src/provider-auth/failure-signal.js.map +1 -0
  282. package/dist/src/provider-auth/index.d.ts +26 -0
  283. package/dist/src/provider-auth/index.d.ts.map +1 -0
  284. package/dist/src/provider-auth/index.js +51 -0
  285. package/dist/src/provider-auth/index.js.map +1 -0
  286. package/dist/src/provider-auth/input.d.ts +44 -0
  287. package/dist/src/provider-auth/input.d.ts.map +1 -0
  288. package/dist/src/provider-auth/input.js +86 -0
  289. package/dist/src/provider-auth/input.js.map +1 -0
  290. package/dist/src/provider-auth/providers.d.ts +26 -0
  291. package/dist/src/provider-auth/providers.d.ts.map +1 -0
  292. package/dist/src/provider-auth/providers.js +86 -0
  293. package/dist/src/provider-auth/providers.js.map +1 -0
  294. package/dist/src/provider-auth/runtime.d.ts +21 -0
  295. package/dist/src/provider-auth/runtime.d.ts.map +1 -0
  296. package/dist/src/provider-auth/runtime.js +104 -0
  297. package/dist/src/provider-auth/runtime.js.map +1 -0
  298. package/dist/src/provider-auth/service.d.ts +70 -0
  299. package/dist/src/provider-auth/service.d.ts.map +1 -0
  300. package/dist/src/provider-auth/service.js +349 -0
  301. package/dist/src/provider-auth/service.js.map +1 -0
  302. package/dist/src/provider-auth/terminal.d.ts +21 -0
  303. package/dist/src/provider-auth/terminal.d.ts.map +1 -0
  304. package/dist/src/provider-auth/terminal.js +46 -0
  305. package/dist/src/provider-auth/terminal.js.map +1 -0
  306. package/dist/src/provider-auth/types.d.ts +123 -0
  307. package/dist/src/provider-auth/types.d.ts.map +1 -0
  308. package/dist/src/provider-auth/types.js +10 -0
  309. package/dist/src/provider-auth/types.js.map +1 -0
  310. package/dist/src/sessions/accounting.d.ts +3 -0
  311. package/dist/src/sessions/accounting.d.ts.map +1 -1
  312. package/dist/src/sessions/accounting.js +5 -0
  313. package/dist/src/sessions/accounting.js.map +1 -1
  314. package/dist/src/sessions/backup-integrity.d.ts +45 -0
  315. package/dist/src/sessions/backup-integrity.d.ts.map +1 -0
  316. package/dist/src/sessions/backup-integrity.js +122 -0
  317. package/dist/src/sessions/backup-integrity.js.map +1 -0
  318. package/dist/src/sessions/backup.d.ts +40 -2
  319. package/dist/src/sessions/backup.d.ts.map +1 -1
  320. package/dist/src/sessions/backup.js +88 -12
  321. package/dist/src/sessions/backup.js.map +1 -1
  322. package/dist/src/sessions/callbacks.d.ts +9 -0
  323. package/dist/src/sessions/callbacks.d.ts.map +1 -1
  324. package/dist/src/sessions/callbacks.js +55 -10
  325. package/dist/src/sessions/callbacks.js.map +1 -1
  326. package/dist/src/sessions/completion-batching.d.ts +82 -0
  327. package/dist/src/sessions/completion-batching.d.ts.map +1 -0
  328. package/dist/src/sessions/completion-batching.js +126 -0
  329. package/dist/src/sessions/completion-batching.js.map +1 -0
  330. package/dist/src/sessions/connector-command-guard.d.ts +66 -0
  331. package/dist/src/sessions/connector-command-guard.d.ts.map +1 -0
  332. package/dist/src/sessions/connector-command-guard.js +145 -0
  333. package/dist/src/sessions/connector-command-guard.js.map +1 -0
  334. package/dist/src/sessions/context.d.ts.map +1 -1
  335. package/dist/src/sessions/context.js +3 -4
  336. package/dist/src/sessions/context.js.map +1 -1
  337. package/dist/src/sessions/engine-fallback.d.ts +43 -1
  338. package/dist/src/sessions/engine-fallback.d.ts.map +1 -1
  339. package/dist/src/sessions/engine-fallback.js +266 -15
  340. package/dist/src/sessions/engine-fallback.js.map +1 -1
  341. package/dist/src/sessions/engine-health-gate.d.ts +83 -0
  342. package/dist/src/sessions/engine-health-gate.d.ts.map +1 -0
  343. package/dist/src/sessions/engine-health-gate.js +186 -0
  344. package/dist/src/sessions/engine-health-gate.js.map +1 -0
  345. package/dist/src/sessions/engine-login.d.ts +58 -0
  346. package/dist/src/sessions/engine-login.d.ts.map +1 -0
  347. package/dist/src/sessions/engine-login.js +107 -0
  348. package/dist/src/sessions/engine-login.js.map +1 -0
  349. package/dist/src/sessions/fork.d.ts.map +1 -1
  350. package/dist/src/sessions/fork.js +3 -1
  351. package/dist/src/sessions/fork.js.map +1 -1
  352. package/dist/src/sessions/goal-execution.d.ts.map +1 -1
  353. package/dist/src/sessions/goal-execution.js +8 -1
  354. package/dist/src/sessions/goal-execution.js.map +1 -1
  355. package/dist/src/sessions/limit-failure-notice.d.ts +41 -0
  356. package/dist/src/sessions/limit-failure-notice.d.ts.map +1 -0
  357. package/dist/src/sessions/limit-failure-notice.js +87 -0
  358. package/dist/src/sessions/limit-failure-notice.js.map +1 -0
  359. package/dist/src/sessions/lost-turn.d.ts +39 -0
  360. package/dist/src/sessions/lost-turn.d.ts.map +1 -0
  361. package/dist/src/sessions/lost-turn.js +32 -0
  362. package/dist/src/sessions/lost-turn.js.map +1 -0
  363. package/dist/src/sessions/manager.d.ts.map +1 -1
  364. package/dist/src/sessions/manager.js +104 -47
  365. package/dist/src/sessions/manager.js.map +1 -1
  366. package/dist/src/sessions/new-session-engine.d.ts +42 -0
  367. package/dist/src/sessions/new-session-engine.d.ts.map +1 -0
  368. package/dist/src/sessions/new-session-engine.js +100 -0
  369. package/dist/src/sessions/new-session-engine.js.map +1 -0
  370. package/dist/src/sessions/origin-delivery.d.ts +50 -4
  371. package/dist/src/sessions/origin-delivery.d.ts.map +1 -1
  372. package/dist/src/sessions/origin-delivery.js +108 -9
  373. package/dist/src/sessions/origin-delivery.js.map +1 -1
  374. package/dist/src/sessions/queue.d.ts +14 -0
  375. package/dist/src/sessions/queue.d.ts.map +1 -1
  376. package/dist/src/sessions/queue.js +38 -2
  377. package/dist/src/sessions/queue.js.map +1 -1
  378. package/dist/src/sessions/registry.d.ts +4 -2
  379. package/dist/src/sessions/registry.d.ts.map +1 -1
  380. package/dist/src/sessions/registry.js +21 -4
  381. package/dist/src/sessions/registry.js.map +1 -1
  382. package/dist/src/sessions/reply-disposition.d.ts +8 -0
  383. package/dist/src/sessions/reply-disposition.d.ts.map +1 -1
  384. package/dist/src/sessions/reply-disposition.js +8 -0
  385. package/dist/src/sessions/reply-disposition.js.map +1 -1
  386. package/dist/src/sessions/restart-resume.d.ts +234 -0
  387. package/dist/src/sessions/restart-resume.d.ts.map +1 -0
  388. package/dist/src/sessions/restart-resume.js +596 -0
  389. package/dist/src/sessions/restart-resume.js.map +1 -0
  390. package/dist/src/sessions/speaker-prefix.d.ts.map +1 -1
  391. package/dist/src/sessions/speaker-prefix.js +3 -1
  392. package/dist/src/sessions/speaker-prefix.js.map +1 -1
  393. package/dist/src/sessions/turn-delivery.d.ts +26 -0
  394. package/dist/src/sessions/turn-delivery.d.ts.map +1 -0
  395. package/dist/src/sessions/turn-delivery.js +34 -0
  396. package/dist/src/sessions/turn-delivery.js.map +1 -0
  397. package/dist/src/sessions/unrequested-stop.d.ts +26 -0
  398. package/dist/src/sessions/unrequested-stop.d.ts.map +1 -0
  399. package/dist/src/sessions/unrequested-stop.js +19 -0
  400. package/dist/src/sessions/unrequested-stop.js.map +1 -0
  401. package/dist/src/sessions/usage-limit-wait.d.ts +14 -0
  402. package/dist/src/sessions/usage-limit-wait.d.ts.map +1 -0
  403. package/dist/src/sessions/usage-limit-wait.js +9 -0
  404. package/dist/src/sessions/usage-limit-wait.js.map +1 -0
  405. package/dist/src/shared/attachment-download.d.ts +41 -0
  406. package/dist/src/shared/attachment-download.d.ts.map +1 -0
  407. package/dist/src/shared/attachment-download.js +110 -0
  408. package/dist/src/shared/attachment-download.js.map +1 -0
  409. package/dist/src/shared/attachment-notice.d.ts +24 -0
  410. package/dist/src/shared/attachment-notice.d.ts.map +1 -0
  411. package/dist/src/shared/attachment-notice.js +37 -0
  412. package/dist/src/shared/attachment-notice.js.map +1 -0
  413. package/dist/src/shared/attachments.d.ts +65 -0
  414. package/dist/src/shared/attachments.d.ts.map +1 -0
  415. package/dist/src/shared/attachments.js +153 -0
  416. package/dist/src/shared/attachments.js.map +1 -0
  417. package/dist/src/shared/childEnv.d.ts +15 -0
  418. package/dist/src/shared/childEnv.d.ts.map +1 -1
  419. package/dist/src/shared/childEnv.js +15 -0
  420. package/dist/src/shared/childEnv.js.map +1 -1
  421. package/dist/src/shared/claude-auto-memory.d.ts +33 -0
  422. package/dist/src/shared/claude-auto-memory.d.ts.map +1 -0
  423. package/dist/src/shared/claude-auto-memory.js +156 -0
  424. package/dist/src/shared/claude-auto-memory.js.map +1 -0
  425. package/dist/src/shared/claude-limit-reset.d.ts +54 -0
  426. package/dist/src/shared/claude-limit-reset.d.ts.map +1 -0
  427. package/dist/src/shared/claude-limit-reset.js +99 -0
  428. package/dist/src/shared/claude-limit-reset.js.map +1 -0
  429. package/dist/src/shared/config-error.d.ts +21 -0
  430. package/dist/src/shared/config-error.d.ts.map +1 -0
  431. package/dist/src/shared/config-error.js +37 -0
  432. package/dist/src/shared/config-error.js.map +1 -0
  433. package/dist/src/shared/config-file.d.ts +57 -0
  434. package/dist/src/shared/config-file.d.ts.map +1 -0
  435. package/dist/src/shared/config-file.js +217 -0
  436. package/dist/src/shared/config-file.js.map +1 -0
  437. package/dist/src/shared/config-yaml-edit.d.ts +20 -0
  438. package/dist/src/shared/config-yaml-edit.d.ts.map +1 -0
  439. package/dist/src/shared/config-yaml-edit.js +468 -0
  440. package/dist/src/shared/config-yaml-edit.js.map +1 -0
  441. package/dist/src/shared/config.d.ts.map +1 -1
  442. package/dist/src/shared/config.js +12 -4
  443. package/dist/src/shared/config.js.map +1 -1
  444. package/dist/src/shared/engine-fallback.d.ts +22 -0
  445. package/dist/src/shared/engine-fallback.d.ts.map +1 -1
  446. package/dist/src/shared/engine-fallback.js +55 -4
  447. package/dist/src/shared/engine-fallback.js.map +1 -1
  448. package/dist/src/shared/engine-health.d.ts +16 -0
  449. package/dist/src/shared/engine-health.d.ts.map +1 -1
  450. package/dist/src/shared/engine-health.js +42 -0
  451. package/dist/src/shared/engine-health.js.map +1 -1
  452. package/dist/src/shared/list-alignment.d.ts +23 -0
  453. package/dist/src/shared/list-alignment.d.ts.map +1 -0
  454. package/dist/src/shared/list-alignment.js +61 -0
  455. package/dist/src/shared/list-alignment.js.map +1 -0
  456. package/dist/src/shared/logger.d.ts.map +1 -1
  457. package/dist/src/shared/logger.js +104 -33
  458. package/dist/src/shared/logger.js.map +1 -1
  459. package/dist/src/shared/map-limited.d.ts +11 -0
  460. package/dist/src/shared/map-limited.d.ts.map +1 -0
  461. package/dist/src/shared/map-limited.js +30 -0
  462. package/dist/src/shared/map-limited.js.map +1 -0
  463. package/dist/src/shared/oneShotCli.d.ts.map +1 -1
  464. package/dist/src/shared/oneShotCli.js +4 -2
  465. package/dist/src/shared/oneShotCli.js.map +1 -1
  466. package/dist/src/shared/partial-delivery.d.ts +24 -0
  467. package/dist/src/shared/partial-delivery.d.ts.map +1 -0
  468. package/dist/src/shared/partial-delivery.js +46 -0
  469. package/dist/src/shared/partial-delivery.js.map +1 -0
  470. package/dist/src/shared/process-safety-net.d.ts +44 -0
  471. package/dist/src/shared/process-safety-net.d.ts.map +1 -0
  472. package/dist/src/shared/process-safety-net.js +88 -0
  473. package/dist/src/shared/process-safety-net.js.map +1 -0
  474. package/dist/src/shared/rateLimit.d.ts +45 -2
  475. package/dist/src/shared/rateLimit.d.ts.map +1 -1
  476. package/dist/src/shared/rateLimit.js +64 -2
  477. package/dist/src/shared/rateLimit.js.map +1 -1
  478. package/dist/src/shared/redact.d.ts.map +1 -1
  479. package/dist/src/shared/redact.js +11 -1
  480. package/dist/src/shared/redact.js.map +1 -1
  481. package/dist/src/shared/safe-file-name.d.ts +9 -0
  482. package/dist/src/shared/safe-file-name.d.ts.map +1 -0
  483. package/dist/src/shared/safe-file-name.js +16 -0
  484. package/dist/src/shared/safe-file-name.js.map +1 -0
  485. package/dist/src/shared/terminal-safe-text.d.ts +2 -0
  486. package/dist/src/shared/terminal-safe-text.d.ts.map +1 -0
  487. package/dist/src/shared/terminal-safe-text.js +21 -0
  488. package/dist/src/shared/terminal-safe-text.js.map +1 -0
  489. package/dist/src/shared/types.d.ts +75 -4
  490. package/dist/src/shared/types.d.ts.map +1 -1
  491. package/dist/src/skills-sync/apply.d.ts +21 -0
  492. package/dist/src/skills-sync/apply.d.ts.map +1 -0
  493. package/dist/src/skills-sync/apply.js +209 -0
  494. package/dist/src/skills-sync/apply.js.map +1 -0
  495. package/dist/src/skills-sync/backup-run.d.ts +47 -0
  496. package/dist/src/skills-sync/backup-run.d.ts.map +1 -0
  497. package/dist/src/skills-sync/backup-run.js +150 -0
  498. package/dist/src/skills-sync/backup-run.js.map +1 -0
  499. package/dist/src/skills-sync/bounded-read.d.ts +32 -0
  500. package/dist/src/skills-sync/bounded-read.d.ts.map +1 -0
  501. package/dist/src/skills-sync/bounded-read.js +104 -0
  502. package/dist/src/skills-sync/bounded-read.js.map +1 -0
  503. package/dist/src/skills-sync/bundled.d.ts +28 -0
  504. package/dist/src/skills-sync/bundled.d.ts.map +1 -0
  505. package/dist/src/skills-sync/bundled.js +84 -0
  506. package/dist/src/skills-sync/bundled.js.map +1 -0
  507. package/dist/src/skills-sync/fingerprint.d.ts +32 -0
  508. package/dist/src/skills-sync/fingerprint.d.ts.map +1 -0
  509. package/dist/src/skills-sync/fingerprint.js +58 -0
  510. package/dist/src/skills-sync/fingerprint.js.map +1 -0
  511. package/dist/src/skills-sync/history.d.ts +44 -0
  512. package/dist/src/skills-sync/history.d.ts.map +1 -0
  513. package/dist/src/skills-sync/history.js +115 -0
  514. package/dist/src/skills-sync/history.js.map +1 -0
  515. package/dist/src/skills-sync/home-skill.d.ts +28 -0
  516. package/dist/src/skills-sync/home-skill.d.ts.map +1 -0
  517. package/dist/src/skills-sync/home-skill.js +67 -0
  518. package/dist/src/skills-sync/home-skill.js.map +1 -0
  519. package/dist/src/skills-sync/instance.d.ts +26 -0
  520. package/dist/src/skills-sync/instance.d.ts.map +1 -0
  521. package/dist/src/skills-sync/instance.js +128 -0
  522. package/dist/src/skills-sync/instance.js.map +1 -0
  523. package/dist/src/skills-sync/names.d.ts +25 -0
  524. package/dist/src/skills-sync/names.d.ts.map +1 -0
  525. package/dist/src/skills-sync/names.js +56 -0
  526. package/dist/src/skills-sync/names.js.map +1 -0
  527. package/dist/src/skills-sync/plan.d.ts +58 -0
  528. package/dist/src/skills-sync/plan.d.ts.map +1 -0
  529. package/dist/src/skills-sync/plan.js +132 -0
  530. package/dist/src/skills-sync/plan.js.map +1 -0
  531. package/dist/src/skills-sync/receipt.d.ts +61 -0
  532. package/dist/src/skills-sync/receipt.d.ts.map +1 -0
  533. package/dist/src/skills-sync/receipt.js +149 -0
  534. package/dist/src/skills-sync/receipt.js.map +1 -0
  535. package/dist/src/skills-sync/staging.d.ts +21 -0
  536. package/dist/src/skills-sync/staging.d.ts.map +1 -0
  537. package/dist/src/skills-sync/staging.js +81 -0
  538. package/dist/src/skills-sync/staging.js.map +1 -0
  539. package/dist/src/skills-sync/sync.d.ts +37 -0
  540. package/dist/src/skills-sync/sync.d.ts.map +1 -0
  541. package/dist/src/skills-sync/sync.js +201 -0
  542. package/dist/src/skills-sync/sync.js.map +1 -0
  543. package/dist/src/skills-sync/types.d.ts +66 -0
  544. package/dist/src/skills-sync/types.d.ts.map +1 -0
  545. package/dist/src/skills-sync/types.js +2 -0
  546. package/dist/src/skills-sync/types.js.map +1 -0
  547. package/dist/src/stt/config.d.ts +5 -0
  548. package/dist/src/stt/config.d.ts.map +1 -0
  549. package/dist/src/stt/config.js +18 -0
  550. package/dist/src/stt/config.js.map +1 -0
  551. package/dist/src/updates/maintenance.d.ts.map +1 -1
  552. package/dist/src/updates/maintenance.js +24 -4
  553. package/dist/src/updates/maintenance.js.map +1 -1
  554. package/dist/src/workflows/repository-mutex.d.ts +1 -1
  555. package/dist/web/404.html +1 -1
  556. package/dist/web/__next.__PAGE__.txt +11 -11
  557. package/dist/web/__next._full.txt +12 -12
  558. package/dist/web/__next._tree.txt +2 -2
  559. package/dist/web/_next/static/chunks/{0g5c5ppr8zmup.js → 20v6mri7epga5.js} +1 -1
  560. package/dist/web/_next/static/chunks/2u0328ngpt-ek.js +1 -0
  561. package/dist/web/_next/static/chunks/3f9i3f9q6v6_j.css +1 -0
  562. package/dist/web/_next/static/chunks/{08i7uo3uz6_fn.js → 3yy053rafgrzy.js} +1 -1
  563. package/dist/web/_not-found/__next._full.txt +10 -10
  564. package/dist/web/_not-found/__next._not-found.__PAGE__.txt +9 -9
  565. package/dist/web/_not-found/__next._tree.txt +2 -2
  566. package/dist/web/_not-found.html +1 -1
  567. package/dist/web/_not-found.txt +10 -10
  568. package/dist/web/chat/__next._full.txt +12 -12
  569. package/dist/web/chat/__next._tree.txt +2 -2
  570. package/dist/web/chat/__next.chat.__PAGE__.txt +11 -11
  571. package/dist/web/chat.html +1 -1
  572. package/dist/web/chat.txt +12 -12
  573. package/dist/web/cron/__next._full.txt +12 -12
  574. package/dist/web/cron/__next._tree.txt +2 -2
  575. package/dist/web/cron/__next.cron.__PAGE__.txt +11 -11
  576. package/dist/web/cron.html +1 -1
  577. package/dist/web/cron.txt +12 -12
  578. package/dist/web/index.html +1 -1
  579. package/dist/web/index.txt +12 -12
  580. package/dist/web/kanban/__next._full.txt +12 -12
  581. package/dist/web/kanban/__next._tree.txt +2 -2
  582. package/dist/web/kanban/__next.kanban.__PAGE__.txt +11 -11
  583. package/dist/web/kanban.html +1 -1
  584. package/dist/web/kanban.txt +12 -12
  585. package/dist/web/logs/__next._full.txt +12 -12
  586. package/dist/web/logs/__next._tree.txt +2 -2
  587. package/dist/web/logs/__next.logs.__PAGE__.txt +11 -11
  588. package/dist/web/logs.html +1 -1
  589. package/dist/web/logs.txt +12 -12
  590. package/dist/web/models/__next._full.txt +12 -12
  591. package/dist/web/models/__next._tree.txt +2 -2
  592. package/dist/web/models/__next.models.__PAGE__.txt +11 -11
  593. package/dist/web/models.html +1 -1
  594. package/dist/web/models.txt +12 -12
  595. package/dist/web/org/__next._full.txt +12 -12
  596. package/dist/web/org/__next._tree.txt +2 -2
  597. package/dist/web/org/__next.org.__PAGE__.txt +11 -11
  598. package/dist/web/org.html +1 -1
  599. package/dist/web/org.txt +12 -12
  600. package/dist/web/sessions/__next._full.txt +10 -10
  601. package/dist/web/sessions/__next._tree.txt +2 -2
  602. package/dist/web/sessions/__next.sessions.__PAGE__.txt +9 -9
  603. package/dist/web/sessions.html +1 -1
  604. package/dist/web/sessions.txt +10 -10
  605. package/dist/web/settings/__next._full.txt +12 -12
  606. package/dist/web/settings/__next._tree.txt +2 -2
  607. package/dist/web/settings/__next.settings.__PAGE__.txt +11 -11
  608. package/dist/web/settings.html +1 -1
  609. package/dist/web/settings.txt +12 -12
  610. package/dist/web/skills/__next._full.txt +12 -12
  611. package/dist/web/skills/__next._tree.txt +2 -2
  612. package/dist/web/skills/__next.skills.__PAGE__.txt +11 -11
  613. package/dist/web/skills.html +1 -1
  614. package/dist/web/skills.txt +12 -12
  615. package/package.json +2 -1
  616. package/template/AGENTS.md +48 -308
  617. package/template/CLAUDE.md +4 -349
  618. package/template/bundled-skill-history.json +377 -0
  619. package/template/config.default.yaml +52 -3
  620. package/template/docs/architecture.md +41 -3
  621. package/template/docs/backup.md +142 -0
  622. package/template/docs/connectors.md +192 -16
  623. package/template/docs/cron.md +30 -11
  624. package/template/docs/memory.md +47 -0
  625. package/template/docs/overview.md +6 -2
  626. package/template/docs/self-modification.md +11 -10
  627. package/template/docs/skills.md +77 -4
  628. package/template/migrations/0.3.0/MIGRATION.md +6 -0
  629. package/template/migrations/0.7.3/MIGRATION.md +6 -0
  630. package/template/migrations/0.7.5/MIGRATION.md +1 -1
  631. package/template/migrations/0.9.0/MIGRATION.md +6 -0
  632. package/template/migrations/2026.10.13/MIGRATION.md +76 -0
  633. package/template/migrations/2026.10.13/files/docs/architecture.md +112 -0
  634. package/template/migrations/2026.10.13/files/docs/automations.md +110 -0
  635. package/template/migrations/2026.10.13/files/docs/backup.md +142 -0
  636. package/template/migrations/2026.10.13/files/docs/connectors.md +370 -0
  637. package/template/migrations/2026.10.13/files/docs/cron-commands.md +52 -0
  638. package/template/migrations/2026.10.13/files/docs/cron.md +178 -0
  639. package/template/migrations/2026.10.13/files/docs/mcp.md +108 -0
  640. package/template/migrations/2026.10.13/files/docs/memory.md +47 -0
  641. package/template/migrations/2026.10.13/files/docs/org.md +111 -0
  642. package/template/migrations/2026.10.13/files/docs/overview.md +44 -0
  643. package/template/migrations/2026.10.13/files/docs/self-modification.md +71 -0
  644. package/template/migrations/2026.10.13/files/docs/skills.md +140 -0
  645. package/template/migrations/2026.10.13/files/skills/cron-manager/SKILL.md +107 -0
  646. package/template/migrations/2026.10.13/files/skills/management/SKILL.md +227 -0
  647. package/template/migrations/2026.10.13/files/skills/migrate/SKILL.md +194 -0
  648. package/template/migrations/2026.10.13/files/skills/onboarding/SKILL.md +153 -0
  649. package/template/migrations/2026.10.13/files/skills/openryoko-config/SKILL.md +35 -0
  650. package/template/migrations/2026.10.13/files/skills/openryoko-config/references/engine-fallback.md +98 -0
  651. package/template/migrations/2026.10.13/files/skills/openryoko-config/references/jev.md +89 -0
  652. package/template/migrations/2026.10.13/files/skills/openryoko-config/references/maintenance.md +49 -0
  653. package/template/migrations/2026.10.13/files/skills/openryoko-config/references/platform.md +100 -0
  654. package/template/migrations/2026.10.13/files/skills/self-heal/SKILL.md +187 -0
  655. package/template/migrations/2026.10.9/MIGRATION.md +44 -0
  656. package/template/migrations/2026.10.9/files/docs/memory.md +47 -0
  657. package/template/migrations/2026.10.9/files/skills/migrate/SKILL.md +194 -0
  658. package/template/migrations/2026.5.7/MIGRATION.md +6 -0
  659. package/template/migrations/2026.8.28/MIGRATION.md +6 -0
  660. package/template/migrations/2026.9.11/MIGRATION.md +6 -0
  661. package/template/skills/cron-manager/SKILL.md +10 -0
  662. package/template/skills/management/SKILL.md +5 -4
  663. package/template/skills/migrate/SKILL.md +47 -14
  664. package/template/skills/onboarding/SKILL.md +3 -3
  665. package/template/skills/openryoko-config/SKILL.md +1 -1
  666. package/template/skills/openryoko-config/references/engine-fallback.md +16 -5
  667. package/template/skills/openryoko-config/references/platform.md +23 -4
  668. package/template/skills/self-heal/SKILL.md +117 -44
  669. package/dist/src/engines/mock.d.ts +0 -16
  670. package/dist/src/engines/mock.d.ts.map +0 -1
  671. package/dist/src/engines/mock.js +0 -47
  672. package/dist/src/engines/mock.js.map +0 -1
  673. package/dist/src/shared/test-support/posix-mode.d.ts +0 -17
  674. package/dist/src/shared/test-support/posix-mode.d.ts.map +0 -1
  675. package/dist/src/shared/test-support/posix-mode.js +0 -23
  676. package/dist/src/shared/test-support/posix-mode.js.map +0 -1
  677. package/dist/web/_next/static/Oux0UBcCkbX5eOp9-vC4k/_buildManifest.js +0 -11
  678. package/dist/web/_next/static/Oux0UBcCkbX5eOp9-vC4k/_clientMiddlewareManifest.js +0 -1
  679. package/dist/web/_next/static/Oux0UBcCkbX5eOp9-vC4k/_ssgManifest.js +0 -1
  680. package/dist/web/_next/static/chunks/02h65sho8c14h.js +0 -1
  681. package/dist/web/_next/static/chunks/0ic18n-m7ixyw.css +0 -1
  682. package/dist/web/_next/static/chunks/19s8vn2kgy7q1.js +0 -1
  683. package/dist/web/_next/static/chunks/1_jm0szyu2the.js +0 -1
  684. package/dist/web/_next/static/chunks/1omdg4m5w9lgx.js +0 -1
  685. package/dist/web/_next/static/chunks/25nob1new8t4s.js +0 -79
  686. package/dist/web/_next/static/chunks/2iqxlc9wtxzm2.js +0 -1
  687. package/dist/web/_next/static/chunks/3_6klkygi417n.js +0 -1
  688. package/dist/web/_next/static/chunks/3alc-b00c58_3.css +0 -1
  689. /package/dist/web/_next/static/{70PNIyOj8-2kywAG6J41- → ov0mWzyHx0B5oEnTHE_pa}/_buildManifest.js +0 -0
  690. /package/dist/web/_next/static/{70PNIyOj8-2kywAG6J41- → ov0mWzyHx0B5oEnTHE_pa}/_clientMiddlewareManifest.js +0 -0
  691. /package/dist/web/_next/static/{70PNIyOj8-2kywAG6J41- → ov0mWzyHx0B5oEnTHE_pa}/_ssgManifest.js +0 -0
@@ -1,4 +1,6 @@
1
- import { getSession } from "./registry.js";
1
+ import { turnFailureOf } from "./origin-delivery.js";
2
+ import { getSession, insertMessage } from "./registry.js";
3
+ import { failedByUnrequestedStop } from "./unrequested-stop.js";
2
4
  import { loadConfig } from "../shared/config.js";
3
5
  import { logger } from "../shared/logger.js";
4
6
  import { readGatewayAuthToken } from "../gateway/auth.js";
@@ -18,7 +20,7 @@ export function notifyParentSession(childSession, result, options) {
18
20
  return;
19
21
  }
20
22
  // Run asynchronously — do not await in the caller
21
- _sendNotification(childSession, result).catch((err) => {
23
+ _sendNotification(childSession, result, { completion: true }).catch((err) => {
22
24
  logger.warn(`[callbacks] Failed to notify parent session ${childSession.parentSessionId}: ${err instanceof Error ? err.message : String(err)}`);
23
25
  });
24
26
  }
@@ -48,16 +50,44 @@ export function notifyRateLimitResumed(childSession) {
48
50
  logger.warn(`[callbacks] Failed to send resume notification: ${err instanceof Error ? err.message : String(err)}`);
49
51
  });
50
52
  }
51
- async function _sendNotification(childSession, result) {
53
+ /**
54
+ * Whether a notification should start a turn in this parent.
55
+ *
56
+ * A parent in error is not woken: one stopped by a usage limit or a lost login
57
+ * would fail again, once for every child that finishes. The exception is a
58
+ * parent whose engine stopped without being asked to — its process died. It
59
+ * can run again at once, and it is usually waiting on exactly these
60
+ * notifications: left out, the conversation it answers in just stops.
61
+ *
62
+ * What counts is what the parent's turn failed with. That is not always what
63
+ * lastError reads: when the message saying so could not be delivered either,
64
+ * lastError holds the record of that, and the turn's failure is kept beside it.
65
+ */
66
+ function wakesForNotifications(parent) {
67
+ return parent.status !== "error" || failedByUnrequestedStop({ status: parent.status, lastError: turnFailureOf(parent) });
68
+ }
69
+ const NOT_ACTED_ON = "ℹ️ Not acted on: this session was in an error state when this arrived, so no turn was started for it.";
70
+ /**
71
+ * Keep a notification for a parent that is not woken: write it into the
72
+ * parent's transcript, where the parent finds it when it runs again and the
73
+ * operator sees it in the meantime. It used to be dropped, and the parent had
74
+ * no trace that the child had finished at all.
75
+ *
76
+ * Written straight to the registry rather than through the gateway route: the
77
+ * route's job is to start a turn, and this must not depend on it.
78
+ */
79
+ function recordWithoutWaking(parent, childId, message) {
80
+ insertMessage(parent.id, "notification", `${message}\n\n${NOT_ACTED_ON}`);
81
+ logger.info(`[callbacks] Parent ${parent.id} is in error — recorded the notification for child ${childId} in its transcript without waking it.`);
82
+ }
83
+ async function _sendNotification(childSession, result,
84
+ /** `completion`: this reports the child's turn ending (not a status notice). */
85
+ opts = {}) {
52
86
  const parent = getSession(childSession.parentSessionId);
53
87
  if (!parent) {
54
88
  logger.info(`[callbacks] Parent ${childSession.parentSessionId} not found for child ${childSession.id} — no notification sent.`);
55
89
  return; // Parent gone or expired
56
90
  }
57
- if (parent.status === "error") {
58
- logger.info(`[callbacks] Parent ${parent.id} is in error — skipping notification for child ${childSession.id}. The child's result will not reach it.`);
59
- return; // Parent already in error — skip
60
- }
61
91
  const employeeName = childSession.employee || "Unknown";
62
92
  const childId = childSession.id;
63
93
  let message;
@@ -69,7 +99,14 @@ async function _sendNotification(childSession, result) {
69
99
  const preview = raw.length > 200 ? raw.substring(0, 200) + "..." : raw;
70
100
  message = `📩 Employee "${employeeName}" replied in session ${childId}.\nRead the latest messages: GET /api/sessions/${childId}?last=N\n\nPreview: ${preview}`;
71
101
  }
72
- await _sendRaw(childSession.parentSessionId, message);
102
+ if (!wakesForNotifications(parent)) {
103
+ recordWithoutWaking(parent, childId, message);
104
+ return;
105
+ }
106
+ // A successful completion names its child so the gateway can fold the ones
107
+ // that pile up behind a busy parent into one turn (completion-batching.ts).
108
+ // A failure is left unmarked: it keeps a turn of its own.
109
+ await _sendRaw(childSession.parentSessionId, message, opts.completion && !result.error ? childId : undefined);
73
110
  }
74
111
  /**
75
112
  * Send a hardcoded notification to the configured Discord channel.
@@ -100,7 +137,7 @@ async function _sendDiscordNotification(message) {
100
137
  }
101
138
  await _postToGateway(port, `/api/connectors/${connector}/send`, { channel, text: message }, `sending a ${connector} notification`);
102
139
  }
103
- async function _sendRaw(parentSessionId, message) {
140
+ async function _sendRaw(parentSessionId, message, completionOf) {
104
141
  let port = 7777;
105
142
  try {
106
143
  const config = loadConfig();
@@ -109,7 +146,15 @@ async function _sendRaw(parentSessionId, message) {
109
146
  catch {
110
147
  // Use default port if config is unavailable
111
148
  }
112
- await _postToGateway(port, `/api/sessions/${parentSessionId}/message`, { message, role: "notification" }, `notifying parent ${parentSessionId}`);
149
+ await _postToGateway(port, `/api/sessions/${parentSessionId}/message`, { message, role: "notification", ...(completionOf ? { completionOf } : {}) }, `notifying parent ${parentSessionId}`);
150
+ }
151
+ /**
152
+ * Wake a session on this instance's own gateway with a notification turn: the
153
+ * message is persisted, queued and run, and a connector-origin session answers
154
+ * in the conversation it came from. Rejects when the gateway does not accept it.
155
+ */
156
+ export function postSessionNotification(port, sessionId, body) {
157
+ return _postToGateway(port, `/api/sessions/${sessionId}/message`, { ...body, role: "notification" }, `waking session ${sessionId}`);
113
158
  }
114
159
  /**
115
160
  * POST to this instance's own gateway API.
@@ -1 +1 @@
1
- {"version":3,"file":"callbacks.js","sourceRoot":"","sources":["../../../src/sessions/callbacks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"callbacks.js","sourceRoot":"","sources":["../../../src/sessions/callbacks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Completion batching — one parent turn for the child completions that pile up
3
+ * while the parent is busy. (Ported in spirit from upstream jinn 5c0292d7 +
4
+ * 65c01e72; upstream batches its durable callback outbox, this fork batches
5
+ * the queue_items row itself.)
6
+ *
7
+ * Every child completion used to become its own queue row and its own engine
8
+ * turn, so a parent that delegated to N children ran N turns when they
9
+ * finished, and a Slack-origin parent posted into its thread N times. A
10
+ * completion that arrives while a completion row is still waiting now joins
11
+ * that row instead of opening another.
12
+ *
13
+ * What is shared is only the engine dispatch. Each notification is still
14
+ * persisted in the transcript as its own message; the row's prompt is rebuilt
15
+ * from all of them, and the dispatcher reads the prompt from the row when the
16
+ * turn starts.
17
+ *
18
+ * Only the pending TAIL row is ever joined, and only if it is a completion
19
+ * batch: reaching past an operator message, a detached-job wake-up, a restart
20
+ * nudge or a failed child's notification would reorder work. A failure is
21
+ * never batched — callbacks.ts does not mark it — so it keeps a turn of its own.
22
+ */
23
+ import type { Session } from "../shared/types.js";
24
+ import type { SessionQueue } from "./queue.js";
25
+ /** Upstream's limits: a batch is one prompt, and a prompt has to stay readable. */
26
+ export declare const COMPLETION_BATCH_MAX_ITEMS = 32;
27
+ export declare const COMPLETION_BATCH_MAX_CHARS = 128000;
28
+ export interface AcceptedCompletion {
29
+ /** The queue row this completion will run under. */
30
+ queueItemId: string;
31
+ /** That row's prompt as of now. */
32
+ prompt: string;
33
+ /** True when it joined a row that was already waiting. */
34
+ joined: boolean;
35
+ /** Completions in the row, this one included. */
36
+ size: number;
37
+ }
38
+ /** One engine-facing prompt for the completions sharing a row. */
39
+ export declare function completionBatchPrompt(messages: readonly string[]): string;
40
+ /**
41
+ * Queue a child's completion notification for its parent: join the pending
42
+ * tail row when that is a completion batch with room, otherwise open a row.
43
+ * The lookup and the write share one transaction, and a row that has started
44
+ * is no longer pending, so a turn never runs a half-written prompt.
45
+ *
46
+ * `canJoin` lets the caller veto a row the database still shows as pending but
47
+ * that will never run (see {@link queueChildCompletion}).
48
+ */
49
+ export declare function acceptChildCompletion(sessionId: string, sessionKey: string, message: string, canJoin?: (queueItemId: string) => boolean): AcceptedCompletion;
50
+ /** The prompt a queue row holds now. A dispatcher captures the prompt when it
51
+ * is scheduled, but a completion batch grows while its row waits, so the turn
52
+ * runs what the row says. Falls back to the captured prompt for a run with no
53
+ * row (or a row that is gone). */
54
+ export declare function queuedPrompt(queueItemId: string | undefined, captured: string): string;
55
+ /** True for a row opened by {@link acceptChildCompletion} — a notification
56
+ * wake-up whatever its prompt has grown into. */
57
+ export declare function isCompletionBatchItem(queueItemId: string): boolean;
58
+ /**
59
+ * The child whose successful completion a notification reports — when the
60
+ * caller says so (callbacks.ts marks them) and that session really is this
61
+ * session's child. Anything else is an ordinary notification.
62
+ */
63
+ export declare function completionChildOf(parent: Session, body: unknown): string | null;
64
+ export interface QueuedCompletion extends AcceptedCompletion {
65
+ /** False when the row it joined already has a dispatcher that will run it. */
66
+ needsDispatch: boolean;
67
+ }
68
+ /**
69
+ * What the notification route calls: queue `message` as a child completion if
70
+ * `body` marks it as one, and return null for anything else — so the caller
71
+ * queues it the ordinary way. Batching only saves turns; it must never cost a
72
+ * notification, so a failure here (logged) also falls back to the ordinary
73
+ * path instead of failing the request the child's callback is waiting on.
74
+ *
75
+ * The live queue decides two things the database cannot. A row whose only
76
+ * dispatcher a stop has cancelled is still "pending" until that dispatcher
77
+ * drains, but it will be closed without running — joining it would lose the
78
+ * completion, so a new row is opened instead. And a row with no dispatcher at
79
+ * all (a restart left it behind) needs one even though it was joined.
80
+ */
81
+ export declare function queueChildCompletion(parent: Session, sessionKey: string, body: unknown, message: string, queue: Pick<SessionQueue, "dispatchState">): QueuedCompletion | null;
82
+ //# sourceMappingURL=completion-batching.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-batching.d.ts","sourceRoot":"","sources":["../../../src/sessions/completion-batching.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,mFAAmF;AACnF,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAC7C,eAAO,MAAM,0BAA0B,SAAU,CAAC;AAIlD,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAC;IAChB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kEAAkE;AAClE,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAOzE;AAeD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAoB,GACrD,kBAAkB,CAuBpB;AAED;;;mCAGmC;AACnC,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQtF;AAED;kDACkD;AAClD,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAOlE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAI/E;AAED,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,8EAA8E;IAC9E,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,GACzC,gBAAgB,GAAG,IAAI,CASzB"}
@@ -0,0 +1,126 @@
1
+ import { logger } from "../shared/logger.js";
2
+ import { enqueueQueueItem, getSession, initDb } from "./registry.js";
3
+ /** Upstream's limits: a batch is one prompt, and a prompt has to stay readable. */
4
+ export const COMPLETION_BATCH_MAX_ITEMS = 32;
5
+ export const COMPLETION_BATCH_MAX_CHARS = 128_000;
6
+ const BATCH_KIND = "child-completion";
7
+ /** One engine-facing prompt for the completions sharing a row. */
8
+ export function completionBatchPrompt(messages) {
9
+ if (messages.length === 1)
10
+ return messages[0];
11
+ return [
12
+ `📬 ${messages.length} child-session updates arrived while this session was busy. ` +
13
+ "Read all of them before you act, then answer once.",
14
+ ...messages.map((message, index) => `--- Update ${index + 1} of ${messages.length} ---\n${message}`),
15
+ ].join("\n\n");
16
+ }
17
+ function batchMessages(raw) {
18
+ if (typeof raw !== "string" || !raw)
19
+ return null;
20
+ try {
21
+ const parsed = JSON.parse(raw);
22
+ if (parsed?.kind !== BATCH_KIND || !Array.isArray(parsed.items))
23
+ return null;
24
+ return parsed.items.every((item) => typeof item === "string") ? parsed.items : null;
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ const storedBatch = (messages) => JSON.stringify({ kind: BATCH_KIND, items: messages });
31
+ /**
32
+ * Queue a child's completion notification for its parent: join the pending
33
+ * tail row when that is a completion batch with room, otherwise open a row.
34
+ * The lookup and the write share one transaction, and a row that has started
35
+ * is no longer pending, so a turn never runs a half-written prompt.
36
+ *
37
+ * `canJoin` lets the caller veto a row the database still shows as pending but
38
+ * that will never run (see {@link queueChildCompletion}).
39
+ */
40
+ export function acceptChildCompletion(sessionId, sessionKey, message, canJoin = () => true) {
41
+ const database = initDb();
42
+ return database.transaction(() => {
43
+ const tail = database.prepare(`
44
+ SELECT id, batch FROM queue_items
45
+ WHERE session_id = ? AND session_key = ? AND status = 'pending'
46
+ ORDER BY position DESC, created_at DESC, rowid DESC
47
+ LIMIT 1
48
+ `).get(sessionId, sessionKey);
49
+ const waiting = tail ? batchMessages(tail.batch) : null;
50
+ if (tail && waiting && waiting.length < COMPLETION_BATCH_MAX_ITEMS && canJoin(tail.id)) {
51
+ const messages = [...waiting, message];
52
+ const prompt = completionBatchPrompt(messages);
53
+ if (prompt.length <= COMPLETION_BATCH_MAX_CHARS) {
54
+ database.prepare("UPDATE queue_items SET prompt = ?, batch = ? WHERE id = ? AND status = 'pending'")
55
+ .run(prompt, storedBatch(messages), tail.id);
56
+ return { queueItemId: tail.id, prompt, joined: true, size: messages.length };
57
+ }
58
+ }
59
+ const queueItemId = enqueueQueueItem(sessionId, sessionKey, message);
60
+ database.prepare("UPDATE queue_items SET batch = ? WHERE id = ?").run(storedBatch([message]), queueItemId);
61
+ return { queueItemId, prompt: message, joined: false, size: 1 };
62
+ }).immediate();
63
+ }
64
+ /** The prompt a queue row holds now. A dispatcher captures the prompt when it
65
+ * is scheduled, but a completion batch grows while its row waits, so the turn
66
+ * runs what the row says. Falls back to the captured prompt for a run with no
67
+ * row (or a row that is gone). */
68
+ export function queuedPrompt(queueItemId, captured) {
69
+ if (!queueItemId)
70
+ return captured;
71
+ try {
72
+ const row = initDb().prepare("SELECT prompt FROM queue_items WHERE id = ?").get(queueItemId);
73
+ return row?.prompt ?? captured;
74
+ }
75
+ catch {
76
+ return captured; // the turn still runs — with what its dispatcher was given
77
+ }
78
+ }
79
+ /** True for a row opened by {@link acceptChildCompletion} — a notification
80
+ * wake-up whatever its prompt has grown into. */
81
+ export function isCompletionBatchItem(queueItemId) {
82
+ try {
83
+ const row = initDb().prepare("SELECT batch FROM queue_items WHERE id = ?").get(queueItemId);
84
+ return batchMessages(row?.batch) !== null;
85
+ }
86
+ catch {
87
+ return false; // asked during the boot replay, which must not stop on it
88
+ }
89
+ }
90
+ /**
91
+ * The child whose successful completion a notification reports — when the
92
+ * caller says so (callbacks.ts marks them) and that session really is this
93
+ * session's child. Anything else is an ordinary notification.
94
+ */
95
+ export function completionChildOf(parent, body) {
96
+ const childId = body?.completionOf;
97
+ if (typeof childId !== "string" || !childId)
98
+ return null;
99
+ return getSession(childId)?.parentSessionId === parent.id ? childId : null;
100
+ }
101
+ /**
102
+ * What the notification route calls: queue `message` as a child completion if
103
+ * `body` marks it as one, and return null for anything else — so the caller
104
+ * queues it the ordinary way. Batching only saves turns; it must never cost a
105
+ * notification, so a failure here (logged) also falls back to the ordinary
106
+ * path instead of failing the request the child's callback is waiting on.
107
+ *
108
+ * The live queue decides two things the database cannot. A row whose only
109
+ * dispatcher a stop has cancelled is still "pending" until that dispatcher
110
+ * drains, but it will be closed without running — joining it would lose the
111
+ * completion, so a new row is opened instead. And a row with no dispatcher at
112
+ * all (a restart left it behind) needs one even though it was joined.
113
+ */
114
+ export function queueChildCompletion(parent, sessionKey, body, message, queue) {
115
+ try {
116
+ if (!completionChildOf(parent, body))
117
+ return null;
118
+ const accepted = acceptChildCompletion(parent.id, sessionKey, message, (id) => queue.dispatchState(id) !== "cancelled");
119
+ return { ...accepted, needsDispatch: !accepted.joined || queue.dispatchState(accepted.queueItemId) === "none" };
120
+ }
121
+ catch (err) {
122
+ logger.warn(`[completion-batching] Could not batch a completion for session ${parent.id}; queueing it on its own: ${err instanceof Error ? err.message : String(err)}`);
123
+ return null;
124
+ }
125
+ }
126
+ //# sourceMappingURL=completion-batching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-batching.js","sourceRoot":"","sources":["../../../src/sessions/completion-batching.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { IncomingMessage, JinnConfig } from "../shared/types.js";
2
+ /**
3
+ * What a chat message is allowed to mean to the CLI that runs the turn.
4
+ *
5
+ * The engines hand a prompt to their CLI as it is, and Claude Code reads some
6
+ * prompts as something other than text (read from the 2.1.296 executable):
7
+ *
8
+ * - after `trim()`, a leading "/" is one of its own commands — /logout,
9
+ * /permissions, /remote-control and some ninety more;
10
+ * - after `trim()`, the words exit, quit, :q, :q!, :wq and :wq! quit it;
11
+ * - a leading "!" puts its input box in bash mode: the rest is a shell command;
12
+ * - on a cold start the prompt is an argument, and one with a leading "-" is
13
+ * an option (`--mcp-config=…` starts a program of the sender's choosing).
14
+ *
15
+ * A chat message is written by whoever can reach the assistant, so none of
16
+ * that may be decided by its first character. Every message a connector
17
+ * delivers passes through here, once, before its turn runs:
18
+ *
19
+ * - Text the CLI would read as text anyway is passed on untouched.
20
+ * - Text it would read as a command or an option is passed on *as text*:
21
+ * a one-line note is put in front, so that it no longer starts with
22
+ * anything the CLI acts on, and the model reads the words. A leading space
23
+ * would not do — the CLI trims before it looks.
24
+ * - The operator, identified by platform ID and by nothing else, keeps the
25
+ * commands in OPERATOR_NATIVE_COMMANDS. The list names what is allowed:
26
+ * a command the CLI gains tomorrow is not on it.
27
+ *
28
+ * Nobody is told "that command is not allowed" by the gateway: to the sender it
29
+ * is a message like any other, answered by the model.
30
+ *
31
+ * Not decided here: the web UI and the API (callers the gateway has already
32
+ * authenticated) and cron prompts (the operator's own text) reach the engine
33
+ * as before, and the gateway's own commands (/new, /status, /model, /doctor,
34
+ * /cron) are answered before a message gets this far.
35
+ */
36
+ /**
37
+ * The native Claude commands the operator can run from chat, and whether each
38
+ * takes text after it. Both tidy the conversation and finish with nothing to
39
+ * read; neither touches the login, permissions, settings or anything outside
40
+ * the session. Both are commands the interactive engine knows how to wait for
41
+ * (isNativeClaudeCommand) — one it does not would hang the turn.
42
+ *
43
+ * Deliberately not here: /usage and /cost. They open an interactive panel
44
+ * whose output never comes back to chat, and the panel can stay up in the PTY
45
+ * and swallow the next turn — useless from chat, and a way to wedge a session.
46
+ */
47
+ export declare const OPERATOR_NATIVE_COMMANDS: ReadonlyMap<string, {
48
+ args: boolean;
49
+ }>;
50
+ /**
51
+ * Only the configured platform ID of the platform the message arrived on
52
+ * counts. A display name never does, and where no operator ID is configured
53
+ * (or the platform has none: Telegram, WhatsApp) nobody is the operator.
54
+ */
55
+ export declare function isVerifiedOperator(msg: IncomingMessage, config: JinnConfig): boolean;
56
+ /**
57
+ * May this sender run a gateway command that changes the session's engine or
58
+ * fires a cron job? Yes for the gateway's own sources (a cron turn), yes for
59
+ * everyone when no operator ID is configured (nothing can verify anyone — the
60
+ * instance's existing behaviour is not taken away), and otherwise only the
61
+ * verified operator. Read-only commands do not ask this.
62
+ */
63
+ export declare function senderMayManageSession(msg: IncomingMessage, config: JinnConfig): boolean;
64
+ /** The message as the turn may see it. Returns `msg` itself when nothing had to change. */
65
+ export declare function guardConnectorMessage(msg: IncomingMessage, config: JinnConfig): IncomingMessage;
66
+ //# sourceMappingURL=connector-command-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-command-guard.d.ts","sourceRoot":"","sources":["../../../src/sessions/connector-command-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAItE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAG1E,CAAC;AA+CH;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAUpF;AAQD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAIxF;AAED,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,GAAG,eAAe,CAa/F"}
@@ -0,0 +1,145 @@
1
+ import { stripTerminalControlChars } from "../shared/terminal-safe-text.js";
2
+ import { resolveOperatorIdentity } from "./context.js";
3
+ /**
4
+ * What a chat message is allowed to mean to the CLI that runs the turn.
5
+ *
6
+ * The engines hand a prompt to their CLI as it is, and Claude Code reads some
7
+ * prompts as something other than text (read from the 2.1.296 executable):
8
+ *
9
+ * - after `trim()`, a leading "/" is one of its own commands — /logout,
10
+ * /permissions, /remote-control and some ninety more;
11
+ * - after `trim()`, the words exit, quit, :q, :q!, :wq and :wq! quit it;
12
+ * - a leading "!" puts its input box in bash mode: the rest is a shell command;
13
+ * - on a cold start the prompt is an argument, and one with a leading "-" is
14
+ * an option (`--mcp-config=…` starts a program of the sender's choosing).
15
+ *
16
+ * A chat message is written by whoever can reach the assistant, so none of
17
+ * that may be decided by its first character. Every message a connector
18
+ * delivers passes through here, once, before its turn runs:
19
+ *
20
+ * - Text the CLI would read as text anyway is passed on untouched.
21
+ * - Text it would read as a command or an option is passed on *as text*:
22
+ * a one-line note is put in front, so that it no longer starts with
23
+ * anything the CLI acts on, and the model reads the words. A leading space
24
+ * would not do — the CLI trims before it looks.
25
+ * - The operator, identified by platform ID and by nothing else, keeps the
26
+ * commands in OPERATOR_NATIVE_COMMANDS. The list names what is allowed:
27
+ * a command the CLI gains tomorrow is not on it.
28
+ *
29
+ * Nobody is told "that command is not allowed" by the gateway: to the sender it
30
+ * is a message like any other, answered by the model.
31
+ *
32
+ * Not decided here: the web UI and the API (callers the gateway has already
33
+ * authenticated) and cron prompts (the operator's own text) reach the engine
34
+ * as before, and the gateway's own commands (/new, /status, /model, /doctor,
35
+ * /cron) are answered before a message gets this far.
36
+ */
37
+ /**
38
+ * The native Claude commands the operator can run from chat, and whether each
39
+ * takes text after it. Both tidy the conversation and finish with nothing to
40
+ * read; neither touches the login, permissions, settings or anything outside
41
+ * the session. Both are commands the interactive engine knows how to wait for
42
+ * (isNativeClaudeCommand) — one it does not would hang the turn.
43
+ *
44
+ * Deliberately not here: /usage and /cost. They open an interactive panel
45
+ * whose output never comes back to chat, and the panel can stay up in the PTY
46
+ * and swallow the next turn — useless from chat, and a way to wedge a session.
47
+ */
48
+ export const OPERATOR_NATIVE_COMMANDS = new Map([
49
+ ["/compact", { args: true }], // optional instructions for the summary
50
+ ["/clear", { args: false }],
51
+ ]);
52
+ /** Sources whose text the gateway wrote itself. A cron job's prompt is the operator's. */
53
+ const GATEWAY_SOURCES = new Set(["cron"]);
54
+ /**
55
+ * The gateway's own /goal (goal-execution.ts). For Claude it is handed to the
56
+ * CLI as the native command, and the gateway writes the same command itself
57
+ * when it finds a goal in ordinary words — so it is everybody's, as before.
58
+ */
59
+ const GOAL_COMMAND = /^\/goal(?:\s|$)/i;
60
+ /** `/command`, or `/command text` on one line: the only shape a native command is let through in. */
61
+ const ONE_LINE_COMMAND = /^(\/\S+)(?:[ \t]+(.*))?$/;
62
+ // Both patterns are anchored at the start and scan once: a long run of blanks
63
+ // in a message costs its length, not its square.
64
+ const INVISIBLE = String.raw `[\s\p{Cf}\p{Default_Ignorable_Code_Point}\u2800]`;
65
+ const LEADING_INVISIBLE = new RegExp(`^${INVISIBLE}+`, "u");
66
+ /** The whole message is one of the words the CLI quits on: exit, quit, :q, :q!, :wq, :wq!. */
67
+ const EXIT_WORD = new RegExp(`^(?:exit|quit|:q!?|:wq!?)${INVISIBLE}*$`, "iu");
68
+ const AS_TEXT = "[Chat message, delivered as plain text: nothing in it was run as a CLI command or option. Read it as an ordinary message.]";
69
+ const AS_TEXT_SLASH = "[Chat message, delivered as plain text: it was not run as a CLI command. Read it as an ordinary message; if it names an installed skill, it is a request to use that skill.]";
70
+ /**
71
+ * What a CLI could find itself looking at: full-width forms folded to the
72
+ * ASCII they stand for, nothing invisible in front. Stricter than the
73
+ * installed CLI, which does neither — a version that starts to must not find
74
+ * a command where this found none.
75
+ */
76
+ function asSeen(text) {
77
+ return text.normalize("NFKC").replace(LEADING_INVISIBLE, "");
78
+ }
79
+ function readsAsCliInput(seen) {
80
+ return /^[/\-!]/.test(seen) || EXIT_WORD.test(seen);
81
+ }
82
+ /** Exactly as typed — a look-alike of an allowed command is not that command. */
83
+ function isOperatorCommand(typed) {
84
+ const match = ONE_LINE_COMMAND.exec(typed);
85
+ if (!match)
86
+ return false;
87
+ const rule = OPERATOR_NATIVE_COMMANDS.get(match[1]);
88
+ return rule !== undefined && (rule.args || !match[2]?.trim());
89
+ }
90
+ /**
91
+ * Only the configured platform ID of the platform the message arrived on
92
+ * counts. A display name never does, and where no operator ID is configured
93
+ * (or the platform has none: Telegram, WhatsApp) nobody is the operator.
94
+ */
95
+ export function isVerifiedOperator(msg, config) {
96
+ const meta = msg.transportMeta ?? {};
97
+ const id = (value) => (typeof value === "string" && value ? value : undefined);
98
+ return resolveOperatorIdentity({
99
+ speakerNames: [],
100
+ speakerSlackId: id(meta.speakerSlackId),
101
+ speakerDiscordId: id(meta.speakerDiscordId),
102
+ source: msg.source,
103
+ config,
104
+ }).operatorIdVerified;
105
+ }
106
+ /** True when the instance has a strict operator ID set (so verification is possible at all). */
107
+ function strictOperatorConfigured(config) {
108
+ const portal = config?.portal;
109
+ return !!portal && (Object.hasOwn(portal, "operatorSlackId") || Object.hasOwn(portal, "operatorDiscordId"));
110
+ }
111
+ /**
112
+ * May this sender run a gateway command that changes the session's engine or
113
+ * fires a cron job? Yes for the gateway's own sources (a cron turn), yes for
114
+ * everyone when no operator ID is configured (nothing can verify anyone — the
115
+ * instance's existing behaviour is not taken away), and otherwise only the
116
+ * verified operator. Read-only commands do not ask this.
117
+ */
118
+ export function senderMayManageSession(msg, config) {
119
+ if (GATEWAY_SOURCES.has(msg.source))
120
+ return true;
121
+ if (!strictOperatorConfigured(config))
122
+ return true;
123
+ return isVerifiedOperator(msg, config);
124
+ }
125
+ /** The message as the turn may see it. Returns `msg` itself when nothing had to change. */
126
+ export function guardConnectorMessage(msg, config) {
127
+ if (GATEWAY_SOURCES.has(msg.source))
128
+ return msg;
129
+ const text = stripTerminalControlChars(msg.text);
130
+ // Nothing but control characters: a blank prompt is one the CLI never
131
+ // submits, and the turn would wait for an answer that cannot come.
132
+ if (!text.trim() && msg.text.trim())
133
+ return { ...msg, text: `${AS_TEXT}\n${text}` };
134
+ const passedOn = text === msg.text ? msg : { ...msg, text };
135
+ const seen = asSeen(text);
136
+ if (!readsAsCliInput(seen))
137
+ return passedOn;
138
+ const typed = text.trim();
139
+ if (GOAL_COMMAND.test(typed))
140
+ return passedOn;
141
+ if (isOperatorCommand(typed) && isVerifiedOperator(msg, config))
142
+ return passedOn;
143
+ return { ...msg, text: `${seen.startsWith("/") ? AS_TEXT_SLASH : AS_TEXT}\n${text}` };
144
+ }
145
+ //# sourceMappingURL=connector-command-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-command-guard.js","sourceRoot":"","sources":["../../../src/sessions/connector-command-guard.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/sessions/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/sessions/context.ts"],"names":[],"mappings":"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"}
@@ -380,8 +380,7 @@ Your working directory is \`~/.ryoko\` (${JINN_HOME}). This contains:
380
380
  - \`cron/\` — scheduled job definitions and run history
381
381
  - \`sessions/\` — session database
382
382
  - \`logs/\` — gateway logs
383
- - \`CLAUDE.md\` — user-defined instructions (always follow these)
384
- - \`AGENTS.md\` — agent/employee documentation
383
+ - \`AGENTS.md\` / \`CLAUDE.md\` — your operating instructions (always follow these). On newer instances CLAUDE.md is only an entry point that imports AGENTS.md
385
384
 
386
385
  You can read, write, and modify any of these files to configure yourself, create new employees, add skills, etc.`;
387
386
  }
@@ -1061,10 +1060,10 @@ ryoko api POST /api/sessions/<child-id>/message \\
1061
1060
 
1062
1061
  6. **Respond immediately**: tell the user you have delegated and will follow up when the child reports back, then end your turn. **Do NOT poll or sleep-loop inside your turn** waiting for the child — a turn has a hard time limit, and a blocked turn cannot answer anyone.
1063
1062
 
1064
- 7. **onComplete notification** (the primary wake-up — attempted, not guaranteed): when the child finishes, the gateway posts a notification into your session and you are woken with a preview and the child's session id. The notification is skipped silently when any of these hold:
1063
+ 7. **onComplete notification** (the primary wake-up — attempted, not guaranteed): when the child finishes, the gateway posts a notification into your session and you are woken with a preview and the child's session id. Completions that arrive while you are busy reach you together as one turn (up to 32 at a time): read every child it names. The notification is skipped silently when either of these holds:
1065
1064
  - the child was spawned without your \`parentSessionId\` (an unlinked child never notifies anyone)
1066
1065
  - the employee sets \`alwaysNotify: false\`
1067
- - your session is already in \`error\`
1066
+ If your session is in \`error\` when a child finishes (your own last turn failed, for example on a usage limit or a lost login), you are not woken: the notification is written into your transcript, marked "Not acted on". When you run again, read your recent messages (\`ryoko api GET /api/sessions/<your-session-id>?last=20\`) for children that finished in the meantime. A turn that failed because the engine process died does not count: you are woken as usual.
1068
1067
  If the POST itself fails (gateway restart, auth), a warning goes to the gateway log — not to you.
1069
1068
 
1070
1069
  8. **Safety net**: if the user asks about progress, or a reply is overdue, read the child yourself: