dominds 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 (273) hide show
  1. package/LICENSE +157 -0
  2. package/README.md +250 -0
  3. package/README.zh.md +161 -0
  4. package/dist/access-control.js +253 -0
  5. package/dist/cli/create.js +263 -0
  6. package/dist/cli/read.js +84 -0
  7. package/dist/cli/tui.js +199 -0
  8. package/dist/cli/webui.js +169 -0
  9. package/dist/cli.js +227 -0
  10. package/dist/dialog-factory.js +53 -0
  11. package/dist/dialog-global-registry.js +68 -0
  12. package/dist/dialog-instance-registry.js +78 -0
  13. package/dist/dialog-run-state.js +198 -0
  14. package/dist/dialog.js +1024 -0
  15. package/dist/evt-registry.js +103 -0
  16. package/dist/index.js +8 -0
  17. package/dist/llm/client.js +69 -0
  18. package/dist/llm/defaults.yaml +386 -0
  19. package/dist/llm/driver.js +3214 -0
  20. package/dist/llm/gen/anthropic.js +611 -0
  21. package/dist/llm/gen/codex.js +375 -0
  22. package/dist/llm/gen/mock.js +326 -0
  23. package/dist/llm/gen/openai.js +470 -0
  24. package/dist/llm/gen/registry.js +26 -0
  25. package/dist/llm/gen.js +2 -0
  26. package/dist/llm/tools-projection.js +37 -0
  27. package/dist/log.js +228 -0
  28. package/dist/mcp/config.js +230 -0
  29. package/dist/mcp/sdk-client.js +129 -0
  30. package/dist/mcp/server-runtime.js +57 -0
  31. package/dist/mcp/stdio-client.js +280 -0
  32. package/dist/mcp/supervisor.js +979 -0
  33. package/dist/mcp/tool-names.js +109 -0
  34. package/dist/minds/builtin/cmdr/persona.md +3 -0
  35. package/dist/minds/builtin/dijiang/knowledge.md +287 -0
  36. package/dist/minds/builtin/dijiang/persona.md +7 -0
  37. package/dist/minds/builtin/fuxi/persona.en.md +59 -0
  38. package/dist/minds/builtin/fuxi/persona.zh.md +49 -0
  39. package/dist/minds/builtin/pangu/persona.en.md +78 -0
  40. package/dist/minds/builtin/pangu/persona.zh.md +71 -0
  41. package/dist/minds/load.js +617 -0
  42. package/dist/minds/minds-i18n.js +131 -0
  43. package/dist/minds/system-prompt.js +281 -0
  44. package/dist/persistence.js +3128 -0
  45. package/dist/problems.js +109 -0
  46. package/dist/server/api-routes.js +1031 -0
  47. package/dist/server/auth.js +180 -0
  48. package/dist/server/mime-types.js +32 -0
  49. package/dist/server/prompts-routes.js +543 -0
  50. package/dist/server/server-core.js +235 -0
  51. package/dist/server/setup-routes.js +697 -0
  52. package/dist/server/static-server.js +132 -0
  53. package/dist/server/websocket-handler.js +1011 -0
  54. package/dist/server.js +164 -0
  55. package/dist/shared/async-fifo-mutex.js +36 -0
  56. package/dist/shared/diligence.js +20 -0
  57. package/dist/shared/dotenv.js +144 -0
  58. package/dist/shared/evt.js +195 -0
  59. package/dist/shared/i18n/driver-messages.js +267 -0
  60. package/dist/shared/i18n/text.js +9 -0
  61. package/dist/shared/i18n/tool-result-messages.js +51 -0
  62. package/dist/shared/rtws-cli.js +73 -0
  63. package/dist/shared/runtime-language.js +47 -0
  64. package/dist/shared/team-mgmt-manual.js +116 -0
  65. package/dist/shared/types/context-health.js +2 -0
  66. package/dist/shared/types/dialog.js +11 -0
  67. package/dist/shared/types/i18n.js +2 -0
  68. package/dist/shared/types/index.js +26 -0
  69. package/dist/shared/types/language.js +40 -0
  70. package/dist/shared/types/problems.js +2 -0
  71. package/dist/shared/types/prompts.js +2 -0
  72. package/dist/shared/types/q4h.js +7 -0
  73. package/dist/shared/types/run-state.js +8 -0
  74. package/dist/shared/types/setup.js +2 -0
  75. package/dist/shared/types/storage.js +10 -0
  76. package/dist/shared/types/tellask.js +8 -0
  77. package/dist/shared/types/tools-registry.js +2 -0
  78. package/dist/shared/types/wire.js +12 -0
  79. package/dist/shared/utils/fmt.js +9 -0
  80. package/dist/shared/utils/html.js +20 -0
  81. package/dist/shared/utils/id.js +18 -0
  82. package/dist/shared/utils/inter-dialog-format.js +101 -0
  83. package/dist/shared/utils/time.js +13 -0
  84. package/dist/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  85. package/dist/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  86. package/dist/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  87. package/dist/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  88. package/dist/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  89. package/dist/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  90. package/dist/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  91. package/dist/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  92. package/dist/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  93. package/dist/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  94. package/dist/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  95. package/dist/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  96. package/dist/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  97. package/dist/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  98. package/dist/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  99. package/dist/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  100. package/dist/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  101. package/dist/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  102. package/dist/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  103. package/dist/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  104. package/dist/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  105. package/dist/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  106. package/dist/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  107. package/dist/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  108. package/dist/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  109. package/dist/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  110. package/dist/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  111. package/dist/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  112. package/dist/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  113. package/dist/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  114. package/dist/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  115. package/dist/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  116. package/dist/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  117. package/dist/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  118. package/dist/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  119. package/dist/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  120. package/dist/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  121. package/dist/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  122. package/dist/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  123. package/dist/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  124. package/dist/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  125. package/dist/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  126. package/dist/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  127. package/dist/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  128. package/dist/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  129. package/dist/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  130. package/dist/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  131. package/dist/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  132. package/dist/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  133. package/dist/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  134. package/dist/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  135. package/dist/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  136. package/dist/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  137. package/dist/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  138. package/dist/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  139. package/dist/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  140. package/dist/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  141. package/dist/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  142. package/dist/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  143. package/dist/static/assets/_baseUniq-Crfl3d5Y.js +661 -0
  144. package/dist/static/assets/_baseUniq-Crfl3d5Y.js.map +1 -0
  145. package/dist/static/assets/arc-CbA_x9GD.js +132 -0
  146. package/dist/static/assets/arc-CbA_x9GD.js.map +1 -0
  147. package/dist/static/assets/architectureDiagram-VXUJARFQ-lcFS8ZQJ.js +8685 -0
  148. package/dist/static/assets/architectureDiagram-VXUJARFQ-lcFS8ZQJ.js.map +1 -0
  149. package/dist/static/assets/blockDiagram-VD42YOAC-B3Q36qRc.js +3608 -0
  150. package/dist/static/assets/blockDiagram-VD42YOAC-B3Q36qRc.js.map +1 -0
  151. package/dist/static/assets/c4Diagram-YG6GDRKO-Mt-aq3VH.js +2482 -0
  152. package/dist/static/assets/c4Diagram-YG6GDRKO-Mt-aq3VH.js.map +1 -0
  153. package/dist/static/assets/channel-BVr1Yke-.js +8 -0
  154. package/dist/static/assets/channel-BVr1Yke-.js.map +1 -0
  155. package/dist/static/assets/chunk-4BX2VUAB-qCIn5Iic.js +17 -0
  156. package/dist/static/assets/chunk-4BX2VUAB-qCIn5Iic.js.map +1 -0
  157. package/dist/static/assets/chunk-55IACEB6-q172NeCV.js +14 -0
  158. package/dist/static/assets/chunk-55IACEB6-q172NeCV.js.map +1 -0
  159. package/dist/static/assets/chunk-B4BG7PRW-CMJmtYzq.js +1827 -0
  160. package/dist/static/assets/chunk-B4BG7PRW-CMJmtYzq.js.map +1 -0
  161. package/dist/static/assets/chunk-DI55MBZ5-DiuwwZPL.js +1916 -0
  162. package/dist/static/assets/chunk-DI55MBZ5-DiuwwZPL.js.map +1 -0
  163. package/dist/static/assets/chunk-FMBD7UC4-06sqZTTn.js +20 -0
  164. package/dist/static/assets/chunk-FMBD7UC4-06sqZTTn.js.map +1 -0
  165. package/dist/static/assets/chunk-QN33PNHL-CnpBNkpP.js +25 -0
  166. package/dist/static/assets/chunk-QN33PNHL-CnpBNkpP.js.map +1 -0
  167. package/dist/static/assets/chunk-QZHKN3VN-CNgjMR-e.js +18 -0
  168. package/dist/static/assets/chunk-QZHKN3VN-CNgjMR-e.js.map +1 -0
  169. package/dist/static/assets/chunk-TZMSLE5B-BxtzW6--.js +109 -0
  170. package/dist/static/assets/chunk-TZMSLE5B-BxtzW6--.js.map +1 -0
  171. package/dist/static/assets/classDiagram-2ON5EDUG-29huvmn-.js +23 -0
  172. package/dist/static/assets/classDiagram-2ON5EDUG-29huvmn-.js.map +1 -0
  173. package/dist/static/assets/classDiagram-v2-WZHVMYZB-29huvmn-.js +23 -0
  174. package/dist/static/assets/classDiagram-v2-WZHVMYZB-29huvmn-.js.map +1 -0
  175. package/dist/static/assets/clone-D2OgLSSn.js +9 -0
  176. package/dist/static/assets/clone-D2OgLSSn.js.map +1 -0
  177. package/dist/static/assets/cose-bilkent-S5V4N54A-BNegDCxl.js +4943 -0
  178. package/dist/static/assets/cose-bilkent-S5V4N54A-BNegDCxl.js.map +1 -0
  179. package/dist/static/assets/cytoscape.esm-Bm8DJGmZ.js +30240 -0
  180. package/dist/static/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -0
  181. package/dist/static/assets/dagre-6UL2VRFP-f1XrTRSn.js +695 -0
  182. package/dist/static/assets/dagre-6UL2VRFP-f1XrTRSn.js.map +1 -0
  183. package/dist/static/assets/defaultLocale-DVr69WTU.js +207 -0
  184. package/dist/static/assets/defaultLocale-DVr69WTU.js.map +1 -0
  185. package/dist/static/assets/diagram-PSM6KHXK-8w1WbeDi.js +849 -0
  186. package/dist/static/assets/diagram-PSM6KHXK-8w1WbeDi.js.map +1 -0
  187. package/dist/static/assets/diagram-QEK2KX5R-CF4wtMmR.js +303 -0
  188. package/dist/static/assets/diagram-QEK2KX5R-CF4wtMmR.js.map +1 -0
  189. package/dist/static/assets/diagram-S2PKOQOG-8p3Avgn2.js +213 -0
  190. package/dist/static/assets/diagram-S2PKOQOG-8p3Avgn2.js.map +1 -0
  191. package/dist/static/assets/erDiagram-Q2GNP2WA-BMKLxlM9.js +1159 -0
  192. package/dist/static/assets/erDiagram-Q2GNP2WA-BMKLxlM9.js.map +1 -0
  193. package/dist/static/assets/favicon-Cmg5RbCj.svg +8 -0
  194. package/dist/static/assets/flowDiagram-NV44I4VS-CgEuPNK2.js +2332 -0
  195. package/dist/static/assets/flowDiagram-NV44I4VS-CgEuPNK2.js.map +1 -0
  196. package/dist/static/assets/ganttDiagram-JELNMOA3-bJkDCf-9.js +3681 -0
  197. package/dist/static/assets/ganttDiagram-JELNMOA3-bJkDCf-9.js.map +1 -0
  198. package/dist/static/assets/gitGraphDiagram-NY62KEGX-4QE9kesp.js +1206 -0
  199. package/dist/static/assets/gitGraphDiagram-NY62KEGX-4QE9kesp.js.map +1 -0
  200. package/dist/static/assets/graph-CS0Pmm7c.js +597 -0
  201. package/dist/static/assets/graph-CS0Pmm7c.js.map +1 -0
  202. package/dist/static/assets/index-BS6HnGzC.js +112303 -0
  203. package/dist/static/assets/index-BS6HnGzC.js.map +1 -0
  204. package/dist/static/assets/index-DaIsSzC_.css +483 -0
  205. package/dist/static/assets/infoDiagram-WHAUD3N6-ypBcKfUs.js +34 -0
  206. package/dist/static/assets/infoDiagram-WHAUD3N6-ypBcKfUs.js.map +1 -0
  207. package/dist/static/assets/init-ZxktEp_H.js +17 -0
  208. package/dist/static/assets/init-ZxktEp_H.js.map +1 -0
  209. package/dist/static/assets/journeyDiagram-XKPGCS4Q-QnrxDowJ.js +1255 -0
  210. package/dist/static/assets/journeyDiagram-XKPGCS4Q-QnrxDowJ.js.map +1 -0
  211. package/dist/static/assets/kanban-definition-3W4ZIXB7-CfvEc4z5.js +1048 -0
  212. package/dist/static/assets/kanban-definition-3W4ZIXB7-CfvEc4z5.js.map +1 -0
  213. package/dist/static/assets/layout-8TGxpm23.js +2218 -0
  214. package/dist/static/assets/layout-8TGxpm23.js.map +1 -0
  215. package/dist/static/assets/linear-BATBPQQv.js +341 -0
  216. package/dist/static/assets/linear-BATBPQQv.js.map +1 -0
  217. package/dist/static/assets/min-B3oVH3AC.js +42 -0
  218. package/dist/static/assets/min-B3oVH3AC.js.map +1 -0
  219. package/dist/static/assets/mindmap-definition-VGOIOE7T-L7VLwwF8.js +1127 -0
  220. package/dist/static/assets/mindmap-definition-VGOIOE7T-L7VLwwF8.js.map +1 -0
  221. package/dist/static/assets/ordinal-CxptdPJm.js +77 -0
  222. package/dist/static/assets/ordinal-CxptdPJm.js.map +1 -0
  223. package/dist/static/assets/pieDiagram-ADFJNKIX-CFW3zIhM.js +241 -0
  224. package/dist/static/assets/pieDiagram-ADFJNKIX-CFW3zIhM.js.map +1 -0
  225. package/dist/static/assets/quadrantDiagram-AYHSOK5B-B7ssen3E.js +1338 -0
  226. package/dist/static/assets/quadrantDiagram-AYHSOK5B-B7ssen3E.js.map +1 -0
  227. package/dist/static/assets/requirementDiagram-UZGBJVZJ-D0v5BArv.js +1162 -0
  228. package/dist/static/assets/requirementDiagram-UZGBJVZJ-D0v5BArv.js.map +1 -0
  229. package/dist/static/assets/sankeyDiagram-TZEHDZUN-B7slncJe.js +1195 -0
  230. package/dist/static/assets/sankeyDiagram-TZEHDZUN-B7slncJe.js.map +1 -0
  231. package/dist/static/assets/sequenceDiagram-WL72ISMW-oXU2lRh_.js +3875 -0
  232. package/dist/static/assets/sequenceDiagram-WL72ISMW-oXU2lRh_.js.map +1 -0
  233. package/dist/static/assets/stateDiagram-FKZM4ZOC-CFYsEd0x.js +452 -0
  234. package/dist/static/assets/stateDiagram-FKZM4ZOC-CFYsEd0x.js.map +1 -0
  235. package/dist/static/assets/stateDiagram-v2-4FDKWEC3-C0UWaNA7.js +22 -0
  236. package/dist/static/assets/stateDiagram-v2-4FDKWEC3-C0UWaNA7.js.map +1 -0
  237. package/dist/static/assets/timeline-definition-IT6M3QCI-C3KODUrh.js +1223 -0
  238. package/dist/static/assets/timeline-definition-IT6M3QCI-C3KODUrh.js.map +1 -0
  239. package/dist/static/assets/treemap-KMMF4GRG-DAGDLhj2.js +18753 -0
  240. package/dist/static/assets/treemap-KMMF4GRG-DAGDLhj2.js.map +1 -0
  241. package/dist/static/assets/xychartDiagram-PRI3JC2R-C0J9iwTO.js +1888 -0
  242. package/dist/static/assets/xychartDiagram-PRI3JC2R-C0J9iwTO.js.map +1 -0
  243. package/dist/static/index.html +71 -0
  244. package/dist/static/testing/dom-observation-utils.js +425 -0
  245. package/dist/static/testing/e2e-test-helper.js +3119 -0
  246. package/dist/team.js +1160 -0
  247. package/dist/tellask.js +431 -0
  248. package/dist/tool.js +150 -0
  249. package/dist/tools/apply-patch.js +542 -0
  250. package/dist/tools/builtins.js +196 -0
  251. package/dist/tools/context-health.js +177 -0
  252. package/dist/tools/ctrl.js +478 -0
  253. package/dist/tools/diag.js +583 -0
  254. package/dist/tools/env.js +184 -0
  255. package/dist/tools/fs.js +818 -0
  256. package/dist/tools/mcp.js +138 -0
  257. package/dist/tools/mem.js +349 -0
  258. package/dist/tools/os.js +751 -0
  259. package/dist/tools/prompts/team_mgmt.en.md +70 -0
  260. package/dist/tools/prompts/team_mgmt.zh.md +70 -0
  261. package/dist/tools/prompts/ws_mod.en.md +86 -0
  262. package/dist/tools/prompts/ws_mod.zh.md +87 -0
  263. package/dist/tools/registry-snapshot.js +31 -0
  264. package/dist/tools/registry.js +121 -0
  265. package/dist/tools/ripgrep.js +678 -0
  266. package/dist/tools/team-mgmt.js +3300 -0
  267. package/dist/tools/txt.js +3178 -0
  268. package/dist/utils/id.js +72 -0
  269. package/dist/utils/task-doc.js +236 -0
  270. package/dist/utils/task-package.js +522 -0
  271. package/dist/utils/taskdoc-search.js +280 -0
  272. package/dist/utils/taskdoc.js +400 -0
  273. package/package.json +69 -0
