dominds 1.3.1 → 1.4.2

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 (184) hide show
  1. package/README.md +9 -2
  2. package/README.zh.md +9 -2
  3. package/dist/apps/app-lock-file.js +33 -57
  4. package/dist/apps/configuration-file.js +267 -0
  5. package/dist/apps/enabled-apps.js +217 -252
  6. package/dist/apps/manifest.js +132 -0
  7. package/dist/apps/resolution-file.js +80 -192
  8. package/dist/apps/workspace-app-state.js +8 -0
  9. package/dist/cli/disable.js +18 -22
  10. package/dist/cli/enable.js +20 -58
  11. package/dist/cli/install.js +74 -80
  12. package/dist/cli/uninstall.js +48 -25
  13. package/dist/cli/update.js +36 -80
  14. package/dist/docs/app-constitution.md +12 -7
  15. package/dist/docs/app-constitution.zh.md +13 -8
  16. package/dist/llm/kernel-driver/engine.js +10 -4
  17. package/dist/llm/kernel-driver/flow.js +93 -0
  18. package/dist/llm/kernel-driver/loop.js +4 -1
  19. package/dist/llm/kernel-driver/subdialog.js +5 -1
  20. package/dist/llm/kernel-driver/tellask-special.js +48 -6
  21. package/dist/server/server-core.js +19 -4
  22. package/dist/server/websocket-handler.js +26 -6
  23. package/dist/static/assets/{_basePickBy-CmziIRM9.js → _basePickBy-B2o4z1Hf.js} +3 -3
  24. package/dist/static/assets/{_basePickBy-CmziIRM9.js.map → _basePickBy-B2o4z1Hf.js.map} +1 -1
  25. package/dist/static/assets/{_baseUniq-CgDZxcD0.js → _baseUniq-CLmcxjdl.js} +2 -2
  26. package/dist/static/assets/{_baseUniq-CgDZxcD0.js.map → _baseUniq-CLmcxjdl.js.map} +1 -1
  27. package/dist/static/assets/{arc-Df9rjNNk.js → arc-CymD_KN7.js} +2 -2
  28. package/dist/static/assets/{arc-Df9rjNNk.js.map → arc-CymD_KN7.js.map} +1 -1
  29. package/dist/static/assets/{architectureDiagram-VXUJARFQ-Bif8topC.js → architectureDiagram-VXUJARFQ-DJQfSJUH.js} +7 -7
  30. package/dist/static/assets/{architectureDiagram-VXUJARFQ-Bif8topC.js.map → architectureDiagram-VXUJARFQ-DJQfSJUH.js.map} +1 -1
  31. package/dist/static/assets/{blockDiagram-VD42YOAC-D9Egoflr.js → blockDiagram-VD42YOAC-pHVz60D0.js} +7 -7
  32. package/dist/static/assets/{blockDiagram-VD42YOAC-D9Egoflr.js.map → blockDiagram-VD42YOAC-pHVz60D0.js.map} +1 -1
  33. package/dist/static/assets/{c4Diagram-YG6GDRKO-DBf1NeBf.js → c4Diagram-YG6GDRKO-B0WnCfAT.js} +3 -3
  34. package/dist/static/assets/{c4Diagram-YG6GDRKO-DBf1NeBf.js.map → c4Diagram-YG6GDRKO-B0WnCfAT.js.map} +1 -1
  35. package/dist/static/assets/{channel-Dc34yAJl.js → channel-CX9BlKil.js} +2 -2
  36. package/dist/static/assets/{channel-Dc34yAJl.js.map → channel-CX9BlKil.js.map} +1 -1
  37. package/dist/static/assets/{chunk-4BX2VUAB-B65G1dJI.js → chunk-4BX2VUAB-lXArRj3o.js} +2 -2
  38. package/dist/static/assets/{chunk-4BX2VUAB-B65G1dJI.js.map → chunk-4BX2VUAB-lXArRj3o.js.map} +1 -1
  39. package/dist/static/assets/{chunk-55IACEB6-CSDEOGl2.js → chunk-55IACEB6-CdqwynH9.js} +2 -2
  40. package/dist/static/assets/{chunk-55IACEB6-CSDEOGl2.js.map → chunk-55IACEB6-CdqwynH9.js.map} +1 -1
  41. package/dist/static/assets/{chunk-B4BG7PRW-Cb6W3QWJ.js → chunk-B4BG7PRW-Y-uXcJst.js} +5 -5
  42. package/dist/static/assets/{chunk-B4BG7PRW-Cb6W3QWJ.js.map → chunk-B4BG7PRW-Y-uXcJst.js.map} +1 -1
  43. package/dist/static/assets/{chunk-DI55MBZ5-ZAJWeVWH.js → chunk-DI55MBZ5-C5xSbRST.js} +4 -4
  44. package/dist/static/assets/{chunk-DI55MBZ5-ZAJWeVWH.js.map → chunk-DI55MBZ5-C5xSbRST.js.map} +1 -1
  45. package/dist/static/assets/{chunk-FMBD7UC4-DiwRlImb.js → chunk-FMBD7UC4-5uefwCjI.js} +2 -2
  46. package/dist/static/assets/{chunk-FMBD7UC4-DiwRlImb.js.map → chunk-FMBD7UC4-5uefwCjI.js.map} +1 -1
  47. package/dist/static/assets/{chunk-QN33PNHL-wilj7fb5.js → chunk-QN33PNHL-DzWVcvpI.js} +2 -2
  48. package/dist/static/assets/{chunk-QN33PNHL-wilj7fb5.js.map → chunk-QN33PNHL-DzWVcvpI.js.map} +1 -1
  49. package/dist/static/assets/{chunk-QZHKN3VN-DGmviJfR.js → chunk-QZHKN3VN-BrrvAZdP.js} +2 -2
  50. package/dist/static/assets/{chunk-QZHKN3VN-DGmviJfR.js.map → chunk-QZHKN3VN-BrrvAZdP.js.map} +1 -1
  51. package/dist/static/assets/{chunk-TZMSLE5B-Nm5wTXa_.js → chunk-TZMSLE5B-DyKOlPTY.js} +2 -2
  52. package/dist/static/assets/{chunk-TZMSLE5B-Nm5wTXa_.js.map → chunk-TZMSLE5B-DyKOlPTY.js.map} +1 -1
  53. package/dist/static/assets/{classDiagram-2ON5EDUG-BvUbXD6H.js → classDiagram-2ON5EDUG-FCrnlCWC.js} +6 -6
  54. package/dist/static/assets/{classDiagram-2ON5EDUG-BvUbXD6H.js.map → classDiagram-2ON5EDUG-FCrnlCWC.js.map} +1 -1
  55. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-BvUbXD6H.js → classDiagram-v2-WZHVMYZB-FCrnlCWC.js} +6 -6
  56. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-BvUbXD6H.js.map → classDiagram-v2-WZHVMYZB-FCrnlCWC.js.map} +1 -1
  57. package/dist/static/assets/{clone-0VLS7GaA.js → clone-BlI81KqZ.js} +2 -2
  58. package/dist/static/assets/{clone-0VLS7GaA.js.map → clone-BlI81KqZ.js.map} +1 -1
  59. package/dist/static/assets/{cose-bilkent-S5V4N54A-anaPs-75.js → cose-bilkent-S5V4N54A-yM7S2atz.js} +2 -2
  60. package/dist/static/assets/{cose-bilkent-S5V4N54A-anaPs-75.js.map → cose-bilkent-S5V4N54A-yM7S2atz.js.map} +1 -1
  61. package/dist/static/assets/{dagre-6UL2VRFP-YwdsZ11r.js → dagre-6UL2VRFP-BcweuZHt.js} +7 -7
  62. package/dist/static/assets/{dagre-6UL2VRFP-YwdsZ11r.js.map → dagre-6UL2VRFP-BcweuZHt.js.map} +1 -1
  63. package/dist/static/assets/{diagram-PSM6KHXK-5KQCf3h2.js → diagram-PSM6KHXK-D4-QwLW1.js} +8 -8
  64. package/dist/static/assets/{diagram-PSM6KHXK-5KQCf3h2.js.map → diagram-PSM6KHXK-D4-QwLW1.js.map} +1 -1
  65. package/dist/static/assets/{diagram-QEK2KX5R-Mf24XxZL.js → diagram-QEK2KX5R-BVbuejJn.js} +7 -7
  66. package/dist/static/assets/{diagram-QEK2KX5R-Mf24XxZL.js.map → diagram-QEK2KX5R-BVbuejJn.js.map} +1 -1
  67. package/dist/static/assets/{diagram-S2PKOQOG-DyQjD4D5.js → diagram-S2PKOQOG-pB6N6Tq_.js} +7 -7
  68. package/dist/static/assets/{diagram-S2PKOQOG-DyQjD4D5.js.map → diagram-S2PKOQOG-pB6N6Tq_.js.map} +1 -1
  69. package/dist/static/assets/{erDiagram-Q2GNP2WA-CEzTKw1u.js → erDiagram-Q2GNP2WA-DLKmthuw.js} +5 -5
  70. package/dist/static/assets/{erDiagram-Q2GNP2WA-CEzTKw1u.js.map → erDiagram-Q2GNP2WA-DLKmthuw.js.map} +1 -1
  71. package/dist/static/assets/{flowDiagram-NV44I4VS-DT821XSz.js → flowDiagram-NV44I4VS-BsBhWukh.js} +6 -6
  72. package/dist/static/assets/{flowDiagram-NV44I4VS-DT821XSz.js.map → flowDiagram-NV44I4VS-BsBhWukh.js.map} +1 -1
  73. package/dist/static/assets/{ganttDiagram-JELNMOA3-DlmeVsGg.js → ganttDiagram-JELNMOA3-Debz-J-C.js} +3 -3
  74. package/dist/static/assets/{ganttDiagram-JELNMOA3-DlmeVsGg.js.map → ganttDiagram-JELNMOA3-Debz-J-C.js.map} +1 -1
  75. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-yAfyBG_d.js → gitGraphDiagram-V2S2FVAM-BnAPFBGR.js} +8 -8
  76. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-yAfyBG_d.js.map → gitGraphDiagram-V2S2FVAM-BnAPFBGR.js.map} +1 -1
  77. package/dist/static/assets/{graph-BYv8vyWe.js → graph-DbzWiBNK.js} +3 -3
  78. package/dist/static/assets/{graph-BYv8vyWe.js.map → graph-DbzWiBNK.js.map} +1 -1
  79. package/dist/static/assets/{index-DMbwqOm6.js → index-B-8J28g7.js} +987 -1049
  80. package/dist/static/assets/index-B-8J28g7.js.map +1 -0
  81. package/dist/static/assets/{index-BiNcBn_U.css → index-CD5wtC_i.css} +1 -1
  82. package/dist/static/assets/{infoDiagram-HS3SLOUP-DaadramQ.js → infoDiagram-HS3SLOUP-CZ5hWoxV.js} +6 -6
  83. package/dist/static/assets/{infoDiagram-HS3SLOUP-DaadramQ.js.map → infoDiagram-HS3SLOUP-CZ5hWoxV.js.map} +1 -1
  84. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ftN8hxu3.js → journeyDiagram-XKPGCS4Q-CKN3oSxk.js} +5 -5
  85. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ftN8hxu3.js.map → journeyDiagram-XKPGCS4Q-CKN3oSxk.js.map} +1 -1
  86. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BIXETQ-C.js → kanban-definition-3W4ZIXB7-BQCMklfJ.js} +3 -3
  87. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BIXETQ-C.js.map → kanban-definition-3W4ZIXB7-BQCMklfJ.js.map} +1 -1
  88. package/dist/static/assets/{layout-OTbrj0Ye.js → layout-C5B58szc.js} +5 -5
  89. package/dist/static/assets/{layout-OTbrj0Ye.js.map → layout-C5B58szc.js.map} +1 -1
  90. package/dist/static/assets/{linear-CVfOC669.js → linear-_32fut6G.js} +2 -2
  91. package/dist/static/assets/{linear-CVfOC669.js.map → linear-_32fut6G.js.map} +1 -1
  92. package/dist/static/assets/{mindmap-definition-VGOIOE7T-D2zv5uI9.js → mindmap-definition-VGOIOE7T-C_goMzjx.js} +4 -4
  93. package/dist/static/assets/{mindmap-definition-VGOIOE7T-D2zv5uI9.js.map → mindmap-definition-VGOIOE7T-C_goMzjx.js.map} +1 -1
  94. package/dist/static/assets/{pieDiagram-ADFJNKIX-DaUXTsv7.js → pieDiagram-ADFJNKIX-BQ2n0cOB.js} +8 -8
  95. package/dist/static/assets/{pieDiagram-ADFJNKIX-DaUXTsv7.js.map → pieDiagram-ADFJNKIX-BQ2n0cOB.js.map} +1 -1
  96. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-B7O2wPX9.js → quadrantDiagram-AYHSOK5B-BLg7_neg.js} +3 -3
  97. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-B7O2wPX9.js.map → quadrantDiagram-AYHSOK5B-BLg7_neg.js.map} +1 -1
  98. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DpauVPY1.js → requirementDiagram-UZGBJVZJ-DwkJt0zi.js} +4 -4
  99. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DpauVPY1.js.map → requirementDiagram-UZGBJVZJ-DwkJt0zi.js.map} +1 -1
  100. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-B3Hbfvad.js → sankeyDiagram-TZEHDZUN-DmxmatUB.js} +2 -2
  101. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-B3Hbfvad.js.map → sankeyDiagram-TZEHDZUN-DmxmatUB.js.map} +1 -1
  102. package/dist/static/assets/{sequenceDiagram-WL72ISMW-KdbWByWT.js → sequenceDiagram-WL72ISMW-KHU_eApU.js} +4 -4
  103. package/dist/static/assets/{sequenceDiagram-WL72ISMW-KdbWByWT.js.map → sequenceDiagram-WL72ISMW-KHU_eApU.js.map} +1 -1
  104. package/dist/static/assets/{stateDiagram-FKZM4ZOC-yDOCVezC.js → stateDiagram-FKZM4ZOC-B3DBCxAL.js} +9 -9
  105. package/dist/static/assets/{stateDiagram-FKZM4ZOC-yDOCVezC.js.map → stateDiagram-FKZM4ZOC-B3DBCxAL.js.map} +1 -1
  106. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-CpCJhvQO.js → stateDiagram-v2-4FDKWEC3-C-uIk7gh.js} +5 -5
  107. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-CpCJhvQO.js.map → stateDiagram-v2-4FDKWEC3-C-uIk7gh.js.map} +1 -1
  108. package/dist/static/assets/{timeline-definition-IT6M3QCI-CHxuEjhV.js → timeline-definition-IT6M3QCI-SysEcQCC.js} +3 -3
  109. package/dist/static/assets/{timeline-definition-IT6M3QCI-CHxuEjhV.js.map → timeline-definition-IT6M3QCI-SysEcQCC.js.map} +1 -1
  110. package/dist/static/assets/{treemap-GDKQZRPO-Bsqu3wIy.js → treemap-GDKQZRPO-d0AbKEc4.js} +5 -5
  111. package/dist/static/assets/{treemap-GDKQZRPO-Bsqu3wIy.js.map → treemap-GDKQZRPO-d0AbKEc4.js.map} +1 -1
  112. package/dist/static/assets/{xychartDiagram-PRI3JC2R-RZy33lFF.js → xychartDiagram-PRI3JC2R-CmSQMxUh.js} +3 -3
  113. package/dist/static/assets/{xychartDiagram-PRI3JC2R-RZy33lFF.js.map → xychartDiagram-PRI3JC2R-CmSQMxUh.js.map} +1 -1
  114. package/dist/static/index.html +2 -2
  115. package/dist/tools/fs.js +1 -1
  116. package/package.json +9 -7
  117. package/dist/agent-priming.js +0 -2051
  118. package/dist/apps/installed-file.js +0 -207
  119. package/dist/apps/runtime-port.js +0 -91
  120. package/dist/docs/dominds-agent-priming.md +0 -218
  121. package/dist/docs/dominds-agent-priming.zh.md +0 -196
  122. package/dist/docs/drive-logic-context-refactor-plan.zh.md +0 -338
  123. package/dist/docs/keep-going.md +0 -176
  124. package/dist/docs/keep-going.zh.md +0 -162
  125. package/dist/docs/kernel-app-architecture.md +0 -286
  126. package/dist/docs/kernel-app-architecture.zh.md +0 -285
  127. package/dist/docs/showing-by-doing.md +0 -208
  128. package/dist/docs/showing-by-doing.zh.md +0 -177
  129. package/dist/docs/team-mgmt-toolset.md +0 -482
  130. package/dist/docs/team-mgmt-toolset.zh.md +0 -426
  131. package/dist/llm/driver-entry.js +0 -28
  132. package/dist/llm/driver-v2/context-health.js +0 -121
  133. package/dist/llm/driver-v2/context.js +0 -56
  134. package/dist/llm/driver-v2/core.js +0 -1545
  135. package/dist/llm/driver-v2/index.js +0 -26
  136. package/dist/llm/driver-v2/orchestrator.js +0 -158
  137. package/dist/llm/driver-v2/policy.js +0 -129
  138. package/dist/llm/driver-v2/restore-dialog-hierarchy.js +0 -73
  139. package/dist/llm/driver-v2/round.js +0 -366
  140. package/dist/llm/driver-v2/runtime-utils.js +0 -365
  141. package/dist/llm/driver-v2/saying-events.js +0 -20
  142. package/dist/llm/driver-v2/subdialog-txn.js +0 -42
  143. package/dist/llm/driver-v2/supdialog-response.js +0 -400
  144. package/dist/llm/driver-v2/tellask-bridge.js +0 -1148
  145. package/dist/llm/driver-v2/types.js +0 -10
  146. package/dist/llm/driver-v2-ref-only/context-health.js +0 -121
  147. package/dist/llm/driver-v2-ref-only/context.js +0 -17
  148. package/dist/llm/driver-v2-ref-only/core.js +0 -1710
  149. package/dist/llm/driver-v2-ref-only/index.js +0 -26
  150. package/dist/llm/driver-v2-ref-only/orchestrator.js +0 -158
  151. package/dist/llm/driver-v2-ref-only/policy.js +0 -129
  152. package/dist/llm/driver-v2-ref-only/restore-dialog-hierarchy.js +0 -73
  153. package/dist/llm/driver-v2-ref-only/round.js +0 -366
  154. package/dist/llm/driver-v2-ref-only/runtime-utils.js +0 -473
  155. package/dist/llm/driver-v2-ref-only/saying-events.js +0 -18
  156. package/dist/llm/driver-v2-ref-only/subdialog-txn.js +0 -42
  157. package/dist/llm/driver-v2-ref-only/supdialog-response.js +0 -453
  158. package/dist/llm/driver-v2-ref-only/tellask-bridge.js +0 -1178
  159. package/dist/llm/driver-v2-ref-only/types.js +0 -10
  160. package/dist/llm/driver.js +0 -4093
  161. package/dist/minds/promptdocs.js +0 -263
  162. package/dist/server/prompts-routes.js +0 -545
  163. package/dist/shared/team-mgmt-manual.js +0 -120
  164. package/dist/shared/types/prompts.js +0 -2
  165. package/dist/shared/types/tellask.js +0 -8
  166. package/dist/showing-by-doing.js +0 -1091
  167. package/dist/snippets/README.en.md +0 -3
  168. package/dist/snippets/README.md +0 -4
  169. package/dist/static/assets/index-DMbwqOm6.js.map +0 -1
  170. package/dist/tellask.js +0 -439
  171. package/dist/tools/context-health.js +0 -177
  172. package/dist/tools/diag.js +0 -583
  173. package/dist/tools/prompts/memory/en/errors.md +0 -155
  174. package/dist/tools/prompts/memory/en/index.md +0 -47
  175. package/dist/tools/prompts/memory/en/principles.md +0 -87
  176. package/dist/tools/prompts/memory/en/scenarios.md +0 -174
  177. package/dist/tools/prompts/memory/en/tools.md +0 -129
  178. package/dist/tools/prompts/memory/zh/errors.md +0 -155
  179. package/dist/tools/prompts/memory/zh/index.md +0 -47
  180. package/dist/tools/prompts/memory/zh/principles.md +0 -89
  181. package/dist/tools/prompts/memory/zh/scenarios.md +0 -174
  182. package/dist/tools/prompts/memory/zh/tools.md +0 -129
  183. package/dist/tools/team-mgmt.js +0 -3487
  184. package/dist/utils/task-doc.js +0 -236
