@mseep/clawdcursor 1.5.5

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 (354) hide show
  1. package/CHANGELOG.md +2264 -0
  2. package/LICENSE +21 -0
  3. package/README.md +385 -0
  4. package/SECURITY.md +44 -0
  5. package/SKILL.md +503 -0
  6. package/dist/core/agent-loop/agent.d.ts +42 -0
  7. package/dist/core/agent-loop/agent.js +1023 -0
  8. package/dist/core/agent-loop/agent.js.map +1 -0
  9. package/dist/core/agent-loop/batch-tool.d.ts +25 -0
  10. package/dist/core/agent-loop/batch-tool.js +218 -0
  11. package/dist/core/agent-loop/batch-tool.js.map +1 -0
  12. package/dist/core/agent-loop/coord-scale.d.ts +72 -0
  13. package/dist/core/agent-loop/coord-scale.js +89 -0
  14. package/dist/core/agent-loop/coord-scale.js.map +1 -0
  15. package/dist/core/agent-loop/focus-guard.d.ts +24 -0
  16. package/dist/core/agent-loop/focus-guard.js +29 -0
  17. package/dist/core/agent-loop/focus-guard.js.map +1 -0
  18. package/dist/core/agent-loop/project-mcp.d.ts +97 -0
  19. package/dist/core/agent-loop/project-mcp.js +253 -0
  20. package/dist/core/agent-loop/project-mcp.js.map +1 -0
  21. package/dist/core/agent-loop/prompt.d.ts +45 -0
  22. package/dist/core/agent-loop/prompt.js +426 -0
  23. package/dist/core/agent-loop/prompt.js.map +1 -0
  24. package/dist/core/agent-loop/tool-meta.d.ts +93 -0
  25. package/dist/core/agent-loop/tool-meta.js +651 -0
  26. package/dist/core/agent-loop/tool-meta.js.map +1 -0
  27. package/dist/core/agent-loop/tools.d.ts +38 -0
  28. package/dist/core/agent-loop/tools.js +2134 -0
  29. package/dist/core/agent-loop/tools.js.map +1 -0
  30. package/dist/core/agent-loop/types.d.ts +170 -0
  31. package/dist/core/agent-loop/types.js +12 -0
  32. package/dist/core/agent-loop/types.js.map +1 -0
  33. package/dist/core/agent.d.ts +51 -0
  34. package/dist/core/agent.js +245 -0
  35. package/dist/core/agent.js.map +1 -0
  36. package/dist/core/app-categories.d.ts +67 -0
  37. package/dist/core/app-categories.js +108 -0
  38. package/dist/core/app-categories.js.map +1 -0
  39. package/dist/core/banner.d.ts +70 -0
  40. package/dist/core/banner.js +245 -0
  41. package/dist/core/banner.js.map +1 -0
  42. package/dist/core/classify/capability.d.ts +45 -0
  43. package/dist/core/classify/capability.js +78 -0
  44. package/dist/core/classify/capability.js.map +1 -0
  45. package/dist/core/decompose/llm-decomposer.d.ts +35 -0
  46. package/dist/core/decompose/llm-decomposer.js +156 -0
  47. package/dist/core/decompose/llm-decomposer.js.map +1 -0
  48. package/dist/core/decompose/parser.d.ts +27 -0
  49. package/dist/core/decompose/parser.js +101 -0
  50. package/dist/core/decompose/parser.js.map +1 -0
  51. package/dist/core/observability/correlation.d.ts +19 -0
  52. package/dist/core/observability/correlation.js +36 -0
  53. package/dist/core/observability/correlation.js.map +1 -0
  54. package/dist/core/observability/cost-meter.d.ts +51 -0
  55. package/dist/core/observability/cost-meter.js +134 -0
  56. package/dist/core/observability/cost-meter.js.map +1 -0
  57. package/dist/core/observability/logger.d.ts +61 -0
  58. package/dist/core/observability/logger.js +550 -0
  59. package/dist/core/observability/logger.js.map +1 -0
  60. package/dist/core/router/aliases.d.ts +50 -0
  61. package/dist/core/router/aliases.js +104 -0
  62. package/dist/core/router/aliases.js.map +1 -0
  63. package/dist/core/router/normalize.d.ts +41 -0
  64. package/dist/core/router/normalize.js +80 -0
  65. package/dist/core/router/normalize.js.map +1 -0
  66. package/dist/core/safety.d.ts +126 -0
  67. package/dist/core/safety.js +568 -0
  68. package/dist/core/safety.js.map +1 -0
  69. package/dist/core/sense/a11y-resolver.d.ts +73 -0
  70. package/dist/core/sense/a11y-resolver.js +76 -0
  71. package/dist/core/sense/a11y-resolver.js.map +1 -0
  72. package/dist/core/sense/fingerprint.d.ts +41 -0
  73. package/dist/core/sense/fingerprint.js +123 -0
  74. package/dist/core/sense/fingerprint.js.map +1 -0
  75. package/dist/core/sense/rank.d.ts +70 -0
  76. package/dist/core/sense/rank.js +192 -0
  77. package/dist/core/sense/rank.js.map +1 -0
  78. package/dist/core/sense/reactive-check.d.ts +40 -0
  79. package/dist/core/sense/reactive-check.js +48 -0
  80. package/dist/core/sense/reactive-check.js.map +1 -0
  81. package/dist/core/sense/snapshot.d.ts +19 -0
  82. package/dist/core/sense/snapshot.js +100 -0
  83. package/dist/core/sense/snapshot.js.map +1 -0
  84. package/dist/core/sense/types.d.ts +66 -0
  85. package/dist/core/sense/types.js +9 -0
  86. package/dist/core/sense/types.js.map +1 -0
  87. package/dist/core/sense/ui-map-anchors.d.ts +7 -0
  88. package/dist/core/sense/ui-map-anchors.js +24 -0
  89. package/dist/core/sense/ui-map-anchors.js.map +1 -0
  90. package/dist/core/sense/ui-map-elements.d.ts +5 -0
  91. package/dist/core/sense/ui-map-elements.js +33 -0
  92. package/dist/core/sense/ui-map-elements.js.map +1 -0
  93. package/dist/core/sense/ui-map-find.d.ts +56 -0
  94. package/dist/core/sense/ui-map-find.js +153 -0
  95. package/dist/core/sense/ui-map-find.js.map +1 -0
  96. package/dist/core/sense/ui-map-fuse.d.ts +4 -0
  97. package/dist/core/sense/ui-map-fuse.js +44 -0
  98. package/dist/core/sense/ui-map-fuse.js.map +1 -0
  99. package/dist/core/sense/ui-map-geom.d.ts +3 -0
  100. package/dist/core/sense/ui-map-geom.js +16 -0
  101. package/dist/core/sense/ui-map-geom.js.map +1 -0
  102. package/dist/core/sense/ui-map-holder.d.ts +58 -0
  103. package/dist/core/sense/ui-map-holder.js +87 -0
  104. package/dist/core/sense/ui-map-holder.js.map +1 -0
  105. package/dist/core/sense/ui-map-normalize.d.ts +19 -0
  106. package/dist/core/sense/ui-map-normalize.js +65 -0
  107. package/dist/core/sense/ui-map-normalize.js.map +1 -0
  108. package/dist/core/sense/ui-map-render.d.ts +4 -0
  109. package/dist/core/sense/ui-map-render.js +34 -0
  110. package/dist/core/sense/ui-map-render.js.map +1 -0
  111. package/dist/core/sense/ui-map-resolve.d.ts +41 -0
  112. package/dist/core/sense/ui-map-resolve.js +59 -0
  113. package/dist/core/sense/ui-map-resolve.js.map +1 -0
  114. package/dist/core/sense/ui-map-types.d.ts +66 -0
  115. package/dist/core/sense/ui-map-types.js +11 -0
  116. package/dist/core/sense/ui-map-types.js.map +1 -0
  117. package/dist/core/sense/ui-map.d.ts +29 -0
  118. package/dist/core/sense/ui-map.js +113 -0
  119. package/dist/core/sense/ui-map.js.map +1 -0
  120. package/dist/core/verify/assertions.d.ts +132 -0
  121. package/dist/core/verify/assertions.js +284 -0
  122. package/dist/core/verify/assertions.js.map +1 -0
  123. package/dist/index.d.ts +21 -0
  124. package/dist/index.js +24 -0
  125. package/dist/index.js.map +1 -0
  126. package/dist/llm/browser-config.d.ts +36 -0
  127. package/dist/llm/browser-config.js +83 -0
  128. package/dist/llm/browser-config.js.map +1 -0
  129. package/dist/llm/client.d.ts +268 -0
  130. package/dist/llm/client.js +1094 -0
  131. package/dist/llm/client.js.map +1 -0
  132. package/dist/llm/config.d.ts +79 -0
  133. package/dist/llm/config.js +375 -0
  134. package/dist/llm/config.js.map +1 -0
  135. package/dist/llm/credentials.d.ts +35 -0
  136. package/dist/llm/credentials.js +491 -0
  137. package/dist/llm/credentials.js.map +1 -0
  138. package/dist/llm/external-creds.d.ts +42 -0
  139. package/dist/llm/external-creds.js +169 -0
  140. package/dist/llm/external-creds.js.map +1 -0
  141. package/dist/llm/providers.d.ts +123 -0
  142. package/dist/llm/providers.js +717 -0
  143. package/dist/llm/providers.js.map +1 -0
  144. package/dist/paths.d.ts +31 -0
  145. package/dist/paths.js +147 -0
  146. package/dist/paths.js.map +1 -0
  147. package/dist/platform/accessibility.d.ts +139 -0
  148. package/dist/platform/accessibility.js +670 -0
  149. package/dist/platform/accessibility.js.map +1 -0
  150. package/dist/platform/cdp-driver.d.ts +318 -0
  151. package/dist/platform/cdp-driver.js +1179 -0
  152. package/dist/platform/cdp-driver.js.map +1 -0
  153. package/dist/platform/index.d.ts +11 -0
  154. package/dist/platform/index.js +69 -0
  155. package/dist/platform/index.js.map +1 -0
  156. package/dist/platform/keys.d.ts +17 -0
  157. package/dist/platform/keys.js +129 -0
  158. package/dist/platform/keys.js.map +1 -0
  159. package/dist/platform/launch-poll.d.ts +101 -0
  160. package/dist/platform/launch-poll.js +177 -0
  161. package/dist/platform/launch-poll.js.map +1 -0
  162. package/dist/platform/linux.d.ts +173 -0
  163. package/dist/platform/linux.js +1253 -0
  164. package/dist/platform/linux.js.map +1 -0
  165. package/dist/platform/macos.d.ts +136 -0
  166. package/dist/platform/macos.js +976 -0
  167. package/dist/platform/macos.js.map +1 -0
  168. package/dist/platform/native-desktop.d.ts +145 -0
  169. package/dist/platform/native-desktop.js +936 -0
  170. package/dist/platform/native-desktop.js.map +1 -0
  171. package/dist/platform/native-helper.d.ts +130 -0
  172. package/dist/platform/native-helper.js +592 -0
  173. package/dist/platform/native-helper.js.map +1 -0
  174. package/dist/platform/ocr-engine.d.ts +78 -0
  175. package/dist/platform/ocr-engine.js +363 -0
  176. package/dist/platform/ocr-engine.js.map +1 -0
  177. package/dist/platform/ps-runner.d.ts +28 -0
  178. package/dist/platform/ps-runner.js +228 -0
  179. package/dist/platform/ps-runner.js.map +1 -0
  180. package/dist/platform/types.d.ts +397 -0
  181. package/dist/platform/types.js +15 -0
  182. package/dist/platform/types.js.map +1 -0
  183. package/dist/platform/uri-handler.d.ts +75 -0
  184. package/dist/platform/uri-handler.js +273 -0
  185. package/dist/platform/uri-handler.js.map +1 -0
  186. package/dist/platform/wayland-backend.d.ts +53 -0
  187. package/dist/platform/wayland-backend.js +348 -0
  188. package/dist/platform/wayland-backend.js.map +1 -0
  189. package/dist/platform/windows.d.ts +232 -0
  190. package/dist/platform/windows.js +1210 -0
  191. package/dist/platform/windows.js.map +1 -0
  192. package/dist/postbuild.d.ts +10 -0
  193. package/dist/postbuild.js +98 -0
  194. package/dist/postbuild.js.map +1 -0
  195. package/dist/schema/snapshot.d.ts +33 -0
  196. package/dist/schema/snapshot.js +90 -0
  197. package/dist/schema/snapshot.js.map +1 -0
  198. package/dist/shortcuts.d.ts +30 -0
  199. package/dist/shortcuts.js +261 -0
  200. package/dist/shortcuts.js.map +1 -0
  201. package/dist/surface/cli.d.ts +7 -0
  202. package/dist/surface/cli.js +1556 -0
  203. package/dist/surface/cli.js.map +1 -0
  204. package/dist/surface/dashboard.d.ts +8 -0
  205. package/dist/surface/dashboard.js +1193 -0
  206. package/dist/surface/dashboard.js.map +1 -0
  207. package/dist/surface/doctor.d.ts +29 -0
  208. package/dist/surface/doctor.js +1514 -0
  209. package/dist/surface/doctor.js.map +1 -0
  210. package/dist/surface/format.d.ts +10 -0
  211. package/dist/surface/format.js +37 -0
  212. package/dist/surface/format.js.map +1 -0
  213. package/dist/surface/http-utility.d.ts +65 -0
  214. package/dist/surface/http-utility.js +336 -0
  215. package/dist/surface/http-utility.js.map +1 -0
  216. package/dist/surface/mcp-server.d.ts +91 -0
  217. package/dist/surface/mcp-server.js +280 -0
  218. package/dist/surface/mcp-server.js.map +1 -0
  219. package/dist/surface/onboarding.d.ts +15 -0
  220. package/dist/surface/onboarding.js +184 -0
  221. package/dist/surface/onboarding.js.map +1 -0
  222. package/dist/surface/pidfile.d.ts +79 -0
  223. package/dist/surface/pidfile.js +263 -0
  224. package/dist/surface/pidfile.js.map +1 -0
  225. package/dist/surface/readiness.d.ts +45 -0
  226. package/dist/surface/readiness.js +230 -0
  227. package/dist/surface/readiness.js.map +1 -0
  228. package/dist/surface/report.d.ts +68 -0
  229. package/dist/surface/report.js +341 -0
  230. package/dist/surface/report.js.map +1 -0
  231. package/dist/surface/skill-register.d.ts +14 -0
  232. package/dist/surface/skill-register.js +150 -0
  233. package/dist/surface/skill-register.js.map +1 -0
  234. package/dist/surface/version.d.ts +6 -0
  235. package/dist/surface/version.js +27 -0
  236. package/dist/surface/version.js.map +1 -0
  237. package/dist/tools/a11y.d.ts +8 -0
  238. package/dist/tools/a11y.js +545 -0
  239. package/dist/tools/a11y.js.map +1 -0
  240. package/dist/tools/a11y_depth.d.ts +19 -0
  241. package/dist/tools/a11y_depth.js +455 -0
  242. package/dist/tools/a11y_depth.js.map +1 -0
  243. package/dist/tools/agent.d.ts +15 -0
  244. package/dist/tools/agent.js +248 -0
  245. package/dist/tools/agent.js.map +1 -0
  246. package/dist/tools/batch.d.ts +46 -0
  247. package/dist/tools/batch.js +230 -0
  248. package/dist/tools/batch.js.map +1 -0
  249. package/dist/tools/cdp.d.ts +8 -0
  250. package/dist/tools/cdp.js +233 -0
  251. package/dist/tools/cdp.js.map +1 -0
  252. package/dist/tools/compact.d.ts +63 -0
  253. package/dist/tools/compact.js +418 -0
  254. package/dist/tools/compact.js.map +1 -0
  255. package/dist/tools/cost-class.d.ts +38 -0
  256. package/dist/tools/cost-class.js +117 -0
  257. package/dist/tools/cost-class.js.map +1 -0
  258. package/dist/tools/desktop.d.ts +9 -0
  259. package/dist/tools/desktop.js +346 -0
  260. package/dist/tools/desktop.js.map +1 -0
  261. package/dist/tools/electron_bridge.d.ts +41 -0
  262. package/dist/tools/electron_bridge.js +261 -0
  263. package/dist/tools/electron_bridge.js.map +1 -0
  264. package/dist/tools/extras.d.ts +22 -0
  265. package/dist/tools/extras.js +942 -0
  266. package/dist/tools/extras.js.map +1 -0
  267. package/dist/tools/favorites.d.ts +13 -0
  268. package/dist/tools/favorites.js +137 -0
  269. package/dist/tools/favorites.js.map +1 -0
  270. package/dist/tools/introspection.d.ts +13 -0
  271. package/dist/tools/introspection.js +55 -0
  272. package/dist/tools/introspection.js.map +1 -0
  273. package/dist/tools/ocr.d.ts +8 -0
  274. package/dist/tools/ocr.js +66 -0
  275. package/dist/tools/ocr.js.map +1 -0
  276. package/dist/tools/orchestration.d.ts +7 -0
  277. package/dist/tools/orchestration.js +377 -0
  278. package/dist/tools/orchestration.js.map +1 -0
  279. package/dist/tools/playbooks/extract-compose.d.ts +22 -0
  280. package/dist/tools/playbooks/extract-compose.js +85 -0
  281. package/dist/tools/playbooks/extract-compose.js.map +1 -0
  282. package/dist/tools/playbooks/find-replace.d.ts +11 -0
  283. package/dist/tools/playbooks/find-replace.js +56 -0
  284. package/dist/tools/playbooks/find-replace.js.map +1 -0
  285. package/dist/tools/playbooks/index.d.ts +63 -0
  286. package/dist/tools/playbooks/index.js +70 -0
  287. package/dist/tools/playbooks/index.js.map +1 -0
  288. package/dist/tools/playbooks/keys-blocklist.d.ts +24 -0
  289. package/dist/tools/playbooks/keys-blocklist.js +89 -0
  290. package/dist/tools/playbooks/keys-blocklist.js.map +1 -0
  291. package/dist/tools/registry.d.ts +40 -0
  292. package/dist/tools/registry.js +560 -0
  293. package/dist/tools/registry.js.map +1 -0
  294. package/dist/tools/safety-gate.d.ts +16 -0
  295. package/dist/tools/safety-gate.js +70 -0
  296. package/dist/tools/safety-gate.js.map +1 -0
  297. package/dist/tools/scheduler.d.ts +76 -0
  298. package/dist/tools/scheduler.js +413 -0
  299. package/dist/tools/scheduler.js.map +1 -0
  300. package/dist/tools/shortcuts.d.ts +13 -0
  301. package/dist/tools/shortcuts.js +205 -0
  302. package/dist/tools/shortcuts.js.map +1 -0
  303. package/dist/tools/smart.d.ts +15 -0
  304. package/dist/tools/smart.js +785 -0
  305. package/dist/tools/smart.js.map +1 -0
  306. package/dist/tools/types.d.ts +174 -0
  307. package/dist/tools/types.js +67 -0
  308. package/dist/tools/types.js.map +1 -0
  309. package/dist/tools/window-text.d.ts +15 -0
  310. package/dist/tools/window-text.js +39 -0
  311. package/dist/tools/window-text.js.map +1 -0
  312. package/dist/types.d.ts +122 -0
  313. package/dist/types.js +41 -0
  314. package/dist/types.js.map +1 -0
  315. package/native/Package.swift +38 -0
  316. package/native/README.md +113 -0
  317. package/native/Sources/ClawdCursorHelper/main.swift +602 -0
  318. package/native/Sources/ClawdCursorHost/main.swift +182 -0
  319. package/native/Sources/PermissionCheck/main.swift +53 -0
  320. package/native/Sources/ScreenshotHelper/main.swift +219 -0
  321. package/native/build.sh +139 -0
  322. package/native/entitlements.plist +12 -0
  323. package/package.json +115 -0
  324. package/scripts/banner.ps1 +112 -0
  325. package/scripts/coord-accuracy.ps1 +140 -0
  326. package/scripts/coord-uwp.ps1 +80 -0
  327. package/scripts/edge-glow.ps1 +180 -0
  328. package/scripts/find-element.ps1 +198 -0
  329. package/scripts/get-foreground-window.ps1 +71 -0
  330. package/scripts/get-screen-context.ps1 +183 -0
  331. package/scripts/get-windows.ps1 +66 -0
  332. package/scripts/install-panic-hotkey.ps1 +46 -0
  333. package/scripts/interact-element.ps1 +431 -0
  334. package/scripts/invoke-element.ps1 +314 -0
  335. package/scripts/linux/atspi-bridge.py +356 -0
  336. package/scripts/linux/ocr-recognize.py +154 -0
  337. package/scripts/mac/_window-picker.jxa +163 -0
  338. package/scripts/mac/find-element.jxa +0 -0
  339. package/scripts/mac/find-element.sh +161 -0
  340. package/scripts/mac/focus-window.jxa +284 -0
  341. package/scripts/mac/get-focused-element.jxa +102 -0
  342. package/scripts/mac/get-foreground-window.jxa +173 -0
  343. package/scripts/mac/get-screen-context.jxa +197 -0
  344. package/scripts/mac/get-ui-tree.sh +141 -0
  345. package/scripts/mac/get-windows.jxa +117 -0
  346. package/scripts/mac/interact-element.sh +235 -0
  347. package/scripts/mac/invoke-element.jxa +408 -0
  348. package/scripts/mac/ocr-recognize.swift +124 -0
  349. package/scripts/ocr-recognize.ps1 +102 -0
  350. package/scripts/postinstall-native.js +48 -0
  351. package/scripts/ps-bridge.ps1 +830 -0
  352. package/scripts/smoke-mcp.ps1 +119 -0
  353. package/scripts/sync-version.ts +178 -0
  354. package/scripts/verify-install.js +81 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety-gate.js","sourceRoot":"","sources":["../../src/tools/safety-gate.ts"],"names":[],"mappings":";;AAyCA,4CAiCC;AA1ED,2CAA+C;AAI/C,SAAS,aAAa,CAAC,IAA6B,EAAE,MAAoB;IACxE,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,MAAM;QACX,IAAI,CAAC,IAAI;QACT,IAAI,CAAC,IAAI;QACT,IAAI,CAAC,KAAK;QACV,IAAI,CAAC,KAAK;QACV,IAAI,CAAC,QAAQ;KACd,CAAC;IACF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjF,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,yEAAyE;IACzE,yEAAyE;IACzE,0EAA0E;IAC1E,6EAA6E;IAC7E,IAAI,MAAM,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC1F,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;YACT,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9D,MAAM,KAAK,GAAG,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,eAAe,CAAC;YAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,gBAAgB,CAC9B,IAAoB,EACpB,IAA6B,EAC7B,IAA+B;IAE/B,MAAM,QAAQ,GAAG,IAAA,sBAAa,EAAC;QAC7B,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,IAAI;QACJ,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,GAAG,EAAE;YACH,WAAW,EAAE,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC;SAC/C;KACF,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAEhC,MAAM,eAAe,GAAG,QAAQ,CAAC,eAAe,IAAI,OAAO,CAAC;IAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,yBAAyB,CAAC;IAExE,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,oBAAoB,MAAM,EAAE;YAC9C,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,sBAAsB;IACtB,OAAO;QACL,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,sBAAsB,MAAM,iCAAiC;YACzE,8GAA8G;YAC9G,iGAAiG;QACvG,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Scheduled-task tools — cron-driven task scheduling for the autonomous agent.