@@ -0,0 +1,326 @@
1
+ "use strict";
2
+ /**
3
+ * Module: llm/gen/mock
4
+ *
5
+ * Mock LLM generator that uses a static response database for testing and development.
6
+ *
7
+ * === MOCK DATABASE FORMAT (YAML) ===
8
+ *
9
+ * ```yaml
10
+ * responses:
11
+ * # Comments are supported! Explain which test step uses each entry.
12
+ * # E.g., # docs/e2e-story-test/basics/reminders.md: Step 1
13
+ * - message: "hello"
14
+ * role: "user"
15
+ * response: "Hi there!"
16
+ * - message: "error text"
17
+ * role: "tool"
18
+ * response: "corrected response"
19
+ * ```
20
+ *
21
+ * === ROLE-BASED MATCHING (EXACT ONLY) ===
22
+ *
23
+ * The mock looks at the EXACT last message in context (no fallback):
24
+ * - role='user' from prompting_msg → matches entries with role='user'
25
+ * - role='tool' from func_result_msg → matches entries with role='tool'
26
+ *
27
+ * Matching rules (strict exact matching, NO fallback):
28
+ * 1. Exact: "tool:error text" matches response with message="error text" AND role="tool"
29
+ * 2. Exact: "user:hello" matches response with message="hello" AND role="user"
30
+ * 3. No match: returns fallback response explaining how to add mocks
31
+ *
32
+ * === BENEFITS OF YAML FORMAT ===
33
+ *
34
+ * - Comments: Document which test step uses each entry
35
+ * - Easy cleanup: Identify unused entries by checking test step references
36
+ * - Maintainability: Update comments when tests change, never lose referenced entries
37
+ *
38
+ * === EXAMPLE: TOOL ERROR RECOVERY ===
39
+ *
40
+ * // Turn 1: User asks, LLM makes syntax error
41
+ * # docs/e2e-story-test/reminders.md: User creates reminders
42
+ * - message: "create reminders"
43
+ * role: "user"
44
+ * response: "Call the function tool `add_reminder` with {\"content\":\"goals...\"}"
45
+ *
46
+ * // Turn 2: Tool error (func_result_msg with role='tool'), LLM self-corrects
47
+ * # docs/e2e-story-test/reminders.md: Tool syntax error recovery
48
+ * - message: "Error: Invalid args. Use: add_reminder({ content: string, position: number }) (position=0 means append)."
49
+ * role: "tool"
50
+ * response: "Call the function tool `add_reminder` with {\"content\":\"Goals...\",\"position\":1}"
51
+ */
52
+ var __importDefault = (this && this.__importDefault) || function (mod) {
53
+ return (mod && mod.__esModule) ? mod : { "default": mod };
54
+ };
55
+ Object.defineProperty(exports, "__esModule", { value: true });
56
+ exports.MockGen = void 0;
57
+ const promises_1 = __importDefault(require("fs/promises"));
58
+ const path_1 = __importDefault(require("path"));
59
+ const yaml_1 = __importDefault(require("yaml"));
60
+ const log_1 = require("../../log");
61
+ class MockGen {
62
+ constructor() {
63
+ this.databaseCache = new Map();
64
+ }
65
+ get apiType() {
66
+ return 'mock';
67
+ }
68
+ async loadResponseDatabase(dbPath, modelName) {
69
+ const cacheKey = `${dbPath}:${modelName}`;
70
+ const dbFilePath = path_1.default.join(dbPath, `${modelName}.yaml`);
71
+ const cached = this.databaseCache.get(cacheKey);
72
+ if (cached) {
73
+ try {
74
+ const stats = await promises_1.default.stat(dbFilePath);
75
+ if (stats.mtimeMs === cached.lastModified) {
76
+ return cached;
77
+ }
78
+ }
79
+ catch {
80
+ // Continue to reload
81
+ }
82
+ }
83
+ try {
84
+ const content = await promises_1.default.readFile(dbFilePath, 'utf-8');
85
+ const rawDatabase = yaml_1.default.parse(content);
86
+ // EXACT MATCHING ONLY: Store entries with role prefix
87
+ // No fallback to message-only entries
88
+ const lookupMap = new Map();
89
+ for (const resp of rawDatabase.responses) {
90
+ if (!resp.role) {
91
+ log_1.log.warn(`⚠️ Mock response without role: "${resp.message.substring(0, 50)}..."`);
92
+ log_1.log.warn('💡 All mock responses should have a "role" field (e.g., "user" or "tool")');
93
+ }
94
+ const key = resp.role
95
+ ? `${resp.role}:${resp.message.trim().toLowerCase()}`
96
+ : resp.message.trim().toLowerCase();
97
+ lookupMap.set(key, resp);
98
+ }
99
+ const stats = await promises_1.default.stat(dbFilePath);
100
+ const cachedDb = {
101
+ filePath: dbFilePath,
102
+ lastModified: stats.mtimeMs,
103
+ lookupMap,
104
+ };
105
+ this.databaseCache.set(cacheKey, cachedDb);
106
+ return cachedDb;
107
+ }
108
+ catch {
109
+ log_1.log.warn(`⚠️ Mock database not found: ${dbFilePath}`);
110
+ log_1.log.warn('💡 Create the file with: responses: [{ message: "...", role: "...", response: "..." }]');
111
+ const emptyDb = {
112
+ filePath: dbFilePath,
113
+ lastModified: Date.now(),
114
+ lookupMap: new Map(),
115
+ };
116
+ this.databaseCache.set(cacheKey, emptyDb);
117
+ return emptyDb;
118
+ }
119
+ }
120
+ /**
121
+ * Find matching response using EXACT last message only.
122
+ * NO fallback to message-only matching - if exact match fails, return null.
123
+ */
124
+ findMatchingResponse(database, input, role) {
125
+ if (!role) {
126
+ throw new Error('role is required for mock response matching');
127
+ }
128
+ const normalizedInput = input.trim().toLowerCase();
129
+ const lookupMap = database.lookupMap;
130
+ // Exact match only: "role:message"
131
+ const exactKey = `${role}:${normalizedInput}`;
132
+ return lookupMap.get(exactKey) || null;
133
+ }
134
+ makeFallbackResponse(dbPath, input, role, modelName) {
135
+ return `🤖 **Mock Response Not Found**
136
+
137
+ No mock response for the specified message with role=${JSON.stringify(role)} !!
138
+
139
+ Database: \`${path_1.default.join(dbPath, `${modelName}.yaml`)}\`
140
+
141
+ Add to database:
142
+ \`\`\`yaml
143
+ responses:
144
+ - message: ${JSON.stringify(input.trim())}
145
+ role: ${JSON.stringify(role)}
146
+ response: "Your response here"
147
+ \`\`\``;
148
+ }
149
+ async genToReceiver(providerConfig, agent, systemPrompt, _funcTools, context, receiver, _genseq, abortSignal) {
150
+ const dbPath = providerConfig.baseUrl;
151
+ if (!agent.model) {
152
+ throw new Error('Model undefined for agent: ' + agent.id);
153
+ }
154
+ const modelName = agent.model;
155
+ const lastMsg = context[context.length - 1];
156
+ const content = lastMsg && 'content' in lastMsg ? lastMsg.content : '';
157
+ const role = lastMsg?.role ?? '';
158
+ if (abortSignal?.aborted) {
159
+ throw new Error('AbortError');
160
+ }
161
+ await receiver.thinkingStart();
162
+ await receiver.thinkingChunk(`[${modelName}] `);
163
+ await receiver.thinkingChunk(content.substring(0, 50) || '(empty)');
164
+ await receiver.thinkingFinish();
165
+ const db = await this.loadResponseDatabase(dbPath, modelName);
166
+ const matched = this.findMatchingResponse(db, content, role);
167
+ if (matched?.streamError) {
168
+ throw new Error(matched.streamError);
169
+ }
170
+ const responseText = matched?.response ?? this.makeFallbackResponse(dbPath, content, role, modelName);
171
+ let usage = { kind: 'unavailable' };
172
+ if (matched && matched.usageUnavailable === true) {
173
+ usage = { kind: 'unavailable' };
174
+ }
175
+ else if (matched && matched.usage) {
176
+ const promptTokens = matched.usage.promptTokens;
177
+ const completionTokens = typeof matched.usage.completionTokens === 'number' ? matched.usage.completionTokens : 0;
178
+ const totalTokens = typeof matched.usage.totalTokens === 'number'
179
+ ? matched.usage.totalTokens
180
+ : promptTokens + completionTokens;
181
+ usage = {
182
+ kind: 'available',
183
+ promptTokens,
184
+ completionTokens,
185
+ totalTokens,
186
+ };
187
+ }
188
+ else {
189
+ const promptChars = systemPrompt.length +
190
+ context.reduce((acc, msg) => {
191
+ switch (msg.type) {
192
+ case 'environment_msg':
193
+ case 'transient_guide_msg':
194
+ case 'prompting_msg':
195
+ case 'saying_msg':
196
+ case 'thinking_msg':
197
+ case 'func_result_msg':
198
+ case 'call_result_msg':
199
+ return acc + msg.content.length;
200
+ case 'func_call_msg':
201
+ return acc + msg.name.length + msg.arguments.length;
202
+ default: {
203
+ const _exhaustive = msg;
204
+ throw new Error(`Unsupported chat message: ${_exhaustive}`);
205
+ }
206
+ }
207
+ }, 0);
208
+ const promptTokens = Math.ceil(promptChars / 4);
209
+ const completionTokens = Math.ceil(responseText.length / 4);
210
+ usage = {
211
+ kind: 'available',
212
+ promptTokens,
213
+ completionTokens,
214
+ totalTokens: promptTokens + completionTokens,
215
+ };
216
+ }
217
+ await receiver.sayingStart();
218
+ const words = responseText.split(/(\s+)/);
219
+ for (const word of words) {
220
+ if (abortSignal?.aborted) {
221
+ throw new Error('AbortError');
222
+ }
223
+ await receiver.sayingChunk(word);
224
+ }
225
+ await receiver.sayingFinish();
226
+ return { usage, llmGenModel: modelName };
227
+ }
228
+ async genMoreMessages(providerConfig, agent, systemPrompt, _funcTools, context, genseq, abortSignal) {
229
+ if (abortSignal?.aborted) {
230
+ throw new Error('AbortError');
231
+ }
232
+ const dbPath = providerConfig.baseUrl;
233
+ if (!agent.model) {
234
+ throw new Error('Model undefined for agent: ' + agent.id);
235
+ }
236
+ const modelName = agent.model;
237
+ const lastMsg = context[context.length - 1];
238
+ const content = lastMsg && 'content' in lastMsg ? lastMsg.content : '';
239
+ const role = lastMsg?.role ?? '';
240
+ try {
241
+ const db = await this.loadResponseDatabase(dbPath, modelName);
242
+ const matched = this.findMatchingResponse(db, content, role);
243
+ const responseText = matched?.response ?? this.makeFallbackResponse(dbPath, content, role, modelName);
244
+ const thinking = {
245
+ type: 'thinking_msg',
246
+ role: 'assistant',
247
+ genseq,
248
+ content: `[${modelName}] ${content.substring(0, 100)}`,
249
+ };
250
+ const saying = {
251
+ type: 'saying_msg',
252
+ role: 'assistant',
253
+ genseq,
254
+ content: matched?.streamError ? `❌ Mock Error: ${matched.streamError}` : responseText,
255
+ };
256
+ let usage = { kind: 'unavailable' };
257
+ if (matched && matched.usageUnavailable === true) {
258
+ usage = { kind: 'unavailable' };
259
+ }
260
+ else if (matched && matched.usage) {
261
+ const promptTokens = matched.usage.promptTokens;
262
+ const completionTokens = typeof matched.usage.completionTokens === 'number' ? matched.usage.completionTokens : 0;
263
+ const totalTokens = typeof matched.usage.totalTokens === 'number'
264
+ ? matched.usage.totalTokens
265
+ : promptTokens + completionTokens;
266
+ usage = {
267
+ kind: 'available',
268
+ promptTokens,
269
+ completionTokens,
270
+ totalTokens,
271
+ };
272
+ }
273
+ else {
274
+ const promptChars = systemPrompt.length +
275
+ context.reduce((acc, msg) => {
276
+ switch (msg.type) {
277
+ case 'environment_msg':
278
+ case 'transient_guide_msg':
279
+ case 'prompting_msg':
280
+ case 'saying_msg':
281
+ case 'thinking_msg':
282
+ case 'func_result_msg':
283
+ case 'call_result_msg':
284
+ return acc + msg.content.length;
285
+ case 'func_call_msg':
286
+ return acc + msg.name.length + msg.arguments.length;
287
+ default: {
288
+ const _exhaustive = msg;
289
+ throw new Error(`Unsupported chat message: ${_exhaustive}`);
290
+ }
291
+ }
292
+ }, 0);
293
+ const promptTokens = Math.ceil(promptChars / 4);
294
+ const completionTokens = Math.ceil(responseText.length / 4);
295
+ usage = {
296
+ kind: 'available',
297
+ promptTokens,
298
+ completionTokens,
299
+ totalTokens: promptTokens + completionTokens,
300
+ };
301
+ }
302
+ return { messages: [thinking, saying], usage, llmGenModel: modelName };
303
+ }
304
+ catch (err) {
305
+ const errMsg = err instanceof Error ? err.message : String(err);
306
+ const saying = {
307
+ type: 'saying_msg',
308
+ role: 'assistant',
309
+ genseq,
310
+ content: `❌ Mock Error: ${errMsg}`,
311
+ };
312
+ const thinking = {
313
+ type: 'thinking_msg',
314
+ role: 'assistant',
315
+ content: `[${modelName}] error: ${errMsg}`,
316
+ genseq,
317
+ };
318
+ return {
319
+ messages: [thinking, saying],
320
+ usage: { kind: 'unavailable' },
321
+ llmGenModel: modelName,
322
+ };
323
+ }
324
+ }
325
+ }
326
+ exports.MockGen = MockGen;