@edspencer/paddock 0.0.1 → 0.57.0

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 (296) hide show
  1. package/README.md +69 -0
  2. package/install-notice.mjs +29 -0
  3. package/package.json +58 -5
  4. package/packages/server/dist/adoptable.d.ts +127 -0
  5. package/packages/server/dist/adoptable.js +315 -0
  6. package/packages/server/dist/app.d.ts +67 -0
  7. package/packages/server/dist/app.js +325 -0
  8. package/packages/server/dist/archive.d.ts +42 -0
  9. package/packages/server/dist/archive.js +125 -0
  10. package/packages/server/dist/attachments-config.d.ts +114 -0
  11. package/packages/server/dist/attachments-config.js +165 -0
  12. package/packages/server/dist/attachments-hint.d.ts +53 -0
  13. package/packages/server/dist/attachments-hint.js +140 -0
  14. package/packages/server/dist/attachments.d.ts +33 -0
  15. package/packages/server/dist/attachments.js +117 -0
  16. package/packages/server/dist/auth.d.ts +84 -0
  17. package/packages/server/dist/auth.js +247 -0
  18. package/packages/server/dist/background.d.ts +36 -0
  19. package/packages/server/dist/background.js +137 -0
  20. package/packages/server/dist/bind-safety.d.ts +56 -0
  21. package/packages/server/dist/bind-safety.js +51 -0
  22. package/packages/server/dist/brand.d.ts +44 -0
  23. package/packages/server/dist/brand.js +88 -0
  24. package/packages/server/dist/chat-dto.d.ts +210 -0
  25. package/packages/server/dist/chat-dto.js +308 -0
  26. package/packages/server/dist/cli/import-chats.d.ts +21 -0
  27. package/packages/server/dist/cli/import-chats.js +197 -0
  28. package/packages/server/dist/cli/paddock.d.ts +2 -0
  29. package/packages/server/dist/cli/paddock.js +247 -0
  30. package/packages/server/dist/concurrency.d.ts +57 -0
  31. package/packages/server/dist/concurrency.js +71 -0
  32. package/packages/server/dist/config.d.ts +538 -0
  33. package/packages/server/dist/config.js +625 -0
  34. package/packages/server/dist/curation-config.d.ts +55 -0
  35. package/packages/server/dist/curation-config.js +64 -0
  36. package/packages/server/dist/environment-prompt.d.ts +52 -0
  37. package/packages/server/dist/environment-prompt.js +61 -0
  38. package/packages/server/dist/event-bus.d.ts +87 -0
  39. package/packages/server/dist/event-bus.js +48 -0
  40. package/packages/server/dist/git.d.ts +128 -0
  41. package/packages/server/dist/git.js +446 -0
  42. package/packages/server/dist/github-auth.d.ts +44 -0
  43. package/packages/server/dist/github-auth.js +169 -0
  44. package/packages/server/dist/herdctl-agent-config.d.ts +98 -0
  45. package/packages/server/dist/herdctl-agent-config.js +331 -0
  46. package/packages/server/dist/herdctl-agent-names.d.ts +172 -0
  47. package/packages/server/dist/herdctl-agent-names.js +228 -0
  48. package/packages/server/dist/herdctl-jobs-index.d.ts +65 -0
  49. package/packages/server/dist/herdctl-jobs-index.js +225 -0
  50. package/packages/server/dist/herdctl-jobs.d.ts +98 -0
  51. package/packages/server/dist/herdctl-jobs.js +225 -0
  52. package/packages/server/dist/herdctl.d.ts +623 -0
  53. package/packages/server/dist/herdctl.js +1279 -0
  54. package/packages/server/dist/hook-config.d.ts +217 -0
  55. package/packages/server/dist/hook-config.js +224 -0
  56. package/packages/server/dist/http-bytes.d.ts +24 -0
  57. package/packages/server/dist/http-bytes.js +52 -0
  58. package/packages/server/dist/index.d.ts +1 -0
  59. package/packages/server/dist/index.js +14 -0
  60. package/packages/server/dist/instance-config.d.ts +143 -0
  61. package/packages/server/dist/instance-config.js +385 -0
  62. package/packages/server/dist/localcommand.d.ts +23 -0
  63. package/packages/server/dist/localcommand.js +140 -0
  64. package/packages/server/dist/management-auth.d.ts +99 -0
  65. package/packages/server/dist/management-auth.js +165 -0
  66. package/packages/server/dist/management-config.d.ts +164 -0
  67. package/packages/server/dist/management-config.js +286 -0
  68. package/packages/server/dist/management-mcp-server.d.ts +20 -0
  69. package/packages/server/dist/management-mcp-server.js +95 -0
  70. package/packages/server/dist/management-metadata.d.ts +67 -0
  71. package/packages/server/dist/management-metadata.js +56 -0
  72. package/packages/server/dist/management-ops.d.ts +110 -0
  73. package/packages/server/dist/management-ops.js +449 -0
  74. package/packages/server/dist/management-policy.d.ts +172 -0
  75. package/packages/server/dist/management-policy.js +259 -0
  76. package/packages/server/dist/message-provenance.d.ts +112 -0
  77. package/packages/server/dist/message-provenance.js +260 -0
  78. package/packages/server/dist/models.d.ts +164 -0
  79. package/packages/server/dist/models.js +208 -0
  80. package/packages/server/dist/openapi.d.ts +66 -0
  81. package/packages/server/dist/openapi.js +183 -0
  82. package/packages/server/dist/parent-detach.d.ts +30 -0
  83. package/packages/server/dist/parent-detach.js +109 -0
  84. package/packages/server/dist/preload.d.ts +43 -0
  85. package/packages/server/dist/preload.js +55 -0
  86. package/packages/server/dist/project-files.d.ts +76 -0
  87. package/packages/server/dist/project-files.js +191 -0
  88. package/packages/server/dist/project-mime.d.ts +35 -0
  89. package/packages/server/dist/project-mime.js +55 -0
  90. package/packages/server/dist/project-paths.d.ts +88 -0
  91. package/packages/server/dist/project-paths.js +126 -0
  92. package/packages/server/dist/project-types.d.ts +316 -0
  93. package/packages/server/dist/project-types.js +48 -0
  94. package/packages/server/dist/projects.d.ts +202 -0
  95. package/packages/server/dist/projects.js +894 -0
  96. package/packages/server/dist/queued-message.d.ts +35 -0
  97. package/packages/server/dist/queued-message.js +116 -0
  98. package/packages/server/dist/read-state.d.ts +46 -0
  99. package/packages/server/dist/read-state.js +139 -0
  100. package/packages/server/dist/recovery-config.d.ts +111 -0
  101. package/packages/server/dist/recovery-config.js +105 -0
  102. package/packages/server/dist/recovery.d.ts +262 -0
  103. package/packages/server/dist/recovery.js +490 -0
  104. package/packages/server/dist/resume-drain.d.ts +122 -0
  105. package/packages/server/dist/resume-drain.js +158 -0
  106. package/packages/server/dist/route-context.d.ts +168 -0
  107. package/packages/server/dist/route-context.js +39 -0
  108. package/packages/server/dist/route-errors.d.ts +8 -0
  109. package/packages/server/dist/route-errors.js +13 -0
  110. package/packages/server/dist/routes/chats.d.ts +12 -0
  111. package/packages/server/dist/routes/chats.js +1406 -0
  112. package/packages/server/dist/routes/git.d.ts +13 -0
  113. package/packages/server/dist/routes/git.js +236 -0
  114. package/packages/server/dist/routes/mcp.d.ts +83 -0
  115. package/packages/server/dist/routes/mcp.js +250 -0
  116. package/packages/server/dist/routes/meta.d.ts +15 -0
  117. package/packages/server/dist/routes/meta.js +447 -0
  118. package/packages/server/dist/routes/projects.d.ts +25 -0
  119. package/packages/server/dist/routes/projects.js +736 -0
  120. package/packages/server/dist/routes/triggers.d.ts +21 -0
  121. package/packages/server/dist/routes/triggers.js +324 -0
  122. package/packages/server/dist/routes/workspace-mount.d.ts +48 -0
  123. package/packages/server/dist/routes/workspace-mount.js +32 -0
  124. package/packages/server/dist/routes.d.ts +26 -0
  125. package/packages/server/dist/routes.js +29 -0
  126. package/packages/server/dist/run-provenance.d.ts +109 -0
  127. package/packages/server/dist/run-provenance.js +206 -0
  128. package/packages/server/dist/runs.d.ts +92 -0
  129. package/packages/server/dist/runs.js +72 -0
  130. package/packages/server/dist/schedule-config.d.ts +68 -0
  131. package/packages/server/dist/schedule-config.js +75 -0
  132. package/packages/server/dist/schedule-session.d.ts +34 -0
  133. package/packages/server/dist/schedule-session.js +120 -0
  134. package/packages/server/dist/self-mcp-descriptions.d.ts +20 -0
  135. package/packages/server/dist/self-mcp-descriptions.js +145 -0
  136. package/packages/server/dist/self-mcp-read.d.ts +15 -0
  137. package/packages/server/dist/self-mcp-read.js +97 -0
  138. package/packages/server/dist/self-mcp-triggers.d.ts +30 -0
  139. package/packages/server/dist/self-mcp-triggers.js +144 -0
  140. package/packages/server/dist/self-mcp-types.d.ts +248 -0
  141. package/packages/server/dist/self-mcp-types.js +10 -0
  142. package/packages/server/dist/self-mcp-util.d.ts +73 -0
  143. package/packages/server/dist/self-mcp-util.js +157 -0
  144. package/packages/server/dist/self-mcp-write.d.ts +35 -0
  145. package/packages/server/dist/self-mcp-write.js +215 -0
  146. package/packages/server/dist/self-mcp.d.ts +95 -0
  147. package/packages/server/dist/self-mcp.js +448 -0
  148. package/packages/server/dist/send-file-mcp.d.ts +46 -0
  149. package/packages/server/dist/send-file-mcp.js +281 -0
  150. package/packages/server/dist/session-hub.d.ts +186 -0
  151. package/packages/server/dist/session-hub.js +291 -0
  152. package/packages/server/dist/spawn-capability.d.ts +99 -0
  153. package/packages/server/dist/spawn-capability.js +106 -0
  154. package/packages/server/dist/star.d.ts +26 -0
  155. package/packages/server/dist/star.js +94 -0
  156. package/packages/server/dist/start.d.ts +1 -0
  157. package/packages/server/dist/start.js +21 -0
  158. package/packages/server/dist/subagents.d.ts +337 -0
  159. package/packages/server/dist/subagents.js +626 -0
  160. package/packages/server/dist/sweep.d.ts +122 -0
  161. package/packages/server/dist/sweep.js +696 -0
  162. package/packages/server/dist/tooldetails.d.ts +33 -0
  163. package/packages/server/dist/tooldetails.js +466 -0
  164. package/packages/server/dist/transcribe.d.ts +69 -0
  165. package/packages/server/dist/transcribe.js +119 -0
  166. package/packages/server/dist/transcripts.d.ts +42 -0
  167. package/packages/server/dist/transcripts.js +164 -0
  168. package/packages/server/dist/trigger-config.d.ts +278 -0
  169. package/packages/server/dist/trigger-config.js +417 -0
  170. package/packages/server/dist/trigger-runtime.d.ts +94 -0
  171. package/packages/server/dist/trigger-runtime.js +82 -0
  172. package/packages/server/dist/trigger-session.d.ts +34 -0
  173. package/packages/server/dist/trigger-session.js +122 -0
  174. package/packages/server/dist/triggers.d.ts +83 -0
  175. package/packages/server/dist/triggers.js +124 -0
  176. package/packages/server/dist/trusted-proxy.d.ts +57 -0
  177. package/packages/server/dist/trusted-proxy.js +157 -0
  178. package/packages/server/dist/turn-notice.d.ts +154 -0
  179. package/packages/server/dist/turn-notice.js +271 -0
  180. package/packages/server/dist/unread.d.ts +36 -0
  181. package/packages/server/dist/unread.js +123 -0
  182. package/packages/server/dist/usage.d.ts +66 -0
  183. package/packages/server/dist/usage.js +243 -0
  184. package/packages/server/dist/wake-injection.d.ts +156 -0
  185. package/packages/server/dist/wake-injection.js +136 -0
  186. package/packages/server/dist/whisper-local.d.ts +9 -0
  187. package/packages/server/dist/whisper-local.js +122 -0
  188. package/packages/server/dist/ws-context.d.ts +158 -0
  189. package/packages/server/dist/ws-context.js +1 -0
  190. package/packages/server/dist/ws-protocol.d.ts +423 -0
  191. package/packages/server/dist/ws-protocol.js +251 -0
  192. package/packages/server/dist/ws-self-mcp.d.ts +52 -0
  193. package/packages/server/dist/ws-self-mcp.js +28 -0
  194. package/packages/server/dist/ws-triggers.d.ts +29 -0
  195. package/packages/server/dist/ws-triggers.js +261 -0
  196. package/packages/server/dist/ws-turn.d.ts +86 -0
  197. package/packages/server/dist/ws-turn.js +751 -0
  198. package/packages/server/dist/ws.d.ts +62 -0
  199. package/packages/server/dist/ws.js +1024 -0
  200. package/packages/server/package.json +6 -0
  201. package/packages/web/dist/assets/InstanceConfigPage-Bypd_quL.js +2 -0
  202. package/packages/web/dist/assets/MarkdownRenderer-Co8w9iuX.js +30 -0
  203. package/packages/web/dist/assets/ProjectRedirect-DXrA24Cy.js +2 -0
  204. package/packages/web/dist/assets/ProjectView-B9opP7Sv.js +13 -0
  205. package/packages/web/dist/assets/ProjectsGrid-D2cwb2jY.js +2 -0
  206. package/packages/web/dist/assets/arc-B--FIRB8.js +2 -0
  207. package/packages/web/dist/assets/architectureDiagram-3BPJPVTR-B6dRWZZ6.js +37 -0
  208. package/packages/web/dist/assets/bash-I8pq0VWm.js +2 -0
  209. package/packages/web/dist/assets/blockDiagram-GPEHLZMM-DLxFAvvf.js +133 -0
  210. package/packages/web/dist/assets/c-D2F1sQUL.js +2 -0
  211. package/packages/web/dist/assets/c4Diagram-AAUBKEIU-CNee5ks4.js +11 -0
  212. package/packages/web/dist/assets/channel-Bw0A52CB.js +2 -0
  213. package/packages/web/dist/assets/chunk-2J33WTMH-DObw03Xl.js +2 -0
  214. package/packages/web/dist/assets/chunk-4BX2VUAB-CH2SR6nN.js +2 -0
  215. package/packages/web/dist/assets/chunk-55IACEB6-WlVpegT3.js +2 -0
  216. package/packages/web/dist/assets/chunk-727SXJPM-g8GT9Rgd.js +207 -0
  217. package/packages/web/dist/assets/chunk-AQP2D5EJ-DbN4PsDF.js +232 -0
  218. package/packages/web/dist/assets/chunk-FMBD7UC4-DSN3BjFG.js +16 -0
  219. package/packages/web/dist/assets/chunk-ND2GUHAM-D9R4le0z.js +2 -0
  220. package/packages/web/dist/assets/chunk-QZHKN3VN-D4YgRaKH.js +2 -0
  221. package/packages/web/dist/assets/classDiagram-4FO5ZUOK-itf_kt-q.js +2 -0
  222. package/packages/web/dist/assets/classDiagram-v2-Q7XG4LA2-itf_kt-q.js +2 -0
  223. package/packages/web/dist/assets/core-CysJ2gLj.js +4 -0
  224. package/packages/web/dist/assets/cose-bilkent-S5V4N54A-D1PB0KNu.js +2 -0
  225. package/packages/web/dist/assets/cpp-Bm3ii6kY.js +2 -0
  226. package/packages/web/dist/assets/csharp-BNpuYZMG.js +2 -0
  227. package/packages/web/dist/assets/css-DazXZka4.js +2 -0
  228. package/packages/web/dist/assets/cytoscape.esm-CUqq0XTU.js +332 -0
  229. package/packages/web/dist/assets/dagre-BM42HDAG-C6Uuq-dq.js +5 -0
  230. package/packages/web/dist/assets/defaultLocale-DX6XiGOO.js +2 -0
  231. package/packages/web/dist/assets/diagram-2AECGRRQ-C9JvQ425.js +44 -0
  232. package/packages/web/dist/assets/diagram-5GNKFQAL-Cu6pdh2d.js +11 -0
  233. package/packages/web/dist/assets/diagram-KO2AKTUF-PmXcUQhY.js +4 -0
  234. package/packages/web/dist/assets/diagram-LMA3HP47-9ww6_9Iq.js +25 -0
  235. package/packages/web/dist/assets/diagram-OG6HWLK6-DWQVjv_n.js +25 -0
  236. package/packages/web/dist/assets/erDiagram-TEJ5UH35-6F7xTuff.js +86 -0
  237. package/packages/web/dist/assets/flowDiagram-I6XJVG4X-SCiGu7m6.js +163 -0
  238. package/packages/web/dist/assets/format-yf7Vf9kR.js +2 -0
  239. package/packages/web/dist/assets/ganttDiagram-6RSMTGT7-BNpPwxkL.js +293 -0
  240. package/packages/web/dist/assets/gitGraphDiagram-PVQCEYII-C0gyAJjW.js +107 -0
  241. package/packages/web/dist/assets/go-BPx_y7j8.js +2 -0
  242. package/packages/web/dist/assets/graph-BlwPajkw.js +2 -0
  243. package/packages/web/dist/assets/index-B-YuzkF6.js +71 -0
  244. package/packages/web/dist/assets/index-CvGiQddO.css +1 -0
  245. package/packages/web/dist/assets/infoDiagram-5YYISTIA-CJ2CFPfy.js +3 -0
  246. package/packages/web/dist/assets/ini-B3BVgEsG.js +2 -0
  247. package/packages/web/dist/assets/init-Gi6I4Gst.js +2 -0
  248. package/packages/web/dist/assets/ishikawaDiagram-YF4QCWOH-Cs0D32Ry.js +71 -0
  249. package/packages/web/dist/assets/java-B5VKqtH2.js +2 -0
  250. package/packages/web/dist/assets/javascript-BKRaQes9.js +2 -0
  251. package/packages/web/dist/assets/journeyDiagram-JHISSGLW-Bc9fuI2i.js +140 -0
  252. package/packages/web/dist/assets/json-DIYVocXf.js +2 -0
  253. package/packages/web/dist/assets/kanban-definition-UN3LZRKU-D_tC7QfC.js +90 -0
  254. package/packages/web/dist/assets/katex-C5jXJg4s.js +258 -0
  255. package/packages/web/dist/assets/kotlin-Cw-eF_bm.js +3 -0
  256. package/packages/web/dist/assets/lastTab-CU1zsF0j.js +2 -0
  257. package/packages/web/dist/assets/layout-Boy8vhSP.js +2 -0
  258. package/packages/web/dist/assets/linear-BzGHkF9K.js +2 -0
  259. package/packages/web/dist/assets/mermaid.core-DlbsYzE-.js +310 -0
  260. package/packages/web/dist/assets/mindmap-definition-RKZ34NQL-Bxeh-ToD.js +97 -0
  261. package/packages/web/dist/assets/ordinal-Cboi1Yqb.js +2 -0
  262. package/packages/web/dist/assets/php-CRdd4dfS.js +3 -0
  263. package/packages/web/dist/assets/pieDiagram-4H26LBE5-CDmilo8S.js +31 -0
  264. package/packages/web/dist/assets/python-kSlZHhJb.js +2 -0
  265. package/packages/web/dist/assets/quadrantDiagram-W4KKPZXB-D14-JyE9.js +8 -0
  266. package/packages/web/dist/assets/queued-LamEU0GH.js +2 -0
  267. package/packages/web/dist/assets/requirementDiagram-4Y6WPE33-CJ1PUGu-.js +85 -0
  268. package/packages/web/dist/assets/ruby-7T4ktxyv.js +2 -0
  269. package/packages/web/dist/assets/rust-HC3MBUhY.js +2 -0
  270. package/packages/web/dist/assets/sankeyDiagram-5OEKKPKP-BkUK73W0.js +41 -0
  271. package/packages/web/dist/assets/scss-DZLA7YXz.js +2 -0
  272. package/packages/web/dist/assets/sequenceDiagram-3UESZ5HK-sbcvsuLp.js +163 -0
  273. package/packages/web/dist/assets/sql-BC88IN-V.js +2 -0
  274. package/packages/web/dist/assets/stateDiagram-AJRCARHV-DV-7BdHK.js +2 -0
  275. package/packages/web/dist/assets/stateDiagram-v2-BHNVJYJU-BlkGdXKW.js +2 -0
  276. package/packages/web/dist/assets/swift-Dn8kKO_1.js +2 -0
  277. package/packages/web/dist/assets/timeline-definition-PNZ67QCA-C5su21G_.js +121 -0
  278. package/packages/web/dist/assets/typescript-C2FFdlUC.js +2 -0
  279. package/packages/web/dist/assets/vennDiagram-CIIHVFJN-JNkIJAaQ.js +35 -0
  280. package/packages/web/dist/assets/wardley-L42UT6IY-qcz6t2vR.js +174 -0
  281. package/packages/web/dist/assets/wardleyDiagram-YWT4CUSO-CMrOIZ-c.js +79 -0
  282. package/packages/web/dist/assets/xml-BXBhIUeX.js +2 -0
  283. package/packages/web/dist/assets/xychartDiagram-2RQKCTM6-C9q6Oy9u.js +8 -0
  284. package/packages/web/dist/assets/yaml-drsDnIKT.js +2 -0
  285. package/packages/web/dist/favicon.ico +0 -0
  286. package/packages/web/dist/fonts/inter-latin.woff2 +0 -0
  287. package/packages/web/dist/fonts/jetbrains-mono-latin.woff2 +0 -0
  288. package/packages/web/dist/icons/apple-touch-icon.png +0 -0
  289. package/packages/web/dist/icons/favicon-16.png +0 -0
  290. package/packages/web/dist/icons/favicon-32.png +0 -0
  291. package/packages/web/dist/icons/icon-192.png +0 -0
  292. package/packages/web/dist/icons/icon-512.png +0 -0
  293. package/packages/web/dist/icons/maskable-512.png +0 -0
  294. package/packages/web/dist/index.html +56 -0
  295. package/packages/web/dist/manifest.webmanifest +32 -0
  296. package/packages/web/dist/sw.js +139 -0
