beecork 1.2.0 → 1.3.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 (390) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -0
  3. package/dist/capabilities/index.d.ts +0 -1
  4. package/dist/capabilities/index.js +0 -1
  5. package/dist/capabilities/manager.d.ts +0 -1
  6. package/dist/capabilities/manager.js +0 -1
  7. package/dist/capabilities/packs.d.ts +0 -1
  8. package/dist/capabilities/packs.js +7 -8
  9. package/dist/capabilities/types.d.ts +0 -1
  10. package/dist/capabilities/types.js +0 -1
  11. package/dist/channels/command-handler.d.ts +0 -1
  12. package/dist/channels/command-handler.js +26 -1
  13. package/dist/channels/discord.d.ts +1 -1
  14. package/dist/channels/discord.js +36 -47
  15. package/dist/channels/index.d.ts +0 -1
  16. package/dist/channels/index.js +0 -1
  17. package/dist/channels/loader.d.ts +0 -1
  18. package/dist/channels/loader.js +6 -1
  19. package/dist/channels/pipeline.d.ts +50 -0
  20. package/dist/channels/pipeline.js +83 -0
  21. package/dist/channels/registry.d.ts +0 -1
  22. package/dist/channels/registry.js +0 -1
  23. package/dist/channels/telegram.d.ts +1 -1
  24. package/dist/channels/telegram.js +99 -60
  25. package/dist/channels/types.d.ts +0 -1
  26. package/dist/channels/types.js +0 -1
  27. package/dist/channels/webhook.d.ts +0 -1
  28. package/dist/channels/webhook.js +0 -1
  29. package/dist/channels/whatsapp.d.ts +1 -1
  30. package/dist/channels/whatsapp.js +26 -52
  31. package/dist/cli/capabilities.d.ts +0 -1
  32. package/dist/cli/capabilities.js +0 -1
  33. package/dist/cli/channel.d.ts +0 -1
  34. package/dist/cli/channel.js +1 -2
  35. package/dist/cli/commands.d.ts +2 -1
  36. package/dist/cli/commands.js +49 -15
  37. package/dist/cli/doctor.d.ts +0 -1
  38. package/dist/cli/doctor.js +2 -2
  39. package/dist/cli/handoff.d.ts +0 -1
  40. package/dist/cli/handoff.js +0 -1
  41. package/dist/cli/helpers.d.ts +0 -1
  42. package/dist/cli/helpers.js +0 -1
  43. package/dist/cli/mcp.d.ts +0 -1
  44. package/dist/cli/mcp.js +0 -1
  45. package/dist/cli/media.d.ts +0 -1
  46. package/dist/cli/media.js +0 -1
  47. package/dist/cli/setup.d.ts +0 -1
  48. package/dist/cli/setup.js +13 -12
  49. package/dist/cli/store.d.ts +3 -0
  50. package/dist/cli/store.js +91 -0
  51. package/dist/config.d.ts +0 -1
  52. package/dist/config.js +0 -1
  53. package/dist/daemon.d.ts +0 -1
  54. package/dist/daemon.js +21 -11
  55. package/dist/dashboard/html.d.ts +0 -1
  56. package/dist/dashboard/html.js +169 -42
  57. package/dist/dashboard/server.d.ts +0 -1
  58. package/dist/dashboard/server.js +166 -35
  59. package/dist/db/index.d.ts +11 -1
  60. package/dist/db/index.js +12 -1
  61. package/dist/db/migrations.d.ts +0 -1
  62. package/dist/db/migrations.js +44 -1
  63. package/dist/delegation/manager.d.ts +0 -3
  64. package/dist/delegation/manager.js +0 -5
  65. package/dist/index.d.ts +0 -1
  66. package/dist/index.js +124 -6
  67. package/dist/knowledge/index.d.ts +2 -0
  68. package/dist/knowledge/index.js +1 -0
  69. package/dist/knowledge/manager.d.ts +17 -0
  70. package/dist/knowledge/manager.js +146 -0
  71. package/dist/knowledge/types.d.ts +7 -0
  72. package/dist/knowledge/types.js +1 -0
  73. package/dist/machines/index.d.ts +1 -3
  74. package/dist/machines/index.js +1 -3
  75. package/dist/machines/registry.d.ts +0 -7
  76. package/dist/machines/registry.js +0 -25
  77. package/dist/mcp/server.d.ts +0 -1
  78. package/dist/mcp/server.js +275 -80
  79. package/dist/media/factory.d.ts +0 -1
  80. package/dist/media/factory.js +0 -1
  81. package/dist/media/generators/dall-e.d.ts +0 -1
  82. package/dist/media/generators/dall-e.js +0 -1
  83. package/dist/media/generators/elevenlabs-music.d.ts +0 -1
  84. package/dist/media/generators/elevenlabs-music.js +0 -1
  85. package/dist/media/generators/elevenlabs-sfx.d.ts +0 -1
  86. package/dist/media/generators/elevenlabs-sfx.js +0 -1
  87. package/dist/media/generators/kling.d.ts +0 -1
  88. package/dist/media/generators/kling.js +14 -20
  89. package/dist/media/generators/lyria.d.ts +0 -1
  90. package/dist/media/generators/lyria.js +0 -1
  91. package/dist/media/generators/nano-banana.d.ts +0 -1
  92. package/dist/media/generators/nano-banana.js +0 -1
  93. package/dist/media/generators/poll-util.d.ts +12 -0
  94. package/dist/media/generators/poll-util.js +22 -0
  95. package/dist/media/generators/recraft.d.ts +0 -1
  96. package/dist/media/generators/recraft.js +0 -1
  97. package/dist/media/generators/runway.d.ts +0 -1
  98. package/dist/media/generators/runway.js +14 -23
  99. package/dist/media/generators/stable-diffusion.d.ts +0 -1
  100. package/dist/media/generators/stable-diffusion.js +0 -1
  101. package/dist/media/generators/veo.d.ts +0 -1
  102. package/dist/media/generators/veo.js +0 -1
  103. package/dist/media/index.d.ts +0 -2
  104. package/dist/media/index.js +0 -2
  105. package/dist/media/store.d.ts +0 -1
  106. package/dist/media/store.js +0 -1
  107. package/dist/media/types.d.ts +0 -1
  108. package/dist/media/types.js +0 -1
  109. package/dist/memory/extractor.d.ts +0 -1
  110. package/dist/memory/extractor.js +8 -3
  111. package/dist/notifications/index.d.ts +0 -1
  112. package/dist/notifications/index.js +0 -1
  113. package/dist/notifications/ntfy.d.ts +0 -1
  114. package/dist/notifications/ntfy.js +0 -1
  115. package/dist/notifications/pushover.d.ts +0 -1
  116. package/dist/notifications/pushover.js +0 -1
  117. package/dist/notifications/types.d.ts +0 -1
  118. package/dist/notifications/types.js +0 -1
  119. package/dist/notifications/webhook-provider.d.ts +0 -1
  120. package/dist/notifications/webhook-provider.js +0 -1
  121. package/dist/observability/analytics.d.ts +0 -1
  122. package/dist/observability/analytics.js +1 -2
  123. package/dist/pipe/anthropic-client.d.ts +0 -1
  124. package/dist/pipe/anthropic-client.js +5 -3
  125. package/dist/pipe/brain.d.ts +0 -1
  126. package/dist/pipe/brain.js +0 -1
  127. package/dist/pipe/memory-store.d.ts +0 -1
  128. package/dist/pipe/memory-store.js +0 -1
  129. package/dist/pipe/project-scanner.d.ts +5 -3
  130. package/dist/pipe/project-scanner.js +21 -90
  131. package/dist/pipe/types.d.ts +0 -11
  132. package/dist/pipe/types.js +0 -1
  133. package/dist/projects/index.d.ts +0 -1
  134. package/dist/projects/index.js +0 -1
  135. package/dist/projects/manager.d.ts +0 -1
  136. package/dist/projects/manager.js +0 -1
  137. package/dist/projects/router.d.ts +0 -1
  138. package/dist/projects/router.js +1 -2
  139. package/dist/projects/types.d.ts +0 -7
  140. package/dist/projects/types.js +0 -1
  141. package/dist/service/install.d.ts +0 -1
  142. package/dist/service/install.js +0 -1
  143. package/dist/service/templates.d.ts +0 -1
  144. package/dist/service/templates.js +0 -1
  145. package/dist/service/windows.d.ts +0 -3
  146. package/dist/service/windows.js +0 -11
  147. package/dist/session/circuit-breaker.d.ts +0 -1
  148. package/dist/session/circuit-breaker.js +0 -1
  149. package/dist/session/context-monitor.d.ts +0 -1
  150. package/dist/session/context-monitor.js +0 -1
  151. package/dist/session/manager.d.ts +0 -1
  152. package/dist/session/manager.js +18 -6
  153. package/dist/session/subprocess.d.ts +0 -1
  154. package/dist/session/subprocess.js +0 -1
  155. package/dist/session/tool-classifier.d.ts +0 -1
  156. package/dist/session/tool-classifier.js +0 -1
  157. package/dist/{cron → tasks}/scheduler.d.ts +5 -4
  158. package/dist/{cron → tasks}/scheduler.js +31 -29
  159. package/dist/tasks/store.d.ts +11 -0
  160. package/dist/{cron → tasks}/store.js +12 -13
  161. package/dist/timeline/index.d.ts +3 -0
  162. package/dist/timeline/index.js +2 -0
  163. package/dist/timeline/logger.d.ts +8 -0
  164. package/dist/timeline/logger.js +9 -0
  165. package/dist/timeline/query.d.ts +11 -0
  166. package/dist/timeline/query.js +57 -0
  167. package/dist/timeline/types.d.ts +12 -0
  168. package/dist/timeline/types.js +1 -0
  169. package/dist/types.d.ts +6 -6
  170. package/dist/types.js +0 -1
  171. package/dist/users/index.d.ts +1 -2
  172. package/dist/users/index.js +1 -2
  173. package/dist/users/service.d.ts +0 -8
  174. package/dist/users/service.js +0 -19
  175. package/dist/util/logger.d.ts +0 -1
  176. package/dist/util/logger.js +0 -1
  177. package/dist/util/paths.d.ts +0 -1
  178. package/dist/util/paths.js +0 -1
  179. package/dist/util/platform.d.ts +0 -1
  180. package/dist/util/platform.js +0 -1
  181. package/dist/util/progress.d.ts +0 -1
  182. package/dist/util/progress.js +0 -1
  183. package/dist/util/rate-limiter.d.ts +0 -1
  184. package/dist/util/rate-limiter.js +0 -1
  185. package/dist/util/retry.d.ts +0 -1
  186. package/dist/util/retry.js +1 -2
  187. package/dist/util/text.d.ts +0 -1
  188. package/dist/util/text.js +0 -1
  189. package/dist/version.d.ts +0 -1
  190. package/dist/version.js +0 -1
  191. package/dist/voice/index.d.ts +8 -1
  192. package/dist/voice/index.js +23 -1
  193. package/dist/voice/stt.d.ts +2 -1
  194. package/dist/voice/stt.js +10 -1
  195. package/dist/voice/tts.d.ts +0 -1
  196. package/dist/voice/tts.js +0 -1
  197. package/dist/watchers/evaluator.d.ts +5 -0
  198. package/dist/watchers/evaluator.js +45 -0
  199. package/dist/watchers/index.d.ts +4 -0
  200. package/dist/watchers/index.js +3 -0
  201. package/dist/watchers/scheduler.d.ts +13 -0
  202. package/dist/watchers/scheduler.js +133 -0
  203. package/dist/watchers/store.d.ts +10 -0
  204. package/dist/watchers/store.js +56 -0
  205. package/dist/watchers/types.d.ts +15 -0
  206. package/dist/watchers/types.js +1 -0
  207. package/package.json +25 -2
  208. package/dist/capabilities/index.d.ts.map +0 -1
  209. package/dist/capabilities/index.js.map +0 -1
  210. package/dist/capabilities/manager.d.ts.map +0 -1
  211. package/dist/capabilities/manager.js.map +0 -1
  212. package/dist/capabilities/packs.d.ts.map +0 -1
  213. package/dist/capabilities/packs.js.map +0 -1
  214. package/dist/capabilities/types.d.ts.map +0 -1
  215. package/dist/capabilities/types.js.map +0 -1
  216. package/dist/channels/command-handler.d.ts.map +0 -1
  217. package/dist/channels/command-handler.js.map +0 -1
  218. package/dist/channels/discord.d.ts.map +0 -1
  219. package/dist/channels/discord.js.map +0 -1
  220. package/dist/channels/index.d.ts.map +0 -1
  221. package/dist/channels/index.js.map +0 -1
  222. package/dist/channels/loader.d.ts.map +0 -1
  223. package/dist/channels/loader.js.map +0 -1
  224. package/dist/channels/registry.d.ts.map +0 -1
  225. package/dist/channels/registry.js.map +0 -1
  226. package/dist/channels/telegram.d.ts.map +0 -1
  227. package/dist/channels/telegram.js.map +0 -1
  228. package/dist/channels/types.d.ts.map +0 -1
  229. package/dist/channels/types.js.map +0 -1
  230. package/dist/channels/webhook.d.ts.map +0 -1
  231. package/dist/channels/webhook.js.map +0 -1
  232. package/dist/channels/whatsapp.d.ts.map +0 -1
  233. package/dist/channels/whatsapp.js.map +0 -1
  234. package/dist/cli/capabilities.d.ts.map +0 -1
  235. package/dist/cli/capabilities.js.map +0 -1
  236. package/dist/cli/channel.d.ts.map +0 -1
  237. package/dist/cli/channel.js.map +0 -1
  238. package/dist/cli/commands.d.ts.map +0 -1
  239. package/dist/cli/commands.js.map +0 -1
  240. package/dist/cli/doctor.d.ts.map +0 -1
  241. package/dist/cli/doctor.js.map +0 -1
  242. package/dist/cli/handoff.d.ts.map +0 -1
  243. package/dist/cli/handoff.js.map +0 -1
  244. package/dist/cli/helpers.d.ts.map +0 -1
  245. package/dist/cli/helpers.js.map +0 -1
  246. package/dist/cli/mcp.d.ts.map +0 -1
  247. package/dist/cli/mcp.js.map +0 -1
  248. package/dist/cli/media.d.ts.map +0 -1
  249. package/dist/cli/media.js.map +0 -1
  250. package/dist/cli/setup.d.ts.map +0 -1
  251. package/dist/cli/setup.js.map +0 -1
  252. package/dist/config.d.ts.map +0 -1
  253. package/dist/config.js.map +0 -1
  254. package/dist/cron/scheduler.d.ts.map +0 -1
  255. package/dist/cron/scheduler.js.map +0 -1
  256. package/dist/cron/store.d.ts +0 -12
  257. package/dist/cron/store.d.ts.map +0 -1
  258. package/dist/cron/store.js.map +0 -1
  259. package/dist/daemon.d.ts.map +0 -1
  260. package/dist/daemon.js.map +0 -1
  261. package/dist/dashboard/html.d.ts.map +0 -1
  262. package/dist/dashboard/html.js.map +0 -1
  263. package/dist/dashboard/server.d.ts.map +0 -1
  264. package/dist/dashboard/server.js.map +0 -1
  265. package/dist/db/index.d.ts.map +0 -1
  266. package/dist/db/index.js.map +0 -1
  267. package/dist/db/migrations.d.ts.map +0 -1
  268. package/dist/db/migrations.js.map +0 -1
  269. package/dist/delegation/manager.d.ts.map +0 -1
  270. package/dist/delegation/manager.js.map +0 -1
  271. package/dist/index.d.ts.map +0 -1
  272. package/dist/index.js.map +0 -1
  273. package/dist/machines/forwarder.d.ts +0 -7
  274. package/dist/machines/forwarder.d.ts.map +0 -1
  275. package/dist/machines/forwarder.js +0 -35
  276. package/dist/machines/forwarder.js.map +0 -1
  277. package/dist/machines/index.d.ts.map +0 -1
  278. package/dist/machines/index.js.map +0 -1
  279. package/dist/machines/registry.d.ts.map +0 -1
  280. package/dist/machines/registry.js.map +0 -1
  281. package/dist/mcp/server.d.ts.map +0 -1
  282. package/dist/mcp/server.js.map +0 -1
  283. package/dist/media/factory.d.ts.map +0 -1
  284. package/dist/media/factory.js.map +0 -1
  285. package/dist/media/generators/dall-e.d.ts.map +0 -1
  286. package/dist/media/generators/dall-e.js.map +0 -1
  287. package/dist/media/generators/elevenlabs-music.d.ts.map +0 -1
  288. package/dist/media/generators/elevenlabs-music.js.map +0 -1
  289. package/dist/media/generators/elevenlabs-sfx.d.ts.map +0 -1
  290. package/dist/media/generators/elevenlabs-sfx.js.map +0 -1
  291. package/dist/media/generators/kling.d.ts.map +0 -1
  292. package/dist/media/generators/kling.js.map +0 -1
  293. package/dist/media/generators/lyria.d.ts.map +0 -1
  294. package/dist/media/generators/lyria.js.map +0 -1
  295. package/dist/media/generators/nano-banana.d.ts.map +0 -1
  296. package/dist/media/generators/nano-banana.js.map +0 -1
  297. package/dist/media/generators/recraft.d.ts.map +0 -1
  298. package/dist/media/generators/recraft.js.map +0 -1
  299. package/dist/media/generators/runway.d.ts.map +0 -1
  300. package/dist/media/generators/runway.js.map +0 -1
  301. package/dist/media/generators/stable-diffusion.d.ts.map +0 -1
  302. package/dist/media/generators/stable-diffusion.js.map +0 -1
  303. package/dist/media/generators/veo.d.ts.map +0 -1
  304. package/dist/media/generators/veo.js.map +0 -1
  305. package/dist/media/index.d.ts.map +0 -1
  306. package/dist/media/index.js.map +0 -1
  307. package/dist/media/loader.d.ts +0 -8
  308. package/dist/media/loader.d.ts.map +0 -1
  309. package/dist/media/loader.js +0 -46
  310. package/dist/media/loader.js.map +0 -1
  311. package/dist/media/store.d.ts.map +0 -1
  312. package/dist/media/store.js.map +0 -1
  313. package/dist/media/types.d.ts.map +0 -1
  314. package/dist/media/types.js.map +0 -1
  315. package/dist/memory/extractor.d.ts.map +0 -1
  316. package/dist/memory/extractor.js.map +0 -1
  317. package/dist/notifications/index.d.ts.map +0 -1
  318. package/dist/notifications/index.js.map +0 -1
  319. package/dist/notifications/ntfy.d.ts.map +0 -1
  320. package/dist/notifications/ntfy.js.map +0 -1
  321. package/dist/notifications/pushover.d.ts.map +0 -1
  322. package/dist/notifications/pushover.js.map +0 -1
  323. package/dist/notifications/types.d.ts.map +0 -1
  324. package/dist/notifications/types.js.map +0 -1
  325. package/dist/notifications/webhook-provider.d.ts.map +0 -1
  326. package/dist/notifications/webhook-provider.js.map +0 -1
  327. package/dist/observability/analytics.d.ts.map +0 -1
  328. package/dist/observability/analytics.js.map +0 -1
  329. package/dist/pipe/anthropic-client.d.ts.map +0 -1
  330. package/dist/pipe/anthropic-client.js.map +0 -1
  331. package/dist/pipe/brain.d.ts.map +0 -1
  332. package/dist/pipe/brain.js.map +0 -1
  333. package/dist/pipe/memory-store.d.ts.map +0 -1
  334. package/dist/pipe/memory-store.js.map +0 -1
  335. package/dist/pipe/project-scanner.d.ts.map +0 -1
  336. package/dist/pipe/project-scanner.js.map +0 -1
  337. package/dist/pipe/types.d.ts.map +0 -1
  338. package/dist/pipe/types.js.map +0 -1
  339. package/dist/projects/index.d.ts.map +0 -1
  340. package/dist/projects/index.js.map +0 -1
  341. package/dist/projects/manager.d.ts.map +0 -1
  342. package/dist/projects/manager.js.map +0 -1
  343. package/dist/projects/router.d.ts.map +0 -1
  344. package/dist/projects/router.js.map +0 -1
  345. package/dist/projects/types.d.ts.map +0 -1
  346. package/dist/projects/types.js.map +0 -1
  347. package/dist/service/install.d.ts.map +0 -1
  348. package/dist/service/install.js.map +0 -1
  349. package/dist/service/templates.d.ts.map +0 -1
  350. package/dist/service/templates.js.map +0 -1
  351. package/dist/service/windows.d.ts.map +0 -1
  352. package/dist/service/windows.js.map +0 -1
  353. package/dist/session/circuit-breaker.d.ts.map +0 -1
  354. package/dist/session/circuit-breaker.js.map +0 -1
  355. package/dist/session/context-monitor.d.ts.map +0 -1
  356. package/dist/session/context-monitor.js.map +0 -1
  357. package/dist/session/manager.d.ts.map +0 -1
  358. package/dist/session/manager.js.map +0 -1
  359. package/dist/session/subprocess.d.ts.map +0 -1
  360. package/dist/session/subprocess.js.map +0 -1
  361. package/dist/session/tool-classifier.d.ts.map +0 -1
  362. package/dist/session/tool-classifier.js.map +0 -1
  363. package/dist/types.d.ts.map +0 -1
  364. package/dist/types.js.map +0 -1
  365. package/dist/users/index.d.ts.map +0 -1
  366. package/dist/users/index.js.map +0 -1
  367. package/dist/users/service.d.ts.map +0 -1
  368. package/dist/users/service.js.map +0 -1
  369. package/dist/util/logger.d.ts.map +0 -1
  370. package/dist/util/logger.js.map +0 -1
  371. package/dist/util/paths.d.ts.map +0 -1
  372. package/dist/util/paths.js.map +0 -1
  373. package/dist/util/platform.d.ts.map +0 -1
  374. package/dist/util/platform.js.map +0 -1
  375. package/dist/util/progress.d.ts.map +0 -1
  376. package/dist/util/progress.js.map +0 -1
  377. package/dist/util/rate-limiter.d.ts.map +0 -1
  378. package/dist/util/rate-limiter.js.map +0 -1
  379. package/dist/util/retry.d.ts.map +0 -1
  380. package/dist/util/retry.js.map +0 -1
  381. package/dist/util/text.d.ts.map +0 -1
  382. package/dist/util/text.js.map +0 -1
  383. package/dist/version.d.ts.map +0 -1
  384. package/dist/version.js.map +0 -1
  385. package/dist/voice/index.d.ts.map +0 -1
  386. package/dist/voice/index.js.map +0 -1
  387. package/dist/voice/stt.d.ts.map +0 -1
  388. package/dist/voice/stt.js.map +0 -1
  389. package/dist/voice/tts.d.ts.map +0 -1
  390. package/dist/voice/tts.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  import http from 'node:http';
