factory-factory 0.1.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 (655) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +177 -0
  3. package/dist/client/assets/_baseUniq-CEWTr5A3.js +1 -0
  4. package/dist/client/assets/arc-BT6PnV3g.js +1 -0
  5. package/dist/client/assets/architectureDiagram-VXUJARFQ-BTQ09GhI.js +36 -0
  6. package/dist/client/assets/blockDiagram-VD42YOAC-CSTIi_S_.js +122 -0
  7. package/dist/client/assets/c4Diagram-YG6GDRKO-BJwO03Pg.js +10 -0
  8. package/dist/client/assets/channel-DZXx08Q5.js +1 -0
  9. package/dist/client/assets/chunk-4BX2VUAB-DvhKC4oO.js +1 -0
  10. package/dist/client/assets/chunk-55IACEB6-DKnQAkk-.js +1 -0
  11. package/dist/client/assets/chunk-B4BG7PRW-DI470WJo.js +165 -0
  12. package/dist/client/assets/chunk-DI55MBZ5-CYVtbky6.js +220 -0
  13. package/dist/client/assets/chunk-FMBD7UC4-Dw7uUrif.js +15 -0
  14. package/dist/client/assets/chunk-QN33PNHL-B1O9h01P.js +1 -0
  15. package/dist/client/assets/chunk-QZHKN3VN-EF2nkGZu.js +1 -0
  16. package/dist/client/assets/chunk-TZMSLE5B-MdJIaxR8.js +1 -0
  17. package/dist/client/assets/classDiagram-2ON5EDUG-CJjqssfy.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-WZHVMYZB-CJjqssfy.js +1 -0
  19. package/dist/client/assets/clone-Cbn2C3Vf.js +1 -0
  20. package/dist/client/assets/cose-bilkent-S5V4N54A-B-JLDSzU.js +1 -0
  21. package/dist/client/assets/cytoscape.esm-5J0xJHOV.js +321 -0
  22. package/dist/client/assets/dagre-6UL2VRFP-Dixw870s.js +4 -0
  23. package/dist/client/assets/defaultLocale-DX6XiGOO.js +1 -0
  24. package/dist/client/assets/diagram-PSM6KHXK-DlWXZXMp.js +24 -0
  25. package/dist/client/assets/diagram-QEK2KX5R-D91m_YLv.js +43 -0
  26. package/dist/client/assets/diagram-S2PKOQOG-NpPCZxiK.js +24 -0
  27. package/dist/client/assets/erDiagram-Q2GNP2WA-BMnORxC_.js +60 -0
  28. package/dist/client/assets/flowDiagram-NV44I4VS-Dm3EeWoS.js +162 -0
  29. package/dist/client/assets/ganttDiagram-JELNMOA3-fLMptK1a.js +267 -0
  30. package/dist/client/assets/gitGraphDiagram-NY62KEGX-xB7NT2eZ.js +65 -0
  31. package/dist/client/assets/graph-DN3wB-AH.js +1 -0
  32. package/dist/client/assets/index-Ci14MvQ6.js +379 -0
  33. package/dist/client/assets/index-CxiZFewN.css +1 -0
  34. package/dist/client/assets/infoDiagram-WHAUD3N6-DJpjmiwp.js +2 -0
  35. package/dist/client/assets/init-Gi6I4Gst.js +1 -0
  36. package/dist/client/assets/journeyDiagram-XKPGCS4Q-CLwIJ-ZW.js +139 -0
  37. package/dist/client/assets/kanban-definition-3W4ZIXB7-TJV37HHm.js +89 -0
  38. package/dist/client/assets/katex-DhXJpUyf.js +261 -0
  39. package/dist/client/assets/layout-BTmLOTwi.js +1 -0
  40. package/dist/client/assets/linear-DW3u-GbE.js +1 -0
  41. package/dist/client/assets/min-BO4DeCt4.js +1 -0
  42. package/dist/client/assets/mindmap-definition-VGOIOE7T-BlEdGkMQ.js +68 -0
  43. package/dist/client/assets/ordinal-Cboi1Yqb.js +1 -0
  44. package/dist/client/assets/pieDiagram-ADFJNKIX-CwO8jqs_.js +30 -0
  45. package/dist/client/assets/quadrantDiagram-AYHSOK5B-BrcwzhE9.js +7 -0
  46. package/dist/client/assets/requirementDiagram-UZGBJVZJ-DevAd9qX.js +64 -0
  47. package/dist/client/assets/sankeyDiagram-TZEHDZUN-DtCF0Arf.js +10 -0
  48. package/dist/client/assets/sequenceDiagram-WL72ISMW-BS9POkF8.js +145 -0
  49. package/dist/client/assets/stateDiagram-FKZM4ZOC-MyAN5caA.js +1 -0
  50. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-CAhHhSgs.js +1 -0
  51. package/dist/client/assets/terminal-instance-kwfCyhkM.js +1 -0
  52. package/dist/client/assets/timeline-definition-IT6M3QCI-BXRKCZwK.js +61 -0
  53. package/dist/client/assets/treemap-KMMF4GRG-Dqwbp84g.js +128 -0
  54. package/dist/client/assets/xychartDiagram-PRI3JC2R-dNxFEavc.js +7 -0
  55. package/dist/client/favicon.svg +5 -0
  56. package/dist/client/index.html +29 -0
  57. package/dist/client/logo-full-dark.svg +10 -0
  58. package/dist/client/logo-full.svg +10 -0
  59. package/dist/client/logo.svg +6 -0
  60. package/dist/prisma/generated/browser.d.ts +11 -0
  61. package/dist/prisma/generated/browser.d.ts.map +1 -0
  62. package/dist/prisma/generated/browser.js +5 -0
  63. package/dist/prisma/generated/browser.js.map +1 -0
  64. package/dist/prisma/generated/client.d.ts +15 -0
  65. package/dist/prisma/generated/client.d.ts.map +1 -0
  66. package/dist/prisma/generated/client.js +10 -0
  67. package/dist/prisma/generated/client.js.map +1 -0
  68. package/dist/prisma/generated/commonInputTypes.d.ts +507 -0
  69. package/dist/prisma/generated/commonInputTypes.d.ts.map +1 -0
  70. package/dist/prisma/generated/commonInputTypes.js +2 -0
  71. package/dist/prisma/generated/commonInputTypes.js.map +1 -0
  72. package/dist/prisma/generated/enums.d.ts +44 -0
  73. package/dist/prisma/generated/enums.d.ts.map +1 -0
  74. package/dist/prisma/generated/enums.js +39 -0
  75. package/dist/prisma/generated/enums.js.map +1 -0
  76. package/dist/prisma/generated/internal/class.d.ts +51 -0
  77. package/dist/prisma/generated/internal/class.d.ts.map +1 -0
  78. package/dist/prisma/generated/internal/class.js +31 -0
  79. package/dist/prisma/generated/internal/class.js.map +1 -0
  80. package/dist/prisma/generated/internal/prismaNamespace.d.ts +818 -0
  81. package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -0
  82. package/dist/prisma/generated/internal/prismaNamespace.js +131 -0
  83. package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -0
  84. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +127 -0
  85. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -0
  86. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +115 -0
  87. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -0
  88. package/dist/prisma/generated/models/ClaudeSession.d.ts +745 -0
  89. package/dist/prisma/generated/models/ClaudeSession.d.ts.map +1 -0
  90. package/dist/prisma/generated/models/ClaudeSession.js +2 -0
  91. package/dist/prisma/generated/models/ClaudeSession.js.map +1 -0
  92. package/dist/prisma/generated/models/DecisionLog.d.ts +428 -0
  93. package/dist/prisma/generated/models/DecisionLog.d.ts.map +1 -0
  94. package/dist/prisma/generated/models/DecisionLog.js +2 -0
  95. package/dist/prisma/generated/models/DecisionLog.js.map +1 -0
  96. package/dist/prisma/generated/models/Project.d.ts +843 -0
  97. package/dist/prisma/generated/models/Project.d.ts.map +1 -0
  98. package/dist/prisma/generated/models/Project.js +2 -0
  99. package/dist/prisma/generated/models/Project.js.map +1 -0
  100. package/dist/prisma/generated/models/TerminalSession.d.ts +640 -0
  101. package/dist/prisma/generated/models/TerminalSession.d.ts.map +1 -0
  102. package/dist/prisma/generated/models/TerminalSession.js +2 -0
  103. package/dist/prisma/generated/models/TerminalSession.js.map +1 -0
  104. package/dist/prisma/generated/models/UserSettings.d.ts +428 -0
  105. package/dist/prisma/generated/models/UserSettings.d.ts.map +1 -0
  106. package/dist/prisma/generated/models/UserSettings.js +2 -0
  107. package/dist/prisma/generated/models/UserSettings.js.map +1 -0
  108. package/dist/prisma/generated/models/Workspace.d.ts +1883 -0
  109. package/dist/prisma/generated/models/Workspace.d.ts.map +1 -0
  110. package/dist/prisma/generated/models/Workspace.js +2 -0
  111. package/dist/prisma/generated/models/Workspace.js.map +1 -0
  112. package/dist/prisma/generated/models.d.ts +8 -0
  113. package/dist/prisma/generated/models.d.ts.map +1 -0
  114. package/dist/prisma/generated/models.js +2 -0
  115. package/dist/prisma/generated/models.js.map +1 -0
  116. package/dist/prompts/quick-actions/fetch-rebase.md +15 -0
  117. package/dist/prompts/quick-actions/rename-branch.md +15 -0
  118. package/dist/prompts/quick-actions/review.md +11 -0
  119. package/dist/prompts/quick-actions/simplify.md +7 -0
  120. package/dist/prompts/workflows/bugfix.md +57 -0
  121. package/dist/prompts/workflows/explore.md +54 -0
  122. package/dist/prompts/workflows/feature.md +54 -0
  123. package/dist/prompts/workflows/followup.md +32 -0
  124. package/dist/src/backend/agents/process-adapter.d.ts +99 -0
  125. package/dist/src/backend/agents/process-adapter.d.ts.map +1 -0
  126. package/dist/src/backend/agents/process-adapter.js +224 -0
  127. package/dist/src/backend/agents/process-adapter.js.map +1 -0
  128. package/dist/src/backend/claude/index.d.ts +81 -0
  129. package/dist/src/backend/claude/index.d.ts.map +1 -0
  130. package/dist/src/backend/claude/index.js +249 -0
  131. package/dist/src/backend/claude/index.js.map +1 -0
  132. package/dist/src/backend/claude/permissions.d.ts +67 -0
  133. package/dist/src/backend/claude/permissions.d.ts.map +1 -0
  134. package/dist/src/backend/claude/permissions.js +269 -0
  135. package/dist/src/backend/claude/permissions.js.map +1 -0
  136. package/dist/src/backend/claude/permissions.test.d.ts +2 -0
  137. package/dist/src/backend/claude/permissions.test.d.ts.map +1 -0
  138. package/dist/src/backend/claude/permissions.test.js +835 -0
  139. package/dist/src/backend/claude/permissions.test.js.map +1 -0
  140. package/dist/src/backend/claude/process.d.ts +117 -0
  141. package/dist/src/backend/claude/process.d.ts.map +1 -0
  142. package/dist/src/backend/claude/process.js +438 -0
  143. package/dist/src/backend/claude/process.js.map +1 -0
  144. package/dist/src/backend/claude/protocol.d.ts +57 -0
  145. package/dist/src/backend/claude/protocol.d.ts.map +1 -0
  146. package/dist/src/backend/claude/protocol.js +264 -0
  147. package/dist/src/backend/claude/protocol.js.map +1 -0
  148. package/dist/src/backend/claude/protocol.test.d.ts +2 -0
  149. package/dist/src/backend/claude/protocol.test.d.ts.map +1 -0
  150. package/dist/src/backend/claude/protocol.test.js +599 -0
  151. package/dist/src/backend/claude/protocol.test.js.map +1 -0
  152. package/dist/src/backend/claude/registry.d.ts +16 -0
  153. package/dist/src/backend/claude/registry.d.ts.map +1 -0
  154. package/dist/src/backend/claude/registry.js +21 -0
  155. package/dist/src/backend/claude/registry.js.map +1 -0
  156. package/dist/src/backend/claude/session.d.ts +29 -0
  157. package/dist/src/backend/claude/session.d.ts.map +1 -0
  158. package/dist/src/backend/claude/session.js +293 -0
  159. package/dist/src/backend/claude/session.js.map +1 -0
  160. package/dist/src/backend/claude/session.test.d.ts +2 -0
  161. package/dist/src/backend/claude/session.test.d.ts.map +1 -0
  162. package/dist/src/backend/claude/session.test.js +440 -0
  163. package/dist/src/backend/claude/session.test.js.map +1 -0
  164. package/dist/src/backend/claude/types/process-types.d.ts +7 -0
  165. package/dist/src/backend/claude/types/process-types.d.ts.map +1 -0
  166. package/dist/src/backend/claude/types/process-types.js +2 -0
  167. package/dist/src/backend/claude/types/process-types.js.map +1 -0
  168. package/dist/src/backend/claude/types.d.ts +345 -0
  169. package/dist/src/backend/claude/types.d.ts.map +1 -0
  170. package/dist/src/backend/claude/types.js +61 -0
  171. package/dist/src/backend/claude/types.js.map +1 -0
  172. package/dist/src/backend/claude/types.test.d.ts +2 -0
  173. package/dist/src/backend/claude/types.test.d.ts.map +1 -0
  174. package/dist/src/backend/claude/types.test.js +593 -0
  175. package/dist/src/backend/claude/types.test.js.map +1 -0
  176. package/dist/src/backend/clients/git.client.d.ts +50 -0
  177. package/dist/src/backend/clients/git.client.d.ts.map +1 -0
  178. package/dist/src/backend/clients/git.client.js +187 -0
  179. package/dist/src/backend/clients/git.client.js.map +1 -0
  180. package/dist/src/backend/clients/git.client.test.d.ts +2 -0
  181. package/dist/src/backend/clients/git.client.test.d.ts.map +1 -0
  182. package/dist/src/backend/clients/git.client.test.js +350 -0
  183. package/dist/src/backend/clients/git.client.test.js.map +1 -0
  184. package/dist/src/backend/clients/index.d.ts +2 -0
  185. package/dist/src/backend/clients/index.d.ts.map +1 -0
  186. package/dist/src/backend/clients/index.js +2 -0
  187. package/dist/src/backend/clients/index.js.map +1 -0
  188. package/dist/src/backend/constants/http.d.ts +10 -0
  189. package/dist/src/backend/constants/http.d.ts.map +1 -0
  190. package/dist/src/backend/constants/http.js +9 -0
  191. package/dist/src/backend/constants/http.js.map +1 -0
  192. package/dist/src/backend/constants/index.d.ts +3 -0
  193. package/dist/src/backend/constants/index.d.ts.map +1 -0
  194. package/dist/src/backend/constants/index.js +3 -0
  195. package/dist/src/backend/constants/index.js.map +1 -0
  196. package/dist/src/backend/constants/websocket.d.ts +8 -0
  197. package/dist/src/backend/constants/websocket.d.ts.map +1 -0
  198. package/dist/src/backend/constants/websocket.js +7 -0
  199. package/dist/src/backend/constants/websocket.js.map +1 -0
  200. package/dist/src/backend/db.d.ts +5 -0
  201. package/dist/src/backend/db.d.ts.map +1 -0
  202. package/dist/src/backend/db.js +36 -0
  203. package/dist/src/backend/db.js.map +1 -0
  204. package/dist/src/backend/index.d.ts +2 -0
  205. package/dist/src/backend/index.d.ts.map +1 -0
  206. package/dist/src/backend/index.js +33 -0
  207. package/dist/src/backend/index.js.map +1 -0
  208. package/dist/src/backend/interceptors/branch-rename.interceptor.d.ts +3 -0
  209. package/dist/src/backend/interceptors/branch-rename.interceptor.d.ts.map +1 -0
  210. package/dist/src/backend/interceptors/branch-rename.interceptor.js +44 -0
  211. package/dist/src/backend/interceptors/branch-rename.interceptor.js.map +1 -0
  212. package/dist/src/backend/interceptors/conversation-rename.interceptor.d.ts +3 -0
  213. package/dist/src/backend/interceptors/conversation-rename.interceptor.d.ts.map +1 -0
  214. package/dist/src/backend/interceptors/conversation-rename.interceptor.js +105 -0
  215. package/dist/src/backend/interceptors/conversation-rename.interceptor.js.map +1 -0
  216. package/dist/src/backend/interceptors/index.d.ts +4 -0
  217. package/dist/src/backend/interceptors/index.d.ts.map +1 -0
  218. package/dist/src/backend/interceptors/index.js +11 -0
  219. package/dist/src/backend/interceptors/index.js.map +1 -0
  220. package/dist/src/backend/interceptors/pr-detection.interceptor.d.ts +3 -0
  221. package/dist/src/backend/interceptors/pr-detection.interceptor.d.ts.map +1 -0
  222. package/dist/src/backend/interceptors/pr-detection.interceptor.js +58 -0
  223. package/dist/src/backend/interceptors/pr-detection.interceptor.js.map +1 -0
  224. package/dist/src/backend/interceptors/registry.d.ts +11 -0
  225. package/dist/src/backend/interceptors/registry.d.ts.map +1 -0
  226. package/dist/src/backend/interceptors/registry.js +51 -0
  227. package/dist/src/backend/interceptors/registry.js.map +1 -0
  228. package/dist/src/backend/interceptors/types.d.ts +22 -0
  229. package/dist/src/backend/interceptors/types.d.ts.map +1 -0
  230. package/dist/src/backend/interceptors/types.js +2 -0
  231. package/dist/src/backend/interceptors/types.js.map +1 -0
  232. package/dist/src/backend/lib/env.d.ts +4 -0
  233. package/dist/src/backend/lib/env.d.ts.map +1 -0
  234. package/dist/src/backend/lib/env.js +29 -0
  235. package/dist/src/backend/lib/env.js.map +1 -0
  236. package/dist/src/backend/lib/file-helpers.d.ts +10 -0
  237. package/dist/src/backend/lib/file-helpers.d.ts.map +1 -0
  238. package/dist/src/backend/lib/file-helpers.js +66 -0
  239. package/dist/src/backend/lib/file-helpers.js.map +1 -0
  240. package/dist/src/backend/lib/file-helpers.test.d.ts +2 -0
  241. package/dist/src/backend/lib/file-helpers.test.d.ts.map +1 -0
  242. package/dist/src/backend/lib/file-helpers.test.js +282 -0
  243. package/dist/src/backend/lib/file-helpers.test.js.map +1 -0
  244. package/dist/src/backend/lib/git-helpers.d.ts +19 -0
  245. package/dist/src/backend/lib/git-helpers.d.ts.map +1 -0
  246. package/dist/src/backend/lib/git-helpers.js +77 -0
  247. package/dist/src/backend/lib/git-helpers.js.map +1 -0
  248. package/dist/src/backend/lib/git-helpers.test.d.ts +2 -0
  249. package/dist/src/backend/lib/git-helpers.test.d.ts.map +1 -0
  250. package/dist/src/backend/lib/git-helpers.test.js +139 -0
  251. package/dist/src/backend/lib/git-helpers.test.js.map +1 -0
  252. package/dist/src/backend/lib/ide-helpers.d.ts +10 -0
  253. package/dist/src/backend/lib/ide-helpers.d.ts.map +1 -0
  254. package/dist/src/backend/lib/ide-helpers.js +90 -0
  255. package/dist/src/backend/lib/ide-helpers.js.map +1 -0
  256. package/dist/src/backend/lib/ide-helpers.test.d.ts +2 -0
  257. package/dist/src/backend/lib/ide-helpers.test.d.ts.map +1 -0
  258. package/dist/src/backend/lib/ide-helpers.test.js +202 -0
  259. package/dist/src/backend/lib/ide-helpers.test.js.map +1 -0
  260. package/dist/src/backend/lib/shell.d.ts +26 -0
  261. package/dist/src/backend/lib/shell.d.ts.map +1 -0
  262. package/dist/src/backend/lib/shell.js +87 -0
  263. package/dist/src/backend/lib/shell.js.map +1 -0
  264. package/dist/src/backend/middleware/cors.middleware.d.ts +3 -0
  265. package/dist/src/backend/middleware/cors.middleware.d.ts.map +1 -0
  266. package/dist/src/backend/middleware/cors.middleware.js +17 -0
  267. package/dist/src/backend/middleware/cors.middleware.js.map +1 -0
  268. package/dist/src/backend/middleware/index.d.ts +4 -0
  269. package/dist/src/backend/middleware/index.d.ts.map +1 -0
  270. package/dist/src/backend/middleware/index.js +4 -0
  271. package/dist/src/backend/middleware/index.js.map +1 -0
  272. package/dist/src/backend/middleware/middleware.test.d.ts +2 -0
  273. package/dist/src/backend/middleware/middleware.test.d.ts.map +1 -0
  274. package/dist/src/backend/middleware/middleware.test.js +295 -0
  275. package/dist/src/backend/middleware/middleware.test.js.map +1 -0
  276. package/dist/src/backend/middleware/request-logger.middleware.d.ts +3 -0
  277. package/dist/src/backend/middleware/request-logger.middleware.d.ts.map +1 -0
  278. package/dist/src/backend/middleware/request-logger.middleware.js +18 -0
  279. package/dist/src/backend/middleware/request-logger.middleware.js.map +1 -0
  280. package/dist/src/backend/middleware/security.middleware.d.ts +3 -0
  281. package/dist/src/backend/middleware/security.middleware.d.ts.map +1 -0
  282. package/dist/src/backend/middleware/security.middleware.js +8 -0
  283. package/dist/src/backend/middleware/security.middleware.js.map +1 -0
  284. package/dist/src/backend/migrate.d.ts +7 -0
  285. package/dist/src/backend/migrate.d.ts.map +1 -0
  286. package/dist/src/backend/migrate.js +76 -0
  287. package/dist/src/backend/migrate.js.map +1 -0
  288. package/dist/src/backend/prompts/branch-rename.d.ts +8 -0
  289. package/dist/src/backend/prompts/branch-rename.d.ts.map +1 -0
  290. package/dist/src/backend/prompts/branch-rename.js +25 -0
  291. package/dist/src/backend/prompts/branch-rename.js.map +1 -0
  292. package/dist/src/backend/prompts/quick-actions.d.ts +15 -0
  293. package/dist/src/backend/prompts/quick-actions.d.ts.map +1 -0
  294. package/dist/src/backend/prompts/quick-actions.js +109 -0
  295. package/dist/src/backend/prompts/quick-actions.js.map +1 -0
  296. package/dist/src/backend/prompts/workflows.d.ts +14 -0
  297. package/dist/src/backend/prompts/workflows.d.ts.map +1 -0
  298. package/dist/src/backend/prompts/workflows.js +92 -0
  299. package/dist/src/backend/prompts/workflows.js.map +1 -0
  300. package/dist/src/backend/prompts/workflows.test.d.ts +2 -0
  301. package/dist/src/backend/prompts/workflows.test.d.ts.map +1 -0
  302. package/dist/src/backend/prompts/workflows.test.js +127 -0
  303. package/dist/src/backend/prompts/workflows.test.js.map +1 -0
  304. package/dist/src/backend/resource_accessors/claude-session.accessor.d.ts +35 -0
  305. package/dist/src/backend/resource_accessors/claude-session.accessor.d.ts.map +1 -0
  306. package/dist/src/backend/resource_accessors/claude-session.accessor.js +53 -0
  307. package/dist/src/backend/resource_accessors/claude-session.accessor.js.map +1 -0
  308. package/dist/src/backend/resource_accessors/decision-log.accessor.d.ts +25 -0
  309. package/dist/src/backend/resource_accessors/decision-log.accessor.d.ts.map +1 -0
  310. package/dist/src/backend/resource_accessors/decision-log.accessor.js +87 -0
  311. package/dist/src/backend/resource_accessors/decision-log.accessor.js.map +1 -0
  312. package/dist/src/backend/resource_accessors/index.d.ts +7 -0
  313. package/dist/src/backend/resource_accessors/index.d.ts.map +1 -0
  314. package/dist/src/backend/resource_accessors/index.js +7 -0
  315. package/dist/src/backend/resource_accessors/index.js.map +1 -0
  316. package/dist/src/backend/resource_accessors/project.accessor.d.ts +63 -0
  317. package/dist/src/backend/resource_accessors/project.accessor.d.ts.map +1 -0
  318. package/dist/src/backend/resource_accessors/project.accessor.js +167 -0
  319. package/dist/src/backend/resource_accessors/project.accessor.js.map +1 -0
  320. package/dist/src/backend/resource_accessors/terminal-session.accessor.d.ts +33 -0
  321. package/dist/src/backend/resource_accessors/terminal-session.accessor.d.ts.map +1 -0
  322. package/dist/src/backend/resource_accessors/terminal-session.accessor.js +63 -0
  323. package/dist/src/backend/resource_accessors/terminal-session.accessor.js.map +1 -0
  324. package/dist/src/backend/resource_accessors/user-settings.accessor.d.ts +12 -0
  325. package/dist/src/backend/resource_accessors/user-settings.accessor.d.ts.map +1 -0
  326. package/dist/src/backend/resource_accessors/user-settings.accessor.js +33 -0
  327. package/dist/src/backend/resource_accessors/user-settings.accessor.js.map +1 -0
  328. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts +66 -0
  329. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts.map +1 -0
  330. package/dist/src/backend/resource_accessors/workspace.accessor.js +158 -0
  331. package/dist/src/backend/resource_accessors/workspace.accessor.js.map +1 -0
  332. package/dist/src/backend/routers/api/health.router.d.ts +3 -0
  333. package/dist/src/backend/routers/api/health.router.d.ts.map +1 -0
  334. package/dist/src/backend/routers/api/health.router.js +70 -0
  335. package/dist/src/backend/routers/api/health.router.js.map +1 -0
  336. package/dist/src/backend/routers/api/health.router.test.d.ts +2 -0
  337. package/dist/src/backend/routers/api/health.router.test.d.ts.map +1 -0
  338. package/dist/src/backend/routers/api/health.router.test.js +200 -0
  339. package/dist/src/backend/routers/api/health.router.test.js.map +1 -0
  340. package/dist/src/backend/routers/api/mcp.router.d.ts +3 -0
  341. package/dist/src/backend/routers/api/mcp.router.d.ts.map +1 -0
  342. package/dist/src/backend/routers/api/mcp.router.js +38 -0
  343. package/dist/src/backend/routers/api/mcp.router.js.map +1 -0
  344. package/dist/src/backend/routers/api/mcp.router.test.d.ts +2 -0
  345. package/dist/src/backend/routers/api/mcp.router.test.d.ts.map +1 -0
  346. package/dist/src/backend/routers/api/mcp.router.test.js +191 -0
  347. package/dist/src/backend/routers/api/mcp.router.test.js.map +1 -0
  348. package/dist/src/backend/routers/api/project.router.d.ts +3 -0
  349. package/dist/src/backend/routers/api/project.router.d.ts.map +1 -0
  350. package/dist/src/backend/routers/api/project.router.js +273 -0
  351. package/dist/src/backend/routers/api/project.router.js.map +1 -0
  352. package/dist/src/backend/routers/mcp/errors.d.ts +3 -0
  353. package/dist/src/backend/routers/mcp/errors.d.ts.map +1 -0
  354. package/dist/src/backend/routers/mcp/errors.js +14 -0
  355. package/dist/src/backend/routers/mcp/errors.js.map +1 -0
  356. package/dist/src/backend/routers/mcp/index.d.ts +5 -0
  357. package/dist/src/backend/routers/mcp/index.d.ts.map +1 -0
  358. package/dist/src/backend/routers/mcp/index.js +16 -0
  359. package/dist/src/backend/routers/mcp/index.js.map +1 -0
  360. package/dist/src/backend/routers/mcp/lock.mcp.d.ts +2 -0
  361. package/dist/src/backend/routers/mcp/lock.mcp.d.ts.map +1 -0
  362. package/dist/src/backend/routers/mcp/lock.mcp.js +105 -0
  363. package/dist/src/backend/routers/mcp/lock.mcp.js.map +1 -0
  364. package/dist/src/backend/routers/mcp/server.d.ts +9 -0
  365. package/dist/src/backend/routers/mcp/server.d.ts.map +1 -0
  366. package/dist/src/backend/routers/mcp/server.js +136 -0
  367. package/dist/src/backend/routers/mcp/server.js.map +1 -0
  368. package/dist/src/backend/routers/mcp/system.mcp.d.ts +2 -0
  369. package/dist/src/backend/routers/mcp/system.mcp.d.ts.map +1 -0
  370. package/dist/src/backend/routers/mcp/system.mcp.js +34 -0
  371. package/dist/src/backend/routers/mcp/system.mcp.js.map +1 -0
  372. package/dist/src/backend/routers/mcp/terminal.mcp.d.ts +2 -0
  373. package/dist/src/backend/routers/mcp/terminal.mcp.d.ts.map +1 -0
  374. package/dist/src/backend/routers/mcp/terminal.mcp.js +113 -0
  375. package/dist/src/backend/routers/mcp/terminal.mcp.js.map +1 -0
  376. package/dist/src/backend/routers/mcp/terminal.mcp.test.d.ts +2 -0
  377. package/dist/src/backend/routers/mcp/terminal.mcp.test.d.ts.map +1 -0
  378. package/dist/src/backend/routers/mcp/terminal.mcp.test.js +218 -0
  379. package/dist/src/backend/routers/mcp/terminal.mcp.test.js.map +1 -0
  380. package/dist/src/backend/routers/mcp/types.d.ts +37 -0
  381. package/dist/src/backend/routers/mcp/types.d.ts.map +1 -0
  382. package/dist/src/backend/routers/mcp/types.js +13 -0
  383. package/dist/src/backend/routers/mcp/types.js.map +1 -0
  384. package/dist/src/backend/routers/websocket/chat.handler.d.ts +7 -0
  385. package/dist/src/backend/routers/websocket/chat.handler.d.ts.map +1 -0
  386. package/dist/src/backend/routers/websocket/chat.handler.js +172 -0
  387. package/dist/src/backend/routers/websocket/chat.handler.js.map +1 -0
  388. package/dist/src/backend/routers/websocket/dev-logs.handler.d.ts +7 -0
  389. package/dist/src/backend/routers/websocket/dev-logs.handler.d.ts.map +1 -0
  390. package/dist/src/backend/routers/websocket/dev-logs.handler.js +64 -0
  391. package/dist/src/backend/routers/websocket/dev-logs.handler.js.map +1 -0
  392. package/dist/src/backend/routers/websocket/index.d.ts +4 -0
  393. package/dist/src/backend/routers/websocket/index.d.ts.map +1 -0
  394. package/dist/src/backend/routers/websocket/index.js +4 -0
  395. package/dist/src/backend/routers/websocket/index.js.map +1 -0
  396. package/dist/src/backend/routers/websocket/terminal.handler.d.ts +7 -0
  397. package/dist/src/backend/routers/websocket/terminal.handler.d.ts.map +1 -0
  398. package/dist/src/backend/routers/websocket/terminal.handler.js +268 -0
  399. package/dist/src/backend/routers/websocket/terminal.handler.js.map +1 -0
  400. package/dist/src/backend/server.d.ts +9 -0
  401. package/dist/src/backend/server.d.ts.map +1 -0
  402. package/dist/src/backend/server.js +165 -0
  403. package/dist/src/backend/server.js.map +1 -0
  404. package/dist/src/backend/services/chat-connection.service.d.ts +18 -0
  405. package/dist/src/backend/services/chat-connection.service.d.ts.map +1 -0
  406. package/dist/src/backend/services/chat-connection.service.js +66 -0
  407. package/dist/src/backend/services/chat-connection.service.js.map +1 -0
  408. package/dist/src/backend/services/chat-event-forwarder.service.d.ts +21 -0
  409. package/dist/src/backend/services/chat-event-forwarder.service.d.ts.map +1 -0
  410. package/dist/src/backend/services/chat-event-forwarder.service.js +246 -0
  411. package/dist/src/backend/services/chat-event-forwarder.service.js.map +1 -0
  412. package/dist/src/backend/services/chat-message-handlers.service.d.ts +60 -0
  413. package/dist/src/backend/services/chat-message-handlers.service.d.ts.map +1 -0
  414. package/dist/src/backend/services/chat-message-handlers.service.js +405 -0
  415. package/dist/src/backend/services/chat-message-handlers.service.js.map +1 -0
  416. package/dist/src/backend/services/cli-health.service.d.ts +22 -0
  417. package/dist/src/backend/services/cli-health.service.d.ts.map +1 -0
  418. package/dist/src/backend/services/cli-health.service.js +61 -0
  419. package/dist/src/backend/services/cli-health.service.js.map +1 -0
  420. package/dist/src/backend/services/config.service.d.ts +96 -0
  421. package/dist/src/backend/services/config.service.d.ts.map +1 -0
  422. package/dist/src/backend/services/config.service.js +229 -0
  423. package/dist/src/backend/services/config.service.js.map +1 -0
  424. package/dist/src/backend/services/factory-config.service.d.ts +16 -0
  425. package/dist/src/backend/services/factory-config.service.d.ts.map +1 -0
  426. package/dist/src/backend/services/factory-config.service.js +42 -0
  427. package/dist/src/backend/services/factory-config.service.js.map +1 -0
  428. package/dist/src/backend/services/file-lock.service.d.ts +93 -0
  429. package/dist/src/backend/services/file-lock.service.d.ts.map +1 -0
  430. package/dist/src/backend/services/file-lock.service.js +355 -0
  431. package/dist/src/backend/services/file-lock.service.js.map +1 -0
  432. package/dist/src/backend/services/file-lock.service.test.d.ts +2 -0
  433. package/dist/src/backend/services/file-lock.service.test.d.ts.map +1 -0
  434. package/dist/src/backend/services/file-lock.service.test.js +490 -0
  435. package/dist/src/backend/services/file-lock.service.test.js.map +1 -0
  436. package/dist/src/backend/services/github-cli.service.d.ts +72 -0
  437. package/dist/src/backend/services/github-cli.service.d.ts.map +1 -0
  438. package/dist/src/backend/services/github-cli.service.js +399 -0
  439. package/dist/src/backend/services/github-cli.service.js.map +1 -0
  440. package/dist/src/backend/services/index.d.ts +18 -0
  441. package/dist/src/backend/services/index.d.ts.map +1 -0
  442. package/dist/src/backend/services/index.js +18 -0
  443. package/dist/src/backend/services/index.js.map +1 -0
  444. package/dist/src/backend/services/kanban-state.service.d.ts +22 -0
  445. package/dist/src/backend/services/kanban-state.service.d.ts.map +1 -0
  446. package/dist/src/backend/services/kanban-state.service.js +94 -0
  447. package/dist/src/backend/services/kanban-state.service.js.map +1 -0
  448. package/dist/src/backend/services/kanban-state.service.test.d.ts +2 -0
  449. package/dist/src/backend/services/kanban-state.service.test.d.ts.map +1 -0
  450. package/dist/src/backend/services/kanban-state.service.test.js +204 -0
  451. package/dist/src/backend/services/kanban-state.service.test.js.map +1 -0
  452. package/dist/src/backend/services/logger.service.d.ts +29 -0
  453. package/dist/src/backend/services/logger.service.d.ts.map +1 -0
  454. package/dist/src/backend/services/logger.service.js +161 -0
  455. package/dist/src/backend/services/logger.service.js.map +1 -0
  456. package/dist/src/backend/services/message-queue.service.d.ts +21 -0
  457. package/dist/src/backend/services/message-queue.service.d.ts.map +1 -0
  458. package/dist/src/backend/services/message-queue.service.js +105 -0
  459. package/dist/src/backend/services/message-queue.service.js.map +1 -0
  460. package/dist/src/backend/services/message-queue.service.test.d.ts +2 -0
  461. package/dist/src/backend/services/message-queue.service.test.d.ts.map +1 -0
  462. package/dist/src/backend/services/message-queue.service.test.js +278 -0
  463. package/dist/src/backend/services/message-queue.service.test.js.map +1 -0
  464. package/dist/src/backend/services/notification.service.d.ts +22 -0
  465. package/dist/src/backend/services/notification.service.d.ts.map +1 -0
  466. package/dist/src/backend/services/notification.service.js +208 -0
  467. package/dist/src/backend/services/notification.service.js.map +1 -0
  468. package/dist/src/backend/services/port-allocation.service.d.ts +8 -0
  469. package/dist/src/backend/services/port-allocation.service.d.ts.map +1 -0
  470. package/dist/src/backend/services/port-allocation.service.js +36 -0
  471. package/dist/src/backend/services/port-allocation.service.js.map +1 -0
  472. package/dist/src/backend/services/port.service.d.ts +3 -0
  473. package/dist/src/backend/services/port.service.d.ts.map +1 -0
  474. package/dist/src/backend/services/port.service.js +48 -0
  475. package/dist/src/backend/services/port.service.js.map +1 -0
  476. package/dist/src/backend/services/port.service.test.d.ts +2 -0
  477. package/dist/src/backend/services/port.service.test.d.ts.map +1 -0
  478. package/dist/src/backend/services/port.service.test.js +140 -0
  479. package/dist/src/backend/services/port.service.test.js.map +1 -0
  480. package/dist/src/backend/services/rate-limiter.service.d.ts +38 -0
  481. package/dist/src/backend/services/rate-limiter.service.d.ts.map +1 -0
  482. package/dist/src/backend/services/rate-limiter.service.js +141 -0
  483. package/dist/src/backend/services/rate-limiter.service.js.map +1 -0
  484. package/dist/src/backend/services/reconciliation.service.d.ts +14 -0
  485. package/dist/src/backend/services/reconciliation.service.d.ts.map +1 -0
  486. package/dist/src/backend/services/reconciliation.service.js +125 -0
  487. package/dist/src/backend/services/reconciliation.service.js.map +1 -0
  488. package/dist/src/backend/services/reconciliation.service.test.d.ts +2 -0
  489. package/dist/src/backend/services/reconciliation.service.test.d.ts.map +1 -0
  490. package/dist/src/backend/services/reconciliation.service.test.js +231 -0
  491. package/dist/src/backend/services/reconciliation.service.test.js.map +1 -0
  492. package/dist/src/backend/services/run-script.service.d.ts +35 -0
  493. package/dist/src/backend/services/run-script.service.d.ts.map +1 -0
  494. package/dist/src/backend/services/run-script.service.js +349 -0
  495. package/dist/src/backend/services/run-script.service.js.map +1 -0
  496. package/dist/src/backend/services/scheduler.service.d.ts +21 -0
  497. package/dist/src/backend/services/scheduler.service.d.ts.map +1 -0
  498. package/dist/src/backend/services/scheduler.service.js +156 -0
  499. package/dist/src/backend/services/scheduler.service.js.map +1 -0
  500. package/dist/src/backend/services/scheduler.service.test.d.ts +2 -0
  501. package/dist/src/backend/services/scheduler.service.test.d.ts.map +1 -0
  502. package/dist/src/backend/services/scheduler.service.test.js +212 -0
  503. package/dist/src/backend/services/scheduler.service.test.js.map +1 -0
  504. package/dist/src/backend/services/server-instance.service.d.ts +6 -0
  505. package/dist/src/backend/services/server-instance.service.d.ts.map +1 -0
  506. package/dist/src/backend/services/server-instance.service.js +13 -0
  507. package/dist/src/backend/services/server-instance.service.js.map +1 -0
  508. package/dist/src/backend/services/session-file-logger.service.d.ts +12 -0
  509. package/dist/src/backend/services/session-file-logger.service.d.ts.map +1 -0
  510. package/dist/src/backend/services/session-file-logger.service.js +146 -0
  511. package/dist/src/backend/services/session-file-logger.service.js.map +1 -0
  512. package/dist/src/backend/services/session-file-logger.service.test.d.ts +2 -0
  513. package/dist/src/backend/services/session-file-logger.service.test.d.ts.map +1 -0
  514. package/dist/src/backend/services/session-file-logger.service.test.js +313 -0
  515. package/dist/src/backend/services/session-file-logger.service.test.js.map +1 -0
  516. package/dist/src/backend/services/session.service.d.ts +43 -0
  517. package/dist/src/backend/services/session.service.d.ts.map +1 -0
  518. package/dist/src/backend/services/session.service.js +290 -0
  519. package/dist/src/backend/services/session.service.js.map +1 -0
  520. package/dist/src/backend/services/startup-script.service.d.ts +26 -0
  521. package/dist/src/backend/services/startup-script.service.d.ts.map +1 -0
  522. package/dist/src/backend/services/startup-script.service.js +187 -0
  523. package/dist/src/backend/services/startup-script.service.js.map +1 -0
  524. package/dist/src/backend/services/terminal.service.d.ts +73 -0
  525. package/dist/src/backend/services/terminal.service.d.ts.map +1 -0
  526. package/dist/src/backend/services/terminal.service.js +303 -0
  527. package/dist/src/backend/services/terminal.service.js.map +1 -0
  528. package/dist/src/backend/services/workspace-state-machine.service.d.ts +27 -0
  529. package/dist/src/backend/services/workspace-state-machine.service.d.ts.map +1 -0
  530. package/dist/src/backend/services/workspace-state-machine.service.js +168 -0
  531. package/dist/src/backend/services/workspace-state-machine.service.js.map +1 -0
  532. package/dist/src/backend/services/workspace-state-machine.service.test.d.ts +2 -0
  533. package/dist/src/backend/services/workspace-state-machine.service.test.d.ts.map +1 -0
  534. package/dist/src/backend/services/workspace-state-machine.service.test.js +376 -0
  535. package/dist/src/backend/services/workspace-state-machine.service.test.js.map +1 -0
  536. package/dist/src/backend/testing/setup.d.ts +2 -0
  537. package/dist/src/backend/testing/setup.d.ts.map +1 -0
  538. package/dist/src/backend/testing/setup.js +8 -0
  539. package/dist/src/backend/testing/setup.js.map +1 -0
  540. package/dist/src/backend/trpc/admin.trpc.d.ts +135 -0
  541. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -0
  542. package/dist/src/backend/trpc/admin.trpc.js +182 -0
  543. package/dist/src/backend/trpc/admin.trpc.js.map +1 -0
  544. package/dist/src/backend/trpc/decision-log.trpc.d.ts +54 -0
  545. package/dist/src/backend/trpc/decision-log.trpc.d.ts.map +1 -0
  546. package/dist/src/backend/trpc/decision-log.trpc.js +30 -0
  547. package/dist/src/backend/trpc/decision-log.trpc.js.map +1 -0
  548. package/dist/src/backend/trpc/index.d.ts +1541 -0
  549. package/dist/src/backend/trpc/index.d.ts.map +1 -0
  550. package/dist/src/backend/trpc/index.js +20 -0
  551. package/dist/src/backend/trpc/index.js.map +1 -0
  552. package/dist/src/backend/trpc/pr-review.trpc.d.ts +70 -0
  553. package/dist/src/backend/trpc/pr-review.trpc.d.ts.map +1 -0
  554. package/dist/src/backend/trpc/pr-review.trpc.js +72 -0
  555. package/dist/src/backend/trpc/pr-review.trpc.js.map +1 -0
  556. package/dist/src/backend/trpc/procedures/index.d.ts +2 -0
  557. package/dist/src/backend/trpc/procedures/index.d.ts.map +1 -0
  558. package/dist/src/backend/trpc/procedures/index.js +2 -0
  559. package/dist/src/backend/trpc/procedures/index.js.map +1 -0
  560. package/dist/src/backend/trpc/procedures/project-scoped.d.ts +8 -0
  561. package/dist/src/backend/trpc/procedures/project-scoped.d.ts.map +1 -0
  562. package/dist/src/backend/trpc/procedures/project-scoped.js +18 -0
  563. package/dist/src/backend/trpc/procedures/project-scoped.js.map +1 -0
  564. package/dist/src/backend/trpc/project.trpc.d.ts +236 -0
  565. package/dist/src/backend/trpc/project.trpc.d.ts.map +1 -0
  566. package/dist/src/backend/trpc/project.trpc.js +112 -0
  567. package/dist/src/backend/trpc/project.trpc.js.map +1 -0
  568. package/dist/src/backend/trpc/session.trpc.d.ts +391 -0
  569. package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -0
  570. package/dist/src/backend/trpc/session.trpc.js +148 -0
  571. package/dist/src/backend/trpc/session.trpc.js.map +1 -0
  572. package/dist/src/backend/trpc/trpc.d.ts +18 -0
  573. package/dist/src/backend/trpc/trpc.d.ts.map +1 -0
  574. package/dist/src/backend/trpc/trpc.js +17 -0
  575. package/dist/src/backend/trpc/trpc.js.map +1 -0
  576. package/dist/src/backend/trpc/user-settings.trpc.d.ts +48 -0
  577. package/dist/src/backend/trpc/user-settings.trpc.d.ts.map +1 -0
  578. package/dist/src/backend/trpc/user-settings.trpc.js +56 -0
  579. package/dist/src/backend/trpc/user-settings.trpc.js.map +1 -0
  580. package/dist/src/backend/trpc/workspace/files.trpc.d.ts +37 -0
  581. package/dist/src/backend/trpc/workspace/files.trpc.d.ts.map +1 -0
  582. package/dist/src/backend/trpc/workspace/files.trpc.js +111 -0
  583. package/dist/src/backend/trpc/workspace/files.trpc.js.map +1 -0
  584. package/dist/src/backend/trpc/workspace/git.trpc.d.ts +61 -0
  585. package/dist/src/backend/trpc/workspace/git.trpc.d.ts.map +1 -0
  586. package/dist/src/backend/trpc/workspace/git.trpc.js +126 -0
  587. package/dist/src/backend/trpc/workspace/git.trpc.js.map +1 -0
  588. package/dist/src/backend/trpc/workspace/ide.trpc.d.ts +32 -0
  589. package/dist/src/backend/trpc/workspace/ide.trpc.d.ts.map +1 -0
  590. package/dist/src/backend/trpc/workspace/ide.trpc.js +61 -0
  591. package/dist/src/backend/trpc/workspace/ide.trpc.js.map +1 -0
  592. package/dist/src/backend/trpc/workspace/init.trpc.d.ts +85 -0
  593. package/dist/src/backend/trpc/workspace/init.trpc.d.ts.map +1 -0
  594. package/dist/src/backend/trpc/workspace/init.trpc.js +170 -0
  595. package/dist/src/backend/trpc/workspace/init.trpc.js.map +1 -0
  596. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts +52 -0
  597. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts.map +1 -0
  598. package/dist/src/backend/trpc/workspace/run-script.trpc.js +40 -0
  599. package/dist/src/backend/trpc/workspace/run-script.trpc.js.map +1 -0
  600. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +116 -0
  601. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts.map +1 -0
  602. package/dist/src/backend/trpc/workspace/workspace-helpers.js +56 -0
  603. package/dist/src/backend/trpc/workspace/workspace-helpers.js.map +1 -0
  604. package/dist/src/backend/trpc/workspace.trpc.d.ts +605 -0
  605. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -0
  606. package/dist/src/backend/trpc/workspace.trpc.js +270 -0
  607. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -0
  608. package/dist/src/backend/trpc/workspace.trpc.test.d.ts +2 -0
  609. package/dist/src/backend/trpc/workspace.trpc.test.d.ts.map +1 -0
  610. package/dist/src/backend/trpc/workspace.trpc.test.js +203 -0
  611. package/dist/src/backend/trpc/workspace.trpc.test.js.map +1 -0
  612. package/dist/src/backend/utils/conversation-analyzer.d.ts +4 -0
  613. package/dist/src/backend/utils/conversation-analyzer.d.ts.map +1 -0
  614. package/dist/src/backend/utils/conversation-analyzer.js +110 -0
  615. package/dist/src/backend/utils/conversation-analyzer.js.map +1 -0
  616. package/dist/src/backend/utils/conversation-analyzer.test.d.ts +2 -0
  617. package/dist/src/backend/utils/conversation-analyzer.test.d.ts.map +1 -0
  618. package/dist/src/backend/utils/conversation-analyzer.test.js +81 -0
  619. package/dist/src/backend/utils/conversation-analyzer.test.js.map +1 -0
  620. package/dist/src/cli/index.d.ts +3 -0
  621. package/dist/src/cli/index.d.ts.map +1 -0
  622. package/dist/src/cli/index.js +464 -0
  623. package/dist/src/cli/index.js.map +1 -0
  624. package/dist/src/lib/claude-types.d.ts +317 -0
  625. package/dist/src/lib/claude-types.d.ts.map +1 -0
  626. package/dist/src/lib/claude-types.js +351 -0
  627. package/dist/src/lib/claude-types.js.map +1 -0
  628. package/dist/src/shared/github-types.d.ts +69 -0
  629. package/dist/src/shared/github-types.d.ts.map +1 -0
  630. package/dist/src/shared/github-types.js +2 -0
  631. package/dist/src/shared/github-types.js.map +1 -0
  632. package/dist/src/shared/pending-request-types.d.ts +9 -0
  633. package/dist/src/shared/pending-request-types.d.ts.map +1 -0
  634. package/dist/src/shared/pending-request-types.js +2 -0
  635. package/dist/src/shared/pending-request-types.js.map +1 -0
  636. package/dist/tsconfig.backend.tsbuildinfo +1 -0
  637. package/package.json +200 -0
  638. package/prisma/migrations/20260127181600_init/migration.sql +119 -0
  639. package/prisma/migrations/20260128024701_add_pr_ci_status/migration.sql +39 -0
  640. package/prisma/migrations/20260129212214_add_composite_indexes/migration.sql +5 -0
  641. package/prisma/migrations/20260130134009_add_user_settings/migration.sql +15 -0
  642. package/prisma/migrations/20260130193212_add_workspace_run_script_fields/migration.sql +46 -0
  643. package/prisma/migrations/20260130212107_add_workspace_run_script_cleanup_field/migration.sql +2 -0
  644. package/prisma/migrations/20260131000000_consolidate_workspace_status/migration.sql +89 -0
  645. package/prisma/migrations/migration_lock.toml +3 -0
  646. package/prisma/schema.prisma +195 -0
  647. package/prompts/quick-actions/fetch-rebase.md +15 -0
  648. package/prompts/quick-actions/rename-branch.md +15 -0
  649. package/prompts/quick-actions/review.md +11 -0
  650. package/prompts/quick-actions/simplify.md +7 -0
  651. package/prompts/workflows/bugfix.md +57 -0
  652. package/prompts/workflows/explore.md +54 -0
  653. package/prompts/workflows/feature.md +54 -0
  654. package/prompts/workflows/followup.md +32 -0
  655. package/scripts/postinstall.mjs +63 -0