@@ -0,0 +1,448 @@
1
+ import { FORK_BATCH_MAX, READ_CHAT_DEFAULT_LIMIT, READ_CHAT_MAX_LIMIT, } from "./self-mcp-util.js";
2
+ import { MODEL_ARG_DESC, LIST_PROJECTS_DESC, LIST_CHATS_DESC, READ_CHAT_DESC, CREATE_CHAT_DESC, FORK_CHAT_DESC, SEND_MESSAGE_DESC, ARCHIVE_CHAT_DESC, UNARCHIVE_CHAT_DESC, FORK_CHAT_BATCH_DESC, CREATE_PROJECT_DESC, SET_TRIGGER_DESC, REMOVE_TRIGGER_DESC, RUN_TRIGGER_DESC, LIST_TRIGGERS_DESC, } from "./self-mcp-descriptions.js";
3
+ import { listProjectsHandler, listChatsHandler, readChatHandler } from "./self-mcp-read.js";
4
+ import { createChatHandler, forkChatHandler, sendMessageHandler, archiveChatHandler, forkChatBatchHandler, createProjectHandler, } from "./self-mcp-write.js";
5
+ import { PROJECT_STATUSES } from "./project-types.js";
6
+ import { listTriggersHandler, setTriggerHandler, removeTriggerHandler, runTriggerHandler, } from "./self-mcp-triggers.js";
7
+ export { FORK_BATCH_MAX, redactPaths, READ_CHAT_DEFAULT_LIMIT, READ_CHAT_MAX_LIMIT, READ_CHAT_MAX_TEXT, clampLimit, truncateText, resolveModelArg, coercePrompts, coerceToolList, coerceBoolean, } from "./self-mcp-util.js";
8
+ const SERVER_NAME = "paddock_manage";
9
+ /** The always-on READ tools (list_projects / list_chats / read_chat). */
10
+ function readTools(context) {
11
+ return [
12
+ {
13
+ name: "list_projects",
14
+ description: LIST_PROJECTS_DESC,
15
+ inputSchema: { type: "object", properties: {} },
16
+ handler: listProjectsHandler(context),
17
+ },
18
+ {
19
+ name: "list_chats",
20
+ description: LIST_CHATS_DESC,
21
+ inputSchema: {
22
+ type: "object",
23
+ properties: {
24
+ project: {
25
+ type: "string",
26
+ description: "Workspace to filter by: a project slug, or the empty string \"\" for the " +
27
+ "ROOT workspace (the instance's own top-level directory — see list_projects' " +
28
+ "`root`). Omit entirely to list chats across ALL workspaces, root included.",
29
+ },
30
+ include_archived: {
31
+ type: "boolean",
32
+ description: "Include archived chats. Defaults to false, matching the web UI. " +
33
+ "Pass true when you need an archived chat's session_id (e.g. to " +
34
+ "read or unarchive it) — nothing else surfaces session ids.",
35
+ },
36
+ },
37
+ },
38
+ handler: listChatsHandler(context),
39
+ },
40
+ {
41
+ name: "read_chat",
42
+ description: READ_CHAT_DESC,
43
+ inputSchema: {
44
+ type: "object",
45
+ properties: {
46
+ project: {
47
+ type: "string",
48
+ description: "Workspace that owns the chat — a project slug, or the empty string \"\" for " +
49
+ "the ROOT workspace. Use the `project` value list_chats reported, verbatim.",
50
+ },
51
+ session_id: { type: "string", description: "The chat's sessionId (from list_chats)." },
52
+ limit: {
53
+ type: "number",
54
+ description: `How many trailing messages to return (default ${READ_CHAT_DEFAULT_LIMIT}, max ${READ_CHAT_MAX_LIMIT}).`,
55
+ },
56
+ },
57
+ required: ["project", "session_id"],
58
+ },
59
+ handler: readChatHandler(context),
60
+ },
61
+ ];
62
+ }
63
+ /** The Phase-2 WRITE tools (create/fork/send/archive/unarchive/fork-batch). */
64
+ function writeTools(write) {
65
+ return [
66
+ {
67
+ name: "create_chat",
68
+ description: CREATE_CHAT_DESC,
69
+ inputSchema: {
70
+ type: "object",
71
+ properties: {
72
+ prompt: { type: "string", description: "The first turn to send to the new chat." },
73
+ project: {
74
+ type: "string",
75
+ description: "Project slug to create the chat in. Omit to use the current project.",
76
+ },
77
+ name: {
78
+ type: "string",
79
+ description: "Concise 3–5 word display name for the new chat (e.g. \"Fix login redirect bug\"). " +
80
+ "Strongly recommended: without it the title falls back to a long auto-summary.",
81
+ },
82
+ preload_context: {
83
+ type: "boolean",
84
+ description: "Seed the new chat with the project's OVERVIEW.md + CHANGELOG.md.",
85
+ },
86
+ model: { type: "string", description: MODEL_ARG_DESC },
87
+ },
88
+ required: ["prompt"],
89
+ },
90
+ handler: createChatHandler(write),
91
+ },
92
+ {
93
+ name: "fork_chat",
94
+ description: FORK_CHAT_DESC,
95
+ inputSchema: {
96
+ type: "object",
97
+ properties: {
98
+ project: {
99
+ type: "string",
100
+ description: "Project slug that owns the source chat. Omit to use the current project.",
101
+ },
102
+ session_id: {
103
+ type: "string",
104
+ description: "Source chat's sessionId (from list_chats). Omit to fork the CURRENT chat.",
105
+ },
106
+ prompt: { type: "string", description: "Optional first turn to kick off the fork." },
107
+ name: { type: "string", description: "Optional display name for the forked chat." },
108
+ model: {
109
+ type: "string",
110
+ description: `${MODEL_ARG_DESC} Applies to the kickoff turn only (a fork with no \`prompt\` runs no turn).`,
111
+ },
112
+ },
113
+ },
114
+ handler: forkChatHandler(write),
115
+ },
116
+ {
117
+ name: "send_message",
118
+ description: SEND_MESSAGE_DESC,
119
+ inputSchema: {
120
+ type: "object",
121
+ properties: {
122
+ session_id: { type: "string", description: "Target chat's sessionId (from list_chats)." },
123
+ prompt: { type: "string", description: "The message to send as a new turn." },
124
+ project: {
125
+ type: "string",
126
+ description: "Project slug that owns the chat. Omit to use the current project.",
127
+ },
128
+ },
129
+ required: ["session_id", "prompt"],
130
+ },
131
+ handler: sendMessageHandler(write),
132
+ },
133
+ {
134
+ name: "archive_chat",
135
+ description: ARCHIVE_CHAT_DESC,
136
+ inputSchema: {
137
+ type: "object",
138
+ properties: {
139
+ session_id: {
140
+ type: "string",
141
+ description: "Chat's sessionId (from list_chats). Omit to archive the CURRENT chat (yourself).",
142
+ },
143
+ project: {
144
+ type: "string",
145
+ description: "Project slug that owns the chat. Omit to use the current project.",
146
+ },
147
+ },
148
+ },
149
+ handler: archiveChatHandler(write, true),
150
+ },
151
+ {
152
+ name: "unarchive_chat",
153
+ description: UNARCHIVE_CHAT_DESC,
154
+ inputSchema: {
155
+ type: "object",
156
+ properties: {
157
+ session_id: {
158
+ type: "string",
159
+ description: "Chat's sessionId (from list_chats). Omit to unarchive the CURRENT chat (yourself).",
160
+ },
161
+ project: {
162
+ type: "string",
163
+ description: "Project slug that owns the chat. Omit to use the current project.",
164
+ },
165
+ },
166
+ },
167
+ handler: archiveChatHandler(write, false),
168
+ },
169
+ {
170
+ name: "fork_chat_batch",
171
+ description: FORK_CHAT_BATCH_DESC,
172
+ inputSchema: {
173
+ type: "object",
174
+ properties: {
175
+ // Declared as a STRING (not array): the CLI-runtime MCP transport
176
+ // reliably carries string args but has dropped array-typed args in
177
+ // practice. The handler accepts a JSON array too (coercePrompts), but
178
+ // telling the model to emit one directive per line is what works.
179
+ prompts: {
180
+ type: "string",
181
+ description: `The fork directives — ONE per line (1..${FORK_BATCH_MAX} lines), each a non-empty instruction for that fork. A JSON array of strings is also accepted.`,
182
+ },
183
+ project: {
184
+ type: "string",
185
+ description: "Project slug that owns the source chat. Omit to use the current project.",
186
+ },
187
+ session_id: {
188
+ type: "string",
189
+ description: "Shared fork source's sessionId. Omit to fork the CURRENT chat.",
190
+ },
191
+ name_prefix: {
192
+ type: "string",
193
+ description: 'Optional; each fork is named "<name_prefix> <i>" (1-based).',
194
+ },
195
+ model: {
196
+ type: "string",
197
+ description: `${MODEL_ARG_DESC} Applies to EVERY fork's kickoff turn in this fan-out.`,
198
+ },
199
+ },
200
+ required: ["prompts"],
201
+ },
202
+ handler: forkChatBatchHandler(write),
203
+ },
204
+ ];
205
+ }
206
+ /**
207
+ * The PROJECT tools (issue #467 — `create_project`). Appended only when
208
+ * {@link SelfMcpWriteContext.projectsMcpEnabled} is on: the same coarse binary gate
209
+ * as the trigger tools (when off the tool is ABSENT, not present-but-refusing). Its
210
+ * own flag because — unlike every other write tool — this one provisions
211
+ * instance-level state and clones a caller-supplied git URL.
212
+ */
213
+ function projectTools(write) {
214
+ return [
215
+ {
216
+ name: "create_project",
217
+ description: CREATE_PROJECT_DESC,
218
+ inputSchema: {
219
+ type: "object",
220
+ properties: {
221
+ name: { type: "string", description: "Display name for the new project (required)." },
222
+ slug: {
223
+ type: "string",
224
+ description: "Optional kebab-case url slug (a-z, 0-9, single hyphens). Omit to derive it from `name`.",
225
+ },
226
+ repo: {
227
+ type: "string",
228
+ description: "Optional git URL (https://, git://, ssh:// or git@host:owner/repo). Supplying it " +
229
+ "makes the project REPO-BACKED: the repo is cloned into a nested checkout that " +
230
+ "becomes the keeper's working directory. Omit for a notebook project.",
231
+ },
232
+ summary: { type: "string", description: "Optional one-line description of the project." },
233
+ area: {
234
+ type: "string",
235
+ description: "Optional area/group the project is filed under in the sidebar.",
236
+ },
237
+ status: {
238
+ type: "string",
239
+ enum: [...PROJECT_STATUSES],
240
+ description: 'Optional initial status (default "active").',
241
+ },
242
+ },
243
+ required: ["name"],
244
+ },
245
+ handler: createProjectHandler(write),
246
+ },
247
+ ];
248
+ }
249
+ /**
250
+ * The Epic T / T3 unified trigger-management tools (list/set/remove/run). Appended
251
+ * only when {@link SelfMcpWriteContext.triggersMcpEnabled} is on — a coarse binary
252
+ * gate: when off the tools are ABSENT (not present-but-refusing). These COLLAPSE
253
+ * what were the separate schedule + hook verbs.
254
+ */
255
+ function triggerTools(write) {
256
+ return [
257
+ {
258
+ name: "list_triggers",
259
+ description: LIST_TRIGGERS_DESC,
260
+ inputSchema: {
261
+ type: "object",
262
+ properties: {
263
+ project: {
264
+ type: "string",
265
+ description: "Project slug to list. Omit to use the current project.",
266
+ },
267
+ },
268
+ },
269
+ handler: listTriggersHandler(write),
270
+ },
271
+ {
272
+ name: "set_trigger",
273
+ description: SET_TRIGGER_DESC,
274
+ inputSchema: {
275
+ type: "object",
276
+ properties: {
277
+ name: { type: "string", description: "The trigger's stable key (create or update)." },
278
+ type: {
279
+ type: "string",
280
+ enum: ["schedule", "event", "webhook"],
281
+ description: "WHEN the trigger fires. Omit on an edit to keep the existing WHEN; supply it " +
282
+ "(with its fields) to (re)specify the trigger. \"schedule\" needs `cron` or " +
283
+ "`interval`; \"event\" needs `event`; \"webhook\" needs `path` (reserved).",
284
+ },
285
+ cron: {
286
+ type: "string",
287
+ description: 'For a "schedule" trigger: a 5-field cron expression (e.g. "0 9 * * *"), host-local time. Exactly one of `cron`/`interval`.',
288
+ },
289
+ interval: {
290
+ type: "string",
291
+ description: 'For a "schedule" trigger: a duration string (e.g. "30m", "1h"). Exactly one of `cron`/`interval`.',
292
+ },
293
+ event: {
294
+ type: "string",
295
+ description: 'For an "event" trigger: the lifecycle trigger (v1: "onArchive").',
296
+ },
297
+ path: {
298
+ type: "string",
299
+ description: 'For a "webhook" trigger: the ingress path (reserved — not yet fired).',
300
+ },
301
+ prompt: {
302
+ type: "string",
303
+ description: "Inline instruction the fired turn runs. Provide this OR `prompt_file`.",
304
+ },
305
+ prompt_file: {
306
+ type: "string",
307
+ description: 'A `.md` file under the project\'s `.paddock/triggers/` dir (e.g. "daily.md"), ' +
308
+ "read at fire time. Alternative to `prompt` for long, version-tracked prompts.",
309
+ },
310
+ session: {
311
+ type: "string",
312
+ enum: ["new", "resume"],
313
+ description: '"new" (default) → a fresh chat each fire; "resume" → accrete into the trigger\'s one owned session.',
314
+ },
315
+ tools: {
316
+ type: "string",
317
+ description: "The fired agent's capability = a deny-by-default allow-list — one per line or " +
318
+ 'comma-separated (e.g. "Bash, Read, Write"). Omit / empty = a tool-less curator. A JSON array is also accepted.',
319
+ },
320
+ model: { type: "string", description: "Model override for the fired agent." },
321
+ permission_mode: {
322
+ type: "string",
323
+ enum: ["default", "acceptEdits", "bypassPermissions", "plan"],
324
+ description: "Permission mode the fired agent's turns run under.",
325
+ },
326
+ max_spawn_depth: {
327
+ type: "number",
328
+ description: "Recursion bound for internal spawning (0 = may not spawn).",
329
+ },
330
+ max_turns: {
331
+ type: "number",
332
+ description: "Max agent turns bounding a runaway trigger.",
333
+ },
334
+ enabled: {
335
+ type: "boolean",
336
+ description: "Whether the trigger is armed. Default FALSE on a NEW trigger; omitted on an " +
337
+ "existing trigger leaves it unchanged (so an `enabled`-only call just flips it).",
338
+ },
339
+ project: {
340
+ type: "string",
341
+ description: "Project slug to target. Omit to use the current project.",
342
+ },
343
+ },
344
+ required: ["name"],
345
+ },
346
+ handler: setTriggerHandler(write),
347
+ },
348
+ {
349
+ name: "remove_trigger",
350
+ description: REMOVE_TRIGGER_DESC,
351
+ inputSchema: {
352
+ type: "object",
353
+ properties: {
354
+ name: { type: "string", description: "The trigger to remove." },
355
+ project: {
356
+ type: "string",
357
+ description: "Project slug that owns the trigger. Omit to use the current project.",
358
+ },
359
+ },
360
+ required: ["name"],
361
+ },
362
+ handler: removeTriggerHandler(write),
363
+ },
364
+ {
365
+ name: "run_trigger",
366
+ description: RUN_TRIGGER_DESC,
367
+ inputSchema: {
368
+ type: "object",
369
+ properties: {
370
+ name: { type: "string", description: "The trigger to fire now." },
371
+ project: {
372
+ type: "string",
373
+ description: "Project slug that owns the trigger. Omit to use the current project.",
374
+ },
375
+ },
376
+ required: ["name"],
377
+ },
378
+ handler: runTriggerHandler(write),
379
+ },
380
+ ];
381
+ }
382
+ /**
383
+ * Build the injected MCP server definition for the self-management tools, bound to
384
+ * a per-turn context. The READ tools (list_projects/list_chats/read_chat) are
385
+ * ALWAYS included. When a {@link SelfMcpWriteContext} is provided (the stricter
386
+ * write flag is on), the WRITE tools (create_chat/fork_chat/send_message/
387
+ * archive_chat/unarchive_chat/fork_chat_batch) are appended too; omit it for
388
+ * unchanged read-only behavior. Two further blocks hang off independent gates ON
389
+ * that write context: {@link SelfMcpWriteContext.projectsMcpEnabled} (issue #467)
390
+ * appends the project tool (create_project), and
391
+ * {@link SelfMcpWriteContext.triggersMcpEnabled} (the per-project trigger-MCP
392
+ * opt-in, Epic T / T3) appends the unified trigger-management tools (list_triggers/
393
+ * set_trigger/remove_trigger/run_trigger). Inject under
394
+ * {@link SELF_MCP_SERVER_KEY}.
395
+ */
396
+ export function selfMcpServerDef(context, write, opts) {
397
+ const tools = [...readTools(context)];
398
+ if (write) {
399
+ tools.push(...writeTools(write));
400
+ if (write.projectsMcpEnabled) {
401
+ tools.push(...projectTools(write));
402
+ }
403
+ if (write.triggersMcpEnabled) {
404
+ tools.push(...triggerTools(write));
405
+ }
406
+ }
407
+ // Scope-driven visibility (#312 M1). Absent ⇒ every assembled tool is offered,
408
+ // which is the in-process keeper path and every pre-#312 caller. An external
409
+ // principal passes a filter so it is never shown a verb outside its scope.
410
+ // This is presentation only — the ops layer is what actually refuses a call.
411
+ const visible = opts?.toolFilter ? tools.filter((t) => opts.toolFilter(t.name)) : tools;
412
+ return { name: SERVER_NAME, version: "0.1.0", tools: visible };
413
+ }
414
+ /** The record key + the fully-qualified tool names the agent sees. */
415
+ export const SELF_MCP_SERVER_KEY = SERVER_NAME;
416
+ export const SELF_MCP_TOOL_NAMES = {
417
+ listProjects: `mcp__${SERVER_NAME}__list_projects`,
418
+ listChats: `mcp__${SERVER_NAME}__list_chats`,
419
+ readChat: `mcp__${SERVER_NAME}__read_chat`,
420
+ };
421
+ /** The fully-qualified names of the Phase-2 WRITE tools (only present when the write flag is on). */
422
+ export const SELF_MCP_WRITE_TOOL_NAMES = {
423
+ createChat: `mcp__${SERVER_NAME}__create_chat`,
424
+ forkChat: `mcp__${SERVER_NAME}__fork_chat`,
425
+ sendMessage: `mcp__${SERVER_NAME}__send_message`,
426
+ archiveChat: `mcp__${SERVER_NAME}__archive_chat`,
427
+ unarchiveChat: `mcp__${SERVER_NAME}__unarchive_chat`,
428
+ forkChatBatch: `mcp__${SERVER_NAME}__fork_chat_batch`,
429
+ };
430
+ /**
431
+ * The fully-qualified name of the PROJECT tool (issue #467), present only when a
432
+ * write context has {@link SelfMcpWriteContext.projectsMcpEnabled} on.
433
+ */
434
+ export const SELF_MCP_PROJECT_TOOL_NAMES = {
435
+ createProject: `mcp__${SERVER_NAME}__create_project`,
436
+ };
437
+ /**
438
+ * The fully-qualified names of the Epic T / T3 unified trigger-management tools
439
+ * (only present when a write context has {@link SelfMcpWriteContext.triggersMcpEnabled}
440
+ * on). These collapse the former schedule (set/remove/list_schedule) + hook
441
+ * (set/remove/list_hook) verbs.
442
+ */
443
+ export const SELF_MCP_TRIGGER_TOOL_NAMES = {
444
+ listTriggers: `mcp__${SERVER_NAME}__list_triggers`,
445
+ setTrigger: `mcp__${SERVER_NAME}__set_trigger`,
446
+ removeTrigger: `mcp__${SERVER_NAME}__remove_trigger`,
447
+ runTrigger: `mcp__${SERVER_NAME}__run_trigger`,
448
+ };
@@ -0,0 +1,46 @@
1
+ import type { InjectedMcpServerDef } from "@herdctl/core";
2
+ /** The renderer the web side should use for a sent file. */
3
+ export type SentFileKind = "markdown" | "mermaid" | "code" | "text" | "html" | "image" | "video" | "pdf";
4
+ /**
5
+ * The JSON envelope returned as the tool's result `output`. The web parses this
6
+ * off the tool call (live + on reload). `paddockSendFile` is a version/discriminator
7
+ * so the client can be sure a tool output is one of ours before parsing.
8
+ */
9
+ export interface SentFileEnvelope {
10
+ paddockSendFile: 1;
11
+ filename: string;
12
+ kind: SentFileKind;
13
+ language?: string;
14
+ /** "inline" carries `content`; "file" carries `attachmentId` (bytes in the store). */
15
+ source: "inline" | "file";
16
+ content?: string;
17
+ attachmentId?: string;
18
+ message?: string;
19
+ }
20
+ /**
21
+ * Reject a runaway send; a chat attachment shouldn't be huge. Sized generously
22
+ * for video: a short screen recording (e.g. a Playwright `recordVideo`) routinely
23
+ * exceeds the old 25 MB image ceiling, so we allow up to 100 MB.
24
+ */
25
+ export declare const MAX_ATTACHMENT_BYTES: number;
26
+ /** Per-turn context for the send-file tool. */
27
+ export interface SendFileContext {
28
+ /** The agent's working directory — resolves a relative `file_path`. */
29
+ workingDirectory?: string;
30
+ /**
31
+ * Copy a real file's bytes into the attachment store, returning its id. Called
32
+ * once at send time so the shared file is an immutable snapshot and the render
33
+ * endpoint never serves an arbitrary path. `filenameForExt` supplies the
34
+ * stored file's extension (for content-type on serve).
35
+ */
36
+ saveAttachment: (bytes: Buffer, filenameForExt: string) => Promise<string>;
37
+ }
38
+ /**
39
+ * Build the injected MCP server definition for the send-file tool, bound to a
40
+ * per-turn context. Pass the returned value under a stable server key (`paddock`)
41
+ * so the tool surfaces to the agent as `mcp__paddock__send_file`.
42
+ */
43
+ export declare function sendFileServerDef(context: SendFileContext): InjectedMcpServerDef;
44
+ /** The record key + resulting fully-qualified tool name the agent sees. */
45
+ export declare const SEND_FILE_SERVER_KEY = "paddock";
46
+ export declare const SEND_FILE_TOOL_NAME = "mcp__paddock__send_file";