tarsk 0.6.87 → 0.6.88

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 (257) hide show
  1. package/dist/bundled-skills/email-me/SKILL.md +15 -0
  2. package/dist/bundled-skills/email-me/scripts/__tests__/email_me.test.js +64 -0
  3. package/dist/bundled-skills/email-me/scripts/email_me.js +45 -0
  4. package/dist/bundled-skills/handoff/SKILL.md +19 -0
  5. package/dist/bundled-skills/tarsk-agent/SKILL.md +372 -0
  6. package/dist/bundled-skills/tarsk-ask-user/SKILL.md +18 -0
  7. package/dist/bundled-skills/tarsk-ask-user/scripts/ask_user.js +101 -0
  8. package/dist/bundled-skills/tarsk-bash/SKILL.md +17 -0
  9. package/dist/bundled-skills/tarsk-bash/scripts/bash.js +248 -0
  10. package/dist/bundled-skills/tarsk-browser/SKILL.md +17 -0
  11. package/dist/bundled-skills/tarsk-browser/scripts/browser.js +252 -0
  12. package/dist/bundled-skills/tarsk-chat-title/SKILL.md +14 -0
  13. package/dist/bundled-skills/tarsk-chat-title/scripts/chat_title.js +37 -0
  14. package/dist/bundled-skills/tarsk-connect-mcp/SKILL.md +23 -0
  15. package/dist/bundled-skills/tarsk-connect-mcp/scripts/__tests__/connect_mcp.test.js +68 -0
  16. package/dist/bundled-skills/tarsk-connect-mcp/scripts/connect_mcp.js +119 -0
  17. package/dist/bundled-skills/tarsk-create-project/SKILL.md +25 -0
  18. package/dist/bundled-skills/tarsk-create-project/scripts/__tests__/create_project.test.js +94 -0
  19. package/dist/bundled-skills/tarsk-create-project/scripts/create_project.js +88 -0
  20. package/dist/bundled-skills/tarsk-edit/SKILL.md +18 -0
  21. package/dist/bundled-skills/tarsk-edit/scripts/edit.js +118 -0
  22. package/dist/bundled-skills/tarsk-execute-skill-script/SKILL.md +19 -0
  23. package/dist/bundled-skills/tarsk-execute-skill-script/scripts/execute_skill_script.js +77 -0
  24. package/dist/bundled-skills/tarsk-fetch/SKILL.md +18 -0
  25. package/dist/bundled-skills/tarsk-fetch/scripts/fetch.js +38 -0
  26. package/dist/bundled-skills/tarsk-find/SKILL.md +16 -0
  27. package/dist/bundled-skills/tarsk-find/scripts/find.js +78 -0
  28. package/dist/bundled-skills/tarsk-find-images/SKILL.md +18 -0
  29. package/dist/bundled-skills/tarsk-find-images/scripts/find_images.js +78 -0
  30. package/dist/bundled-skills/tarsk-generate-image/SKILL.md +18 -0
  31. package/dist/bundled-skills/tarsk-generate-image/scripts/generate_image.js +55 -0
  32. package/dist/bundled-skills/tarsk-get-observation/SKILL.md +19 -0
  33. package/dist/bundled-skills/tarsk-get-observation/scripts/get_observation.js +293 -0
  34. package/dist/bundled-skills/tarsk-grep/SKILL.md +16 -0
  35. package/dist/bundled-skills/tarsk-grep/scripts/grep.js +174 -0
  36. package/dist/bundled-skills/tarsk-history/SKILL.md +15 -0
  37. package/dist/bundled-skills/tarsk-history/scripts/history.js +68 -0
  38. package/dist/bundled-skills/tarsk-improve/SKILL.md +232 -0
  39. package/dist/bundled-skills/tarsk-improve/references/signals.md +16 -0
  40. package/dist/bundled-skills/tarsk-improve/scripts/durable-runs.ts +635 -0
  41. package/dist/bundled-skills/tarsk-improve/scripts/ensure-exported.ts +238 -0
  42. package/dist/bundled-skills/tarsk-improve/scripts/export-tool-skills-lib.ts +299 -0
  43. package/dist/bundled-skills/tarsk-improve/scripts/summarize-session.ts +126 -0
  44. package/dist/bundled-skills/tarsk-jobs/SKILL.md +18 -0
  45. package/dist/bundled-skills/tarsk-jobs/scripts/job_kill.js +45 -0
  46. package/dist/bundled-skills/tarsk-jobs/scripts/job_list.js +64 -0
  47. package/dist/bundled-skills/tarsk-jobs/scripts/job_output.js +66 -0
  48. package/dist/bundled-skills/tarsk-notes/SKILL.md +17 -0
  49. package/dist/bundled-skills/tarsk-notes/scripts/notes.js +86 -0
  50. package/dist/bundled-skills/tarsk-projects/SKILL.md +18 -0
  51. package/dist/bundled-skills/tarsk-projects/scripts/projects.js +54 -0
  52. package/dist/bundled-skills/tarsk-prompt-project/SKILL.md +18 -0
  53. package/dist/bundled-skills/tarsk-prompt-project/scripts/prompt_project.js +58 -0
  54. package/dist/bundled-skills/tarsk-propose-branch/SKILL.md +16 -0
  55. package/dist/bundled-skills/tarsk-propose-branch/scripts/propose_branch.js +45 -0
  56. package/dist/bundled-skills/tarsk-read/SKILL.md +17 -0
  57. package/dist/bundled-skills/tarsk-read/scripts/read.js +331 -0
  58. package/dist/bundled-skills/tarsk-read-skill/SKILL.md +16 -0
  59. package/dist/bundled-skills/tarsk-read-skill/scripts/read_skill.js +37 -0
  60. package/dist/bundled-skills/tarsk-read-skill-reference/SKILL.md +19 -0
  61. package/dist/bundled-skills/tarsk-read-skill-reference/scripts/read_skill_reference.js +60 -0
  62. package/dist/bundled-skills/tarsk-run-js/SKILL.md +18 -0
  63. package/dist/bundled-skills/tarsk-run-js/scripts/run_js.js +192 -0
  64. package/dist/bundled-skills/tarsk-tasks/SKILL.md +18 -0
  65. package/dist/bundled-skills/tarsk-tasks/scripts/tasks.js +96 -0
  66. package/dist/bundled-skills/tarsk-todo/SKILL.md +16 -0
  67. package/dist/bundled-skills/tarsk-todo/scripts/todo.js +165 -0
  68. package/dist/bundled-skills/tarsk-web-search/SKILL.md +15 -0
  69. package/dist/bundled-skills/tarsk-web-search/scripts/web_search.js +120 -0
  70. package/dist/bundled-skills/tarsk-write/SKILL.md +16 -0
  71. package/dist/bundled-skills/tarsk-write/scripts/write.js +57 -0
  72. package/dist/index.js +215804 -210026
  73. package/dist/node_modules/@libsql/darwin-arm64/README.md +3 -0
  74. package/dist/node_modules/@libsql/{darwin-x64 → darwin-arm64}/index.node +0 -0
  75. package/dist/node_modules/@libsql/{darwin-x64 → darwin-arm64}/package.json +6 -6
  76. package/dist/public/assets/account-view-DkuCOxkE.js +1 -0
  77. package/dist/public/assets/{alert-dialog-DVaEQlVa.js → alert-dialog-BcZULJsX.js} +1 -1
  78. package/dist/public/assets/api-B_GSyYGh.js +1 -0
  79. package/dist/public/assets/api-C4ukGdyH.js +2 -0
  80. package/dist/public/assets/{async-error-boundary-DH6Sqgmt.js → async-error-boundary-FT8_xvjy.js} +1 -1
  81. package/dist/public/assets/browser-tab-DCjHytQ8.js +12 -0
  82. package/dist/public/assets/button-DDaJhJP1.js +1 -0
  83. package/dist/public/assets/{card-BkOGFps5.js → card-DAc45J1v.js} +1 -1
  84. package/dist/public/assets/chat-dock-context-a2bV9cnz.js +1 -0
  85. package/dist/public/assets/chat-handlers-context-2xSKzkKa.js +9 -0
  86. package/dist/public/assets/commit-dialog-C1oUFznJ.js +1 -0
  87. package/dist/public/assets/{commit-error-dialog-D3S6kRVr.js → commit-error-dialog--NTHg7Aw.js} +1 -1
  88. package/dist/public/assets/{commit-method-fields-BEKfSRyW.js → commit-method-fields-Xt3vbwUg.js} +1 -1
  89. package/dist/public/assets/{conversation-history-view-CVMD8hUU.js → conversation-history-view-CdfE7JTD.js} +1 -1
  90. package/dist/public/assets/{create-project-dialog-nquqlloK.js → create-project-dialog-BdR6iQE9.js} +2 -2
  91. package/dist/public/assets/{create-project-workspace-C4tXAUWJ.js → create-project-workspace-DSTTGom_.js} +2 -2
  92. package/dist/public/assets/create-repo-dialog-gw-8Rpdm.js +1 -0
  93. package/dist/public/assets/{delete-confirm-dialog-SpYpU1AX.js → delete-confirm-dialog-D1N86piR.js} +1 -1
  94. package/dist/public/assets/dialog-D_12AsZd.js +1 -0
  95. package/dist/public/assets/diff-view-B6JJNyn1.js +4 -0
  96. package/dist/public/assets/{dist-NcyjV9Gu.js → dist-2xH_pFmV.js} +1 -1
  97. package/dist/public/assets/{dist-BTu7PDzc.js → dist-AbkJBHH5.js} +1 -1
  98. package/dist/public/assets/{dist-lFBinzor.js → dist-B-h6Wj39.js} +1 -1
  99. package/dist/public/assets/dist-CgbWuuq4.js +1 -0
  100. package/dist/public/assets/{dist-f54JuzFV.js → dist-DOz2WXwX.js} +1 -1
  101. package/dist/public/assets/{dist-CqrmQxmV.js → dist-DfnQ9YJh.js} +1 -1
  102. package/dist/public/assets/{dist-BOfRC57H.js → dist-JGbQ_EJY.js} +1 -1
  103. package/dist/public/assets/{dist-ButPmyjr.js → dist-pCVg1Jdl.js} +1 -1
  104. package/dist/public/assets/dist-v_MvKS2-.js +2 -0
  105. package/dist/public/assets/{es2015-CE7VcoOH.js → es2015-eNVkKfFF.js} +1 -1
  106. package/dist/public/assets/{explorer-file-drop-CEbBlDEp.js → explorer-file-drop-CzyAqZgf.js} +1 -1
  107. package/dist/public/assets/{explorer-monaco-editor-Bgo9Y1cP.js → explorer-monaco-editor-ChJZBFy5.js} +1 -1
  108. package/dist/public/assets/explorer-tab-view-CiUPh4uK.js +2 -0
  109. package/dist/public/assets/explorer-tree-BA12VLz_.js +1 -0
  110. package/dist/public/assets/{explorer-view-BuTa_0Uq.js → explorer-view-Daxl93oM.js} +3 -3
  111. package/dist/public/assets/git-history-dialog-Dqj1p35g.js +1 -0
  112. package/dist/public/assets/index-CoY8DilQ.js +97 -0
  113. package/dist/public/assets/index-D14wLW4o.css +1 -0
  114. package/dist/public/assets/{label-C31qF5zZ.js → label-BCs5CZEs.js} +1 -1
  115. package/dist/public/assets/markdown-renderer-D2VcKU4g.js +10 -0
  116. package/dist/public/assets/{mcp-manager-C3K_62H2.js → mcp-manager-D1HmLT3t.js} +1 -1
  117. package/dist/public/assets/{minus-l6BdrAEk.js → minus-CgQcbBQT.js} +1 -1
  118. package/dist/public/assets/{model-list-controls-DwW8S18v.js → model-list-controls-rXmaDp2r.js} +1 -1
  119. package/dist/public/assets/onboarding-dialog-DSqBJyBa.js +1 -0
  120. package/dist/public/assets/{pill-tabs-CmvvHdKG.js → pill-tabs-DtdTmrg7.js} +1 -1
  121. package/dist/public/assets/progress-indicator-hJ74ac5W.js +1 -0
  122. package/dist/public/assets/project-coding-view-DP4qKePE.js +1 -0
  123. package/dist/public/assets/{project-danger-zone-view-D18k4pUF.js → project-danger-zone-view-CGxIenpr.js} +1 -1
  124. package/dist/public/assets/{project-env-vars-view-BWFqoaFD.js → project-env-vars-view-DKyQkh7h.js} +1 -1
  125. package/dist/public/assets/project-model-aliases-view-BewwJZAx.js +1 -0
  126. package/dist/public/assets/project-settings-view-CE4nAz5B.js +1 -0
  127. package/dist/public/assets/{project-tools-view-DT87KPjE.js → project-tools-view-CbDfst02.js} +1 -1
  128. package/dist/public/assets/providers-list-view-BtwccvX2.js +1 -0
  129. package/dist/public/assets/pull-request-dialog-nKYATjbm.js +1 -0
  130. package/dist/public/assets/pull-with-changes-dialog-zzoFzCv4.js +1 -0
  131. package/dist/public/assets/push-before-pr-dialog-DH91JHEC.js +1 -0
  132. package/dist/public/assets/remote-media-url-CyuN31H_.js +1 -0
  133. package/dist/public/assets/{scroll-area-BWc4OPsj.js → scroll-area-CGEZ1gAL.js} +1 -1
  134. package/dist/public/assets/{select-B6RizwDW.js → select-BR2pG61R.js} +1 -1
  135. package/dist/public/assets/settings-general-tabs-view-BWR0UX2P.js +2 -0
  136. package/dist/public/assets/settings-general-view-BhtrDmJH.js +1 -0
  137. package/dist/public/assets/{settings-list-D35rpAof.js → settings-list-Dgip9HpD.js} +1 -1
  138. package/dist/public/assets/settings-logs-view-CS29x4VT.js +5 -0
  139. package/dist/public/assets/settings-mcp-servers-view-B5ithpfh.js +5 -0
  140. package/dist/public/assets/settings-models-view-DS7nm54P.js +1 -0
  141. package/dist/public/assets/settings-plugins-view-avaUE36r.js +2 -0
  142. package/dist/public/assets/settings-providers-view-B39k1iRQ.js +2 -0
  143. package/dist/public/assets/settings-remote-machines-view-BXondQG_.js +1 -0
  144. package/dist/public/assets/settings-setup-view-I5MGUi_D.js +2 -0
  145. package/dist/public/assets/settings-skills-view-BKrUABbi.js +2 -0
  146. package/dist/public/assets/{settings-slack-view-DkclyaBc.js → settings-slack-view-B0p-96GC.js} +1 -1
  147. package/dist/public/assets/settings-slash-commands-view-DA1scWv1.js +1 -0
  148. package/dist/public/assets/{settings-statistics-view-B03ZZjEy.js → settings-statistics-view-B3g6BD7p.js} +1 -1
  149. package/dist/public/assets/settings-storage-view-BJvjhI4f.js +1 -0
  150. package/dist/public/assets/settings-subagents-view-BziLwvNq.js +2 -0
  151. package/dist/public/assets/settings-system-prompt-view-BqAk56cD.js +1 -0
  152. package/dist/public/assets/{settings-tab-bar-ajzyt79U.js → settings-tab-bar-DYzU_lmi.js} +1 -1
  153. package/dist/public/assets/settings-view-zjMs7jNe.js +2 -0
  154. package/dist/public/assets/{slug-utils-D2jhPz-o.js → slug-utils-CO6nui1C.js} +1 -1
  155. package/dist/public/assets/square-CtxvwmM2.js +1 -0
  156. package/dist/public/assets/store-W78TGOIO.js +8 -0
  157. package/dist/public/assets/{table-C3Hc0Gwy.js → table-CQMqIW_-.js} +1 -1
  158. package/dist/public/assets/task-utils-BZPVmvY4.js +1 -0
  159. package/dist/public/assets/tasks-view-wFf77AQX.js +1 -0
  160. package/dist/public/assets/{terminal-panel-DCKqScJu.js → terminal-panel-Bm_ZelN-.js} +2 -2
  161. package/dist/public/assets/{toggle-group-DqSxGqvP.js → toggle-group-CPmseZfb.js} +1 -1
  162. package/dist/public/assets/{tooltip-CJKJfu0l.js → tooltip-CqwCZ7wt.js} +1 -1
  163. package/dist/public/assets/{use-account-settings-query-AUeOqKvo.js → use-account-settings-query-C-zOdREq.js} +1 -1
  164. package/dist/public/assets/{use-active-dock-panel-instance-BvAhUd_V.js → use-active-dock-panel-instance-4Ss8lB9K.js} +1 -1
  165. package/dist/public/assets/use-browser-overlay-block-CO1pUEAZ.js +1 -0
  166. package/dist/public/assets/use-git-check-CumqGAvN.js +1 -0
  167. package/dist/public/assets/{use-installed-ai-files-iy_AB0dN.js → use-installed-ai-files-DQey9Zm3.js} +1 -1
  168. package/dist/public/assets/use-open-chat-dock-panel-DqfWJ8e8.js +1 -0
  169. package/dist/public/assets/use-projects-CizIH2Fa.js +2 -0
  170. package/dist/public/assets/utils-CqsIXqSC.js +1 -0
  171. package/dist/public/assets/web-BNWoiS4w.js +1 -0
  172. package/dist/public/assets/web-CGP-jEpi.js +1 -0
  173. package/dist/public/assets/web-CKC9gpFi.js +1 -0
  174. package/dist/public/assets/web-Dlo3GwCf.js +1 -0
  175. package/dist/public/fonts/schibsted-grotesk-latin-ext-wght-normal.woff2 +0 -0
  176. package/dist/public/fonts/schibsted-grotesk-latin-wght-normal.woff2 +0 -0
  177. package/dist/public/index.html +45 -45
  178. package/package.json +6 -6
  179. package/dist/node_modules/@libsql/darwin-x64/README.md +0 -3
  180. package/dist/public/assets/account-view-5q3pHEHY.js +0 -1
  181. package/dist/public/assets/ai-spinner-DHwhlk4j.js +0 -1
  182. package/dist/public/assets/api-BdebJfuN.js +0 -1
  183. package/dist/public/assets/api-COO2LfdU.js +0 -2
  184. package/dist/public/assets/browser-overlay-block-CiDtkfup.js +0 -1
  185. package/dist/public/assets/browser-tab-CVdYLmW5.js +0 -12
  186. package/dist/public/assets/button-Dp5XDZNR.js +0 -1
  187. package/dist/public/assets/chat-dock-context-ymLoO90X.js +0 -1
  188. package/dist/public/assets/checkbox-D-BV8-Z_.js +0 -1
  189. package/dist/public/assets/commit-dialog-CEbCFh1x.js +0 -1
  190. package/dist/public/assets/create-repo-dialog-B5IE3pUJ.js +0 -1
  191. package/dist/public/assets/dialog-pHPeIGaB.js +0 -1
  192. package/dist/public/assets/diff-view-Cy6nPdX-.js +0 -4
  193. package/dist/public/assets/dist-D5vgS4RP.js +0 -2
  194. package/dist/public/assets/explorer-tab-view-C-8QZO9S.js +0 -2
  195. package/dist/public/assets/explorer-tree-HrLSFgcI.js +0 -1
  196. package/dist/public/assets/git-history-dialog-ClfF5IOn.js +0 -1
  197. package/dist/public/assets/index-BBLA5zVt.css +0 -1
  198. package/dist/public/assets/index-CalVAwXj.js +0 -104
  199. package/dist/public/assets/markdown-renderer-DXRBG7uP.js +0 -10
  200. package/dist/public/assets/onboarding-dialog-BtLy0wjC.js +0 -1
  201. package/dist/public/assets/progress-indicator-4zQXqOqP.js +0 -1
  202. package/dist/public/assets/project-coding-view-CyJwnJes.js +0 -1
  203. package/dist/public/assets/project-model-aliases-view-D3tYNkkM.js +0 -1
  204. package/dist/public/assets/project-settings-view-0oN9vFvD.js +0 -1
  205. package/dist/public/assets/providers-list-view-DCnh0W-5.js +0 -1
  206. package/dist/public/assets/pull-request-dialog-BdJxYQwu.js +0 -1
  207. package/dist/public/assets/pull-with-changes-dialog-Do9x9neW.js +0 -1
  208. package/dist/public/assets/push-before-pr-dialog-C-9z2O0-.js +0 -1
  209. package/dist/public/assets/remote-media-url-B8OFqxOM.js +0 -1
  210. package/dist/public/assets/settings-general-tabs-view-Dcek-ysB.js +0 -2
  211. package/dist/public/assets/settings-general-view-DhA2N6G5.js +0 -1
  212. package/dist/public/assets/settings-logs-view-eEUTIMeb.js +0 -5
  213. package/dist/public/assets/settings-mcp-servers-view-_oeuVkUe.js +0 -5
  214. package/dist/public/assets/settings-models-view-DW-ZmVup.js +0 -1
  215. package/dist/public/assets/settings-plugins-view-DTooco_c.js +0 -2
  216. package/dist/public/assets/settings-providers-view-CEeJkhg9.js +0 -2
  217. package/dist/public/assets/settings-remote-machines-view--UB8GlCK.js +0 -1
  218. package/dist/public/assets/settings-setup-view-DFL6DlYS.js +0 -2
  219. package/dist/public/assets/settings-skills-view-xS569-Kb.js +0 -2
  220. package/dist/public/assets/settings-slash-commands-view-DrCiayfq.js +0 -1
  221. package/dist/public/assets/settings-storage-view-CQnaVOt_.js +0 -1
  222. package/dist/public/assets/settings-subagents-view-DIctUJcE.js +0 -2
  223. package/dist/public/assets/settings-system-prompt-view-BMDbrFRR.js +0 -1
  224. package/dist/public/assets/settings-view-8M6sbGiX.js +0 -2
  225. package/dist/public/assets/store-CxUwqrZ5.js +0 -8
  226. package/dist/public/assets/task-utils-WAei2PDi.js +0 -1
  227. package/dist/public/assets/tasks-view-DKyqgGdE.js +0 -1
  228. package/dist/public/assets/use-browser-overlay-block-z9imTmiZ.js +0 -1
  229. package/dist/public/assets/use-git-check-B_5Jak2s.js +0 -1
  230. package/dist/public/assets/use-open-chat-dock-panel-w3hc5Vxn.js +0 -1
  231. package/dist/public/assets/use-projects-BmhAMgxB.js +0 -2
  232. package/dist/public/assets/utils-mYB1USG6.js +0 -1
  233. package/dist/public/assets/web-C6Gm4nQ0.js +0 -1
  234. package/dist/public/assets/web-DFlyNg8o.js +0 -1
  235. package/dist/public/assets/web-DlEPs8Xe.js +0 -1
  236. package/dist/public/assets/web-Gx3xReQH.js +0 -1
  237. package/dist/public/backgrounds/arctic-tundra.avif +0 -0
  238. package/dist/public/backgrounds/autumn-leaves.avif +0 -0
  239. package/dist/public/backgrounds/coastal-cliff.avif +0 -0
  240. package/dist/public/backgrounds/floating-waterfall.avif +0 -0
  241. package/dist/public/backgrounds/forest-path.avif +0 -0
  242. package/dist/public/backgrounds/garden-path.avif +0 -0
  243. package/dist/public/backgrounds/glow-marsh.avif +0 -0
  244. package/dist/public/backgrounds/golden-wheat.avif +0 -0
  245. package/dist/public/backgrounds/moon-desert.avif +0 -0
  246. package/dist/public/backgrounds/night-pond.avif +0 -0
  247. package/dist/public/backgrounds/prairie-grassland.avif +0 -0
  248. package/dist/public/backgrounds/river-winding.avif +0 -0
  249. package/dist/public/backgrounds/salt-flat.avif +0 -0
  250. package/dist/public/backgrounds/salt-marsh.avif +0 -0
  251. package/dist/public/backgrounds/sandy-beach.avif +0 -0
  252. package/dist/public/backgrounds/snow-river.avif +0 -0
  253. package/dist/public/backgrounds/sunset-pond.avif +0 -0
  254. package/dist/public/fonts/plus-jakarta-sans-cyrillic-ext-wght-normal.woff2 +0 -0
  255. package/dist/public/fonts/plus-jakarta-sans-latin-ext-wght-normal.woff2 +0 -0
  256. package/dist/public/fonts/plus-jakarta-sans-latin-wght-normal.woff2 +0 -0
  257. package/dist/public/fonts/plus-jakarta-sans-vietnamese-wght-normal.woff2 +0 -0