2
2
  import crypto from 'node:crypto';
3
- import { execFile } from 'node:child_process';
3
+ import { execFile, exec } from 'node:child_process';
4
+ import { promisify } from 'node:util';
4
5
  import { platform } from 'node:os';
5
6
  import Database from 'better-sqlite3';
6
7
  import { getDbPath } from '../util/paths.js';
@@ -8,6 +9,7 @@ import { getDashboardHtml } from './html.js';
8
9
  import { VERSION } from '../version.js';
9
10
  import { getDaemonPid } from '../cli/helpers.js';
10
11
  import { validateTabName } from '../config.js';
12
+ import { createTabRecord } from '../db/index.js';
11
13
  let cachedDashDb = null;
12
14
  function getDashDb() {
13
15
  if (!cachedDashDb) {
@@ -16,22 +18,32 @@ function getDashDb() {
16
18
  }
17
19
  return cachedDashDb;
18
20
  }
19
- function withWriteDb(fn) {
20
- const db = new Database(getDbPath());
21
- try {
22
- return fn(db);
23
- }
24
- finally {
25
- db.close();
21
+ let cachedWriteDb = null;
22
+ function getWriteDb() {
23
+ if (!cachedWriteDb) {
24
+ cachedWriteDb = new Database(getDbPath());
25
+ cachedWriteDb.pragma('journal_mode = WAL');
26
26
  }
27
+ return cachedWriteDb;
28
+ }
29
+ function withWriteDb(fn) {
30
+ return fn(getWriteDb());
27
31
  }
28
32
  function json(res, data, status = 200) {
29
33
  res.writeHead(status, { 'Content-Type': 'application/json' });
30
34
  res.end(JSON.stringify(data));
31
35
  }
32
36
  function openBrowser(url) {
33
- const cmd = platform() === 'darwin' ? 'open' : 'xdg-open';
34
- execFile(cmd, [url]);
37
+ const p = platform();
38
+ if (p === 'darwin') {
39
+ execFile('open', [url]);
40
+ }
41
+ else if (p === 'win32') {
42
+ execFile('cmd', ['/c', 'start', url]);
43
+ }
44
+ else {
45
+ execFile('xdg-open', [url]);
46
+ }
35
47
  }
36
48
  export function startDashboardServer(port = 0) {
37
49
  // Generate auth token at server start
@@ -53,7 +65,11 @@ export function startDashboardServer(port = 0) {
53
65
  res.end('Forbidden');
54
66
  return;
55
67
  }
56
- res.writeHead(200, { 'Content-Type': 'text/html', 'Referrer-Policy': 'no-referrer' });
68
+ res.writeHead(200, {
69
+ 'Content-Type': 'text/html',
70
+ 'Referrer-Policy': 'no-referrer',
71
+ 'Set-Cookie': `beecork_dash=${authToken}; HttpOnly; SameSite=Strict; Path=/`,
72
+ });
57
73
  res.end(getDashboardHtml(authToken));
58
74
  return;
59
75
  }
@@ -61,7 +77,8 @@ export function startDashboardServer(port = 0) {
61
77
  if (path.startsWith('/api/')) {
62
78
  const authHeader = req.headers.authorization;
63
79
  const queryToken = url.searchParams.get('token');
64
- const providedToken = authHeader?.replace('Bearer ', '') || queryToken;
80
+ const cookieToken = req.headers.cookie?.split(';').map(c => c.trim()).find(c => c.startsWith('beecork_dash='))?.split('=')[1];
81
+ const providedToken = authHeader?.replace('Bearer ', '') || queryToken || cookieToken;
65
82
  if (providedToken !== authToken) {
66
83
  json(res, { error: 'Unauthorized' }, 401);
67
84
  return;
@@ -115,8 +132,9 @@ export function startDashboardServer(port = 0) {
115
132
  return;
116
133
  }
117
134
  const tabName = decodeURIComponent(path.split('/')[3]);
118
- if (!validateTabName(tabName)) {
119
- json(res, { error: 'Invalid tab name' }, 400);
135
+ const tabErr = validateTabName(tabName);
136
+ if (tabErr) {
137
+ json(res, { error: tabErr }, 400);
120
138
  return;
121
139
  }
122
140
  withWriteDb(db => db.prepare('INSERT INTO pending_messages (tab_name, message, type) VALUES (?, ?, ?)').run(tabName, message, 'user'));
@@ -146,12 +164,12 @@ export function startDashboardServer(port = 0) {
146
164
  json(res, { error: 'Missing tab name' }, 400);
147
165
  return;
148
166
  }
149
- if (!validateTabName(name)) {
150
- json(res, { error: 'Invalid tab name' }, 400);
167
+ const nameErr = validateTabName(name);
168
+ if (nameErr) {
169
+ json(res, { error: nameErr }, 400);
151
170
  return;
152
171
  }
153
- const id = crypto.randomUUID();
154
- withWriteDb(db => db.prepare('INSERT OR IGNORE INTO tabs (id, name, session_id, status, working_dir, system_prompt) VALUES (?, ?, ?, ?, ?, ?)').run(id, name, crypto.randomUUID(), 'idle', workingDir || process.env.HOME || '/', systemPrompt || null));
172
+ withWriteDb(db => createTabRecord(db, { name, workingDir, systemPrompt }));
155
173
  json(res, { success: true, name });
156
174
  return;
157
175
  }
@@ -168,8 +186,8 @@ export function startDashboardServer(port = 0) {
168
186
  json(res, { success: true });
169
187
  return;
170
188
  }
171
- // POST: Create cron job
172
- if (path === '/api/crons' && req.method === 'POST') {
189
+ // POST: Create task (supports both /api/tasks and /api/crons)
190
+ if ((path === '/api/tasks' || path === '/api/crons') && req.method === 'POST') {
173
191
  let body = '';
174
192
  for await (const chunk of req) {
175
193
  body += chunk;
@@ -192,19 +210,33 @@ export function startDashboardServer(port = 0) {
192
210
  return;
193
211
  }
194
212
  const effectiveTab = tabName || 'default';
195
- if (!validateTabName(effectiveTab)) {
196
- json(res, { error: 'Invalid tab name' }, 400);
213
+ const cronTabErr = validateTabName(effectiveTab);
214
+ if (cronTabErr) {
215
+ json(res, { error: cronTabErr }, 400);
197
216
  return;
198
217
  }
199
218
  const id = crypto.randomUUID();
200
- withWriteDb(db => db.prepare('INSERT INTO cron_jobs (id, name, schedule_type, schedule, tab_name, message, enabled) VALUES (?, ?, ?, ?, ?, ?, 1)').run(id, name, scheduleType || 'every', schedule, effectiveTab, message));
219
+ withWriteDb(db => db.prepare('INSERT INTO tasks (id, name, schedule_type, schedule, tab_name, message, enabled) VALUES (?, ?, ?, ?, ?, ?, 1)').run(id, name, scheduleType || 'every', schedule, effectiveTab, message));
201
220
  json(res, { success: true, id });
202
221
  return;
203
222
  }
204
- // DELETE: Delete cron job
205
- if (path.match(/^\/api\/crons\/[^/]+$/) && req.method === 'DELETE') {
206
- const cronId = decodeURIComponent(path.split('/')[3]);
207
- withWriteDb(db => db.prepare('DELETE FROM cron_jobs WHERE id = ?').run(cronId));
223
+ // DELETE: Delete task (supports both /api/tasks and /api/crons)
224
+ if ((path.match(/^\/api\/tasks\/[^/]+$/) || path.match(/^\/api\/crons\/[^/]+$/)) && req.method === 'DELETE') {
225
+ const taskId = decodeURIComponent(path.split('/')[3]);
226
+ withWriteDb(db => db.prepare('DELETE FROM tasks WHERE id = ?').run(taskId));
227
+ json(res, { success: true });
228
+ return;
229
+ }
230
+ // GET: List watchers
231
+ if (path === '/api/watchers' && req.method === 'GET') {
232
+ const watchers = getDashDb().prepare('SELECT * FROM watchers ORDER BY created_at').all();
233
+ json(res, watchers);
234
+ return;
235
+ }
236
+ // DELETE: Delete watcher
237
+ if (path.match(/^\/api\/watchers\/[^/]+$/) && req.method === 'DELETE') {
238
+ const watcherId = decodeURIComponent(path.split('/')[3]);
239
+ withWriteDb(db => db.prepare('DELETE FROM watchers WHERE id = ?').run(watcherId));
208
240
  json(res, { success: true });
209
241
  return;
210
242
  }
@@ -268,8 +300,13 @@ export function startDashboardServer(port = 0) {
268
300
  }
269
301
  if (path === '/api/computer-use' && req.method === 'POST') {
270
302
  let body = '';
271
- for await (const chunk of req)
303
+ for await (const chunk of req) {
272
304
  body += chunk;
305
+ if (body.length > 1_000_000) {
306
+ json(res, { error: 'Payload too large' }, 413);
307
+ return;
308
+ }
309
+ }
273
310
  let parsedCU;
274
311
  try {
275
312
  parsedCU = JSON.parse(body);
@@ -292,12 +329,20 @@ export function startDashboardServer(port = 0) {
292
329
  json(res, { enabled: !!config.claudeCode.computerUse });
293
330
  return;
294
331
  }
332
+ if (path === '/api/timeline') {
333
+ const { getTimeline } = await import('../timeline/index.js');
334
+ const date = url.searchParams.get('date') || new Date().toISOString().slice(0, 10);
335
+ const limit = parseInt(url.searchParams.get('limit') || '50');
336
+ const events = getTimeline({ date, limit });
337
+ json(res, { events });
338
+ return;
339
+ }
295
340
  const db = getDashDb();
296
341
  if (path === '/api/status') {
297
342
  const pid = getDaemonPid();
298
343
  const tabCount = db.prepare('SELECT COUNT(*) as c FROM tabs').get().c;
299
344
  const activeCount = db.prepare("SELECT COUNT(*) as c FROM tabs WHERE status = 'running'").get().c;
300
- const cronCount = db.prepare("SELECT COUNT(*) as c FROM cron_jobs WHERE enabled = 1").get().c;
345
+ const cronCount = db.prepare("SELECT COUNT(*) as c FROM tasks WHERE enabled = 1").get().c;
301
346
  const memoryCount = db.prepare('SELECT COUNT(*) as c FROM memories').get().c;
302
347
  json(res, { version: VERSION, daemonPid: pid, tabs: tabCount, activeTabs: activeCount, cronJobs: cronCount, memories: memoryCount });
303
348
  return;
@@ -343,8 +388,8 @@ export function startDashboardServer(port = 0) {
343
388
  json(res, { memories, total, limit, offset });
344
389
  return;
345
390
  }
346
- if (path === '/api/crons' && req.method === 'GET') {
347
- const crons = db.prepare('SELECT * FROM cron_jobs ORDER BY created_at').all();
391
+ if ((path === '/api/tasks' || path === '/api/crons') && req.method === 'GET') {
392
+ const crons = db.prepare('SELECT * FROM tasks ORDER BY created_at').all();
348
393
  json(res, crons);
349
394
  return;
350
395
  }
@@ -362,6 +407,80 @@ export function startDashboardServer(port = 0) {
362
407
  json(res, costs);
363
408
  return;
364
409
  }
410
+ // GET /api/update/status — check versions for beecork, claude code, and other packages
411
+ if (path === '/api/update/status') {
412
+ const execAsync = promisify(exec);
413
+ async function checkPackage(name, installCmd) {
414
+ const pkg = { name };
415
+ try {
416
+ const { stdout } = await execAsync(`${installCmd || name} --version`, { timeout: 10000 });
417
+ pkg.installed = stdout.trim().replace(/^v/, '');
418
+ }
419
+ catch {
420
+ pkg.installed = null;
421
+ }
422
+ try {
423
+ const { stdout } = await execAsync(`npm view ${name} version`, { timeout: 10000 });
424
+ pkg.latest = stdout.trim();
425
+ }
426
+ catch {
427
+ pkg.latest = null;
428
+ }
429
+ pkg.updateAvailable = !!(pkg.installed && pkg.latest && pkg.installed !== pkg.latest);
430
+ return pkg;
431
+ }
432
+ const packages = await Promise.all([
433
+ (async () => {
434
+ const p = await checkPackage('beecork');
435
+ p.installed = VERSION; // use our known version, more reliable
436
+ p.updateAvailable = !!(p.latest && p.installed !== p.latest);
437
+ return p;
438
+ })(),
439
+ (async () => {
440
+ const p = { name: '@anthropic-ai/claude-code' };
441
+ try {
442
+ const { stdout } = await execAsync('claude --version', { timeout: 10000 });
443
+ p.installed = stdout.trim().replace(/^.*?(\d+\.\d+\.\d+).*$/, '$1');
444
+ }
445
+ catch {
446
+ p.installed = null;
447
+ }
448
+ try {
449
+ const { stdout } = await execAsync('npm view @anthropic-ai/claude-code version', { timeout: 10000 });
450
+ p.latest = stdout.trim();
451
+ }
452
+ catch {
453
+ p.latest = null;
454
+ }
455
+ p.updateAvailable = !!(p.installed && p.latest && p.installed !== p.latest);
456
+ return p;
457
+ })(),
458
+ ]);
459
+ json(res, { packages });
460
+ return;
461
+ }
462
+ // POST /api/update/:package — update a specific package
463
+ if (path.match(/^\/api\/update\/[^/]+$/) && req.method === 'POST') {
464
+ const pkgName = decodeURIComponent(path.split('/')[3]);
465
+ const execAsync = promisify(exec);
466
+ const allowedPackages = {
467
+ 'beecork': 'npm install -g beecork@latest',
468
+ '@anthropic-ai/claude-code': 'npm install -g @anthropic-ai/claude-code@latest',
469
+ };
470
+ const cmd = allowedPackages[pkgName];
471
+ if (!cmd) {
472
+ json(res, { error: `Package "${pkgName}" is not in the allowed update list.` }, 400);
473
+ return;
474
+ }
475
+ try {
476
+ const { stdout } = await execAsync(cmd, { timeout: 120000 });
477
+ json(res, { success: true, package: pkgName, output: stdout.trim() });
478
+ }
479
+ catch (err) {
480
+ json(res, { error: err instanceof Error ? err.message : String(err) }, 500);
481
+ }
482
+ return;
483
+ }
365
484
  // GET /api/capabilities — list all packs + enabled status
366
485
  if (path === '/api/capabilities') {
367
486
  const { getAvailablePacks, isEnabled } = await import('../capabilities/index.js');
@@ -378,16 +497,29 @@ export function startDashboardServer(port = 0) {
378
497
  if (path.match(/^\/api\/capabilities\/[^/]+\/enable$/) && req.method === 'POST') {
379
498
  const packId = path.split('/')[3];
380
499
  let body = '';
381
- for await (const chunk of req)
500
+ for await (const chunk of req) {
382
501
  body += chunk;
383
- const { apiKey } = JSON.parse(body);
502
+ if (body.length > 1_000_000) {
503
+ json(res, { error: 'Payload too large' }, 413);
504
+ return;
505
+ }
506
+ }
507
+ let parsedCap;
508
+ try {
509
+ parsedCap = JSON.parse(body);
510
+ }
511
+ catch {
512
+ json(res, { error: 'Invalid JSON' }, 400);
513
+ return;
514
+ }
515
+ const { apiKey } = parsedCap;
384
516
  const { enablePack } = await import('../capabilities/index.js');
385
517
  try {
386
518
  enablePack(packId, apiKey);
387
519
  json(res, { success: true, message: 'Restart daemon to activate.' });
388
520
  }
389
521
  catch (err) {
390
- json(res, { error: err.message }, 400);
522
+ json(res, { error: err instanceof Error ? err.message : String(err) }, 400);
391
523
  }
392
524
  return;
393
525
  }
@@ -421,4 +553,3 @@ export function startDashboardServer(port = 0) {
421
553
  process.exit(0);
422
554
  });
423
555
  }
424
- //# sourceMappingURL=server.js.map
@@ -1,4 +1,14 @@
1
1
  import Database from 'better-sqlite3';
2
2
  export declare function getDb(): Database.Database;
3
+ export interface CreateTabOptions {
4
+ name: string;
5
+ workingDir?: string;
6
+ systemPrompt?: string | null;
7
+ }
8
+ /** Shared tab record creation — used by dashboard, MCP, and TabManager */
9
+ export declare function createTabRecord(db: Database.Database, opts: CreateTabOptions): {
10
+ id: string;
11
+ name: string;
12
+ created: boolean;
13
+ };
3
14
  export declare function closeDb(): void;
4
- //# sourceMappingURL=index.d.ts.map
package/dist/db/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ import crypto from 'node:crypto';
1
2
  import Database from 'better-sqlite3';
2
3
  import { getDbPath, ensureBeecorkDirs } from '../util/paths.js';
3
4
  import { runMigrations } from './migrations.js';
@@ -65,6 +66,7 @@ export function getDb() {
65
66
  // Prune old routing/permission history (keep last 1000 entries)
66
67
  db?.exec('DELETE FROM routing_history WHERE created_at < (SELECT created_at FROM routing_history ORDER BY created_at DESC LIMIT 1 OFFSET 999)');
67
68
  db?.exec('DELETE FROM permission_history WHERE created_at < (SELECT created_at FROM permission_history ORDER BY created_at DESC LIMIT 1 OFFSET 999)');
69
+ db?.exec("DELETE FROM activity_log WHERE created_at < datetime('now', '-90 days')");
68
70
  }
69
71
  catch (err) {
70
72
  logger.warn('WAL checkpoint/cleanup error:', err);
@@ -72,6 +74,16 @@ export function getDb() {
72
74
  }, 30 * 60 * 1000); // every 30 minutes
73
75
  return db;
74
76
  }
77
+ /** Shared tab record creation — used by dashboard, MCP, and TabManager */
78
+ export function createTabRecord(db, opts) {
79
+ const existing = db.prepare('SELECT name FROM tabs WHERE name = ?').get(opts.name);
80
+ if (existing)
81
+ return { id: '', name: opts.name, created: false };
82
+ const id = crypto.randomUUID();
83
+ const dir = opts.workingDir || process.env.HOME || '/';
84
+ db.prepare('INSERT INTO tabs (id, name, session_id, status, working_dir, system_prompt) VALUES (?, ?, ?, ?, ?, ?)').run(id, opts.name, crypto.randomUUID(), 'idle', dir, opts.systemPrompt || null);
85
+ return { id, name: opts.name, created: true };
86
+ }
75
87
  export function closeDb() {
76
88
  if (walInterval) {
77
89
  clearInterval(walInterval);
@@ -82,4 +94,3 @@ export function closeDb() {
82
94
  db = null;
83
95
  }
84
96
  }
85
- //# sourceMappingURL=index.js.map
@@ -1,3 +1,2 @@
1
1
  import type Database from 'better-sqlite3';
2
2
  export declare function runMigrations(db: Database.Database): void;
3
- //# sourceMappingURL=migrations.d.ts.map
@@ -195,6 +195,50 @@ const MIGRATIONS = [
195
195
  description: 'Add index on messages.created_at for date-range cost queries',
196
196
  up: 'CREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at)',
197
197
  },
198
+ {
199
+ version: 18,
200
+ description: 'Rename cron_jobs table to tasks',
201
+ up: 'ALTER TABLE cron_jobs RENAME TO tasks',
202
+ },
203
+ {
204
+ version: 19,
205
+ description: 'Add watchers table',
206
+ up: `CREATE TABLE IF NOT EXISTS watchers (
207
+ id TEXT PRIMARY KEY,
208
+ name TEXT NOT NULL,
209
+ description TEXT,
210
+ check_command TEXT NOT NULL,
211
+ condition TEXT NOT NULL,
212
+ action TEXT NOT NULL DEFAULT 'notify',
213
+ action_details TEXT,
214
+ schedule TEXT NOT NULL,
215
+ last_check_at TEXT,
216
+ last_triggered_at TEXT,
217
+ trigger_count INTEGER DEFAULT 0,
218
+ enabled INTEGER DEFAULT 1,
219
+ created_at TEXT DEFAULT (datetime('now'))
220
+ )`,
221
+ },
222
+ {
223
+ version: 20,
224
+ description: 'Add activity_log table for timeline',
225
+ up: `CREATE TABLE IF NOT EXISTS activity_log (
226
+ id TEXT PRIMARY KEY,
227
+ event_type TEXT NOT NULL,
228
+ project_name TEXT,
229
+ tab_name TEXT,
230
+ summary TEXT NOT NULL,
231
+ details TEXT,
232
+ duration_ms INTEGER,
233
+ cost_usd REAL,
234
+ created_at TEXT DEFAULT (datetime('now'))
235
+ )`,
236
+ },
237
+ {
238
+ version: 21,
239
+ description: 'Add index on activity_log.created_at',
240
+ up: 'CREATE INDEX IF NOT EXISTS idx_activity_log_created ON activity_log(created_at)',
241
+ },
198
242
  ];
199
243
  export function runMigrations(db) {
200
244
  // Ensure schema_version table exists
@@ -247,4 +291,3 @@ export function runMigrations(db) {
247
291
  db.prepare('UPDATE schema_version SET version = ?').run(migration.version);
248
292
  }
249
293
  }
250
- //# sourceMappingURL=migrations.js.map
@@ -12,10 +12,7 @@ export interface Delegation {
12
12
  }
13
13
  /** Create a new delegation */
14
14
  export declare function createDelegation(sourceTab: string, targetTab: string, message: string, returnToTab?: string): Delegation;
15
- /** Mark a delegation as running */
16
- export declare function markDelegationRunning(id: string): void;
17
15
  /** Complete a delegation with a result */
18
16
  export declare function completeDelegation(targetTab: string, result: string): Delegation | null;
19
17
  /** Get pending delegations for a tab */
20
18
  export declare function getPendingDelegations(tabName?: string): Delegation[];
21
- //# sourceMappingURL=manager.d.ts.map
@@ -33,10 +33,6 @@ export function createDelegation(sourceTab, targetTab, message, returnToTab) {
33
33
  logger.info(`Delegation created: ${sourceTab} → ${targetTab} (depth ${delegation.depth})`);
34
34
  return delegation;
35
35
  }
36
- /** Mark a delegation as running */
37
- export function markDelegationRunning(id) {
38
- getDb().prepare("UPDATE delegations SET status = 'running' WHERE id = ?").run(id);
39
- }
40
36
  /** Complete a delegation with a result */
41
37
  export function completeDelegation(targetTab, result) {
42
38
  const db = getDb();
@@ -85,4 +81,3 @@ function getCurrentDepth(tabName) {
85
81
  const row = db.prepare("SELECT MAX(depth) as d FROM delegations WHERE source_tab = ? AND status IN ('pending', 'running')").get(tabName);
86
82
  return row.d ?? 0;
87
83
  }
88
- //# sourceMappingURL=manager.js.map
package/dist/index.d.ts CHANGED
@@ -1,3 +1,2 @@
1
1
  #!/usr/bin/env node
2
2
  export {};
3
- //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -27,7 +27,7 @@ program
27
27
  .action(stopDaemon);
28
28
  program
29
29
  .command('status')
30
- .description('Show daemon status, running tabs, and cron jobs')
30
+ .description('Show daemon status, running tabs, and tasks')
31
31
  .action(showStatus);
32
32
  program
33
33
  .command('tabs')
@@ -37,9 +37,35 @@ program
37
37
  .command('logs [tab]')
38
38
  .description('Tail logs for a tab (default: daemon logs)')
39
39
  .action(tailLogs);
40
+ // Tasks (new name)
41
+ const taskCmd = program
42
+ .command('tasks')
43
+ .description('Manage scheduled tasks');
44
+ taskCmd
45
+ .command('list')
46
+ .description('List all tasks')
47
+ .action(listCrons);
48
+ taskCmd
49
+ .command('delete <id>')
50
+ .description('Delete a task by ID')
51
+ .action(deleteCron);
52
+ program
53
+ .command('task')
54
+ .description('Alias for tasks')
55
+ .argument('[subcommand]', 'Subcommand (list, delete)')
56
+ .argument('[id]', 'Task ID (for delete)')
57
+ .action(async (sub, id) => {
58
+ if (sub === 'delete' && id) {
59
+ await deleteCron(id);
60
+ }
61
+ else {
62
+ await listCrons();
63
+ }
64
+ });
65
+ // Backward-compatible cron aliases (hidden)
40
66
  const cronCmd = program
41
- .command('cron')
42
- .description('Manage cron jobs');
67
+ .command('cron', { hidden: true })
68
+ .description('Manage cron jobs (alias for tasks)');
43
69
  cronCmd
44
70
  .command('list')
45
71
  .description('List all cron jobs')
@@ -48,6 +74,28 @@ cronCmd
48
74
  .command('delete <id>')
49
75
  .description('Delete a cron job by ID')
50
76
  .action(deleteCron);
77
+ // Watcher commands
78
+ program
79
+ .command('watches')
80
+ .description('List all watchers')
81
+ .action(async () => {
82
+ const { listWatchers } = await import('./cli/commands.js');
83
+ await listWatchers();
84
+ });
85
+ program
86
+ .command('watch')
87
+ .description('Manage watchers')
88
+ .argument('[subcommand]', 'Subcommand (list, delete)')
89
+ .argument('[id]', 'Watcher ID (for delete)')
90
+ .action(async (sub, id) => {
91
+ const { listWatchers, deleteWatcher } = await import('./cli/commands.js');
92
+ if (sub === 'delete' && id) {
93
+ await deleteWatcher(id);
94
+ }
95
+ else {
96
+ await listWatchers();
97
+ }
98
+ });
51
99
  const memoryCmd = program
52
100
  .command('memory')
53
101
  .description('Manage long-term memories');
@@ -192,7 +240,7 @@ program
192
240
  console.log('\nClaude can now control your mouse, keyboard, and screen.');
193
241
  console.log('Make sure you have granted permissions:');
194
242
  console.log(' macOS: System Settings → Privacy → Screen Recording + Accessibility');
195
- console.log(' Guide: https://support.beecork.com/computer-use');
243
+ console.log(' Guide: https://github.com/beecork/beecork/blob/main/docs/troubleshooting.md');
196
244
  }
197
245
  console.log('\nRestart daemon to apply: beecork stop && beecork start\n');
198
246
  });
@@ -224,7 +272,8 @@ Useful commands:
224
272
  beecork logs \u2014 View daemon logs
225
273
  beecork doctor \u2014 Run diagnostics
226
274
  beecork dashboard \u2014 Open web dashboard
227
- beecork cron list \u2014 View scheduled tasks
275
+ beecork tasks list \u2014 View scheduled tasks
276
+ beecork watches \u2014 View active watchers
228
277
 
229
278
  ${os === 'darwin' ? 'On macOS: beecork runs as a launchd service.\n Check: launchctl list | grep beecork' : ''}${os === 'linux' ? 'On Linux: beecork runs as a systemd service.\n Check: systemctl --user status beecork' : ''}
230
279
  `);
@@ -406,5 +455,74 @@ program
406
455
  const { listCapabilities } = await import('./cli/capabilities.js');
407
456
  await listCapabilities();
408
457
  });
458
+ program
459
+ .command('history [date]')
460
+ .description('Show activity timeline (default: today, or "yesterday", or YYYY-MM-DD)')
461
+ .action(async (dateArg) => {
462
+ const { getTimeline, formatTimeline } = await import('./timeline/index.js');
463
+ let date;
464
+ if (dateArg === 'yesterday') {
465
+ date = new Date(Date.now() - 86400000).toISOString().slice(0, 10);
466
+ }
467
+ else if (dateArg) {
468
+ date = dateArg;
469
+ }
470
+ else {
471
+ date = new Date().toISOString().slice(0, 10);
472
+ }
473
+ const events = getTimeline({ date });
474
+ console.log(formatTimeline(events));
475
+ });
476
+ program
477
+ .command('knowledge [scope]')
478
+ .description('List stored knowledge (global, project <path>, or all)')
479
+ .action(async (scope) => {
480
+ const { getGlobalKnowledge, getProjectKnowledge, getAllKnowledge, formatKnowledgeForContext } = await import('./knowledge/index.js');
481
+ let entries;
482
+ if (scope === 'global') {
483
+ entries = getGlobalKnowledge();
484
+ }
485
+ else if (scope?.startsWith('project')) {
486
+ const projectPath = scope.split(' ').slice(1).join(' ') || process.cwd();
487
+ entries = getProjectKnowledge(projectPath);
488
+ }
489
+ else {
490
+ entries = getAllKnowledge();
491
+ }
492
+ if (entries.length === 0) {
493
+ console.log('No knowledge stored yet.');
494
+ return;
495
+ }
496
+ console.log(formatKnowledgeForContext(entries));
497
+ });
498
+ const storeCmd = program
499
+ .command('store')
500
+ .description('Browse and install community extensions');
501
+ storeCmd
502
+ .command('search <query>')
503
+ .description('Search for beecork packages on npm')
504
+ .action(async (query) => {
505
+ const { storeSearch } = await import('./cli/store.js');
506
+ await storeSearch(query);
507
+ });
508
+ storeCmd
509
+ .command('install <package>')
510
+ .description('Install a community package')
511
+ .action(async (pkg) => {
512
+ const { storeInstall } = await import('./cli/store.js');
513
+ storeInstall(pkg);
514
+ });
515
+ storeCmd
516
+ .command('info <package>')
517
+ .description('Show package details')
518
+ .action(async (pkg) => {
519
+ const { storeInfo } = await import('./cli/store.js');
520
+ await storeInfo(pkg);
521
+ });
522
+ program
523
+ .command('help')
524
+ .description('Show help')
525
+ .action(() => {
526
+ program.outputHelp();
527
+ });
409
528
  program.parse();
410
- //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ export type { KnowledgeEntry, KnowledgeScope } from './types.js';
2
+ export { getGlobalKnowledge, addGlobalKnowledge, getProjectKnowledge, addProjectKnowledge, getTabKnowledge, getAllKnowledge, formatKnowledgeForContext, addKnowledge, searchKnowledge, } from './manager.js';
@@ -0,0 +1 @@
1
+ export { getGlobalKnowledge, addGlobalKnowledge, getProjectKnowledge, addProjectKnowledge, getTabKnowledge, getAllKnowledge, formatKnowledgeForContext, addKnowledge, searchKnowledge, } from './manager.js';
@@ -0,0 +1,17 @@
1
+ import type { KnowledgeEntry, KnowledgeScope } from './types.js';
2
+ export declare function getGlobalKnowledge(): KnowledgeEntry[];
3
+ export declare function addGlobalKnowledge(content: string, category?: string): void;
4
+ export declare function getProjectKnowledge(projectPath: string): KnowledgeEntry[];
5
+ export declare function addProjectKnowledge(projectPath: string, content: string): void;
6
+ export declare function getTabKnowledge(tabName: string): KnowledgeEntry[];
7
+ export declare function getAllKnowledge(projectPath?: string, tabName?: string): KnowledgeEntry[];
8
+ /** Format knowledge for injection into Claude's context */
9
+ export declare function formatKnowledgeForContext(entries: KnowledgeEntry[]): string;
10
+ /** Add knowledge to the right scope */
11
+ export declare function addKnowledge(content: string, scope: KnowledgeScope, options?: {
12
+ projectPath?: string;
13
+ tabName?: string;
14
+ category?: string;
15
+ }): void;
16
+ /** Search knowledge across all layers */
17
+ export declare function searchKnowledge(query: string, projectPath?: string, tabName?: string): KnowledgeEntry[];