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,431 @@
1
+ "use strict";
2
+ /**
3
+ * # Tellask Grammar ("诉请")
4
+ *
5
+ * A primitive, line-based streaming call format designed to be robust under arbitrary
6
+ * upstream chunk boundaries (no backtick/markdown state machine required).
7
+ *
8
+ * ## Rules
9
+ *
10
+ * - Tellask call blocks consist of **lines**.
11
+ * - Any line starting with literal `!?` is a tellask line (prefix is not included in payload).
12
+ * - Any line(s) **without** `!?` prefix are treated as markdown, and also act as separators:
13
+ * they terminate the current tellask call block (if any).
14
+ *
15
+ * Within a tellask call block:
16
+ * - The first tellask line is the start of the call headline.
17
+ * - The first line MUST start with `!?@<valid-mention-id>` to be considered valid.
18
+ * Otherwise the block still parses, but is reported as malformed.
19
+ * - While still in headline phase, subsequent tellask lines starting with `!?@` extend
20
+ * the headline (multiline headline).
21
+ * - Any other tellask lines (starting with `!?` but NOT `!?@`) start/continue the call body.
22
+ *
23
+ * All downstream chunks preserve upstream chunk boundaries unless correctness requires
24
+ * a split (e.g. line-start prefix disambiguation across chunks).
25
+ */
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.TellaskStreamParser = void 0;
28
+ const id_1 = require("./utils/id");
29
+ class TellaskStreamParser {
30
+ constructor(downstream) {
31
+ this.callCounter = 0;
32
+ this.collectedCalls = [];
33
+ this.markdownStarted = false;
34
+ this.markdownChunkBuffer = '';
35
+ this.activeCall = null;
36
+ this.headlineBuffer = '';
37
+ this.bodyBuffer = '';
38
+ this.isAtLineStart = true;
39
+ this.lineStartProbe = '';
40
+ this.currentLineKind = 'unknown';
41
+ this.pendingCallLineRole = false;
42
+ this.currentCallLineRole = null;
43
+ this.downstream = downstream;
44
+ }
45
+ async takeUpstreamChunk(chunk) {
46
+ let pos = 0;
47
+ while (pos < chunk.length) {
48
+ const char = chunk[pos] ?? '';
49
+ if (this.isAtLineStart && this.currentLineKind === 'unknown') {
50
+ const consumed = await this.processLineStartProbe(char);
51
+ if (consumed) {
52
+ pos += 1;
53
+ continue;
54
+ }
55
+ // Not consumed means we decided the line kind and need to re-process this char
56
+ // with the decided line kind.
57
+ }
58
+ if (this.currentLineKind === 'markdown') {
59
+ await this.processMarkdownChar(char);
60
+ pos += 1;
61
+ continue;
62
+ }
63
+ if (this.currentLineKind === 'call') {
64
+ await this.processCallChar(char);
65
+ pos += 1;
66
+ continue;
67
+ }
68
+ // Fallback: should be unreachable, but keep safe to avoid infinite loops.
69
+ await this.processMarkdownChar(char);
70
+ pos += 1;
71
+ }
72
+ await this.flushAtUpstreamChunkEnd();
73
+ }
74
+ async finalize() {
75
+ // Resolve any pending single-char probe at start-of-line.
76
+ if (this.isAtLineStart && this.currentLineKind === 'unknown' && this.lineStartProbe === '!') {
77
+ // This is a markdown separator line starting with '!' but not enough chars to be `!?`.
78
+ await this.endActiveCallBlockIfAny();
79
+ this.markdownChunkBuffer += '!';
80
+ this.lineStartProbe = '';
81
+ }
82
+ // End-of-input can terminate a call without a trailing newline.
83
+ if (this.activeCall) {
84
+ await this.resolvePendingFirstLineMentionAtEofIfNeeded();
85
+ await this.endActiveCallBlockIfAny();
86
+ }
87
+ if (this.markdownChunkBuffer.length > 0) {
88
+ if (!this.markdownStarted) {
89
+ await this.downstream.markdownStart();
90
+ this.markdownStarted = true;
91
+ }
92
+ await this.downstream.markdownChunk(this.markdownChunkBuffer);
93
+ this.markdownChunkBuffer = '';
94
+ }
95
+ if (this.markdownStarted) {
96
+ await this.downstream.markdownFinish();
97
+ this.markdownStarted = false;
98
+ }
99
+ }
100
+ getCollectedCalls() {
101
+ return [...this.collectedCalls];
102
+ }
103
+ async processLineStartProbe(char) {
104
+ // Returns true if the character was consumed as part of probing decision.
105
+ if (this.lineStartProbe === '') {
106
+ if (char === '\n') {
107
+ // Empty line is markdown separator.
108
+ await this.endActiveCallBlockIfAny();
109
+ this.currentLineKind = 'markdown';
110
+ await this.processMarkdownChar(char);
111
+ this.resetLineStateAfterNewline();
112
+ return true;
113
+ }
114
+ this.lineStartProbe = '!';
115
+ if (char !== '!') {
116
+ // First char isn't '!' => markdown line.
117
+ this.lineStartProbe = '';
118
+ await this.endActiveCallBlockIfAny();
119
+ this.currentLineKind = 'markdown';
120
+ // Re-process this char as markdown.
121
+ return false;
122
+ }
123
+ // We saw '!' at column 0; need one more char to decide.
124
+ return true;
125
+ }
126
+ // lineStartProbe === '!' means we already consumed a '!' at strict column 0.
127
+ if (char === '\n') {
128
+ // Line length is 1 => markdown line containing '!\n'.
129
+ this.lineStartProbe = '';
130
+ await this.endActiveCallBlockIfAny();
131
+ this.currentLineKind = 'markdown';
132
+ this.markdownChunkBuffer += '!\n';
133
+ this.resetLineStateAfterNewline();
134
+ return true;
135
+ }
136
+ if (char === '?') {
137
+ // Confirmed call line prefix `!?` at column 0.
138
+ this.lineStartProbe = '';
139
+ await this.ensureCallLineModeStart();
140
+ return true;
141
+ }
142
+ // Not `!?` => markdown line starting with '!' then current char.
143
+ this.lineStartProbe = '';
144
+ await this.endActiveCallBlockIfAny();
145
+ this.currentLineKind = 'markdown';
146
+ this.markdownChunkBuffer += '!' + char;
147
+ this.isAtLineStart = false;
148
+ return true;
149
+ }
150
+ async ensureCallLineModeStart() {
151
+ // Transition from markdown to call line: finalize markdown fragment if active.
152
+ if (this.markdownChunkBuffer.length > 0) {
153
+ if (!this.markdownStarted) {
154
+ await this.downstream.markdownStart();
155
+ this.markdownStarted = true;
156
+ }
157
+ await this.downstream.markdownChunk(this.markdownChunkBuffer);
158
+ this.markdownChunkBuffer = '';
159
+ }
160
+ if (this.markdownStarted) {
161
+ await this.downstream.markdownFinish();
162
+ this.markdownStarted = false;
163
+ }
164
+ this.currentLineKind = 'call';
165
+ this.isAtLineStart = false;
166
+ this.pendingCallLineRole = true;
167
+ this.currentCallLineRole = null;
168
+ if (!this.activeCall) {
169
+ this.activeCall = {
170
+ kind: 'active',
171
+ validation: null,
172
+ firstLineMentionParse: { kind: 'pending_first_char' },
173
+ headLine: '',
174
+ body: '',
175
+ callLineIndex: 0,
176
+ phase: 'headline',
177
+ headLineFinished: false,
178
+ bodyStarted: false,
179
+ callStartEmitted: false,
180
+ };
181
+ }
182
+ else {
183
+ this.activeCall.callLineIndex += 1;
184
+ }
185
+ }
186
+ async processMarkdownChar(char) {
187
+ // Markdown content includes all characters verbatim.
188
+ this.markdownChunkBuffer += char;
189
+ if (char === '\n') {
190
+ this.resetLineStateAfterNewline();
191
+ }
192
+ else {
193
+ this.isAtLineStart = false;
194
+ }
195
+ }
196
+ async processCallChar(char) {
197
+ const call = this.activeCall;
198
+ if (!call) {
199
+ // Should never happen: call line implies active call. Fall back to markdown.
200
+ await this.processMarkdownChar(char);
201
+ return;
202
+ }
203
+ if (this.pendingCallLineRole) {
204
+ const role = this.decideCallLineRole(call, char);
205
+ this.pendingCallLineRole = false;
206
+ this.currentCallLineRole = role;
207
+ if (role === 'body') {
208
+ if (call.phase === 'headline') {
209
+ await this.finishHeadlineIfNeeded();
210
+ await this.startBodyIfNeeded();
211
+ call.phase = 'body';
212
+ }
213
+ }
214
+ }
215
+ // First line mention validation is based on the first tellask line only.
216
+ if (call.callLineIndex === 0 && call.phase === 'headline') {
217
+ await this.processFirstLineMentionParse(char);
218
+ }
219
+ if (this.currentCallLineRole === 'headline') {
220
+ this.headlineBuffer += char;
221
+ }
222
+ else {
223
+ this.bodyBuffer += char;
224
+ }
225
+ if (char === '\n') {
226
+ this.resetLineStateAfterNewline();
227
+ }
228
+ else {
229
+ this.isAtLineStart = false;
230
+ }
231
+ }
232
+ decideCallLineRole(call, firstCharAfterPrefix) {
233
+ if (call.phase === 'body')
234
+ return 'body';
235
+ if (call.callLineIndex === 0)
236
+ return 'headline';
237
+ return firstCharAfterPrefix === '@' ? 'headline' : 'body';
238
+ }
239
+ async processFirstLineMentionParse(char) {
240
+ const call = this.activeCall;
241
+ if (!call)
242
+ return;
243
+ const parse = call.firstLineMentionParse;
244
+ if (parse.kind === 'resolved')
245
+ return;
246
+ if (parse.kind === 'pending_first_char') {
247
+ if (char === '\n') {
248
+ await this.resolveFirstLineMention({ kind: 'malformed', reason: 'missing_mention_prefix' });
249
+ return;
250
+ }
251
+ if (char !== '@') {
252
+ await this.resolveFirstLineMention({ kind: 'malformed', reason: 'missing_mention_prefix' });
253
+ return;
254
+ }
255
+ call.firstLineMentionParse = { kind: 'pending_mention_chars', raw: '' };
256
+ return;
257
+ }
258
+ if (parse.kind === 'pending_mention_chars') {
259
+ if (this.isValidMentionChar(char)) {
260
+ call.firstLineMentionParse = { kind: 'pending_mention_chars', raw: parse.raw + char };
261
+ return;
262
+ }
263
+ const trimmed = this.trimTrailingDots(parse.raw);
264
+ if (trimmed.length > 0) {
265
+ await this.resolveFirstLineMention({ kind: 'valid', firstMention: trimmed });
266
+ }
267
+ else {
268
+ await this.resolveFirstLineMention({ kind: 'malformed', reason: 'invalid_mention_id' });
269
+ }
270
+ return;
271
+ }
272
+ }
273
+ async resolveFirstLineMention(validation) {
274
+ const call = this.activeCall;
275
+ if (!call)
276
+ return;
277
+ call.validation = validation;
278
+ call.firstLineMentionParse = { kind: 'resolved', validation };
279
+ if (!call.callStartEmitted) {
280
+ call.callStartEmitted = true;
281
+ await this.downstream.callStart(validation);
282
+ }
283
+ await this.flushHeadlineBuffer();
284
+ }
285
+ async resolvePendingFirstLineMentionAtEofIfNeeded() {
286
+ const call = this.activeCall;
287
+ if (!call)
288
+ return;
289
+ if (call.callLineIndex !== 0)
290
+ return;
291
+ const parse = call.firstLineMentionParse;
292
+ if (parse.kind === 'resolved')
293
+ return;
294
+ if (parse.kind === 'pending_first_char') {
295
+ await this.resolveFirstLineMention({ kind: 'malformed', reason: 'missing_mention_prefix' });
296
+ return;
297
+ }
298
+ if (parse.kind === 'pending_mention_chars') {
299
+ const trimmed = this.trimTrailingDots(parse.raw);
300
+ if (trimmed.length > 0) {
301
+ await this.resolveFirstLineMention({ kind: 'valid', firstMention: trimmed });
302
+ }
303
+ else {
304
+ await this.resolveFirstLineMention({ kind: 'malformed', reason: 'invalid_mention_id' });
305
+ }
306
+ }
307
+ }
308
+ async finishHeadlineIfNeeded() {
309
+ const call = this.activeCall;
310
+ if (!call)
311
+ return;
312
+ if (call.headLineFinished)
313
+ return;
314
+ if (!call.callStartEmitted) {
315
+ // If the first line did not contain a mention terminator, we resolve at boundary.
316
+ await this.resolvePendingFirstLineMentionAtEofIfNeeded();
317
+ }
318
+ await this.flushHeadlineBuffer();
319
+ await this.downstream.callHeadLineFinish();
320
+ call.headLineFinished = true;
321
+ }
322
+ async startBodyIfNeeded() {
323
+ const call = this.activeCall;
324
+ if (!call)
325
+ return;
326
+ if (call.bodyStarted)
327
+ return;
328
+ await this.downstream.callBodyStart();
329
+ call.bodyStarted = true;
330
+ }
331
+ async endActiveCallBlockIfAny() {
332
+ const call = this.activeCall;
333
+ if (!call)
334
+ return;
335
+ // If the first line never encountered an invalid mention delimiter, ensure we still resolve.
336
+ await this.resolvePendingFirstLineMentionAtEofIfNeeded();
337
+ await this.finishHeadlineIfNeeded();
338
+ if (call.bodyStarted) {
339
+ await this.flushBodyBuffer();
340
+ await this.downstream.callBodyFinish();
341
+ }
342
+ const validation = call.validation ?? { kind: 'malformed', reason: 'missing_mention_prefix' };
343
+ const callId = (0, id_1.generateContentHash)(`tellask\n${validation.kind === 'valid' ? validation.firstMention : ''}\n${call.headLine}\n${call.body}`, this.callCounter++);
344
+ this.collectedCalls.push({
345
+ validation,
346
+ headLine: call.headLine,
347
+ body: call.body,
348
+ callId,
349
+ });
350
+ await this.downstream.callFinish(callId);
351
+ this.activeCall = null;
352
+ this.headlineBuffer = '';
353
+ this.bodyBuffer = '';
354
+ this.pendingCallLineRole = false;
355
+ this.currentCallLineRole = null;
356
+ }
357
+ resetLineStateAfterNewline() {
358
+ this.isAtLineStart = true;
359
+ this.lineStartProbe = '';
360
+ this.currentLineKind = 'unknown';
361
+ this.pendingCallLineRole = false;
362
+ this.currentCallLineRole = null;
363
+ }
364
+ async flushHeadlineBuffer() {
365
+ const call = this.activeCall;
366
+ if (!call)
367
+ return;
368
+ if (!call.callStartEmitted)
369
+ return;
370
+ if (this.headlineBuffer.length === 0)
371
+ return;
372
+ call.headLine += this.headlineBuffer;
373
+ await this.downstream.callHeadLineChunk(this.headlineBuffer);
374
+ this.headlineBuffer = '';
375
+ }
376
+ async flushBodyBuffer() {
377
+ const call = this.activeCall;
378
+ if (!call)
379
+ return;
380
+ if (this.bodyBuffer.length === 0)
381
+ return;
382
+ call.body += this.bodyBuffer;
383
+ await this.downstream.callBodyChunk(this.bodyBuffer);
384
+ this.bodyBuffer = '';
385
+ }
386
+ async flushAtUpstreamChunkEnd() {
387
+ if (this.markdownChunkBuffer.length > 0) {
388
+ if (!this.markdownStarted) {
389
+ await this.downstream.markdownStart();
390
+ this.markdownStarted = true;
391
+ }
392
+ await this.downstream.markdownChunk(this.markdownChunkBuffer);
393
+ this.markdownChunkBuffer = '';
394
+ }
395
+ const call = this.activeCall;
396
+ if (call) {
397
+ if (call.callLineIndex === 0) {
398
+ const parse = call.firstLineMentionParse;
399
+ if (parse.kind === 'pending_mention_chars' && parse.raw.length > 0) {
400
+ // Do nothing: we cannot resolve until a delimiter/newline/EOF.
401
+ }
402
+ }
403
+ await this.flushHeadlineBuffer();
404
+ if (call.bodyStarted) {
405
+ await this.flushBodyBuffer();
406
+ }
407
+ }
408
+ }
409
+ isValidMentionChar(char) {
410
+ const charCode = char.charCodeAt(0);
411
+ return (
412
+ // ASCII alphanumeric: a-z, A-Z, 0-9
413
+ (charCode >= 48 && charCode <= 57) ||
414
+ (charCode >= 65 && charCode <= 90) ||
415
+ (charCode >= 97 && charCode <= 122) ||
416
+ // Special allowed characters
417
+ char === '_' ||
418
+ char === '-' ||
419
+ char === '.' ||
420
+ // Unicode letters and digits
421
+ /\p{L}/u.test(char) ||
422
+ /\p{N}/u.test(char));
423
+ }
424
+ trimTrailingDots(value) {
425
+ let out = value;
426
+ while (out.endsWith('.'))
427
+ out = out.slice(0, -1);
428
+ return out;
429
+ }
430
+ }
431
+ exports.TellaskStreamParser = TellaskStreamParser;
package/dist/tool.js ADDED
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateArgs = validateArgs;
4
+ function validateArgs(schema, args) {
5
+ if (!isRecord(args)) {
6
+ return { ok: false, error: 'Arguments must be an object' };
7
+ }
8
+ if (Array.isArray(args)) {
9
+ return { ok: false, error: 'Arguments must be an object' };
10
+ }
11
+ const schemaType = isRecord(schema) && 'type' in schema ? schema.type : undefined;
12
+ if (schemaType !== undefined && schemaType !== 'object') {
13
+ return { ok: false, error: 'Schema root must be an object' };
14
+ }
15
+ const propertiesValue = isRecord(schema) && 'properties' in schema ? schema.properties : undefined;
16
+ const properties = isRecord(propertiesValue) ? propertiesValue : {};
17
+ const requiredValue = isRecord(schema) && 'required' in schema ? schema.required : undefined;
18
+ const required = Array.isArray(requiredValue) && requiredValue.every((v) => typeof v === 'string')
19
+ ? new Set(requiredValue)
20
+ : new Set();
21
+ const additionalPropertiesValue = isRecord(schema) && 'additionalProperties' in schema ? schema.additionalProperties : undefined;
22
+ const allowAdditional = additionalPropertiesValue === false
23
+ ? false
24
+ : additionalPropertiesValue === true || additionalPropertiesValue === undefined
25
+ ? true
26
+ : true; // schema additionalProperties is allowed (not deeply validated)
27
+ // required fields
28
+ for (const key of required) {
29
+ if (!(key in args))
30
+ return { ok: false, error: `Missing required field: ${key}` };
31
+ }
32
+ // validate each provided field
33
+ for (const [key, value] of Object.entries(args)) {
34
+ const propSchemaUnknown = properties[key];
35
+ if (propSchemaUnknown === undefined) {
36
+ if (!allowAdditional) {
37
+ return { ok: false, error: `Unexpected field: ${key}` };
38
+ }
39
+ continue;
40
+ }
41
+ const res = validateValue(propSchemaUnknown, value, key);
42
+ if (!res.ok)
43
+ return res;
44
+ }
45
+ return { ok: true };
46
+ }
47
+ function validateValue(schema, value, path) {
48
+ if (!isRecord(schema)) {
49
+ // Unknown schema shape: don't block execution.
50
+ return { ok: true };
51
+ }
52
+ const typeValue = 'type' in schema ? schema.type : undefined;
53
+ const schemaType = typeof typeValue === 'string'
54
+ ? typeValue
55
+ : Array.isArray(typeValue) && typeValue.every((t) => typeof t === 'string')
56
+ ? typeValue
57
+ : undefined;
58
+ if (schemaType === undefined) {
59
+ // Unknown/omitted type: permissive.
60
+ return { ok: true };
61
+ }
62
+ const acceptsType = (t) => {
63
+ switch (t) {
64
+ case 'string':
65
+ return typeof value === 'string';
66
+ case 'number':
67
+ return typeof value === 'number';
68
+ case 'integer':
69
+ return typeof value === 'number' && Number.isInteger(value);
70
+ case 'boolean':
71
+ return typeof value === 'boolean';
72
+ case 'null':
73
+ return value === null;
74
+ case 'array': {
75
+ if (!Array.isArray(value))
76
+ return false;
77
+ if (!('items' in schema))
78
+ return true;
79
+ const itemsSchema = schema.items;
80
+ if (itemsSchema === undefined)
81
+ return true;
82
+ if (Array.isArray(itemsSchema)) {
83
+ // Tuple validation: validate corresponding indices when schema exists.
84
+ for (let i = 0; i < Math.min(itemsSchema.length, value.length); i++) {
85
+ const r = validateValue(itemsSchema[i], value[i], `${path}[${i}]`);
86
+ if (!r.ok)
87
+ return false;
88
+ }
89
+ return true;
90
+ }
91
+ for (let i = 0; i < value.length; i++) {
92
+ const r = validateValue(itemsSchema, value[i], `${path}[${i}]`);
93
+ if (!r.ok)
94
+ return false;
95
+ }
96
+ return true;
97
+ }
98
+ case 'object': {
99
+ if (!isRecord(value) || Array.isArray(value))
100
+ return false;
101
+ const propsValue = 'properties' in schema ? schema.properties : undefined;
102
+ const props = isRecord(propsValue) ? propsValue : {};
103
+ const requiredValue = 'required' in schema ? schema.required : undefined;
104
+ const required = Array.isArray(requiredValue) && requiredValue.every((v) => typeof v === 'string')
105
+ ? new Set(requiredValue)
106
+ : new Set();
107
+ const additionalPropertiesValue = 'additionalProperties' in schema ? schema.additionalProperties : undefined;
108
+ const allowAdditional = additionalPropertiesValue === false
109
+ ? false
110
+ : additionalPropertiesValue === true || additionalPropertiesValue === undefined
111
+ ? true
112
+ : true;
113
+ for (const key of required) {
114
+ if (!(key in value)) {
115
+ return false;
116
+ }
117
+ }
118
+ for (const [k, v] of Object.entries(value)) {
119
+ const subSchema = props[k];
120
+ if (subSchema === undefined) {
121
+ if (!allowAdditional)
122
+ return false;
123
+ continue;
124
+ }
125
+ const r = validateValue(subSchema, v, `${path}.${k}`);
126
+ if (!r.ok)
127
+ return false;
128
+ }
129
+ return true;
130
+ }
131
+ default:
132
+ return true;
133
+ }
134
+ };
135
+ if (Array.isArray(schemaType)) {
136
+ for (const t of schemaType) {
137
+ if (acceptsType(t)) {
138
+ return { ok: true };
139
+ }
140
+ }
141
+ return { ok: false, error: `Field ${path} does not match expected type` };
142
+ }
143
+ if (!acceptsType(schemaType)) {
144
+ return { ok: false, error: `Field ${path} does not match expected type` };
145
+ }
146
+ return { ok: true };
147
+ }
148
+ function isRecord(value) {
149
+ return typeof value === 'object' && value !== null;
150
+ }