@@ -0,0 +1,78 @@
1
+ /**
2
+ * find — formatting in the Skill; secure glob via context.fs (host).
3
+ */
4
+
5
+ export const description =
6
+ "Find files by path glob (not file contents; use grep for text). Paths are relative to the search dir. Read the file directly when its path is known. `dir/{a,b}.tsx` is shallow — use `**/` for nested. Grouped as `dir/: file1, file2`. Truncated to 1000 results / 50KB.";
7
+
8
+ export const parameters = {
9
+ type: "object",
10
+ required: ["pattern"],
11
+ properties: {
12
+ pattern: {
13
+ description: "Glob pattern, e.g. '*.ts' or '**/*.json'",
14
+ type: "string",
15
+ },
16
+ path: {
17
+ description: "Directory to search (default: current directory)",
18
+ type: "string",
19
+ },
20
+ limit: {
21
+ description: "Maximum results (default: 1000)",
22
+ type: "number",
23
+ },
24
+ },
25
+ };
26
+
27
+ /** @param {Record<string, unknown>} args @param {import("../../../../src/tools/agent-runtime/types.js").AgentRuntime} context @param {{ signal?: AbortSignal }} [options] */
28
+ export async function execute(args, context, options) {
29
+ const pattern = String(args.pattern ?? "");
30
+ const searchDir = typeof args.path === "string" ? args.path : undefined;
31
+ const limit = typeof args.limit === "number" ? args.limit : undefined;
32
+
33
+ const result = await context.util.withAbort(options?.signal, async function runFind() {
34
+ return context.fs.glob(pattern, {
35
+ path: searchDir,
36
+ limit,
37
+ signal: options?.signal,
38
+ });
39
+ });
40
+
41
+ if (result.paths.length === 0) {
42
+ return {
43
+ content: [{ type: "text", text: "No files found matching pattern" }],
44
+ details: undefined,
45
+ };
46
+ }
47
+
48
+ const compressed = context.util.compressFindPaths(result.paths);
49
+ const truncation = context.util.truncateHead(compressed.text, {
50
+ maxLines: Number.MAX_SAFE_INTEGER,
51
+ });
52
+ let resultOutput = truncation.content;
53
+ const details = {};
54
+ const notices = [];
55
+
56
+ if (compressed.applied) {
57
+ resultOutput = `${compressed.banner}\n${resultOutput}`;
58
+ }
59
+
60
+ if (result.resultLimitReached) {
61
+ notices.push(
62
+ `${result.limit} results limit reached. Use limit=${result.limit * 2} for more, or refine pattern`,
63
+ );
64
+ details.resultLimitReached = result.limit;
65
+ }
66
+ if (truncation.truncated) {
67
+ notices.push(`${context.util.formatSize(context.util.maxBytes)} limit reached`);
68
+ details.truncation = truncation;
69
+ }
70
+ if (notices.length > 0) {
71
+ resultOutput += `\n\n[${notices.join(". ")}]`;
72
+ }
73
+
74
+ return {
75
+ content: [{ type: "text", text: resultOutput }],
76
+ details: Object.keys(details).length > 0 ? details : undefined,
77
+ };
78
+ }
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: tarsk-find-images
3
+ description: >-
4
+ Tarsk Tool skill publishing: find_images.
5
+ version: 2.0.0
6
+ tools:
7
+ - find_images
8
+ deferred-tools:
9
+ - find_images
10
+ disable-model-invocation: true
11
+ ---
12
+
13
+ # tarsk-find-images
14
+
15
+ Publishes: find_images.
16
+
17
+ Success/error copy in `scripts/find_images.js`. Host
18
+ `context.images.searchAndSave` (network + cwd-safe save).
@@ -0,0 +1,78 @@
1
+ /**
2
+ * find_images — success/error copy in the Skill; host searches + saves.
3
+ */
4
+
5
+ export const description =
6
+ "Find a stock image matching a search query. Returns a URL served by the Tarsk API and optionally saves the image to a file. " +
7
+ "Use this when the user needs an image and the user has not requested it be generated.";
8
+
9
+ export const parameters = {
10
+ type: "object",
11
+ required: ["query"],
12
+ properties: {
13
+ query: {
14
+ description: "Image search query, e.g. 'sunset over mountains'",
15
+ type: "string",
16
+ },
17
+ size: {
18
+ description:
19
+ "Image size variant: original, large2x, large, medium (default), small, portrait, landscape, tiny",
20
+ type: "string",
21
+ },
22
+ save_to_file: {
23
+ description:
24
+ "File path relative to the project root to save the image to (e.g. 'assets/hero.jpg'). " +
25
+ "Parent directories are created automatically. " +
26
+ "If omitted the image is saved under .tarsk/tmp-images/.",
27
+ type: "string",
28
+ },
29
+ },
30
+ };
31
+
32
+ /** @param {Record<string, unknown>} args @param {import("../../../../src/tools/agent-runtime/types.js").AgentRuntime} context @param {{ signal?: AbortSignal }} [options] */
33
+ export async function execute(args, context, options) {
34
+ const result = await context.images.searchAndSave(args, options);
35
+ if (!result.ok) {
36
+ if (result.reason === "aborted") {
37
+ return { content: [], details: undefined };
38
+ }
39
+ if (result.reason === "search_failed") {
40
+ return {
41
+ content: [{ type: "text", text: `Image search failed: ${result.message}` }],
42
+ details: undefined,
43
+ };
44
+ }
45
+ if (result.reason === "no_cwd") {
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: "Image search succeeded but no project directory is available to save the image.",
51
+ },
52
+ ],
53
+ details: undefined,
54
+ };
55
+ }
56
+ return {
57
+ content: [
58
+ {
59
+ type: "text",
60
+ text: `Image was found but failed to save to "${result.message}"`,
61
+ },
62
+ ],
63
+ details: undefined,
64
+ };
65
+ }
66
+
67
+ const payload = {
68
+ contentType: result.contentType,
69
+ savedPath: result.savedPath,
70
+ sizeInBytes: result.sizeInBytes,
71
+ };
72
+ if (result.imageUrl) payload.imageUrl = result.imageUrl;
73
+
74
+ return {
75
+ content: [{ type: "text", text: JSON.stringify(payload) }],
76
+ details: result.imageUrl ? { imageUrl: result.imageUrl } : undefined,
77
+ };
78
+ }
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: tarsk-generate-image
3
+ description: >-
4
+ Tarsk Tool skill publishing: generate_image.
5
+ version: 2.0.0
6
+ tools:
7
+ - generate_image
8
+ deferred-tools:
9
+ - generate_image
10
+ disable-model-invocation: true
11
+ ---
12
+
13
+ # tarsk-generate-image
14
+
15
+ Publishes: generate_image.
16
+
17
+ Success/error copy in `scripts/generate_image.js`. Host
18
+ `context.images.generate` (API keys + cwd-safe save).
@@ -0,0 +1,55 @@
1
+ /**
2
+ * generate_image — success/error copy in the Skill; host holds credentials + save.
3
+ */
4
+
5
+ export const description =
6
+ "Generate an image from a text prompt. Returns a URL or base64 data for the generated image. Use this when the user asks you to create, draw, design, or generate an image. Use the save_to_file parameter to save the image directly to a file in the project (e.g. 'assets/hero.png').";
7
+
8
+ export const parameters = {
9
+ type: "object",
10
+ required: ["prompt", "save_to_file"],
11
+ properties: {
12
+ prompt: {
13
+ description: "Image description",
14
+ type: "string",
15
+ },
16
+ model: {
17
+ description:
18
+ "Image model name or ID to use (e.g. 'dall-e-3', 'gpt-image-1', 'google/gemini-2.5-flash-image'). If omitted the first enabled image model is used.",
19
+ type: "string",
20
+ },
21
+ save_to_file: {
22
+ description:
23
+ "File path (relative to the project root) to save the generated image to, e.g. 'assets/logo.png' or 'docs/diagram.png'. The file and any parent directories will be created automatically. The image is also returned as data so it can be displayed.",
24
+ type: "string",
25
+ },
26
+ },
27
+ };
28
+
29
+ function stripImageBytes(payload) {
30
+ const next = { ...payload };
31
+ delete next.imageData;
32
+ delete next.image_data;
33
+ if (typeof next.imageUrl === "string" && next.imageUrl.startsWith("data:")) {
34
+ delete next.imageUrl;
35
+ }
36
+ return next;
37
+ }
38
+
39
+ /** @param {Record<string, unknown>} args @param {import("../../../../src/tools/agent-runtime/types.js").AgentRuntime} context @param {{ signal?: AbortSignal }} [options] */
40
+ export async function execute(args, context, options) {
41
+ const result = await context.images.generate(args, options);
42
+ if (!result.ok) {
43
+ if (result.reason === "aborted") {
44
+ return { content: [], details: undefined };
45
+ }
46
+ return {
47
+ content: [{ type: "text", text: result.message }],
48
+ details: result.details,
49
+ };
50
+ }
51
+ return {
52
+ content: [{ type: "text", text: JSON.stringify(stripImageBytes(result.payload)) }],
53
+ details: result.details,
54
+ };
55
+ }
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: tarsk-get-observation
3
+ description: >-
4
+ Tarsk Tool skill publishing: get_observation.
5
+ version: 2.0.2
6
+ tools:
7
+ - get_observation
8
+ disable-model-invocation: true
9
+ ---
10
+
11
+ # tarsk-get-observation
12
+
13
+ Publishes: get_observation.
14
+
15
+ Paging, JSON-path selection, miss/continuation copy, and batching live in
16
+ `scripts/get_observation.js` (edit to tune tokens / turn guidance).
17
+
18
+ Host (`context.observations`): `resolveId`, `fetch`, `recordRetrieved`, `limits`
19
+ — DB and telemetry only.
@@ -0,0 +1,293 @@
1
+ /**
2
+ * get_observation — paging, JSON path, and model copy live here (malleable).
3
+ * Host: context.observations resolveId / fetch / recordRetrieved (DB only).
4
+ */
5
+
6
+ export const description =
7
+ "Page a narrow slice of a stored observation by ID (tool output or over-threshold user message). Never walk the whole body with repeated max pages — prefer path (JSON), a small limit, or re-run the producing tool with a tighter command. Default 40 lines; max 80 lines / 50.0KB per ID. Batch with ids (max 20) — ids wins over a stray id. offset/limit are stored-output line indexes, not source-file or grep line numbers. Do not use for read results — call read on the file. Extra or missing hex in the id is repaired. Thread-scoped.";
8
+
9
+ export const parameters = {
10
+ type: "object",
11
+ properties: {
12
+ id: {
13
+ description:
14
+ "Observation ID from a tool-result or user-message preview (obs_ + 64 hex). Extra or missing hex is repaired.",
15
+ maxLength: 200,
16
+ minLength: 12,
17
+ type: "string",
18
+ },
19
+ ids: {
20
+ minItems: 1,
21
+ maxItems: 20,
22
+ description: "Batch retrieval; prefer this over parallel calls.",
23
+ type: "array",
24
+ items: {
25
+ description:
26
+ "Observation ID from a tool-result or user-message preview (obs_ + 64 hex). Extra or missing hex is repaired.",
27
+ maxLength: 200,
28
+ minLength: 12,
29
+ type: "string",
30
+ },
31
+ },
32
+ offset: { minimum: 1, type: "integer" },
33
+ limit: { maximum: 80, minimum: 1, type: "integer" },
34
+ path: { minLength: 1, maxLength: 500, type: "string" },
35
+ },
36
+ };
37
+
38
+ /** Keep miss guidance byte-stable so prompt-cache prefixes stay warm. */
39
+ const MISS_RETRY =
40
+ "Thread-scoped: the id may be from another thread or expired. Re-run the producing tool or page a recent observation id; do not retry this id verbatim.";
41
+
42
+ function resolveJsonSegment(path, segment, value) {
43
+ if (segment.length === 0) {
44
+ throw new Error(`JSON path "${path}" empty segment.`);
45
+ }
46
+ if (Array.isArray(value)) {
47
+ if (!/^\d+$/.test(segment)) {
48
+ throw new Error(`JSON path "${path}" expected an array index at "${segment}".`);
49
+ }
50
+ const index = Number(segment);
51
+ if (index >= value.length) {
52
+ throw new Error(`JSON path "${path}" array index ${index} is out of bounds.`);
53
+ }
54
+ return value[index];
55
+ }
56
+ if (value && typeof value === "object" && Object.prototype.hasOwnProperty.call(value, segment)) {
57
+ return value[segment];
58
+ }
59
+ throw new Error(`JSON path "${path}" does not contain segment "${segment}".`);
60
+ }
61
+
62
+ function selectJsonPath(content, path) {
63
+ let value;
64
+ try {
65
+ value = JSON.parse(content);
66
+ } catch {
67
+ throw new Error("Observation content is not valid JSON; omit path to retrieve it by lines.");
68
+ }
69
+ for (const segment of path.split(".")) {
70
+ value = resolveJsonSegment(path, segment, value);
71
+ }
72
+ return typeof value === "string" ? value : JSON.stringify(value, null, 2);
73
+ }
74
+
75
+ function resolveIds(args) {
76
+ // `ids` wins over a stray `id`: both keys together is a common habit, and
77
+ // failing the call costs a turn when the batch is already unambiguous.
78
+ if (Array.isArray(args.ids) && args.ids.length > 0) {
79
+ return args.ids.map(String);
80
+ }
81
+ if (typeof args.id === "string" && args.id) return [args.id];
82
+ throw new Error("Provide id or ids.");
83
+ }
84
+
85
+ function assembleBlock(id, lineRange, content, jsonPath, suffix) {
86
+ const parts = [
87
+ `<observation_data id="${id}" lines="${lineRange}">`,
88
+ jsonPath ? `[JSON path: ${jsonPath}]` : undefined,
89
+ content,
90
+ "</observation_data>",
91
+ ];
92
+ if (suffix !== undefined) parts.push(suffix);
93
+ return parts.filter((line) => line !== undefined).join("\n");
94
+ }
95
+
96
+ function lineByteLength(line) {
97
+ return Buffer.byteLength(line, "utf-8");
98
+ }
99
+
100
+ function formatOversizedLine(lineNumber, line, maxBytes, formatSize) {
101
+ return `Line ${lineNumber} is ${formatSize(lineByteLength(line))} and exceeds the ${formatSize(maxBytes)} retrieval limit (elided)`;
102
+ }
103
+
104
+ function nextReadableOffset(lines, fromOneIndexed, maxBytes) {
105
+ const start = Math.max(0, fromOneIndexed - 1);
106
+ for (let i = start; i < lines.length; i++) {
107
+ if (lineByteLength(lines[i] ?? "") <= maxBytes) return i + 1;
108
+ }
109
+ return undefined;
110
+ }
111
+
112
+ function formatContinuation(lines, offset, endLine, maxBytes, formatSize) {
113
+ const total = lines.length;
114
+ if (endLine >= total) {
115
+ return `\n\n[Showing lines ${offset}-${endLine} of ${total}.]`;
116
+ }
117
+ const nextLine = lines[endLine];
118
+ if (nextLine === undefined || lineByteLength(nextLine) <= maxBytes) {
119
+ return `\n\n[Showing lines ${offset}-${endLine} of ${total}. Use offset=${endLine + 1} to continue.]`;
120
+ }
121
+ const skipped = [];
122
+ let index = endLine;
123
+ while (index < lines.length) {
124
+ const line = lines[index];
125
+ if (line === undefined || lineByteLength(line) <= maxBytes) break;
126
+ skipped.push(formatOversizedLine(index + 1, line, maxBytes, formatSize));
127
+ index += 1;
128
+ }
129
+ const skipNote = skipped.join(". ");
130
+ if (index < lines.length) {
131
+ return `\n\n[Showing lines ${offset}-${endLine} of ${total}. ${skipNote}. Use offset=${index + 1} to continue.]`;
132
+ }
133
+ return `\n\n[Showing lines ${offset}-${endLine} of ${total}. ${skipNote}.]`;
134
+ }
135
+
136
+ function pageOversizedStart(id, offset, lines, maxBytes, formatSize) {
137
+ const line = lines[offset - 1] ?? "";
138
+ const note = formatOversizedLine(offset, line, maxBytes, formatSize);
139
+ const nextOffset = nextReadableOffset(lines, offset + 1, maxBytes);
140
+ const continueHint = nextOffset ? ` Use offset=${nextOffset} to continue.` : "";
141
+ const text = [
142
+ `<observation_data id="${id}" lines="${offset}-${offset}">`,
143
+ `[${note}]`,
144
+ "</observation_data>",
145
+ "",
146
+ `[${note}.${continueHint}]`,
147
+ ].join("\n");
148
+ return { text, outputBytes: Buffer.byteLength(text, "utf-8") };
149
+ }
150
+
151
+ function pageObservation(stored, offset, limit, jsonPath, maxBytes, formatSize, truncateHead) {
152
+ if (stored.toolName === "read") {
153
+ const text =
154
+ `This observation came from read. Use the read tool on the original file ` +
155
+ `instead of get_observation (offset=${offset}). Do not page this stored output.`;
156
+ return { id: stored.id, text, outputBytes: Buffer.byteLength(text, "utf-8") };
157
+ }
158
+
159
+ const selected = jsonPath ? selectJsonPath(stored.content, jsonPath) : stored.content;
160
+ const lines = selected.split("\n");
161
+ const lineCount = lines.length;
162
+
163
+ if (lines.length > 0 && offset === lineCount + 1) {
164
+ const lastLine = lines[lineCount - 1] ?? "";
165
+ const text = [
166
+ `Offset ${offset} is one past the end of observation ${stored.id} (${lineCount === 1 ? "1 line" : `${lineCount} lines`} total). Showing the last line. There is no further page.`,
167
+ `<observation_data id="${stored.id}" lines="${lineCount}-${lineCount}">`,
168
+ lastLine,
169
+ "</observation_data>",
170
+ ].join("\n");
171
+ return { id: stored.id, text, outputBytes: Buffer.byteLength(text, "utf-8") };
172
+ }
173
+
174
+ if (offset > lineCount) {
175
+ const parts = [
176
+ `Offset ${offset} is beyond end of observation ${stored.id} (${lineCount === 1 ? "1 line" : `${lineCount} lines`} total).`,
177
+ "Observation offset is 1-indexed within the stored observation, not a source-file line number and not a character offset.",
178
+ ];
179
+ if (lineCount === 1) parts.push("This observation is a single line; there is no further page.");
180
+ else if (lineCount > 0)
181
+ parts.push(`Valid offsets are 1-${lineCount}. Use offset=1 to read from the start.`);
182
+ else parts.push("Observation is empty.");
183
+ if (stored.toolName === "read") {
184
+ parts.push(
185
+ `If you meant a source-file line, call read with that file's path and offset=${offset} instead of paging this observation.`,
186
+ );
187
+ }
188
+ const message = parts.join(" ");
189
+ if (lineCount === 1) {
190
+ const truncation = truncateHead(lines[0] ?? "", { maxBytes, maxLines: 1 });
191
+ const text = [message, assembleBlock(stored.id, "1-1", truncation.content, jsonPath)].join(
192
+ "\n",
193
+ );
194
+ return { id: stored.id, text, outputBytes: Buffer.byteLength(text, "utf-8") };
195
+ }
196
+ if (lineCount === 0) {
197
+ throw new Error(message);
198
+ }
199
+ const tailStart = Math.max(1, lineCount - limit + 1);
200
+ const tail = pageObservation(
201
+ stored,
202
+ tailStart,
203
+ limit,
204
+ jsonPath,
205
+ maxBytes,
206
+ formatSize,
207
+ truncateHead,
208
+ );
209
+ const text =
210
+ `${message}\n` +
211
+ `[Offset ${offset} is past the end; showing the last page (lines ${tailStart}-${lineCount}) instead.]\n\n` +
212
+ tail.text;
213
+ return { id: stored.id, text, outputBytes: Buffer.byteLength(text, "utf-8") };
214
+ }
215
+
216
+ const startIndex = offset - 1;
217
+ const selectedText = lines.slice(startIndex, startIndex + limit).join("\n");
218
+ const truncation = truncateHead(selectedText, { maxBytes, maxLines: limit });
219
+ if (truncation.firstLineExceedsLimit) {
220
+ return pageOversizedStart(stored.id, offset, lines, maxBytes, formatSize);
221
+ }
222
+ const endLine = offset + truncation.outputLines - 1;
223
+ const suffix = formatContinuation(lines, offset, endLine, maxBytes, formatSize);
224
+ const text = assembleBlock(
225
+ stored.id,
226
+ `${offset}-${endLine}`,
227
+ truncation.content,
228
+ jsonPath,
229
+ suffix,
230
+ );
231
+ return { id: stored.id, text, outputBytes: truncation.outputBytes };
232
+ }
233
+
234
+ /** @param {Record<string, unknown>} args @param {import("../../../../src/tools/agent-runtime/types.js").AgentRuntime} context */
235
+ export async function execute(args, context) {
236
+ const { limits } = context.observations;
237
+ const rawIds = resolveIds(args);
238
+ const offset = typeof args.offset === "number" ? args.offset : 1;
239
+ const requestedLimit = typeof args.limit === "number" ? args.limit : limits.defaultLines;
240
+ const limit = Math.min(Math.max(1, requestedLimit), limits.maxLines);
241
+ const jsonPath = typeof args.path === "string" ? args.path : undefined;
242
+
243
+ const pages = [];
244
+ for (const rawId of rawIds) {
245
+ const resolved = await context.observations.resolveId(rawId);
246
+ if (!resolved.ok) {
247
+ if (resolved.reason === "ambiguous") {
248
+ throw new Error(
249
+ `Ambiguous observation ID prefix "${rawId}". Matches: ${(resolved.matches ?? []).join(", ")}. ${MISS_RETRY}`,
250
+ );
251
+ }
252
+ if (resolved.reason === "invalid") {
253
+ throw new Error(`Invalid observation ID. ${MISS_RETRY}`);
254
+ }
255
+ throw new Error(`Observation not found: ${rawId}. ${MISS_RETRY}`);
256
+ }
257
+ const stored = await context.observations.fetch(resolved.id);
258
+ if (!stored) {
259
+ throw new Error(`Observation not found: ${resolved.id}. ${MISS_RETRY}`);
260
+ }
261
+ pages.push(
262
+ pageObservation(
263
+ stored,
264
+ offset,
265
+ limit,
266
+ jsonPath,
267
+ limits.maxBytes,
268
+ context.util.formatSize,
269
+ context.util.truncateHead,
270
+ ),
271
+ );
272
+ }
273
+
274
+ for (const page of pages) {
275
+ await context.observations.recordRetrieved(page.outputBytes);
276
+ }
277
+
278
+ const output = pages.map((page) => page.text).join("\n\n");
279
+ const truncation = context.util.truncateHead(output, {
280
+ maxBytes: limits.maxBytes * Math.max(1, pages.length),
281
+ maxLines: limits.maxLines * Math.max(1, pages.length),
282
+ });
283
+
284
+ const details =
285
+ pages.length === 1
286
+ ? { observationId: pages[0].id, jsonPath, truncation }
287
+ : { observationIds: pages.map((page) => page.id), jsonPath, truncation };
288
+
289
+ return {
290
+ content: [{ type: "text", text: truncation.content }],
291
+ details,
292
+ };
293
+ }
@@ -0,0 +1,16 @@
1
+ ---
2
+ name: tarsk-grep
3
+ description: >-
4
+ Tarsk Tool skill publishing: grep.
5
+ version: 2.0.0
6
+ tools:
7
+ - grep
8
+ disable-model-invocation: true
9
+ ---
10
+
11
+ # tarsk-grep
12
+
13
+ Publishes: grep.
14
+
15
+ Empty/pagination/banner copy in `scripts/grep.js`. Host `context.fs.grep`
16
+ returns structured rows (cwd checks + ripgrep only).