package/dist/tellask.js DELETED
@@ -1,439 +0,0 @@
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
- // Total raw upstream characters consumed so far.
44
- this.upstreamPos = 0;
45
- this.downstream = downstream;
46
- }
47
- async takeUpstreamChunk(chunk) {
48
- let pos = 0;
49
- while (pos < chunk.length) {
50
- const char = chunk[pos] ?? '';
51
- if (this.isAtLineStart && this.currentLineKind === 'unknown') {
52
- const consumed = await this.processLineStartProbe(char);
53
- if (consumed) {
54
- pos += 1;
55
- this.upstreamPos += 1;
56
- continue;
57
- }
58
- // Not consumed means we decided the line kind and need to re-process this char
59
- // with the decided line kind.
60
- }
61
- if (this.currentLineKind === 'markdown') {
62
- await this.processMarkdownChar(char);
63
- pos += 1;
64
- this.upstreamPos += 1;
65
- continue;
66
- }
67
- if (this.currentLineKind === 'call') {
68
- await this.processCallChar(char);
69
- pos += 1;
70
- this.upstreamPos += 1;
71
- continue;
72
- }
73
- // Fallback: should be unreachable, but keep safe to avoid infinite loops.
74
- await this.processMarkdownChar(char);
75
- pos += 1;
76
- this.upstreamPos += 1;
77
- }
78
- await this.flushAtUpstreamChunkEnd();
79
- }
80
- async finalize() {
81
- // Resolve any pending single-char probe at start-of-line.
82
- if (this.isAtLineStart && this.currentLineKind === 'unknown' && this.lineStartProbe === '!') {
83
- // This is a markdown separator line starting with '!' but not enough chars to be `!?`.
84
- await this.endActiveCallBlockIfAny();
85
- this.markdownChunkBuffer += '!';
86
- this.lineStartProbe = '';
87
- }
88
- // End-of-input can terminate a call without a trailing newline.
89
- if (this.activeCall) {
90
- await this.resolvePendingFirstLineMentionAtEofIfNeeded();
91
- await this.endActiveCallBlockIfAny();
92
- }
93
- if (this.markdownChunkBuffer.length > 0) {
94
- if (!this.markdownStarted) {
95
- await this.downstream.markdownStart();
96
- this.markdownStarted = true;
97
- }
98
- await this.downstream.markdownChunk(this.markdownChunkBuffer);
99
- this.markdownChunkBuffer = '';
100
- }
101
- if (this.markdownStarted) {
102
- await this.downstream.markdownFinish();
103
- this.markdownStarted = false;
104
- }
105
- }
106
- getCollectedCalls() {
107
- return [...this.collectedCalls];
108
- }
109
- async processLineStartProbe(char) {
110
- // Returns true if the character was consumed as part of probing decision.
111
- if (this.lineStartProbe === '') {
112
- if (char === '\n') {
113
- // Empty line is markdown separator.
114
- await this.endActiveCallBlockIfAny();
115
- this.currentLineKind = 'markdown';
116
- await this.processMarkdownChar(char);
117
- this.resetLineStateAfterNewline();
118
- return true;
119
- }
120
- this.lineStartProbe = '!';
121
- if (char !== '!') {
122
- // First char isn't '!' => markdown line.
123
- this.lineStartProbe = '';
124
- await this.endActiveCallBlockIfAny();
125
- this.currentLineKind = 'markdown';
126
- // Re-process this char as markdown.
127
- return false;
128
- }
129
- // We saw '!' at column 0; need one more char to decide.
130
- return true;
131
- }
132
- // lineStartProbe === '!' means we already consumed a '!' at strict column 0.
133
- if (char === '\n') {
134
- // Line length is 1 => markdown line containing '!\n'.
135
- this.lineStartProbe = '';
136
- await this.endActiveCallBlockIfAny();
137
- this.currentLineKind = 'markdown';
138
- this.markdownChunkBuffer += '!\n';
139
- this.resetLineStateAfterNewline();
140
- return true;
141
- }
142
- if (char === '?') {
143
- // Confirmed call line prefix `!?` at column 0.
144
- this.lineStartProbe = '';
145
- await this.ensureCallLineModeStart();
146
- return true;
147
- }
148
- // Not `!?` => markdown line starting with '!' then current char.
149
- this.lineStartProbe = '';
150
- await this.endActiveCallBlockIfAny();
151
- this.currentLineKind = 'markdown';
152
- this.markdownChunkBuffer += '!' + char;
153
- this.isAtLineStart = false;
154
- return true;
155
- }
156
- async ensureCallLineModeStart() {
157
- // Transition from markdown to call line: finalize markdown fragment if active.
158
- if (this.markdownChunkBuffer.length > 0) {
159
- if (!this.markdownStarted) {
160
- await this.downstream.markdownStart();
161
- this.markdownStarted = true;
162
- }
163
- await this.downstream.markdownChunk(this.markdownChunkBuffer);
164
- this.markdownChunkBuffer = '';
165
- }
166
- if (this.markdownStarted) {
167
- await this.downstream.markdownFinish();
168
- this.markdownStarted = false;
169
- }
170
- this.currentLineKind = 'call';
171
- this.isAtLineStart = false;
172
- this.pendingCallLineRole = true;
173
- this.currentCallLineRole = null;
174
- if (!this.activeCall) {
175
- this.activeCall = {
176
- kind: 'active',
177
- validation: null,
178
- firstLineMentionParse: { kind: 'pending_first_char' },
179
- tellaskHead: '',
180
- body: '',
181
- callLineIndex: 0,
182
- phase: 'headline',
183
- tellaskHeadFinished: false,
184
- bodyStarted: false,
185
- callStartEmitted: false,
186
- };
187
- }
188
- else {
189
- this.activeCall.callLineIndex += 1;
190
- }
191
- }
192
- async processMarkdownChar(char) {
193
- // Markdown content includes all characters verbatim.
194
- this.markdownChunkBuffer += char;
195
- if (char === '\n') {
196
- this.resetLineStateAfterNewline();
197
- }
198
- else {
199
- this.isAtLineStart = false;
200
- }
201
- }
202
- async processCallChar(char) {
203
- const call = this.activeCall;
204
- if (!call) {
205
- // Should never happen: call line implies active call. Fall back to markdown.
206
- await this.processMarkdownChar(char);
207
- return;
208
- }
209
- if (this.pendingCallLineRole) {
210
- const role = this.decideCallLineRole(call, char);
211
- this.pendingCallLineRole = false;
212
- this.currentCallLineRole = role;
213
- if (role === 'body') {
214
- if (call.phase === 'headline') {
215
- await this.finishHeadlineIfNeeded();
216
- await this.startBodyIfNeeded();
217
- call.phase = 'body';
218
- }
219
- }
220
- }
221
- // First line mention validation is based on the first tellask line only.
222
- if (call.callLineIndex === 0 && call.phase === 'headline') {
223
- await this.processFirstLineMentionParse(char);
224
- }
225
- if (this.currentCallLineRole === 'headline') {
226
- this.headlineBuffer += char;
227
- }
228
- else {
229
- this.bodyBuffer += char;
230
- }
231
- if (char === '\n') {
232
- this.resetLineStateAfterNewline();
233
- }
234
- else {
235
- this.isAtLineStart = false;
236
- }
237
- }
238
- decideCallLineRole(call, firstCharAfterPrefix) {
239
- if (call.phase === 'body')
240
- return 'body';
241
- if (call.callLineIndex === 0)
242
- return 'headline';
243
- return firstCharAfterPrefix === '@' ? 'headline' : 'body';
244
- }
245
- async processFirstLineMentionParse(char) {
246
- const call = this.activeCall;
247
- if (!call)
248
- return;
249
- const parse = call.firstLineMentionParse;
250
- if (parse.kind === 'resolved')
251
- return;
252
- if (parse.kind === 'pending_first_char') {
253
- if (char === '\n') {
254
- await this.resolveFirstLineMention({ kind: 'malformed', reason: 'missing_mention_prefix' });
255
- return;
256
- }
257
- if (char !== '@') {
258
- await this.resolveFirstLineMention({ kind: 'malformed', reason: 'missing_mention_prefix' });
259
- return;
260
- }
261
- call.firstLineMentionParse = { kind: 'pending_mention_chars', raw: '' };
262
- return;
263
- }
264
- if (parse.kind === 'pending_mention_chars') {
265
- if (this.isValidMentionChar(char)) {
266
- call.firstLineMentionParse = { kind: 'pending_mention_chars', raw: parse.raw + char };
267
- return;
268
- }
269
- const trimmed = this.trimTrailingDots(parse.raw);
270
- if (trimmed.length > 0) {
271
- await this.resolveFirstLineMention({ kind: 'valid', firstMention: trimmed });
272
- }
273
- else {
274
- await this.resolveFirstLineMention({ kind: 'malformed', reason: 'invalid_mention_id' });
275
- }
276
- return;
277
- }
278
- }
279
- async resolveFirstLineMention(validation) {
280
- const call = this.activeCall;
281
- if (!call)
282
- return;
283
- call.validation = validation;
284
- call.firstLineMentionParse = { kind: 'resolved', validation };
285
- if (!call.callStartEmitted) {
286
- call.callStartEmitted = true;
287
- await this.downstream.callStart(validation);
288
- }
289
- await this.flushHeadlineBuffer();
290
- }
291
- async resolvePendingFirstLineMentionAtEofIfNeeded() {
292
- const call = this.activeCall;
293
- if (!call)
294
- return;
295
- if (call.callLineIndex !== 0)
296
- return;
297
- const parse = call.firstLineMentionParse;
298
- if (parse.kind === 'resolved')
299
- return;
300
- if (parse.kind === 'pending_first_char') {
301
- await this.resolveFirstLineMention({ kind: 'malformed', reason: 'missing_mention_prefix' });
302
- return;
303
- }
304
- if (parse.kind === 'pending_mention_chars') {
305
- const trimmed = this.trimTrailingDots(parse.raw);
306
- if (trimmed.length > 0) {
307
- await this.resolveFirstLineMention({ kind: 'valid', firstMention: trimmed });
308
- }
309
- else {
310
- await this.resolveFirstLineMention({ kind: 'malformed', reason: 'invalid_mention_id' });
311
- }
312
- }
313
- }
314
- async finishHeadlineIfNeeded() {
315
- const call = this.activeCall;
316
- if (!call)
317
- return;
318
- if (call.tellaskHeadFinished)
319
- return;
320
- if (!call.callStartEmitted) {
321
- // If the first line did not contain a mention terminator, we resolve at boundary.
322
- await this.resolvePendingFirstLineMentionAtEofIfNeeded();
323
- }
324
- await this.flushHeadlineBuffer();
325
- await this.downstream.callHeadLineFinish();
326
- call.tellaskHeadFinished = true;
327
- }
328
- async startBodyIfNeeded() {
329
- const call = this.activeCall;
330
- if (!call)
331
- return;
332
- if (call.bodyStarted)
333
- return;
334
- await this.downstream.tellaskBodyStart();
335
- call.bodyStarted = true;
336
- }
337
- async endActiveCallBlockIfAny() {
338
- const call = this.activeCall;
339
- if (!call)
340
- return;
341
- const upstreamEndOffset = this.upstreamPos;
342
- // If the first line never encountered an invalid mention delimiter, ensure we still resolve.
343
- await this.resolvePendingFirstLineMentionAtEofIfNeeded();
344
- await this.finishHeadlineIfNeeded();
345
- if (call.bodyStarted) {
346
- await this.flushBodyBuffer();
347
- await this.downstream.tellaskBodyFinish();
348
- }
349
- const validation = call.validation ?? { kind: 'malformed', reason: 'missing_mention_prefix' };
350
- const callId = (0, id_1.generateContentHash)(`tellask\n${validation.kind === 'valid' ? validation.firstMention : ''}\n${call.tellaskHead}\n${call.body}`, this.callCounter++);
351
- const collected = {
352
- validation,
353
- tellaskHead: call.tellaskHead,
354
- body: call.body,
355
- callId,
356
- };
357
- this.collectedCalls.push(collected);
358
- await this.downstream.callFinish(collected, upstreamEndOffset);
359
- this.activeCall = null;
360
- this.headlineBuffer = '';
361
- this.bodyBuffer = '';
362
- this.pendingCallLineRole = false;
363
- this.currentCallLineRole = null;
364
- }
365
- resetLineStateAfterNewline() {
366
- this.isAtLineStart = true;
367
- this.lineStartProbe = '';
368
- this.currentLineKind = 'unknown';
369
- this.pendingCallLineRole = false;
370
- this.currentCallLineRole = null;
371
- }
372
- async flushHeadlineBuffer() {
373
- const call = this.activeCall;
374
- if (!call)
375
- return;
376
- if (!call.callStartEmitted)
377
- return;
378
- if (this.headlineBuffer.length === 0)
379
- return;
380
- call.tellaskHead += this.headlineBuffer;
381
- await this.downstream.callHeadLineChunk(this.headlineBuffer);
382
- this.headlineBuffer = '';
383
- }
384
- async flushBodyBuffer() {
385
- const call = this.activeCall;
386
- if (!call)
387
- return;
388
- if (this.bodyBuffer.length === 0)
389
- return;
390
- call.body += this.bodyBuffer;
391
- await this.downstream.tellaskBodyChunk(this.bodyBuffer);
392
- this.bodyBuffer = '';
393
- }
394
- async flushAtUpstreamChunkEnd() {
395
- if (this.markdownChunkBuffer.length > 0) {
396
- if (!this.markdownStarted) {
397
- await this.downstream.markdownStart();
398
- this.markdownStarted = true;
399
- }
400
- await this.downstream.markdownChunk(this.markdownChunkBuffer);
401
- this.markdownChunkBuffer = '';
402
- }
403
- const call = this.activeCall;
404
- if (call) {
405
- if (call.callLineIndex === 0) {
406
- const parse = call.firstLineMentionParse;
407
- if (parse.kind === 'pending_mention_chars' && parse.raw.length > 0) {
408
- // Do nothing: we cannot resolve until a delimiter/newline/EOF.
409
- }
410
- }
411
- await this.flushHeadlineBuffer();
412
- if (call.bodyStarted) {
413
- await this.flushBodyBuffer();
414
- }
415
- }
416
- }
417
- isValidMentionChar(char) {
418
- const charCode = char.charCodeAt(0);
419
- return (
420
- // ASCII alphanumeric: a-z, A-Z, 0-9
421
- (charCode >= 48 && charCode <= 57) ||
422
- (charCode >= 65 && charCode <= 90) ||
423
- (charCode >= 97 && charCode <= 122) ||
424
- // Special allowed characters
425
- char === '_' ||
426
- char === '-' ||
427
- char === '.' ||
428
- // Unicode letters and digits
429
- /\p{L}/u.test(char) ||
430
- /\p{N}/u.test(char));
431
- }
432
- trimTrailingDots(value) {
433
- let out = value;
434
- while (out.endsWith('.'))
435
- out = out.slice(0, -1);
436
- return out;
437
- }
438
- }
439
- exports.TellaskStreamParser = TellaskStreamParser;
@@ -1,177 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.contextHealthReminderOwner = void 0;
4
- const driver_messages_1 = require("../shared/i18n/driver-messages");
5
- const runtime_language_1 = require("../shared/runtime-language");
6
- function isRecord(value) {
7
- return typeof value === 'object' && value !== null && !Array.isArray(value);
8
- }
9
- // Reminder meta is persisted as JSON and may come from disk; runtime validation is required.
10
- function isContextHealthReminderMeta(value) {
11
- if (!isRecord(value))
12
- return false;
13
- if (value['kind'] !== 'critical_countdown')
14
- return false;
15
- const remaining = value['remainingGenTurns'];
16
- return typeof remaining === 'number' && Number.isFinite(remaining);
17
- }
18
- function clampRemainingGenTurns(n) {
19
- const floored = Math.floor(n);
20
- if (floored < 0)
21
- return 0;
22
- if (floored > 5)
23
- return 5;
24
- return floored;
25
- }
26
- function isLastContextHealthFromCurrentGeneration(dlg) {
27
- const active = dlg.activeGenSeqOrUndefined;
28
- const snapSeq = dlg.getLastContextHealthGenseq();
29
- return active !== undefined && snapSeq !== undefined && active === snapSeq;
30
- }
31
- function formatContextHealthOwnerHeader(args) {
32
- const { language, indexHuman, snapshot } = args;
33
- const remainingGenTurns = typeof args.remainingGenTurns === 'number' ? args.remainingGenTurns : undefined;
34
- if (language === 'zh') {
35
- const lines = [
36
- '📋',
37
- `【系统托管提醒项 #${indexHuman}:上下文健康 / owner=context_health】`,
38
- '- 自动更新/自动消失;不要手工 delete_reminder',
39
- ];
40
- if (!snapshot) {
41
- lines.push('- 状态:未知(尚未获取上下文统计)');
42
- lines.push('- 优先动作:change_mind(progress) → clear_mind');
43
- return lines.join('\n');
44
- }
45
- if (snapshot.kind !== 'available') {
46
- lines.push('- 状态:未知(token 统计不可用)');
47
- lines.push('- 优先动作:change_mind(progress) → clear_mind');
48
- return lines.join('\n');
49
- }
50
- switch (snapshot.level) {
51
- case 'healthy': {
52
- lines.push('- 状态:🟢 绿(健康)');
53
- return lines.join('\n');
54
- }
55
- case 'caution': {
56
- lines.push('- 状态:🟡 黄(警告)');
57
- lines.push('- 优先动作:change_mind(progress) → clear_mind');
58
- return lines.join('\n');
59
- }
60
- case 'critical': {
61
- lines.push('- 状态:🔴 红(危险)');
62
- if (remainingGenTurns !== undefined) {
63
- lines.push(`- 倒数:剩余 ${remainingGenTurns} 次生成机会;到 0 系统将自动开启新一轮以保持稳定性`);
64
- }
65
- lines.push('- 立刻:change_mind(progress) → clear_mind');
66
- return lines.join('\n');
67
- }
68
- default: {
69
- const _exhaustive = snapshot.level;
70
- return _exhaustive;
71
- }
72
- }
73
- }
74
- const lines = [
75
- '📋',
76
- `【System-managed reminder item #${indexHuman}: context health / owner=context_health】`,
77
- '- Auto-updating/auto-dropping; do not manually delete_reminder',
78
- ];
79
- if (!snapshot) {
80
- lines.push('- Status: unknown (no context stats yet)');
81
- lines.push('- Priority: change_mind(progress) → clear_mind');
82
- return lines.join('\n');
83
- }
84
- if (snapshot.kind !== 'available') {
85
- lines.push('- Status: unknown (token usage unavailable)');
86
- lines.push('- Priority: change_mind(progress) → clear_mind');
87
- return lines.join('\n');
88
- }
89
- switch (snapshot.level) {
90
- case 'healthy': {
91
- lines.push('- Status: 🟢 green (healthy)');
92
- return lines.join('\n');
93
- }
94
- case 'caution': {
95
- lines.push('- Status: 🟡 yellow (caution)');
96
- lines.push('- Priority: change_mind(progress) → clear_mind');
97
- return lines.join('\n');
98
- }
99
- case 'critical': {
100
- lines.push('- Status: 🔴 red (critical)');
101
- if (remainingGenTurns !== undefined) {
102
- lines.push(`- Countdown: ${remainingGenTurns} generations left; at 0 auto-start new round`);
103
- }
104
- lines.push('- Must: change_mind(progress) → clear_mind');
105
- return lines.join('\n');
106
- }
107
- default: {
108
- const _exhaustive = snapshot.level;
109
- return _exhaustive;
110
- }
111
- }
112
- }
113
- exports.contextHealthReminderOwner = {
114
- name: 'context_health',
115
- async updateReminder(dlg, reminder) {
116
- if (reminder.owner !== exports.contextHealthReminderOwner) {
117
- return { treatment: 'keep' };
118
- }
119
- const snapshot = dlg.getLastContextHealth();
120
- if (!snapshot) {
121
- return { treatment: 'keep' };
122
- }
123
- if (snapshot.kind !== 'available') {
124
- return {
125
- treatment: 'update',
126
- updatedContent: (0, driver_messages_1.formatContextHealthReminderText)((0, runtime_language_1.getWorkLanguage)(), {
127
- kind: 'usage_unknown',
128
- }),
129
- updatedMeta: undefined,
130
- };
131
- }
132
- if (snapshot.level === 'healthy') {
133
- return { treatment: 'drop' };
134
- }
135
- if (snapshot.level === 'caution') {
136
- return {
137
- treatment: 'update',
138
- updatedContent: (0, driver_messages_1.formatContextHealthReminderText)((0, runtime_language_1.getWorkLanguage)(), {
139
- kind: 'over_optimal',
140
- }),
141
- updatedMeta: undefined,
142
- };
143
- }
144
- const meta = isContextHealthReminderMeta(reminder.meta) ? reminder.meta : undefined;
145
- const initialized = meta !== undefined;
146
- let remainingGenTurns = meta ? clampRemainingGenTurns(meta.remainingGenTurns) : 5;
147
- if (initialized && isLastContextHealthFromCurrentGeneration(dlg) && remainingGenTurns > 0) {
148
- remainingGenTurns -= 1;
149
- }
150
- const content = (0, driver_messages_1.formatContextHealthReminderText)((0, runtime_language_1.getWorkLanguage)(), {
151
- kind: 'over_critical',
152
- remainingGenTurns,
153
- });
154
- return {
155
- treatment: 'update',
156
- updatedContent: content,
157
- updatedMeta: { kind: 'critical_countdown', remainingGenTurns },
158
- };
159
- },
160
- async renderReminder(dlg, reminder, index) {
161
- const snapshot = dlg.getLastContextHealth();
162
- const meta = isContextHealthReminderMeta(reminder.meta) ? reminder.meta : undefined;
163
- const language = (0, runtime_language_1.getWorkLanguage)();
164
- const header = formatContextHealthOwnerHeader({
165
- language,
166
- indexHuman: index + 1,
167
- snapshot,
168
- remainingGenTurns: meta ? clampRemainingGenTurns(meta.remainingGenTurns) : undefined,
169
- });
170
- const rendered = `${header}\n---\n${reminder.content}`;
171
- return {
172
- type: 'transient_guide_msg',
173
- role: 'assistant',
174
- content: rendered,
175
- };
176
- },
177
- };