@@ -0,0 +1,835 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { AutoApproveHandler, AutoDenyHandler, createAllowResponse, createDenyResponse, createPreToolUseHookResponse, createStopHookResponse, DeferredHandler, EDIT_TOOLS, ModeBasedHandler, READ_ONLY_TOOLS, shouldAutoApprove, } from './permissions.js';
3
+ const canUseToolRequest = {
4
+ subtype: 'can_use_tool',
5
+ tool_name: 'Read',
6
+ input: { file_path: '/test.txt' },
7
+ tool_use_id: 'tool-123',
8
+ };
9
+ const bashToolRequest = {
10
+ subtype: 'can_use_tool',
11
+ tool_name: 'Bash',
12
+ input: { command: 'npm test' },
13
+ tool_use_id: 'tool-456',
14
+ };
15
+ const writeToolRequest = {
16
+ subtype: 'can_use_tool',
17
+ tool_name: 'Write',
18
+ input: { file_path: '/test.txt', content: 'hello' },
19
+ tool_use_id: 'tool-789',
20
+ };
21
+ const exitPlanModeRequest = {
22
+ subtype: 'can_use_tool',
23
+ tool_name: 'ExitPlanMode',
24
+ input: {},
25
+ tool_use_id: 'tool-exit',
26
+ };
27
+ const hookCallbackRequest = {
28
+ subtype: 'hook_callback',
29
+ callback_id: 'callback-123',
30
+ tool_use_id: 'tool-456',
31
+ input: {
32
+ session_id: 'session-123',
33
+ transcript_path: '/path/to/transcript',
34
+ cwd: '/project',
35
+ permission_mode: 'default',
36
+ hook_event_name: 'PreToolUse',
37
+ tool_name: 'Write',
38
+ tool_input: { file_path: '/test.txt' },
39
+ },
40
+ };
41
+ const stopHookRequest = {
42
+ subtype: 'hook_callback',
43
+ callback_id: 'stop-123',
44
+ input: {
45
+ session_id: 'session-123',
46
+ transcript_path: '/path/to/transcript',
47
+ cwd: '/project',
48
+ permission_mode: 'default',
49
+ hook_event_name: 'Stop',
50
+ stop_hook_active: true,
51
+ },
52
+ };
53
+ const hookWithoutToolName = {
54
+ subtype: 'hook_callback',
55
+ callback_id: 'callback-no-tool',
56
+ input: {
57
+ session_id: 'session-123',
58
+ transcript_path: '/path/to/transcript',
59
+ cwd: '/project',
60
+ permission_mode: 'default',
61
+ hook_event_name: 'PreToolUse',
62
+ },
63
+ };
64
+ describe('Tool Constants', () => {
65
+ describe('READ_ONLY_TOOLS', () => {
66
+ it('should contain Glob', () => {
67
+ expect(READ_ONLY_TOOLS.has('Glob')).toBe(true);
68
+ });
69
+ it('should contain Grep', () => {
70
+ expect(READ_ONLY_TOOLS.has('Grep')).toBe(true);
71
+ });
72
+ it('should contain Read', () => {
73
+ expect(READ_ONLY_TOOLS.has('Read')).toBe(true);
74
+ });
75
+ it('should contain NotebookRead', () => {
76
+ expect(READ_ONLY_TOOLS.has('NotebookRead')).toBe(true);
77
+ });
78
+ it('should contain Task', () => {
79
+ expect(READ_ONLY_TOOLS.has('Task')).toBe(true);
80
+ });
81
+ it('should contain TodoWrite', () => {
82
+ expect(READ_ONLY_TOOLS.has('TodoWrite')).toBe(true);
83
+ });
84
+ it('should contain TodoRead', () => {
85
+ expect(READ_ONLY_TOOLS.has('TodoRead')).toBe(true);
86
+ });
87
+ it('should not contain Write', () => {
88
+ expect(READ_ONLY_TOOLS.has('Write')).toBe(false);
89
+ });
90
+ it('should not contain Bash', () => {
91
+ expect(READ_ONLY_TOOLS.has('Bash')).toBe(false);
92
+ });
93
+ it('should have exactly 7 tools', () => {
94
+ expect(READ_ONLY_TOOLS.size).toBe(7);
95
+ });
96
+ });
97
+ describe('EDIT_TOOLS', () => {
98
+ it('should contain Write', () => {
99
+ expect(EDIT_TOOLS.has('Write')).toBe(true);
100
+ });
101
+ it('should contain Edit', () => {
102
+ expect(EDIT_TOOLS.has('Edit')).toBe(true);
103
+ });
104
+ it('should contain MultiEdit', () => {
105
+ expect(EDIT_TOOLS.has('MultiEdit')).toBe(true);
106
+ });
107
+ it('should contain UndoEdit', () => {
108
+ expect(EDIT_TOOLS.has('UndoEdit')).toBe(true);
109
+ });
110
+ it('should contain NotebookEdit', () => {
111
+ expect(EDIT_TOOLS.has('NotebookEdit')).toBe(true);
112
+ });
113
+ it('should not contain Bash', () => {
114
+ expect(EDIT_TOOLS.has('Bash')).toBe(false);
115
+ });
116
+ it('should not contain Read', () => {
117
+ expect(EDIT_TOOLS.has('Read')).toBe(false);
118
+ });
119
+ it('should have exactly 5 tools', () => {
120
+ expect(EDIT_TOOLS.size).toBe(5);
121
+ });
122
+ });
123
+ });
124
+ describe('shouldAutoApprove', () => {
125
+ describe('bypassPermissions mode', () => {
126
+ const mode = 'bypassPermissions';
127
+ it('should auto-approve Bash', () => {
128
+ expect(shouldAutoApprove(mode, 'Bash')).toBe(true);
129
+ });
130
+ it('should auto-approve Write', () => {
131
+ expect(shouldAutoApprove(mode, 'Write')).toBe(true);
132
+ });
133
+ it('should auto-approve Read', () => {
134
+ expect(shouldAutoApprove(mode, 'Read')).toBe(true);
135
+ });
136
+ it('should NOT auto-approve ExitPlanMode (interactive tool)', () => {
137
+ expect(shouldAutoApprove(mode, 'ExitPlanMode')).toBe(false);
138
+ });
139
+ it('should NOT auto-approve AskUserQuestion (interactive tool)', () => {
140
+ expect(shouldAutoApprove(mode, 'AskUserQuestion')).toBe(false);
141
+ });
142
+ it('should auto-approve any arbitrary tool', () => {
143
+ expect(shouldAutoApprove(mode, 'SomeRandomTool')).toBe(true);
144
+ });
145
+ });
146
+ describe('plan mode', () => {
147
+ const mode = 'plan';
148
+ it('should auto-approve Bash', () => {
149
+ expect(shouldAutoApprove(mode, 'Bash')).toBe(true);
150
+ });
151
+ it('should auto-approve Write', () => {
152
+ expect(shouldAutoApprove(mode, 'Write')).toBe(true);
153
+ });
154
+ it('should auto-approve Read', () => {
155
+ expect(shouldAutoApprove(mode, 'Read')).toBe(true);
156
+ });
157
+ it('should not auto-approve ExitPlanMode', () => {
158
+ expect(shouldAutoApprove(mode, 'ExitPlanMode')).toBe(false);
159
+ });
160
+ it('should auto-approve any other tool except ExitPlanMode', () => {
161
+ expect(shouldAutoApprove(mode, 'SomeRandomTool')).toBe(true);
162
+ });
163
+ });
164
+ describe('acceptEdits mode', () => {
165
+ const mode = 'acceptEdits';
166
+ it('should auto-approve Read (read-only)', () => {
167
+ expect(shouldAutoApprove(mode, 'Read')).toBe(true);
168
+ });
169
+ it('should auto-approve Glob (read-only)', () => {
170
+ expect(shouldAutoApprove(mode, 'Glob')).toBe(true);
171
+ });
172
+ it('should auto-approve Write (edit tool)', () => {
173
+ expect(shouldAutoApprove(mode, 'Write')).toBe(true);
174
+ });
175
+ it('should auto-approve Edit (edit tool)', () => {
176
+ expect(shouldAutoApprove(mode, 'Edit')).toBe(true);
177
+ });
178
+ it('should not auto-approve Bash', () => {
179
+ expect(shouldAutoApprove(mode, 'Bash')).toBe(false);
180
+ });
181
+ it('should not auto-approve unknown tools', () => {
182
+ expect(shouldAutoApprove(mode, 'SomeRandomTool')).toBe(false);
183
+ });
184
+ });
185
+ describe('default mode', () => {
186
+ const mode = 'default';
187
+ it('should auto-approve Read (read-only)', () => {
188
+ expect(shouldAutoApprove(mode, 'Read')).toBe(true);
189
+ });
190
+ it('should auto-approve Glob (read-only)', () => {
191
+ expect(shouldAutoApprove(mode, 'Glob')).toBe(true);
192
+ });
193
+ it('should auto-approve Grep (read-only)', () => {
194
+ expect(shouldAutoApprove(mode, 'Grep')).toBe(true);
195
+ });
196
+ it('should auto-approve Task (read-only)', () => {
197
+ expect(shouldAutoApprove(mode, 'Task')).toBe(true);
198
+ });
199
+ it('should not auto-approve Write', () => {
200
+ expect(shouldAutoApprove(mode, 'Write')).toBe(false);
201
+ });
202
+ it('should not auto-approve Edit', () => {
203
+ expect(shouldAutoApprove(mode, 'Edit')).toBe(false);
204
+ });
205
+ it('should not auto-approve Bash', () => {
206
+ expect(shouldAutoApprove(mode, 'Bash')).toBe(false);
207
+ });
208
+ it('should not auto-approve unknown tools', () => {
209
+ expect(shouldAutoApprove(mode, 'SomeRandomTool')).toBe(false);
210
+ });
211
+ });
212
+ });
213
+ describe('Helper Functions', () => {
214
+ describe('createAllowResponse', () => {
215
+ it('should return correct structure with empty updatedInput when not provided', () => {
216
+ const response = createAllowResponse();
217
+ expect(response).toEqual({ behavior: 'allow', updatedInput: {} });
218
+ });
219
+ it('should return correct structure with updatedInput', () => {
220
+ const updatedInput = { file_path: '/updated.txt' };
221
+ const response = createAllowResponse(updatedInput);
222
+ expect(response).toEqual({
223
+ behavior: 'allow',
224
+ updatedInput: { file_path: '/updated.txt' },
225
+ });
226
+ });
227
+ it('should use empty object when undefined is passed', () => {
228
+ const response = createAllowResponse(undefined);
229
+ expect(response).toEqual({ behavior: 'allow', updatedInput: {} });
230
+ expect('updatedInput' in response).toBe(true);
231
+ });
232
+ });
233
+ describe('createDenyResponse', () => {
234
+ it('should return correct structure with message only', () => {
235
+ const response = createDenyResponse('Permission denied');
236
+ expect(response).toEqual({
237
+ behavior: 'deny',
238
+ message: 'Permission denied',
239
+ });
240
+ });
241
+ it('should return correct structure with interrupt true', () => {
242
+ const response = createDenyResponse('Permission denied', true);
243
+ expect(response).toEqual({
244
+ behavior: 'deny',
245
+ message: 'Permission denied',
246
+ interrupt: true,
247
+ });
248
+ });
249
+ it('should return correct structure with interrupt false', () => {
250
+ const response = createDenyResponse('Permission denied', false);
251
+ expect(response).toEqual({
252
+ behavior: 'deny',
253
+ message: 'Permission denied',
254
+ interrupt: false,
255
+ });
256
+ });
257
+ it('should not include interrupt key when undefined', () => {
258
+ const response = createDenyResponse('Permission denied');
259
+ expect('interrupt' in response).toBe(false);
260
+ });
261
+ });
262
+ describe('createPreToolUseHookResponse', () => {
263
+ it('should return correct structure for allow decision', () => {
264
+ const response = createPreToolUseHookResponse('allow');
265
+ expect(response).toEqual({
266
+ hookSpecificOutput: {
267
+ hookEventName: 'PreToolUse',
268
+ permissionDecision: 'allow',
269
+ },
270
+ });
271
+ });
272
+ it('should return correct structure for deny decision', () => {
273
+ const response = createPreToolUseHookResponse('deny');
274
+ expect(response).toEqual({
275
+ hookSpecificOutput: {
276
+ hookEventName: 'PreToolUse',
277
+ permissionDecision: 'deny',
278
+ },
279
+ });
280
+ });
281
+ it('should return correct structure for ask decision', () => {
282
+ const response = createPreToolUseHookResponse('ask');
283
+ expect(response).toEqual({
284
+ hookSpecificOutput: {
285
+ hookEventName: 'PreToolUse',
286
+ permissionDecision: 'ask',
287
+ },
288
+ });
289
+ });
290
+ it('should include reason when provided', () => {
291
+ const response = createPreToolUseHookResponse('deny', 'Not allowed');
292
+ expect(response).toEqual({
293
+ hookSpecificOutput: {
294
+ hookEventName: 'PreToolUse',
295
+ permissionDecision: 'deny',
296
+ permissionDecisionReason: 'Not allowed',
297
+ },
298
+ });
299
+ });
300
+ it('should not include reason key when undefined', () => {
301
+ const response = createPreToolUseHookResponse('allow');
302
+ expect('permissionDecisionReason' in response.hookSpecificOutput).toBe(false);
303
+ });
304
+ });
305
+ describe('createStopHookResponse', () => {
306
+ it('should return correct structure for approve decision', () => {
307
+ const response = createStopHookResponse('approve');
308
+ expect(response).toEqual({ decision: 'approve' });
309
+ });
310
+ it('should return correct structure for block decision', () => {
311
+ const response = createStopHookResponse('block');
312
+ expect(response).toEqual({ decision: 'block' });
313
+ });
314
+ it('should include reason when provided', () => {
315
+ const response = createStopHookResponse('block', 'User blocked');
316
+ expect(response).toEqual({
317
+ decision: 'block',
318
+ reason: 'User blocked',
319
+ });
320
+ });
321
+ it('should not include reason key when undefined', () => {
322
+ const response = createStopHookResponse('approve');
323
+ expect('reason' in response).toBe(false);
324
+ });
325
+ });
326
+ });
327
+ describe('AutoApproveHandler', () => {
328
+ const handler = new AutoApproveHandler();
329
+ describe('onCanUseTool', () => {
330
+ it('should approve all tool requests with original input', async () => {
331
+ const response = await handler.onCanUseTool(canUseToolRequest);
332
+ expect(response).toEqual({
333
+ behavior: 'allow',
334
+ updatedInput: { file_path: '/test.txt' },
335
+ });
336
+ });
337
+ it('should approve Bash tool requests with original input', async () => {
338
+ const response = await handler.onCanUseTool(bashToolRequest);
339
+ expect(response).toEqual({
340
+ behavior: 'allow',
341
+ updatedInput: { command: 'npm test' },
342
+ });
343
+ });
344
+ it('should approve Write tool requests with original input', async () => {
345
+ const response = await handler.onCanUseTool(writeToolRequest);
346
+ expect(response).toEqual({
347
+ behavior: 'allow',
348
+ updatedInput: { file_path: '/test.txt', content: 'hello' },
349
+ });
350
+ });
351
+ });
352
+ describe('onPreToolUseHook', () => {
353
+ it('should allow all PreToolUse hooks', async () => {
354
+ const response = await handler.onPreToolUseHook(hookCallbackRequest);
355
+ expect(response).toEqual({
356
+ hookSpecificOutput: {
357
+ hookEventName: 'PreToolUse',
358
+ permissionDecision: 'allow',
359
+ },
360
+ });
361
+ });
362
+ });
363
+ describe('onStopHook', () => {
364
+ it('should approve all Stop hooks', async () => {
365
+ const response = await handler.onStopHook(stopHookRequest);
366
+ expect(response).toEqual({ decision: 'approve' });
367
+ });
368
+ });
369
+ });
370
+ describe('AutoDenyHandler', () => {
371
+ describe('with default message', () => {
372
+ const handler = new AutoDenyHandler();
373
+ it('should deny tool requests with default message', async () => {
374
+ const response = await handler.onCanUseTool(canUseToolRequest);
375
+ expect(response).toEqual({
376
+ behavior: 'deny',
377
+ message: 'Tool execution not allowed',
378
+ });
379
+ });
380
+ it('should deny PreToolUse hooks with default message', async () => {
381
+ const response = await handler.onPreToolUseHook(hookCallbackRequest);
382
+ expect(response).toEqual({
383
+ hookSpecificOutput: {
384
+ hookEventName: 'PreToolUse',
385
+ permissionDecision: 'deny',
386
+ permissionDecisionReason: 'Tool execution not allowed',
387
+ },
388
+ });
389
+ });
390
+ it('should block Stop hooks with default message', async () => {
391
+ const response = await handler.onStopHook(stopHookRequest);
392
+ expect(response).toEqual({
393
+ decision: 'block',
394
+ reason: 'Tool execution not allowed',
395
+ });
396
+ });
397
+ });
398
+ describe('with custom message', () => {
399
+ const customMessage = 'Read-only mode active';
400
+ const handler = new AutoDenyHandler(customMessage);
401
+ it('should deny tool requests with custom message', async () => {
402
+ const response = await handler.onCanUseTool(canUseToolRequest);
403
+ expect(response).toEqual({
404
+ behavior: 'deny',
405
+ message: customMessage,
406
+ });
407
+ });
408
+ it('should deny PreToolUse hooks with custom message', async () => {
409
+ const response = await handler.onPreToolUseHook(hookCallbackRequest);
410
+ expect(response).toEqual({
411
+ hookSpecificOutput: {
412
+ hookEventName: 'PreToolUse',
413
+ permissionDecision: 'deny',
414
+ permissionDecisionReason: customMessage,
415
+ },
416
+ });
417
+ });
418
+ it('should block Stop hooks with custom message', async () => {
419
+ const response = await handler.onStopHook(stopHookRequest);
420
+ expect(response).toEqual({
421
+ decision: 'block',
422
+ reason: customMessage,
423
+ });
424
+ });
425
+ });
426
+ });
427
+ describe('ModeBasedHandler', () => {
428
+ describe('default mode without onAsk', () => {
429
+ const handler = new ModeBasedHandler('default');
430
+ it('should auto-approve read-only tools with original input', async () => {
431
+ const response = await handler.onCanUseTool(canUseToolRequest);
432
+ expect(response).toEqual({
433
+ behavior: 'allow',
434
+ updatedInput: { file_path: '/test.txt' },
435
+ });
436
+ });
437
+ it('should deny non-read-only tools with message', async () => {
438
+ const response = await handler.onCanUseTool(bashToolRequest);
439
+ expect(response).toEqual({
440
+ behavior: 'deny',
441
+ message: "Tool 'Bash' requires manual approval",
442
+ });
443
+ });
444
+ it('should deny Write tool', async () => {
445
+ const response = await handler.onCanUseTool(writeToolRequest);
446
+ expect(response).toEqual({
447
+ behavior: 'deny',
448
+ message: "Tool 'Write' requires manual approval",
449
+ });
450
+ });
451
+ });
452
+ describe('default mode with onAsk callback', () => {
453
+ it('should call onAsk for non-auto-approved tools', async () => {
454
+ const onAsk = vi.fn().mockResolvedValue({ behavior: 'allow', updatedInput: {} });
455
+ const handler = new ModeBasedHandler('default', onAsk);
456
+ const response = await handler.onCanUseTool(bashToolRequest);
457
+ expect(onAsk).toHaveBeenCalledWith(bashToolRequest);
458
+ expect(response).toEqual({ behavior: 'allow', updatedInput: {} });
459
+ });
460
+ it('should not call onAsk for auto-approved tools', async () => {
461
+ const onAsk = vi.fn().mockResolvedValue({ behavior: 'allow', updatedInput: {} });
462
+ const handler = new ModeBasedHandler('default', onAsk);
463
+ await handler.onCanUseTool(canUseToolRequest);
464
+ expect(onAsk).not.toHaveBeenCalled();
465
+ });
466
+ });
467
+ describe('acceptEdits mode', () => {
468
+ const handler = new ModeBasedHandler('acceptEdits');
469
+ it('should auto-approve read-only tools with original input', async () => {
470
+ const response = await handler.onCanUseTool(canUseToolRequest);
471
+ expect(response).toEqual({
472
+ behavior: 'allow',
473
+ updatedInput: { file_path: '/test.txt' },
474
+ });
475
+ });
476
+ it('should auto-approve Write tool with original input', async () => {
477
+ const response = await handler.onCanUseTool(writeToolRequest);
478
+ expect(response).toEqual({
479
+ behavior: 'allow',
480
+ updatedInput: { file_path: '/test.txt', content: 'hello' },
481
+ });
482
+ });
483
+ it('should deny Bash tool', async () => {
484
+ const response = await handler.onCanUseTool(bashToolRequest);
485
+ expect(response).toEqual({
486
+ behavior: 'deny',
487
+ message: "Tool 'Bash' requires manual approval",
488
+ });
489
+ });
490
+ });
491
+ describe('plan mode', () => {
492
+ const handler = new ModeBasedHandler('plan');
493
+ it('should auto-approve all tools except ExitPlanMode with original input', async () => {
494
+ const response = await handler.onCanUseTool(bashToolRequest);
495
+ expect(response).toEqual({
496
+ behavior: 'allow',
497
+ updatedInput: { command: 'npm test' },
498
+ });
499
+ });
500
+ it('should deny ExitPlanMode', async () => {
501
+ const response = await handler.onCanUseTool(exitPlanModeRequest);
502
+ expect(response).toEqual({
503
+ behavior: 'deny',
504
+ message: "Tool 'ExitPlanMode' requires manual approval",
505
+ });
506
+ });
507
+ });
508
+ describe('bypassPermissions mode', () => {
509
+ const handler = new ModeBasedHandler('bypassPermissions');
510
+ it('should auto-approve all tools with original input', async () => {
511
+ const response = await handler.onCanUseTool(bashToolRequest);
512
+ expect(response).toEqual({
513
+ behavior: 'allow',
514
+ updatedInput: { command: 'npm test' },
515
+ });
516
+ });
517
+ it('should NOT auto-approve ExitPlanMode (interactive tool)', async () => {
518
+ const response = await handler.onCanUseTool(exitPlanModeRequest);
519
+ expect(response).toEqual({
520
+ behavior: 'deny',
521
+ message: "Tool 'ExitPlanMode' requires manual approval",
522
+ });
523
+ });
524
+ });
525
+ describe('onPreToolUseHook', () => {
526
+ const handler = new ModeBasedHandler('default');
527
+ it('should allow hooks for read-only tools', async () => {
528
+ const readHook = {
529
+ ...hookCallbackRequest,
530
+ input: { ...hookCallbackRequest.input, tool_name: 'Read' },
531
+ };
532
+ const response = await handler.onPreToolUseHook(readHook);
533
+ expect(response).toEqual({
534
+ hookSpecificOutput: {
535
+ hookEventName: 'PreToolUse',
536
+ permissionDecision: 'allow',
537
+ },
538
+ });
539
+ });
540
+ it('should ask for hooks for non-read-only tools', async () => {
541
+ const response = await handler.onPreToolUseHook(hookCallbackRequest);
542
+ expect(response).toEqual({
543
+ hookSpecificOutput: {
544
+ hookEventName: 'PreToolUse',
545
+ permissionDecision: 'ask',
546
+ permissionDecisionReason: "Tool 'Write' requires approval",
547
+ },
548
+ });
549
+ });
550
+ it('should ask when no tool name provided', async () => {
551
+ const response = await handler.onPreToolUseHook(hookWithoutToolName);
552
+ expect(response).toEqual({
553
+ hookSpecificOutput: {
554
+ hookEventName: 'PreToolUse',
555
+ permissionDecision: 'ask',
556
+ permissionDecisionReason: 'No tool name provided',
557
+ },
558
+ });
559
+ });
560
+ });
561
+ describe('onStopHook', () => {
562
+ const handler = new ModeBasedHandler('default');
563
+ it('should always approve Stop hooks', async () => {
564
+ const response = await handler.onStopHook(stopHookRequest);
565
+ expect(response).toEqual({ decision: 'approve' });
566
+ });
567
+ });
568
+ describe('setMode and getMode', () => {
569
+ it('should update the mode', () => {
570
+ const handler = new ModeBasedHandler('default');
571
+ expect(handler.getMode()).toBe('default');
572
+ handler.setMode('bypassPermissions');
573
+ expect(handler.getMode()).toBe('bypassPermissions');
574
+ });
575
+ it('should change behavior after setMode', async () => {
576
+ const handler = new ModeBasedHandler('default');
577
+ let response = await handler.onCanUseTool(bashToolRequest);
578
+ expect(response).toEqual({
579
+ behavior: 'deny',
580
+ message: "Tool 'Bash' requires manual approval",
581
+ });
582
+ handler.setMode('bypassPermissions');
583
+ response = await handler.onCanUseTool(bashToolRequest);
584
+ expect(response).toEqual({
585
+ behavior: 'allow',
586
+ updatedInput: { command: 'npm test' },
587
+ });
588
+ });
589
+ });
590
+ });
591
+ describe('DeferredHandler', () => {
592
+ let handler;
593
+ beforeEach(() => {
594
+ handler = new DeferredHandler({ timeout: 5000 });
595
+ });
596
+ afterEach(() => {
597
+ handler.cancelAll();
598
+ });
599
+ describe('event emission', () => {
600
+ it('should emit permission_request event for can_use_tool', async () => {
601
+ const eventHandler = vi.fn();
602
+ handler.on('permission_request', eventHandler);
603
+ const promise = handler.onCanUseTool(canUseToolRequest);
604
+ await new Promise((resolve) => setTimeout(resolve, 0));
605
+ expect(eventHandler).toHaveBeenCalledWith(canUseToolRequest, 'tool-123');
606
+ handler.approve('tool-123');
607
+ await promise;
608
+ });
609
+ it('should emit hook_request event for PreToolUse hooks', async () => {
610
+ const eventHandler = vi.fn();
611
+ handler.on('hook_request', eventHandler);
612
+ const promise = handler.onPreToolUseHook(hookCallbackRequest);
613
+ await new Promise((resolve) => setTimeout(resolve, 0));
614
+ expect(eventHandler).toHaveBeenCalledWith(hookCallbackRequest, 'callback-123');
615
+ handler.approve('callback-123');
616
+ await promise;
617
+ });
618
+ it('should emit stop_request event for Stop hooks', async () => {
619
+ const eventHandler = vi.fn();
620
+ handler.on('stop_request', eventHandler);
621
+ const promise = handler.onStopHook(stopHookRequest);
622
+ await new Promise((resolve) => setTimeout(resolve, 0));
623
+ expect(eventHandler).toHaveBeenCalledWith(stopHookRequest, 'stop-123');
624
+ handler.approve('stop-123');
625
+ await promise;
626
+ });
627
+ });
628
+ describe('approve', () => {
629
+ it('should resolve pending permission request with original tool input', async () => {
630
+ const promise = handler.onCanUseTool(canUseToolRequest);
631
+ await new Promise((resolve) => setTimeout(resolve, 0));
632
+ handler.approve('tool-123');
633
+ const response = await promise;
634
+ expect(response).toEqual({
635
+ behavior: 'allow',
636
+ updatedInput: { file_path: '/test.txt' },
637
+ });
638
+ });
639
+ it('should resolve pending permission request with updated input', async () => {
640
+ const promise = handler.onCanUseTool(canUseToolRequest);
641
+ await new Promise((resolve) => setTimeout(resolve, 0));
642
+ handler.approve('tool-123', { file_path: '/updated.txt' });
643
+ const response = await promise;
644
+ expect(response).toEqual({
645
+ behavior: 'allow',
646
+ updatedInput: { file_path: '/updated.txt' },
647
+ });
648
+ });
649
+ it('should resolve PreToolUse hook with allow response', async () => {
650
+ const promise = handler.onPreToolUseHook(hookCallbackRequest);
651
+ await new Promise((resolve) => setTimeout(resolve, 0));
652
+ handler.approve('callback-123');
653
+ const response = await promise;
654
+ expect(response).toEqual({
655
+ hookSpecificOutput: {
656
+ hookEventName: 'PreToolUse',
657
+ permissionDecision: 'allow',
658
+ },
659
+ });
660
+ });
661
+ it('should resolve Stop hook with approve response', async () => {
662
+ const promise = handler.onStopHook(stopHookRequest);
663
+ await new Promise((resolve) => setTimeout(resolve, 0));
664
+ handler.approve('stop-123');
665
+ const response = await promise;
666
+ expect(response).toEqual({ decision: 'approve' });
667
+ });
668
+ it('should throw error for unknown request ID', () => {
669
+ expect(() => handler.approve('unknown-id')).toThrow('No pending request found with ID: unknown-id');
670
+ });
671
+ });
672
+ describe('deny', () => {
673
+ it('should resolve pending permission request with deny response', async () => {
674
+ const promise = handler.onCanUseTool(canUseToolRequest);
675
+ await new Promise((resolve) => setTimeout(resolve, 0));
676
+ handler.deny('tool-123', 'User rejected');
677
+ const response = await promise;
678
+ expect(response).toEqual({
679
+ behavior: 'deny',
680
+ message: 'User rejected',
681
+ });
682
+ });
683
+ it('should resolve PreToolUse hook with deny response', async () => {
684
+ const promise = handler.onPreToolUseHook(hookCallbackRequest);
685
+ await new Promise((resolve) => setTimeout(resolve, 0));
686
+ handler.deny('callback-123', 'User rejected');
687
+ const response = await promise;
688
+ expect(response).toEqual({
689
+ hookSpecificOutput: {
690
+ hookEventName: 'PreToolUse',
691
+ permissionDecision: 'deny',
692
+ permissionDecisionReason: 'User rejected',
693
+ },
694
+ });
695
+ });
696
+ it('should resolve Stop hook with block response', async () => {
697
+ const promise = handler.onStopHook(stopHookRequest);
698
+ await new Promise((resolve) => setTimeout(resolve, 0));
699
+ handler.deny('stop-123', 'User blocked');
700
+ const response = await promise;
701
+ expect(response).toEqual({
702
+ decision: 'block',
703
+ reason: 'User blocked',
704
+ });
705
+ });
706
+ it('should throw error for unknown request ID', () => {
707
+ expect(() => handler.deny('unknown-id', 'denied')).toThrow('No pending request found with ID: unknown-id');
708
+ });
709
+ });
710
+ describe('cancel', () => {
711
+ it('should reject pending request with error', async () => {
712
+ const promise = handler.onCanUseTool(canUseToolRequest);
713
+ await new Promise((resolve) => setTimeout(resolve, 0));
714
+ handler.cancel('tool-123', 'Cancelled by user');
715
+ await expect(promise).rejects.toThrow('Cancelled by user');
716
+ });
717
+ it('should reject with default message when no reason provided', async () => {
718
+ const promise = handler.onCanUseTool(canUseToolRequest);
719
+ await new Promise((resolve) => setTimeout(resolve, 0));
720
+ handler.cancel('tool-123');
721
+ await expect(promise).rejects.toThrow('Request cancelled');
722
+ });
723
+ it('should not throw for unknown request ID', () => {
724
+ expect(() => handler.cancel('unknown-id')).not.toThrow();
725
+ });
726
+ });
727
+ describe('cancelAll', () => {
728
+ it('should cancel all pending requests', async () => {
729
+ const promise1 = handler.onCanUseTool(canUseToolRequest);
730
+ const promise2 = handler.onPreToolUseHook(hookCallbackRequest);
731
+ await new Promise((resolve) => setTimeout(resolve, 0));
732
+ handler.cancelAll('Session ended');
733
+ await expect(promise1).rejects.toThrow('Session ended');
734
+ await expect(promise2).rejects.toThrow('Session ended');
735
+ });
736
+ it('should use default message when no reason provided', async () => {
737
+ const promise = handler.onCanUseTool(canUseToolRequest);
738
+ await new Promise((resolve) => setTimeout(resolve, 0));
739
+ handler.cancelAll();
740
+ await expect(promise).rejects.toThrow('All requests cancelled');
741
+ });
742
+ it('should clear pending count', async () => {
743
+ const promise1 = handler.onCanUseTool(canUseToolRequest);
744
+ const promise2 = handler.onPreToolUseHook(hookCallbackRequest);
745
+ await new Promise((resolve) => setTimeout(resolve, 0));
746
+ expect(handler.getPendingCount()).toBe(2);
747
+ handler.cancelAll();
748
+ expect(handler.getPendingCount()).toBe(0);
749
+ await expect(promise1).rejects.toThrow('All requests cancelled');
750
+ await expect(promise2).rejects.toThrow('All requests cancelled');
751
+ });
752
+ });
753
+ describe('timeout behavior', () => {
754
+ it('should reject request after timeout', async () => {
755
+ const shortTimeoutHandler = new DeferredHandler({ timeout: 50 });
756
+ const promise = shortTimeoutHandler.onCanUseTool(canUseToolRequest);
757
+ await expect(promise).rejects.toThrow('Permission request timed out after 50ms');
758
+ });
759
+ it('should not timeout with timeout=0', async () => {
760
+ const noTimeoutHandler = new DeferredHandler({ timeout: 0 });
761
+ const promise = noTimeoutHandler.onCanUseTool(canUseToolRequest);
762
+ await new Promise((resolve) => setTimeout(resolve, 100));
763
+ expect(noTimeoutHandler.hasPendingRequest('tool-123')).toBe(true);
764
+ noTimeoutHandler.approve('tool-123');
765
+ await promise;
766
+ });
767
+ });
768
+ describe('utility methods', () => {
769
+ it('should track pending count correctly', async () => {
770
+ expect(handler.getPendingCount()).toBe(0);
771
+ const promise1 = handler.onCanUseTool(canUseToolRequest);
772
+ await new Promise((resolve) => setTimeout(resolve, 0));
773
+ expect(handler.getPendingCount()).toBe(1);
774
+ const promise2 = handler.onPreToolUseHook(hookCallbackRequest);
775
+ await new Promise((resolve) => setTimeout(resolve, 0));
776
+ expect(handler.getPendingCount()).toBe(2);
777
+ handler.approve('tool-123');
778
+ await promise1;
779
+ expect(handler.getPendingCount()).toBe(1);
780
+ handler.cancel('callback-123');
781
+ await expect(promise2).rejects.toThrow('Request cancelled');
782
+ expect(handler.getPendingCount()).toBe(0);
783
+ });
784
+ it('should correctly identify pending requests', async () => {
785
+ expect(handler.hasPendingRequest('tool-123')).toBe(false);
786
+ const promise = handler.onCanUseTool(canUseToolRequest);
787
+ await new Promise((resolve) => setTimeout(resolve, 0));
788
+ expect(handler.hasPendingRequest('tool-123')).toBe(true);
789
+ expect(handler.hasPendingRequest('unknown-id')).toBe(false);
790
+ handler.approve('tool-123');
791
+ await promise;
792
+ expect(handler.hasPendingRequest('tool-123')).toBe(false);
793
+ });
794
+ });
795
+ describe('generated request IDs', () => {
796
+ it('should generate unique request ID when tool_use_id is not provided', async () => {
797
+ const requestWithoutId = {
798
+ subtype: 'can_use_tool',
799
+ tool_name: 'Read',
800
+ input: { file_path: '/test.txt' },
801
+ };
802
+ const eventHandler = vi.fn();
803
+ handler.on('permission_request', eventHandler);
804
+ handler.onCanUseTool(requestWithoutId);
805
+ await new Promise((resolve) => setTimeout(resolve, 0));
806
+ expect(eventHandler).toHaveBeenCalled();
807
+ const emittedId = eventHandler.mock.calls[0][1];
808
+ expect(emittedId).toMatch(/^deferred-\d+-\d+$/);
809
+ handler.approve(emittedId);
810
+ });
811
+ it('should use callback_id when provided (even empty string)', async () => {
812
+ const hookWithEmptyId = {
813
+ subtype: 'hook_callback',
814
+ callback_id: '',
815
+ input: {
816
+ session_id: 'session-123',
817
+ transcript_path: '/path/to/transcript',
818
+ cwd: '/project',
819
+ permission_mode: 'default',
820
+ hook_event_name: 'PreToolUse',
821
+ tool_name: 'Write',
822
+ },
823
+ };
824
+ const eventHandler = vi.fn();
825
+ handler.on('hook_request', eventHandler);
826
+ handler.onPreToolUseHook(hookWithEmptyId);
827
+ await new Promise((resolve) => setTimeout(resolve, 0));
828
+ expect(eventHandler).toHaveBeenCalled();
829
+ const emittedId = eventHandler.mock.calls[0][1];
830
+ expect(emittedId).toBe('');
831
+ handler.approve('');
832
+ });
833
+ });
834
+ });
835
+ //# sourceMappingURL=permissions.test.js.map