profclaw 0.0.1-beta.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 (942) hide show
  1. package/.env.example +215 -0
  2. package/CHANGELOG.md +49 -0
  3. package/CONTRIBUTING.md +119 -0
  4. package/Dockerfile +107 -0
  5. package/LICENSE +661 -0
  6. package/README.md +196 -0
  7. package/config/agents.yml +55 -0
  8. package/config/budget.yml +15 -0
  9. package/config/pricing.yml +46 -0
  10. package/config/settings.yml +168 -0
  11. package/dist/adapters/claude-code.d.ts +46 -0
  12. package/dist/adapters/claude-code.js +215 -0
  13. package/dist/adapters/index.d.ts +4 -0
  14. package/dist/adapters/index.js +4 -0
  15. package/dist/adapters/ollama.d.ts +45 -0
  16. package/dist/adapters/ollama.js +277 -0
  17. package/dist/adapters/openclaw.d.ts +60 -0
  18. package/dist/adapters/openclaw.js +289 -0
  19. package/dist/adapters/registry.d.ts +56 -0
  20. package/dist/adapters/registry.js +163 -0
  21. package/dist/agents/executor.d.ts +78 -0
  22. package/dist/agents/executor.js +657 -0
  23. package/dist/agents/index.d.ts +10 -0
  24. package/dist/agents/index.js +27 -0
  25. package/dist/agents/stop-conditions.d.ts +108 -0
  26. package/dist/agents/stop-conditions.js +299 -0
  27. package/dist/agents/types.d.ts +185 -0
  28. package/dist/agents/types.js +14 -0
  29. package/dist/ai/embedding-service.d.ts +96 -0
  30. package/dist/ai/embedding-service.js +333 -0
  31. package/dist/auth/api-tokens.d.ts +71 -0
  32. package/dist/auth/api-tokens.js +235 -0
  33. package/dist/auth/auth-service.d.ts +75 -0
  34. package/dist/auth/auth-service.js +557 -0
  35. package/dist/auth/device-identity.d.ts +96 -0
  36. package/dist/auth/device-identity.js +250 -0
  37. package/dist/auth/github-oauth.d.ts +20 -0
  38. package/dist/auth/github-oauth.js +59 -0
  39. package/dist/auth/jira-oauth.d.ts +25 -0
  40. package/dist/auth/jira-oauth.js +75 -0
  41. package/dist/auth/linear-oauth.d.ts +21 -0
  42. package/dist/auth/linear-oauth.js +59 -0
  43. package/dist/auth/middleware.d.ts +44 -0
  44. package/dist/auth/middleware.js +190 -0
  45. package/dist/auth/pairing-codes.d.ts +109 -0
  46. package/dist/auth/pairing-codes.js +274 -0
  47. package/dist/auth/password.d.ts +53 -0
  48. package/dist/auth/password.js +126 -0
  49. package/dist/auth/qr-pairing.d.ts +36 -0
  50. package/dist/auth/qr-pairing.js +138 -0
  51. package/dist/auth/slack-oauth.d.ts +31 -0
  52. package/dist/auth/slack-oauth.js +80 -0
  53. package/dist/backup/index.d.ts +50 -0
  54. package/dist/backup/index.js +184 -0
  55. package/dist/browser/adapters.d.ts +25 -0
  56. package/dist/browser/adapters.js +32 -0
  57. package/dist/browser/cli.d.ts +19 -0
  58. package/dist/browser/cli.js +277 -0
  59. package/dist/browser/compression.d.ts +32 -0
  60. package/dist/browser/compression.js +269 -0
  61. package/dist/browser/extensions.d.ts +144 -0
  62. package/dist/browser/extensions.js +251 -0
  63. package/dist/browser/index.d.ts +37 -0
  64. package/dist/browser/index.js +43 -0
  65. package/dist/browser/refs.d.ts +46 -0
  66. package/dist/browser/refs.js +120 -0
  67. package/dist/browser/search.d.ts +36 -0
  68. package/dist/browser/search.js +193 -0
  69. package/dist/browser/service.d.ts +94 -0
  70. package/dist/browser/service.js +358 -0
  71. package/dist/browser/snapshot.d.ts +19 -0
  72. package/dist/browser/snapshot.js +250 -0
  73. package/dist/browser/tools.d.ts +259 -0
  74. package/dist/browser/tools.js +463 -0
  75. package/dist/browser/types.d.ts +134 -0
  76. package/dist/browser/types.js +17 -0
  77. package/dist/chat/agentic-executor.d.ts +108 -0
  78. package/dist/chat/agentic-executor.js +739 -0
  79. package/dist/chat/api-key-detector.d.ts +41 -0
  80. package/dist/chat/api-key-detector.js +290 -0
  81. package/dist/chat/auto-reply.d.ts +90 -0
  82. package/dist/chat/auto-reply.js +272 -0
  83. package/dist/chat/conversations.d.ts +91 -0
  84. package/dist/chat/conversations.js +297 -0
  85. package/dist/chat/execution/audit.d.ts +192 -0
  86. package/dist/chat/execution/audit.js +323 -0
  87. package/dist/chat/execution/executor.d.ts +56 -0
  88. package/dist/chat/execution/executor.js +654 -0
  89. package/dist/chat/execution/guardrails.d.ts +98 -0
  90. package/dist/chat/execution/guardrails.js +571 -0
  91. package/dist/chat/execution/index.d.ts +61 -0
  92. package/dist/chat/execution/index.js +129 -0
  93. package/dist/chat/execution/model-capability.d.ts +34 -0
  94. package/dist/chat/execution/model-capability.js +96 -0
  95. package/dist/chat/execution/process-pool.d.ts +110 -0
  96. package/dist/chat/execution/process-pool.js +290 -0
  97. package/dist/chat/execution/pty.d.ts +92 -0
  98. package/dist/chat/execution/pty.js +285 -0
  99. package/dist/chat/execution/rate-limiter.d.ts +87 -0
  100. package/dist/chat/execution/rate-limiter.js +305 -0
  101. package/dist/chat/execution/registry.d.ts +54 -0
  102. package/dist/chat/execution/registry.js +220 -0
  103. package/dist/chat/execution/sandbox.d.ts +109 -0
  104. package/dist/chat/execution/sandbox.js +684 -0
  105. package/dist/chat/execution/secrets.d.ts +45 -0
  106. package/dist/chat/execution/secrets.js +338 -0
  107. package/dist/chat/execution/security.d.ts +179 -0
  108. package/dist/chat/execution/security.js +739 -0
  109. package/dist/chat/execution/self-correction.d.ts +162 -0
  110. package/dist/chat/execution/self-correction.js +557 -0
  111. package/dist/chat/execution/session-manager.d.ts +79 -0
  112. package/dist/chat/execution/session-manager.js +356 -0
  113. package/dist/chat/execution/session-spawn/config.d.ts +37 -0
  114. package/dist/chat/execution/session-spawn/config.js +83 -0
  115. package/dist/chat/execution/session-spawn/index.d.ts +10 -0
  116. package/dist/chat/execution/session-spawn/index.js +10 -0
  117. package/dist/chat/execution/session-spawn/manager.d.ts +35 -0
  118. package/dist/chat/execution/session-spawn/manager.js +418 -0
  119. package/dist/chat/execution/session-spawn/types.d.ts +117 -0
  120. package/dist/chat/execution/session-spawn/types.js +16 -0
  121. package/dist/chat/execution/smart-prompts.d.ts +34 -0
  122. package/dist/chat/execution/smart-prompts.js +151 -0
  123. package/dist/chat/execution/stream-results.d.ts +65 -0
  124. package/dist/chat/execution/stream-results.js +156 -0
  125. package/dist/chat/execution/tool-router.d.ts +76 -0
  126. package/dist/chat/execution/tool-router.js +296 -0
  127. package/dist/chat/execution/tools/agents-list.d.ts +49 -0
  128. package/dist/chat/execution/tools/agents-list.js +165 -0
  129. package/dist/chat/execution/tools/browser.d.ts +12 -0
  130. package/dist/chat/execution/tools/browser.js +14 -0
  131. package/dist/chat/execution/tools/canvas.d.ts +61 -0
  132. package/dist/chat/execution/tools/canvas.js +150 -0
  133. package/dist/chat/execution/tools/complete-task.d.ts +72 -0
  134. package/dist/chat/execution/tools/complete-task.js +104 -0
  135. package/dist/chat/execution/tools/cron-tool.d.ts +204 -0
  136. package/dist/chat/execution/tools/cron-tool.js +680 -0
  137. package/dist/chat/execution/tools/discord-actions.d.ts +120 -0
  138. package/dist/chat/execution/tools/discord-actions.js +361 -0
  139. package/dist/chat/execution/tools/exec.d.ts +43 -0
  140. package/dist/chat/execution/tools/exec.js +223 -0
  141. package/dist/chat/execution/tools/file-ops.d.ts +175 -0
  142. package/dist/chat/execution/tools/file-ops.js +723 -0
  143. package/dist/chat/execution/tools/git.d.ts +143 -0
  144. package/dist/chat/execution/tools/git.js +395 -0
  145. package/dist/chat/execution/tools/github.d.ts +42 -0
  146. package/dist/chat/execution/tools/github.js +184 -0
  147. package/dist/chat/execution/tools/glinr-ops.d.ts +202 -0
  148. package/dist/chat/execution/tools/glinr-ops.js +694 -0
  149. package/dist/chat/execution/tools/image-analyze.d.ts +29 -0
  150. package/dist/chat/execution/tools/image-analyze.js +127 -0
  151. package/dist/chat/execution/tools/index.d.ts +64 -0
  152. package/dist/chat/execution/tools/index.js +245 -0
  153. package/dist/chat/execution/tools/integrations.d.ts +109 -0
  154. package/dist/chat/execution/tools/integrations.js +237 -0
  155. package/dist/chat/execution/tools/link-understand.d.ts +34 -0
  156. package/dist/chat/execution/tools/link-understand.js +307 -0
  157. package/dist/chat/execution/tools/maintenance.d.ts +29 -0
  158. package/dist/chat/execution/tools/maintenance.js +105 -0
  159. package/dist/chat/execution/tools/memory-tools.d.ts +76 -0
  160. package/dist/chat/execution/tools/memory-tools.js +278 -0
  161. package/dist/chat/execution/tools/openai-image-gen.d.ts +51 -0
  162. package/dist/chat/execution/tools/openai-image-gen.js +212 -0
  163. package/dist/chat/execution/tools/profclaw-ops.d.ts +204 -0
  164. package/dist/chat/execution/tools/profclaw-ops.js +665 -0
  165. package/dist/chat/execution/tools/session-spawn.d.ts +146 -0
  166. package/dist/chat/execution/tools/session-spawn.js +544 -0
  167. package/dist/chat/execution/tools/session-status.d.ts +38 -0
  168. package/dist/chat/execution/tools/session-status.js +185 -0
  169. package/dist/chat/execution/tools/sessions-list.d.ts +49 -0
  170. package/dist/chat/execution/tools/sessions-list.js +153 -0
  171. package/dist/chat/execution/tools/sessions-send.d.ts +48 -0
  172. package/dist/chat/execution/tools/sessions-send.js +207 -0
  173. package/dist/chat/execution/tools/sessions-spawn.d.ts +51 -0
  174. package/dist/chat/execution/tools/sessions-spawn.js +137 -0
  175. package/dist/chat/execution/tools/slack-actions.d.ts +90 -0
  176. package/dist/chat/execution/tools/slack-actions.js +272 -0
  177. package/dist/chat/execution/tools/subagent-orchestrate.d.ts +66 -0
  178. package/dist/chat/execution/tools/subagent-orchestrate.js +313 -0
  179. package/dist/chat/execution/tools/system.d.ts +121 -0
  180. package/dist/chat/execution/tools/system.js +415 -0
  181. package/dist/chat/execution/tools/telegram-actions.d.ts +126 -0
  182. package/dist/chat/execution/tools/telegram-actions.js +339 -0
  183. package/dist/chat/execution/tools/test-run.d.ts +43 -0
  184. package/dist/chat/execution/tools/test-run.js +391 -0
  185. package/dist/chat/execution/tools/tts-speak.d.ts +39 -0
  186. package/dist/chat/execution/tools/tts-speak.js +199 -0
  187. package/dist/chat/execution/tools/web-fetch.d.ts +42 -0
  188. package/dist/chat/execution/tools/web-fetch.js +247 -0
  189. package/dist/chat/execution/tools/web-search.d.ts +53 -0
  190. package/dist/chat/execution/tools/web-search.js +130 -0
  191. package/dist/chat/execution/types.d.ts +337 -0
  192. package/dist/chat/execution/types.js +8 -0
  193. package/dist/chat/execution/workflows/built-in.d.ts +10 -0
  194. package/dist/chat/execution/workflows/built-in.js +249 -0
  195. package/dist/chat/execution/workflows/executor.d.ts +13 -0
  196. package/dist/chat/execution/workflows/executor.js +259 -0
  197. package/dist/chat/execution/workflows/index.d.ts +5 -0
  198. package/dist/chat/execution/workflows/index.js +5 -0
  199. package/dist/chat/execution/workflows/trigger.d.ts +15 -0
  200. package/dist/chat/execution/workflows/trigger.js +111 -0
  201. package/dist/chat/execution/workflows/types.d.ts +80 -0
  202. package/dist/chat/execution/workflows/types.js +2 -0
  203. package/dist/chat/failover/error.d.ts +73 -0
  204. package/dist/chat/failover/error.js +412 -0
  205. package/dist/chat/failover/index.d.ts +10 -0
  206. package/dist/chat/failover/index.js +11 -0
  207. package/dist/chat/failover/model-fallback.d.ts +97 -0
  208. package/dist/chat/failover/model-fallback.js +328 -0
  209. package/dist/chat/failover/types.d.ts +47 -0
  210. package/dist/chat/failover/types.js +8 -0
  211. package/dist/chat/format/chunk.d.ts +59 -0
  212. package/dist/chat/format/chunk.js +253 -0
  213. package/dist/chat/format/index.d.ts +7 -0
  214. package/dist/chat/format/index.js +7 -0
  215. package/dist/chat/format/tool-result-formatter.d.ts +30 -0
  216. package/dist/chat/format/tool-result-formatter.js +177 -0
  217. package/dist/chat/group.d.ts +232 -0
  218. package/dist/chat/group.js +311 -0
  219. package/dist/chat/index.d.ts +21 -0
  220. package/dist/chat/index.js +30 -0
  221. package/dist/chat/memory.d.ts +108 -0
  222. package/dist/chat/memory.js +343 -0
  223. package/dist/chat/message-handler.d.ts +38 -0
  224. package/dist/chat/message-handler.js +274 -0
  225. package/dist/chat/proactive/index.d.ts +167 -0
  226. package/dist/chat/proactive/index.js +721 -0
  227. package/dist/chat/prompt-adapter.d.ts +52 -0
  228. package/dist/chat/prompt-adapter.js +245 -0
  229. package/dist/chat/providers/dingtalk/index.d.ts +69 -0
  230. package/dist/chat/providers/dingtalk/index.js +225 -0
  231. package/dist/chat/providers/discord/index.d.ts +264 -0
  232. package/dist/chat/providers/discord/index.js +657 -0
  233. package/dist/chat/providers/feishu/index.d.ts +97 -0
  234. package/dist/chat/providers/feishu/index.js +362 -0
  235. package/dist/chat/providers/googlechat/index.d.ts +269 -0
  236. package/dist/chat/providers/googlechat/index.js +634 -0
  237. package/dist/chat/providers/imessage/index.d.ts +61 -0
  238. package/dist/chat/providers/imessage/index.js +166 -0
  239. package/dist/chat/providers/index.d.ts +76 -0
  240. package/dist/chat/providers/index.js +430 -0
  241. package/dist/chat/providers/irc/index.d.ts +101 -0
  242. package/dist/chat/providers/irc/index.js +557 -0
  243. package/dist/chat/providers/line/index.d.ts +113 -0
  244. package/dist/chat/providers/line/index.js +434 -0
  245. package/dist/chat/providers/matrix/index.d.ts +161 -0
  246. package/dist/chat/providers/matrix/index.js +559 -0
  247. package/dist/chat/providers/mattermost/index.d.ts +106 -0
  248. package/dist/chat/providers/mattermost/index.js +425 -0
  249. package/dist/chat/providers/msteams/index.d.ts +198 -0
  250. package/dist/chat/providers/msteams/index.js +694 -0
  251. package/dist/chat/providers/nextcloud/index.d.ts +52 -0
  252. package/dist/chat/providers/nextcloud/index.js +156 -0
  253. package/dist/chat/providers/nostr/index.d.ts +60 -0
  254. package/dist/chat/providers/nostr/index.js +200 -0
  255. package/dist/chat/providers/qq/index.d.ts +57 -0
  256. package/dist/chat/providers/qq/index.js +260 -0
  257. package/dist/chat/providers/registry.d.ts +89 -0
  258. package/dist/chat/providers/registry.js +213 -0
  259. package/dist/chat/providers/signal/index.d.ts +88 -0
  260. package/dist/chat/providers/signal/index.js +357 -0
  261. package/dist/chat/providers/slack/index.d.ts +52 -0
  262. package/dist/chat/providers/slack/index.js +477 -0
  263. package/dist/chat/providers/synology/index.d.ts +50 -0
  264. package/dist/chat/providers/synology/index.js +138 -0
  265. package/dist/chat/providers/telegram/index.d.ts +148 -0
  266. package/dist/chat/providers/telegram/index.js +492 -0
  267. package/dist/chat/providers/tlon/index.d.ts +44 -0
  268. package/dist/chat/providers/tlon/index.js +243 -0
  269. package/dist/chat/providers/twitch/index.d.ts +79 -0
  270. package/dist/chat/providers/twitch/index.js +349 -0
  271. package/dist/chat/providers/types.d.ts +437 -0
  272. package/dist/chat/providers/types.js +14 -0
  273. package/dist/chat/providers/webchat/index.d.ts +38 -0
  274. package/dist/chat/providers/webchat/index.js +214 -0
  275. package/dist/chat/providers/wecom/index.d.ts +62 -0
  276. package/dist/chat/providers/wecom/index.js +228 -0
  277. package/dist/chat/providers/whatsapp/index.d.ts +147 -0
  278. package/dist/chat/providers/whatsapp/index.js +396 -0
  279. package/dist/chat/providers/zalo/index.d.ts +54 -0
  280. package/dist/chat/providers/zalo/index.js +158 -0
  281. package/dist/chat/providers/zalo-personal/index.d.ts +53 -0
  282. package/dist/chat/providers/zalo-personal/index.js +212 -0
  283. package/dist/chat/skills.d.ts +82 -0
  284. package/dist/chat/skills.js +410 -0
  285. package/dist/chat/system-prompts.d.ts +76 -0
  286. package/dist/chat/system-prompts.js +407 -0
  287. package/dist/chat/tool-handler.d.ts +57 -0
  288. package/dist/chat/tool-handler.js +336 -0
  289. package/dist/chat/tools.d.ts +373 -0
  290. package/dist/chat/tools.js +512 -0
  291. package/dist/cli/commands/agent.d.ts +3 -0
  292. package/dist/cli/commands/agent.js +108 -0
  293. package/dist/cli/commands/auth.d.ts +12 -0
  294. package/dist/cli/commands/auth.js +301 -0
  295. package/dist/cli/commands/browser.d.ts +3 -0
  296. package/dist/cli/commands/browser.js +138 -0
  297. package/dist/cli/commands/canvas.d.ts +3 -0
  298. package/dist/cli/commands/canvas.js +155 -0
  299. package/dist/cli/commands/channels.d.ts +3 -0
  300. package/dist/cli/commands/channels.js +167 -0
  301. package/dist/cli/commands/chat.d.ts +9 -0
  302. package/dist/cli/commands/chat.js +360 -0
  303. package/dist/cli/commands/completion.d.ts +3 -0
  304. package/dist/cli/commands/completion.js +170 -0
  305. package/dist/cli/commands/config.d.ts +3 -0
  306. package/dist/cli/commands/config.js +193 -0
  307. package/dist/cli/commands/cost.d.ts +3 -0
  308. package/dist/cli/commands/cost.js +134 -0
  309. package/dist/cli/commands/daemon.d.ts +3 -0
  310. package/dist/cli/commands/daemon.js +381 -0
  311. package/dist/cli/commands/devices.d.ts +3 -0
  312. package/dist/cli/commands/devices.js +150 -0
  313. package/dist/cli/commands/doctor.d.ts +3 -0
  314. package/dist/cli/commands/doctor.js +295 -0
  315. package/dist/cli/commands/logs.d.ts +3 -0
  316. package/dist/cli/commands/logs.js +139 -0
  317. package/dist/cli/commands/mcp.d.ts +15 -0
  318. package/dist/cli/commands/mcp.js +157 -0
  319. package/dist/cli/commands/memory.d.ts +3 -0
  320. package/dist/cli/commands/memory.js +170 -0
  321. package/dist/cli/commands/models.d.ts +3 -0
  322. package/dist/cli/commands/models.js +197 -0
  323. package/dist/cli/commands/nodes.d.ts +3 -0
  324. package/dist/cli/commands/nodes.js +193 -0
  325. package/dist/cli/commands/onboard.d.ts +13 -0
  326. package/dist/cli/commands/onboard.js +360 -0
  327. package/dist/cli/commands/plugin.d.ts +15 -0
  328. package/dist/cli/commands/plugin.js +226 -0
  329. package/dist/cli/commands/provider.d.ts +16 -0
  330. package/dist/cli/commands/provider.js +320 -0
  331. package/dist/cli/commands/security.d.ts +3 -0
  332. package/dist/cli/commands/security.js +180 -0
  333. package/dist/cli/commands/serve.d.ts +3 -0
  334. package/dist/cli/commands/serve.js +179 -0
  335. package/dist/cli/commands/session.d.ts +3 -0
  336. package/dist/cli/commands/session.js +172 -0
  337. package/dist/cli/commands/setup.d.ts +13 -0
  338. package/dist/cli/commands/setup.js +636 -0
  339. package/dist/cli/commands/skill.d.ts +15 -0
  340. package/dist/cli/commands/skill.js +191 -0
  341. package/dist/cli/commands/status.d.ts +3 -0
  342. package/dist/cli/commands/status.js +71 -0
  343. package/dist/cli/commands/summary.d.ts +3 -0
  344. package/dist/cli/commands/summary.js +160 -0
  345. package/dist/cli/commands/task.d.ts +3 -0
  346. package/dist/cli/commands/task.js +170 -0
  347. package/dist/cli/commands/ticket.d.ts +3 -0
  348. package/dist/cli/commands/ticket.js +421 -0
  349. package/dist/cli/commands/tools.d.ts +9 -0
  350. package/dist/cli/commands/tools.js +508 -0
  351. package/dist/cli/commands/tui.d.ts +3 -0
  352. package/dist/cli/commands/tui.js +158 -0
  353. package/dist/cli/commands/tunnel.d.ts +3 -0
  354. package/dist/cli/commands/tunnel.js +135 -0
  355. package/dist/cli/commands/webhooks.d.ts +3 -0
  356. package/dist/cli/commands/webhooks.js +191 -0
  357. package/dist/cli/index.d.ts +3 -0
  358. package/dist/cli/index.js +127 -0
  359. package/dist/cli/utils/api.d.ts +17 -0
  360. package/dist/cli/utils/api.js +63 -0
  361. package/dist/cli/utils/config.d.ts +31 -0
  362. package/dist/cli/utils/config.js +81 -0
  363. package/dist/cli/utils/output.d.ts +58 -0
  364. package/dist/cli/utils/output.js +148 -0
  365. package/dist/core/deployment.d.ts +30 -0
  366. package/dist/core/deployment.js +114 -0
  367. package/dist/core/sandbox-config.d.ts +63 -0
  368. package/dist/core/sandbox-config.js +148 -0
  369. package/dist/costs/budget.d.ts +28 -0
  370. package/dist/costs/budget.js +57 -0
  371. package/dist/costs/persistence.d.ts +77 -0
  372. package/dist/costs/persistence.js +210 -0
  373. package/dist/costs/pricing.d.ts +16 -0
  374. package/dist/costs/pricing.js +39 -0
  375. package/dist/costs/token-tracker.d.ts +34 -0
  376. package/dist/costs/token-tracker.js +141 -0
  377. package/dist/cron/heartbeat.d.ts +23 -0
  378. package/dist/cron/heartbeat.js +109 -0
  379. package/dist/cron/index.d.ts +22 -0
  380. package/dist/cron/index.js +37 -0
  381. package/dist/cron/issue-poller.d.ts +15 -0
  382. package/dist/cron/issue-poller.js +174 -0
  383. package/dist/cron/scheduler.d.ts +315 -0
  384. package/dist/cron/scheduler.js +1008 -0
  385. package/dist/cron/stale-checker.d.ts +16 -0
  386. package/dist/cron/stale-checker.js +61 -0
  387. package/dist/cron/templates.d.ts +107 -0
  388. package/dist/cron/templates.js +395 -0
  389. package/dist/diagnostics/exporters.d.ts +21 -0
  390. package/dist/diagnostics/exporters.js +138 -0
  391. package/dist/diagnostics/index.d.ts +10 -0
  392. package/dist/diagnostics/index.js +9 -0
  393. package/dist/diagnostics/middleware.d.ts +12 -0
  394. package/dist/diagnostics/middleware.js +58 -0
  395. package/dist/diagnostics/tracer.d.ts +133 -0
  396. package/dist/diagnostics/tracer.js +257 -0
  397. package/dist/discovery/index.d.ts +8 -0
  398. package/dist/discovery/index.js +7 -0
  399. package/dist/discovery/mdns.d.ts +40 -0
  400. package/dist/discovery/mdns.js +249 -0
  401. package/dist/gateway/index.d.ts +35 -0
  402. package/dist/gateway/index.js +36 -0
  403. package/dist/gateway/router.d.ts +110 -0
  404. package/dist/gateway/router.js +649 -0
  405. package/dist/gateway/types.d.ts +275 -0
  406. package/dist/gateway/types.js +2 -0
  407. package/dist/gateway/workflows.d.ts +37 -0
  408. package/dist/gateway/workflows.js +748 -0
  409. package/dist/hooks/agent-webhook.d.ts +277 -0
  410. package/dist/hooks/agent-webhook.js +197 -0
  411. package/dist/hooks/index.d.ts +13 -0
  412. package/dist/hooks/index.js +15 -0
  413. package/dist/hooks/prompt-submit.d.ts +45 -0
  414. package/dist/hooks/prompt-submit.js +111 -0
  415. package/dist/hooks/schemas.d.ts +563 -0
  416. package/dist/hooks/schemas.js +108 -0
  417. package/dist/hooks/session-end.d.ts +25 -0
  418. package/dist/hooks/session-end.js +153 -0
  419. package/dist/hooks/tool-use.d.ts +41 -0
  420. package/dist/hooks/tool-use.js +201 -0
  421. package/dist/hooks/types.d.ts +76 -0
  422. package/dist/hooks/types.js +7 -0
  423. package/dist/integrations/cloudflare-tunnel.d.ts +78 -0
  424. package/dist/integrations/cloudflare-tunnel.js +268 -0
  425. package/dist/integrations/github-client.d.ts +27 -0
  426. package/dist/integrations/github-client.js +79 -0
  427. package/dist/integrations/github-projects.d.ts +97 -0
  428. package/dist/integrations/github-projects.js +433 -0
  429. package/dist/integrations/github-ticket-sync.d.ts +82 -0
  430. package/dist/integrations/github-ticket-sync.js +352 -0
  431. package/dist/integrations/github.d.ts +11 -0
  432. package/dist/integrations/github.js +241 -0
  433. package/dist/integrations/jira-client.d.ts +30 -0
  434. package/dist/integrations/jira-client.js +67 -0
  435. package/dist/integrations/jira.d.ts +13 -0
  436. package/dist/integrations/jira.js +108 -0
  437. package/dist/integrations/linear-client.d.ts +23 -0
  438. package/dist/integrations/linear-client.js +52 -0
  439. package/dist/integrations/linear.d.ts +15 -0
  440. package/dist/integrations/linear.js +312 -0
  441. package/dist/integrations/tailscale.d.ts +68 -0
  442. package/dist/integrations/tailscale.js +173 -0
  443. package/dist/integrations/web-search.d.ts +112 -0
  444. package/dist/integrations/web-search.js +287 -0
  445. package/dist/intelligence/index.d.ts +8 -0
  446. package/dist/intelligence/index.js +8 -0
  447. package/dist/intelligence/ollama.d.ts +50 -0
  448. package/dist/intelligence/ollama.js +213 -0
  449. package/dist/intelligence/rules.d.ts +39 -0
  450. package/dist/intelligence/rules.js +308 -0
  451. package/dist/labels/index.d.ts +93 -0
  452. package/dist/labels/index.js +248 -0
  453. package/dist/mcp/browser-tools.d.ts +10 -0
  454. package/dist/mcp/browser-tools.js +16 -0
  455. package/dist/mcp/client.d.ts +54 -0
  456. package/dist/mcp/client.js +153 -0
  457. package/dist/mcp/index.d.ts +12 -0
  458. package/dist/mcp/index.js +13 -0
  459. package/dist/mcp/server.d.ts +40 -0
  460. package/dist/mcp/server.js +826 -0
  461. package/dist/mcp/tool-adapter.d.ts +49 -0
  462. package/dist/mcp/tool-adapter.js +193 -0
  463. package/dist/memory/experience-store.d.ts +121 -0
  464. package/dist/memory/experience-store.js +439 -0
  465. package/dist/memory/index.d.ts +8 -0
  466. package/dist/memory/index.js +25 -0
  467. package/dist/memory/memory-service.d.ts +312 -0
  468. package/dist/memory/memory-service.js +1172 -0
  469. package/dist/memory/memory-watcher.d.ts +116 -0
  470. package/dist/memory/memory-watcher.js +239 -0
  471. package/dist/middleware/logging.d.ts +34 -0
  472. package/dist/middleware/logging.js +184 -0
  473. package/dist/middleware/rate-limit.d.ts +29 -0
  474. package/dist/middleware/rate-limit.js +91 -0
  475. package/dist/notifications/in-app.d.ts +28 -0
  476. package/dist/notifications/in-app.js +53 -0
  477. package/dist/notifications/index.d.ts +3 -0
  478. package/dist/notifications/index.js +3 -0
  479. package/dist/notifications/push.d.ts +74 -0
  480. package/dist/notifications/push.js +175 -0
  481. package/dist/notifications/slack.d.ts +32 -0
  482. package/dist/notifications/slack.js +157 -0
  483. package/dist/plugins/clawhub.d.ts +70 -0
  484. package/dist/plugins/clawhub.js +260 -0
  485. package/dist/plugins/loader.d.ts +23 -0
  486. package/dist/plugins/loader.js +140 -0
  487. package/dist/plugins/marketplace.d.ts +77 -0
  488. package/dist/plugins/marketplace.js +275 -0
  489. package/dist/plugins/registry.d.ts +122 -0
  490. package/dist/plugins/registry.js +352 -0
  491. package/dist/plugins/sandbox.d.ts +77 -0
  492. package/dist/plugins/sandbox.js +287 -0
  493. package/dist/plugins/scaffolder.d.ts +28 -0
  494. package/dist/plugins/scaffolder.js +409 -0
  495. package/dist/plugins/sdk.d.ts +35 -0
  496. package/dist/plugins/sdk.js +8 -0
  497. package/dist/plugins/search/brave.d.ts +9 -0
  498. package/dist/plugins/search/brave.js +157 -0
  499. package/dist/plugins/search/duckduckgo.d.ts +9 -0
  500. package/dist/plugins/search/duckduckgo.js +171 -0
  501. package/dist/plugins/search/index.d.ts +13 -0
  502. package/dist/plugins/search/index.js +23 -0
  503. package/dist/plugins/search/searxng.d.ts +9 -0
  504. package/dist/plugins/search/searxng.js +170 -0
  505. package/dist/plugins/search/serper.d.ts +9 -0
  506. package/dist/plugins/search/serper.js +135 -0
  507. package/dist/plugins/search/tavily.d.ts +9 -0
  508. package/dist/plugins/search/tavily.js +146 -0
  509. package/dist/plugins/types.d.ts +174 -0
  510. package/dist/plugins/types.js +8 -0
  511. package/dist/projects/index.d.ts +133 -0
  512. package/dist/projects/index.js +897 -0
  513. package/dist/projects/types.d.ts +444 -0
  514. package/dist/projects/types.js +207 -0
  515. package/dist/providers/adapters/anthropic.d.ts +26 -0
  516. package/dist/providers/adapters/anthropic.js +306 -0
  517. package/dist/providers/adapters/base.d.ts +53 -0
  518. package/dist/providers/adapters/base.js +99 -0
  519. package/dist/providers/adapters/ollama.d.ts +30 -0
  520. package/dist/providers/adapters/ollama.js +292 -0
  521. package/dist/providers/ai-sdk.d.ts +178 -0
  522. package/dist/providers/ai-sdk.js +1552 -0
  523. package/dist/providers/core/index.d.ts +8 -0
  524. package/dist/providers/core/index.js +10 -0
  525. package/dist/providers/core/models.d.ts +31 -0
  526. package/dist/providers/core/models.js +949 -0
  527. package/dist/providers/core/types.d.ts +117 -0
  528. package/dist/providers/core/types.js +83 -0
  529. package/dist/providers/index.d.ts +7 -0
  530. package/dist/providers/index.js +7 -0
  531. package/dist/providers/registry.d.ts +93 -0
  532. package/dist/providers/registry.js +228 -0
  533. package/dist/providers/schema-utils.d.ts +23 -0
  534. package/dist/providers/schema-utils.js +545 -0
  535. package/dist/providers/types.d.ts +609 -0
  536. package/dist/providers/types.js +279 -0
  537. package/dist/queue/failure-handler.d.ts +93 -0
  538. package/dist/queue/failure-handler.js +379 -0
  539. package/dist/queue/index.d.ts +23 -0
  540. package/dist/queue/index.js +86 -0
  541. package/dist/queue/memory-queue.d.ts +30 -0
  542. package/dist/queue/memory-queue.js +429 -0
  543. package/dist/queue/notifications.d.ts +6 -0
  544. package/dist/queue/notifications.js +128 -0
  545. package/dist/queue/task-queue.d.ts +55 -0
  546. package/dist/queue/task-queue.js +518 -0
  547. package/dist/queue/webhook-queue.d.ts +47 -0
  548. package/dist/queue/webhook-queue.js +158 -0
  549. package/dist/routes/agents.d.ts +4 -0
  550. package/dist/routes/agents.js +45 -0
  551. package/dist/routes/auth.d.ts +19 -0
  552. package/dist/routes/auth.js +492 -0
  553. package/dist/routes/backup.d.ts +6 -0
  554. package/dist/routes/backup.js +71 -0
  555. package/dist/routes/chat.d.ts +10 -0
  556. package/dist/routes/chat.js +1678 -0
  557. package/dist/routes/clawhub.d.ts +8 -0
  558. package/dist/routes/clawhub.js +89 -0
  559. package/dist/routes/costs.d.ts +4 -0
  560. package/dist/routes/costs.js +78 -0
  561. package/dist/routes/cron.d.ts +11 -0
  562. package/dist/routes/cron.js +708 -0
  563. package/dist/routes/devices.d.ts +9 -0
  564. package/dist/routes/devices.js +490 -0
  565. package/dist/routes/discord.d.ts +15 -0
  566. package/dist/routes/discord.js +524 -0
  567. package/dist/routes/dlq.d.ts +4 -0
  568. package/dist/routes/dlq.js +64 -0
  569. package/dist/routes/gateway.d.ts +4 -0
  570. package/dist/routes/gateway.js +253 -0
  571. package/dist/routes/health.d.ts +29 -0
  572. package/dist/routes/health.js +296 -0
  573. package/dist/routes/hooks.d.ts +4 -0
  574. package/dist/routes/hooks.js +170 -0
  575. package/dist/routes/import.d.ts +9 -0
  576. package/dist/routes/import.js +540 -0
  577. package/dist/routes/index.d.ts +38 -0
  578. package/dist/routes/index.js +39 -0
  579. package/dist/routes/integrations.d.ts +10 -0
  580. package/dist/routes/integrations.js +200 -0
  581. package/dist/routes/labels.d.ts +8 -0
  582. package/dist/routes/labels.js +240 -0
  583. package/dist/routes/mcp.d.ts +14 -0
  584. package/dist/routes/mcp.js +125 -0
  585. package/dist/routes/memory.d.ts +10 -0
  586. package/dist/routes/memory.js +622 -0
  587. package/dist/routes/notifications.d.ts +9 -0
  588. package/dist/routes/notifications.js +154 -0
  589. package/dist/routes/oobe.d.ts +10 -0
  590. package/dist/routes/oobe.js +405 -0
  591. package/dist/routes/openapi.d.ts +9 -0
  592. package/dist/routes/openapi.js +537 -0
  593. package/dist/routes/plugins.d.ts +8 -0
  594. package/dist/routes/plugins.js +108 -0
  595. package/dist/routes/projects.d.ts +8 -0
  596. package/dist/routes/projects.js +592 -0
  597. package/dist/routes/push.d.ts +8 -0
  598. package/dist/routes/push.js +75 -0
  599. package/dist/routes/search.d.ts +4 -0
  600. package/dist/routes/search.js +189 -0
  601. package/dist/routes/security.d.ts +10 -0
  602. package/dist/routes/security.js +189 -0
  603. package/dist/routes/settings.d.ts +4 -0
  604. package/dist/routes/settings.js +119 -0
  605. package/dist/routes/setup.d.ts +11 -0
  606. package/dist/routes/setup.js +525 -0
  607. package/dist/routes/skills.d.ts +13 -0
  608. package/dist/routes/skills.js +152 -0
  609. package/dist/routes/slack.d.ts +12 -0
  610. package/dist/routes/slack.js +999 -0
  611. package/dist/routes/states.d.ts +8 -0
  612. package/dist/routes/states.js +123 -0
  613. package/dist/routes/stats.d.ts +6 -0
  614. package/dist/routes/stats.js +369 -0
  615. package/dist/routes/summaries.d.ts +4 -0
  616. package/dist/routes/summaries.js +344 -0
  617. package/dist/routes/sync.d.ts +13 -0
  618. package/dist/routes/sync.js +268 -0
  619. package/dist/routes/tasks.d.ts +4 -0
  620. package/dist/routes/tasks.js +473 -0
  621. package/dist/routes/telegram.d.ts +14 -0
  622. package/dist/routes/telegram.js +420 -0
  623. package/dist/routes/tickets.d.ts +4 -0
  624. package/dist/routes/tickets.js +1090 -0
  625. package/dist/routes/tokens.d.ts +4 -0
  626. package/dist/routes/tokens.js +83 -0
  627. package/dist/routes/tools.d.ts +14 -0
  628. package/dist/routes/tools.js +790 -0
  629. package/dist/routes/tunnels.d.ts +8 -0
  630. package/dist/routes/tunnels.js +145 -0
  631. package/dist/routes/users.d.ts +15 -0
  632. package/dist/routes/users.js +998 -0
  633. package/dist/routes/voice.d.ts +8 -0
  634. package/dist/routes/voice.js +127 -0
  635. package/dist/routes/webchat.d.ts +11 -0
  636. package/dist/routes/webchat.js +173 -0
  637. package/dist/routes/webhook-dedup.d.ts +11 -0
  638. package/dist/routes/webhook-dedup.js +49 -0
  639. package/dist/routes/webhooks.d.ts +4 -0
  640. package/dist/routes/webhooks.js +71 -0
  641. package/dist/routes/whatsapp.d.ts +14 -0
  642. package/dist/routes/whatsapp.js +391 -0
  643. package/dist/security/audit-scanner.d.ts +32 -0
  644. package/dist/security/audit-scanner.js +217 -0
  645. package/dist/security/fs-guard.d.ts +41 -0
  646. package/dist/security/fs-guard.js +206 -0
  647. package/dist/security/prompt-guard.d.ts +47 -0
  648. package/dist/security/prompt-guard.js +198 -0
  649. package/dist/security/ssrf-guard.d.ts +38 -0
  650. package/dist/security/ssrf-guard.js +266 -0
  651. package/dist/security/types.d.ts +92 -0
  652. package/dist/security/types.js +8 -0
  653. package/dist/server/route-loader.d.ts +15 -0
  654. package/dist/server/route-loader.js +135 -0
  655. package/dist/server.d.ts +5 -0
  656. package/dist/server.js +835 -0
  657. package/dist/settings/index.d.ts +841 -0
  658. package/dist/settings/index.js +451 -0
  659. package/dist/skills/compiler.d.ts +83 -0
  660. package/dist/skills/compiler.js +358 -0
  661. package/dist/skills/frontmatter.d.ts +33 -0
  662. package/dist/skills/frontmatter.js +175 -0
  663. package/dist/skills/index.d.ts +19 -0
  664. package/dist/skills/index.js +24 -0
  665. package/dist/skills/installer.d.ts +22 -0
  666. package/dist/skills/installer.js +220 -0
  667. package/dist/skills/loader.d.ts +72 -0
  668. package/dist/skills/loader.js +484 -0
  669. package/dist/skills/prompt-builder.d.ts +48 -0
  670. package/dist/skills/prompt-builder.js +135 -0
  671. package/dist/skills/registry.d.ts +115 -0
  672. package/dist/skills/registry.js +225 -0
  673. package/dist/skills/types.d.ts +202 -0
  674. package/dist/skills/types.js +24 -0
  675. package/dist/states/index.d.ts +64 -0
  676. package/dist/states/index.js +142 -0
  677. package/dist/storage/adapter.d.ts +146 -0
  678. package/dist/storage/adapter.js +2 -0
  679. package/dist/storage/index.d.ts +48 -0
  680. package/dist/storage/index.js +135 -0
  681. package/dist/storage/libsql.d.ts +99 -0
  682. package/dist/storage/libsql.js +1873 -0
  683. package/dist/storage/migrations.d.ts +65 -0
  684. package/dist/storage/migrations.js +289 -0
  685. package/dist/storage/schema.d.ts +10185 -0
  686. package/dist/storage/schema.js +1113 -0
  687. package/dist/summaries/extractor.d.ts +56 -0
  688. package/dist/summaries/extractor.js +377 -0
  689. package/dist/summaries/index.d.ts +13 -0
  690. package/dist/summaries/index.js +14 -0
  691. package/dist/summaries/storage.d.ts +51 -0
  692. package/dist/summaries/storage.js +101 -0
  693. package/dist/summaries/templates.d.ts +68 -0
  694. package/dist/summaries/templates.js +245 -0
  695. package/dist/sync/adapters/base.d.ts +42 -0
  696. package/dist/sync/adapters/base.js +142 -0
  697. package/dist/sync/adapters/github.d.ts +45 -0
  698. package/dist/sync/adapters/github.js +445 -0
  699. package/dist/sync/adapters/linear.d.ts +40 -0
  700. package/dist/sync/adapters/linear.js +434 -0
  701. package/dist/sync/config.d.ts +388 -0
  702. package/dist/sync/config.js +281 -0
  703. package/dist/sync/engine.d.ts +112 -0
  704. package/dist/sync/engine.js +623 -0
  705. package/dist/sync/index.d.ts +31 -0
  706. package/dist/sync/index.js +34 -0
  707. package/dist/sync/integration.d.ts +53 -0
  708. package/dist/sync/integration.js +231 -0
  709. package/dist/sync/types.d.ts +249 -0
  710. package/dist/sync/types.js +30 -0
  711. package/dist/tickets/index.d.ts +139 -0
  712. package/dist/tickets/index.js +1406 -0
  713. package/dist/tickets/types.d.ts +817 -0
  714. package/dist/tickets/types.js +310 -0
  715. package/dist/tools/adapters.d.ts +56 -0
  716. package/dist/tools/adapters.js +183 -0
  717. package/dist/tools/index.d.ts +66 -0
  718. package/dist/tools/index.js +105 -0
  719. package/dist/tools/types.d.ts +117 -0
  720. package/dist/tools/types.js +20 -0
  721. package/dist/types/agent.d.ts +101 -0
  722. package/dist/types/agent.js +2 -0
  723. package/dist/types/errors.d.ts +150 -0
  724. package/dist/types/errors.js +338 -0
  725. package/dist/types/index.d.ts +3 -0
  726. package/dist/types/index.js +3 -0
  727. package/dist/types/summary.d.ts +638 -0
  728. package/dist/types/summary.js +137 -0
  729. package/dist/types/task.d.ts +123 -0
  730. package/dist/types/task.js +46 -0
  731. package/dist/utils/ai-cache.d.ts +72 -0
  732. package/dist/utils/ai-cache.js +204 -0
  733. package/dist/utils/ai-inference.d.ts +57 -0
  734. package/dist/utils/ai-inference.js +190 -0
  735. package/dist/utils/ai-responder.d.ts +44 -0
  736. package/dist/utils/ai-responder.js +272 -0
  737. package/dist/utils/circuit-breaker.d.ts +139 -0
  738. package/dist/utils/circuit-breaker.js +281 -0
  739. package/dist/utils/config-loader.d.ts +12 -0
  740. package/dist/utils/config-loader.js +44 -0
  741. package/dist/utils/crypto.d.ts +10 -0
  742. package/dist/utils/crypto.js +59 -0
  743. package/dist/utils/env-validator.d.ts +44 -0
  744. package/dist/utils/env-validator.js +236 -0
  745. package/dist/utils/file-lock.d.ts +85 -0
  746. package/dist/utils/file-lock.js +204 -0
  747. package/dist/utils/logger.d.ts +153 -0
  748. package/dist/utils/logger.js +282 -0
  749. package/dist/utils/metrics.d.ts +183 -0
  750. package/dist/utils/metrics.js +345 -0
  751. package/dist/utils/security.d.ts +90 -0
  752. package/dist/utils/security.js +347 -0
  753. package/dist/voice/index.d.ts +79 -0
  754. package/dist/voice/index.js +144 -0
  755. package/dist/voice/stt/whisper.d.ts +13 -0
  756. package/dist/voice/stt/whisper.js +116 -0
  757. package/dist/voice/tts/elevenlabs.d.ts +18 -0
  758. package/dist/voice/tts/elevenlabs.js +178 -0
  759. package/dist/voice/tts/openai-tts.d.ts +19 -0
  760. package/dist/voice/tts/openai-tts.js +127 -0
  761. package/dist/voice/tts/system.d.ts +26 -0
  762. package/dist/voice/tts/system.js +146 -0
  763. package/dist/voice/wake-word.d.ts +44 -0
  764. package/dist/voice/wake-word.js +145 -0
  765. package/docker-compose.yml +222 -0
  766. package/package.json +154 -0
  767. package/profclaw.mjs +24 -0
  768. package/skills/1password/SKILL.md +155 -0
  769. package/skills/api-tester/SKILL.md +177 -0
  770. package/skills/apple-notes/SKILL.md +167 -0
  771. package/skills/apple-reminders/SKILL.md +178 -0
  772. package/skills/bear-notes/SKILL.md +166 -0
  773. package/skills/blogwatcher/SKILL.md +177 -0
  774. package/skills/camsnap/SKILL.md +130 -0
  775. package/skills/code-generation/SKILL.md +139 -0
  776. package/skills/code-review/SKILL.md +116 -0
  777. package/skills/coding-agent/SKILL.md +184 -0
  778. package/skills/cron-manager/SKILL.md +141 -0
  779. package/skills/debug-helper/SKILL.md +134 -0
  780. package/skills/docker-ops/SKILL.md +246 -0
  781. package/skills/file-manager/SKILL.md +160 -0
  782. package/skills/git-workflow/SKILL.md +171 -0
  783. package/skills/github-issues/SKILL.md +244 -0
  784. package/skills/gog/SKILL.md +191 -0
  785. package/skills/goplaces/SKILL.md +156 -0
  786. package/skills/healthcheck/SKILL.md +270 -0
  787. package/skills/himalaya/SKILL.md +165 -0
  788. package/skills/mcp-discovery/SKILL.md +109 -0
  789. package/skills/memory-manager/SKILL.md +151 -0
  790. package/skills/model-usage/SKILL.md +177 -0
  791. package/skills/nano-banana-pro/SKILL.md +214 -0
  792. package/skills/nano-pdf/SKILL.md +165 -0
  793. package/skills/notion/SKILL.md +147 -0
  794. package/skills/obsidian/SKILL.md +163 -0
  795. package/skills/openai-image-gen/SKILL.md +194 -0
  796. package/skills/openai-whisper/SKILL.md +98 -0
  797. package/skills/openai-whisper-api/SKILL.md +130 -0
  798. package/skills/openhue/SKILL.md +203 -0
  799. package/skills/oracle/SKILL.md +236 -0
  800. package/skills/phone-control/SKILL.md +201 -0
  801. package/skills/profclaw-assistant/SKILL.md +81 -0
  802. package/skills/profclaw-projects/SKILL.md +68 -0
  803. package/skills/profclaw-tickets/SKILL.md +91 -0
  804. package/skills/session-logs/SKILL.md +216 -0
  805. package/skills/sherpa-onnx-tts/SKILL.md +134 -0
  806. package/skills/skill-creator/SKILL.md +183 -0
  807. package/skills/songsee/SKILL.md +170 -0
  808. package/skills/spotify-player/SKILL.md +254 -0
  809. package/skills/summarize/SKILL.md +155 -0
  810. package/skills/system-admin/SKILL.md +179 -0
  811. package/skills/things-mac/SKILL.md +179 -0
  812. package/skills/tmux/SKILL.md +170 -0
  813. package/skills/trello/SKILL.md +154 -0
  814. package/skills/video-frames/SKILL.md +127 -0
  815. package/skills/weather/SKILL.md +186 -0
  816. package/skills/web-research/SKILL.md +128 -0
  817. package/skills/xurl/SKILL.md +198 -0
  818. package/ui/README.md +73 -0
  819. package/ui/dist/assets/ActivityView-CkPgKhwm.js +1 -0
  820. package/ui/dist/assets/AgentList-C3SVdeEz.js +1 -0
  821. package/ui/dist/assets/AnalyticsDashboard-DVU--vlP.js +1 -0
  822. package/ui/dist/assets/AreaChart-B5qMEGWj.js +1 -0
  823. package/ui/dist/assets/CartesianChart-B50bcUJi.js +36 -0
  824. package/ui/dist/assets/ChatView-BZFJs7w_.js +10 -0
  825. package/ui/dist/assets/CostsDashboard-ChfH8BlG.js +1 -0
  826. package/ui/dist/assets/EstimateSelect-CLpB4NQO.js +1 -0
  827. package/ui/dist/assets/FloatingChatbot-CBzBY9a0.js +2 -0
  828. package/ui/dist/assets/InviteCodeManagement-DsbdPa6W.js +2 -0
  829. package/ui/dist/assets/ProjectDetail-BEM3tFXg.js +2 -0
  830. package/ui/dist/assets/ProjectDetail-D1-0B2xV.css +1 -0
  831. package/ui/dist/assets/ProjectIcon-CN1FmFAk.js +1 -0
  832. package/ui/dist/assets/ProjectList-DSDaNhxQ.js +4 -0
  833. package/ui/dist/assets/Settings-dPVcqC_d.js +6 -0
  834. package/ui/dist/assets/StatusIndicator-DA3NAo_b.js +1 -0
  835. package/ui/dist/assets/SummaryDetail-Bjnf9lT8.js +27 -0
  836. package/ui/dist/assets/SummaryList-ENwKDBKW.js +1 -0
  837. package/ui/dist/assets/TaskDetail-DnwG6MzB.js +1 -0
  838. package/ui/dist/assets/TaskList-D9Ug_HiV.js +1 -0
  839. package/ui/dist/assets/TicketBoard-CviH1571.js +1 -0
  840. package/ui/dist/assets/TicketDetail-8Jk8O-33.js +1 -0
  841. package/ui/dist/assets/TicketList-B-iV4rRA.js +1 -0
  842. package/ui/dist/assets/UserManagement-CPZ8s7s2.js +2 -0
  843. package/ui/dist/assets/ViewSwitcher-BUyOOWDI.js +1 -0
  844. package/ui/dist/assets/alert-dialog-BOmnTkN-.js +7 -0
  845. package/ui/dist/assets/archive-D5my9zOG.js +1 -0
  846. package/ui/dist/assets/badge-B4ov81_m.js +1 -0
  847. package/ui/dist/assets/brain-C53ElFLD.js +1 -0
  848. package/ui/dist/assets/bug-D0TJoCYn.js +1 -0
  849. package/ui/dist/assets/calendar-BkWIhKa1.js +1 -0
  850. package/ui/dist/assets/chevron-up-BRTtndUZ.js +1 -0
  851. package/ui/dist/assets/circle-x-BN89YhbS.js +1 -0
  852. package/ui/dist/assets/constants-fc7TFI7u.js +1 -0
  853. package/ui/dist/assets/cpu-B41x1-vV.js +1 -0
  854. package/ui/dist/assets/database-D9Cnfmzj.js +1 -0
  855. package/ui/dist/assets/defineProperty-CoXUr7_6.js +2 -0
  856. package/ui/dist/assets/dialog-DrWB4EYD.js +1 -0
  857. package/ui/dist/assets/element-adapter-DL0DQilL.js +4 -0
  858. package/ui/dist/assets/ellipsis-NuUWekvu.js +1 -0
  859. package/ui/dist/assets/ellipsis-vertical-BueMfuCw.js +1 -0
  860. package/ui/dist/assets/file-code-HR9829Jc.js +1 -0
  861. package/ui/dist/assets/folder-open-C_7oYEqe.js +1 -0
  862. package/ui/dist/assets/funnel-B5gmNXGf.js +1 -0
  863. package/ui/dist/assets/git-branch-BRMiJmV3.js +1 -0
  864. package/ui/dist/assets/git-commit-horizontal-CXOUQeJI.js +1 -0
  865. package/ui/dist/assets/globe-CCspjvus.js +1 -0
  866. package/ui/dist/assets/hash-g3102kPC.js +1 -0
  867. package/ui/dist/assets/history-CNqcBBrV.js +1 -0
  868. package/ui/dist/assets/index-27mTPKuh.js +1 -0
  869. package/ui/dist/assets/index-BMx3fH-e.js +1 -0
  870. package/ui/dist/assets/index-C9jNQXzL.js +1 -0
  871. package/ui/dist/assets/index-CEZ6R2Uw.js +7 -0
  872. package/ui/dist/assets/index-DURTouJI.js +1 -0
  873. package/ui/dist/assets/index-WclMPci1.css +1 -0
  874. package/ui/dist/assets/index-kb4AJXUB.js +67 -0
  875. package/ui/dist/assets/layers-CLXiHN6o.js +1 -0
  876. package/ui/dist/assets/layout-dashboard-B07MFhBs.js +1 -0
  877. package/ui/dist/assets/lightbulb-B2dgG5ks.js +1 -0
  878. package/ui/dist/assets/link-2-BxNmr9hL.js +1 -0
  879. package/ui/dist/assets/markdown-renderer-CjU6hBcW.js +36 -0
  880. package/ui/dist/assets/message-square-Bf2-CVbt.js +1 -0
  881. package/ui/dist/assets/pencil-D096Ey62.js +1 -0
  882. package/ui/dist/assets/play-DfdcSI3x.js +1 -0
  883. package/ui/dist/assets/popover-BV0QJDQq.js +1 -0
  884. package/ui/dist/assets/progress-DjPEDJfI.js +1 -0
  885. package/ui/dist/assets/rocket-CPsTc-5G.js +1 -0
  886. package/ui/dist/assets/select-LsO16slr.js +1 -0
  887. package/ui/dist/assets/send-BDYBZDUZ.js +1 -0
  888. package/ui/dist/assets/server-B3k6noce.js +1 -0
  889. package/ui/dist/assets/settings-2-Cu4xTjhG.js +1 -0
  890. package/ui/dist/assets/sheet-BScLnPKX.js +1 -0
  891. package/ui/dist/assets/shield-check-CQqkwufI.js +1 -0
  892. package/ui/dist/assets/shield-off-ZFruH9KO.js +1 -0
  893. package/ui/dist/assets/skeleton-CtkIA_MU.js +1 -0
  894. package/ui/dist/assets/smartphone-DnoksVkc.js +1 -0
  895. package/ui/dist/assets/square-uD9ZHMfW.js +1 -0
  896. package/ui/dist/assets/switch-MQPnwGJK.js +1 -0
  897. package/ui/dist/assets/table-B8cqlywA.js +1 -0
  898. package/ui/dist/assets/tag-wEJQRWlV.js +1 -0
  899. package/ui/dist/assets/textarea-D5LJCOGl.js +1 -0
  900. package/ui/dist/assets/timer-mbGHegmr.js +1 -0
  901. package/ui/dist/assets/tooltip-Df1CunSp.js +1 -0
  902. package/ui/dist/assets/trash-2-B4oAXsX-.js +1 -0
  903. package/ui/dist/assets/trending-up-BGWxvlmZ.js +1 -0
  904. package/ui/dist/assets/wand-sparkles-CZy4xvL3.js +1 -0
  905. package/ui/dist/assets/wrench-ByZkjO6m.js +1 -0
  906. package/ui/dist/audio-worklets/vad-processor.js +132 -0
  907. package/ui/dist/brand/profclaw-appicon-192.png +0 -0
  908. package/ui/dist/brand/profclaw-appicon-512.png +0 -0
  909. package/ui/dist/brand/profclaw-appicon-shadow.svg +51 -0
  910. package/ui/dist/brand/profclaw-appicon.svg +50 -0
  911. package/ui/dist/brand/profclaw-favicon-coral-bg-128.png +0 -0
  912. package/ui/dist/brand/profclaw-favicon-coral-bg-64.png +0 -0
  913. package/ui/dist/brand/profclaw-favicon-coral-bg.svg +52 -0
  914. package/ui/dist/brand/profclaw-favicon-coral-body-128.png +0 -0
  915. package/ui/dist/brand/profclaw-favicon-coral-body.svg +41 -0
  916. package/ui/dist/brand/profclaw-favicon-shadow-128.png +0 -0
  917. package/ui/dist/brand/profclaw-favicon-shadow-64.png +0 -0
  918. package/ui/dist/brand/profclaw-favicon-shadow.svg +51 -0
  919. package/ui/dist/brand/profclaw-mark-coral-256.png +0 -0
  920. package/ui/dist/brand/profclaw-mark-coral-64.png +0 -0
  921. package/ui/dist/brand/profclaw-mark-coral.svg +31 -0
  922. package/ui/dist/brand/profclaw-mono-white.svg +18 -0
  923. package/ui/dist/brand/profclaw-text-dark.svg +18 -0
  924. package/ui/dist/brand/profclaw-text-light.svg +18 -0
  925. package/ui/dist/brand/profclaw-wordmark-dark.svg +48 -0
  926. package/ui/dist/brand/profclaw-wordmark-light.svg +48 -0
  927. package/ui/dist/brand/safari-pinned-tab.svg +15 -0
  928. package/ui/dist/favicon/android-chrome-192x192.png +0 -0
  929. package/ui/dist/favicon/android-chrome-384x384.png +0 -0
  930. package/ui/dist/favicon/android-chrome-512x512.png +0 -0
  931. package/ui/dist/favicon/apple-touch-icon.png +0 -0
  932. package/ui/dist/favicon/browserconfig.xml +9 -0
  933. package/ui/dist/favicon/favicon-16x16.png +0 -0
  934. package/ui/dist/favicon/favicon-32x32.png +0 -0
  935. package/ui/dist/favicon/favicon.ico +0 -0
  936. package/ui/dist/favicon/mstile-150x150.png +0 -0
  937. package/ui/dist/favicon/safari-pinned-tab.svg +46 -0
  938. package/ui/dist/favicon/site.webmanifest +22 -0
  939. package/ui/dist/index.html +32 -0
  940. package/ui/dist/manifest.json +49 -0
  941. package/ui/dist/sw.js +124 -0
  942. package/ui/dist/vite.svg +1 -0
