factory-factory 0.1.2 → 0.1.4

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 (157) hide show
  1. package/dist/client/assets/{_basePickBy-DlAy2gPt.js → _basePickBy-BfkcpkDt.js} +1 -1
  2. package/dist/client/assets/{_baseUniq-CPsiGaG0.js → _baseUniq-D_Jw298d.js} +1 -1
  3. package/dist/client/assets/{arc-1JZNjpJ_.js → arc--NK6Lv-6.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-VXUJARFQ-CQPIcyoO.js → architectureDiagram-VXUJARFQ-2FN12b81.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-VD42YOAC-MmcBB068.js → blockDiagram-VD42YOAC-BR0DePXf.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-YG6GDRKO-rLEwaSli.js → c4Diagram-YG6GDRKO-CdZ1W1J8.js} +1 -1
  7. package/dist/client/assets/channel-CWwf6EWM.js +1 -0
  8. package/dist/client/assets/{chunk-4BX2VUAB-BpP3xHzh.js → chunk-4BX2VUAB-DFtrC-95.js} +1 -1
  9. package/dist/client/assets/{chunk-55IACEB6-bhNSTzRt.js → chunk-55IACEB6-B8yEQkiz.js} +1 -1
  10. package/dist/client/assets/{chunk-B4BG7PRW-C0Ij7L-8.js → chunk-B4BG7PRW-CXxn0vQT.js} +1 -1
  11. package/dist/client/assets/{chunk-DI55MBZ5-BlzMN1zE.js → chunk-DI55MBZ5-B9BwI511.js} +1 -1
  12. package/dist/client/assets/{chunk-FMBD7UC4-C8tat_tr.js → chunk-FMBD7UC4-uWA6QAjR.js} +1 -1
  13. package/dist/client/assets/{chunk-QN33PNHL-Dny9DeCO.js → chunk-QN33PNHL-hbS33Gxf.js} +1 -1
  14. package/dist/client/assets/{chunk-QZHKN3VN-DQ2zbmnL.js → chunk-QZHKN3VN-BgEZOIiV.js} +1 -1
  15. package/dist/client/assets/{chunk-TZMSLE5B-BjcTEJG5.js → chunk-TZMSLE5B-CPZC4T1D.js} +1 -1
  16. package/dist/client/assets/classDiagram-2ON5EDUG-D6t6-UGx.js +1 -0
  17. package/dist/client/assets/classDiagram-v2-WZHVMYZB-D6t6-UGx.js +1 -0
  18. package/dist/client/assets/clone-C2myIo1k.js +1 -0
  19. package/dist/client/assets/{cose-bilkent-S5V4N54A-fICTsOTb.js → cose-bilkent-S5V4N54A-C1m-OXuQ.js} +1 -1
  20. package/dist/client/assets/{dagre-6UL2VRFP-DobOTWu6.js → dagre-6UL2VRFP-CTIRZvSK.js} +1 -1
  21. package/dist/client/assets/{diagram-PSM6KHXK-DBWTqTcE.js → diagram-PSM6KHXK-BAneBOeM.js} +1 -1
  22. package/dist/client/assets/{diagram-QEK2KX5R-qi6alECI.js → diagram-QEK2KX5R-C6X9MF0x.js} +1 -1
  23. package/dist/client/assets/{diagram-S2PKOQOG-D5EcU6AG.js → diagram-S2PKOQOG-BM9QHRm6.js} +1 -1
  24. package/dist/client/assets/{erDiagram-Q2GNP2WA-Dih4JIt2.js → erDiagram-Q2GNP2WA-hHyIcMsq.js} +1 -1
  25. package/dist/client/assets/{flowDiagram-NV44I4VS-CuDCTnxh.js → flowDiagram-NV44I4VS-xQ3Zw9iq.js} +1 -1
  26. package/dist/client/assets/{ganttDiagram-JELNMOA3-CPzDHErk.js → ganttDiagram-JELNMOA3-BWf8m_5c.js} +1 -1
  27. package/dist/client/assets/{gitGraphDiagram-NY62KEGX-Cv1AvbyZ.js → gitGraphDiagram-NY62KEGX-BJyKp7ph.js} +1 -1
  28. package/dist/client/assets/{graph-Cc4gWRmw.js → graph-C2MjKvS2.js} +1 -1
  29. package/dist/client/assets/index-8pJrtQCo.css +1 -0
  30. package/dist/client/assets/{index-5MJv0jou.js → index-ByYpjY6f.js} +130 -130
  31. package/dist/client/assets/{infoDiagram-WHAUD3N6-Btdw0Tyi.js → infoDiagram-WHAUD3N6-DKyVppde.js} +1 -1
  32. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-DVUAsZwf.js → journeyDiagram-XKPGCS4Q-BsRhXWyy.js} +1 -1
  33. package/dist/client/assets/{kanban-definition-3W4ZIXB7-CpcsqtK2.js → kanban-definition-3W4ZIXB7-DmGMIBzh.js} +1 -1
  34. package/dist/client/assets/{layout-yaIlj2KI.js → layout-BuXhP2oy.js} +1 -1
  35. package/dist/client/assets/{linear-BJc8M4HU.js → linear-DGzKUskJ.js} +1 -1
  36. package/dist/client/assets/{mindmap-definition-VGOIOE7T-D6H5ND7O.js → mindmap-definition-VGOIOE7T-DfheNVdE.js} +1 -1
  37. package/dist/client/assets/{pieDiagram-ADFJNKIX-yVvC2gSi.js → pieDiagram-ADFJNKIX-HkgURnkF.js} +1 -1
  38. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-CgVAxGtA.js → quadrantDiagram-AYHSOK5B-BxdUp1Jb.js} +1 -1
  39. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-GaSyCgqs.js → requirementDiagram-UZGBJVZJ-8eg1-JV8.js} +1 -1
  40. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-DJxErFxm.js → sankeyDiagram-TZEHDZUN-2fGautLa.js} +1 -1
  41. package/dist/client/assets/{sequenceDiagram-WL72ISMW-CVYhq23p.js → sequenceDiagram-WL72ISMW-_OrMvjLv.js} +1 -1
  42. package/dist/client/assets/{stateDiagram-FKZM4ZOC-BWNn_HOS.js → stateDiagram-FKZM4ZOC-0IWyshyF.js} +1 -1
  43. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-DmfuLiCD.js +1 -0
  44. package/dist/client/assets/{terminal-instance-Zu1T5dur.js → terminal-instance-ocXLZR1-.js} +1 -1
  45. package/dist/client/assets/{timeline-definition-IT6M3QCI-toe2Q26C.js → timeline-definition-IT6M3QCI-xoZGxhcU.js} +1 -1
  46. package/dist/client/assets/{treemap-KMMF4GRG-CrSa1h0j.js → treemap-KMMF4GRG-C_2uoG3G.js} +1 -1
  47. package/dist/client/assets/{xychartDiagram-PRI3JC2R-Dnal04rK.js → xychartDiagram-PRI3JC2R-hF-OwQo_.js} +1 -1
  48. package/dist/client/index.html +2 -2
  49. package/dist/client/sounds/workspace-complete.mp3 +0 -0
  50. package/dist/src/backend/claude/index.d.ts +29 -1
  51. package/dist/src/backend/claude/index.d.ts.map +1 -1
  52. package/dist/src/backend/claude/index.js +100 -2
  53. package/dist/src/backend/claude/index.js.map +1 -1
  54. package/dist/src/backend/claude/permissions.d.ts +1 -0
  55. package/dist/src/backend/claude/permissions.d.ts.map +1 -1
  56. package/dist/src/backend/claude/permissions.js +15 -2
  57. package/dist/src/backend/claude/permissions.js.map +1 -1
  58. package/dist/src/backend/claude/protocol.d.ts +5 -1
  59. package/dist/src/backend/claude/protocol.d.ts.map +1 -1
  60. package/dist/src/backend/claude/protocol.js +29 -1
  61. package/dist/src/backend/claude/protocol.js.map +1 -1
  62. package/dist/src/backend/claude/session.d.ts +0 -1
  63. package/dist/src/backend/claude/session.d.ts.map +1 -1
  64. package/dist/src/backend/claude/session.js +0 -58
  65. package/dist/src/backend/claude/session.js.map +1 -1
  66. package/dist/src/backend/claude/types.d.ts +108 -6
  67. package/dist/src/backend/claude/types.d.ts.map +1 -1
  68. package/dist/src/backend/claude/types.js +27 -0
  69. package/dist/src/backend/claude/types.js.map +1 -1
  70. package/dist/src/backend/claude/types.test.js +108 -1
  71. package/dist/src/backend/claude/types.test.js.map +1 -1
  72. package/dist/src/backend/interceptors/branch-rename.interceptor.d.ts.map +1 -1
  73. package/dist/src/backend/interceptors/branch-rename.interceptor.js +3 -2
  74. package/dist/src/backend/interceptors/branch-rename.interceptor.js.map +1 -1
  75. package/dist/src/backend/interceptors/pr-detection.interceptor.d.ts.map +1 -1
  76. package/dist/src/backend/interceptors/pr-detection.interceptor.js +2 -1
  77. package/dist/src/backend/interceptors/pr-detection.interceptor.js.map +1 -1
  78. package/dist/src/backend/lib/git-helpers.js +1 -1
  79. package/dist/src/backend/lib/git-helpers.js.map +1 -1
  80. package/dist/src/backend/routers/websocket/chat.handler.d.ts.map +1 -1
  81. package/dist/src/backend/routers/websocket/chat.handler.js +1 -0
  82. package/dist/src/backend/routers/websocket/chat.handler.js.map +1 -1
  83. package/dist/src/backend/schemas/tool-inputs.schema.d.ts +88 -0
  84. package/dist/src/backend/schemas/tool-inputs.schema.d.ts.map +1 -0
  85. package/dist/src/backend/schemas/tool-inputs.schema.js +89 -0
  86. package/dist/src/backend/schemas/tool-inputs.schema.js.map +1 -0
  87. package/dist/src/backend/schemas/tool-inputs.schema.test.d.ts +2 -0
  88. package/dist/src/backend/schemas/tool-inputs.schema.test.d.ts.map +1 -0
  89. package/dist/src/backend/schemas/tool-inputs.schema.test.js +402 -0
  90. package/dist/src/backend/schemas/tool-inputs.schema.test.js.map +1 -0
  91. package/dist/src/backend/schemas/websocket/chat-message.schema.d.ts +12 -0
  92. package/dist/src/backend/schemas/websocket/chat-message.schema.d.ts.map +1 -1
  93. package/dist/src/backend/schemas/websocket/chat-message.schema.js +8 -0
  94. package/dist/src/backend/schemas/websocket/chat-message.schema.js.map +1 -1
  95. package/dist/src/backend/schemas/websocket/index.d.ts +1 -1
  96. package/dist/src/backend/schemas/websocket/index.d.ts.map +1 -1
  97. package/dist/src/backend/schemas/websocket/index.js.map +1 -1
  98. package/dist/src/backend/server.js +1 -2
  99. package/dist/src/backend/server.js.map +1 -1
  100. package/dist/src/backend/services/chat-event-forwarder.service.d.ts +3 -0
  101. package/dist/src/backend/services/chat-event-forwarder.service.d.ts.map +1 -1
  102. package/dist/src/backend/services/chat-event-forwarder.service.js +253 -11
  103. package/dist/src/backend/services/chat-event-forwarder.service.js.map +1 -1
  104. package/dist/src/backend/services/chat-message-handlers.service.d.ts +3 -0
  105. package/dist/src/backend/services/chat-message-handlers.service.d.ts.map +1 -1
  106. package/dist/src/backend/services/chat-message-handlers.service.js +109 -18
  107. package/dist/src/backend/services/chat-message-handlers.service.js.map +1 -1
  108. package/dist/src/backend/services/config.service.d.ts +5 -0
  109. package/dist/src/backend/services/config.service.d.ts.map +1 -1
  110. package/dist/src/backend/services/config.service.js +6 -0
  111. package/dist/src/backend/services/config.service.js.map +1 -1
  112. package/dist/src/backend/services/event-compression.service.d.ts +36 -0
  113. package/dist/src/backend/services/event-compression.service.d.ts.map +1 -0
  114. package/dist/src/backend/services/event-compression.service.js +232 -0
  115. package/dist/src/backend/services/event-compression.service.js.map +1 -0
  116. package/dist/src/backend/services/event-compression.service.test.d.ts +2 -0
  117. package/dist/src/backend/services/event-compression.service.test.d.ts.map +1 -0
  118. package/dist/src/backend/services/event-compression.service.test.js +336 -0
  119. package/dist/src/backend/services/event-compression.service.test.js.map +1 -0
  120. package/dist/src/backend/services/index.d.ts +1 -0
  121. package/dist/src/backend/services/index.d.ts.map +1 -1
  122. package/dist/src/backend/services/index.js +1 -0
  123. package/dist/src/backend/services/index.js.map +1 -1
  124. package/dist/src/backend/services/message-state.service.d.ts +3 -0
  125. package/dist/src/backend/services/message-state.service.d.ts.map +1 -1
  126. package/dist/src/backend/services/message-state.service.js +24 -1
  127. package/dist/src/backend/services/message-state.service.js.map +1 -1
  128. package/dist/src/backend/services/message-state.service.test.js +15 -26
  129. package/dist/src/backend/services/message-state.service.test.js.map +1 -1
  130. package/dist/src/backend/services/notification.service.d.ts +1 -0
  131. package/dist/src/backend/services/notification.service.d.ts.map +1 -1
  132. package/dist/src/backend/services/notification.service.js +6 -0
  133. package/dist/src/backend/services/notification.service.js.map +1 -1
  134. package/dist/src/backend/services/workspace-activity.service.d.ts +13 -0
  135. package/dist/src/backend/services/workspace-activity.service.d.ts.map +1 -0
  136. package/dist/src/backend/services/workspace-activity.service.js +74 -0
  137. package/dist/src/backend/services/workspace-activity.service.js.map +1 -0
  138. package/dist/src/backend/trpc/index.d.ts +25 -25
  139. package/dist/src/backend/trpc/project.trpc.d.ts +2 -2
  140. package/dist/src/backend/trpc/session.trpc.d.ts +11 -11
  141. package/dist/src/backend/trpc/user-settings.trpc.d.ts +1 -1
  142. package/dist/src/backend/trpc/workspace/init.trpc.d.ts +2 -2
  143. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +3 -3
  144. package/dist/src/backend/trpc/workspace.trpc.d.ts +11 -11
  145. package/dist/src/lib/claude-types.d.ts +47 -2
  146. package/dist/src/lib/claude-types.d.ts.map +1 -1
  147. package/dist/src/lib/claude-types.js +1 -0
  148. package/dist/src/lib/claude-types.js.map +1 -1
  149. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  150. package/package.json +1 -1
  151. package/scripts/postinstall.mjs +44 -13
  152. package/dist/client/assets/channel-NbT5TRpd.js +0 -1
  153. package/dist/client/assets/classDiagram-2ON5EDUG-DsshYhcN.js +0 -1
  154. package/dist/client/assets/classDiagram-v2-WZHVMYZB-DsshYhcN.js +0 -1
  155. package/dist/client/assets/clone-Cvh2OAuU.js +0 -1
  156. package/dist/client/assets/index-YQ6vfX-S.css +0 -1
  157. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BAVRa6EM.js +0 -1
