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,248 @@
1
+ /**
2
+ * bash — truncation / background / ignored-flag copy in the Skill.
3
+ * Host: permissions, seatbelt, exec, compress/truncate prepare.
4
+ */
5
+
6
+ export const description =
7
+ "Run shell from the repo root (optional `workdir` relative to root). Non-interactive. Use read/edit/write/find/grep for files — not bash; create/overwrite files with write (not shell heredocs like `cat > file <<EOF`). For builds, package managers, git, docker, and process control. Quote paths: repo-root, app-data, and temp absolute paths can contain spaces. Output: last 1000 lines / 32KB; page truncation with get_observation (tool_search first). select.fields, select.level, and select.range.path need JSON output: use them only when the command prints JSON (for example `cat file.json`, `curl`, `jq`). For text output, window in the command (`sed -n '10,40p'`, `head`, `tail`, `grep`) or use read. If direct bash invocation requires a select field despite plain-text output, call bash through run_js with the command and no select. select.range.path is a dot-path string such as `items[].name`; omit path for a line window. A call returns when its command exits, so a long build or test run in the foreground is waited for; never run `sleep` to wait for a command. For a process that does not exit on its own (dev server, watcher), `run_in_background` returns a job id at once: read it with job_output (it returns at once too — do other work and call it again for what is new, never `sleep` between reads), list with job_list, kill with job_kill. Never use timeout for long-lived servers. Git write actions only when the user asked.";
8
+
9
+ export const parameters = {
10
+ type: "object",
11
+ required: ["command"],
12
+ properties: {
13
+ command: {
14
+ description: "Bash command",
15
+ type: "string",
16
+ },
17
+ workdir: {
18
+ description:
19
+ "Optional directory (relative to the repo root) to run the command in. Must stay within the repo.",
20
+ type: "string",
21
+ },
22
+ timeout: {
23
+ description:
24
+ "Hard timeout in seconds. When reached, the command and its entire process tree are killed. Do not use this to launch a long-running dev server.",
25
+ type: "number",
26
+ },
27
+ run_in_background: {
28
+ description:
29
+ "Start the command as a background job and return immediately with a job id. For long-running processes (dev servers, watchers, test runners) whose output you read later with job_output. A timeout set alongside run_in_background is ignored. Only one background flag per call.",
30
+ type: "boolean",
31
+ },
32
+ },
33
+ };
34
+
35
+ const BACKGROUND_IGNORED_NOTICE =
36
+ "[run_in_background ignored: this command keeps its foreground redirect semantics, so no job was started. Run the command to background on its own.]";
37
+
38
+ function describeStartedBackgroundJob(jobId, resolvedCommand) {
39
+ return [
40
+ `Started background job ${jobId}: ${resolvedCommand}`,
41
+ `Read its output with job_output (jobId: ${jobId}), list jobs with job_list, and stop it with job_kill.`,
42
+ ].join("\n");
43
+ }
44
+
45
+ function buildTruncationNotice(truncation, tempFilePath, contentHash, formatSize, maxBytes) {
46
+ const suffix = `(sha:${contentHash}). Full output: ${tempFilePath}. Use read on the path or get_observation on this result to page output; do not re-run the command.`;
47
+ if (!truncation || !truncation.truncated) return "";
48
+ if (truncation.observationFromHead) {
49
+ return `\n\n[Showing first ${formatSize(truncation.outputBytes)} of ${formatSize(truncation.totalBytes)} ${suffix}]`;
50
+ }
51
+ const startLine = truncation.totalLines - truncation.outputLines + 1;
52
+ const endLine = truncation.totalLines;
53
+ if (truncation.lastLinePartial) {
54
+ return `\n\n[Showing last ${formatSize(truncation.outputBytes)} of line ${endLine} ${suffix}]`;
55
+ }
56
+ if (truncation.truncatedBy === "lines") {
57
+ return `\n\n[Showing lines ${startLine}-${endLine} of ${truncation.totalLines} ${suffix}]`;
58
+ }
59
+ return `\n\n[Showing lines ${startLine}-${endLine} (${formatSize(maxBytes)} limit) ${suffix}]`;
60
+ }
61
+
62
+ function formatPrepared(prepared, context) {
63
+ if (prepared.suppressSelectionCompaction) {
64
+ return {
65
+ outputText: prepared.fullOutput,
66
+ details: prepared.tempFilePath ? { fullOutputPath: prepared.tempFilePath } : undefined,
67
+ };
68
+ }
69
+ let outputText = prepared.body;
70
+ let details;
71
+ if (prepared.truncated && prepared.truncation) {
72
+ details = { truncation: prepared.truncation, fullOutputPath: prepared.tempFilePath };
73
+ outputText += buildTruncationNotice(
74
+ prepared.truncation,
75
+ prepared.tempFilePath,
76
+ prepared.contentHash ?? "",
77
+ context.util.formatSize,
78
+ context.util.maxBytes,
79
+ );
80
+ } else if (prepared.jsonDigestApplied && prepared.tempFilePath) {
81
+ details = { fullOutputPath: prepared.tempFilePath };
82
+ outputText += `\n\n[Full raw output (sha:${prepared.contentHash}): ${prepared.tempFilePath}. Use read on the path or get_observation on this result to page output; do not re-run the command.]`;
83
+ }
84
+ if (prepared.partialBlockedNotice) {
85
+ outputText += `\n\n${prepared.partialBlockedNotice}`;
86
+ }
87
+ return { outputText, details };
88
+ }
89
+
90
+ const SELECT_PATH_SEGMENT = /^[A-Za-z0-9_$-]+$/;
91
+
92
+ /** Mirrors the host dot-path grammar: `.`-separated segments, `*` and `[]` wildcards. */
93
+ function isValidSelectPath(path) {
94
+ for (const segment of path.split(".")) {
95
+ if (segment === "*" || segment === "[]") continue;
96
+ if (segment.length === 0) return false;
97
+ if (segment.endsWith("[]")) {
98
+ const key = segment.slice(0, -2);
99
+ if (key.length === 0 || !SELECT_PATH_SEGMENT.test(key)) return false;
100
+ continue;
101
+ }
102
+ if (!SELECT_PATH_SEGMENT.test(segment)) return false;
103
+ }
104
+ return true;
105
+ }
106
+
107
+ function sanitizeSelectRange(value, dropped) {
108
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
109
+ dropped.push("select.range");
110
+ return undefined;
111
+ }
112
+ const range = {};
113
+ for (const [key, raw] of Object.entries(value)) {
114
+ if (key === "path") {
115
+ if (typeof raw === "string" && raw.trim() !== "" && isValidSelectPath(raw)) range.path = raw;
116
+ else dropped.push("select.range.path");
117
+ } else if (key === "offset" || key === "limit") {
118
+ if (typeof raw === "number" && Number.isInteger(raw) && raw >= 1) range[key] = raw;
119
+ else dropped.push(`select.range.${key}`);
120
+ } else {
121
+ dropped.push(`select.range.${key}`);
122
+ }
123
+ }
124
+ if (range.offset === undefined && range.limit === undefined) {
125
+ dropped.push("select.range");
126
+ return undefined;
127
+ }
128
+ return range;
129
+ }
130
+
131
+ /**
132
+ * The host rejects a malformed `select` before the command runs, which loses the
133
+ * whole result over a stray argument (most often a non-string `range.path`).
134
+ * Drop the offending axis, keep the call, and say what was dropped.
135
+ */
136
+ function withSanitizedSelect(args) {
137
+ const select = args.select;
138
+ if (select === undefined) return { args, note: undefined };
139
+ const dropped = [];
140
+ let next;
141
+ if (select === null || typeof select !== "object" || Array.isArray(select)) {
142
+ dropped.push("select");
143
+ } else {
144
+ next = {};
145
+ for (const [key, value] of Object.entries(select)) {
146
+ if (key === "range") {
147
+ const range = sanitizeSelectRange(value, dropped);
148
+ if (range) next.range = range;
149
+ } else {
150
+ dropped.push(`select.${key}`);
151
+ }
152
+ }
153
+ }
154
+ if (dropped.length === 0) return { args, note: undefined };
155
+ const rest = Object.fromEntries(Object.entries(args).filter(([key]) => key !== "select"));
156
+ const kept = next && Object.keys(next).length > 0 ? next : undefined;
157
+ return {
158
+ args: kept ? { ...rest, select: kept } : rest,
159
+ note: `[select adjusted: dropped invalid ${dropped.join(", ")} — the host rejects the whole call, so that axis was ignored. Window text in the command (sed -n/head/tail) or read the stored output.]`,
160
+ };
161
+ }
162
+
163
+ /** Prepend a notice to the first text content item. */
164
+ function withNote(result, note) {
165
+ if (!note || !Array.isArray(result.content)) return result;
166
+ const first = result.content[0];
167
+ if (first?.type !== "text") {
168
+ return { ...result, content: [{ type: "text", text: note }, ...result.content] };
169
+ }
170
+ return {
171
+ ...result,
172
+ content: [{ ...first, text: `${note}\n\n${first.text}` }, ...result.content.slice(1)],
173
+ };
174
+ }
175
+
176
+ /** @param {Record<string, unknown>} args @param {import("../../../../src/tools/agent-runtime/types.js").AgentRuntime} context @param {{ signal?: AbortSignal, onUpdate?: Function, toolCallId?: string }} [options] */
177
+ export async function execute(args, context, options) {
178
+ const sanitized = withSanitizedSelect(args);
179
+ const result = await runBash(sanitized.args, context, options);
180
+ return withNote(result, sanitized.note);
181
+ }
182
+
183
+ async function runBash(args, context, options) {
184
+ if (args.run_in_background && args.timeout !== undefined) {
185
+ // A background job returns immediately, so a timeout would have nothing to
186
+ // bound. Drop it instead of failing the call; the host still validates this
187
+ // for direct context.shell.run use.
188
+ args = { ...args, timeout: undefined };
189
+ }
190
+ const structured = await context.shell.run(args, options);
191
+
192
+ if (structured.status === "background") {
193
+ return {
194
+ content: [
195
+ {
196
+ type: "text",
197
+ text: describeStartedBackgroundJob(structured.jobId, structured.command),
198
+ },
199
+ ],
200
+ details: { backgroundJobId: structured.jobId },
201
+ };
202
+ }
203
+
204
+ if (structured.status === "preformatted") {
205
+ const text = structured.backgroundIgnored
206
+ ? [structured.text, BACKGROUND_IGNORED_NOTICE].filter(Boolean).join("\n\n")
207
+ : structured.text;
208
+ return {
209
+ content: [{ type: "text", text }],
210
+ details: structured.commandFailed
211
+ ? { ...structured.details, commandFailed: true, exitCode: structured.exitCode }
212
+ : structured.details,
213
+ };
214
+ }
215
+
216
+ let { outputText, details } = formatPrepared(structured.prepared, context);
217
+ if (structured.dedicatedAppend) {
218
+ outputText = outputText
219
+ ? `${outputText}\n\n${structured.dedicatedAppend}`
220
+ : structured.dedicatedAppend;
221
+ }
222
+ if (structured.authHint) {
223
+ outputText = `${outputText}\n\n${structured.authHint}`;
224
+ }
225
+ if (structured.supersession) {
226
+ details = { ...details, supersession: structured.supersession };
227
+ }
228
+
229
+ const exitCode = structured.exitCode;
230
+ if (exitCode === 0 || exitCode === null) {
231
+ return { content: [{ type: "text", text: outputText }], details };
232
+ }
233
+
234
+ const outcome = context.shell.resolveExit({
235
+ exitCode,
236
+ executionCommand: structured.executionCommand,
237
+ outputText,
238
+ fullOutput: structured.prepared.fullOutput,
239
+ threadId: structured.threadId,
240
+ });
241
+ if (outcome.kind === "reject") {
242
+ throw new Error(outcome.outputText);
243
+ }
244
+ return {
245
+ content: [{ type: "text", text: outcome.outputText }],
246
+ details: outcome.commandFailed ? { ...details, commandFailed: true, exitCode } : details,
247
+ };
248
+ }
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: tarsk-browser
3
+ description: >-
4
+ Tarsk Tool skill publishing: browser.
5
+ version: 3.0.0
6
+ tools:
7
+ - browser
8
+ disable-model-invocation: true
9
+ ---
10
+
11
+ # tarsk-browser
12
+
13
+ Publishes: browser.
14
+
15
+ Model JSON / screenshot strip copy in `scripts/browser.js`. Host
16
+ `context.browser.run` returns structured payload (Electrobun + RPC circuit +
17
+ webview actions). Operational error throws stay in the host.
@@ -0,0 +1,252 @@
1
+ /** Auto-generated Tool skill script for browser */
2
+
3
+ export const description =
4
+ "In-app Browser: screenshot the page to a PNG/JPEG file (capture what the dev server renders; returns savedPath + imageUrl). " +
5
+ "Read: open_url→snapshot for @eN refs, get_state, inspect_element (one element), find_in_page, evaluate_javascript, get_console_logs. " +
6
+ "Act: click, fill, press, hover, wait_for. Prefer webmcp_call when snapshot lists webmcp_tools. " +
7
+ "Call directly — never via run_js: the tab only opens for the conversation's own browser calls. " +
8
+ "Start the dev server first with bash run_in_background (servers ignore the bash timeout), then open_url its printed localhost URL.";
9
+
10
+ export const parameters = {
11
+ type: "object",
12
+ required: ["action"],
13
+ properties: {
14
+ action: {
15
+ description:
16
+ "Browser action. Navigation: open_url, reload, go_back, go_forward, get_state. Inspection: inspect_element, snapshot, screenshot, get_console_logs, find_in_page, stop_find_in_page. Interaction: click, fill, press, hover, wait_for, evaluate_javascript. WebMCP (pages that register document.modelContext tools): webmcp_list_tools, webmcp_call. Layout: set_viewport.",
17
+ anyOf: [
18
+ {
19
+ const: "open_url",
20
+ type: "string",
21
+ },
22
+ {
23
+ const: "evaluate_javascript",
24
+ type: "string",
25
+ },
26
+ {
27
+ const: "find_in_page",
28
+ type: "string",
29
+ },
30
+ {
31
+ const: "stop_find_in_page",
32
+ type: "string",
33
+ },
34
+ {
35
+ const: "reload",
36
+ type: "string",
37
+ },
38
+ {
39
+ const: "go_back",
40
+ type: "string",
41
+ },
42
+ {
43
+ const: "go_forward",
44
+ type: "string",
45
+ },
46
+ {
47
+ const: "get_state",
48
+ type: "string",
49
+ },
50
+ {
51
+ const: "screenshot",
52
+ type: "string",
53
+ },
54
+ {
55
+ const: "set_viewport",
56
+ type: "string",
57
+ },
58
+ {
59
+ const: "snapshot",
60
+ type: "string",
61
+ },
62
+ {
63
+ const: "inspect_element",
64
+ type: "string",
65
+ },
66
+ {
67
+ const: "click",
68
+ type: "string",
69
+ },
70
+ {
71
+ const: "fill",
72
+ type: "string",
73
+ },
74
+ {
75
+ const: "press",
76
+ type: "string",
77
+ },
78
+ {
79
+ const: "hover",
80
+ type: "string",
81
+ },
82
+ {
83
+ const: "wait_for",
84
+ type: "string",
85
+ },
86
+ {
87
+ const: "get_console_logs",
88
+ type: "string",
89
+ },
90
+ {
91
+ const: "webmcp_list_tools",
92
+ type: "string",
93
+ },
94
+ {
95
+ const: "webmcp_call",
96
+ type: "string",
97
+ },
98
+ ],
99
+ },
100
+ url: {
101
+ description: "URL to open; required for `open_url`.",
102
+ type: "string",
103
+ },
104
+ script: {
105
+ description:
106
+ "JavaScript to execute in the preview page context (required for evaluate_javascript).",
107
+ type: "string",
108
+ },
109
+ text: {
110
+ description: "Text to find; required for `find_in_page`.",
111
+ type: "string",
112
+ },
113
+ forward: {
114
+ description: "Search direction for `find_in_page`; defaults to forward.",
115
+ type: "boolean",
116
+ },
117
+ match_case: {
118
+ description: "Case-sensitive search; defaults to false.",
119
+ type: "boolean",
120
+ },
121
+ wait_for_load_ms: {
122
+ description:
123
+ "Milliseconds to wait for the dom-ready event after navigation (default 5000, max 30000).",
124
+ type: "number",
125
+ },
126
+ preset: {
127
+ description: "Viewport preset for `set_viewport`.",
128
+ anyOf: [
129
+ {
130
+ const: "desktop",
131
+ type: "string",
132
+ },
133
+ {
134
+ const: "tablet",
135
+ type: "string",
136
+ },
137
+ {
138
+ const: "mobile",
139
+ type: "string",
140
+ },
141
+ ],
142
+ },
143
+ format: {
144
+ description: "Screenshot format; defaults to png.",
145
+ anyOf: [
146
+ {
147
+ const: "png",
148
+ type: "string",
149
+ },
150
+ {
151
+ const: "jpeg",
152
+ type: "string",
153
+ },
154
+ ],
155
+ },
156
+ ref: {
157
+ description: "Snapshot element ref for click, fill, hover, or inspect_element, e.g. `@e1`.",
158
+ type: "string",
159
+ },
160
+ value: {
161
+ description: "Value to type with `fill`.",
162
+ type: "string",
163
+ },
164
+ key: {
165
+ description: "Key to press, e.g. `Enter`, `Tab`, or `Escape`.",
166
+ type: "string",
167
+ },
168
+ selector: {
169
+ description: "CSS selector for `wait_for` and `inspect_element`.",
170
+ type: "string",
171
+ },
172
+ timeout_ms: {
173
+ description: "`wait_for` timeout in milliseconds; default 10000, max 60000.",
174
+ type: "number",
175
+ },
176
+ interactive_only: {
177
+ description: "Include only interactive snapshot elements; defaults to false.",
178
+ type: "boolean",
179
+ },
180
+ max_depth: {
181
+ description: "Maximum snapshot DOM depth; default 15.",
182
+ type: "number",
183
+ },
184
+ since_ms: {
185
+ description: "Return console logs from the last N milliseconds.",
186
+ type: "number",
187
+ },
188
+ levels: {
189
+ description: 'Console levels to include for get_console_logs (e.g. ["error", "warn"]).',
190
+ type: "array",
191
+ items: {
192
+ type: "string",
193
+ },
194
+ },
195
+ clear: {
196
+ description:
197
+ "Clear buffered console logs after reading for get_console_logs (default false).",
198
+ type: "boolean",
199
+ },
200
+ tool: {
201
+ description:
202
+ "WebMCP tool name from snapshot `webmcp_tools` or `webmcp_list_tools`; required for `webmcp_call`.",
203
+ type: "string",
204
+ },
205
+ input: {
206
+ description: "Object matching the WebMCP tool's inputSchema (optional for `webmcp_call`).",
207
+ type: "object",
208
+ patternProperties: {
209
+ "^(.*)$": {},
210
+ },
211
+ },
212
+ origin: {
213
+ description:
214
+ "Page origin that registered the WebMCP tool. Pass when `webmcp_list_tools` shows the same name on more than one origin.",
215
+ type: "string",
216
+ },
217
+ },
218
+ };
219
+
220
+ function stripScreenshotPayload(payload) {
221
+ const display = {};
222
+ for (const [key, value] of Object.entries(payload)) {
223
+ if (key === "image_data") continue;
224
+ if (typeof value === "string" || typeof value === "number") {
225
+ display[key] = value;
226
+ }
227
+ }
228
+ if (typeof display.imageUrl === "string" && display.imageUrl.startsWith("data:")) {
229
+ delete display.imageUrl;
230
+ }
231
+ return display;
232
+ }
233
+
234
+ function formatBrowserText(payload) {
235
+ if (payload.action === "screenshot") {
236
+ return JSON.stringify(stripScreenshotPayload(payload));
237
+ }
238
+ return JSON.stringify(payload);
239
+ }
240
+
241
+ /** @param {Record<string, unknown>} args @param {import("../../../../src/tools/agent-runtime/types.js").AgentRuntime} context @param {{ signal?: AbortSignal, toolCallId?: string }} [options] */
242
+ export async function execute(args, context, options) {
243
+ const structured = await context.browser.run(args, options);
244
+ const details =
245
+ typeof structured.details.imageUrl === "string"
246
+ ? { imageUrl: structured.details.imageUrl }
247
+ : structured.details;
248
+ return {
249
+ content: [{ type: "text", text: formatBrowserText(structured.payload) }],
250
+ details,
251
+ };
252
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: tarsk-chat-title
3
+ description: >-
4
+ Renames the chat label in the Chats list. Publishes the chat_title Tool.
5
+ version: 3.0.0
6
+ tools:
7
+ - chat_title
8
+ disable-model-invocation: true
9
+ ---
10
+
11
+ # Chat title
12
+
13
+ Publishes `chat_title`. Implementation: `scripts/chat_title.js`. Runtime:
14
+ `context.chat` (see `tarsk-agent`).
@@ -0,0 +1,37 @@
1
+ /**
2
+ * chat_title Tool — logic in the Skill; normalize via context.chat (host).
3
+ */
4
+
5
+ export const description = `Rename the chat — the label above the chat and in the Chats list — when asked to title, name, rename, or label it, including a literal \`/chat-title\` in the prompt, which stays as typed.
6
+
7
+ Title the work, not the sentence: 100 characters or fewer, plain sentence case, no surrounding quotes, no trailing punctuation, no emoji. Call once per request with the final title, then carry on with any other work the prompt asked for; don't announce the title in your reply.
8
+
9
+ - Good: "Fix flaky auth test"
10
+ - Bad: "Please set the chat title"`;
11
+
12
+ export const parameters = {
13
+ type: "object",
14
+ properties: {
15
+ title: {
16
+ type: "string",
17
+ description: 'Short chat title, for example "Fix flaky auth test"',
18
+ },
19
+ },
20
+ required: ["title"],
21
+ };
22
+
23
+ function textResult(text) {
24
+ return {
25
+ content: [{ type: "text", text }],
26
+ details: undefined,
27
+ };
28
+ }
29
+
30
+ /** @param {{ title?: string }} args @param {{ chat: { normalizeTitle(title: string): string } }} context */
31
+ export async function execute(args, context) {
32
+ const title = context.chat.normalizeTitle(String(args.title ?? ""));
33
+ if (!title) {
34
+ return textResult("Error: title is required");
35
+ }
36
+ return textResult(`Chat title set to "${title}".`);
37
+ }
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: tarsk-connect-mcp
3
+ description: >-
4
+ Connect a remote MCP server from chat. Ask for its name, URL, transport, and
5
+ whether it needs OAuth; save it to this project and discover its tools. Use
6
+ when the user asks to connect or configure a Model Context Protocol server.
7
+ version: 1.0.0
8
+ tools:
9
+ - connect_mcp
10
+ deferred-tools:
11
+ - connect_mcp
12
+ ---
13
+
14
+ # Connect an MCP server
15
+
16
+ Use connect_mcp to ask the user for the remote MCP server details and connect
17
+ it to the current project. The tool saves the server configuration, optionally
18
+ runs browser-based OAuth, and discovers the server's tools. The current run's
19
+ tool set is fixed. The discovered tools become available on the next message in
20
+ the same conversation. Then search for the server name and call the selected tool.
21
+
22
+ Do not ask the user to paste a bearer token or put credentials in the URL.
23
+ Use OAuth or configure credentials through Settings.
@@ -0,0 +1,68 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { description, execute, parameters } from "../connect_mcp.js";
4
+
5
+ test("publishes a searchable no-argument MCP setup tool", () => {
6
+ assert.match(description, /connect a remote MCP server/i);
7
+ assert.deepEqual(parameters, { type: "object", properties: {} });
8
+ });
9
+
10
+ function runtime(answers, connectRemoteServer) {
11
+ return {
12
+ ask: {
13
+ wait: async function wait(questions, options) {
14
+ assert.equal(questions.length, 4);
15
+ assert.equal(options.toolCallId, "call-1");
16
+ return answers;
17
+ },
18
+ },
19
+ mcp: { connectRemoteServer },
20
+ };
21
+ }
22
+
23
+ test("asks for server settings, connects, and reports tools for the next message", async () => {
24
+ let connectArgs;
25
+ const result = await execute(
26
+ {},
27
+ runtime(
28
+ ["OWF", "https://mcp.example.com/mcp", "Streamable HTTP (Recommended)", "No OAuth"],
29
+ async function connect(input) {
30
+ connectArgs = input;
31
+ return {
32
+ serverName: "OWF",
33
+ state: "ok",
34
+ tools: ["search", "fetch"],
35
+ authenticated: false,
36
+ };
37
+ },
38
+ ),
39
+ { toolCallId: "call-1" },
40
+ );
41
+
42
+ assert.deepEqual(connectArgs, {
43
+ serverName: "OWF",
44
+ url: "https://mcp.example.com/mcp",
45
+ transport: "streamableHttp",
46
+ useOAuth: false,
47
+ });
48
+ assert.match(result.content[0].text, /search, fetch/);
49
+ assert.match(result.content[0].text, /next message in this conversation/);
50
+ });
51
+
52
+ test("does not save configuration when the user omits a required answer", async () => {
53
+ let connectCalled = false;
54
+ const result = await execute(
55
+ {},
56
+ runtime(
57
+ ["", "https://mcp.example.com/mcp", "Streamable HTTP", "No OAuth"],
58
+ async function connect() {
59
+ connectCalled = true;
60
+ return { serverName: "", state: "ok", tools: [], authenticated: false };
61
+ },
62
+ ),
63
+ { toolCallId: "call-1" },
64
+ );
65
+
66
+ assert.equal(connectCalled, false);
67
+ assert.match(result.content[0].text, /no configuration was saved/);
68
+ });