toolroll 0.5.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 (626) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1113 -0
  3. package/THIRD_PARTY_NOTICES.md +449 -0
  4. package/dist/accent-colors.d.ts +48 -0
  5. package/dist/accent-colors.js +122 -0
  6. package/dist/action-ledger.d.ts +26 -0
  7. package/dist/action-ledger.js +75 -0
  8. package/dist/agent-fence.d.ts +42 -0
  9. package/dist/agent-fence.js +183 -0
  10. package/dist/agentconfig.d.ts +216 -0
  11. package/dist/agentconfig.js +454 -0
  12. package/dist/api-tokens.d.ts +16 -0
  13. package/dist/api-tokens.js +27 -0
  14. package/dist/approval-policy.d.ts +69 -0
  15. package/dist/approval-policy.js +137 -0
  16. package/dist/approval-rules-ui.d.ts +25 -0
  17. package/dist/approval-rules-ui.js +39 -0
  18. package/dist/assignment-adapters.d.ts +180 -0
  19. package/dist/assignment-adapters.js +239 -0
  20. package/dist/assignment-brief.d.ts +71 -0
  21. package/dist/assignment-brief.js +129 -0
  22. package/dist/assignment-delivery.d.ts +56 -0
  23. package/dist/assignment-delivery.js +160 -0
  24. package/dist/assignment-presentation.d.ts +26 -0
  25. package/dist/assignment-presentation.js +80 -0
  26. package/dist/assignment-status.d.ts +62 -0
  27. package/dist/assignment-status.js +152 -0
  28. package/dist/assignment-ui.d.ts +71 -0
  29. package/dist/assignment-ui.js +103 -0
  30. package/dist/assignment.d.ts +222 -0
  31. package/dist/assignment.js +399 -0
  32. package/dist/attest.d.ts +56 -0
  33. package/dist/attest.js +153 -0
  34. package/dist/backend.d.ts +97 -0
  35. package/dist/backend.js +166 -0
  36. package/dist/backup-ui.d.ts +22 -0
  37. package/dist/backup-ui.js +59 -0
  38. package/dist/backup.d.ts +84 -0
  39. package/dist/backup.js +421 -0
  40. package/dist/beads.d.ts +34 -0
  41. package/dist/beads.js +135 -0
  42. package/dist/bin.d.ts +2 -0
  43. package/dist/bin.js +22 -0
  44. package/dist/board.d.ts +150 -0
  45. package/dist/board.js +210 -0
  46. package/dist/boot-identity.d.ts +63 -0
  47. package/dist/boot-identity.js +99 -0
  48. package/dist/browser/THIRD_PARTY_NOTICES.txt +2295 -0
  49. package/dist/browser/workspace.css +4 -0
  50. package/dist/browser/workspace.js +225 -0
  51. package/dist/browser-crew.d.ts +11 -0
  52. package/dist/browser-crew.js +50 -0
  53. package/dist/browser-shell.d.ts +8 -0
  54. package/dist/browser-shell.js +60 -0
  55. package/dist/browser-workspace.d.ts +780 -0
  56. package/dist/browser-workspace.js +47 -0
  57. package/dist/budget-alerts.d.ts +19 -0
  58. package/dist/budget-alerts.js +46 -0
  59. package/dist/builder.d.ts +370 -0
  60. package/dist/builder.js +3262 -0
  61. package/dist/capscan.d.ts +35 -0
  62. package/dist/capscan.js +113 -0
  63. package/dist/chat-acceptance.d.ts +71 -0
  64. package/dist/chat-acceptance.js +120 -0
  65. package/dist/chat-actions.d.ts +265 -0
  66. package/dist/chat-actions.js +1273 -0
  67. package/dist/chat-channel.d.ts +109 -0
  68. package/dist/chat-channel.js +652 -0
  69. package/dist/chat-continuity.d.ts +32 -0
  70. package/dist/chat-continuity.js +317 -0
  71. package/dist/chat-controls.d.ts +113 -0
  72. package/dist/chat-controls.js +53 -0
  73. package/dist/chat-delivery-state.d.ts +159 -0
  74. package/dist/chat-delivery-state.js +309 -0
  75. package/dist/chat-delivery.d.ts +38 -0
  76. package/dist/chat-delivery.js +693 -0
  77. package/dist/chat-display.d.ts +1 -0
  78. package/dist/chat-display.js +18 -0
  79. package/dist/chat-evidence.d.ts +123 -0
  80. package/dist/chat-evidence.js +207 -0
  81. package/dist/chat-flow.d.ts +44 -0
  82. package/dist/chat-flow.js +215 -0
  83. package/dist/chat-inbox.d.ts +57 -0
  84. package/dist/chat-inbox.js +123 -0
  85. package/dist/chat-polish.d.ts +16 -0
  86. package/dist/chat-polish.js +135 -0
  87. package/dist/chat-review.d.ts +46 -0
  88. package/dist/chat-review.js +98 -0
  89. package/dist/chat-rooms.d.ts +123 -0
  90. package/dist/chat-rooms.js +216 -0
  91. package/dist/chat-task-actions.d.ts +44 -0
  92. package/dist/chat-task-actions.js +79 -0
  93. package/dist/check-progress.d.ts +51 -0
  94. package/dist/check-progress.js +290 -0
  95. package/dist/child-database.d.ts +12 -0
  96. package/dist/child-database.js +30 -0
  97. package/dist/claim.d.ts +688 -0
  98. package/dist/claim.js +1740 -0
  99. package/dist/cli.d.ts +137 -0
  100. package/dist/cli.js +1461 -0
  101. package/dist/codex-limits.d.ts +15 -0
  102. package/dist/codex-limits.js +145 -0
  103. package/dist/coding-context.d.ts +55 -0
  104. package/dist/coding-context.js +92 -0
  105. package/dist/coding-handoff.d.ts +57 -0
  106. package/dist/coding-handoff.js +277 -0
  107. package/dist/coding-provider.d.ts +72 -0
  108. package/dist/coding-provider.js +424 -0
  109. package/dist/coding-shipping-ui.d.ts +4 -0
  110. package/dist/coding-shipping-ui.js +12 -0
  111. package/dist/coding-types.d.ts +62 -0
  112. package/dist/coding-types.js +1 -0
  113. package/dist/coding-ui.d.ts +17 -0
  114. package/dist/coding-ui.js +364 -0
  115. package/dist/coding-update.d.ts +15 -0
  116. package/dist/coding-update.js +149 -0
  117. package/dist/coding-workspace.d.ts +124 -0
  118. package/dist/coding-workspace.js +768 -0
  119. package/dist/container-state.d.ts +5 -0
  120. package/dist/container-state.js +62 -0
  121. package/dist/containment.d.ts +197 -0
  122. package/dist/containment.js +559 -0
  123. package/dist/contest.d.ts +318 -0
  124. package/dist/contest.js +753 -0
  125. package/dist/control-setup.d.ts +35 -0
  126. package/dist/control-setup.js +40 -0
  127. package/dist/control-ui.d.ts +29 -0
  128. package/dist/control-ui.js +53 -0
  129. package/dist/controller-service.d.ts +1 -0
  130. package/dist/controller-service.js +19 -0
  131. package/dist/controller-supervisor.d.ts +30 -0
  132. package/dist/controller-supervisor.js +104 -0
  133. package/dist/converse.d.ts +304 -0
  134. package/dist/converse.js +849 -0
  135. package/dist/coordinator-proposals.d.ts +29 -0
  136. package/dist/coordinator-proposals.js +137 -0
  137. package/dist/coordinator.d.ts +186 -0
  138. package/dist/coordinator.js +447 -0
  139. package/dist/credentials-ui.d.ts +25 -0
  140. package/dist/credentials-ui.js +48 -0
  141. package/dist/daemon.d.ts +209 -0
  142. package/dist/daemon.js +604 -0
  143. package/dist/decision.d.ts +120 -0
  144. package/dist/decision.js +388 -0
  145. package/dist/demo.d.ts +55 -0
  146. package/dist/demo.js +992 -0
  147. package/dist/desktop-access.d.ts +28 -0
  148. package/dist/desktop-access.js +88 -0
  149. package/dist/desktop-bundle.d.ts +16 -0
  150. package/dist/desktop-bundle.js +74 -0
  151. package/dist/desktop-host.d.ts +54 -0
  152. package/dist/desktop-host.js +508 -0
  153. package/dist/desktop-update-gate.d.ts +12 -0
  154. package/dist/desktop-update-gate.js +91 -0
  155. package/dist/desktop-update-recovery.d.ts +14 -0
  156. package/dist/desktop-update-recovery.js +243 -0
  157. package/dist/desktop-update.d.ts +110 -0
  158. package/dist/desktop-update.js +740 -0
  159. package/dist/discord-api.d.ts +20 -0
  160. package/dist/discord-api.js +138 -0
  161. package/dist/discord-chat.d.ts +16 -0
  162. package/dist/discord-chat.js +381 -0
  163. package/dist/discord-settings.d.ts +7 -0
  164. package/dist/discord-settings.js +75 -0
  165. package/dist/discord.d.ts +10 -0
  166. package/dist/discord.js +169 -0
  167. package/dist/discover.d.ts +75 -0
  168. package/dist/discover.js +150 -0
  169. package/dist/dispatch.d.ts +100 -0
  170. package/dist/dispatch.js +311 -0
  171. package/dist/dispose.d.ts +161 -0
  172. package/dist/dispose.js +803 -0
  173. package/dist/email-settings.d.ts +34 -0
  174. package/dist/email-settings.js +50 -0
  175. package/dist/envelope.d.ts +47 -0
  176. package/dist/envelope.js +105 -0
  177. package/dist/evidence-pack.d.ts +185 -0
  178. package/dist/evidence-pack.js +258 -0
  179. package/dist/evidence.d.ts +345 -0
  180. package/dist/evidence.js +782 -0
  181. package/dist/exec.d.ts +285 -0
  182. package/dist/exec.js +1841 -0
  183. package/dist/exhaustion.d.ts +85 -0
  184. package/dist/exhaustion.js +141 -0
  185. package/dist/export-ui.d.ts +4 -0
  186. package/dist/export-ui.js +17 -0
  187. package/dist/export.d.ts +48 -0
  188. package/dist/export.js +305 -0
  189. package/dist/flow-actions.d.ts +77 -0
  190. package/dist/flow-actions.js +203 -0
  191. package/dist/flow-code.d.ts +50 -0
  192. package/dist/flow-code.js +159 -0
  193. package/dist/flow-draft.d.ts +38 -0
  194. package/dist/flow-draft.js +80 -0
  195. package/dist/flow-engine.d.ts +66 -0
  196. package/dist/flow-engine.js +416 -0
  197. package/dist/flow-insights.d.ts +95 -0
  198. package/dist/flow-insights.js +149 -0
  199. package/dist/flow-live.d.ts +24 -0
  200. package/dist/flow-live.js +150 -0
  201. package/dist/flow-people.d.ts +24 -0
  202. package/dist/flow-people.js +91 -0
  203. package/dist/flow-replies.d.ts +48 -0
  204. package/dist/flow-replies.js +113 -0
  205. package/dist/flow-scripts.d.ts +38 -0
  206. package/dist/flow-scripts.js +73 -0
  207. package/dist/flow-secrets.d.ts +13 -0
  208. package/dist/flow-secrets.js +45 -0
  209. package/dist/flow-sort.d.ts +82 -0
  210. package/dist/flow-sort.js +153 -0
  211. package/dist/flow-steps.d.ts +40 -0
  212. package/dist/flow-steps.js +408 -0
  213. package/dist/flow-triggers.d.ts +244 -0
  214. package/dist/flow-triggers.js +959 -0
  215. package/dist/flows-ui.d.ts +20 -0
  216. package/dist/flows-ui.js +175 -0
  217. package/dist/flows.d.ts +229 -0
  218. package/dist/flows.js +968 -0
  219. package/dist/fonts.d.ts +19 -0
  220. package/dist/fonts.js +19 -0
  221. package/dist/gaps.d.ts +35 -0
  222. package/dist/gaps.js +101 -0
  223. package/dist/gate-failure.d.ts +40 -0
  224. package/dist/gate-failure.js +66 -0
  225. package/dist/git.d.ts +54 -0
  226. package/dist/git.js +94 -0
  227. package/dist/google-mail.d.ts +58 -0
  228. package/dist/google-mail.js +151 -0
  229. package/dist/grant.d.ts +136 -0
  230. package/dist/grant.js +238 -0
  231. package/dist/graph.d.ts +164 -0
  232. package/dist/graph.js +383 -0
  233. package/dist/guides.d.ts +22 -0
  234. package/dist/guides.js +363 -0
  235. package/dist/held.d.ts +150 -0
  236. package/dist/held.js +799 -0
  237. package/dist/invoke.d.ts +112 -0
  238. package/dist/invoke.js +780 -0
  239. package/dist/issues.d.ts +41 -0
  240. package/dist/issues.js +131 -0
  241. package/dist/job-object-helper.ps1 +252 -0
  242. package/dist/jsonl-discriminants.d.ts +11 -0
  243. package/dist/jsonl-discriminants.js +93 -0
  244. package/dist/keys.d.ts +104 -0
  245. package/dist/keys.js +229 -0
  246. package/dist/kits-ui.d.ts +17 -0
  247. package/dist/kits-ui.js +46 -0
  248. package/dist/kits.d.ts +86 -0
  249. package/dist/kits.js +215 -0
  250. package/dist/knowledge-cli.d.ts +101 -0
  251. package/dist/knowledge-cli.js +92 -0
  252. package/dist/knowledge-ui.d.ts +24 -0
  253. package/dist/knowledge-ui.js +40 -0
  254. package/dist/lead-context.d.ts +8 -0
  255. package/dist/lead-context.js +56 -0
  256. package/dist/lead-follow.d.ts +22 -0
  257. package/dist/lead-follow.js +167 -0
  258. package/dist/lead-status.d.ts +75 -0
  259. package/dist/lead-status.js +285 -0
  260. package/dist/ledger-chain.d.ts +46 -0
  261. package/dist/ledger-chain.js +187 -0
  262. package/dist/ledger-csv.d.ts +4 -0
  263. package/dist/ledger-csv.js +11 -0
  264. package/dist/ledger-view.d.ts +24 -0
  265. package/dist/ledger-view.js +58 -0
  266. package/dist/limits-ui.d.ts +26 -0
  267. package/dist/limits-ui.js +67 -0
  268. package/dist/link.d.ts +72 -0
  269. package/dist/link.js +217 -0
  270. package/dist/live.d.ts +96 -0
  271. package/dist/live.js +366 -0
  272. package/dist/liveness.d.ts +30 -0
  273. package/dist/liveness.js +42 -0
  274. package/dist/log.d.ts +7 -0
  275. package/dist/log.js +25 -0
  276. package/dist/mailbox.d.ts +57 -0
  277. package/dist/mailbox.js +150 -0
  278. package/dist/maintenance.d.ts +11 -0
  279. package/dist/maintenance.js +35 -0
  280. package/dist/mate-cli.d.ts +52 -0
  281. package/dist/mate-cli.js +345 -0
  282. package/dist/mate-contract.d.ts +10 -0
  283. package/dist/mate-contract.js +30 -0
  284. package/dist/mate-doors.d.ts +69 -0
  285. package/dist/mate-doors.js +548 -0
  286. package/dist/mate-progress.d.ts +29 -0
  287. package/dist/mate-progress.js +121 -0
  288. package/dist/mate-tools.d.ts +94 -0
  289. package/dist/mate-tools.js +1878 -0
  290. package/dist/mate.d.ts +92 -0
  291. package/dist/mate.js +435 -0
  292. package/dist/mcp-connect.d.ts +103 -0
  293. package/dist/mcp-connect.js +252 -0
  294. package/dist/mcp.d.ts +27 -0
  295. package/dist/mcp.js +651 -0
  296. package/dist/memory-cli.d.ts +466 -0
  297. package/dist/memory-cli.js +111 -0
  298. package/dist/memory-pass.d.ts +160 -0
  299. package/dist/memory-pass.js +409 -0
  300. package/dist/metrics.d.ts +3 -0
  301. package/dist/metrics.js +56 -0
  302. package/dist/mobile-viewport.d.ts +3 -0
  303. package/dist/mobile-viewport.js +37 -0
  304. package/dist/model-catalog.d.ts +118 -0
  305. package/dist/model-catalog.js +376 -0
  306. package/dist/models-cli.d.ts +102 -0
  307. package/dist/models-cli.js +66 -0
  308. package/dist/models-ui.d.ts +34 -0
  309. package/dist/models-ui.js +68 -0
  310. package/dist/modes.d.ts +80 -0
  311. package/dist/modes.js +182 -0
  312. package/dist/monitoring-settings.d.ts +44 -0
  313. package/dist/monitoring-settings.js +173 -0
  314. package/dist/monitoring-ui.d.ts +20 -0
  315. package/dist/monitoring-ui.js +51 -0
  316. package/dist/monitoring.d.ts +34 -0
  317. package/dist/monitoring.js +221 -0
  318. package/dist/names.d.ts +67 -0
  319. package/dist/names.js +102 -0
  320. package/dist/observations.d.ts +40 -0
  321. package/dist/observations.js +211 -0
  322. package/dist/oidc.d.ts +71 -0
  323. package/dist/oidc.js +182 -0
  324. package/dist/onboard.d.ts +108 -0
  325. package/dist/onboard.js +325 -0
  326. package/dist/openrouter-models.d.ts +30 -0
  327. package/dist/openrouter-models.js +120 -0
  328. package/dist/operate.d.ts +118 -0
  329. package/dist/operate.js +11321 -0
  330. package/dist/peek-cli.d.ts +97 -0
  331. package/dist/peek-cli.js +215 -0
  332. package/dist/peek.d.ts +134 -0
  333. package/dist/peek.js +578 -0
  334. package/dist/phase-routing.d.ts +307 -0
  335. package/dist/phase-routing.js +658 -0
  336. package/dist/plan-auto.d.ts +14 -0
  337. package/dist/plan-auto.js +92 -0
  338. package/dist/plan.d.ts +186 -0
  339. package/dist/plan.js +401 -0
  340. package/dist/planner-source.d.ts +251 -0
  341. package/dist/planner-source.js +460 -0
  342. package/dist/planner.d.ts +75 -0
  343. package/dist/planner.js +992 -0
  344. package/dist/policy-ui.d.ts +20 -0
  345. package/dist/policy-ui.js +41 -0
  346. package/dist/policy.d.ts +111 -0
  347. package/dist/policy.js +231 -0
  348. package/dist/prepared-evidence.d.ts +16 -0
  349. package/dist/prepared-evidence.js +96 -0
  350. package/dist/pricing.d.ts +45 -0
  351. package/dist/pricing.js +77 -0
  352. package/dist/principal.d.ts +42 -0
  353. package/dist/principal.js +82 -0
  354. package/dist/probe.d.ts +46 -0
  355. package/dist/probe.js +79 -0
  356. package/dist/process-custody.d.ts +17 -0
  357. package/dist/process-custody.js +91 -0
  358. package/dist/process-liveness.d.ts +10 -0
  359. package/dist/process-liveness.js +81 -0
  360. package/dist/process-recovery-anchor.d.ts +75 -0
  361. package/dist/process-recovery-anchor.js +188 -0
  362. package/dist/process-recovery-coalition.d.ts +25 -0
  363. package/dist/process-recovery-coalition.js +105 -0
  364. package/dist/process-recovery-eligibility.d.ts +178 -0
  365. package/dist/process-recovery-eligibility.js +170 -0
  366. package/dist/process-recovery-native.d.ts +172 -0
  367. package/dist/process-recovery-native.js +592 -0
  368. package/dist/process-recovery-provenance.d.ts +163 -0
  369. package/dist/process-recovery-provenance.js +292 -0
  370. package/dist/process-recovery-services.d.ts +56 -0
  371. package/dist/process-recovery-services.js +191 -0
  372. package/dist/process-recovery-settlement.d.ts +32 -0
  373. package/dist/process-recovery-settlement.js +132 -0
  374. package/dist/process-recovery.d.ts +41 -0
  375. package/dist/process-recovery.js +91 -0
  376. package/dist/process-tree.d.ts +41 -0
  377. package/dist/process-tree.js +264 -0
  378. package/dist/project-access.d.ts +14 -0
  379. package/dist/project-access.js +34 -0
  380. package/dist/project-cli.d.ts +18 -0
  381. package/dist/project-cli.js +104 -0
  382. package/dist/project-delete-ui.d.ts +22 -0
  383. package/dist/project-delete-ui.js +48 -0
  384. package/dist/project-delete.d.ts +55 -0
  385. package/dist/project-delete.js +413 -0
  386. package/dist/project-knowledge.d.ts +111 -0
  387. package/dist/project-knowledge.js +241 -0
  388. package/dist/project-learning.d.ts +100 -0
  389. package/dist/project-learning.js +438 -0
  390. package/dist/project-memory.d.ts +81 -0
  391. package/dist/project-memory.js +264 -0
  392. package/dist/project-skills.d.ts +152 -0
  393. package/dist/project-skills.js +660 -0
  394. package/dist/project-tools.d.ts +219 -0
  395. package/dist/project-tools.js +796 -0
  396. package/dist/project.d.ts +61 -0
  397. package/dist/project.js +125 -0
  398. package/dist/prompt.d.ts +22 -0
  399. package/dist/prompt.js +72 -0
  400. package/dist/proof.d.ts +513 -0
  401. package/dist/proof.js +1140 -0
  402. package/dist/proposal.d.ts +82 -0
  403. package/dist/proposal.js +210 -0
  404. package/dist/provider-connection.d.ts +22 -0
  405. package/dist/provider-connection.js +98 -0
  406. package/dist/provider-limits.d.ts +35 -0
  407. package/dist/provider-limits.js +95 -0
  408. package/dist/provider.d.ts +279 -0
  409. package/dist/provider.js +935 -0
  410. package/dist/publish.d.ts +107 -0
  411. package/dist/publish.js +650 -0
  412. package/dist/pulls.d.ts +118 -0
  413. package/dist/pulls.js +240 -0
  414. package/dist/push.d.ts +95 -0
  415. package/dist/push.js +353 -0
  416. package/dist/quality.d.ts +8 -0
  417. package/dist/quality.js +6 -0
  418. package/dist/recipe-ui.d.ts +18 -0
  419. package/dist/recipe-ui.js +152 -0
  420. package/dist/recipes.d.ts +81 -0
  421. package/dist/recipes.js +332 -0
  422. package/dist/remote.d.ts +67 -0
  423. package/dist/remote.js +122 -0
  424. package/dist/render.d.ts +64 -0
  425. package/dist/render.js +587 -0
  426. package/dist/report-summary.d.ts +13 -0
  427. package/dist/report-summary.js +15 -0
  428. package/dist/repos.d.ts +65 -0
  429. package/dist/repos.js +277 -0
  430. package/dist/repository-context-ui.d.ts +2 -0
  431. package/dist/repository-context-ui.js +10 -0
  432. package/dist/repository-context.d.ts +67 -0
  433. package/dist/repository-context.js +376 -0
  434. package/dist/restart-certification.d.ts +134 -0
  435. package/dist/restart-certification.js +226 -0
  436. package/dist/result-actions.d.ts +28 -0
  437. package/dist/result-actions.js +270 -0
  438. package/dist/result-completion.d.ts +18 -0
  439. package/dist/result-completion.js +66 -0
  440. package/dist/result-review.d.ts +213 -0
  441. package/dist/result-review.js +430 -0
  442. package/dist/retention-ui.d.ts +12 -0
  443. package/dist/retention-ui.js +39 -0
  444. package/dist/retention.d.ts +72 -0
  445. package/dist/retention.js +288 -0
  446. package/dist/review-context.d.ts +243 -0
  447. package/dist/review-context.js +1043 -0
  448. package/dist/review-evidence.d.ts +33 -0
  449. package/dist/review-evidence.js +56 -0
  450. package/dist/reviewer.d.ts +97 -0
  451. package/dist/reviewer.js +202 -0
  452. package/dist/routine.d.ts +228 -0
  453. package/dist/routine.js +764 -0
  454. package/dist/runner.d.ts +266 -0
  455. package/dist/runner.js +399 -0
  456. package/dist/scan.d.ts +32 -0
  457. package/dist/scan.js +92 -0
  458. package/dist/scope.d.ts +695 -0
  459. package/dist/scope.js +1176 -0
  460. package/dist/scout-report.d.ts +42 -0
  461. package/dist/scout-report.js +108 -0
  462. package/dist/scout.d.ts +69 -0
  463. package/dist/scout.js +351 -0
  464. package/dist/serve.d.ts +313 -0
  465. package/dist/serve.js +21776 -0
  466. package/dist/session-brief.d.ts +8 -0
  467. package/dist/session-brief.js +24 -0
  468. package/dist/session-cli.d.ts +13 -0
  469. package/dist/session-cli.js +284 -0
  470. package/dist/session-contract.d.ts +183 -0
  471. package/dist/session-contract.js +122 -0
  472. package/dist/session-http.d.ts +19 -0
  473. package/dist/session-http.js +154 -0
  474. package/dist/session-server.d.ts +12 -0
  475. package/dist/session-server.js +37 -0
  476. package/dist/session-service.d.ts +22 -0
  477. package/dist/session-service.js +157 -0
  478. package/dist/setup-guide.d.ts +39 -0
  479. package/dist/setup-guide.js +93 -0
  480. package/dist/sign-in-guard.d.ts +45 -0
  481. package/dist/sign-in-guard.js +74 -0
  482. package/dist/skills-ui.d.ts +11 -0
  483. package/dist/skills-ui.js +58 -0
  484. package/dist/skills.d.ts +97 -0
  485. package/dist/skills.js +276 -0
  486. package/dist/slack-api.d.ts +55 -0
  487. package/dist/slack-api.js +229 -0
  488. package/dist/slack-chat.d.ts +28 -0
  489. package/dist/slack-chat.js +413 -0
  490. package/dist/slack-settings.d.ts +7 -0
  491. package/dist/slack-settings.js +75 -0
  492. package/dist/slack-state.d.ts +13 -0
  493. package/dist/slack-state.js +9 -0
  494. package/dist/slack.d.ts +13 -0
  495. package/dist/slack.js +167 -0
  496. package/dist/spend-ui.d.ts +28 -0
  497. package/dist/spend-ui.js +95 -0
  498. package/dist/spend.d.ts +142 -0
  499. package/dist/spend.js +313 -0
  500. package/dist/sqlite-runtime.d.ts +3 -0
  501. package/dist/sqlite-runtime.js +6 -0
  502. package/dist/sso-settings.d.ts +33 -0
  503. package/dist/sso-settings.js +103 -0
  504. package/dist/sso-ui.d.ts +22 -0
  505. package/dist/sso-ui.js +39 -0
  506. package/dist/storage.d.ts +15 -0
  507. package/dist/storage.js +84 -0
  508. package/dist/store.d.ts +7754 -0
  509. package/dist/store.js +23279 -0
  510. package/dist/structured-output.d.ts +58 -0
  511. package/dist/structured-output.js +103 -0
  512. package/dist/style-asset.d.ts +7 -0
  513. package/dist/style-asset.js +41 -0
  514. package/dist/subscription-chat.d.ts +46 -0
  515. package/dist/subscription-chat.js +275 -0
  516. package/dist/summary.d.ts +33 -0
  517. package/dist/summary.js +71 -0
  518. package/dist/supervisor.mjs +297 -0
  519. package/dist/surface.d.ts +63 -0
  520. package/dist/surface.js +352 -0
  521. package/dist/sync.d.ts +94 -0
  522. package/dist/sync.js +279 -0
  523. package/dist/task-composer.d.ts +13 -0
  524. package/dist/task-composer.js +52 -0
  525. package/dist/task-control.d.ts +165 -0
  526. package/dist/task-control.js +214 -0
  527. package/dist/task-outcome-cli.d.ts +10 -0
  528. package/dist/task-outcome-cli.js +92 -0
  529. package/dist/task-text.d.ts +30 -0
  530. package/dist/task-text.js +41 -0
  531. package/dist/team-cli.d.ts +15 -0
  532. package/dist/team-cli.js +618 -0
  533. package/dist/team-contract.d.ts +92 -0
  534. package/dist/team-contract.js +1 -0
  535. package/dist/team-http.d.ts +17 -0
  536. package/dist/team-http.js +144 -0
  537. package/dist/team-leads.d.ts +81 -0
  538. package/dist/team-leads.js +565 -0
  539. package/dist/team-runtime.d.ts +27 -0
  540. package/dist/team-runtime.js +264 -0
  541. package/dist/team-ui.d.ts +3 -0
  542. package/dist/team-ui.js +9 -0
  543. package/dist/team-updates.d.ts +8 -0
  544. package/dist/team-updates.js +57 -0
  545. package/dist/teammate-admin.d.ts +53 -0
  546. package/dist/teammate-admin.js +111 -0
  547. package/dist/teammate-desk.d.ts +60 -0
  548. package/dist/teammate-desk.js +154 -0
  549. package/dist/teammate-memory.d.ts +64 -0
  550. package/dist/teammate-memory.js +196 -0
  551. package/dist/teammate-question.d.ts +59 -0
  552. package/dist/teammate-question.js +175 -0
  553. package/dist/teammate-tools.d.ts +108 -0
  554. package/dist/teammate-tools.js +271 -0
  555. package/dist/teammate-week.d.ts +68 -0
  556. package/dist/teammate-week.js +132 -0
  557. package/dist/teammate-work.d.ts +76 -0
  558. package/dist/teammate-work.js +280 -0
  559. package/dist/teammates-ui.d.ts +20 -0
  560. package/dist/teammates-ui.js +166 -0
  561. package/dist/teammates.d.ts +180 -0
  562. package/dist/teammates.js +253 -0
  563. package/dist/teams-api.d.ts +33 -0
  564. package/dist/teams-api.js +204 -0
  565. package/dist/teams-chat.d.ts +26 -0
  566. package/dist/teams-chat.js +215 -0
  567. package/dist/teams-settings.d.ts +12 -0
  568. package/dist/teams-settings.js +57 -0
  569. package/dist/teams.d.ts +21 -0
  570. package/dist/teams.js +124 -0
  571. package/dist/telegram-flow.d.ts +49 -0
  572. package/dist/telegram-flow.js +110 -0
  573. package/dist/telegram-mate.d.ts +137 -0
  574. package/dist/telegram-mate.js +707 -0
  575. package/dist/telegram-progress.d.ts +14 -0
  576. package/dist/telegram-progress.js +129 -0
  577. package/dist/telegram-settings.d.ts +9 -0
  578. package/dist/telegram-settings.js +36 -0
  579. package/dist/telegram-status.d.ts +75 -0
  580. package/dist/telegram-status.js +265 -0
  581. package/dist/telegram-team.d.ts +85 -0
  582. package/dist/telegram-team.js +359 -0
  583. package/dist/telegram.d.ts +230 -0
  584. package/dist/telegram.js +1931 -0
  585. package/dist/templates.d.ts +65 -0
  586. package/dist/templates.js +118 -0
  587. package/dist/tool-launcher.d.ts +1 -0
  588. package/dist/tool-launcher.js +101 -0
  589. package/dist/tools-ui.d.ts +30 -0
  590. package/dist/tools-ui.js +40 -0
  591. package/dist/transitions-recipes.d.ts +1 -0
  592. package/dist/transitions-recipes.js +203 -0
  593. package/dist/tree-proof.d.ts +34 -0
  594. package/dist/tree-proof.js +58 -0
  595. package/dist/verification-evidence.d.ts +44 -0
  596. package/dist/verification-evidence.js +238 -0
  597. package/dist/version.d.ts +2 -0
  598. package/dist/version.js +10 -0
  599. package/dist/webhooks.d.ts +91 -0
  600. package/dist/webhooks.js +283 -0
  601. package/dist/work-index.d.ts +68 -0
  602. package/dist/work-index.js +384 -0
  603. package/dist/work-summary.d.ts +57 -0
  604. package/dist/work-summary.js +116 -0
  605. package/dist/workspace-motion.d.ts +4 -0
  606. package/dist/workspace-motion.js +133 -0
  607. package/dist/workspace-revision.d.ts +19 -0
  608. package/dist/workspace-revision.js +92 -0
  609. package/dist/workspace-ui.d.ts +204 -0
  610. package/dist/workspace-ui.js +411 -0
  611. package/dist/worktree-notices.d.ts +13 -0
  612. package/dist/worktree-notices.js +17 -0
  613. package/dist/worktree.d.ts +249 -0
  614. package/dist/worktree.js +720 -0
  615. package/package.json +122 -0
  616. package/scripts/canary-assertions.mjs +42 -0
  617. package/scripts/crash-canary.mjs +253 -0
  618. package/scripts/fixtures/crash-process.mjs +74 -0
  619. package/scripts/fixtures/pilot-scenarios.mjs +85 -0
  620. package/scripts/fixtures/restart-service.mjs +27 -0
  621. package/scripts/launchd-certification.mjs +143 -0
  622. package/scripts/pilot.mjs +121 -0
  623. package/scripts/proof-preflight.mjs +140 -0
  624. package/scripts/provider-canary.mjs +379 -0
  625. package/scripts/recovery-canary.mjs +135 -0
  626. package/scripts/restart-certification.mjs +98 -0