@@ -82,6 +82,7 @@ export function handleChatUpgrade(request, socket, head, url, wss, wsAliveMap) {
82
82
  connectionId,
83
83
  dbSessionId,
84
84
  });
85
+ chatEventForwarderService.setupWorkspaceNotifications();
85
86
  wsAliveMap.set(ws, true);
86
87
  ws.on('pong', () => wsAliveMap.set(ws, true));
87
88
  if (dbSessionId) {
@@ -1 +1 @@
1
- {"version":3,"file":"chat.handler.js","sourceRoot":"","sources":["../../../../../src/backend/routers/websocket/chat.handler.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kDAAkD,CAAC;AACzF,OAAO,EAAyB,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAuB,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AACpG,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AACxF,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AACzF,OAAO,EACL,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAE/E,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;AAE5C,MAAM,aAAa,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC,aAAa,CAAC;AAUnE,KAAK,UAAU,qBAAqB,CAClC,WAAmB,EACnB,OAIC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,yDAAyD,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAC1F,CAAC;IAGD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,iBAAiB,CAAC,WAAW,EAAE;QACjE,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,cAAc,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB;QACtE,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAGH,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACxE,yBAAyB,CAAC,iBAAiB,CACzC,WAAW,EACX,MAAM,EACN;QACE,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,SAAS;QAC9C,UAAU,EAAE,WAAW,EAAE,UAAU,IAAI,EAAE;KAC1C,EACD,GAAG,EAAE,CAAC,yBAAyB,CAAC,sBAAsB,CAAC,WAAW,CAAC,CACpE,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAGD,yBAAyB,CAAC,gBAAgB,CAAC;IACzC,WAAW,EAAE,qBAAqB;CACnC,CAAC,CAAC;AAMH,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEvC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,eAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,eAAe,GAAG,YAAY,CAAC,aAAa,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,eAAe,GAAG,CAAC,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAMD,MAAM,UAAU,iBAAiB,CAC/B,OAAwB,EACxB,MAAc,EACd,IAAY,EACZ,GAAQ,EACR,GAAoB,EACpB,UAAuC;IAEvC,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,QAAQ,UAAU,EAAE,EAAE,CAAC;IACpF,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IAC9D,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEzD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC7E,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAGD,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;QAC9C,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE;YACnD,YAAY;YACZ,WAAW;SACZ,CAAC,CAAC;QAEH,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzB,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QAG9C,IAAI,WAAW,EAAE,CAAC;YAChB,iBAAiB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAC3C,iBAAiB,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE;gBACzC,KAAK,EAAE,wBAAwB;gBAC/B,YAAY;gBACZ,WAAW;gBACX,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QAED,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACnE,IAAI,kBAAkB,EAAE,CAAC;YACvB,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE;oBACnD,YAAY;oBACZ,cAAc,EAAE,kBAAkB,CAAC,WAAW;iBAC/C,CAAC,CAAC;YACL,CAAC;YACD,kBAAkB,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,kCAAkC,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,cAAc,GAAmB;YACrC,EAAE;YACF,WAAW;YACX,UAAU;SACX,CAAC;QACF,qBAAqB,CAAC,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QAE7D,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,KAAK,MAAM,IAAI,IAAI,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClD,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;oBACrC,YAAY,EAAE,CAAC;gBACjB,CAAC;YACH,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;gBAC7C,YAAY;gBACZ,WAAW;gBACX,8BAA8B,EAAE,YAAY;aAC7C,CAAC,CAAC;QACL,CAAC;QAGD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1E,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,EAAE,IAAI,KAAK,CAAC;QAE/C,MAAM,aAAa,GAAG;YACpB,IAAI,EAAE,QAAQ;YACd,WAAW;YACX,OAAO,EAAE,SAAS;SACnB,CAAC;QACF,IAAI,WAAW,EAAE,CAAC;YAChB,iBAAiB,CAAC,GAAG,CAAC,WAAW,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;QACrE,CAAC;QACD,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;QAGvC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,cAAc,GAAG,yBAAyB,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAChF,MAAM,aAAa,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACvF,mBAAmB,CAAC,YAAY,CAAC,WAAW,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;QAC/E,CAAC;QAGD,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC9B,IAAI,CAAC;gBACH,MAAM,UAAU,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACxD,MAAM,WAAW,GAAG,iBAAiB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBAE5D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;wBACzC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM;wBAChC,YAAY;qBACb,CAAC,CAAC;oBACH,MAAM,aAAa,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;oBAC3E,IAAI,WAAW,EAAE,CAAC;wBAChB,iBAAiB,CAAC,GAAG,CAAC,WAAW,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;oBACrE,CAAC;oBACD,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;oBACvC,OAAO;gBACT,CAAC;gBAED,MAAM,OAAO,GAAqB,WAAW,CAAC,IAAI,CAAC;gBACnD,IAAI,WAAW,EAAE,CAAC;oBAChB,iBAAiB,CAAC,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAChE,CAAC;gBACD,MAAM,yBAAyB,CAAC,aAAa,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YACtF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAc,CAAC,CAAC;gBAC5D,MAAM,aAAa,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;gBAC3E,IAAI,WAAW,EAAE,CAAC;oBAChB,iBAAiB,CAAC,GAAG,CAAC,WAAW,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;gBACrE,CAAC;gBACD,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;YAC/E,IAAI,WAAW,EAAE,CAAC;gBAChB,iBAAiB,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,CAAC,CAAC;gBACzF,iBAAiB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAC9C,CAAC;YAED,qBAAqB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACvB,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC5C,IAAI,WAAW,EAAE,CAAC;gBAChB,iBAAiB,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE;oBACzC,KAAK,EAAE,kBAAkB;oBACzB,YAAY;oBACZ,KAAK,EAAE,KAAK,CAAC,OAAO;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"chat.handler.js","sourceRoot":"","sources":["../../../../../src/backend/routers/websocket/chat.handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { z } from 'zod';
2
+ export interface ValidationLogger {
3
+ warn: (msg: string, ctx?: Record<string, unknown>) => void;
4
+ }
5
+ export declare const AllowedPromptSchema: z.ZodObject<{
6
+ tool: z.ZodString;
7
+ prompt: z.ZodString;
8
+ }, z.core.$strip>;
9
+ export declare const ExitPlanModeInputSchema: z.ZodObject<{
10
+ plan: z.ZodOptional<z.ZodString>;
11
+ planFile: z.ZodOptional<z.ZodString>;
12
+ allowedPrompts: z.ZodOptional<z.ZodArray<z.ZodObject<{
13
+ tool: z.ZodString;
14
+ prompt: z.ZodString;
15
+ }, z.core.$strip>>>;
16
+ }, z.core.$strip>;
17
+ export type ExitPlanModeInput = z.infer<typeof ExitPlanModeInputSchema>;
18
+ export declare const AskUserQuestionOptionSchema: z.ZodObject<{
19
+ label: z.ZodString;
20
+ description: z.ZodString;
21
+ }, z.core.$strip>;
22
+ export declare const AskUserQuestionItemSchema: z.ZodObject<{
23
+ question: z.ZodString;
24
+ header: z.ZodOptional<z.ZodString>;
25
+ options: z.ZodArray<z.ZodObject<{
26
+ label: z.ZodString;
27
+ description: z.ZodString;
28
+ }, z.core.$strip>>;
29
+ multiSelect: z.ZodOptional<z.ZodBoolean>;
30
+ }, z.core.$strip>;
31
+ export declare const AskUserQuestionInputSchema: z.ZodObject<{
32
+ questions: z.ZodArray<z.ZodObject<{
33
+ question: z.ZodString;
34
+ header: z.ZodOptional<z.ZodString>;
35
+ options: z.ZodArray<z.ZodObject<{
36
+ label: z.ZodString;
37
+ description: z.ZodString;
38
+ }, z.core.$strip>>;
39
+ multiSelect: z.ZodOptional<z.ZodBoolean>;
40
+ }, z.core.$strip>>;
41
+ }, z.core.$strip>;
42
+ export type AskUserQuestionInput = z.infer<typeof AskUserQuestionInputSchema>;
43
+ export declare const TaskToolInputSchema: z.ZodObject<{
44
+ subagent_type: z.ZodOptional<z.ZodString>;
45
+ description: z.ZodOptional<z.ZodString>;
46
+ prompt: z.ZodOptional<z.ZodString>;
47
+ model: z.ZodOptional<z.ZodString>;
48
+ max_turns: z.ZodOptional<z.ZodNumber>;
49
+ run_in_background: z.ZodOptional<z.ZodBoolean>;
50
+ resume: z.ZodOptional<z.ZodString>;
51
+ }, z.core.$strip>;
52
+ export type TaskToolInput = z.infer<typeof TaskToolInputSchema>;
53
+ export declare const CommandToolInputSchema: z.ZodObject<{
54
+ command: z.ZodOptional<z.ZodString>;
55
+ description: z.ZodOptional<z.ZodString>;
56
+ timeout: z.ZodOptional<z.ZodNumber>;
57
+ }, z.core.$strip>;
58
+ export type CommandToolInput = z.infer<typeof CommandToolInputSchema>;
59
+ export declare const HookCallbackInputSchema: z.ZodObject<{
60
+ session_id: z.ZodString;
61
+ transcript_path: z.ZodString;
62
+ cwd: z.ZodString;
63
+ permission_mode: z.ZodString;
64
+ hook_event_name: z.ZodString;
65
+ tool_name: z.ZodOptional<z.ZodString>;
66
+ tool_input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
67
+ tool_use_id: z.ZodOptional<z.ZodString>;
68
+ stop_hook_active: z.ZodOptional<z.ZodBoolean>;
69
+ }, z.core.$strip>;
70
+ export type HookCallbackInput = z.infer<typeof HookCallbackInputSchema>;
71
+ export declare const CanUseToolInputSchema: z.ZodObject<{
72
+ tool_name: z.ZodOptional<z.ZodString>;
73
+ }, z.core.$strip>;
74
+ export type CanUseToolInput = z.infer<typeof CanUseToolInputSchema>;
75
+ export interface ParseSuccess<T> {
76
+ success: true;
77
+ data: T;
78
+ }
79
+ export interface ParseFailure {
80
+ success: false;
81
+ data: null;
82
+ }
83
+ export type SafeParseResult<T> = ParseSuccess<T> | ParseFailure;
84
+ export declare function safeParseToolInput<T>(schema: z.ZodSchema<T>, input: unknown, toolName: string, logger?: ValidationLogger): SafeParseResult<T>;
85
+ export declare function extractInputValue<T>(input: Record<string, unknown>, key: string, typeGuard: (v: unknown) => v is T, toolName: string, logger?: ValidationLogger): T | undefined;
86
+ export declare function isString(v: unknown): v is string;
87
+ export declare function isArray(v: unknown): v is unknown[];
88
+ //# sourceMappingURL=tool-inputs.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-inputs.schema.d.ts","sourceRoot":"","sources":["../../../../src/backend/schemas/tool-inputs.schema.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC5D;AASD,eAAO,MAAM,mBAAmB;;;iBAG9B,CAAC;AAMH,eAAO,MAAM,uBAAuB;;;;;;;iBAIlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AASxE,eAAO,MAAM,2BAA2B;;;iBAGtC,CAAC;AAKH,eAAO,MAAM,yBAAyB;;;;;;;;iBAKpC,CAAC;AAKH,eAAO,MAAM,0BAA0B;;;;;;;;;;iBAErC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAS9E,eAAO,MAAM,mBAAmB;;;;;;;;iBAQ9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAShE,eAAO,MAAM,sBAAsB;;;;iBAIjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAStE,eAAO,MAAM,uBAAuB;;;;;;;;;;iBAUlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AASxE,eAAO,MAAM,qBAAqB;;iBAEhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AASpE,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,CAAC,CAAC;CACT;AAKD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;CACZ;AAKD,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;AAWhE,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EACtB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,gBAAgB,GACxB,eAAe,CAAC,CAAC,CAAC,CAapB;AAYD,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,gBAAgB,GACxB,CAAC,GAAG,SAAS,CAgBf;AAKD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,MAAM,CAEhD;AAKD,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,OAAO,EAAE,CAElD"}
@@ -0,0 +1,89 @@
1
+ import { z } from 'zod';
2
+ export const AllowedPromptSchema = z.object({
3
+ tool: z.string(),
4
+ prompt: z.string(),
5
+ });
6
+ export const ExitPlanModeInputSchema = z.object({
7
+ plan: z.string().optional(),
8
+ planFile: z.string().optional(),
9
+ allowedPrompts: z.array(AllowedPromptSchema).optional(),
10
+ });
11
+ export const AskUserQuestionOptionSchema = z.object({
12
+ label: z.string(),
13
+ description: z.string(),
14
+ });
15
+ export const AskUserQuestionItemSchema = z.object({
16
+ question: z.string(),
17
+ header: z.string().optional(),
18
+ options: z.array(AskUserQuestionOptionSchema),
19
+ multiSelect: z.boolean().optional(),
20
+ });
21
+ export const AskUserQuestionInputSchema = z.object({
22
+ questions: z.array(AskUserQuestionItemSchema),
23
+ });
24
+ export const TaskToolInputSchema = z.object({
25
+ subagent_type: z.string().optional(),
26
+ description: z.string().optional(),
27
+ prompt: z.string().optional(),
28
+ model: z.string().optional(),
29
+ max_turns: z.number().optional(),
30
+ run_in_background: z.boolean().optional(),
31
+ resume: z.string().optional(),
32
+ });
33
+ export const CommandToolInputSchema = z.object({
34
+ command: z.string().optional(),
35
+ description: z.string().optional(),
36
+ timeout: z.number().optional(),
37
+ });
38
+ export const HookCallbackInputSchema = z.object({
39
+ session_id: z.string(),
40
+ transcript_path: z.string(),
41
+ cwd: z.string(),
42
+ permission_mode: z.string(),
43
+ hook_event_name: z.string(),
44
+ tool_name: z.string().optional(),
45
+ tool_input: z.record(z.string(), z.unknown()).optional(),
46
+ tool_use_id: z.string().optional(),
47
+ stop_hook_active: z.boolean().optional(),
48
+ });
49
+ export const CanUseToolInputSchema = z.object({
50
+ tool_name: z.string().optional(),
51
+ });
52
+ export function safeParseToolInput(schema, input, toolName, logger) {
53
+ const result = schema.safeParse(input);
54
+ if (!result.success) {
55
+ if (logger) {
56
+ logger.warn(`[Tool Input] ${toolName} input validation failed`, {
57
+ toolName,
58
+ errors: result.error.issues.map((i) => ({ path: i.path, message: i.message })),
59
+ inputKeys: input && typeof input === 'object' ? Object.keys(input) : [],
60
+ });
61
+ }
62
+ return { success: false, data: null };
63
+ }
64
+ return { success: true, data: result.data };
65
+ }
66
+ export function extractInputValue(input, key, typeGuard, toolName, logger) {
67
+ if (!(key in input)) {
68
+ return undefined;
69
+ }
70
+ const value = input[key];
71
+ if (!typeGuard(value)) {
72
+ if (logger) {
73
+ logger.warn(`[Tool Input] ${toolName}.${key} has unexpected type`, {
74
+ toolName,
75
+ key,
76
+ actualType: typeof value,
77
+ });
78
+ }
79
+ return undefined;
80
+ }
81
+ return value;
82
+ }
83
+ export function isString(v) {
84
+ return typeof v === 'string';
85
+ }
86
+ export function isArray(v) {
87
+ return Array.isArray(v);
88
+ }
89
+ //# sourceMappingURL=tool-inputs.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-inputs.schema.js","sourceRoot":"","sources":["../../../../src/backend/schemas/tool-inputs.schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tool-inputs.schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-inputs.schema.test.d.ts","sourceRoot":"","sources":["../../../../src/backend/schemas/tool-inputs.schema.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,402 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { AskUserQuestionInputSchema, CommandToolInputSchema, ExitPlanModeInputSchema, extractInputValue, HookCallbackInputSchema, isArray, isString, safeParseToolInput, TaskToolInputSchema, } from './tool-inputs.schema.js';
3
+ describe('ExitPlanModeInputSchema', () => {
4
+ it('accepts inline plan content (SDK format)', () => {
5
+ const input = {
6
+ plan: '# My Plan\n\n## Steps\n1. Do this\n2. Do that',
7
+ allowedPrompts: [{ tool: 'Bash', prompt: 'run tests' }],
8
+ };
9
+ const result = ExitPlanModeInputSchema.safeParse(input);
10
+ expect(result.success).toBe(true);
11
+ if (result.success) {
12
+ expect(result.data.plan).toBe('# My Plan\n\n## Steps\n1. Do this\n2. Do that');
13
+ expect(result.data.planFile).toBeUndefined();
14
+ expect(result.data.allowedPrompts).toHaveLength(1);
15
+ }
16
+ });
17
+ it('accepts planFile path (CLI format)', () => {
18
+ const input = {
19
+ planFile: '/Users/dev/.claude/plans/example.md',
20
+ allowedPrompts: [{ tool: 'Bash', prompt: 'install dependencies' }],
21
+ };
22
+ const result = ExitPlanModeInputSchema.safeParse(input);
23
+ expect(result.success).toBe(true);
24
+ if (result.success) {
25
+ expect(result.data.planFile).toBe('/Users/dev/.claude/plans/example.md');
26
+ expect(result.data.plan).toBeUndefined();
27
+ }
28
+ });
29
+ it('accepts both plan and planFile (edge case)', () => {
30
+ const input = {
31
+ plan: 'inline content',
32
+ planFile: '/path/to/file.md',
33
+ };
34
+ const result = ExitPlanModeInputSchema.safeParse(input);
35
+ expect(result.success).toBe(true);
36
+ });
37
+ it('accepts empty input', () => {
38
+ const result = ExitPlanModeInputSchema.safeParse({});
39
+ expect(result.success).toBe(true);
40
+ });
41
+ it('accepts allowedPrompts without plan content', () => {
42
+ const input = {
43
+ allowedPrompts: [
44
+ { tool: 'Bash', prompt: 'run tests' },
45
+ { tool: 'Bash', prompt: 'build project' },
46
+ ],
47
+ };
48
+ const result = ExitPlanModeInputSchema.safeParse(input);
49
+ expect(result.success).toBe(true);
50
+ if (result.success) {
51
+ expect(result.data.allowedPrompts).toHaveLength(2);
52
+ }
53
+ });
54
+ it('rejects invalid allowedPrompts structure', () => {
55
+ const input = {
56
+ plan: 'content',
57
+ allowedPrompts: [{ invalidKey: 'value' }],
58
+ };
59
+ const result = ExitPlanModeInputSchema.safeParse(input);
60
+ expect(result.success).toBe(false);
61
+ });
62
+ });
63
+ describe('AskUserQuestionInputSchema', () => {
64
+ it('validates questions array', () => {
65
+ const input = {
66
+ questions: [
67
+ {
68
+ question: 'Which framework do you prefer?',
69
+ header: 'Framework',
70
+ options: [
71
+ { label: 'React', description: 'Popular UI library' },
72
+ { label: 'Vue', description: 'Progressive framework' },
73
+ ],
74
+ multiSelect: false,
75
+ },
76
+ ],
77
+ };
78
+ const result = AskUserQuestionInputSchema.safeParse(input);
79
+ expect(result.success).toBe(true);
80
+ if (result.success) {
81
+ expect(result.data.questions).toHaveLength(1);
82
+ expect(result.data.questions[0].question).toBe('Which framework do you prefer?');
83
+ expect(result.data.questions[0].options).toHaveLength(2);
84
+ }
85
+ });
86
+ it('requires label and description on options', () => {
87
+ const input = {
88
+ questions: [
89
+ {
90
+ question: 'Test?',
91
+ options: [{ label: 'Option 1' }],
92
+ },
93
+ ],
94
+ };
95
+ const result = AskUserQuestionInputSchema.safeParse(input);
96
+ expect(result.success).toBe(false);
97
+ });
98
+ it('accepts questions without optional fields', () => {
99
+ const input = {
100
+ questions: [
101
+ {
102
+ question: 'Choose one:',
103
+ options: [
104
+ { label: 'A', description: 'First option' },
105
+ { label: 'B', description: 'Second option' },
106
+ ],
107
+ },
108
+ ],
109
+ };
110
+ const result = AskUserQuestionInputSchema.safeParse(input);
111
+ expect(result.success).toBe(true);
112
+ if (result.success) {
113
+ expect(result.data.questions[0].header).toBeUndefined();
114
+ expect(result.data.questions[0].multiSelect).toBeUndefined();
115
+ }
116
+ });
117
+ it('accepts multiple questions', () => {
118
+ const input = {
119
+ questions: [
120
+ {
121
+ question: 'First question?',
122
+ options: [{ label: 'Yes', description: 'Affirmative' }],
123
+ },
124
+ {
125
+ question: 'Second question?',
126
+ options: [{ label: 'No', description: 'Negative' }],
127
+ multiSelect: true,
128
+ },
129
+ ],
130
+ };
131
+ const result = AskUserQuestionInputSchema.safeParse(input);
132
+ expect(result.success).toBe(true);
133
+ if (result.success) {
134
+ expect(result.data.questions).toHaveLength(2);
135
+ }
136
+ });
137
+ it('rejects missing questions array', () => {
138
+ const result = AskUserQuestionInputSchema.safeParse({});
139
+ expect(result.success).toBe(false);
140
+ });
141
+ it('accepts empty questions array (validation passes, but callers should check length)', () => {
142
+ const result = AskUserQuestionInputSchema.safeParse({ questions: [] });
143
+ expect(result.success).toBe(true);
144
+ });
145
+ });
146
+ describe('TaskToolInputSchema', () => {
147
+ it('accepts full task input', () => {
148
+ const input = {
149
+ subagent_type: 'Explore',
150
+ description: 'Find all test files',
151
+ prompt: 'Search for test files in the codebase',
152
+ model: 'sonnet',
153
+ max_turns: 10,
154
+ run_in_background: true,
155
+ resume: 'agent-123',
156
+ };
157
+ const result = TaskToolInputSchema.safeParse(input);
158
+ expect(result.success).toBe(true);
159
+ });
160
+ it('accepts minimal task input', () => {
161
+ const result = TaskToolInputSchema.safeParse({});
162
+ expect(result.success).toBe(true);
163
+ });
164
+ it('accepts partial task input', () => {
165
+ const input = {
166
+ subagent_type: 'Plan',
167
+ prompt: 'Plan the implementation',
168
+ };
169
+ const result = TaskToolInputSchema.safeParse(input);
170
+ expect(result.success).toBe(true);
171
+ if (result.success) {
172
+ expect(result.data.subagent_type).toBe('Plan');
173
+ expect(result.data.prompt).toBe('Plan the implementation');
174
+ expect(result.data.model).toBeUndefined();
175
+ }
176
+ });
177
+ });
178
+ describe('CommandToolInputSchema', () => {
179
+ it('accepts full command input', () => {
180
+ const input = {
181
+ command: 'npm test',
182
+ description: 'Run test suite',
183
+ timeout: 60_000,
184
+ };
185
+ const result = CommandToolInputSchema.safeParse(input);
186
+ expect(result.success).toBe(true);
187
+ if (result.success) {
188
+ expect(result.data.command).toBe('npm test');
189
+ expect(result.data.description).toBe('Run test suite');
190
+ expect(result.data.timeout).toBe(60_000);
191
+ }
192
+ });
193
+ it('accepts command-only input', () => {
194
+ const input = { command: 'git status' };
195
+ const result = CommandToolInputSchema.safeParse(input);
196
+ expect(result.success).toBe(true);
197
+ });
198
+ it('accepts empty input', () => {
199
+ const result = CommandToolInputSchema.safeParse({});
200
+ expect(result.success).toBe(true);
201
+ });
202
+ });
203
+ describe('HookCallbackInputSchema', () => {
204
+ it('validates complete hook callback input', () => {
205
+ const input = {
206
+ session_id: 'sess-123',
207
+ transcript_path: '/path/to/transcript.jsonl',
208
+ cwd: '/project',
209
+ permission_mode: 'default',
210
+ hook_event_name: 'PreToolUse',
211
+ tool_name: 'Bash',
212
+ tool_input: { command: 'ls -la' },
213
+ tool_use_id: 'tool-456',
214
+ stop_hook_active: false,
215
+ };
216
+ const result = HookCallbackInputSchema.safeParse(input);
217
+ expect(result.success).toBe(true);
218
+ });
219
+ it('validates minimal required fields', () => {
220
+ const input = {
221
+ session_id: 'sess-123',
222
+ transcript_path: '/path/to/transcript.jsonl',
223
+ cwd: '/project',
224
+ permission_mode: 'default',
225
+ hook_event_name: 'Stop',
226
+ };
227
+ const result = HookCallbackInputSchema.safeParse(input);
228
+ expect(result.success).toBe(true);
229
+ if (result.success) {
230
+ expect(result.data.tool_name).toBeUndefined();
231
+ expect(result.data.tool_input).toBeUndefined();
232
+ }
233
+ });
234
+ it('rejects missing required fields', () => {
235
+ const input = {
236
+ session_id: 'sess-123',
237
+ };
238
+ const result = HookCallbackInputSchema.safeParse(input);
239
+ expect(result.success).toBe(false);
240
+ });
241
+ });
242
+ describe('safeParseToolInput', () => {
243
+ const mockLogger = {
244
+ warn: vi.fn(),
245
+ };
246
+ beforeEach(() => {
247
+ vi.clearAllMocks();
248
+ });
249
+ it('returns success with valid input', () => {
250
+ const input = { command: 'npm test' };
251
+ const result = safeParseToolInput(CommandToolInputSchema, input, 'Bash', mockLogger);
252
+ expect(result.success).toBe(true);
253
+ expect(result.data).toEqual({ command: 'npm test' });
254
+ expect(mockLogger.warn).not.toHaveBeenCalled();
255
+ });
256
+ it('returns failure with invalid input and logs warning', () => {
257
+ const input = {
258
+ questions: 'invalid',
259
+ };
260
+ const result = safeParseToolInput(AskUserQuestionInputSchema, input, 'AskUserQuestion', mockLogger);
261
+ expect(result.success).toBe(false);
262
+ expect(result.data).toBeNull();
263
+ expect(mockLogger.warn).toHaveBeenCalledOnce();
264
+ expect(mockLogger.warn).toHaveBeenCalledWith('[Tool Input] AskUserQuestion input validation failed', expect.objectContaining({
265
+ toolName: 'AskUserQuestion',
266
+ errors: expect.any(Array),
267
+ inputKeys: expect.any(Array),
268
+ }));
269
+ });
270
+ it('works without logger', () => {
271
+ const input = { invalid: true };
272
+ const result = safeParseToolInput(HookCallbackInputSchema, input, 'HookCallback');
273
+ expect(result.success).toBe(false);
274
+ expect(result.data).toBeNull();
275
+ });
276
+ it('handles non-object input', () => {
277
+ const result = safeParseToolInput(CommandToolInputSchema, 'not an object', 'Bash', mockLogger);
278
+ expect(result.success).toBe(false);
279
+ expect(mockLogger.warn).toHaveBeenCalled();
280
+ });
281
+ it('handles null input', () => {
282
+ const result = safeParseToolInput(CommandToolInputSchema, null, 'Bash', mockLogger);
283
+ expect(result.success).toBe(false);
284
+ });
285
+ });
286
+ describe('extractInputValue', () => {
287
+ const mockLogger = {
288
+ warn: vi.fn(),
289
+ };
290
+ beforeEach(() => {
291
+ vi.clearAllMocks();
292
+ });
293
+ it('extracts string value correctly', () => {
294
+ const input = { command: 'npm test', timeout: 5000 };
295
+ const result = extractInputValue(input, 'command', isString, 'Bash', mockLogger);
296
+ expect(result).toBe('npm test');
297
+ expect(mockLogger.warn).not.toHaveBeenCalled();
298
+ });
299
+ it('returns undefined for missing key', () => {
300
+ const input = { command: 'npm test' };
301
+ const result = extractInputValue(input, 'description', isString, 'Bash', mockLogger);
302
+ expect(result).toBeUndefined();
303
+ expect(mockLogger.warn).not.toHaveBeenCalled();
304
+ });
305
+ it('returns undefined and logs warning for wrong type', () => {
306
+ const input = { command: 123 };
307
+ const result = extractInputValue(input, 'command', isString, 'Bash', mockLogger);
308
+ expect(result).toBeUndefined();
309
+ expect(mockLogger.warn).toHaveBeenCalledWith('[Tool Input] Bash.command has unexpected type', expect.objectContaining({
310
+ toolName: 'Bash',
311
+ key: 'command',
312
+ actualType: 'number',
313
+ }));
314
+ });
315
+ it('extracts array value correctly', () => {
316
+ const input = { items: [1, 2, 3] };
317
+ const result = extractInputValue(input, 'items', isArray, 'Test', mockLogger);
318
+ expect(result).toEqual([1, 2, 3]);
319
+ });
320
+ });
321
+ describe('Type Guards', () => {
322
+ describe('isString', () => {
323
+ it('returns true for strings', () => {
324
+ expect(isString('hello')).toBe(true);
325
+ expect(isString('')).toBe(true);
326
+ });
327
+ it('returns false for non-strings', () => {
328
+ expect(isString(123)).toBe(false);
329
+ expect(isString(null)).toBe(false);
330
+ expect(isString(undefined)).toBe(false);
331
+ expect(isString({})).toBe(false);
332
+ expect(isString([])).toBe(false);
333
+ });
334
+ });
335
+ describe('isArray', () => {
336
+ it('returns true for arrays', () => {
337
+ expect(isArray([])).toBe(true);
338
+ expect(isArray([1, 2, 3])).toBe(true);
339
+ expect(isArray(['a', 'b'])).toBe(true);
340
+ });
341
+ it('returns false for non-arrays', () => {
342
+ expect(isArray('string')).toBe(false);
343
+ expect(isArray(123)).toBe(false);
344
+ expect(isArray(null)).toBe(false);
345
+ expect(isArray(undefined)).toBe(false);
346
+ expect(isArray({})).toBe(false);
347
+ });
348
+ });
349
+ });
350
+ describe('Real-World Input Formats', () => {
351
+ it('handles SDK ExitPlanMode format with inline plan', () => {
352
+ const sdkInput = {
353
+ plan: `# Implementation Plan
354
+
355
+ ## Summary
356
+ Implementing feature X
357
+
358
+ ## Steps
359
+ 1. Create component
360
+ 2. Add tests
361
+ 3. Update docs`,
362
+ allowedPrompts: [
363
+ { tool: 'Bash', prompt: 'run tests' },
364
+ { tool: 'Bash', prompt: 'install dependencies' },
365
+ ],
366
+ };
367
+ const result = ExitPlanModeInputSchema.safeParse(sdkInput);
368
+ expect(result.success).toBe(true);
369
+ if (result.success) {
370
+ expect(result.data.plan).toContain('# Implementation Plan');
371
+ }
372
+ });
373
+ it('handles CLI ExitPlanMode format with file path', () => {
374
+ const cliInput = {
375
+ planFile: '/Users/developer/.claude/plans/feature-x.md',
376
+ allowedPrompts: [{ tool: 'Bash', prompt: 'run tests' }],
377
+ };
378
+ const result = ExitPlanModeInputSchema.safeParse(cliInput);
379
+ expect(result.success).toBe(true);
380
+ if (result.success) {
381
+ expect(result.data.planFile).toBe('/Users/developer/.claude/plans/feature-x.md');
382
+ }
383
+ });
384
+ it('handles PreToolUse hook callback', () => {
385
+ const hookInput = {
386
+ session_id: 'abc-123-def-456',
387
+ transcript_path: '/Users/dev/.claude/projects/-Users-dev-myproject/transcript.jsonl',
388
+ cwd: '/Users/dev/myproject',
389
+ permission_mode: 'default',
390
+ hook_event_name: 'PreToolUse',
391
+ tool_name: 'Bash',
392
+ tool_input: {
393
+ command: 'rm -rf node_modules && npm install',
394
+ description: 'Clean install dependencies',
395
+ },
396
+ tool_use_id: 'toolu_01ABC123',
397
+ };
398
+ const result = HookCallbackInputSchema.safeParse(hookInput);
399
+ expect(result.success).toBe(true);
400
+ });
401
+ });
402
+ //# sourceMappingURL=tool-inputs.schema.test.js.map