@@ -0,0 +1,1008 @@
1
+ /**
2
+ * Scheduled Jobs Scheduler
3
+ *
4
+ * Manages cron jobs and scheduled tasks using BullMQ.
5
+ * Provides a database-backed scheduler that AI agents can use
6
+ * to schedule recurring tasks.
7
+ *
8
+ * Supports:
9
+ * - Cron expressions (standard 5-field syntax)
10
+ * - Fixed intervals
11
+ * - HTTP callbacks
12
+ * - Tool execution
13
+ * - Script execution
14
+ * - Message sending
15
+ */
16
+ import { Queue, Worker } from 'bullmq';
17
+ import { getDb } from '../storage/index.js';
18
+ import { scheduledJobs, jobRunHistory } from '../storage/schema.js';
19
+ import { eq, and } from 'drizzle-orm';
20
+ import { createContextualLogger } from '../utils/logger.js';
21
+ const log = createContextualLogger('Scheduler');
22
+ // Singleton Scheduler
23
+ let schedulerInstance = null;
24
+ function getStringValue(record, key) {
25
+ const value = record[key];
26
+ return typeof value === 'string' ? value : undefined;
27
+ }
28
+ function getProcessEnv() {
29
+ return Object.fromEntries(Object.entries(process.env).filter((entry) => typeof entry[1] === 'string'));
30
+ }
31
+ function createNoopSessionManager() {
32
+ return {
33
+ create(session) {
34
+ return {
35
+ ...session,
36
+ id: crypto.randomUUID(),
37
+ createdAt: Date.now(),
38
+ };
39
+ },
40
+ get: () => undefined,
41
+ update: () => { },
42
+ list: () => [],
43
+ kill: async () => { },
44
+ cleanup: () => { },
45
+ };
46
+ }
47
+ export function getScheduler() {
48
+ if (!schedulerInstance) {
49
+ schedulerInstance = new JobScheduler();
50
+ }
51
+ return schedulerInstance;
52
+ }
53
+ // JobScheduler Class
54
+ export class JobScheduler {
55
+ queue = null;
56
+ worker = null;
57
+ isRunning = false;
58
+ redisConfig = {
59
+ host: process.env.REDIS_HOST || 'localhost',
60
+ port: parseInt(process.env.REDIS_PORT || '6379'),
61
+ };
62
+ /**
63
+ * Start the scheduler
64
+ */
65
+ async start() {
66
+ if (this.isRunning) {
67
+ log.warn('Scheduler already running');
68
+ return;
69
+ }
70
+ try {
71
+ // Initialize BullMQ queue
72
+ this.queue = new Queue('scheduled-jobs', {
73
+ connection: this.redisConfig,
74
+ defaultJobOptions: {
75
+ removeOnComplete: 100,
76
+ removeOnFail: 50,
77
+ },
78
+ });
79
+ // Initialize worker
80
+ this.worker = new Worker('scheduled-jobs', async (job) => this.processJob(job), {
81
+ connection: this.redisConfig,
82
+ concurrency: 5,
83
+ });
84
+ this.worker.on('completed', (job) => {
85
+ log.debug(`Job ${job.id} completed`);
86
+ });
87
+ this.worker.on('failed', (job, err) => {
88
+ log.error(`Job ${job?.id} failed:`, err instanceof Error ? err : new Error(String(err)));
89
+ });
90
+ // Load existing active jobs from database
91
+ await this.loadActiveJobs();
92
+ this.isRunning = true;
93
+ log.info('Scheduler started');
94
+ }
95
+ catch (error) {
96
+ log.error('Failed to start scheduler:', error instanceof Error ? error : new Error(String(error)));
97
+ // Scheduler can work without Redis for basic features
98
+ this.isRunning = false;
99
+ }
100
+ }
101
+ /**
102
+ * Stop the scheduler
103
+ */
104
+ async stop() {
105
+ if (!this.isRunning)
106
+ return;
107
+ try {
108
+ if (this.worker) {
109
+ await this.worker.close();
110
+ this.worker = null;
111
+ }
112
+ if (this.queue) {
113
+ await this.queue.close();
114
+ this.queue = null;
115
+ }
116
+ this.isRunning = false;
117
+ log.info('Scheduler stopped');
118
+ }
119
+ catch (error) {
120
+ log.error('Error stopping scheduler:', error instanceof Error ? error : new Error(String(error)));
121
+ }
122
+ }
123
+ /**
124
+ * Load active jobs from database and schedule them
125
+ */
126
+ async loadActiveJobs() {
127
+ const db = await getDb();
128
+ const jobs = await db
129
+ .select()
130
+ .from(scheduledJobs)
131
+ .where(eq(scheduledJobs.status, 'active'));
132
+ log.info(`Loading ${jobs.length} active scheduled jobs`);
133
+ for (const job of jobs) {
134
+ try {
135
+ await this.scheduleJob(job.id, job.cronExpression || undefined, job.intervalMs || undefined);
136
+ }
137
+ catch (error) {
138
+ log.error(`Failed to schedule job ${job.id}:`, error instanceof Error ? error : new Error(String(error)));
139
+ }
140
+ }
141
+ }
142
+ /**
143
+ * Create a new scheduled job
144
+ * Supports: cron expressions, fixed intervals, one-shot (runAt), event triggers
145
+ */
146
+ async createJob(params) {
147
+ const db = await getDb();
148
+ const id = crypto.randomUUID();
149
+ const now = new Date();
150
+ // Calculate next run time based on schedule type
151
+ let nextRunAt = null;
152
+ if (params.runAt) {
153
+ // One-shot job: run at specific datetime
154
+ nextRunAt = params.runAt;
155
+ }
156
+ else if (params.eventTrigger) {
157
+ // Event-driven: no scheduled next run, triggered by events
158
+ nextRunAt = null;
159
+ }
160
+ else {
161
+ // Cron or interval
162
+ nextRunAt = this.calculateNextRun(params.cronExpression, params.intervalMs);
163
+ }
164
+ // Apply retry policy defaults
165
+ const retryPolicy = {
166
+ enabled: params.retryPolicy?.enabled ?? true,
167
+ initialDelayMs: params.retryPolicy?.initialDelayMs ?? 60000,
168
+ backoffMultiplier: params.retryPolicy?.backoffMultiplier ?? 2,
169
+ maxDelayMs: params.retryPolicy?.maxDelayMs ?? 3600000,
170
+ maxRetries: params.retryPolicy?.maxRetries ?? 3,
171
+ };
172
+ const jobData = {
173
+ id,
174
+ name: params.name,
175
+ description: params.description ?? null,
176
+ // Schedule
177
+ cronExpression: params.cronExpression ?? null,
178
+ intervalMs: params.intervalMs ?? null,
179
+ runAt: params.runAt ?? null,
180
+ timezone: params.timezone ?? 'UTC',
181
+ // Event trigger
182
+ eventTrigger: params.eventTrigger ?? null,
183
+ // Execution
184
+ jobType: params.jobType,
185
+ payload: params.payload,
186
+ templateId: params.templateId ?? null,
187
+ // Labels
188
+ labels: params.labels ?? [],
189
+ // Delivery
190
+ delivery: params.delivery ?? null,
191
+ // Status
192
+ status: 'active',
193
+ userId: params.userId ?? null,
194
+ projectId: params.projectId ?? null,
195
+ createdBy: params.createdBy ?? 'human',
196
+ lastRunAt: null,
197
+ lastRunStatus: null,
198
+ lastRunError: null,
199
+ lastRunDurationMs: null,
200
+ nextRunAt: nextRunAt,
201
+ runCount: 0,
202
+ successCount: 0,
203
+ failureCount: 0,
204
+ // Limits
205
+ maxRuns: params.maxRuns ?? (params.runAt ? 1 : null), // One-shot defaults to maxRuns=1
206
+ maxFailures: params.maxFailures ?? null,
207
+ // Retry policy
208
+ retryOnFailure: retryPolicy.enabled,
209
+ retryDelayMs: retryPolicy.initialDelayMs,
210
+ retryBackoffMultiplier: retryPolicy.backoffMultiplier,
211
+ retryMaxDelayMs: retryPolicy.maxDelayMs,
212
+ currentRetryCount: 0,
213
+ // One-shot options
214
+ deleteOnComplete: params.deleteOnComplete ?? false,
215
+ // Timestamps
216
+ createdAt: now,
217
+ updatedAt: now,
218
+ expiresAt: params.expiresAt ?? null,
219
+ archivedAt: null,
220
+ };
221
+ await db.insert(scheduledJobs).values(jobData);
222
+ // Schedule in BullMQ based on type
223
+ if (params.runAt) {
224
+ // One-shot: schedule delayed job
225
+ await this.scheduleOneShotJob(id, params.runAt);
226
+ }
227
+ else if (!params.eventTrigger) {
228
+ // Cron or interval: schedule repeating job
229
+ await this.scheduleJob(id, params.cronExpression, params.intervalMs);
230
+ }
231
+ // Event-triggered jobs don't need BullMQ scheduling
232
+ const scheduleType = params.runAt ? 'one-shot' : params.eventTrigger ? 'event-triggered' : 'scheduled';
233
+ log.info(`Created ${scheduleType} job: ${params.name} (${id})`);
234
+ return this.mapToScheduledJob(jobData);
235
+ }
236
+ /**
237
+ * Schedule a one-shot job to run at a specific time
238
+ */
239
+ async scheduleOneShotJob(id, runAt) {
240
+ if (!this.queue)
241
+ return;
242
+ const delay = Math.max(0, runAt.getTime() - Date.now());
243
+ await this.queue.add('one-shot-run', { jobId: id, triggeredBy: 'one-shot' }, {
244
+ jobId: `oneshot-${id}`,
245
+ delay,
246
+ });
247
+ }
248
+ /**
249
+ * Get a job by ID
250
+ */
251
+ async getJob(id) {
252
+ const db = await getDb();
253
+ const [job] = await db
254
+ .select()
255
+ .from(scheduledJobs)
256
+ .where(eq(scheduledJobs.id, id));
257
+ return job ? this.mapToScheduledJob(job) : null;
258
+ }
259
+ /**
260
+ * List all jobs with optional filters
261
+ */
262
+ async listJobs(filters) {
263
+ const db = await getDb();
264
+ // Apply filters
265
+ const conditions = [];
266
+ if (filters?.status) {
267
+ conditions.push(eq(scheduledJobs.status, filters.status));
268
+ }
269
+ if (filters?.projectId) {
270
+ conditions.push(eq(scheduledJobs.projectId, filters.projectId));
271
+ }
272
+ if (filters?.userId) {
273
+ conditions.push(eq(scheduledJobs.userId, filters.userId));
274
+ }
275
+ if (filters?.jobType) {
276
+ conditions.push(eq(scheduledJobs.jobType, filters.jobType));
277
+ }
278
+ const query = db.select().from(scheduledJobs);
279
+ const jobs = conditions.length > 0
280
+ ? await query.where(and(...conditions)).limit(filters?.limit ?? 100)
281
+ : await query.limit(filters?.limit ?? 100);
282
+ return jobs.map((j) => this.mapToScheduledJob(j));
283
+ }
284
+ /**
285
+ * Update a job
286
+ */
287
+ async updateJob(id, updates) {
288
+ const db = await getDb();
289
+ const [existing] = await db
290
+ .select()
291
+ .from(scheduledJobs)
292
+ .where(eq(scheduledJobs.id, id));
293
+ if (!existing)
294
+ return null;
295
+ // Calculate new next run if schedule changed
296
+ let nextRunAt = existing.nextRunAt;
297
+ if (updates.cronExpression !== undefined || updates.intervalMs !== undefined) {
298
+ const cron = updates.cronExpression ?? existing.cronExpression;
299
+ const interval = updates.intervalMs ?? existing.intervalMs;
300
+ nextRunAt = this.calculateNextRun(cron || undefined, interval || undefined);
301
+ // Reschedule in BullMQ
302
+ await this.removeFromQueue(id);
303
+ await this.scheduleJob(id, cron || undefined, interval || undefined);
304
+ }
305
+ await db
306
+ .update(scheduledJobs)
307
+ .set({
308
+ ...updates,
309
+ nextRunAt,
310
+ updatedAt: new Date(),
311
+ })
312
+ .where(eq(scheduledJobs.id, id));
313
+ return this.getJob(id);
314
+ }
315
+ /**
316
+ * Pause a job
317
+ */
318
+ async pauseJob(id) {
319
+ const db = await getDb();
320
+ const result = await db
321
+ .update(scheduledJobs)
322
+ .set({ status: 'paused', updatedAt: new Date() })
323
+ .where(eq(scheduledJobs.id, id));
324
+ await this.removeFromQueue(id);
325
+ return result.rowsAffected > 0;
326
+ }
327
+ /**
328
+ * Resume a paused job
329
+ */
330
+ async resumeJob(id) {
331
+ const db = await getDb();
332
+ const [job] = await db
333
+ .select()
334
+ .from(scheduledJobs)
335
+ .where(eq(scheduledJobs.id, id));
336
+ if (!job)
337
+ return false;
338
+ await db
339
+ .update(scheduledJobs)
340
+ .set({
341
+ status: 'active',
342
+ nextRunAt: this.calculateNextRun(job.cronExpression || undefined, job.intervalMs || undefined),
343
+ updatedAt: new Date(),
344
+ })
345
+ .where(eq(scheduledJobs.id, id));
346
+ await this.scheduleJob(id, job.cronExpression || undefined, job.intervalMs || undefined);
347
+ return true;
348
+ }
349
+ /**
350
+ * Delete a job
351
+ */
352
+ async deleteJob(id) {
353
+ const db = await getDb();
354
+ await this.removeFromQueue(id);
355
+ const result = await db
356
+ .delete(scheduledJobs)
357
+ .where(eq(scheduledJobs.id, id));
358
+ return result.rowsAffected > 0;
359
+ }
360
+ /**
361
+ * Archive a job (soft delete)
362
+ */
363
+ async archiveJob(id) {
364
+ const db = await getDb();
365
+ await this.removeFromQueue(id);
366
+ const result = await db
367
+ .update(scheduledJobs)
368
+ .set({
369
+ status: 'archived',
370
+ archivedAt: new Date(),
371
+ updatedAt: new Date(),
372
+ })
373
+ .where(eq(scheduledJobs.id, id));
374
+ return result.rowsAffected > 0;
375
+ }
376
+ /**
377
+ * Restore an archived job
378
+ */
379
+ async restoreJob(id) {
380
+ const db = await getDb();
381
+ const [job] = await db
382
+ .select()
383
+ .from(scheduledJobs)
384
+ .where(eq(scheduledJobs.id, id));
385
+ if (!job || job.status !== 'archived')
386
+ return false;
387
+ const nextRunAt = this.calculateNextRun(job.cronExpression || undefined, job.intervalMs || undefined);
388
+ await db
389
+ .update(scheduledJobs)
390
+ .set({
391
+ status: 'paused', // Restore to paused state for safety
392
+ archivedAt: null,
393
+ nextRunAt,
394
+ updatedAt: new Date(),
395
+ })
396
+ .where(eq(scheduledJobs.id, id));
397
+ return true;
398
+ }
399
+ /**
400
+ * Trigger a job immediately (manual run)
401
+ */
402
+ async triggerJob(id) {
403
+ const job = await this.getJob(id);
404
+ if (!job)
405
+ return null;
406
+ // Queue immediate execution
407
+ if (this.queue) {
408
+ await this.queue.add('manual-run', { jobId: id, triggeredBy: 'manual' }, { jobId: `manual-${id}-${Date.now()}` });
409
+ }
410
+ else {
411
+ // Fallback: execute directly
412
+ await this.executeJob(id, 'manual');
413
+ }
414
+ return { runId: `manual-${id}-${Date.now()}` };
415
+ }
416
+ /**
417
+ * Get job run history
418
+ */
419
+ async getJobHistory(jobId, limit = 20) {
420
+ const db = await getDb();
421
+ const history = await db
422
+ .select()
423
+ .from(jobRunHistory)
424
+ .where(eq(jobRunHistory.jobId, jobId))
425
+ .orderBy(jobRunHistory.startedAt)
426
+ .limit(limit);
427
+ return history.map((h) => ({
428
+ id: h.id,
429
+ startedAt: h.startedAt,
430
+ completedAt: h.completedAt,
431
+ durationMs: h.durationMs || undefined,
432
+ status: h.status,
433
+ output: h.output || undefined,
434
+ error: h.error || undefined,
435
+ triggeredBy: h.triggeredBy,
436
+ }));
437
+ }
438
+ // Private Methods
439
+ /**
440
+ * Schedule a job in BullMQ
441
+ */
442
+ async scheduleJob(id, cronExpression, intervalMs) {
443
+ if (!this.queue)
444
+ return;
445
+ const repeatOpts = {};
446
+ if (cronExpression) {
447
+ repeatOpts.pattern = cronExpression;
448
+ }
449
+ else if (intervalMs) {
450
+ repeatOpts.every = intervalMs;
451
+ }
452
+ else {
453
+ log.warn(`Job ${id} has no schedule defined`);
454
+ return;
455
+ }
456
+ await this.queue.add('scheduled-run', { jobId: id, triggeredBy: 'schedule' }, {
457
+ repeat: repeatOpts,
458
+ jobId: `scheduled-${id}`,
459
+ });
460
+ }
461
+ /**
462
+ * Remove a job from BullMQ queue
463
+ */
464
+ async removeFromQueue(id) {
465
+ if (!this.queue)
466
+ return;
467
+ try {
468
+ await this.queue.removeRepeatableByKey(`scheduled-${id}`);
469
+ }
470
+ catch {
471
+ // Job might not exist in queue
472
+ }
473
+ }
474
+ /**
475
+ * Process a job from the queue
476
+ */
477
+ async processJob(bullJob) {
478
+ const { jobId, triggeredBy } = bullJob.data;
479
+ try {
480
+ await this.executeJob(jobId, triggeredBy);
481
+ }
482
+ catch (error) {
483
+ log.error(`Error processing job ${jobId}:`, error instanceof Error ? error : new Error(String(error)));
484
+ throw error;
485
+ }
486
+ }
487
+ /**
488
+ * Execute a scheduled job
489
+ */
490
+ async executeJob(jobId, triggeredBy) {
491
+ const db = await getDb();
492
+ const startTime = Date.now();
493
+ const runId = crypto.randomUUID();
494
+ // Get job details
495
+ const [job] = await db
496
+ .select()
497
+ .from(scheduledJobs)
498
+ .where(eq(scheduledJobs.id, jobId));
499
+ if (!job || job.status !== 'active') {
500
+ return;
501
+ }
502
+ // Record run start
503
+ await db.insert(jobRunHistory).values({
504
+ id: runId,
505
+ jobId,
506
+ startedAt: new Date(),
507
+ status: 'running',
508
+ triggeredBy,
509
+ });
510
+ let result;
511
+ try {
512
+ // Execute based on job type
513
+ switch (job.jobType) {
514
+ case 'http':
515
+ result = await this.executeHttpJob(job.payload);
516
+ break;
517
+ case 'tool':
518
+ result = await this.executeToolJob(job.payload);
519
+ break;
520
+ case 'script':
521
+ result = await this.executeScriptJob(job.payload);
522
+ break;
523
+ case 'message':
524
+ result = await this.executeMessageJob(job.payload);
525
+ break;
526
+ default:
527
+ result = { success: false, error: `Unknown job type: ${job.jobType}`, durationMs: 0 };
528
+ }
529
+ }
530
+ catch (error) {
531
+ result = {
532
+ success: false,
533
+ error: error instanceof Error ? error.message : String(error),
534
+ durationMs: Date.now() - startTime,
535
+ };
536
+ }
537
+ const durationMs = Date.now() - startTime;
538
+ // Update run history
539
+ await db
540
+ .update(jobRunHistory)
541
+ .set({
542
+ completedAt: new Date(),
543
+ durationMs,
544
+ status: result.success ? 'success' : 'error',
545
+ output: result.output?.slice(0, 10000), // Truncate output
546
+ error: result.error,
547
+ })
548
+ .where(eq(jobRunHistory.id, runId));
549
+ // Update job stats
550
+ const newRunCount = job.runCount + 1;
551
+ const newSuccessCount = result.success ? job.successCount + 1 : job.successCount;
552
+ const newFailureCount = result.success ? 0 : job.failureCount + 1; // Reset on success
553
+ const newRetryCount = result.success ? 0 : (job.currentRetryCount || 0) + 1;
554
+ // Determine job status and next run
555
+ let newStatus = 'active';
556
+ let nextRunAt = null;
557
+ let shouldDelete = false;
558
+ // Check completion conditions
559
+ const isOneShot = !!job.runAt && !job.cronExpression && !job.intervalMs;
560
+ const isEventTriggered = !!job.eventTrigger;
561
+ if (job.maxRuns && newRunCount >= job.maxRuns) {
562
+ // Max runs reached
563
+ newStatus = 'completed';
564
+ if (job.deleteOnComplete && result.success) {
565
+ shouldDelete = true;
566
+ }
567
+ }
568
+ else if (job.maxFailures && newFailureCount >= job.maxFailures) {
569
+ // Max failures reached
570
+ newStatus = 'failed';
571
+ }
572
+ else if (isOneShot && result.success) {
573
+ // One-shot job completed successfully
574
+ newStatus = 'completed';
575
+ if (job.deleteOnComplete) {
576
+ shouldDelete = true;
577
+ }
578
+ }
579
+ else if (!result.success && job.retryOnFailure) {
580
+ // Schedule retry with exponential backoff
581
+ const maxRetries = job.maxFailures || 3;
582
+ if (newRetryCount <= maxRetries) {
583
+ const backoffDelay = this.calculateRetryDelay(newRetryCount, job.retryDelayMs || 60000, job.retryBackoffMultiplier || 2, job.retryMaxDelayMs || 3600000);
584
+ nextRunAt = new Date(Date.now() + backoffDelay);
585
+ log.info(`Scheduling retry ${newRetryCount}/${maxRetries} for job ${job.name} in ${backoffDelay}ms`);
586
+ // Queue retry in BullMQ
587
+ if (this.queue) {
588
+ await this.queue.add('retry-run', { jobId, triggeredBy: 'retry' }, { jobId: `retry-${jobId}-${Date.now()}`, delay: backoffDelay });
589
+ }
590
+ }
591
+ else {
592
+ newStatus = 'failed';
593
+ }
594
+ }
595
+ else if (newStatus === 'active' && !isEventTriggered) {
596
+ // Calculate next scheduled run
597
+ if (isOneShot && !result.success) {
598
+ // Failed one-shot with no retry
599
+ nextRunAt = null;
600
+ }
601
+ else {
602
+ nextRunAt = this.calculateNextRun(job.cronExpression || undefined, job.intervalMs || undefined);
603
+ }
604
+ }
605
+ // Update job record
606
+ await db
607
+ .update(scheduledJobs)
608
+ .set({
609
+ lastRunAt: new Date(),
610
+ lastRunStatus: result.success ? 'success' : 'error',
611
+ lastRunError: result.error || null,
612
+ lastRunDurationMs: durationMs,
613
+ nextRunAt,
614
+ runCount: newRunCount,
615
+ successCount: newSuccessCount,
616
+ failureCount: newFailureCount,
617
+ currentRetryCount: newRetryCount,
618
+ status: newStatus,
619
+ updatedAt: new Date(),
620
+ })
621
+ .where(eq(scheduledJobs.id, jobId));
622
+ // Deliver output to channels
623
+ if (job.delivery) {
624
+ await this.deliverOutput(job, result);
625
+ }
626
+ // Delete if configured
627
+ if (shouldDelete) {
628
+ log.info(`Auto-deleting completed job: ${job.name} (${jobId})`);
629
+ await this.deleteJob(jobId);
630
+ }
631
+ log.info(`Job ${job.name} (${jobId}) ${result.success ? 'succeeded' : 'failed'} in ${durationMs}ms`);
632
+ }
633
+ /**
634
+ * Calculate retry delay with exponential backoff
635
+ */
636
+ calculateRetryDelay(retryCount, initialDelay, multiplier, maxDelay) {
637
+ const delay = initialDelay * Math.pow(multiplier, retryCount - 1);
638
+ // Add jitter (±10%) to prevent thundering herd
639
+ const jitter = delay * (0.9 + Math.random() * 0.2);
640
+ return Math.min(jitter, maxDelay);
641
+ }
642
+ /**
643
+ * Deliver job output to configured channels
644
+ */
645
+ async deliverOutput(job, result) {
646
+ const delivery = job.delivery;
647
+ if (!delivery?.channels?.length)
648
+ return;
649
+ for (const channel of delivery.channels) {
650
+ // Check if we should deliver based on result
651
+ const shouldDeliver = (result.success && channel.onSuccess !== false) ||
652
+ (!result.success && channel.onFailure !== false);
653
+ if (!shouldDeliver)
654
+ continue;
655
+ try {
656
+ switch (channel.type) {
657
+ case 'slack':
658
+ await this.deliverToSlack(channel.target, job, result);
659
+ break;
660
+ case 'webhook':
661
+ await this.deliverToWebhook(channel.target, job, result);
662
+ break;
663
+ case 'email':
664
+ await this.deliverToEmail(channel.target, job, result);
665
+ break;
666
+ }
667
+ }
668
+ catch (error) {
669
+ log.error(`Failed to deliver to ${channel.type}:${channel.target}:`, error instanceof Error ? error : new Error(String(error)));
670
+ }
671
+ }
672
+ }
673
+ /**
674
+ * Deliver output to Slack channel
675
+ */
676
+ async deliverToSlack(target, job, result) {
677
+ // TODO: Implement Slack webhook integration
678
+ // For now, log the delivery attempt
679
+ log.info(`[Slack Delivery] Job: ${job.name}, Channel: ${target}, Success: ${result.success}`);
680
+ // This will be implemented when Slack OAuth is integrated
681
+ // Will use the Slack API to post to the channel
682
+ }
683
+ /**
684
+ * Deliver output to a webhook URL
685
+ */
686
+ async deliverToWebhook(url, job, result) {
687
+ await fetch(url, {
688
+ method: 'POST',
689
+ headers: { 'Content-Type': 'application/json' },
690
+ body: JSON.stringify({
691
+ jobId: job.id,
692
+ jobName: job.name,
693
+ success: result.success,
694
+ output: result.output,
695
+ error: result.error,
696
+ durationMs: result.durationMs,
697
+ timestamp: new Date().toISOString(),
698
+ }),
699
+ });
700
+ }
701
+ /**
702
+ * Deliver output via email
703
+ */
704
+ async deliverToEmail(email, job, result) {
705
+ // TODO: Implement email delivery
706
+ log.info(`[Email Delivery] Job: ${job.name}, To: ${email}, Success: ${result.success}`);
707
+ }
708
+ /**
709
+ * Execute an HTTP job
710
+ */
711
+ async executeHttpJob(payload) {
712
+ const startTime = Date.now();
713
+ try {
714
+ const response = await fetch(payload.url, {
715
+ method: payload.method || 'GET',
716
+ headers: payload.headers,
717
+ body: payload.body ? JSON.stringify(payload.body) : undefined,
718
+ signal: AbortSignal.timeout(payload.timeout || 30000),
719
+ });
720
+ const text = await response.text();
721
+ return {
722
+ success: response.ok,
723
+ output: `${response.status} ${response.statusText}\n${text.slice(0, 1000)}`,
724
+ error: response.ok ? undefined : `HTTP ${response.status}`,
725
+ durationMs: Date.now() - startTime,
726
+ };
727
+ }
728
+ catch (error) {
729
+ return {
730
+ success: false,
731
+ error: error instanceof Error ? error.message : String(error),
732
+ durationMs: Date.now() - startTime,
733
+ };
734
+ }
735
+ }
736
+ /**
737
+ * Execute a tool job
738
+ */
739
+ async executeToolJob(payload) {
740
+ const startTime = Date.now();
741
+ try {
742
+ // Import tool registry dynamically to avoid circular deps
743
+ const { getToolRegistry } = await import('../chat/execution/registry.js');
744
+ const registry = getToolRegistry();
745
+ const tool = registry.get(payload.tool);
746
+ if (!tool) {
747
+ return {
748
+ success: false,
749
+ error: `Tool not found: ${payload.tool}`,
750
+ durationMs: Date.now() - startTime,
751
+ };
752
+ }
753
+ // Create minimal execution context
754
+ const context = {
755
+ toolCallId: crypto.randomUUID(),
756
+ conversationId: payload.conversationId || 'scheduled-job',
757
+ workdir: process.cwd(),
758
+ env: getProcessEnv(),
759
+ securityPolicy: { mode: 'full' },
760
+ sessionManager: createNoopSessionManager(),
761
+ };
762
+ const result = await tool.execute(context, payload.params);
763
+ return {
764
+ success: result.success,
765
+ output: result.output || JSON.stringify(result.data),
766
+ error: result.error?.message,
767
+ durationMs: Date.now() - startTime,
768
+ };
769
+ }
770
+ catch (error) {
771
+ return {
772
+ success: false,
773
+ error: error instanceof Error ? error.message : String(error),
774
+ durationMs: Date.now() - startTime,
775
+ };
776
+ }
777
+ }
778
+ /**
779
+ * Execute a script job
780
+ * Security: Commands are validated against an allowlist and shell execution is disabled
781
+ */
782
+ async executeScriptJob(payload) {
783
+ const startTime = Date.now();
784
+ try {
785
+ // Import security validation
786
+ const { validateCommand } = await import('../utils/security.js');
787
+ const { spawn } = await import('child_process');
788
+ // Validate command against allowlist and check for injection
789
+ const validation = validateCommand(payload.command, payload.args);
790
+ if (!validation.valid) {
791
+ return {
792
+ success: false,
793
+ error: `Command validation failed: ${validation.error}`,
794
+ durationMs: Date.now() - startTime,
795
+ };
796
+ }
797
+ return new Promise((resolve) => {
798
+ const args = validation.sanitizedArgs || [];
799
+ // SECURITY: shell: false prevents shell injection attacks
800
+ const proc = spawn(validation.sanitizedCommand, args, {
801
+ cwd: payload.workdir || process.cwd(),
802
+ timeout: payload.timeout || 60000,
803
+ shell: false, // Explicitly disable shell to prevent injection
804
+ });
805
+ let stdout = '';
806
+ let stderr = '';
807
+ proc.stdout?.on('data', (data) => {
808
+ stdout += data.toString();
809
+ });
810
+ proc.stderr?.on('data', (data) => {
811
+ stderr += data.toString();
812
+ });
813
+ proc.on('close', (code) => {
814
+ resolve({
815
+ success: code === 0,
816
+ output: stdout.slice(0, 10000),
817
+ error: code !== 0 ? (stderr || `Exit code: ${code}`) : undefined,
818
+ durationMs: Date.now() - startTime,
819
+ });
820
+ });
821
+ proc.on('error', (err) => {
822
+ resolve({
823
+ success: false,
824
+ error: err.message,
825
+ durationMs: Date.now() - startTime,
826
+ });
827
+ });
828
+ });
829
+ }
830
+ catch (error) {
831
+ return {
832
+ success: false,
833
+ error: error instanceof Error ? error.message : String(error),
834
+ durationMs: Date.now() - startTime,
835
+ };
836
+ }
837
+ }
838
+ /**
839
+ * Execute a message job
840
+ */
841
+ async executeMessageJob(payload) {
842
+ const startTime = Date.now();
843
+ try {
844
+ // This would integrate with the chat system to send a message
845
+ // For now, just log it
846
+ log.info(`Message job: Would send to ${payload.conversationId}: ${payload.content.slice(0, 100)}`);
847
+ return {
848
+ success: true,
849
+ output: `Message queued for conversation ${payload.conversationId}`,
850
+ durationMs: Date.now() - startTime,
851
+ };
852
+ }
853
+ catch (error) {
854
+ return {
855
+ success: false,
856
+ error: error instanceof Error ? error.message : String(error),
857
+ durationMs: Date.now() - startTime,
858
+ };
859
+ }
860
+ }
861
+ /**
862
+ * Calculate next run time from cron or interval
863
+ */
864
+ calculateNextRun(cronExpression, intervalMs) {
865
+ const now = Date.now();
866
+ if (intervalMs) {
867
+ return new Date(now + intervalMs);
868
+ }
869
+ if (cronExpression) {
870
+ // Simple cron parsing for common patterns
871
+ // BullMQ handles the actual scheduling
872
+ return new Date(now + 60000); // Default: 1 minute from now
873
+ }
874
+ return null;
875
+ }
876
+ /**
877
+ * Map database row to ScheduledJob type
878
+ */
879
+ mapToScheduledJob(row) {
880
+ return {
881
+ id: row.id,
882
+ name: row.name,
883
+ description: row.description || undefined,
884
+ // Schedule
885
+ cronExpression: row.cronExpression || undefined,
886
+ intervalMs: row.intervalMs || undefined,
887
+ runAt: row.runAt ? new Date(row.runAt) : undefined,
888
+ timezone: row.timezone || 'UTC',
889
+ // Event trigger
890
+ eventTrigger: row.eventTrigger || undefined,
891
+ // Execution
892
+ jobType: row.jobType,
893
+ payload: row.payload,
894
+ templateId: row.templateId || undefined,
895
+ // Labels
896
+ labels: row.labels || [],
897
+ // Delivery
898
+ delivery: row.delivery || undefined,
899
+ // Status
900
+ status: row.status,
901
+ userId: row.userId || undefined,
902
+ projectId: row.projectId || undefined,
903
+ createdBy: row.createdBy,
904
+ // Execution tracking
905
+ lastRunAt: row.lastRunAt ? new Date(row.lastRunAt) : undefined,
906
+ lastRunStatus: row.lastRunStatus || undefined,
907
+ lastRunError: row.lastRunError || undefined,
908
+ nextRunAt: row.nextRunAt ? new Date(row.nextRunAt) : undefined,
909
+ // Stats
910
+ runCount: row.runCount,
911
+ successCount: row.successCount,
912
+ failureCount: row.failureCount,
913
+ // Limits
914
+ maxRuns: row.maxRuns || undefined,
915
+ maxFailures: row.maxFailures || undefined,
916
+ // Retry policy
917
+ retryOnFailure: row.retryOnFailure ?? true,
918
+ retryDelayMs: row.retryDelayMs ?? 60000,
919
+ retryBackoffMultiplier: row.retryBackoffMultiplier ?? 2,
920
+ retryMaxDelayMs: row.retryMaxDelayMs ?? 3600000,
921
+ currentRetryCount: row.currentRetryCount ?? 0,
922
+ // One-shot options
923
+ deleteOnComplete: row.deleteOnComplete ?? false,
924
+ // Timestamps
925
+ createdAt: new Date(row.createdAt),
926
+ updatedAt: new Date(row.updatedAt),
927
+ expiresAt: row.expiresAt ? new Date(row.expiresAt) : undefined,
928
+ archivedAt: row.archivedAt ? new Date(row.archivedAt) : undefined,
929
+ };
930
+ }
931
+ /**
932
+ * Trigger a job by event (for event-driven jobs)
933
+ */
934
+ async triggerByEvent(eventType, eventData) {
935
+ const db = await getDb();
936
+ const triggered = [];
937
+ // Find jobs listening for this event type
938
+ const jobs = await db
939
+ .select()
940
+ .from(scheduledJobs)
941
+ .where(eq(scheduledJobs.status, 'active'));
942
+ for (const job of jobs) {
943
+ const trigger = job.eventTrigger;
944
+ if (!trigger || trigger.type !== eventType)
945
+ continue;
946
+ // Check if event matches trigger config
947
+ if (this.matchesEventTrigger(trigger, eventData)) {
948
+ // Queue execution
949
+ if (this.queue) {
950
+ await this.queue.add('event-triggered-run', { jobId: job.id, triggeredBy: `event:${eventType}`, eventData }, { jobId: `event-${job.id}-${Date.now()}` });
951
+ }
952
+ else {
953
+ await this.executeJob(job.id, `event:${eventType}`);
954
+ }
955
+ triggered.push(job.id);
956
+ log.info(`Triggered job ${job.name} by event: ${eventType}`);
957
+ }
958
+ }
959
+ return { triggered };
960
+ }
961
+ /**
962
+ * Check if event data matches a trigger config
963
+ */
964
+ matchesEventTrigger(trigger, eventData) {
965
+ const config = trigger.config;
966
+ const source = getStringValue(config, 'source');
967
+ const eventType = getStringValue(config, 'eventType');
968
+ const pathPattern = getStringValue(config, 'pathPattern');
969
+ const eventSource = getStringValue(eventData, 'source');
970
+ const triggeredEventType = getStringValue(eventData, 'eventType');
971
+ const eventPath = getStringValue(eventData, 'path');
972
+ switch (trigger.type) {
973
+ case 'webhook':
974
+ // Match by webhook secret or source
975
+ return !source || source === eventSource;
976
+ case 'ticket':
977
+ // Match by ticket event type (created, updated, status_changed)
978
+ return !eventType || eventType === triggeredEventType;
979
+ case 'file':
980
+ // Match by file path pattern
981
+ if (pathPattern && eventPath) {
982
+ const regex = new RegExp(pathPattern);
983
+ return regex.test(eventPath);
984
+ }
985
+ return true;
986
+ case 'github':
987
+ // Match by GitHub event type (push, pull_request, issue)
988
+ return !eventType || eventType === triggeredEventType;
989
+ default:
990
+ return true;
991
+ }
992
+ }
993
+ }
994
+ // Export singleton functions
995
+ export const createScheduledJob = (params) => getScheduler().createJob(params);
996
+ export const getScheduledJob = (id) => getScheduler().getJob(id);
997
+ export const listScheduledJobs = (filters) => getScheduler().listJobs(filters);
998
+ export const updateScheduledJob = (id, updates) => getScheduler().updateJob(id, updates);
999
+ export const pauseScheduledJob = (id) => getScheduler().pauseJob(id);
1000
+ export const resumeScheduledJob = (id) => getScheduler().resumeJob(id);
1001
+ export const deleteScheduledJob = (id) => getScheduler().deleteJob(id);
1002
+ export const archiveScheduledJob = (id) => getScheduler().archiveJob(id);
1003
+ export const restoreScheduledJob = (id) => getScheduler().restoreJob(id);
1004
+ export const triggerScheduledJob = (id) => getScheduler().triggerJob(id);
1005
+ export const getJobRunHistory = (jobId, limit) => getScheduler().getJobHistory(jobId, limit);
1006
+ export const startScheduler = () => getScheduler().start();
1007
+ export const stopScheduler = () => getScheduler().stop();
1008
+ //# sourceMappingURL=scheduler.js.map