@shuyhere/takotako 0.0.1

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 (653) hide show
  1. package/CONTRIBUTING.md +84 -0
  2. package/LICENSE +21 -0
  3. package/README.md +171 -0
  4. package/dist/agents/communication.d.ts +48 -0
  5. package/dist/agents/communication.d.ts.map +1 -0
  6. package/dist/agents/communication.js +123 -0
  7. package/dist/agents/communication.js.map +1 -0
  8. package/dist/agents/config.d.ts +52 -0
  9. package/dist/agents/config.d.ts.map +1 -0
  10. package/dist/agents/config.js +65 -0
  11. package/dist/agents/config.js.map +1 -0
  12. package/dist/agents/model-catalog.d.ts +49 -0
  13. package/dist/agents/model-catalog.d.ts.map +1 -0
  14. package/dist/agents/model-catalog.js +79 -0
  15. package/dist/agents/model-catalog.js.map +1 -0
  16. package/dist/agents/registry.d.ts +71 -0
  17. package/dist/agents/registry.d.ts.map +1 -0
  18. package/dist/agents/registry.js +297 -0
  19. package/dist/agents/registry.js.map +1 -0
  20. package/dist/agents/roles.d.ts +79 -0
  21. package/dist/agents/roles.d.ts.map +1 -0
  22. package/dist/agents/roles.js +174 -0
  23. package/dist/agents/roles.js.map +1 -0
  24. package/dist/agents/subagent.d.ts +124 -0
  25. package/dist/agents/subagent.d.ts.map +1 -0
  26. package/dist/agents/subagent.js +352 -0
  27. package/dist/agents/subagent.js.map +1 -0
  28. package/dist/agents/templates.d.ts +18 -0
  29. package/dist/agents/templates.d.ts.map +1 -0
  30. package/dist/agents/templates.js +341 -0
  31. package/dist/agents/templates.js.map +1 -0
  32. package/dist/agents/thread-binding.d.ts +77 -0
  33. package/dist/agents/thread-binding.d.ts.map +1 -0
  34. package/dist/agents/thread-binding.js +167 -0
  35. package/dist/agents/thread-binding.js.map +1 -0
  36. package/dist/auth/agent-profiles.d.ts +46 -0
  37. package/dist/auth/agent-profiles.d.ts.map +1 -0
  38. package/dist/auth/agent-profiles.js +97 -0
  39. package/dist/auth/agent-profiles.js.map +1 -0
  40. package/dist/auth/allow-from.d.ts +27 -0
  41. package/dist/auth/allow-from.d.ts.map +1 -0
  42. package/dist/auth/allow-from.js +118 -0
  43. package/dist/auth/allow-from.js.map +1 -0
  44. package/dist/auth/oauth.d.ts +66 -0
  45. package/dist/auth/oauth.d.ts.map +1 -0
  46. package/dist/auth/oauth.js +253 -0
  47. package/dist/auth/oauth.js.map +1 -0
  48. package/dist/auth/storage.d.ts +69 -0
  49. package/dist/auth/storage.d.ts.map +1 -0
  50. package/dist/auth/storage.js +157 -0
  51. package/dist/auth/storage.js.map +1 -0
  52. package/dist/cache/file-cache.d.ts +68 -0
  53. package/dist/cache/file-cache.d.ts.map +1 -0
  54. package/dist/cache/file-cache.js +176 -0
  55. package/dist/cache/file-cache.js.map +1 -0
  56. package/dist/cache/manager.d.ts +69 -0
  57. package/dist/cache/manager.d.ts.map +1 -0
  58. package/dist/cache/manager.js +117 -0
  59. package/dist/cache/manager.js.map +1 -0
  60. package/dist/cache/symbol-index.d.ts +75 -0
  61. package/dist/cache/symbol-index.d.ts.map +1 -0
  62. package/dist/cache/symbol-index.js +267 -0
  63. package/dist/cache/symbol-index.js.map +1 -0
  64. package/dist/cache/tool-cache.d.ts +75 -0
  65. package/dist/cache/tool-cache.d.ts.map +1 -0
  66. package/dist/cache/tool-cache.js +173 -0
  67. package/dist/cache/tool-cache.js.map +1 -0
  68. package/dist/channels/channel.d.ts +156 -0
  69. package/dist/channels/channel.d.ts.map +1 -0
  70. package/dist/channels/channel.js +25 -0
  71. package/dist/channels/channel.js.map +1 -0
  72. package/dist/channels/cli.d.ts +35 -0
  73. package/dist/channels/cli.d.ts.map +1 -0
  74. package/dist/channels/cli.js +94 -0
  75. package/dist/channels/cli.js.map +1 -0
  76. package/dist/channels/delivery-queue.d.ts +31 -0
  77. package/dist/channels/delivery-queue.d.ts.map +1 -0
  78. package/dist/channels/delivery-queue.js +127 -0
  79. package/dist/channels/delivery-queue.js.map +1 -0
  80. package/dist/channels/discord.d.ts +124 -0
  81. package/dist/channels/discord.d.ts.map +1 -0
  82. package/dist/channels/discord.js +664 -0
  83. package/dist/channels/discord.js.map +1 -0
  84. package/dist/channels/retry.d.ts +31 -0
  85. package/dist/channels/retry.d.ts.map +1 -0
  86. package/dist/channels/retry.js +94 -0
  87. package/dist/channels/retry.js.map +1 -0
  88. package/dist/channels/telegram.d.ts +69 -0
  89. package/dist/channels/telegram.d.ts.map +1 -0
  90. package/dist/channels/telegram.js +499 -0
  91. package/dist/channels/telegram.js.map +1 -0
  92. package/dist/channels/tui.d.ts +42 -0
  93. package/dist/channels/tui.d.ts.map +1 -0
  94. package/dist/channels/tui.js +126 -0
  95. package/dist/channels/tui.js.map +1 -0
  96. package/dist/cli/acp.d.ts +10 -0
  97. package/dist/cli/acp.d.ts.map +1 -0
  98. package/dist/cli/acp.js +69 -0
  99. package/dist/cli/acp.js.map +1 -0
  100. package/dist/cli/audit.d.ts +11 -0
  101. package/dist/cli/audit.d.ts.map +1 -0
  102. package/dist/cli/audit.js +55 -0
  103. package/dist/cli/audit.js.map +1 -0
  104. package/dist/cli/cache.d.ts +10 -0
  105. package/dist/cli/cache.d.ts.map +1 -0
  106. package/dist/cli/cache.js +77 -0
  107. package/dist/cli/cache.js.map +1 -0
  108. package/dist/cli/config.d.ts +5 -0
  109. package/dist/cli/config.d.ts.map +1 -0
  110. package/dist/cli/config.js +168 -0
  111. package/dist/cli/config.js.map +1 -0
  112. package/dist/cli/cron.d.ts +5 -0
  113. package/dist/cli/cron.d.ts.map +1 -0
  114. package/dist/cli/cron.js +192 -0
  115. package/dist/cli/cron.js.map +1 -0
  116. package/dist/cli/extensions.d.ts +5 -0
  117. package/dist/cli/extensions.d.ts.map +1 -0
  118. package/dist/cli/extensions.js +53 -0
  119. package/dist/cli/extensions.js.map +1 -0
  120. package/dist/cli/logs.d.ts +5 -0
  121. package/dist/cli/logs.d.ts.map +1 -0
  122. package/dist/cli/logs.js +49 -0
  123. package/dist/cli/logs.js.map +1 -0
  124. package/dist/cli/memory.d.ts +5 -0
  125. package/dist/cli/memory.d.ts.map +1 -0
  126. package/dist/cli/memory.js +78 -0
  127. package/dist/cli/memory.js.map +1 -0
  128. package/dist/cli/message.d.ts +5 -0
  129. package/dist/cli/message.d.ts.map +1 -0
  130. package/dist/cli/message.js +69 -0
  131. package/dist/cli/message.js.map +1 -0
  132. package/dist/cli/service.d.ts +14 -0
  133. package/dist/cli/service.d.ts.map +1 -0
  134. package/dist/cli/service.js +181 -0
  135. package/dist/cli/service.js.map +1 -0
  136. package/dist/cli/symphony.d.ts +5 -0
  137. package/dist/cli/symphony.d.ts.map +1 -0
  138. package/dist/cli/symphony.js +114 -0
  139. package/dist/cli/symphony.js.map +1 -0
  140. package/dist/cli/update.d.ts +5 -0
  141. package/dist/cli/update.d.ts.map +1 -0
  142. package/dist/cli/update.js +48 -0
  143. package/dist/cli/update.js.map +1 -0
  144. package/dist/commands/channel-setup.d.ts +31 -0
  145. package/dist/commands/channel-setup.d.ts.map +1 -0
  146. package/dist/commands/channel-setup.js +138 -0
  147. package/dist/commands/channel-setup.js.map +1 -0
  148. package/dist/commands/dispatch.d.ts +48 -0
  149. package/dist/commands/dispatch.d.ts.map +1 -0
  150. package/dist/commands/dispatch.js +68 -0
  151. package/dist/commands/dispatch.js.map +1 -0
  152. package/dist/commands/model-picker.d.ts +16 -0
  153. package/dist/commands/model-picker.d.ts.map +1 -0
  154. package/dist/commands/model-picker.js +120 -0
  155. package/dist/commands/model-picker.js.map +1 -0
  156. package/dist/commands/parser.d.ts +32 -0
  157. package/dist/commands/parser.d.ts.map +1 -0
  158. package/dist/commands/parser.js +39 -0
  159. package/dist/commands/parser.js.map +1 -0
  160. package/dist/commands/registry.d.ts +76 -0
  161. package/dist/commands/registry.d.ts.map +1 -0
  162. package/dist/commands/registry.js +351 -0
  163. package/dist/commands/registry.js.map +1 -0
  164. package/dist/commands/skill-commands.d.ts +35 -0
  165. package/dist/commands/skill-commands.d.ts.map +1 -0
  166. package/dist/commands/skill-commands.js +61 -0
  167. package/dist/commands/skill-commands.js.map +1 -0
  168. package/dist/config/resolve.d.ts +25 -0
  169. package/dist/config/resolve.d.ts.map +1 -0
  170. package/dist/config/resolve.js +289 -0
  171. package/dist/config/resolve.js.map +1 -0
  172. package/dist/config/schema.d.ts +520 -0
  173. package/dist/config/schema.d.ts.map +1 -0
  174. package/dist/config/schema.js +123 -0
  175. package/dist/config/schema.js.map +1 -0
  176. package/dist/core/agent-loop.d.ts +137 -0
  177. package/dist/core/agent-loop.d.ts.map +1 -0
  178. package/dist/core/agent-loop.js +700 -0
  179. package/dist/core/agent-loop.js.map +1 -0
  180. package/dist/core/audit.d.ts +87 -0
  181. package/dist/core/audit.d.ts.map +1 -0
  182. package/dist/core/audit.js +224 -0
  183. package/dist/core/audit.js.map +1 -0
  184. package/dist/core/bootstrap.d.ts +23 -0
  185. package/dist/core/bootstrap.d.ts.map +1 -0
  186. package/dist/core/bootstrap.js +162 -0
  187. package/dist/core/bootstrap.js.map +1 -0
  188. package/dist/core/context.d.ts +44 -0
  189. package/dist/core/context.d.ts.map +1 -0
  190. package/dist/core/context.js +65 -0
  191. package/dist/core/context.js.map +1 -0
  192. package/dist/core/cron.d.ts +111 -0
  193. package/dist/core/cron.d.ts.map +1 -0
  194. package/dist/core/cron.js +284 -0
  195. package/dist/core/cron.js.map +1 -0
  196. package/dist/core/exec-approvals.d.ts +50 -0
  197. package/dist/core/exec-approvals.d.ts.map +1 -0
  198. package/dist/core/exec-approvals.js +187 -0
  199. package/dist/core/exec-approvals.js.map +1 -0
  200. package/dist/core/heartbeat.d.ts +71 -0
  201. package/dist/core/heartbeat.d.ts.map +1 -0
  202. package/dist/core/heartbeat.js +214 -0
  203. package/dist/core/heartbeat.js.map +1 -0
  204. package/dist/core/message-queue.d.ts +60 -0
  205. package/dist/core/message-queue.d.ts.map +1 -0
  206. package/dist/core/message-queue.js +182 -0
  207. package/dist/core/message-queue.js.map +1 -0
  208. package/dist/core/network-policy.d.ts +39 -0
  209. package/dist/core/network-policy.d.ts.map +1 -0
  210. package/dist/core/network-policy.js +121 -0
  211. package/dist/core/network-policy.js.map +1 -0
  212. package/dist/core/progress.d.ts +48 -0
  213. package/dist/core/progress.d.ts.map +1 -0
  214. package/dist/core/progress.js +81 -0
  215. package/dist/core/progress.js.map +1 -0
  216. package/dist/core/prompt.d.ts +105 -0
  217. package/dist/core/prompt.d.ts.map +1 -0
  218. package/dist/core/prompt.js +411 -0
  219. package/dist/core/prompt.js.map +1 -0
  220. package/dist/core/pruning.d.ts +40 -0
  221. package/dist/core/pruning.d.ts.map +1 -0
  222. package/dist/core/pruning.js +165 -0
  223. package/dist/core/pruning.js.map +1 -0
  224. package/dist/core/rate-limiter.d.ts +64 -0
  225. package/dist/core/rate-limiter.d.ts.map +1 -0
  226. package/dist/core/rate-limiter.js +142 -0
  227. package/dist/core/rate-limiter.js.map +1 -0
  228. package/dist/core/reactions.d.ts +31 -0
  229. package/dist/core/reactions.d.ts.map +1 -0
  230. package/dist/core/reactions.js +67 -0
  231. package/dist/core/reactions.js.map +1 -0
  232. package/dist/core/retry-queue.d.ts +56 -0
  233. package/dist/core/retry-queue.d.ts.map +1 -0
  234. package/dist/core/retry-queue.js +106 -0
  235. package/dist/core/retry-queue.js.map +1 -0
  236. package/dist/core/sanitizer.d.ts +38 -0
  237. package/dist/core/sanitizer.d.ts.map +1 -0
  238. package/dist/core/sanitizer.js +181 -0
  239. package/dist/core/sanitizer.js.map +1 -0
  240. package/dist/core/secret-scanner.d.ts +39 -0
  241. package/dist/core/secret-scanner.d.ts.map +1 -0
  242. package/dist/core/secret-scanner.js +96 -0
  243. package/dist/core/secret-scanner.js.map +1 -0
  244. package/dist/core/secrets.d.ts +38 -0
  245. package/dist/core/secrets.d.ts.map +1 -0
  246. package/dist/core/secrets.js +137 -0
  247. package/dist/core/secrets.js.map +1 -0
  248. package/dist/core/security.d.ts +58 -0
  249. package/dist/core/security.d.ts.map +1 -0
  250. package/dist/core/security.js +120 -0
  251. package/dist/core/security.js.map +1 -0
  252. package/dist/core/self-awareness.d.ts +19 -0
  253. package/dist/core/self-awareness.d.ts.map +1 -0
  254. package/dist/core/self-awareness.js +124 -0
  255. package/dist/core/self-awareness.js.map +1 -0
  256. package/dist/core/session-init.d.ts +34 -0
  257. package/dist/core/session-init.d.ts.map +1 -0
  258. package/dist/core/session-init.js +68 -0
  259. package/dist/core/session-init.js.map +1 -0
  260. package/dist/core/streaming.d.ts +82 -0
  261. package/dist/core/streaming.d.ts.map +1 -0
  262. package/dist/core/streaming.js +264 -0
  263. package/dist/core/streaming.js.map +1 -0
  264. package/dist/core/symphony/orchestrator.d.ts +61 -0
  265. package/dist/core/symphony/orchestrator.d.ts.map +1 -0
  266. package/dist/core/symphony/orchestrator.js +476 -0
  267. package/dist/core/symphony/orchestrator.js.map +1 -0
  268. package/dist/core/symphony/status.d.ts +11 -0
  269. package/dist/core/symphony/status.d.ts.map +1 -0
  270. package/dist/core/symphony/status.js +133 -0
  271. package/dist/core/symphony/status.js.map +1 -0
  272. package/dist/core/symphony/types.d.ts +84 -0
  273. package/dist/core/symphony/types.d.ts.map +1 -0
  274. package/dist/core/symphony/types.js +5 -0
  275. package/dist/core/symphony/types.js.map +1 -0
  276. package/dist/core/symphony/workflow.d.ts +18 -0
  277. package/dist/core/symphony/workflow.d.ts.map +1 -0
  278. package/dist/core/symphony/workflow.js +149 -0
  279. package/dist/core/symphony/workflow.js.map +1 -0
  280. package/dist/core/symphony/workspace.d.ts +24 -0
  281. package/dist/core/symphony/workspace.d.ts.map +1 -0
  282. package/dist/core/symphony/workspace.js +94 -0
  283. package/dist/core/symphony/workspace.js.map +1 -0
  284. package/dist/core/thinking.d.ts +27 -0
  285. package/dist/core/thinking.d.ts.map +1 -0
  286. package/dist/core/thinking.js +83 -0
  287. package/dist/core/thinking.js.map +1 -0
  288. package/dist/core/thread-bindings.d.ts +47 -0
  289. package/dist/core/thread-bindings.d.ts.map +1 -0
  290. package/dist/core/thread-bindings.js +94 -0
  291. package/dist/core/thread-bindings.js.map +1 -0
  292. package/dist/core/timezone.d.ts +28 -0
  293. package/dist/core/timezone.d.ts.map +1 -0
  294. package/dist/core/timezone.js +72 -0
  295. package/dist/core/timezone.js.map +1 -0
  296. package/dist/core/tool-loop-detector.d.ts +41 -0
  297. package/dist/core/tool-loop-detector.d.ts.map +1 -0
  298. package/dist/core/tool-loop-detector.js +83 -0
  299. package/dist/core/tool-loop-detector.js.map +1 -0
  300. package/dist/core/tool-validator.d.ts +44 -0
  301. package/dist/core/tool-validator.d.ts.map +1 -0
  302. package/dist/core/tool-validator.js +175 -0
  303. package/dist/core/tool-validator.js.map +1 -0
  304. package/dist/core/typing.d.ts +25 -0
  305. package/dist/core/typing.d.ts.map +1 -0
  306. package/dist/core/typing.js +48 -0
  307. package/dist/core/typing.js.map +1 -0
  308. package/dist/core/usage-tracker.d.ts +66 -0
  309. package/dist/core/usage-tracker.d.ts.map +1 -0
  310. package/dist/core/usage-tracker.js +163 -0
  311. package/dist/core/usage-tracker.js.map +1 -0
  312. package/dist/daemon/commands.d.ts +16 -0
  313. package/dist/daemon/commands.d.ts.map +1 -0
  314. package/dist/daemon/commands.js +445 -0
  315. package/dist/daemon/commands.js.map +1 -0
  316. package/dist/daemon/pid.d.ts +30 -0
  317. package/dist/daemon/pid.d.ts.map +1 -0
  318. package/dist/daemon/pid.js +62 -0
  319. package/dist/daemon/pid.js.map +1 -0
  320. package/dist/doctor/checks/browser.d.ts +9 -0
  321. package/dist/doctor/checks/browser.d.ts.map +1 -0
  322. package/dist/doctor/checks/browser.js +54 -0
  323. package/dist/doctor/checks/browser.js.map +1 -0
  324. package/dist/doctor/checks/channels.d.ts +9 -0
  325. package/dist/doctor/checks/channels.d.ts.map +1 -0
  326. package/dist/doctor/checks/channels.js +90 -0
  327. package/dist/doctor/checks/channels.js.map +1 -0
  328. package/dist/doctor/checks/config.d.ts +10 -0
  329. package/dist/doctor/checks/config.d.ts.map +1 -0
  330. package/dist/doctor/checks/config.js +89 -0
  331. package/dist/doctor/checks/config.js.map +1 -0
  332. package/dist/doctor/checks/memory.d.ts +10 -0
  333. package/dist/doctor/checks/memory.d.ts.map +1 -0
  334. package/dist/doctor/checks/memory.js +82 -0
  335. package/dist/doctor/checks/memory.js.map +1 -0
  336. package/dist/doctor/checks/permissions.d.ts +9 -0
  337. package/dist/doctor/checks/permissions.d.ts.map +1 -0
  338. package/dist/doctor/checks/permissions.js +53 -0
  339. package/dist/doctor/checks/permissions.js.map +1 -0
  340. package/dist/doctor/checks/providers.d.ts +10 -0
  341. package/dist/doctor/checks/providers.d.ts.map +1 -0
  342. package/dist/doctor/checks/providers.js +93 -0
  343. package/dist/doctor/checks/providers.js.map +1 -0
  344. package/dist/doctor/checks/sessions.d.ts +10 -0
  345. package/dist/doctor/checks/sessions.d.ts.map +1 -0
  346. package/dist/doctor/checks/sessions.js +86 -0
  347. package/dist/doctor/checks/sessions.js.map +1 -0
  348. package/dist/doctor/doctor.d.ts +35 -0
  349. package/dist/doctor/doctor.d.ts.map +1 -0
  350. package/dist/doctor/doctor.js +51 -0
  351. package/dist/doctor/doctor.js.map +1 -0
  352. package/dist/doctor/repairs.d.ts +14 -0
  353. package/dist/doctor/repairs.d.ts.map +1 -0
  354. package/dist/doctor/repairs.js +34 -0
  355. package/dist/doctor/repairs.js.map +1 -0
  356. package/dist/gateway/compaction.d.ts +63 -0
  357. package/dist/gateway/compaction.d.ts.map +1 -0
  358. package/dist/gateway/compaction.js +235 -0
  359. package/dist/gateway/compaction.js.map +1 -0
  360. package/dist/gateway/gateway.d.ts +94 -0
  361. package/dist/gateway/gateway.d.ts.map +1 -0
  362. package/dist/gateway/gateway.js +466 -0
  363. package/dist/gateway/gateway.js.map +1 -0
  364. package/dist/gateway/lock.d.ts +24 -0
  365. package/dist/gateway/lock.d.ts.map +1 -0
  366. package/dist/gateway/lock.js +88 -0
  367. package/dist/gateway/lock.js.map +1 -0
  368. package/dist/gateway/protocol.d.ts +117 -0
  369. package/dist/gateway/protocol.d.ts.map +1 -0
  370. package/dist/gateway/protocol.js +5 -0
  371. package/dist/gateway/protocol.js.map +1 -0
  372. package/dist/gateway/session.d.ts +123 -0
  373. package/dist/gateway/session.d.ts.map +1 -0
  374. package/dist/gateway/session.js +573 -0
  375. package/dist/gateway/session.js.map +1 -0
  376. package/dist/hooks/hooks.d.ts +18 -0
  377. package/dist/hooks/hooks.d.ts.map +1 -0
  378. package/dist/hooks/hooks.js +45 -0
  379. package/dist/hooks/hooks.js.map +1 -0
  380. package/dist/hooks/types.d.ts +112 -0
  381. package/dist/hooks/types.d.ts.map +1 -0
  382. package/dist/hooks/types.js +23 -0
  383. package/dist/hooks/types.js.map +1 -0
  384. package/dist/index.d.ts +27 -0
  385. package/dist/index.d.ts.map +1 -0
  386. package/dist/index.js +2900 -0
  387. package/dist/index.js.map +1 -0
  388. package/dist/media/storage.d.ts +25 -0
  389. package/dist/media/storage.d.ts.map +1 -0
  390. package/dist/media/storage.js +97 -0
  391. package/dist/media/storage.js.map +1 -0
  392. package/dist/memory/embeddings.d.ts +46 -0
  393. package/dist/memory/embeddings.d.ts.map +1 -0
  394. package/dist/memory/embeddings.js +118 -0
  395. package/dist/memory/embeddings.js.map +1 -0
  396. package/dist/memory/hybrid.d.ts +35 -0
  397. package/dist/memory/hybrid.d.ts.map +1 -0
  398. package/dist/memory/hybrid.js +156 -0
  399. package/dist/memory/hybrid.js.map +1 -0
  400. package/dist/memory/markdown.d.ts +48 -0
  401. package/dist/memory/markdown.d.ts.map +1 -0
  402. package/dist/memory/markdown.js +228 -0
  403. package/dist/memory/markdown.js.map +1 -0
  404. package/dist/memory/store.d.ts +88 -0
  405. package/dist/memory/store.d.ts.map +1 -0
  406. package/dist/memory/store.js +21 -0
  407. package/dist/memory/store.js.map +1 -0
  408. package/dist/memory/vector.d.ts +24 -0
  409. package/dist/memory/vector.d.ts.map +1 -0
  410. package/dist/memory/vector.js +63 -0
  411. package/dist/memory/vector.js.map +1 -0
  412. package/dist/mods/mod.d.ts +100 -0
  413. package/dist/mods/mod.d.ts.map +1 -0
  414. package/dist/mods/mod.js +242 -0
  415. package/dist/mods/mod.js.map +1 -0
  416. package/dist/onboard/channels.d.ts +12 -0
  417. package/dist/onboard/channels.d.ts.map +1 -0
  418. package/dist/onboard/channels.js +283 -0
  419. package/dist/onboard/channels.js.map +1 -0
  420. package/dist/onboard/models.d.ts +13 -0
  421. package/dist/onboard/models.d.ts.map +1 -0
  422. package/dist/onboard/models.js +491 -0
  423. package/dist/onboard/models.js.map +1 -0
  424. package/dist/onboard/onboard.d.ts +12 -0
  425. package/dist/onboard/onboard.d.ts.map +1 -0
  426. package/dist/onboard/onboard.js +1137 -0
  427. package/dist/onboard/onboard.js.map +1 -0
  428. package/dist/providers/anthropic.d.ts +83 -0
  429. package/dist/providers/anthropic.d.ts.map +1 -0
  430. package/dist/providers/anthropic.js +583 -0
  431. package/dist/providers/anthropic.js.map +1 -0
  432. package/dist/providers/failover.d.ts +46 -0
  433. package/dist/providers/failover.d.ts.map +1 -0
  434. package/dist/providers/failover.js +149 -0
  435. package/dist/providers/failover.js.map +1 -0
  436. package/dist/providers/litellm.d.ts +38 -0
  437. package/dist/providers/litellm.d.ts.map +1 -0
  438. package/dist/providers/litellm.js +349 -0
  439. package/dist/providers/litellm.js.map +1 -0
  440. package/dist/providers/openai.d.ts +28 -0
  441. package/dist/providers/openai.d.ts.map +1 -0
  442. package/dist/providers/openai.js +321 -0
  443. package/dist/providers/openai.js.map +1 -0
  444. package/dist/providers/prompt-cache.d.ts +50 -0
  445. package/dist/providers/prompt-cache.d.ts.map +1 -0
  446. package/dist/providers/prompt-cache.js +96 -0
  447. package/dist/providers/prompt-cache.js.map +1 -0
  448. package/dist/providers/provider.d.ts +173 -0
  449. package/dist/providers/provider.d.ts.map +1 -0
  450. package/dist/providers/provider.js +22 -0
  451. package/dist/providers/provider.js.map +1 -0
  452. package/dist/sandbox/config.d.ts +42 -0
  453. package/dist/sandbox/config.d.ts.map +1 -0
  454. package/dist/sandbox/config.js +20 -0
  455. package/dist/sandbox/config.js.map +1 -0
  456. package/dist/sandbox/container.d.ts +71 -0
  457. package/dist/sandbox/container.d.ts.map +1 -0
  458. package/dist/sandbox/container.js +193 -0
  459. package/dist/sandbox/container.js.map +1 -0
  460. package/dist/sandbox/sandbox.d.ts +82 -0
  461. package/dist/sandbox/sandbox.d.ts.map +1 -0
  462. package/dist/sandbox/sandbox.js +176 -0
  463. package/dist/sandbox/sandbox.js.map +1 -0
  464. package/dist/skills/channel-loader.d.ts +18 -0
  465. package/dist/skills/channel-loader.d.ts.map +1 -0
  466. package/dist/skills/channel-loader.js +35 -0
  467. package/dist/skills/channel-loader.js.map +1 -0
  468. package/dist/skills/extension-loader.d.ts +15 -0
  469. package/dist/skills/extension-loader.d.ts.map +1 -0
  470. package/dist/skills/extension-loader.js +63 -0
  471. package/dist/skills/extension-loader.js.map +1 -0
  472. package/dist/skills/extension-registry.d.ts +32 -0
  473. package/dist/skills/extension-registry.d.ts.map +1 -0
  474. package/dist/skills/extension-registry.js +57 -0
  475. package/dist/skills/extension-registry.js.map +1 -0
  476. package/dist/skills/extensions.d.ts +91 -0
  477. package/dist/skills/extensions.d.ts.map +1 -0
  478. package/dist/skills/extensions.js +14 -0
  479. package/dist/skills/extensions.js.map +1 -0
  480. package/dist/skills/loader.d.ts +64 -0
  481. package/dist/skills/loader.d.ts.map +1 -0
  482. package/dist/skills/loader.js +382 -0
  483. package/dist/skills/loader.js.map +1 -0
  484. package/dist/skills/marketplace.d.ts +56 -0
  485. package/dist/skills/marketplace.d.ts.map +1 -0
  486. package/dist/skills/marketplace.js +183 -0
  487. package/dist/skills/marketplace.js.map +1 -0
  488. package/dist/skills/types.d.ts +94 -0
  489. package/dist/skills/types.d.ts.map +1 -0
  490. package/dist/skills/types.js +9 -0
  491. package/dist/skills/types.js.map +1 -0
  492. package/dist/tools/acp-sessions.d.ts +89 -0
  493. package/dist/tools/acp-sessions.d.ts.map +1 -0
  494. package/dist/tools/acp-sessions.js +391 -0
  495. package/dist/tools/acp-sessions.js.map +1 -0
  496. package/dist/tools/acp.d.ts +18 -0
  497. package/dist/tools/acp.d.ts.map +1 -0
  498. package/dist/tools/acp.js +102 -0
  499. package/dist/tools/acp.js.map +1 -0
  500. package/dist/tools/agent-tools.d.ts +24 -0
  501. package/dist/tools/agent-tools.d.ts.map +1 -0
  502. package/dist/tools/agent-tools.js +611 -0
  503. package/dist/tools/agent-tools.js.map +1 -0
  504. package/dist/tools/browser.d.ts +26 -0
  505. package/dist/tools/browser.d.ts.map +1 -0
  506. package/dist/tools/browser.js +242 -0
  507. package/dist/tools/browser.js.map +1 -0
  508. package/dist/tools/comms.d.ts +8 -0
  509. package/dist/tools/comms.d.ts.map +1 -0
  510. package/dist/tools/comms.js +39 -0
  511. package/dist/tools/comms.js.map +1 -0
  512. package/dist/tools/cron-tools.d.ts +9 -0
  513. package/dist/tools/cron-tools.d.ts.map +1 -0
  514. package/dist/tools/cron-tools.js +117 -0
  515. package/dist/tools/cron-tools.js.map +1 -0
  516. package/dist/tools/exec-safety.d.ts +71 -0
  517. package/dist/tools/exec-safety.d.ts.map +1 -0
  518. package/dist/tools/exec-safety.js +141 -0
  519. package/dist/tools/exec-safety.js.map +1 -0
  520. package/dist/tools/exec.d.ts +24 -0
  521. package/dist/tools/exec.d.ts.map +1 -0
  522. package/dist/tools/exec.js +191 -0
  523. package/dist/tools/exec.js.map +1 -0
  524. package/dist/tools/fs.d.ts +15 -0
  525. package/dist/tools/fs.d.ts.map +1 -0
  526. package/dist/tools/fs.js +249 -0
  527. package/dist/tools/fs.js.map +1 -0
  528. package/dist/tools/git.d.ts +9 -0
  529. package/dist/tools/git.d.ts.map +1 -0
  530. package/dist/tools/git.js +56 -0
  531. package/dist/tools/git.js.map +1 -0
  532. package/dist/tools/image.d.ts +15 -0
  533. package/dist/tools/image.d.ts.map +1 -0
  534. package/dist/tools/image.js +106 -0
  535. package/dist/tools/image.js.map +1 -0
  536. package/dist/tools/introspect.d.ts +22 -0
  537. package/dist/tools/introspect.d.ts.map +1 -0
  538. package/dist/tools/introspect.js +223 -0
  539. package/dist/tools/introspect.js.map +1 -0
  540. package/dist/tools/memory.d.ts +11 -0
  541. package/dist/tools/memory.d.ts.map +1 -0
  542. package/dist/tools/memory.js +101 -0
  543. package/dist/tools/memory.js.map +1 -0
  544. package/dist/tools/message.d.ts +24 -0
  545. package/dist/tools/message.d.ts.map +1 -0
  546. package/dist/tools/message.js +205 -0
  547. package/dist/tools/message.js.map +1 -0
  548. package/dist/tools/model.d.ts +14 -0
  549. package/dist/tools/model.d.ts.map +1 -0
  550. package/dist/tools/model.js +62 -0
  551. package/dist/tools/model.js.map +1 -0
  552. package/dist/tools/policy.d.ts +101 -0
  553. package/dist/tools/policy.d.ts.map +1 -0
  554. package/dist/tools/policy.js +168 -0
  555. package/dist/tools/policy.js.map +1 -0
  556. package/dist/tools/registry.d.ts +52 -0
  557. package/dist/tools/registry.d.ts.map +1 -0
  558. package/dist/tools/registry.js +154 -0
  559. package/dist/tools/registry.js.map +1 -0
  560. package/dist/tools/search.d.ts +10 -0
  561. package/dist/tools/search.d.ts.map +1 -0
  562. package/dist/tools/search.js +78 -0
  563. package/dist/tools/search.js.map +1 -0
  564. package/dist/tools/session.d.ts +13 -0
  565. package/dist/tools/session.d.ts.map +1 -0
  566. package/dist/tools/session.js +142 -0
  567. package/dist/tools/session.js.map +1 -0
  568. package/dist/tools/spawn.d.ts +10 -0
  569. package/dist/tools/spawn.d.ts.map +1 -0
  570. package/dist/tools/spawn.js +72 -0
  571. package/dist/tools/spawn.js.map +1 -0
  572. package/dist/tools/symphony.d.ts +12 -0
  573. package/dist/tools/symphony.d.ts.map +1 -0
  574. package/dist/tools/symphony.js +142 -0
  575. package/dist/tools/symphony.js.map +1 -0
  576. package/dist/tools/system-tools.d.ts +11 -0
  577. package/dist/tools/system-tools.d.ts.map +1 -0
  578. package/dist/tools/system-tools.js +39 -0
  579. package/dist/tools/system-tools.js.map +1 -0
  580. package/dist/tools/tool.d.ts +119 -0
  581. package/dist/tools/tool.d.ts.map +1 -0
  582. package/dist/tools/tool.js +29 -0
  583. package/dist/tools/tool.js.map +1 -0
  584. package/dist/tools/web.d.ts +10 -0
  585. package/dist/tools/web.d.ts.map +1 -0
  586. package/dist/tools/web.js +105 -0
  587. package/dist/tools/web.js.map +1 -0
  588. package/dist/tui/App.d.ts +43 -0
  589. package/dist/tui/App.d.ts.map +1 -0
  590. package/dist/tui/App.js +265 -0
  591. package/dist/tui/App.js.map +1 -0
  592. package/dist/tui/bridge.d.ts +40 -0
  593. package/dist/tui/bridge.d.ts.map +1 -0
  594. package/dist/tui/bridge.js +29 -0
  595. package/dist/tui/bridge.js.map +1 -0
  596. package/dist/tui/components/Header.d.ts +14 -0
  597. package/dist/tui/components/Header.d.ts.map +1 -0
  598. package/dist/tui/components/Header.js +7 -0
  599. package/dist/tui/components/Header.js.map +1 -0
  600. package/dist/tui/components/InputBar.d.ts +10 -0
  601. package/dist/tui/components/InputBar.d.ts.map +1 -0
  602. package/dist/tui/components/InputBar.js +121 -0
  603. package/dist/tui/components/InputBar.js.map +1 -0
  604. package/dist/tui/components/MessageList.d.ts +18 -0
  605. package/dist/tui/components/MessageList.d.ts.map +1 -0
  606. package/dist/tui/components/MessageList.js +34 -0
  607. package/dist/tui/components/MessageList.js.map +1 -0
  608. package/dist/tui/components/Spinner.d.ts +9 -0
  609. package/dist/tui/components/Spinner.d.ts.map +1 -0
  610. package/dist/tui/components/Spinner.js +18 -0
  611. package/dist/tui/components/Spinner.js.map +1 -0
  612. package/dist/tui/components/StatusBar.d.ts +16 -0
  613. package/dist/tui/components/StatusBar.d.ts.map +1 -0
  614. package/dist/tui/components/StatusBar.js +15 -0
  615. package/dist/tui/components/StatusBar.js.map +1 -0
  616. package/dist/tui/components/ToolCallBox.d.ts +12 -0
  617. package/dist/tui/components/ToolCallBox.d.ts.map +1 -0
  618. package/dist/tui/components/ToolCallBox.js +12 -0
  619. package/dist/tui/components/ToolCallBox.js.map +1 -0
  620. package/dist/tui/theme.d.ts +58 -0
  621. package/dist/tui/theme.d.ts.map +1 -0
  622. package/dist/tui/theme.js +80 -0
  623. package/dist/tui/theme.js.map +1 -0
  624. package/dist/utils/logger.d.ts +16 -0
  625. package/dist/utils/logger.d.ts.map +1 -0
  626. package/dist/utils/logger.js +70 -0
  627. package/dist/utils/logger.js.map +1 -0
  628. package/docs/DEVELOPMENT.md +74 -0
  629. package/docs/INSTALL.md +161 -0
  630. package/docs/USAGE.md +94 -0
  631. package/docs/architecture.md +128 -0
  632. package/docs/channels.md +140 -0
  633. package/docs/configuration.md +209 -0
  634. package/docs/io-system.md +430 -0
  635. package/docs/providers.md +99 -0
  636. package/docs/skill-channels.md +113 -0
  637. package/docs/skills.md +246 -0
  638. package/package.json +89 -0
  639. package/skills/acp-router/SKILL.md +41 -0
  640. package/skills/acp-router/tools/acp-router.mjs +239 -0
  641. package/skills/find-skills/SKILL.md +133 -0
  642. package/skills/security-audit/SKILL.md +181 -0
  643. package/skills/security-audit/audit.sh +67 -0
  644. package/skills/skill-creator/SKILL.md +479 -0
  645. package/skills/skill-security-audit/.clawhub/origin.json +7 -0
  646. package/skills/skill-security-audit/SKILL.md +196 -0
  647. package/skills/skill-security-audit/_meta.json +6 -0
  648. package/skills/skill-security-audit/references/prompt-injection-patterns.md +276 -0
  649. package/skills/skill-security-audit/references/vulnerability-patterns.md +348 -0
  650. package/skills/symphony/README.md +53 -0
  651. package/skills/symphony/SKILL.md +75 -0
  652. package/skills/symphony/tools/symphony-orchestrator.ts +8 -0
  653. package/tako.example.json +33 -0
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Tool Execution Cache — caches command results keyed by SHA256(command+args+cwd).
3
+ *
4
+ * Features:
5
+ * - Per-command TTL overrides (git status 10s, ls 30s, grep 15s, etc.)
6
+ * - Blocklist for side-effect commands (test, build, make, etc.)
7
+ * - Auto-invalidation on file writes in the same cwd
8
+ */
9
+ import { createHash } from 'node:crypto';
10
+ // ─── Default TTL overrides by command prefix ────────────────────────
11
+ const DEFAULT_TTL_OVERRIDES = {
12
+ 'git status': 10,
13
+ 'git log': 15,
14
+ 'git diff': 10,
15
+ 'git branch': 15,
16
+ 'ls': 30,
17
+ 'find': 15,
18
+ 'grep': 15,
19
+ 'rg': 15,
20
+ 'wc': 30,
21
+ 'cat': 60,
22
+ 'head': 60,
23
+ 'tail': 60,
24
+ 'file': 60,
25
+ 'which': 120,
26
+ 'type': 120,
27
+ };
28
+ // ─── Tool Execution Cache ───────────────────────────────────────────
29
+ export class ToolCache {
30
+ config;
31
+ cache = new Map();
32
+ hits = 0;
33
+ misses = 0;
34
+ blocked = 0;
35
+ evictions = 0;
36
+ constructor(config) {
37
+ this.config = config;
38
+ }
39
+ /**
40
+ * Build a cache key from command, args, and cwd.
41
+ */
42
+ static buildKey(command, cwd) {
43
+ return createHash('sha256')
44
+ .update(`${command}\0${cwd}`)
45
+ .digest('hex');
46
+ }
47
+ /**
48
+ * Check if a command is blocklisted (should never be cached).
49
+ */
50
+ isBlocked(command) {
51
+ const trimmed = command.trim();
52
+ return this.config.blocklist.some((pattern) => trimmed.startsWith(pattern) || trimmed.includes(` && ${pattern}`) || trimmed.includes(`; ${pattern}`));
53
+ }
54
+ /**
55
+ * Get the TTL for a command in milliseconds.
56
+ */
57
+ getTtlMs(command) {
58
+ const trimmed = command.trim();
59
+ const overrides = { ...DEFAULT_TTL_OVERRIDES, ...this.config.ttlOverrides };
60
+ // Match longest prefix first
61
+ let bestMatch = '';
62
+ let bestTtl = this.config.defaultTtlSeconds;
63
+ for (const [prefix, ttlSeconds] of Object.entries(overrides)) {
64
+ if (trimmed.startsWith(prefix) && prefix.length > bestMatch.length) {
65
+ bestMatch = prefix;
66
+ bestTtl = ttlSeconds;
67
+ }
68
+ }
69
+ return bestTtl * 1000;
70
+ }
71
+ /**
72
+ * Get a cached result if valid, or null if stale/missing/blocked.
73
+ */
74
+ get(command, cwd) {
75
+ if (!this.config.enabled)
76
+ return null;
77
+ if (this.isBlocked(command)) {
78
+ this.blocked++;
79
+ return null;
80
+ }
81
+ const key = ToolCache.buildKey(command, cwd);
82
+ const entry = this.cache.get(key);
83
+ if (!entry) {
84
+ this.misses++;
85
+ return null;
86
+ }
87
+ // Check TTL
88
+ if (Date.now() - entry.cachedAt > entry.ttlMs) {
89
+ this.cache.delete(key);
90
+ this.misses++;
91
+ return null;
92
+ }
93
+ this.hits++;
94
+ return entry;
95
+ }
96
+ /**
97
+ * Store a command result in cache.
98
+ */
99
+ set(command, cwd, output, success, error) {
100
+ if (!this.config.enabled)
101
+ return;
102
+ if (this.isBlocked(command))
103
+ return;
104
+ const key = ToolCache.buildKey(command, cwd);
105
+ const ttlMs = this.getTtlMs(command);
106
+ this.cache.set(key, {
107
+ output,
108
+ success,
109
+ error,
110
+ cachedAt: Date.now(),
111
+ ttlMs,
112
+ commandKey: command.slice(0, 80),
113
+ });
114
+ }
115
+ /**
116
+ * Invalidate all cached commands for a given cwd (e.g. after file write).
117
+ */
118
+ invalidateCwd(cwd) {
119
+ // We can't reconstruct keys from cwd alone, so scan all entries
120
+ for (const [key, entry] of this.cache) {
121
+ // commandKey is the truncated command; we hash with cwd
122
+ // Since we can't reverse the hash, mark all entries as expired by setting cachedAt to 0
123
+ // Actually, let's just clear all — simpler and correct since writes affect the directory
124
+ }
125
+ // Clear all entries — writes can affect any command's output
126
+ this.cache.clear();
127
+ }
128
+ /**
129
+ * Clear the entire cache.
130
+ */
131
+ clear() {
132
+ this.cache.clear();
133
+ }
134
+ /**
135
+ * Run auto-clean: remove expired entries.
136
+ */
137
+ autoClean() {
138
+ const now = Date.now();
139
+ let cleaned = 0;
140
+ for (const [key, entry] of this.cache) {
141
+ if (now - entry.cachedAt > entry.ttlMs) {
142
+ this.cache.delete(key);
143
+ cleaned++;
144
+ this.evictions++;
145
+ }
146
+ }
147
+ return cleaned;
148
+ }
149
+ /**
150
+ * Get cache statistics.
151
+ */
152
+ getStats() {
153
+ const total = this.hits + this.misses;
154
+ return {
155
+ entries: this.cache.size,
156
+ hits: this.hits,
157
+ misses: this.misses,
158
+ blocked: this.blocked,
159
+ evictions: this.evictions,
160
+ hitRate: total > 0 ? this.hits / total : 0,
161
+ };
162
+ }
163
+ /**
164
+ * Reset counters (for testing).
165
+ */
166
+ resetStats() {
167
+ this.hits = 0;
168
+ this.misses = 0;
169
+ this.blocked = 0;
170
+ this.evictions = 0;
171
+ }
172
+ }
173
+ //# sourceMappingURL=tool-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cache.js","sourceRoot":"","sources":["../../src/cache/tool-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAuBzC,uEAAuE;AAEvE,MAAM,qBAAqB,GAA2B;IACpD,YAAY,EAAE,EAAE;IAChB,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;IACd,YAAY,EAAE,EAAE;IAChB,IAAI,EAAE,EAAE;IACR,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,GAAG;IACZ,MAAM,EAAE,GAAG;CACZ,CAAC;AAEF,uEAAuE;AAEvE,MAAM,OAAO,SAAS;IACZ,MAAM,CAAkB;IACxB,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC1C,IAAI,GAAG,CAAC,CAAC;IACT,MAAM,GAAG,CAAC,CAAC;IACX,OAAO,GAAG,CAAC,CAAC;IACZ,SAAS,GAAG,CAAC,CAAC;IAEtB,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAe,EAAE,GAAW;QAC1C,OAAO,UAAU,CAAC,QAAQ,CAAC;aACxB,MAAM,CAAC,GAAG,OAAO,KAAK,GAAG,EAAE,CAAC;aAC5B,MAAM,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAe;QACvB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5C,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,OAAO,EAAE,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,OAAO,EAAE,CAAC,CACtG,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,OAAe;QACtB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,EAAE,GAAG,qBAAqB,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAE5E,6BAA6B;QAC7B,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAE5C,KAAK,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7D,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;gBACnE,SAAS,GAAG,MAAM,CAAC;gBACnB,OAAO,GAAG,UAAU,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,OAAe,EAAE,GAAW;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAEtC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QAED,YAAY;QACZ,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,OAAe,EAAE,GAAW,EAAE,MAAc,EAAE,OAAgB,EAAE,KAAc;QAChF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QACjC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,OAAO;QAEpC,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAErC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,MAAM;YACN,OAAO;YACP,KAAK;YACL,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;YACpB,KAAK;YACL,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACjC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,GAAW;QACvB,gEAAgE;QAChE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,wDAAwD;YACxD,wFAAwF;YACxF,yFAAyF;QAC3F,CAAC;QACD,6DAA6D;QAC7D,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,SAAS;QACP,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,IAAI,GAAG,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBACvC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACvB,OAAO,EAAE,CAAC;gBACV,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACtC,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACxB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Channel — messaging I/O trait.
3
+ *
4
+ * One interface, many adapters (Discord, Telegram, CLI, WebChat, etc.).
5
+ * Channels run simultaneously through the Gateway, each handling its own
6
+ * authentication, rate limiting, and message formatting.
7
+ *
8
+ * Each channel:
9
+ * - Connects to a platform and listens for messages
10
+ * - Converts platform-specific payloads to InboundMessage
11
+ * - Sends OutboundMessage back through the platform
12
+ * - Handles reconnection and error recovery independently
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const cli = new CLIChannel();
17
+ * cli.onMessage(async (msg) => {
18
+ * console.log(`User said: ${msg.content}`);
19
+ * await cli.send({ target: msg.channelId, content: 'Hello!' });
20
+ * });
21
+ * await cli.connect();
22
+ * ```
23
+ */
24
+ /** An inbound message received from any channel. */
25
+ export interface InboundMessage {
26
+ /** Unique message ID (platform-specific, e.g. Discord snowflake) */
27
+ id: string;
28
+ /** Channel identifier with optional platform prefix (e.g. 'cli', 'discord:123') */
29
+ channelId: string;
30
+ /** Author information */
31
+ author: {
32
+ /** Platform-specific user ID */
33
+ id: string;
34
+ /** Display name */
35
+ name: string;
36
+ /** Additional platform-specific metadata */
37
+ meta?: Record<string, unknown>;
38
+ };
39
+ /** Message text content */
40
+ content: string;
41
+ /** File or media attachments */
42
+ attachments?: Attachment[];
43
+ /** ISO-8601 timestamp of when the message was sent */
44
+ timestamp: string;
45
+ /** Platform-specific raw payload (for advanced use) */
46
+ raw?: unknown;
47
+ /** Platform thread/topic ID (e.g., Telegram forum topic). */
48
+ threadId?: string;
49
+ }
50
+ /** An outbound message to send through a channel. */
51
+ export interface OutboundMessage {
52
+ /** Target conversation, thread, or chat ID */
53
+ target: string;
54
+ /** Text content to send */
55
+ content: string;
56
+ /** Optional message ID to reply to */
57
+ replyTo?: string;
58
+ /** Optional file or media attachments */
59
+ attachments?: Attachment[];
60
+ }
61
+ /** A file or media attachment on a message. */
62
+ export interface Attachment {
63
+ /** Attachment type */
64
+ type: 'image' | 'file' | 'audio' | 'video';
65
+ /** URL to the attachment (if hosted) */
66
+ url?: string;
67
+ /** Raw binary data (for inline attachments) */
68
+ data?: Buffer;
69
+ /** Original filename */
70
+ filename?: string;
71
+ /** MIME type (e.g. 'image/png', 'application/pdf') */
72
+ mimeType?: string;
73
+ }
74
+ /** Callback for handling inbound messages. */
75
+ export type MessageHandler = (msg: InboundMessage) => void | Promise<void>;
76
+ /**
77
+ * Channel — the messaging I/O trait.
78
+ *
79
+ * Implementations adapt a specific messaging platform into Tako's
80
+ * unified message handling interface. Multiple channels can run
81
+ * simultaneously, each receiving and sending messages independently.
82
+ *
83
+ * Built-in implementations:
84
+ * - {@link CLIChannel} — terminal readline interface
85
+ * - {@link DiscordChannel} — Discord bot via discord.js
86
+ * - {@link TelegramChannel} — Telegram bot via grammY
87
+ */
88
+ export interface Channel {
89
+ /** Unique channel identifier (e.g. 'discord', 'telegram', 'cli') */
90
+ id: string;
91
+ /** If set, all messages on this channel route to this specific agent. */
92
+ agentId?: string;
93
+ /**
94
+ * Connect to the messaging platform.
95
+ * For CLI, this starts the readline interface (blocking).
96
+ * For Discord/Telegram, this authenticates and starts listening.
97
+ */
98
+ connect(): Promise<void>;
99
+ /**
100
+ * Disconnect cleanly from the platform.
101
+ * Releases resources and stops listening for messages.
102
+ */
103
+ disconnect(): Promise<void>;
104
+ /**
105
+ * Send an outbound message through the channel.
106
+ * Handles platform-specific formatting (message splitting, Markdown, etc.).
107
+ *
108
+ * @param msg - The message to send
109
+ */
110
+ send(msg: OutboundMessage): Promise<void>;
111
+ /**
112
+ * Register a handler for inbound messages.
113
+ * Only one handler is typically registered (the agent loop router).
114
+ *
115
+ * @param handler - Callback invoked for each incoming message
116
+ */
117
+ onMessage(handler: MessageHandler): void;
118
+ /**
119
+ * Send a typing indicator to the given chat/channel.
120
+ * Optional — channels that don't support typing can omit this.
121
+ */
122
+ sendTyping?(chatId: string): Promise<void>;
123
+ /**
124
+ * Add a reaction emoji to a message.
125
+ * Optional — channels that don't support reactions can omit this.
126
+ */
127
+ addReaction?(chatId: string, messageId: string, emoji: string): Promise<void>;
128
+ /**
129
+ * Remove a reaction emoji from a message.
130
+ * Optional — channels that don't support reactions can omit this.
131
+ */
132
+ removeReaction?(chatId: string, messageId: string, emoji: string): Promise<void>;
133
+ /**
134
+ * Broadcast a system message to all configured default channels.
135
+ * Used for startup/shutdown notices. Optional — CLI can omit.
136
+ */
137
+ broadcast?(text: string): Promise<void>;
138
+ /**
139
+ * Edit an existing message (for streaming updates).
140
+ * Optional — channels that don't support editing can omit this.
141
+ *
142
+ * @param chatId - Target chat/channel ID
143
+ * @param messageId - The message to edit
144
+ * @param content - New content for the message
145
+ */
146
+ editMessage?(chatId: string, messageId: string, content: string): Promise<void>;
147
+ /**
148
+ * Send a message and return the message ID (for subsequent edits).
149
+ * Optional — channels that don't support message IDs can omit this.
150
+ *
151
+ * @param msg - The message to send
152
+ * @returns Platform-specific message ID
153
+ */
154
+ sendAndGetId?(msg: OutboundMessage): Promise<string>;
155
+ }
156
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/channels/channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Channel — messaging I/O trait.
3
+ *
4
+ * One interface, many adapters (Discord, Telegram, CLI, WebChat, etc.).
5
+ * Channels run simultaneously through the Gateway, each handling its own
6
+ * authentication, rate limiting, and message formatting.
7
+ *
8
+ * Each channel:
9
+ * - Connects to a platform and listens for messages
10
+ * - Converts platform-specific payloads to InboundMessage
11
+ * - Sends OutboundMessage back through the platform
12
+ * - Handles reconnection and error recovery independently
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const cli = new CLIChannel();
17
+ * cli.onMessage(async (msg) => {
18
+ * console.log(`User said: ${msg.content}`);
19
+ * await cli.send({ target: msg.channelId, content: 'Hello!' });
20
+ * });
21
+ * await cli.connect();
22
+ * ```
23
+ */
24
+ export {};
25
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channels/channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * CLI channel — terminal/stdin adapter.
3
+ *
4
+ * The simplest channel: reads from stdin, writes to stdout.
5
+ * Properly awaits async message handlers and re-prompts after completion.
6
+ */
7
+ import type { Channel, OutboundMessage, MessageHandler } from './channel.js';
8
+ export declare class CLIChannel implements Channel {
9
+ id: string;
10
+ private rl;
11
+ private handlers;
12
+ private promptStr;
13
+ private busy;
14
+ constructor(opts?: {
15
+ prompt?: string;
16
+ });
17
+ connect(): Promise<void>;
18
+ /** Display the prompt. */
19
+ showPrompt(): void;
20
+ disconnect(): Promise<void>;
21
+ send(msg: OutboundMessage): Promise<void>;
22
+ /**
23
+ * Send a message and return a synthetic ID.
24
+ * CLI doesn't have real message IDs, but this enables the streaming
25
+ * interface. Subsequent editMessage calls overwrite the current line.
26
+ */
27
+ sendAndGetId(msg: OutboundMessage): Promise<string>;
28
+ /**
29
+ * Edit the current streaming message by clearing and rewriting.
30
+ * For CLI, we use carriage return to overwrite the current output.
31
+ */
32
+ editMessage(_chatId: string, _messageId: string, content: string): Promise<void>;
33
+ onMessage(handler: MessageHandler): void;
34
+ }
35
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/channels/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAkB,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE7F,qBAAa,UAAW,YAAW,OAAO;IACxC,EAAE,SAAS;IACX,OAAO,CAAC,EAAE,CAAkC;IAC5C,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAIhC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiD9B,0BAA0B;IAC1B,UAAU,IAAI,IAAI;IAIZ,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C;;;;OAIG;IACG,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAKzD;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtF,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;CAGzC"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * CLI channel — terminal/stdin adapter.
3
+ *
4
+ * The simplest channel: reads from stdin, writes to stdout.
5
+ * Properly awaits async message handlers and re-prompts after completion.
6
+ */
7
+ import { createInterface } from 'node:readline';
8
+ export class CLIChannel {
9
+ id = 'cli';
10
+ rl = null;
11
+ handlers = [];
12
+ promptStr;
13
+ busy = false;
14
+ constructor(opts) {
15
+ this.promptStr = opts?.prompt ?? 'tako> ';
16
+ }
17
+ async connect() {
18
+ this.rl = createInterface({
19
+ input: process.stdin,
20
+ output: process.stdout,
21
+ prompt: this.promptStr,
22
+ });
23
+ this.rl.on('line', async (line) => {
24
+ const trimmed = line.trim();
25
+ if (!trimmed) {
26
+ this.showPrompt();
27
+ return;
28
+ }
29
+ // Prevent overlapping handler executions
30
+ if (this.busy)
31
+ return;
32
+ this.busy = true;
33
+ const msg = {
34
+ id: crypto.randomUUID(),
35
+ channelId: 'cli',
36
+ author: { id: 'local', name: 'user' },
37
+ content: trimmed,
38
+ timestamp: new Date().toISOString(),
39
+ };
40
+ try {
41
+ for (const handler of this.handlers) {
42
+ await handler(msg);
43
+ }
44
+ }
45
+ catch (err) {
46
+ console.error('[tako] Error:', err instanceof Error ? err.message : err);
47
+ }
48
+ finally {
49
+ this.busy = false;
50
+ this.showPrompt();
51
+ }
52
+ });
53
+ this.rl.on('close', () => {
54
+ // Only exit if CLI is the sole channel (no Discord/Telegram).
55
+ // In Docker or daemon mode, stdin closes immediately — don't kill the process.
56
+ if (!process.env['TAKO_KEEP_ALIVE']) {
57
+ process.exit(0);
58
+ }
59
+ });
60
+ this.showPrompt();
61
+ }
62
+ /** Display the prompt. */
63
+ showPrompt() {
64
+ this.rl?.prompt();
65
+ }
66
+ async disconnect() {
67
+ this.rl?.close();
68
+ this.rl = null;
69
+ }
70
+ async send(msg) {
71
+ process.stdout.write(msg.content + '\n');
72
+ }
73
+ /**
74
+ * Send a message and return a synthetic ID.
75
+ * CLI doesn't have real message IDs, but this enables the streaming
76
+ * interface. Subsequent editMessage calls overwrite the current line.
77
+ */
78
+ async sendAndGetId(msg) {
79
+ process.stdout.write(msg.content);
80
+ return 'cli-stream';
81
+ }
82
+ /**
83
+ * Edit the current streaming message by clearing and rewriting.
84
+ * For CLI, we use carriage return to overwrite the current output.
85
+ */
86
+ async editMessage(_chatId, _messageId, content) {
87
+ // Move cursor to start of line, clear, and rewrite
88
+ process.stdout.write('\r\x1b[K' + content);
89
+ }
90
+ onMessage(handler) {
91
+ this.handlers.push(handler);
92
+ }
93
+ }
94
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/channels/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Delivery queue — async message delivery with retry.
3
+ *
4
+ * When channel.send() fails, the message is queued as a JSON file
5
+ * in ~/.tako/delivery-queue/. A background worker retries every 30s
6
+ * with max 3 attempts. Failed messages move to ~/.tako/delivery-queue/failed/.
7
+ */
8
+ import type { Channel, OutboundMessage } from './channel.js';
9
+ export declare class DeliveryQueue {
10
+ private channels;
11
+ private retryTimer;
12
+ private queueDir;
13
+ private failedDir;
14
+ constructor();
15
+ /** Register a channel for retry delivery. */
16
+ registerChannel(channel: Channel): void;
17
+ /** Start the background retry worker. */
18
+ start(): Promise<void>;
19
+ /** Stop the background retry worker. */
20
+ stop(): void;
21
+ /**
22
+ * Enqueue a failed message for retry.
23
+ * Called when channel.send() throws.
24
+ */
25
+ enqueue(channelId: string, message: OutboundMessage, error: string): Promise<void>;
26
+ /** Process all queued messages, retrying delivery. */
27
+ private processQueue;
28
+ /** Move a message to the failed directory. */
29
+ private moveFailed;
30
+ }
31
+ //# sourceMappingURL=delivery-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-queue.d.ts","sourceRoot":"","sources":["../../src/channels/delivery-queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AA8B7D,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;;IAO1B,6CAA6C;IAC7C,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIvC,yCAAyC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,wCAAwC;IACxC,IAAI,IAAI,IAAI;IAOZ;;;OAGG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBxF,sDAAsD;YACxC,YAAY;IA+C1B,8CAA8C;YAChC,UAAU;CAOzB"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Delivery queue — async message delivery with retry.
3
+ *
4
+ * When channel.send() fails, the message is queued as a JSON file
5
+ * in ~/.tako/delivery-queue/. A background worker retries every 30s
6
+ * with max 3 attempts. Failed messages move to ~/.tako/delivery-queue/failed/.
7
+ */
8
+ import { homedir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ import { mkdir, readFile, writeFile, readdir, unlink } from 'node:fs/promises';
11
+ // ─── Paths ──────────────────────────────────────────────────────────
12
+ function getQueueDir() {
13
+ return join(homedir(), '.tako', 'delivery-queue');
14
+ }
15
+ function getFailedDir() {
16
+ return join(getQueueDir(), 'failed');
17
+ }
18
+ // ─── DeliveryQueue ──────────────────────────────────────────────────
19
+ const RETRY_INTERVAL_MS = 30_000;
20
+ const MAX_ATTEMPTS = 3;
21
+ export class DeliveryQueue {
22
+ channels = new Map();
23
+ retryTimer = null;
24
+ queueDir;
25
+ failedDir;
26
+ constructor() {
27
+ this.queueDir = getQueueDir();
28
+ this.failedDir = getFailedDir();
29
+ }
30
+ /** Register a channel for retry delivery. */
31
+ registerChannel(channel) {
32
+ this.channels.set(channel.id, channel);
33
+ }
34
+ /** Start the background retry worker. */
35
+ async start() {
36
+ await mkdir(this.queueDir, { recursive: true });
37
+ await mkdir(this.failedDir, { recursive: true });
38
+ this.retryTimer = setInterval(() => {
39
+ this.processQueue().catch((err) => {
40
+ console.error('[delivery-queue] Retry error:', err instanceof Error ? err.message : err);
41
+ });
42
+ }, RETRY_INTERVAL_MS);
43
+ }
44
+ /** Stop the background retry worker. */
45
+ stop() {
46
+ if (this.retryTimer) {
47
+ clearInterval(this.retryTimer);
48
+ this.retryTimer = null;
49
+ }
50
+ }
51
+ /**
52
+ * Enqueue a failed message for retry.
53
+ * Called when channel.send() throws.
54
+ */
55
+ async enqueue(channelId, message, error) {
56
+ const id = crypto.randomUUID();
57
+ const queued = {
58
+ id,
59
+ channelId,
60
+ message,
61
+ attempts: 1, // already tried once
62
+ maxAttempts: MAX_ATTEMPTS,
63
+ createdAt: new Date().toISOString(),
64
+ lastAttemptAt: new Date().toISOString(),
65
+ lastError: error,
66
+ };
67
+ const filePath = join(this.queueDir, `${id}.json`);
68
+ await writeFile(filePath, JSON.stringify(queued, null, 2) + '\n', 'utf-8');
69
+ console.log(`[delivery-queue] Queued message ${id} for ${channelId} (error: ${error.slice(0, 100)})`);
70
+ }
71
+ /** Process all queued messages, retrying delivery. */
72
+ async processQueue() {
73
+ let files;
74
+ try {
75
+ files = await readdir(this.queueDir);
76
+ }
77
+ catch {
78
+ return;
79
+ }
80
+ const jsonFiles = files.filter((f) => f.endsWith('.json'));
81
+ if (jsonFiles.length === 0)
82
+ return;
83
+ for (const file of jsonFiles) {
84
+ const filePath = join(this.queueDir, file);
85
+ try {
86
+ const raw = await readFile(filePath, 'utf-8');
87
+ const queued = JSON.parse(raw);
88
+ const channel = this.channels.get(queued.channelId);
89
+ if (!channel) {
90
+ // Channel not registered — move to failed
91
+ await this.moveFailed(filePath, queued, 'Channel not registered');
92
+ continue;
93
+ }
94
+ try {
95
+ await channel.send(queued.message);
96
+ // Success — remove from queue
97
+ await unlink(filePath);
98
+ console.log(`[delivery-queue] Delivered queued message ${queued.id}`);
99
+ }
100
+ catch (err) {
101
+ queued.attempts++;
102
+ queued.lastAttemptAt = new Date().toISOString();
103
+ queued.lastError = err instanceof Error ? err.message : String(err);
104
+ if (queued.attempts >= queued.maxAttempts) {
105
+ await this.moveFailed(filePath, queued, queued.lastError);
106
+ }
107
+ else {
108
+ await writeFile(filePath, JSON.stringify(queued, null, 2) + '\n', 'utf-8');
109
+ console.log(`[delivery-queue] Retry ${queued.attempts}/${queued.maxAttempts} for ${queued.id}`);
110
+ }
111
+ }
112
+ }
113
+ catch (err) {
114
+ console.error(`[delivery-queue] Error processing ${file}:`, err instanceof Error ? err.message : err);
115
+ }
116
+ }
117
+ }
118
+ /** Move a message to the failed directory. */
119
+ async moveFailed(filePath, queued, reason) {
120
+ queued.lastError = reason;
121
+ const failedPath = join(this.failedDir, `${queued.id}.json`);
122
+ await writeFile(failedPath, JSON.stringify(queued, null, 2) + '\n', 'utf-8');
123
+ await unlink(filePath);
124
+ console.log(`[delivery-queue] Message ${queued.id} moved to failed (${reason.slice(0, 100)})`);
125
+ }
126
+ }
127
+ //# sourceMappingURL=delivery-queue.js.map