3
+ *
4
+ * The daemon mode (`clawdcursor agent` with an LLM configured) can run tasks
5
+ * autonomously via `submit_task`. The scheduler adds a persistent recurring
6
+ * dimension: schedule a task with a cron expression, and the daemon will fire
7
+ * it on every matching tick — same execution path as `submit_task`, same
8
+ * safety chokepoint, same verifier.
9
+ *
10
+ * Storage:
11
+ * $CLAWD_HOME/.clawdcursor/scheduled-tasks.json — array of ScheduledTask.
12
+ *
13
+ * Lifecycle:
14
+ * - Daemon boot: `initScheduler(agent, logger)` reads the file and registers
15
+ * active cron jobs with the in-process scheduler.
16
+ * - Daemon shutdown: `stopScheduler()` unregisters all jobs cleanly.
17
+ * - MCP tool calls mutate the file and the in-process registry together.
18
+ *
19
+ * Auth: every tool here is gated by the same bearer-token middleware that
20
+ * protects every MCP HTTP call (`requireAuth` in mcp-server.ts). Stdio MCP
21
+ * clients can also call these tools but `ctx.agent` is null on stdio, so
22
+ * the tool returns an error — same pattern as submit_task.
23
+ *
24
+ * Reentrancy: if a scheduled task fires while the agent is busy, we log
25
+ * and SKIP. No queue. Simpler, predictable, and matches what users expect
26
+ * — "if I'm in the middle of something, don't pile on."
27
+ *
28
+ * Cron parser: `croner` (~7 KB, zero deps). Standard 5-field cron syntax
29
+ * plus optional 6th field for seconds; timezones via the schedule's `tz`
30
+ * field. We validate with `Cron.nextRun` at create time and refuse invalid
31
+ * patterns up front rather than at first tick.
32
+ */
33
+ import type { ToolDefinition } from './types';
34
+ import type { Agent } from '../core/agent';
35
+ export interface ScheduledTask {
36
+ /** Stable id — `s_<base36-timestamp>_<rand>`. Used to delete/toggle. */
37
+ id: string;
38
+ /** Cron expression (5 or 6 field). */
39
+ cron: string;
40
+ /** Natural-language task to submit on every tick. */
41
+ task: string;
42
+ /** False to mute without deleting. Cron job is unregistered while disabled. */
43
+ enabled: boolean;
44
+ /** Optional timezone (e.g. "America/New_York"). Default: server-local. */
45
+ tz?: string;
46
+ /** Wall-clock created-at, ms since epoch. */
47
+ createdAt: number;
48
+ /** Last successful submission tick, ms since epoch. Null = never fired. */
49
+ lastRun: number | null;
50
+ /** Last error message from the most recent fire (null when clean). */
51
+ lastError: string | null;
52
+ /** Number of times this task has fired. */
53
+ runCount: number;
54
+ /** Number of times the agent was busy and we skipped. */
55
+ skipCount: number;
56
+ }
57
+ /**
58
+ * Wire the scheduler to a running agent + logger. Called once from the daemon
59
+ * boot. Loads persisted tasks and registers all enabled crons. Idempotent.
60
+ */
61
+ export declare function initScheduler(agent: Agent, log?: {
62
+ info?: (e: string, d?: unknown) => void;
63
+ warn?: (e: string, d?: unknown) => void;
64
+ error?: (e: string, d?: unknown) => void;
65
+ }): {
66
+ registered: number;
67
+ failed: number;
68
+ paused: number;
69
+ };
70
+ /** Stop every active cron job. Daemon shutdown hook. */
71
+ export declare function stopScheduler(): void;
72
+ /** Test/debug accessor — number of active in-process jobs. */
73
+ export declare function getActiveJobCount(): number;
74
+ export declare function getSchedulerTools(): ToolDefinition[];
75
+ /** Wipe state — for vitest cleanup. NOT exposed via MCP. */
76
+ export declare function _resetSchedulerForTests(): void;
@@ -0,0 +1,413 @@
1
+ "use strict";
2
+ /**
3
+ * Scheduled-task tools — cron-driven task scheduling for the autonomous agent.
4
+ *
5
+ * The daemon mode (`clawdcursor agent` with an LLM configured) can run tasks
6
+ * autonomously via `submit_task`. The scheduler adds a persistent recurring
7
+ * dimension: schedule a task with a cron expression, and the daemon will fire
8
+ * it on every matching tick — same execution path as `submit_task`, same
9
+ * safety chokepoint, same verifier.
10
+ *
11
+ * Storage:
12
+ * $CLAWD_HOME/.clawdcursor/scheduled-tasks.json — array of ScheduledTask.
13
+ *
14
+ * Lifecycle:
15
+ * - Daemon boot: `initScheduler(agent, logger)` reads the file and registers
16
+ * active cron jobs with the in-process scheduler.
17
+ * - Daemon shutdown: `stopScheduler()` unregisters all jobs cleanly.
18
+ * - MCP tool calls mutate the file and the in-process registry together.
19
+ *
20
+ * Auth: every tool here is gated by the same bearer-token middleware that
21
+ * protects every MCP HTTP call (`requireAuth` in mcp-server.ts). Stdio MCP
22
+ * clients can also call these tools but `ctx.agent` is null on stdio, so
23
+ * the tool returns an error — same pattern as submit_task.
24
+ *
25
+ * Reentrancy: if a scheduled task fires while the agent is busy, we log
26
+ * and SKIP. No queue. Simpler, predictable, and matches what users expect
27
+ * — "if I'm in the middle of something, don't pile on."
28
+ *
29
+ * Cron parser: `croner` (~7 KB, zero deps). Standard 5-field cron syntax
30
+ * plus optional 6th field for seconds; timezones via the schedule's `tz`
31
+ * field. We validate with `Cron.nextRun` at create time and refuse invalid
32
+ * patterns up front rather than at first tick.
33
+ */
34
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
35
+ if (k2 === undefined) k2 = k;
36
+ var desc = Object.getOwnPropertyDescriptor(m, k);
37
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
38
+ desc = { enumerable: true, get: function() { return m[k]; } };
39
+ }
40
+ Object.defineProperty(o, k2, desc);
41
+ }) : (function(o, m, k, k2) {
42
+ if (k2 === undefined) k2 = k;
43
+ o[k2] = m[k];
44
+ }));
45
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
46
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
47
+ }) : function(o, v) {
48
+ o["default"] = v;
49
+ });
50
+ var __importStar = (this && this.__importStar) || (function () {
51
+ var ownKeys = function(o) {
52
+ ownKeys = Object.getOwnPropertyNames || function (o) {
53
+ var ar = [];
54
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
55
+ return ar;
56
+ };
57
+ return ownKeys(o);
58
+ };
59
+ return function (mod) {
60
+ if (mod && mod.__esModule) return mod;
61
+ var result = {};
62
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
63
+ __setModuleDefault(result, mod);
64
+ return result;
65
+ };
66
+ })();
67
+ Object.defineProperty(exports, "__esModule", { value: true });
68
+ exports.initScheduler = initScheduler;
69
+ exports.stopScheduler = stopScheduler;
70
+ exports.getActiveJobCount = getActiveJobCount;
71
+ exports.getSchedulerTools = getSchedulerTools;
72
+ exports._resetSchedulerForTests = _resetSchedulerForTests;
73
+ const fs = __importStar(require("fs"));
74
+ const path = __importStar(require("path"));
75
+ const os = __importStar(require("os"));
76
+ const croner_1 = require("croner");
77
+ // Path is computed dynamically (not module-loaded constant) so tests can
78
+ // redirect via CLAWD_HOME without re-importing the module. Matches the
79
+ // pattern in src/llm/knowledge/cache.ts.
80
+ function dataDir() {
81
+ return path.join(process.env.CLAWD_HOME || os.homedir(), '.clawdcursor');
82
+ }
83
+ function scheduledTasksPath() {
84
+ return path.join(dataDir(), 'scheduled-tasks.json');
85
+ }
86
+ // ── Persistence ────────────────────────────────────────────────────────────
87
+ function loadAll() {
88
+ try {
89
+ if (!fs.existsSync(scheduledTasksPath()))
90
+ return [];
91
+ const raw = JSON.parse(fs.readFileSync(scheduledTasksPath(), 'utf-8'));
92
+ // Tolerate both bare array (early form) and the wrapped shape.
93
+ if (Array.isArray(raw))
94
+ return raw;
95
+ if (raw && Array.isArray(raw.tasks))
96
+ return raw.tasks;
97
+ return [];
98
+ }
99
+ catch {
100
+ return [];
101
+ }
102
+ }
103
+ function saveAll(tasks) {
104
+ if (!fs.existsSync(dataDir()))
105
+ fs.mkdirSync(dataDir(), { recursive: true });
106
+ const data = { schemaVersion: 1, tasks };
107
+ fs.writeFileSync(scheduledTasksPath(), JSON.stringify(data, null, 2), 'utf-8');
108
+ }
109
+ // ── Cron registry (in-process) ─────────────────────────────────────────────
110
+ /** Active cron job handles keyed by ScheduledTask.id. */
111
+ const jobs = new Map();
112
+ let boundAgent = null;
113
+ let boundLog = null;
114
+ function ensureBound() {
115
+ if (!boundAgent)
116
+ return { ok: false, reason: 'scheduler not initialized — daemon must call initScheduler() at boot' };
117
+ return { ok: true, agent: boundAgent };
118
+ }
119
+ /**
120
+ * Fire a single scheduled task. Safe to call concurrently — internally checks
121
+ * agent.getState().status and skips if busy. Never throws to the caller.
122
+ */
123
+ async function fireTask(t) {
124
+ const b = ensureBound();
125
+ if (!b.ok) {
126
+ boundLog?.warn?.('scheduler.fire.no_agent', { id: t.id });
127
+ return;
128
+ }
129
+ try {
130
+ const state = b.agent.getState();
131
+ if (state.status !== 'idle') {
132
+ boundLog?.info?.('scheduler.skip_busy', { id: t.id, agentStatus: state.status });
133
+ const tasks = loadAll();
134
+ const found = tasks.find(x => x.id === t.id);
135
+ if (found) {
136
+ found.skipCount += 1;
137
+ saveAll(tasks);
138
+ }
139
+ return;
140
+ }
141
+ boundLog?.info?.('scheduler.fire', { id: t.id, cron: t.cron, task: t.task.slice(0, 60) });
142
+ // Fire-and-forget — same pattern as submit_task. Errors surface via
143
+ // agent state + the daemon log buffer.
144
+ b.agent.executeTask(t.task).catch(err => {
145
+ const msg = err instanceof Error ? err.message : String(err);
146
+ boundLog?.warn?.('scheduler.execute_error', { id: t.id, error: msg });
147
+ const tasks = loadAll();
148
+ const found = tasks.find(x => x.id === t.id);
149
+ if (found) {
150
+ found.lastError = msg.slice(0, 200);
151
+ saveAll(tasks);
152
+ }
153
+ });
154
+ const tasks = loadAll();
155
+ const found = tasks.find(x => x.id === t.id);
156
+ if (found) {
157
+ found.lastRun = Date.now();
158
+ found.runCount += 1;
159
+ found.lastError = null;
160
+ saveAll(tasks);
161
+ }
162
+ }
163
+ catch (err) {
164
+ boundLog?.error?.('scheduler.fire.threw', { id: t.id, error: err.message });
165
+ }
166
+ }
167
+ function registerJob(t) {
168
+ if (jobs.has(t.id)) {
169
+ jobs.get(t.id).stop();
170
+ jobs.delete(t.id);
171
+ }
172
+ if (!t.enabled)
173
+ return { ok: true };
174
+ try {
175
+ const job = new croner_1.Cron(t.cron, { timezone: t.tz, protect: true }, () => fireTask(t));
176
+ jobs.set(t.id, job);
177
+ return { ok: true };
178
+ }
179
+ catch (err) {
180
+ return { ok: false, reason: `cron register failed: ${err.message}` };
181
+ }
182
+ }
183
+ function unregisterJob(id) {
184
+ const job = jobs.get(id);
185
+ if (job) {
186
+ job.stop();
187
+ jobs.delete(id);
188
+ }
189
+ }
190
+ // ── Public lifecycle ───────────────────────────────────────────────────────
191
+ /**
192
+ * Wire the scheduler to a running agent + logger. Called once from the daemon
193
+ * boot. Loads persisted tasks and registers all enabled crons. Idempotent.
194
+ */
195
+ function initScheduler(agent, log) {
196
+ boundAgent = agent;
197
+ boundLog = log ?? null;
198
+ let registered = 0, failed = 0, paused = 0;
199
+ for (const t of loadAll()) {
200
+ if (!t.enabled) {
201
+ paused += 1;
202
+ continue;
203
+ }
204
+ const r = registerJob(t);
205
+ if (r.ok)
206
+ registered += 1;
207
+ else {
208
+ failed += 1;
209
+ boundLog?.warn?.('scheduler.boot.register_failed', { id: t.id, reason: r.reason });
210
+ }
211
+ }
212
+ boundLog?.info?.('scheduler.booted', { registered, failed, paused, totalActive: jobs.size });
213
+ return { registered, failed, paused };
214
+ }
215
+ /** Stop every active cron job. Daemon shutdown hook. */
216
+ function stopScheduler() {
217
+ for (const [, job] of jobs)
218
+ job.stop();
219
+ jobs.clear();
220
+ boundAgent = null;
221
+ boundLog?.info?.('scheduler.stopped', {});
222
+ boundLog = null;
223
+ }
224
+ /** Test/debug accessor — number of active in-process jobs. */
225
+ function getActiveJobCount() { return jobs.size; }
226
+ // ── MCP tools ──────────────────────────────────────────────────────────────
227
+ function needAgent(tool) {
228
+ return {
229
+ text: `${tool}: requires the daemon (\`clawdcursor agent\`). ` +
230
+ `Stdio MCP clients have no scheduler context.`,
231
+ isError: true,
232
+ };
233
+ }
234
+ function genId() {
235
+ return `s_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`;
236
+ }
237
+ function describeNext(t) {
238
+ try {
239
+ const c = new croner_1.Cron(t.cron, { timezone: t.tz });
240
+ const next = c.nextRun();
241
+ c.stop();
242
+ return next ? next.toISOString() : null;
243
+ }
244
+ catch {
245
+ return null;
246
+ }
247
+ }
248
+ function getSchedulerTools() {
249
+ return [
250
+ {
251
+ name: 'scheduled_task_create',
252
+ description: 'Create a recurring task that runs on a cron schedule. The task ' +
253
+ 'submits to the autonomous agent each time the cron tick fires; if ' +
254
+ 'the agent is busy at that moment, the tick is skipped (no queue). ' +
255
+ 'Cron is standard 5-field syntax (`* * * * *` = every minute) or ' +
256
+ '6-field with leading seconds. Returns the created task with id + ' +
257
+ 'next-run timestamp. Persisted across daemon restarts.',
258
+ parameters: {
259
+ task: {
260
+ type: 'string',
261
+ description: 'Natural-language task to run on each tick',
262
+ required: true,
263
+ },
264
+ cron: {
265
+ type: 'string',
266
+ description: 'Cron expression (e.g. "0 9 * * 1-5" = 9am weekdays)',
267
+ required: true,
268
+ },
269
+ tz: {
270
+ type: 'string',
271
+ description: 'Optional timezone (e.g. "America/New_York"). Defaults to server local.',
272
+ required: false,
273
+ },
274
+ },
275
+ category: 'orchestration',
276
+ compactGroup: 'task',
277
+ safetyTier: 1,
278
+ handler: async ({ task, cron, tz }, ctx) => {
279
+ if (!ctx.agent)
280
+ return needAgent('scheduled_task_create');
281
+ const trimmedTask = String(task ?? '').trim();
282
+ const trimmedCron = String(cron ?? '').trim();
283
+ if (!trimmedTask)
284
+ return { text: 'scheduled_task_create: task is required', isError: true };
285
+ if (!trimmedCron)
286
+ return { text: 'scheduled_task_create: cron is required', isError: true };
287
+ if (trimmedTask.length > 2000)
288
+ return { text: 'scheduled_task_create: task too long (max 2000)', isError: true };
289
+ // Validate the cron expression before persisting.
290
+ try {
291
+ const probe = new croner_1.Cron(trimmedCron, { timezone: tz ? String(tz) : undefined });
292
+ const nxt = probe.nextRun();
293
+ probe.stop();
294
+ if (!nxt)
295
+ return { text: `scheduled_task_create: cron "${trimmedCron}" never fires`, isError: true };
296
+ }
297
+ catch (err) {
298
+ return { text: `scheduled_task_create: invalid cron "${trimmedCron}": ${err.message}`, isError: true };
299
+ }
300
+ const t = {
301
+ id: genId(),
302
+ cron: trimmedCron,
303
+ task: trimmedTask,
304
+ enabled: true,
305
+ tz: tz ? String(tz) : undefined,
306
+ createdAt: Date.now(),
307
+ lastRun: null,
308
+ lastError: null,
309
+ runCount: 0,
310
+ skipCount: 0,
311
+ };
312
+ const all = loadAll();
313
+ all.push(t);
314
+ saveAll(all);
315
+ const r = registerJob(t);
316
+ if (!r.ok) {
317
+ // Roll back persistence on register failure.
318
+ saveAll(all.filter(x => x.id !== t.id));
319
+ return { text: `scheduled_task_create: ${r.reason}`, isError: true };
320
+ }
321
+ return { text: JSON.stringify({ ok: true, task: t, nextRun: describeNext(t) }) };
322
+ },
323
+ },
324
+ {
325
+ name: 'scheduled_task_list',
326
+ description: 'Return every scheduled task: id, cron expression, task text, enabled ' +
327
+ 'state, run/skip counters, last-run / last-error, next-run timestamp.',
328
+ parameters: {},
329
+ category: 'orchestration',
330
+ compactGroup: 'task',
331
+ safetyTier: 0,
332
+ handler: async () => {
333
+ const all = loadAll();
334
+ return {
335
+ text: JSON.stringify({
336
+ tasks: all.map(t => ({ ...t, nextRun: describeNext(t) })),
337
+ activeJobs: jobs.size,
338
+ }),
339
+ };
340
+ },
341
+ },
342
+ {
343
+ name: 'scheduled_task_delete',
344
+ description: 'Delete one scheduled task by id. No-op if id is unknown.',
345
+ parameters: {
346
+ id: { type: 'string', description: 'ScheduledTask.id', required: true },
347
+ },
348
+ category: 'orchestration',
349
+ compactGroup: 'task',
350
+ safetyTier: 2,
351
+ handler: async ({ id }) => {
352
+ const targetId = String(id ?? '').trim();
353
+ if (!targetId)
354
+ return { text: 'scheduled_task_delete: id required', isError: true };
355
+ const all = loadAll();
356
+ const filtered = all.filter(t => t.id !== targetId);
357
+ if (filtered.length === all.length) {
358
+ return { text: JSON.stringify({ ok: true, deleted: false, reason: 'id not found' }) };
359
+ }
360
+ saveAll(filtered);
361
+ unregisterJob(targetId);
362
+ return { text: JSON.stringify({ ok: true, deleted: true, remaining: filtered.length }) };
363
+ },
364
+ },
365
+ {
366
+ name: 'scheduled_task_toggle',
367
+ description: 'Pause/resume a scheduled task without deleting it. When disabled the ' +
368
+ 'cron job is unregistered (no firing); state stays persisted.',
369
+ parameters: {
370
+ id: { type: 'string', description: 'ScheduledTask.id', required: true },
371
+ enabled: { type: 'boolean', description: 'true=enable, false=pause', required: true },
372
+ },
373
+ category: 'orchestration',
374
+ compactGroup: 'task',
375
+ safetyTier: 1,
376
+ handler: async ({ id, enabled }) => {
377
+ const targetId = String(id ?? '').trim();
378
+ if (!targetId)
379
+ return { text: 'scheduled_task_toggle: id required', isError: true };
380
+ const all = loadAll();
381
+ const found = all.find(t => t.id === targetId);
382
+ if (!found)
383
+ return { text: 'scheduled_task_toggle: id not found', isError: true };
384
+ found.enabled = !!enabled;
385
+ saveAll(all);
386
+ if (found.enabled) {
387
+ const r = registerJob(found);
388
+ if (!r.ok)
389
+ return { text: `scheduled_task_toggle: enabled but register failed: ${r.reason}`, isError: true };
390
+ }
391
+ else {
392
+ unregisterJob(targetId);
393
+ }
394
+ return { text: JSON.stringify({ ok: true, task: found, nextRun: describeNext(found) }) };
395
+ },
396
+ },
397
+ ];
398
+ }
399
+ // ── Test hook ─────────────────────────────────────────────────────────────
400
+ /** Wipe state — for vitest cleanup. NOT exposed via MCP. */
401
+ function _resetSchedulerForTests() {
402
+ for (const [, job] of jobs)
403
+ job.stop();
404
+ jobs.clear();
405
+ boundAgent = null;
406
+ boundLog = null;
407
+ try {
408
+ if (fs.existsSync(scheduledTasksPath()))
409
+ fs.unlinkSync(scheduledTasksPath());
410
+ }
411
+ catch { /* ok */ }
412
+ }
413
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/tools/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Shortcut tools — expose the keyboard shortcuts database to MCP clients.
3
+ *
4
+ * Two tools:
5
+ * shortcuts_list — query available shortcuts by category/context
6
+ * shortcuts_execute — run a shortcut by intent (fuzzy-matched)
7
+ *
8
+ * This bridges the gap between the pipeline router (`src/core/router/router.ts`)
9
+ * — which knows all shortcuts — and external agents calling MCP tools
10
+ * that previously had to independently know keyboard combos.
11
+ */
12
+ import type { ToolDefinition } from './types';
13
+ export declare function getShortcutTools(): ToolDefinition[];