@@ -0,0 +1,65 @@
1
+ /**
2
+ * The template library (adoption track, step 2) — common standing orders
3
+ * shipped as STATIC DATA that renders into editable, UNAPPROVED drafts.
4
+ *
5
+ * What a template is: a pre-filled form. What it is not: automation with
6
+ * authority. Applying one produces exactly the rows a manual filing
7
+ * produces — through the same one door (proposal.ts), with the same
8
+ * validators, landing unapproved — and the apply output says so in
9
+ * capitals, because `--file` must never read as a yes.
10
+ *
11
+ * The Codex adoption review (finding 10) drew the v1 line: templates may
12
+ * express ONLY what a task or routine proposal can carry today. The two
13
+ * use cases that imply separate authenticated authority — GitHub issue
14
+ * intake (a grant) and CI babysitting (publish + the repair button) —
15
+ * ship as RECIPES: they display the existing ceremonies, and cannot be
16
+ * applied, because a template must never create a grant, enable
17
+ * autonomous repair, or touch provider configuration.
18
+ *
19
+ * Deliberately no versioning story: an applied draft is a COPY. Editing
20
+ * this library later changes nothing anybody filed.
21
+ */
22
+ import type { AcceptanceCriterion } from "./scope.js";
23
+ export type TaskTemplate = {
24
+ kind: "task";
25
+ name: string;
26
+ purpose: string;
27
+ title: string;
28
+ goal: string;
29
+ outOfScope: string | null;
30
+ touches: string[];
31
+ /** v39: baked in, like every other term — a template ships a signed
32
+ * rubric because it ships a scope, and a scope-producing road never
33
+ * gets to omit one. */
34
+ acceptance: AcceptanceCriterion[];
35
+ /** The fields most installations change — shown in `show` and preview. */
36
+ edit: string[];
37
+ };
38
+ export type RoutineTemplate = {
39
+ kind: "routine";
40
+ name: string;
41
+ purpose: string;
42
+ routineName: string;
43
+ goal: string;
44
+ outOfScope: string | null;
45
+ touches: string[];
46
+ acceptance: AcceptanceCriterion[];
47
+ requirements: string[];
48
+ schedule: string;
49
+ costCeilingUsd: number | null;
50
+ edit: string[];
51
+ };
52
+ export type RecipeTemplate = {
53
+ kind: "recipe";
54
+ name: string;
55
+ purpose: string;
56
+ /** Why this cannot be applied — the authority it would need. */
57
+ why: string;
58
+ steps: {
59
+ say: string;
60
+ run: string;
61
+ }[];
62
+ };
63
+ export type Template = TaskTemplate | RoutineTemplate | RecipeTemplate;
64
+ export declare const TEMPLATES: readonly Template[];
65
+ export declare function templateByName(name: string): Template | null;
@@ -0,0 +1,118 @@
1
+ /**
2
+ * The template library (adoption track, step 2) — common standing orders
3
+ * shipped as STATIC DATA that renders into editable, UNAPPROVED drafts.
4
+ *
5
+ * What a template is: a pre-filled form. What it is not: automation with
6
+ * authority. Applying one produces exactly the rows a manual filing
7
+ * produces — through the same one door (proposal.ts), with the same
8
+ * validators, landing unapproved — and the apply output says so in
9
+ * capitals, because `--file` must never read as a yes.
10
+ *
11
+ * The Codex adoption review (finding 10) drew the v1 line: templates may
12
+ * express ONLY what a task or routine proposal can carry today. The two
13
+ * use cases that imply separate authenticated authority — GitHub issue
14
+ * intake (a grant) and CI babysitting (publish + the repair button) —
15
+ * ship as RECIPES: they display the existing ceremonies, and cannot be
16
+ * applied, because a template must never create a grant, enable
17
+ * autonomous repair, or touch provider configuration.
18
+ *
19
+ * Deliberately no versioning story: an applied draft is a COPY. Editing
20
+ * this library later changes nothing anybody filed.
21
+ */
22
+ export const TEMPLATES = [
23
+ {
24
+ kind: "routine",
25
+ name: "nightly-deps",
26
+ purpose: "keep dependencies fresh without surprise majors",
27
+ routineName: "nightly-deps",
28
+ goal: "Update dependencies conservatively: refresh the lockfile within existing semver ranges, run the full test suite, and summarize what moved in the handoff — plus anything notable you saw (majors now available, security advisories, packages that look abandoned). If the suite fails after the refresh, park with the failure rather than pinning things until it passes.",
29
+ outOfScope: "No major version bumps. No edits to application code beyond what the lockfile refresh itself forces. No changes to CI configuration.",
30
+ touches: [],
31
+ acceptance: [
32
+ { id: "c1", statement: "The full test suite passes against the refreshed lockfile.", how: null, evidence: ["check"] },
33
+ ],
34
+ requirements: [],
35
+ schedule: "daily:03:30",
36
+ costCeilingUsd: null,
37
+ edit: ["schedule", "goal (name your package manager if it is unusual)", "ceiling (a weekly dollar cap)"],
38
+ },
39
+ {
40
+ kind: "routine",
41
+ name: "test-coverage",
42
+ purpose: "grow the test suite one module at a time",
43
+ routineName: "test-coverage",
44
+ goal: "Pick ONE module that is under-tested — no tests at all beats thin tests — and write focused tests for its observable behavior: inputs, outputs, and failure paths, not implementation details. One module per firing, then stop. If the module cannot be tested without refactoring it, do not refactor: park with a note naming the obstacle so a human can decide.",
45
+ outOfScope: "No refactoring of the code under test. No snapshot tests. No changes outside the chosen module's test file(s).",
46
+ touches: [],
47
+ acceptance: [
48
+ { id: "c1", statement: "The chosen module's new tests pass and exercise inputs, outputs, and failure paths.", how: null, evidence: ["check", "changed-path"] },
49
+ ],
50
+ requirements: [],
51
+ schedule: "daily:05:00",
52
+ costCeilingUsd: null,
53
+ edit: ["schedule", "touches (pin the test directory layout if yours is unusual)"],
54
+ },
55
+ {
56
+ kind: "routine",
57
+ name: "docs-drift",
58
+ purpose: "keep the README and docs telling the truth weekly",
59
+ routineName: "docs-drift",
60
+ goal: "Read the README and any docs/ pages against the code as it is today. Fix what has drifted: commands that moved, flags that changed, features that shipped undocumented, claims that stopped being true. Prefer deleting a stale claim over guessing a new one. Summarize every correction in the handoff.",
61
+ outOfScope: "No restructuring or rewriting for style. No new documentation pages. No changes to code.",
62
+ touches: ["README.md", "docs/"],
63
+ acceptance: [
64
+ { id: "c1", statement: "Every correction made is named in the handoff.", how: null, evidence: ["manual-review"] },
65
+ ],
66
+ requirements: [],
67
+ schedule: "every:10080",
68
+ costCeilingUsd: null,
69
+ edit: ["schedule (every:10080 is weekly)", "touches (add wherever else docs live)"],
70
+ },
71
+ {
72
+ kind: "task",
73
+ name: "lint-sweep",
74
+ purpose: "one clean sweep of mechanical violations",
75
+ title: "One lint-clean sweep",
76
+ goal: "Run the project's linter and typechecker. Fix every mechanical violation — unused imports, obvious type narrowings, formatting the tools can prove — and nothing judgment-shaped: no renames for taste, no restructuring, no behavior changes. If a rule demands a behavioral fix, list it in the handoff instead of fixing it.",
77
+ outOfScope: "No behavioral changes. No disabling or reconfiguring rules. No dependency changes.",
78
+ touches: [],
79
+ acceptance: [
80
+ { id: "c1", statement: "The linter and typechecker report no mechanical violations left to fix.", how: null, evidence: ["check"] },
81
+ ],
82
+ edit: ["goal (name your lint command if it is not the obvious one)", "touches (fence off generated code)"],
83
+ },
84
+ {
85
+ kind: "recipe",
86
+ name: "issue-intake",
87
+ purpose: "labeled GitHub issues become local proposals",
88
+ why: "Intake needs a GRANT — an authenticated act binding a GitHub repo, a label, and who may be listened to. A template cannot and must not create one.",
89
+ steps: [
90
+ {
91
+ say: "Grant intake for one repo + label (authenticated; restates its terms):",
92
+ run: "toolroll intake grant --repo <path> --github owner/name --label agent-ok --as <you> --token <t>",
93
+ },
94
+ { say: "See what would be imported, creating nothing:", run: "toolroll intake preview --repo <path>" },
95
+ {
96
+ say: "Create the missing proposals — local, unapproved, deduped; bodies are never imported:",
97
+ run: "toolroll intake run --repo <path>",
98
+ },
99
+ ],
100
+ },
101
+ {
102
+ kind: "recipe",
103
+ name: "ci-babysitter",
104
+ purpose: "watch published PRs and draft repairs when CI goes red",
105
+ why: "CI repair is deliberately a BUTTON on the run page while an observed red episode is open — one unapproved draft per PR, never an autonomous loop. A template cannot arm it.",
106
+ steps: [
107
+ { say: "Publication status and observed check states:", run: "toolroll publish status --repo <path>" },
108
+ { say: "The ranked review queue (console): observed-passing first, silence labeled as silence:", run: "open /review" },
109
+ {
110
+ say: "When a PR's checks are observed red, the run page offers 'draft repair task' — one click files ONE unapproved draft bound to the failing head.",
111
+ run: "open /r/<run-id>",
112
+ },
113
+ ],
114
+ },
115
+ ];
116
+ export function templateByName(name) {
117
+ return TEMPLATES.find(one => one.name === name) ?? null;
118
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,101 @@
1
+ /**
2
+ * The launcher a Codex build starts each project tool through (v80):
3
+ * `node tool-launcher.js <config.json>`. Codex hands its own environment
4
+ * to the agent's shell whatever `shell_environment_policy` says (checked
5
+ * against codex-cli 0.156), so a tool's secrets never ride Codex's
6
+ * environment: they sit in the run's private 0600 file, and this process
7
+ * gives them to exactly one server — as its environment for a local
8
+ * program, or as sign-in headers for a web server it relays to over stdio.
9
+ */
10
+ import { spawn } from "node:child_process";
11
+ import { readFileSync } from "node:fs";
12
+ import { createInterface } from "node:readline";
13
+ function runLocal(spec, values) {
14
+ const child = spawn(spec.command, spec.args, { env: { ...process.env, ...values }, stdio: "inherit" });
15
+ const forward = (signal) => { try {
16
+ child.kill(signal);
17
+ }
18
+ catch { /* gone */ } };
19
+ for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"])
20
+ process.on(signal, () => forward(signal));
21
+ child.on("error", error => { process.stderr.write(`the tool could not start: ${error.message}\n`); process.exit(127); });
22
+ child.on("exit", (code, signal) => process.exit(code ?? (signal === null ? 1 : 128)));
23
+ }
24
+ /** stdio ↔ streamable HTTP: each line from Codex is POSTed; JSON or event-stream answers go back as lines. */
25
+ function relayWeb(spec, values) {
26
+ const headers = { "content-type": "application/json", accept: "application/json, text/event-stream" };
27
+ if (spec.bearer !== null && values[spec.bearer])
28
+ headers["authorization"] = `Bearer ${values[spec.bearer]}`;
29
+ for (const [header, secret] of Object.entries(spec.headerSecrets))
30
+ if (values[secret])
31
+ headers[header] = values[secret];
32
+ let session = null;
33
+ let chain = Promise.resolve();
34
+ const out = (line) => { if (line.trim() !== "")
35
+ process.stdout.write(`${line.trim()}\n`); };
36
+ const post = async (line) => {
37
+ let id = null;
38
+ try {
39
+ id = JSON.parse(line).id ?? null;
40
+ }
41
+ catch {
42
+ return;
43
+ }
44
+ try {
45
+ const response = await fetch(spec.url, { method: "POST", headers: { ...headers, ...(session === null ? {} : { "mcp-session-id": session }) }, body: line });
46
+ session = response.headers.get("mcp-session-id") ?? session;
47
+ if (response.status === 202 || response.body === null)
48
+ return;
49
+ if ((response.headers.get("content-type") ?? "").includes("text/event-stream")) {
50
+ const reader = response.body.getReader();
51
+ const decoder = new TextDecoder();
52
+ let buffer = "";
53
+ for (;;) {
54
+ const { value, done } = await reader.read();
55
+ if (done)
56
+ break;
57
+ buffer += decoder.decode(value, { stream: true });
58
+ for (let end = buffer.indexOf("\n"); end >= 0; end = buffer.indexOf("\n")) {
59
+ const event = buffer.slice(0, end).replace(/\r$/, "");
60
+ buffer = buffer.slice(end + 1);
61
+ if (event.startsWith("data:"))
62
+ out(event.slice(5));
63
+ }
64
+ }
65
+ if (buffer.startsWith("data:"))
66
+ out(buffer.slice(5));
67
+ }
68
+ else {
69
+ const text = await response.text();
70
+ if (response.ok)
71
+ out(text);
72
+ else if (id !== null)
73
+ out(JSON.stringify({ jsonrpc: "2.0", id, error: { code: -32000, message: `The tool's server answered HTTP ${response.status}.` } }));
74
+ }
75
+ }
76
+ catch {
77
+ if (id !== null)
78
+ out(JSON.stringify({ jsonrpc: "2.0", id, error: { code: -32000, message: "The tool's server could not be reached." } }));
79
+ }
80
+ };
81
+ const lines = createInterface({ input: process.stdin });
82
+ lines.on("line", line => { chain = chain.then(() => post(line)); });
83
+ lines.on("close", () => { void chain.then(() => process.exit(0)); });
84
+ }
85
+ const file = process.argv[2];
86
+ if (file === undefined) {
87
+ process.stderr.write("usage: tool-launcher <config.json>\n");
88
+ process.exit(2);
89
+ }
90
+ let launch;
91
+ try {
92
+ launch = JSON.parse(readFileSync(file, "utf8"));
93
+ }
94
+ catch {
95
+ process.stderr.write("the tool's launch settings could not be read\n");
96
+ process.exit(2);
97
+ }
98
+ if (launch.spec.transport === "http")
99
+ relayWeb(launch.spec, launch.values);
100
+ else
101
+ runLocal(launch.spec, launch.values);
@@ -0,0 +1,30 @@
1
+ /** Settings → Tools: one project's MCP servers, in plain words. Secrets are
2
+ * entered here and nowhere else, and never shown again. */
3
+ import { type FoundTool, type ProjectTool, type ToolSpec } from "./project-tools.js";
4
+ export declare const TOOLS_CSS = ".tools{max-width:780px;min-width:0;overflow-wrap:anywhere}.tools .card{padding:16px 18px;margin:12px 0;min-width:0}.tools .card h2{font-size:1.05rem;margin:0;color:var(--so-ink);font-weight:600}.tools .tool-heading{display:flex;align-items:baseline;justify-content:space-between;gap:12px}.tools .tool-state{font-size:.85rem;flex-shrink:0;color:var(--so-muted)}.tools .tool-state[data-ready=\"false\"]{color:var(--so-warning)}.tools .card>p{margin:6px 0 0}.tools code{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;font-size:.85rem}.tools form{display:grid;gap:10px;margin:0}.tools label{display:grid;gap:6px}.tools input,.tools select{box-sizing:border-box;width:100%;max-width:100%;min-width:0}.tools button{justify-self:start;white-space:nowrap;min-height:44px}.tools details:not(.card){margin:6px 0 0;padding:0;border:0;border-radius:0;background:none;box-shadow:none}.tools details:not(.card)>summary{min-height:36px;display:flex;align-items:center;font-size:.9rem;color:var(--so-muted);cursor:pointer}.tools details:not(.card)[open]>summary{color:var(--so-ink)}.tools details.card>summary{cursor:pointer;min-height:44px;display:flex;align-items:center;font-weight:600}.tools summary{list-style:none;gap:10px}.tools summary::-webkit-details-marker{display:none}.tools summary::before{content:\"\";flex-shrink:0;width:6px;height:6px;margin:0 2px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(-45deg);transition:transform .15s}.tools details[open]>summary::before{transform:rotate(45deg)}.tools details:not(.card) form{padding:4px 0 10px}.tools .tool-facts{margin:0 0 8px;display:grid;gap:4px;font-size:.9rem}.tools .tool-facts p{margin:0}.tools .tool-controls{display:flex;gap:12px;flex-wrap:wrap;margin-top:12px}.tools .tool-found{display:flex;gap:10px;align-items:flex-start}.tools .tool-found input{flex:0 0 auto;width:18px;height:18px;margin-top:3px}.tools .tool-found span{min-width:0}.tools .problem{padding:10px 12px;margin:8px 0 0}.tools .tool-connect{scroll-margin-top:72px}.tools .connect-wanted{background:var(--so-accent);color:var(--so-on-accent);border-color:var(--so-accent)}.tools .connect-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:8px}.tools .connect-tile{display:grid;grid-template-columns:32px 1fr;column-gap:10px;align-items:center;justify-self:stretch;text-align:left;white-space:normal;padding:10px 12px;border:1px solid var(--so-line);border-radius:10px;background:var(--so-paper);color:var(--so-ink);min-height:60px;font:inherit;cursor:pointer;scroll-margin-top:96px}.tools .connect-tile:hover{border-color:var(--so-input-line);background:var(--so-raised)}.tools .connect-tile:target,.tools .connect-tile:focus-visible{outline:2px solid var(--so-accent);outline-offset:2px}.tools .connect-tile i{grid-row:span 2;width:32px;height:32px;border-radius:8px;display:grid;place-items:center;font-style:normal;font-weight:600;background:var(--so-neutral-soft);color:var(--so-neutral-ink)}.tools .connect-tile strong{font-weight:600;line-height:1.3}.tools .connect-tile span{font-size:.8rem;color:var(--so-muted);line-height:1.35;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.tools .connect-tile[data-state=\"connected\"] span{color:var(--so-success)}.tools .connect-tile:disabled{cursor:default;opacity:.6}@media(max-width:600px){.tools .connect-grid{grid-template-columns:1fr 1fr}.tools .connect-tile span{display:none}.tools .connect-tile{grid-template-columns:28px 1fr;min-height:52px;padding:8px 10px}.tools .connect-tile i{grid-row:auto;width:28px;height:28px}.tools input,.tools select{font-size:16px}.tools .card{padding:14px}.tools .tool-heading{align-items:flex-start}}";
5
+ export type ToolsView = {
6
+ repo: string;
7
+ project: string;
8
+ /** Services connected by signing in, and the kit a Connect came from, if any. */
9
+ connections: {
10
+ id: string;
11
+ label: string;
12
+ about: string;
13
+ state: "connected" | "open" | "taken";
14
+ }[];
15
+ kit: string | null;
16
+ /** The service a link asked for (a kit's checklist, the lead): its own button under the password. */
17
+ wanted: string | null;
18
+ tools: {
19
+ tool: ProjectTool;
20
+ secretsSet: string[];
21
+ }[];
22
+ catalog: (ToolSpec & {
23
+ label: string;
24
+ })[];
25
+ found: FoundTool[];
26
+ };
27
+ export declare function toolsHtml(view: ToolsView, csrf: string, canManage: boolean, message?: {
28
+ said?: string | null;
29
+ problem?: string | null;
30
+ }): string;
@@ -0,0 +1,40 @@
1
+ /** Settings → Tools: one project's MCP servers, in plain words. Secrets are
2
+ * entered here and nowhere else, and never shown again. */
3
+ import { toolCommandLine, toolStanding } from "./project-tools.js";
4
+ const e = (value) => String(value ?? "").replace(/[&<>"']/g, c => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[c]);
5
+ const hidden = (data) => Object.entries(data).map(([k, v]) => `<input type="hidden" name="${e(k)}" value="${e(v)}">`).join("");
6
+ export const TOOLS_CSS = `.tools{max-width:780px;min-width:0;overflow-wrap:anywhere}.tools .card{padding:16px 18px;margin:12px 0;min-width:0}.tools .card h2{font-size:1.05rem;margin:0;color:var(--so-ink);font-weight:600}.tools .tool-heading{display:flex;align-items:baseline;justify-content:space-between;gap:12px}.tools .tool-state{font-size:.85rem;flex-shrink:0;color:var(--so-muted)}.tools .tool-state[data-ready="false"]{color:var(--so-warning)}.tools .card>p{margin:6px 0 0}.tools code{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;font-size:.85rem}.tools form{display:grid;gap:10px;margin:0}.tools label{display:grid;gap:6px}.tools input,.tools select{box-sizing:border-box;width:100%;max-width:100%;min-width:0}.tools button{justify-self:start;white-space:nowrap;min-height:44px}.tools details:not(.card){margin:6px 0 0;padding:0;border:0;border-radius:0;background:none;box-shadow:none}.tools details:not(.card)>summary{min-height:36px;display:flex;align-items:center;font-size:.9rem;color:var(--so-muted);cursor:pointer}.tools details:not(.card)[open]>summary{color:var(--so-ink)}.tools details.card>summary{cursor:pointer;min-height:44px;display:flex;align-items:center;font-weight:600}.tools summary{list-style:none;gap:10px}.tools summary::-webkit-details-marker{display:none}.tools summary::before{content:"";flex-shrink:0;width:6px;height:6px;margin:0 2px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(-45deg);transition:transform .15s}.tools details[open]>summary::before{transform:rotate(45deg)}.tools details:not(.card) form{padding:4px 0 10px}.tools .tool-facts{margin:0 0 8px;display:grid;gap:4px;font-size:.9rem}.tools .tool-facts p{margin:0}.tools .tool-controls{display:flex;gap:12px;flex-wrap:wrap;margin-top:12px}.tools .tool-found{display:flex;gap:10px;align-items:flex-start}.tools .tool-found input{flex:0 0 auto;width:18px;height:18px;margin-top:3px}.tools .tool-found span{min-width:0}.tools .problem{padding:10px 12px;margin:8px 0 0}.tools .tool-connect{scroll-margin-top:72px}.tools .connect-wanted{background:var(--so-accent);color:var(--so-on-accent);border-color:var(--so-accent)}.tools .connect-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:8px}.tools .connect-tile{display:grid;grid-template-columns:32px 1fr;column-gap:10px;align-items:center;justify-self:stretch;text-align:left;white-space:normal;padding:10px 12px;border:1px solid var(--so-line);border-radius:10px;background:var(--so-paper);color:var(--so-ink);min-height:60px;font:inherit;cursor:pointer;scroll-margin-top:96px}.tools .connect-tile:hover{border-color:var(--so-input-line);background:var(--so-raised)}.tools .connect-tile:target,.tools .connect-tile:focus-visible{outline:2px solid var(--so-accent);outline-offset:2px}.tools .connect-tile i{grid-row:span 2;width:32px;height:32px;border-radius:8px;display:grid;place-items:center;font-style:normal;font-weight:600;background:var(--so-neutral-soft);color:var(--so-neutral-ink)}.tools .connect-tile strong{font-weight:600;line-height:1.3}.tools .connect-tile span{font-size:.8rem;color:var(--so-muted);line-height:1.35;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.tools .connect-tile[data-state="connected"] span{color:var(--so-success)}.tools .connect-tile:disabled{cursor:default;opacity:.6}@media(max-width:600px){.tools .connect-grid{grid-template-columns:1fr 1fr}.tools .connect-tile span{display:none}.tools .connect-tile{grid-template-columns:28px 1fr;min-height:52px;padding:8px 10px}.tools .connect-tile i{grid-row:auto;width:28px;height:28px}.tools input,.tools select{font-size:16px}.tools .card{padding:14px}.tools .tool-heading{align-items:flex-start}}`;
7
+ const password = '<label>Your Toolroll password<input type="password" name="password" autocomplete="current-password" required></label>';
8
+ function toolCard(one, base, manage) {
9
+ const { tool, secretsSet } = one;
10
+ const standing = toolStanding(tool, secretsSet);
11
+ // One line per secret: the disclosure is both where it stands and where it is set.
12
+ const secrets = manage ? tool.spec.secrets.map(secret => {
13
+ const set = secretsSet.includes(secret.name);
14
+ return `<details><summary>${set ? `Replace ${e(secret.name)}` : `Set ${e(secret.name)}${secret.optional ? " (optional)" : ""}`}</summary><form method="post" action="/settings/tools/change">${hidden({ ...base, action: "secret", name: tool.name, secret: secret.name })}<label>${e(secret.name)}<input type="password" name="value" autocomplete="off" required></label>${password}<button>Save</button></form></details>`;
15
+ }).join("") : "";
16
+ const tested = tool.lastTest?.ok ? `<p>Tested ${e(tool.lastTest.at.slice(0, 16).replace("T", " "))} UTC: ${e(tool.lastTest.tools.join(", ") || "it lists no tools")}</p>` : "";
17
+ const details = `<details><summary>Details</summary><div class="tool-facts"><p>Starts: <code>${e(toolCommandLine(tool.spec))}</code></p><p>From ${e(tool.source)} · added by ${e(tool.createdBy)}</p>${tested}</div></details>`;
18
+ const failed = tool.lastTest !== null && !tool.lastTest.ok ? `<p class="problem" role="status">${e(tool.lastTest.problem ?? "The last test failed.")}</p>` : "";
19
+ const controls = manage ? `<div class="tool-controls"><form method="post" action="/settings/tools/change">${hidden({ ...base, action: "test", name: tool.name })}<button>Test</button></form><form method="post" action="/settings/tools/change">${hidden({ ...base, action: "remove", name: tool.name })}<button class="secondary">Remove</button></form></div>` : "";
20
+ return `<article class="card" id="tool-${e(tool.name)}"><div class="tool-heading"><h2>${e(tool.name)}</h2><span class="tool-state" data-ready="${standing.ready}">${e(standing.words)}</span></div><p>${e(tool.spec.about)}</p>${failed}${secrets}${details}${controls}</article>`;
21
+ }
22
+ export function toolsHtml(view, csrf, canManage, message = {}) {
23
+ const manage = canManage && csrf !== "";
24
+ const base = { csrf, repo: view.repo };
25
+ const intro = `<p>Builds in ${e(view.project)} use exactly these tools. MCP servers set up elsewhere on this computer aren't used.</p><details><summary>How tools work</summary><ul><li>A tool you add reaches work you approve from now on. Approve a task again to give it a new tool.</li><li>Removing a tool takes it away from every build right away.</li><li>Secrets stay on this computer, are never shown again, and go only to the tool that needs them.</li><li>Reviewers and the lead chat never get tools. Gemini builds don't use tools yet.</li></ul></details>`;
26
+ const cards = view.tools.length === 0 ? '<p class="meta">No tools yet. Builds in this project get none.</p>' : view.tools.map(one => toolCard(one, base, manage)).join("");
27
+ const fromList = view.catalog.length === 0 ? "" : `<form method="post" action="/settings/tools/change">${hidden({ ...base, action: "add-catalog" })}<label>Common tools<select name="catalog">${view.catalog.map(one => `<option value="${e(one.name)}">${e(one.label)}: ${e(one.about)}</option>`).join("")}</select></label>${password}<button>Add</button></form>`;
28
+ const custom = `<details><summary>Add your own</summary><form method="post" action="/settings/tools/change">${hidden({ ...base, action: "add-custom" })}<label>Name<input name="name" pattern="[a-z0-9][a-z0-9_\\-]{0,39}" maxlength="40" required placeholder="for example: postgres"></label><label>It runs as<select name="transport"><option value="stdio">A program on this computer</option><option value="http">A web address</option></select></label><label>Command or address<input name="target" required placeholder="npx -y some-mcp-server@1.2.3, or https://…"></label><label>Secrets it needs (names, comma separated)<input name="secrets" placeholder="for example: DATABASE_URL"></label><p class="meta">For a web address, the first secret is sent as its sign-in token. Set each secret's value after adding.</p>${password}<button>Add</button></form></details>`;
29
+ // One click: sign in on the service's own page. The password is the same as for adding any tool.
30
+ const tiles = view.connections.map(one => one.state === "taken"
31
+ ? `<button type="button" class="connect-tile" id="connect-${e(one.id)}" data-state="taken" disabled><i aria-hidden="true">${e(one.label.charAt(0))}</i><strong>${e(one.label)}</strong><span>Added another way</span></button>`
32
+ : `<button name="service" value="${e(one.id)}" class="connect-tile" id="connect-${e(one.id)}" data-state="${one.state}"${one.state === "connected" ? ` aria-label="${e(one.label)}, connected. Sign in again"` : ""}><i aria-hidden="true">${e(one.label.charAt(0))}</i><strong>${e(one.label)}</strong><span>${one.state === "connected" ? "Connected" : e(one.about)}</span></button>`).join("");
33
+ const wanted = view.connections.find(one => one.id === view.wanted && one.state !== "taken");
34
+ const first = wanted === undefined ? "" : `<button name="service" value="${e(wanted.id)}" class="connect-wanted">${wanted.state === "connected" ? `Sign in to ${e(wanted.label)} again` : `Connect ${e(wanted.label)}`}</button>`;
35
+ const connect = manage && view.connections.length > 0 ? `<section class="card tool-connect" id="connect" aria-labelledby="connect-heading"><h2 id="connect-heading">Connect with one click</h2><form method="post" action="/settings/tools/connect">${hidden({ ...base, ...(view.kit === null ? {} : { kit: view.kit }) })}${password}${first}<div class="connect-grid">${tiles}</div></form></section>` : "";
36
+ const add = manage ? `<details class="card"${view.tools.length === 0 ? " open" : ""}><summary>Add a tool</summary>${fromList}${custom}</details>` : "";
37
+ const found = manage && view.found.length > 0 ? `<details class="card"><summary>Found on this computer (${view.found.length})</summary><p class="meta">MCP servers your other apps use. Adding one copies its settings, and any secrets it has, into this project.</p><form method="post" action="/settings/tools/change">${hidden({ ...base, action: "import" })}${view.found.map(one => `<label class="tool-found"><input type="checkbox" name="import" value="${e(one.spec.name)}"><span><strong>${e(one.spec.name)}</strong> · ${e(one.source)}<br><code>${e(toolCommandLine(one.spec))}</code>${one.spec.secrets.length === 0 ? "" : `<br><span class="meta">Brings ${e(one.spec.secrets.map(s => s.name).join(", "))}</span>`}</span></label>`).join("")}${password}<button>Add selected</button></form></details>` : "";
38
+ const note = message.problem ? `<p class="problem" role="alert">${e(message.problem)}</p>` : message.said ? `<p role="status">${e(message.said)}</p>` : "";
39
+ return `<section class="tools">${note}${intro}${cards}${connect}${add}${found}</section>`;
40
+ }
@@ -0,0 +1 @@
1
+ export declare const TRANSITIONS_CSS = "\n/* Transitions.dev \u2014 05-menu-dropdown.md */\n:root {\n --dropdown-open-dur: 250ms;\n --dropdown-close-dur: 150ms;\n --dropdown-pre-scale: 0.97;\n --dropdown-closing-scale: 0.99;\n --dropdown-ease: cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n.t-dropdown {\n transform-origin: top left;\n transform: scale(var(--dropdown-pre-scale));\n opacity: 0;\n pointer-events: none;\n transition:\n transform var(--dropdown-open-dur) var(--dropdown-ease),\n opacity var(--dropdown-open-dur) var(--dropdown-ease);\n will-change: transform, opacity;\n}\n.t-dropdown[data-origin=\"top-right\"] { transform-origin: top right; }\n.t-dropdown[data-origin=\"top-center\"] { transform-origin: top center; }\n.t-dropdown[data-origin=\"bottom-left\"] { transform-origin: bottom left; }\n.t-dropdown[data-origin=\"bottom-center\"] { transform-origin: bottom center; }\n.t-dropdown[data-origin=\"bottom-right\"] { transform-origin: bottom right; }\n\n.t-dropdown.is-open {\n transform: scale(1);\n opacity: 1;\n pointer-events: auto;\n}\n.t-dropdown.is-closing {\n transform: scale(var(--dropdown-closing-scale));\n opacity: 0;\n pointer-events: none;\n transition:\n transform var(--dropdown-close-dur) var(--dropdown-ease),\n opacity var(--dropdown-close-dur) var(--dropdown-ease);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .t-dropdown { transition: none !important; }\n}\n\n/* Transitions.dev \u2014 07-panel-reveal.md */\n:root {\n --panel-open-dur: 400ms;\n --panel-close-dur: 350ms;\n --panel-translate-y: 100px;\n --panel-blur: 2px;\n --panel-ease: cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n.t-panel-slide {\n transform: translateY(var(--panel-translate-y));\n opacity: 0;\n filter: blur(var(--panel-blur));\n pointer-events: none;\n transition:\n transform var(--panel-close-dur) var(--panel-ease),\n opacity var(--panel-close-dur) var(--panel-ease),\n filter var(--panel-close-dur) var(--panel-ease);\n will-change: transform, opacity, filter;\n}\n.t-panel-slide[data-open=\"true\"] {\n transform: translateY(0);\n opacity: 1;\n filter: blur(0);\n pointer-events: auto;\n transition:\n transform var(--panel-open-dur) var(--panel-ease),\n opacity var(--panel-open-dur) var(--panel-ease),\n filter var(--panel-open-dur) var(--panel-ease);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .t-panel-slide { transition: none !important; }\n}\n\n/* Transitions.dev \u2014 16-tabs-sliding.md */\n:root {\n --tabs-dur: 250ms;\n --tabs-ease: cubic-bezier(0.22, 1, 0.36, 1);\n --tabs-text-muted: rgba(15, 15, 15, 0.8);\n --tabs-text-active: #0f0f0f;\n --tabs-bar-bg: #f1f1f1;\n --tabs-pill-bg: #ffffff;\n}\n\n/* The bar is just a flex container with padding for the pill\n to sit inside. Tabs sit on z-index: 1, the pill on z-index: 0,\n so labels read above the pill background. */\n.t-tabs {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 3px;\n border-radius: 48px;\n background: var(--tabs-bar-bg);\n}\n.t-tab {\n position: relative;\n appearance: none;\n border: 0;\n background: transparent;\n height: 30px;\n padding: 4px 12px;\n color: var(--tabs-text-muted);\n cursor: pointer;\n border-radius: 48px;\n z-index: 1;\n transition: color var(--tabs-dur) var(--tabs-ease);\n}\n.t-tab:not([aria-selected=\"true\"]):hover,\n.t-tab[aria-selected=\"true\"] {\n color: var(--tabs-text-active);\n}\n\n/* The pill: width + transform are written inline by JS so\n the transition tweens between the previous and next\n measured positions. */\n.t-tabs-pill {\n position: absolute;\n top: 3px;\n left: 0;\n height: 30px;\n width: 0;\n background: var(--tabs-pill-bg);\n border-radius: 48px;\n transform: translateX(0);\n transition:\n transform var(--tabs-dur) var(--tabs-ease),\n width var(--tabs-dur) var(--tabs-ease);\n will-change: transform, width;\n z-index: 0;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .t-tabs-pill, .t-tab { transition: none !important; }\n}\n\n/* Transitions.dev \u2014 21-accordion.md */\n:root {\n --acc-expand: 250ms;\n --acc-collapse: 250ms;\n --acc-chevron: 250ms;\n --acc-ease: cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n/* grid-template-rows 0fr \u2192 1fr gives a clean height animation\n with no JS measurement; the inner element clips overflow. */\n.t-acc-panel {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows var(--acc-collapse) var(--acc-ease);\n}\n.t-acc[data-open=\"true\"] .t-acc-panel {\n grid-template-rows: 1fr;\n transition: grid-template-rows var(--acc-expand) var(--acc-ease);\n}\n.t-acc-panel-inner {\n overflow: hidden;\n opacity: 0;\n filter: blur(2px);\n transition:\n opacity var(--acc-collapse) var(--acc-ease),\n filter var(--acc-collapse) var(--acc-ease);\n}\n.t-acc[data-open=\"true\"] .t-acc-panel-inner {\n opacity: 1;\n filter: blur(0);\n transition:\n opacity var(--acc-expand) var(--acc-ease),\n filter var(--acc-expand) var(--acc-ease);\n}\n/* Flip the chevron vertically to turn the \"v\" into a \"^\".\n scaleY(-1) about the centre passes through a flat line at\n the midpoint (same look as a `d:` path morph) but animates\n in every browser, unlike CSS `d:` morphing (Chromium only).\n The chevron path is symmetric about the 16x16 viewBox\n centre, so the flip lands exactly on the \"^\"; non-scaling\n -stroke keeps the stroke width constant through the flip. */\n.t-acc-chevron {\n display: inline-flex;\n transform: scaleY(1);\n transform-origin: center;\n transition: transform var(--acc-chevron) var(--acc-ease);\n}\n.t-acc-chevron path { vector-effect: non-scaling-stroke; }\n.t-acc[data-open=\"true\"] .t-acc-chevron {\n transform: scaleY(-1);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .t-acc-panel, .t-acc-panel-inner, .t-acc-chevron {\n transition: none !important;\n }\n}\n";
@@ -0,0 +1,203 @@
1
+ // Selected portable recipes from https://github.com/Jakubantalik/transitions.dev
2
+ // Keep recipe CSS intact; Toolroll overrides and wiring live separately.
3
+ export const TRANSITIONS_CSS = `
4
+ /* Transitions.dev — 05-menu-dropdown.md */
5
+ :root {
6
+ --dropdown-open-dur: 250ms;
7
+ --dropdown-close-dur: 150ms;
8
+ --dropdown-pre-scale: 0.97;
9
+ --dropdown-closing-scale: 0.99;
10
+ --dropdown-ease: cubic-bezier(0.22, 1, 0.36, 1);
11
+ }
12
+
13
+ .t-dropdown {
14
+ transform-origin: top left;
15
+ transform: scale(var(--dropdown-pre-scale));
16
+ opacity: 0;
17
+ pointer-events: none;
18
+ transition:
19
+ transform var(--dropdown-open-dur) var(--dropdown-ease),
20
+ opacity var(--dropdown-open-dur) var(--dropdown-ease);
21
+ will-change: transform, opacity;
22
+ }
23
+ .t-dropdown[data-origin="top-right"] { transform-origin: top right; }
24
+ .t-dropdown[data-origin="top-center"] { transform-origin: top center; }
25
+ .t-dropdown[data-origin="bottom-left"] { transform-origin: bottom left; }
26
+ .t-dropdown[data-origin="bottom-center"] { transform-origin: bottom center; }
27
+ .t-dropdown[data-origin="bottom-right"] { transform-origin: bottom right; }
28
+
29
+ .t-dropdown.is-open {
30
+ transform: scale(1);
31
+ opacity: 1;
32
+ pointer-events: auto;
33
+ }
34
+ .t-dropdown.is-closing {
35
+ transform: scale(var(--dropdown-closing-scale));
36
+ opacity: 0;
37
+ pointer-events: none;
38
+ transition:
39
+ transform var(--dropdown-close-dur) var(--dropdown-ease),
40
+ opacity var(--dropdown-close-dur) var(--dropdown-ease);
41
+ }
42
+
43
+ @media (prefers-reduced-motion: reduce) {
44
+ .t-dropdown { transition: none !important; }
45
+ }
46
+
47
+ /* Transitions.dev — 07-panel-reveal.md */
48
+ :root {
49
+ --panel-open-dur: 400ms;
50
+ --panel-close-dur: 350ms;
51
+ --panel-translate-y: 100px;
52
+ --panel-blur: 2px;
53
+ --panel-ease: cubic-bezier(0.22, 1, 0.36, 1);
54
+ }
55
+
56
+ .t-panel-slide {
57
+ transform: translateY(var(--panel-translate-y));
58
+ opacity: 0;
59
+ filter: blur(var(--panel-blur));
60
+ pointer-events: none;
61
+ transition:
62
+ transform var(--panel-close-dur) var(--panel-ease),
63
+ opacity var(--panel-close-dur) var(--panel-ease),
64
+ filter var(--panel-close-dur) var(--panel-ease);
65
+ will-change: transform, opacity, filter;
66
+ }
67
+ .t-panel-slide[data-open="true"] {
68
+ transform: translateY(0);
69
+ opacity: 1;
70
+ filter: blur(0);
71
+ pointer-events: auto;
72
+ transition:
73
+ transform var(--panel-open-dur) var(--panel-ease),
74
+ opacity var(--panel-open-dur) var(--panel-ease),
75
+ filter var(--panel-open-dur) var(--panel-ease);
76
+ }
77
+
78
+ @media (prefers-reduced-motion: reduce) {
79
+ .t-panel-slide { transition: none !important; }
80
+ }
81
+
82
+ /* Transitions.dev — 16-tabs-sliding.md */
83
+ :root {
84
+ --tabs-dur: 250ms;
85
+ --tabs-ease: cubic-bezier(0.22, 1, 0.36, 1);
86
+ --tabs-text-muted: rgba(15, 15, 15, 0.8);
87
+ --tabs-text-active: #0f0f0f;
88
+ --tabs-bar-bg: #f1f1f1;
89
+ --tabs-pill-bg: #ffffff;
90
+ }
91
+
92
+ /* The bar is just a flex container with padding for the pill
93
+ to sit inside. Tabs sit on z-index: 1, the pill on z-index: 0,
94
+ so labels read above the pill background. */
95
+ .t-tabs {
96
+ position: relative;
97
+ display: inline-flex;
98
+ align-items: center;
99
+ gap: 3px;
100
+ padding: 3px;
101
+ border-radius: 48px;
102
+ background: var(--tabs-bar-bg);
103
+ }
104
+ .t-tab {
105
+ position: relative;
106
+ appearance: none;
107
+ border: 0;
108
+ background: transparent;
109
+ height: 30px;
110
+ padding: 4px 12px;
111
+ color: var(--tabs-text-muted);
112
+ cursor: pointer;
113
+ border-radius: 48px;
114
+ z-index: 1;
115
+ transition: color var(--tabs-dur) var(--tabs-ease);
116
+ }
117
+ .t-tab:not([aria-selected="true"]):hover,
118
+ .t-tab[aria-selected="true"] {
119
+ color: var(--tabs-text-active);
120
+ }
121
+
122
+ /* The pill: width + transform are written inline by JS so
123
+ the transition tweens between the previous and next
124
+ measured positions. */
125
+ .t-tabs-pill {
126
+ position: absolute;
127
+ top: 3px;
128
+ left: 0;
129
+ height: 30px;
130
+ width: 0;
131
+ background: var(--tabs-pill-bg);
132
+ border-radius: 48px;
133
+ transform: translateX(0);
134
+ transition:
135
+ transform var(--tabs-dur) var(--tabs-ease),
136
+ width var(--tabs-dur) var(--tabs-ease);
137
+ will-change: transform, width;
138
+ z-index: 0;
139
+ pointer-events: none;
140
+ }
141
+
142
+ @media (prefers-reduced-motion: reduce) {
143
+ .t-tabs-pill, .t-tab { transition: none !important; }
144
+ }
145
+
146
+ /* Transitions.dev — 21-accordion.md */
147
+ :root {
148
+ --acc-expand: 250ms;
149
+ --acc-collapse: 250ms;
150
+ --acc-chevron: 250ms;
151
+ --acc-ease: cubic-bezier(0.22, 1, 0.36, 1);
152
+ }
153
+
154
+ /* grid-template-rows 0fr → 1fr gives a clean height animation
155
+ with no JS measurement; the inner element clips overflow. */
156
+ .t-acc-panel {
157
+ display: grid;
158
+ grid-template-rows: 0fr;
159
+ transition: grid-template-rows var(--acc-collapse) var(--acc-ease);
160
+ }
161
+ .t-acc[data-open="true"] .t-acc-panel {
162
+ grid-template-rows: 1fr;
163
+ transition: grid-template-rows var(--acc-expand) var(--acc-ease);
164
+ }
165
+ .t-acc-panel-inner {
166
+ overflow: hidden;
167
+ opacity: 0;
168
+ filter: blur(2px);
169
+ transition:
170
+ opacity var(--acc-collapse) var(--acc-ease),
171
+ filter var(--acc-collapse) var(--acc-ease);
172
+ }
173
+ .t-acc[data-open="true"] .t-acc-panel-inner {
174
+ opacity: 1;
175
+ filter: blur(0);
176
+ transition:
177
+ opacity var(--acc-expand) var(--acc-ease),
178
+ filter var(--acc-expand) var(--acc-ease);
179
+ }
180
+ /* Flip the chevron vertically to turn the "v" into a "^".
181
+ scaleY(-1) about the centre passes through a flat line at
182
+ the midpoint (same look as a \`d:\` path morph) but animates
183
+ in every browser, unlike CSS \`d:\` morphing (Chromium only).
184
+ The chevron path is symmetric about the 16x16 viewBox
185
+ centre, so the flip lands exactly on the "^"; non-scaling
186
+ -stroke keeps the stroke width constant through the flip. */
187
+ .t-acc-chevron {
188
+ display: inline-flex;
189
+ transform: scaleY(1);
190
+ transform-origin: center;
191
+ transition: transform var(--acc-chevron) var(--acc-ease);
192
+ }
193
+ .t-acc-chevron path { vector-effect: non-scaling-stroke; }
194
+ .t-acc[data-open="true"] .t-acc-chevron {
195
+ transform: scaleY(-1);
196
+ }
197
+
198
+ @media (prefers-reduced-motion: reduce) {
199
+ .t-acc-panel, .t-acc-panel-inner, .t-acc-chevron {
200
+ transition: none !important;
201
+ }
202
+ }
203
+ `;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The read-only roles' clean-tree proof (planner, scout — mate arc §10,
3
+ * v4 review finding 4). `git status --porcelain` alone is not a proof: it
4
+ * omits IGNORED paths, so an agent could leave a generated file behind
5
+ * and pass; and a pathname filter that exempts the protocol files
6
+ * regardless of index status would let an agent `git add` its own
7
+ * handoff and pass with a dirty index. So: ignored paths are snapshotted
8
+ * BEFORE the agent runs and any new one afterwards is foreign; and a
9
+ * protocol file is admitted only as plain untracked (`??`) — staged is
10
+ * foreign. Ignored directories are collapsed by git (`!! build/`), so a
11
+ * write INTO a directory that was already ignored before the agent ran
12
+ * (a dependency tree the setup command produced) is not detected — that
13
+ * residual is stated here rather than wished away.
14
+ */
15
+ import type { Runner } from "./builder.js";
16
+ /** The ignored paths git reports right now — the "before" of a proof. */
17
+ export declare function snapshotIgnored(git: Runner, cwd: string): Promise<Set<string> | null>;
18
+ export type TreeProof = {
19
+ ok: true;
20
+ } | {
21
+ ok: false;
22
+ reason: "git" | "dirty-tree";
23
+ foreign: string[];
24
+ };
25
+ /**
26
+ * Everything in the tree that is not (a) an ignored path that was already
27
+ * ignored before, (b) one of this attempt's own protocol files as PLAIN
28
+ * untracked, or (c) the pool's untracked lease marker.
29
+ */
30
+ export declare function proveTreeUntouched(git: Runner, cwd: string, args: {
31
+ ignoredBefore: ReadonlySet<string>;
32
+ protocolFiles: readonly string[];
33
+ marker: string;
34
+ }): Promise<TreeProof>;