@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 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/providers/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Provider — inference engine trait.
3
+ *
4
+ * Every LLM backend (Anthropic, OpenAI, LiteLLM, etc.) implements this
5
+ * interface. The agent loop calls `chat()` and streams back `ChatChunk`s.
6
+ *
7
+ * Providers handle:
8
+ * - Model routing via `provider/model` refs (e.g. 'anthropic/claude-sonnet-4-6')
9
+ * - API key rotation and failover
10
+ * - Streaming-first responses via AsyncIterable
11
+ * - Message format conversion to/from provider-specific APIs
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const provider = new AnthropicProvider();
16
+ * for await (const chunk of provider.chat({ model: 'claude-sonnet-4-6', messages, stream: true })) {
17
+ * if (chunk.text) process.stdout.write(chunk.text);
18
+ * }
19
+ * ```
20
+ */
21
+ export {};
22
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/providers/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Sandbox configuration types.
3
+ *
4
+ * Controls how tool execution is isolated:
5
+ * - mode: when to sandbox (off, non-main sessions, or all)
6
+ * - scope: container lifecycle (per-session, per-agent, or shared)
7
+ * - workspaceAccess: how the workspace is mounted (none, read-only, read-write)
8
+ * - docker: container image, network, binds, setup
9
+ */
10
+ /** When to sandbox tool execution. */
11
+ export type SandboxMode = 'off' | 'non-main' | 'all';
12
+ /** Container lifecycle scope. */
13
+ export type SandboxScope = 'session' | 'agent' | 'shared';
14
+ /** How the workspace is mounted inside the container. */
15
+ export type WorkspaceAccess = 'none' | 'ro' | 'rw';
16
+ /** Docker-specific configuration for the sandbox container. */
17
+ export interface DockerConfig {
18
+ /** Container image (default: 'tako-sandbox:bookworm-slim'). */
19
+ image?: string;
20
+ /** Docker network (default: 'none' — no egress). */
21
+ network?: string;
22
+ /** Additional bind mounts (host:container format). */
23
+ binds?: string[];
24
+ /** Shell command to run inside the container after creation. */
25
+ setupCommand?: string;
26
+ /** User to run commands as inside the container. */
27
+ user?: string;
28
+ }
29
+ /** Full sandbox configuration. */
30
+ export interface SandboxConfig {
31
+ /** When to sandbox: 'off' disables, 'non-main' sandboxes spawned sessions, 'all' sandboxes everything. */
32
+ mode: SandboxMode;
33
+ /** Container lifecycle scope. */
34
+ scope: SandboxScope;
35
+ /** How the workspace is mounted. */
36
+ workspaceAccess: WorkspaceAccess;
37
+ /** Docker container settings. */
38
+ docker?: DockerConfig;
39
+ }
40
+ /** Default sandbox config (off — no sandboxing). */
41
+ export declare const DEFAULT_SANDBOX_CONFIG: SandboxConfig;
42
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/sandbox/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,sCAAsC;AACtC,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,UAAU,GAAG,KAAK,CAAC;AAErD,iCAAiC;AACjC,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1D,yDAAyD;AACzD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnD,+DAA+D;AAC/D,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,kCAAkC;AAClC,MAAM,WAAW,aAAa;IAC5B,0GAA0G;IAC1G,IAAI,EAAE,WAAW,CAAC;IAClB,iCAAiC;IACjC,KAAK,EAAE,YAAY,CAAC;IACpB,oCAAoC;IACpC,eAAe,EAAE,eAAe,CAAC;IACjC,iCAAiC;IACjC,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,oDAAoD;AACpD,eAAO,MAAM,sBAAsB,EAAE,aAQpC,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Sandbox configuration types.
3
+ *
4
+ * Controls how tool execution is isolated:
5
+ * - mode: when to sandbox (off, non-main sessions, or all)
6
+ * - scope: container lifecycle (per-session, per-agent, or shared)
7
+ * - workspaceAccess: how the workspace is mounted (none, read-only, read-write)
8
+ * - docker: container image, network, binds, setup
9
+ */
10
+ /** Default sandbox config (off — no sandboxing). */
11
+ export const DEFAULT_SANDBOX_CONFIG = {
12
+ mode: 'off',
13
+ scope: 'session',
14
+ workspaceAccess: 'ro',
15
+ docker: {
16
+ image: 'tako-sandbox:bookworm-slim',
17
+ network: 'none',
18
+ },
19
+ };
20
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/sandbox/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAuCH,oDAAoD;AACpD,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,SAAS;IAChB,eAAe,EAAE,IAAI;IACrB,MAAM,EAAE;QACN,KAAK,EAAE,4BAA4B;QACnC,OAAO,EAAE,MAAM;KAChB;CACF,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Docker container operations — create, start, exec, stop, remove.
3
+ *
4
+ * Uses shell commands (docker CLI) to avoid a heavy dockerode dependency.
5
+ * All operations are async and throw on failure.
6
+ */
7
+ import type { DockerConfig, WorkspaceAccess } from './config.js';
8
+ /** Result of executing a command inside a container. */
9
+ export interface ContainerExecResult {
10
+ stdout: string;
11
+ stderr: string;
12
+ exitCode: number;
13
+ }
14
+ /** Represents a managed Docker container. */
15
+ export interface ContainerInfo {
16
+ /** Docker container ID (short hash). */
17
+ id: string;
18
+ /** Container name. */
19
+ name: string;
20
+ /** Whether the container is currently running. */
21
+ running: boolean;
22
+ }
23
+ /**
24
+ * Docker container lifecycle operations.
25
+ *
26
+ * Wraps the Docker CLI to create, manage, and remove sandbox containers.
27
+ * No network by default. Workspace mounted based on access level.
28
+ */
29
+ export declare class DockerContainer {
30
+ private containerId;
31
+ private containerName;
32
+ private dockerConfig;
33
+ private workspaceAccess;
34
+ private workspacePath;
35
+ constructor(opts: {
36
+ name: string;
37
+ dockerConfig: DockerConfig;
38
+ workspaceAccess: WorkspaceAccess;
39
+ workspacePath?: string;
40
+ });
41
+ /** Check if Docker is available on the host. */
42
+ static isDockerAvailable(): Promise<boolean>;
43
+ /** Create and start the container. */
44
+ create(): Promise<string>;
45
+ /** Execute a command inside the running container. */
46
+ exec(command: string, timeout?: number): Promise<ContainerExecResult>;
47
+ /** Stop the container. */
48
+ stop(): Promise<void>;
49
+ /** Remove the container (force). */
50
+ remove(): Promise<void>;
51
+ /** Stop and remove the container. */
52
+ destroy(): Promise<void>;
53
+ /** Check if the container is running. */
54
+ isRunning(): Promise<boolean>;
55
+ /** Get container info. */
56
+ getInfo(): ContainerInfo | null;
57
+ /** Get the container ID (null if not created). */
58
+ getId(): string | null;
59
+ /** Get the container name. */
60
+ getName(): string;
61
+ /**
62
+ * List all Tako sandbox containers on the host.
63
+ * Uses the `tako.sandbox=true` label to filter.
64
+ */
65
+ static listSandboxContainers(): Promise<ContainerInfo[]>;
66
+ /**
67
+ * Remove all Tako sandbox containers.
68
+ */
69
+ static cleanupAll(): Promise<number>;
70
+ }
71
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/sandbox/container.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAIjE,wDAAwD;AACxD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAmE;IACvF,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,aAAa,CAAgB;gBAEzB,IAAI,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,YAAY,CAAC;QAC3B,eAAe,EAAE,eAAe,CAAC;QACjC,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB;IAWD,gDAAgD;WACnC,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IASlD,sCAAsC;IAChC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IA4C/B,sDAAsD;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAwBnF,0BAA0B;IACpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,oCAAoC;IAC9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7B,qCAAqC;IAC/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,yCAAyC;IACnC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAanC,0BAA0B;IAC1B,OAAO,IAAI,aAAa,GAAG,IAAI;IAS/B,kDAAkD;IAClD,KAAK,IAAI,MAAM,GAAG,IAAI;IAItB,8BAA8B;IAC9B,OAAO,IAAI,MAAM;IAIjB;;;OAGG;WACU,qBAAqB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAgB9D;;OAEG;WACU,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;CAW3C"}
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Docker container operations — create, start, exec, stop, remove.
3
+ *
4
+ * Uses shell commands (docker CLI) to avoid a heavy dockerode dependency.
5
+ * All operations are async and throw on failure.
6
+ */
7
+ import { exec as execCb } from 'node:child_process';
8
+ import { promisify } from 'node:util';
9
+ const execAsync = promisify(execCb);
10
+ /**
11
+ * Docker container lifecycle operations.
12
+ *
13
+ * Wraps the Docker CLI to create, manage, and remove sandbox containers.
14
+ * No network by default. Workspace mounted based on access level.
15
+ */
16
+ export class DockerContainer {
17
+ containerId = null;
18
+ containerName;
19
+ dockerConfig;
20
+ workspaceAccess;
21
+ workspacePath;
22
+ constructor(opts) {
23
+ this.containerName = `tako-sandbox-${opts.name}`;
24
+ this.dockerConfig = {
25
+ image: 'tako-sandbox:bookworm-slim',
26
+ network: 'none',
27
+ ...opts.dockerConfig,
28
+ };
29
+ this.workspaceAccess = opts.workspaceAccess;
30
+ this.workspacePath = opts.workspacePath ?? null;
31
+ }
32
+ /** Check if Docker is available on the host. */
33
+ static async isDockerAvailable() {
34
+ try {
35
+ await execAsync('docker info', { timeout: 5000 });
36
+ return true;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ /** Create and start the container. */
43
+ async create() {
44
+ const args = [
45
+ 'docker', 'create',
46
+ '--name', this.containerName,
47
+ '--network', this.dockerConfig.network,
48
+ '--label', 'tako.sandbox=true',
49
+ ];
50
+ // Workspace mount
51
+ if (this.workspacePath && this.workspaceAccess !== 'none') {
52
+ const roFlag = this.workspaceAccess === 'ro' ? ':ro' : '';
53
+ args.push('-v', `${this.workspacePath}:/workspace${roFlag}`);
54
+ args.push('-w', '/workspace');
55
+ }
56
+ // User
57
+ if (this.dockerConfig.user) {
58
+ args.push('-u', this.dockerConfig.user);
59
+ }
60
+ // Extra bind mounts
61
+ if (this.dockerConfig.binds) {
62
+ for (const bind of this.dockerConfig.binds) {
63
+ args.push('-v', bind);
64
+ }
65
+ }
66
+ // Image + keep-alive command
67
+ args.push(this.dockerConfig.image, 'sleep', 'infinity');
68
+ const { stdout } = await execAsync(args.join(' '), { timeout: 30_000 });
69
+ this.containerId = stdout.trim().slice(0, 12);
70
+ // Start the container
71
+ await execAsync(`docker start ${this.containerId}`, { timeout: 10_000 });
72
+ // Run setup command if provided
73
+ if (this.dockerConfig.setupCommand) {
74
+ await this.exec(this.dockerConfig.setupCommand, 30_000);
75
+ }
76
+ return this.containerId;
77
+ }
78
+ /** Execute a command inside the running container. */
79
+ async exec(command, timeout = 30_000) {
80
+ if (!this.containerId) {
81
+ throw new Error('Container not created');
82
+ }
83
+ const escapedCmd = command.replace(/'/g, "'\\''");
84
+ const dockerCmd = `docker exec ${this.containerId} sh -c '${escapedCmd}'`;
85
+ try {
86
+ const { stdout, stderr } = await execAsync(dockerCmd, {
87
+ timeout,
88
+ maxBuffer: 1024 * 1024,
89
+ });
90
+ return { stdout, stderr, exitCode: 0 };
91
+ }
92
+ catch (err) {
93
+ const e = err;
94
+ return {
95
+ stdout: e.stdout ?? '',
96
+ stderr: e.stderr ?? '',
97
+ exitCode: e.code ?? 1,
98
+ };
99
+ }
100
+ }
101
+ /** Stop the container. */
102
+ async stop() {
103
+ if (!this.containerId)
104
+ return;
105
+ try {
106
+ await execAsync(`docker stop -t 5 ${this.containerId}`, { timeout: 15_000 });
107
+ }
108
+ catch {
109
+ // Container may already be stopped
110
+ }
111
+ }
112
+ /** Remove the container (force). */
113
+ async remove() {
114
+ if (!this.containerId)
115
+ return;
116
+ try {
117
+ await execAsync(`docker rm -f ${this.containerId}`, { timeout: 10_000 });
118
+ }
119
+ catch {
120
+ // Container may already be removed
121
+ }
122
+ this.containerId = null;
123
+ }
124
+ /** Stop and remove the container. */
125
+ async destroy() {
126
+ await this.stop();
127
+ await this.remove();
128
+ }
129
+ /** Check if the container is running. */
130
+ async isRunning() {
131
+ if (!this.containerId)
132
+ return false;
133
+ try {
134
+ const { stdout } = await execAsync(`docker inspect -f '{{.State.Running}}' ${this.containerId}`, { timeout: 5000 });
135
+ return stdout.trim() === 'true';
136
+ }
137
+ catch {
138
+ return false;
139
+ }
140
+ }
141
+ /** Get container info. */
142
+ getInfo() {
143
+ if (!this.containerId)
144
+ return null;
145
+ return {
146
+ id: this.containerId,
147
+ name: this.containerName,
148
+ running: false, // Caller should use isRunning() for live status
149
+ };
150
+ }
151
+ /** Get the container ID (null if not created). */
152
+ getId() {
153
+ return this.containerId;
154
+ }
155
+ /** Get the container name. */
156
+ getName() {
157
+ return this.containerName;
158
+ }
159
+ /**
160
+ * List all Tako sandbox containers on the host.
161
+ * Uses the `tako.sandbox=true` label to filter.
162
+ */
163
+ static async listSandboxContainers() {
164
+ try {
165
+ const { stdout } = await execAsync('docker ps -a --filter "label=tako.sandbox=true" --format "{{.ID}}\\t{{.Names}}\\t{{.State}}"', { timeout: 5000 });
166
+ if (!stdout.trim())
167
+ return [];
168
+ return stdout.trim().split('\n').map((line) => {
169
+ const [id, name, state] = line.split('\t');
170
+ return { id, name, running: state === 'running' };
171
+ });
172
+ }
173
+ catch {
174
+ return [];
175
+ }
176
+ }
177
+ /**
178
+ * Remove all Tako sandbox containers.
179
+ */
180
+ static async cleanupAll() {
181
+ const containers = await DockerContainer.listSandboxContainers();
182
+ for (const c of containers) {
183
+ try {
184
+ await execAsync(`docker rm -f ${c.id}`, { timeout: 10_000 });
185
+ }
186
+ catch {
187
+ // best-effort
188
+ }
189
+ }
190
+ return containers.length;
191
+ }
192
+ }
193
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/sandbox/container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * SandboxManager — manages Docker-based sandboxed execution environments.
3
+ *
4
+ * Creates and tracks containers keyed by scope (session, agent, or shared).
5
+ * Routes tool execution through the appropriate container when sandboxing
6
+ * is active. Falls back to host execution when sandboxing is off or
7
+ * Docker is unavailable.
8
+ */
9
+ import { DockerContainer, type ContainerExecResult } from './container.js';
10
+ import type { SandboxConfig, SandboxMode } from './config.js';
11
+ /** Status snapshot of the sandbox system. */
12
+ export interface SandboxStatus {
13
+ mode: SandboxMode;
14
+ dockerAvailable: boolean;
15
+ activeContainers: number;
16
+ containers: Array<{
17
+ key: string;
18
+ id: string | null;
19
+ name: string;
20
+ running: boolean;
21
+ }>;
22
+ }
23
+ /**
24
+ * SandboxManager — lifecycle management for sandboxed tool execution.
25
+ *
26
+ * Usage:
27
+ * 1. Initialize with config
28
+ * 2. Call shouldSandbox(sessionId, isMain) to check if a session needs sandboxing
29
+ * 3. Call getOrCreateContainer(key) to get a container for the session/agent
30
+ * 4. Call execInSandbox(key, command, timeout) to run commands
31
+ * 5. Call destroyContainer(key) when session ends
32
+ * 6. Call shutdown() on process exit
33
+ */
34
+ export declare class SandboxManager {
35
+ private config;
36
+ private containers;
37
+ private dockerAvailable;
38
+ constructor(config?: Partial<SandboxConfig>);
39
+ /** Get the current sandbox mode. */
40
+ getMode(): SandboxMode;
41
+ /** Get the full config (read-only snapshot). */
42
+ getConfig(): Readonly<SandboxConfig>;
43
+ /** Check if Docker is available (caches result). */
44
+ checkDocker(): Promise<boolean>;
45
+ /**
46
+ * Determine if a given session should be sandboxed.
47
+ *
48
+ * @param isMainSession - true for the primary CLI session
49
+ * @returns true if tool execution should go through a container
50
+ */
51
+ shouldSandbox(isMainSession: boolean): boolean;
52
+ /**
53
+ * Resolve the container key based on scope.
54
+ *
55
+ * - 'session' scope: one container per session
56
+ * - 'agent' scope: one container per agent (future; uses sessionId for now)
57
+ * - 'shared' scope: single container for all sandboxed sessions
58
+ */
59
+ resolveKey(sessionId: string): string;
60
+ /**
61
+ * Get or create a container for the given key.
62
+ * Returns the DockerContainer instance (already started).
63
+ */
64
+ getOrCreateContainer(key: string, workspacePath?: string): Promise<DockerContainer>;
65
+ /**
66
+ * Execute a command in the sandbox container for the given key.
67
+ * The container is created if it doesn't exist yet.
68
+ */
69
+ execInSandbox(key: string, command: string, timeout?: number, workspacePath?: string): Promise<ContainerExecResult>;
70
+ /** Destroy a specific container by key. */
71
+ destroyContainer(key: string): Promise<void>;
72
+ /** Get the status of the sandbox system. */
73
+ getStatus(): Promise<SandboxStatus>;
74
+ /**
75
+ * Explain why a tool would be allowed or blocked in sandbox context.
76
+ * Returns a human-readable explanation string.
77
+ */
78
+ explain(toolName: string, isMainSession: boolean): string;
79
+ /** Shut down all managed containers. */
80
+ shutdown(): Promise<void>;
81
+ }
82
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/sandbox/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG9D,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,KAAK,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;QACZ,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;CACJ;AAED;;;;;;;;;;GAUG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,eAAe,CAAwB;gBAEnC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAI3C,oCAAoC;IACpC,OAAO,IAAI,WAAW;IAItB,gDAAgD;IAChD,SAAS,IAAI,QAAQ,CAAC,aAAa,CAAC;IAIpC,oDAAoD;IAC9C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAOrC;;;;;OAKG;IACH,aAAa,CAAC,aAAa,EAAE,OAAO,GAAG,OAAO;IAO9C;;;;;;OAMG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAYrC;;;OAGG;IACG,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAsBzF;;;OAGG;IACG,aAAa,CACjB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,mBAAmB,CAAC;IAK/B,2CAA2C;IACrC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlD,4CAA4C;IACtC,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IAsBzC;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,MAAM;IA0BzD,wCAAwC;IAClC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAWhC"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * SandboxManager — manages Docker-based sandboxed execution environments.
3
+ *
4
+ * Creates and tracks containers keyed by scope (session, agent, or shared).
5
+ * Routes tool execution through the appropriate container when sandboxing
6
+ * is active. Falls back to host execution when sandboxing is off or
7
+ * Docker is unavailable.
8
+ */
9
+ import { DockerContainer } from './container.js';
10
+ import { DEFAULT_SANDBOX_CONFIG } from './config.js';
11
+ /**
12
+ * SandboxManager — lifecycle management for sandboxed tool execution.
13
+ *
14
+ * Usage:
15
+ * 1. Initialize with config
16
+ * 2. Call shouldSandbox(sessionId, isMain) to check if a session needs sandboxing
17
+ * 3. Call getOrCreateContainer(key) to get a container for the session/agent
18
+ * 4. Call execInSandbox(key, command, timeout) to run commands
19
+ * 5. Call destroyContainer(key) when session ends
20
+ * 6. Call shutdown() on process exit
21
+ */
22
+ export class SandboxManager {
23
+ config;
24
+ containers = new Map();
25
+ dockerAvailable = null;
26
+ constructor(config) {
27
+ this.config = { ...DEFAULT_SANDBOX_CONFIG, ...config };
28
+ }
29
+ /** Get the current sandbox mode. */
30
+ getMode() {
31
+ return this.config.mode;
32
+ }
33
+ /** Get the full config (read-only snapshot). */
34
+ getConfig() {
35
+ return { ...this.config };
36
+ }
37
+ /** Check if Docker is available (caches result). */
38
+ async checkDocker() {
39
+ if (this.dockerAvailable === null) {
40
+ this.dockerAvailable = await DockerContainer.isDockerAvailable();
41
+ }
42
+ return this.dockerAvailable;
43
+ }
44
+ /**
45
+ * Determine if a given session should be sandboxed.
46
+ *
47
+ * @param isMainSession - true for the primary CLI session
48
+ * @returns true if tool execution should go through a container
49
+ */
50
+ shouldSandbox(isMainSession) {
51
+ if (this.config.mode === 'off')
52
+ return false;
53
+ if (this.config.mode === 'all')
54
+ return true;
55
+ // 'non-main' — only sandbox spawned/non-main sessions
56
+ return !isMainSession;
57
+ }
58
+ /**
59
+ * Resolve the container key based on scope.
60
+ *
61
+ * - 'session' scope: one container per session
62
+ * - 'agent' scope: one container per agent (future; uses sessionId for now)
63
+ * - 'shared' scope: single container for all sandboxed sessions
64
+ */
65
+ resolveKey(sessionId) {
66
+ switch (this.config.scope) {
67
+ case 'shared':
68
+ return 'shared';
69
+ case 'agent':
70
+ return `agent-${sessionId}`;
71
+ case 'session':
72
+ default:
73
+ return `session-${sessionId}`;
74
+ }
75
+ }
76
+ /**
77
+ * Get or create a container for the given key.
78
+ * Returns the DockerContainer instance (already started).
79
+ */
80
+ async getOrCreateContainer(key, workspacePath) {
81
+ const existing = this.containers.get(key);
82
+ if (existing) {
83
+ const running = await existing.isRunning();
84
+ if (running)
85
+ return existing;
86
+ // Container exists but isn't running — recreate
87
+ await existing.destroy();
88
+ this.containers.delete(key);
89
+ }
90
+ const container = new DockerContainer({
91
+ name: key,
92
+ dockerConfig: this.config.docker ?? {},
93
+ workspaceAccess: this.config.workspaceAccess,
94
+ workspacePath,
95
+ });
96
+ await container.create();
97
+ this.containers.set(key, container);
98
+ return container;
99
+ }
100
+ /**
101
+ * Execute a command in the sandbox container for the given key.
102
+ * The container is created if it doesn't exist yet.
103
+ */
104
+ async execInSandbox(key, command, timeout, workspacePath) {
105
+ const container = await this.getOrCreateContainer(key, workspacePath);
106
+ return container.exec(command, timeout);
107
+ }
108
+ /** Destroy a specific container by key. */
109
+ async destroyContainer(key) {
110
+ const container = this.containers.get(key);
111
+ if (!container)
112
+ return;
113
+ await container.destroy();
114
+ this.containers.delete(key);
115
+ }
116
+ /** Get the status of the sandbox system. */
117
+ async getStatus() {
118
+ const dockerAvailable = await this.checkDocker();
119
+ const containerInfos = [];
120
+ for (const [key, container] of this.containers) {
121
+ const running = await container.isRunning();
122
+ containerInfos.push({
123
+ key,
124
+ id: container.getId(),
125
+ name: container.getName(),
126
+ running,
127
+ });
128
+ }
129
+ return {
130
+ mode: this.config.mode,
131
+ dockerAvailable,
132
+ activeContainers: containerInfos.filter((c) => c.running).length,
133
+ containers: containerInfos,
134
+ };
135
+ }
136
+ /**
137
+ * Explain why a tool would be allowed or blocked in sandbox context.
138
+ * Returns a human-readable explanation string.
139
+ */
140
+ explain(toolName, isMainSession) {
141
+ const lines = [];
142
+ lines.push(`Sandbox explanation for tool "${toolName}":`);
143
+ lines.push(` Mode: ${this.config.mode}`);
144
+ lines.push(` Session type: ${isMainSession ? 'main' : 'spawned'}`);
145
+ if (this.config.mode === 'off') {
146
+ lines.push(` Result: Tool runs on HOST (sandboxing is off)`);
147
+ }
148
+ else if (this.config.mode === 'all') {
149
+ lines.push(` Result: Tool runs in SANDBOX (all sessions sandboxed)`);
150
+ }
151
+ else {
152
+ if (isMainSession) {
153
+ lines.push(` Result: Tool runs on HOST (main session not sandboxed in "non-main" mode)`);
154
+ }
155
+ else {
156
+ lines.push(` Result: Tool runs in SANDBOX (non-main session)`);
157
+ }
158
+ }
159
+ lines.push(` Workspace access: ${this.config.workspaceAccess}`);
160
+ lines.push(` Container scope: ${this.config.scope}`);
161
+ lines.push(` Docker image: ${this.config.docker?.image ?? 'default'}`);
162
+ lines.push(` Network: ${this.config.docker?.network ?? 'none'}`);
163
+ return lines.join('\n');
164
+ }
165
+ /** Shut down all managed containers. */
166
+ async shutdown() {
167
+ const promises = [];
168
+ for (const [key, container] of this.containers) {
169
+ promises.push(container.destroy().then(() => {
170
+ this.containers.delete(key);
171
+ }));
172
+ }
173
+ await Promise.all(promises);
174
+ }
175
+ }
176
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/sandbox/sandbox.ts"],"names":[],"mappings":"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"}