dominds 1.2.5 → 1.2.7

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 (149) hide show
  1. package/dist/agent-priming.js +2051 -0
  2. package/dist/apps/app-lock-file.js +228 -0
  3. package/dist/apps/assigned-port.js +124 -0
  4. package/dist/apps/enabled-apps.js +472 -7
  5. package/dist/apps/manifest.js +37 -0
  6. package/dist/apps/override-paths.js +19 -6
  7. package/dist/apps/problems.js +43 -0
  8. package/dist/apps/resolution-file.js +370 -0
  9. package/dist/apps/runtime.js +5 -17
  10. package/dist/apps/teammates.js +102 -1
  11. package/dist/cli/disable.js +10 -6
  12. package/dist/cli/enable.js +21 -19
  13. package/dist/cli/install.js +40 -18
  14. package/dist/cli/uninstall.js +6 -6
  15. package/dist/cli/update.js +38 -13
  16. package/dist/dialog.js +5 -0
  17. package/dist/docs/app-constitution.md +85 -18
  18. package/dist/docs/app-constitution.zh.md +86 -21
  19. package/dist/docs/dialog-system.md +1 -1
  20. package/dist/docs/dialog-system.zh.md +1 -1
  21. package/dist/docs/dominds-agent-priming.md +218 -0
  22. package/dist/docs/dominds-agent-priming.zh.md +196 -0
  23. package/dist/docs/drive-logic-context-refactor-plan.zh.md +338 -0
  24. package/dist/docs/keep-going.md +176 -0
  25. package/dist/docs/keep-going.zh.md +162 -0
  26. package/dist/docs/showing-by-doing.md +208 -0
  27. package/dist/docs/showing-by-doing.zh.md +177 -0
  28. package/dist/docs/team-mgmt-toolset.md +482 -0
  29. package/dist/docs/team-mgmt-toolset.zh.md +426 -0
  30. package/dist/llm/defaults.yaml +1 -1
  31. package/dist/llm/driver.js +4093 -0
  32. package/dist/llm/kernel-driver/drive.js +5 -2
  33. package/dist/llm/kernel-driver/flow.js +3 -0
  34. package/dist/minds/promptdocs.js +263 -0
  35. package/dist/problems.js +67 -16
  36. package/dist/server/api-routes.js +333 -0
  37. package/dist/server/prompts-routes.js +545 -0
  38. package/dist/server/server-core.js +4 -0
  39. package/dist/server/websocket-handler.js +17 -0
  40. package/dist/shared/team-mgmt-manual.js +120 -0
  41. package/dist/shared/types/prompts.js +2 -0
  42. package/dist/shared/types/tellask.js +8 -0
  43. package/dist/showing-by-doing.js +1091 -0
  44. package/dist/snippets/README.en.md +3 -0
  45. package/dist/snippets/README.md +4 -0
  46. package/dist/static/assets/{_basePickBy-CF9r08iy.js → _basePickBy-BMCtwrV7.js} +3 -3
  47. package/dist/static/assets/{_basePickBy-CF9r08iy.js.map → _basePickBy-BMCtwrV7.js.map} +1 -1
  48. package/dist/static/assets/{_baseUniq-CxKv0cd4.js → _baseUniq-BuyCgJiA.js} +2 -2
  49. package/dist/static/assets/{_baseUniq-CxKv0cd4.js.map → _baseUniq-BuyCgJiA.js.map} +1 -1
  50. package/dist/static/assets/{arc-C9JyvnlB.js → arc-BDuN8lwA.js} +2 -2
  51. package/dist/static/assets/{arc-C9JyvnlB.js.map → arc-BDuN8lwA.js.map} +1 -1
  52. package/dist/static/assets/{architectureDiagram-VXUJARFQ-CpcUgjHf.js → architectureDiagram-VXUJARFQ-C-ekqGAD.js} +7 -7
  53. package/dist/static/assets/{architectureDiagram-VXUJARFQ-CpcUgjHf.js.map → architectureDiagram-VXUJARFQ-C-ekqGAD.js.map} +1 -1
  54. package/dist/static/assets/{blockDiagram-VD42YOAC-BA9vtmm7.js → blockDiagram-VD42YOAC-CgQiNuuQ.js} +7 -7
  55. package/dist/static/assets/{blockDiagram-VD42YOAC-BA9vtmm7.js.map → blockDiagram-VD42YOAC-CgQiNuuQ.js.map} +1 -1
  56. package/dist/static/assets/{c4Diagram-YG6GDRKO-D49MGNdF.js → c4Diagram-YG6GDRKO-DONC39q-.js} +3 -3
  57. package/dist/static/assets/{c4Diagram-YG6GDRKO-D49MGNdF.js.map → c4Diagram-YG6GDRKO-DONC39q-.js.map} +1 -1
  58. package/dist/static/assets/{channel-B4KzL0Kg.js → channel-CJTFwXIG.js} +2 -2
  59. package/dist/static/assets/{channel-B4KzL0Kg.js.map → channel-CJTFwXIG.js.map} +1 -1
  60. package/dist/static/assets/{chunk-4BX2VUAB-0F-1ayl0.js → chunk-4BX2VUAB-NaIy4uLJ.js} +2 -2
  61. package/dist/static/assets/{chunk-4BX2VUAB-0F-1ayl0.js.map → chunk-4BX2VUAB-NaIy4uLJ.js.map} +1 -1
  62. package/dist/static/assets/{chunk-55IACEB6-Dnl2HDTZ.js → chunk-55IACEB6-JUKI_Ayx.js} +2 -2
  63. package/dist/static/assets/{chunk-55IACEB6-Dnl2HDTZ.js.map → chunk-55IACEB6-JUKI_Ayx.js.map} +1 -1
  64. package/dist/static/assets/{chunk-B4BG7PRW-Bhx5RbkQ.js → chunk-B4BG7PRW-dIswFJDn.js} +5 -5
  65. package/dist/static/assets/{chunk-B4BG7PRW-Bhx5RbkQ.js.map → chunk-B4BG7PRW-dIswFJDn.js.map} +1 -1
  66. package/dist/static/assets/{chunk-DI55MBZ5-EYd1wL3E.js → chunk-DI55MBZ5-DU2b_N30.js} +4 -4
  67. package/dist/static/assets/{chunk-DI55MBZ5-EYd1wL3E.js.map → chunk-DI55MBZ5-DU2b_N30.js.map} +1 -1
  68. package/dist/static/assets/{chunk-FMBD7UC4-DAjkhhUU.js → chunk-FMBD7UC4-BgExcScw.js} +2 -2
  69. package/dist/static/assets/{chunk-FMBD7UC4-DAjkhhUU.js.map → chunk-FMBD7UC4-BgExcScw.js.map} +1 -1
  70. package/dist/static/assets/{chunk-QN33PNHL-CK6TY7IE.js → chunk-QN33PNHL-bitxyqh7.js} +2 -2
  71. package/dist/static/assets/{chunk-QN33PNHL-CK6TY7IE.js.map → chunk-QN33PNHL-bitxyqh7.js.map} +1 -1
  72. package/dist/static/assets/{chunk-QZHKN3VN-CketngiE.js → chunk-QZHKN3VN-Cor8u7DT.js} +2 -2
  73. package/dist/static/assets/{chunk-QZHKN3VN-CketngiE.js.map → chunk-QZHKN3VN-Cor8u7DT.js.map} +1 -1
  74. package/dist/static/assets/{chunk-TZMSLE5B-Bcuvqo45.js → chunk-TZMSLE5B-Aceoxav_.js} +2 -2
  75. package/dist/static/assets/{chunk-TZMSLE5B-Bcuvqo45.js.map → chunk-TZMSLE5B-Aceoxav_.js.map} +1 -1
  76. package/dist/static/assets/{classDiagram-2ON5EDUG-CaP4T3r4.js → classDiagram-2ON5EDUG-D1Q6a8Hg.js} +6 -6
  77. package/dist/static/assets/{classDiagram-2ON5EDUG-CaP4T3r4.js.map → classDiagram-2ON5EDUG-D1Q6a8Hg.js.map} +1 -1
  78. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-CaP4T3r4.js → classDiagram-v2-WZHVMYZB-D1Q6a8Hg.js} +6 -6
  79. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-CaP4T3r4.js.map → classDiagram-v2-WZHVMYZB-D1Q6a8Hg.js.map} +1 -1
  80. package/dist/static/assets/{clone-C-JULvnG.js → clone-MlWbv1V0.js} +2 -2
  81. package/dist/static/assets/{clone-C-JULvnG.js.map → clone-MlWbv1V0.js.map} +1 -1
  82. package/dist/static/assets/{cose-bilkent-S5V4N54A-vXCmi_eC.js → cose-bilkent-S5V4N54A-DWPCXSrn.js} +2 -2
  83. package/dist/static/assets/{cose-bilkent-S5V4N54A-vXCmi_eC.js.map → cose-bilkent-S5V4N54A-DWPCXSrn.js.map} +1 -1
  84. package/dist/static/assets/{dagre-6UL2VRFP-bhGzX6kO.js → dagre-6UL2VRFP-C8ptQ9V3.js} +7 -7
  85. package/dist/static/assets/{dagre-6UL2VRFP-bhGzX6kO.js.map → dagre-6UL2VRFP-C8ptQ9V3.js.map} +1 -1
  86. package/dist/static/assets/{diagram-PSM6KHXK-BUKfmfGk.js → diagram-PSM6KHXK-Bgf1FqkE.js} +8 -8
  87. package/dist/static/assets/{diagram-PSM6KHXK-BUKfmfGk.js.map → diagram-PSM6KHXK-Bgf1FqkE.js.map} +1 -1
  88. package/dist/static/assets/{diagram-QEK2KX5R-DYlq3uFq.js → diagram-QEK2KX5R-BZ5xzofU.js} +7 -7
  89. package/dist/static/assets/{diagram-QEK2KX5R-DYlq3uFq.js.map → diagram-QEK2KX5R-BZ5xzofU.js.map} +1 -1
  90. package/dist/static/assets/{diagram-S2PKOQOG-CjxkLHWG.js → diagram-S2PKOQOG-Dwp47T9I.js} +7 -7
  91. package/dist/static/assets/{diagram-S2PKOQOG-CjxkLHWG.js.map → diagram-S2PKOQOG-Dwp47T9I.js.map} +1 -1
  92. package/dist/static/assets/{erDiagram-Q2GNP2WA-S3hR85On.js → erDiagram-Q2GNP2WA-Cx4weIHl.js} +5 -5
  93. package/dist/static/assets/{erDiagram-Q2GNP2WA-S3hR85On.js.map → erDiagram-Q2GNP2WA-Cx4weIHl.js.map} +1 -1
  94. package/dist/static/assets/{flowDiagram-NV44I4VS-aBmNMuQ0.js → flowDiagram-NV44I4VS-vNUuIeRk.js} +6 -6
  95. package/dist/static/assets/{flowDiagram-NV44I4VS-aBmNMuQ0.js.map → flowDiagram-NV44I4VS-vNUuIeRk.js.map} +1 -1
  96. package/dist/static/assets/{ganttDiagram-JELNMOA3-DJxXaiW1.js → ganttDiagram-JELNMOA3-BEfozJAr.js} +3 -3
  97. package/dist/static/assets/{ganttDiagram-JELNMOA3-DJxXaiW1.js.map → ganttDiagram-JELNMOA3-BEfozJAr.js.map} +1 -1
  98. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-DEOBCM0G.js → gitGraphDiagram-V2S2FVAM-eHxwc3d9.js} +8 -8
  99. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-DEOBCM0G.js.map → gitGraphDiagram-V2S2FVAM-eHxwc3d9.js.map} +1 -1
  100. package/dist/static/assets/{graph-DwrKSIE7.js → graph-C6a6uAok.js} +3 -3
  101. package/dist/static/assets/{graph-DwrKSIE7.js.map → graph-C6a6uAok.js.map} +1 -1
  102. package/dist/static/assets/{index-HWTRvE2k.js → index-D3TQbAKh.js} +383 -59
  103. package/dist/static/assets/index-D3TQbAKh.js.map +1 -0
  104. package/dist/static/assets/{infoDiagram-HS3SLOUP-BH9kVuYd.js → infoDiagram-HS3SLOUP-CX0NiId3.js} +6 -6
  105. package/dist/static/assets/{infoDiagram-HS3SLOUP-BH9kVuYd.js.map → infoDiagram-HS3SLOUP-CX0NiId3.js.map} +1 -1
  106. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-Dap7AcjR.js → journeyDiagram-XKPGCS4Q-C1IepPZ-.js} +5 -5
  107. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-Dap7AcjR.js.map → journeyDiagram-XKPGCS4Q-C1IepPZ-.js.map} +1 -1
  108. package/dist/static/assets/{kanban-definition-3W4ZIXB7-4NOl8MEj.js → kanban-definition-3W4ZIXB7-uMNX4Z1W.js} +3 -3
  109. package/dist/static/assets/{kanban-definition-3W4ZIXB7-4NOl8MEj.js.map → kanban-definition-3W4ZIXB7-uMNX4Z1W.js.map} +1 -1
  110. package/dist/static/assets/{layout-D6uIxu1E.js → layout-CpE3kk5z.js} +5 -5
  111. package/dist/static/assets/{layout-D6uIxu1E.js.map → layout-CpE3kk5z.js.map} +1 -1
  112. package/dist/static/assets/{linear-CvBOGQA2.js → linear-DV8laXr9.js} +2 -2
  113. package/dist/static/assets/{linear-CvBOGQA2.js.map → linear-DV8laXr9.js.map} +1 -1
  114. package/dist/static/assets/{mindmap-definition-VGOIOE7T-ugsrLNY5.js → mindmap-definition-VGOIOE7T-CKjgVM9S.js} +4 -4
  115. package/dist/static/assets/{mindmap-definition-VGOIOE7T-ugsrLNY5.js.map → mindmap-definition-VGOIOE7T-CKjgVM9S.js.map} +1 -1
  116. package/dist/static/assets/{pieDiagram-ADFJNKIX-CdVZjM8g.js → pieDiagram-ADFJNKIX-BBonlNyT.js} +8 -8
  117. package/dist/static/assets/{pieDiagram-ADFJNKIX-CdVZjM8g.js.map → pieDiagram-ADFJNKIX-BBonlNyT.js.map} +1 -1
  118. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-A6m5lZKd.js → quadrantDiagram-AYHSOK5B-BTI8HbBu.js} +3 -3
  119. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-A6m5lZKd.js.map → quadrantDiagram-AYHSOK5B-BTI8HbBu.js.map} +1 -1
  120. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-Cac3zSJH.js → requirementDiagram-UZGBJVZJ-ZtSr9Q5R.js} +4 -4
  121. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-Cac3zSJH.js.map → requirementDiagram-UZGBJVZJ-ZtSr9Q5R.js.map} +1 -1
  122. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DXDdUUl1.js → sankeyDiagram-TZEHDZUN-DibLVGzg.js} +2 -2
  123. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DXDdUUl1.js.map → sankeyDiagram-TZEHDZUN-DibLVGzg.js.map} +1 -1
  124. package/dist/static/assets/{sequenceDiagram-WL72ISMW-Domsjl5Y.js → sequenceDiagram-WL72ISMW-qXatfzVt.js} +4 -4
  125. package/dist/static/assets/{sequenceDiagram-WL72ISMW-Domsjl5Y.js.map → sequenceDiagram-WL72ISMW-qXatfzVt.js.map} +1 -1
  126. package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bu0lRQK1.js → stateDiagram-FKZM4ZOC-7fgxCQHo.js} +9 -9
  127. package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bu0lRQK1.js.map → stateDiagram-FKZM4ZOC-7fgxCQHo.js.map} +1 -1
  128. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-D0K-n3ic.js → stateDiagram-v2-4FDKWEC3-DcWlOAnF.js} +5 -5
  129. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-D0K-n3ic.js.map → stateDiagram-v2-4FDKWEC3-DcWlOAnF.js.map} +1 -1
  130. package/dist/static/assets/{timeline-definition-IT6M3QCI-BGvpddwR.js → timeline-definition-IT6M3QCI-iX2MRdpY.js} +3 -3
  131. package/dist/static/assets/{timeline-definition-IT6M3QCI-BGvpddwR.js.map → timeline-definition-IT6M3QCI-iX2MRdpY.js.map} +1 -1
  132. package/dist/static/assets/{treemap-GDKQZRPO-BoOzOm2j.js → treemap-GDKQZRPO-AVRnyXu1.js} +5 -5
  133. package/dist/static/assets/{treemap-GDKQZRPO-BoOzOm2j.js.map → treemap-GDKQZRPO-AVRnyXu1.js.map} +1 -1
  134. package/dist/static/assets/{xychartDiagram-PRI3JC2R-C_h3_ICR.js → xychartDiagram-PRI3JC2R-DVYEo5aJ.js} +3 -3
  135. package/dist/static/assets/{xychartDiagram-PRI3JC2R-C_h3_ICR.js.map → xychartDiagram-PRI3JC2R-DVYEo5aJ.js.map} +1 -1
  136. package/dist/static/index.html +1 -1
  137. package/dist/team.js +52 -48
  138. package/dist/tellask.js +439 -0
  139. package/dist/tools/context-health.js +177 -0
  140. package/dist/tools/diag.js +583 -0
  141. package/dist/tools/fs.js +194 -68
  142. package/dist/tools/prompts/memory/en/principles.md +13 -5
  143. package/dist/tools/prompts/memory/en/tools.md +11 -36
  144. package/dist/tools/prompts/memory/zh/principles.md +18 -8
  145. package/dist/tools/prompts/memory/zh/tools.md +11 -36
  146. package/dist/tools/team-mgmt.js +3487 -0
  147. package/dist/utils/task-doc.js +236 -0
  148. package/package.json +1 -1
  149. package/dist/static/assets/index-HWTRvE2k.js.map +0 -1
@@ -0,0 +1,583 @@
1
+ "use strict";
2
+ /**
3
+ * Module: tools/diag
4
+ *
5
+ * Diagnostic tools for developers to inspect internal parsing/streaming behavior.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.verifyTellaskParsingTool = void 0;
9
+ const tellask_1 = require("../tellask");
10
+ function parseVerifyTellaskParsingArgs(args) {
11
+ const text = args.text;
12
+ if (typeof text !== 'string') {
13
+ throw new Error(`verify_tellask_parsing.text must be a string`);
14
+ }
15
+ const includeEventsValue = args.include_events;
16
+ const includeEvents = includeEventsValue === undefined ? true : includeEventsValue === true ? true : false;
17
+ const maxEventsValue = args.max_events;
18
+ const maxEvents = typeof maxEventsValue === 'number' && Number.isInteger(maxEventsValue) && maxEventsValue > 0
19
+ ? maxEventsValue
20
+ : 600;
21
+ const upstreamChunkSizeValue = args.upstream_chunk_size;
22
+ const upstreamChunkSize = typeof upstreamChunkSizeValue === 'number' &&
23
+ Number.isInteger(upstreamChunkSizeValue) &&
24
+ upstreamChunkSizeValue > 0
25
+ ? upstreamChunkSizeValue
26
+ : 10;
27
+ const chunkSizesPlanValue = args.chunk_sizes;
28
+ const chunkSizesPlan = parseOptionalIntArray(chunkSizesPlanValue, 'verify_tellask_parsing.chunk_sizes');
29
+ const invarianceChunkSizesValue = args.invariance_chunk_sizes;
30
+ const invarianceChunkSizesParsed = parseOptionalIntArray(invarianceChunkSizesValue, 'verify_tellask_parsing.invariance_chunk_sizes');
31
+ const invarianceChunkSizes = invarianceChunkSizesParsed !== null
32
+ ? invarianceChunkSizesParsed.filter((n) => n > 0)
33
+ : [1, 2, 3, 4, 5, 7, 10, 16, 32];
34
+ const randomSeedsValue = args.random_invariance_seeds;
35
+ const randomInvarianceSeedsParsed = parseOptionalIntArray(randomSeedsValue, 'verify_tellask_parsing.random_invariance_seeds');
36
+ const randomInvarianceSeeds = randomInvarianceSeedsParsed !== null ? randomInvarianceSeedsParsed : [1, 2, 3, 4, 5, 123, 999];
37
+ const randomMaxValue = args.random_invariance_max_chunk_size;
38
+ const randomInvarianceMaxChunkSize = typeof randomMaxValue === 'number' && Number.isInteger(randomMaxValue) && randomMaxValue > 0
39
+ ? randomMaxValue
40
+ : 32;
41
+ return {
42
+ text,
43
+ upstreamChunkSize,
44
+ chunkSizesPlan,
45
+ invarianceChunkSizes,
46
+ randomInvarianceSeeds,
47
+ randomInvarianceMaxChunkSize,
48
+ includeEvents,
49
+ maxEvents,
50
+ };
51
+ }
52
+ function parseOptionalIntArray(value, name) {
53
+ if (value === undefined)
54
+ return null;
55
+ if (!Array.isArray(value)) {
56
+ throw new Error(`${name} must be an array of integers if provided`);
57
+ }
58
+ const out = [];
59
+ for (const v of value) {
60
+ if (typeof v !== 'number' || !Number.isInteger(v)) {
61
+ throw new Error(`${name} must be an array of integers if provided`);
62
+ }
63
+ out.push(v);
64
+ }
65
+ return out;
66
+ }
67
+ function previewText(value, maxLen) {
68
+ if (value.length <= maxLen)
69
+ return value;
70
+ return `${value.slice(0, maxLen)}…`;
71
+ }
72
+ class DiagTellaskReceiver {
73
+ constructor() {
74
+ this.events = [];
75
+ this.currentUpstreamChunkIndex = -1;
76
+ this.currentUpstreamChunkSize = 0;
77
+ }
78
+ setUpstreamChunkContext(index, size) {
79
+ this.currentUpstreamChunkIndex = index;
80
+ this.currentUpstreamChunkSize = size;
81
+ }
82
+ upstreamCtx() {
83
+ return {
84
+ upstreamChunkIndex: this.currentUpstreamChunkIndex,
85
+ upstreamChunkSize: this.currentUpstreamChunkSize,
86
+ };
87
+ }
88
+ async markdownStart() {
89
+ this.events.push({ kind: 'markdownStart' });
90
+ }
91
+ async markdownChunk(chunk) {
92
+ this.events.push({ kind: 'markdownChunk', chunk, ...this.upstreamCtx() });
93
+ }
94
+ async markdownFinish() {
95
+ this.events.push({ kind: 'markdownFinish' });
96
+ }
97
+ async callStart(validation) {
98
+ this.events.push({ kind: 'callStart', validation });
99
+ }
100
+ async callHeadLineChunk(chunk) {
101
+ this.events.push({ kind: 'callHeadLineChunk', chunk, ...this.upstreamCtx() });
102
+ }
103
+ async callHeadLineFinish() {
104
+ this.events.push({ kind: 'callHeadLineFinish' });
105
+ }
106
+ async tellaskBodyStart() {
107
+ this.events.push({ kind: 'tellaskBodyStart' });
108
+ }
109
+ async tellaskBodyChunk(chunk) {
110
+ this.events.push({ kind: 'tellaskBodyChunk', chunk, ...this.upstreamCtx() });
111
+ }
112
+ async tellaskBodyFinish() {
113
+ this.events.push({ kind: 'tellaskBodyFinish' });
114
+ }
115
+ async callFinish(call, _upstreamEndOffset) {
116
+ this.events.push({ kind: 'callFinish', callId: call.callId });
117
+ }
118
+ }
119
+ function segmentsDiff(baseline, got) {
120
+ const maxLen = Math.max(baseline.length, got.length);
121
+ for (let i = 0; i < maxLen; i++) {
122
+ const aSeg = i < baseline.length ? baseline[i] : null;
123
+ const bSeg = i < got.length ? got[i] : null;
124
+ if (aSeg === null || bSeg === null) {
125
+ return { kind: 'different', atIndex: i, baseline: aSeg, got: bSeg };
126
+ }
127
+ if (!segmentEqual(aSeg, bSeg)) {
128
+ return { kind: 'different', atIndex: i, baseline: aSeg, got: bSeg };
129
+ }
130
+ }
131
+ return { kind: 'equal' };
132
+ }
133
+ function segmentEqual(a, b) {
134
+ if (a.kind !== b.kind)
135
+ return false;
136
+ switch (a.kind) {
137
+ case 'markdown':
138
+ return a.text === b.text;
139
+ case 'call': {
140
+ const bb = b;
141
+ return (JSON.stringify(a.validation) === JSON.stringify(bb.validation) &&
142
+ a.tellaskHead === bb.tellaskHead &&
143
+ a.body === bb.body &&
144
+ a.callId === bb.callId);
145
+ }
146
+ default: {
147
+ const _exhaustive = a;
148
+ return _exhaustive;
149
+ }
150
+ }
151
+ }
152
+ function eventsToSegments(events) {
153
+ const segments = [];
154
+ let currentMarkdown = null;
155
+ let currentCall = null;
156
+ for (const ev of events) {
157
+ switch (ev.kind) {
158
+ case 'markdownStart':
159
+ currentMarkdown = { kind: 'markdown', text: '' };
160
+ break;
161
+ case 'markdownChunk': {
162
+ const text = ev.chunk;
163
+ if (!currentMarkdown)
164
+ currentMarkdown = { kind: 'markdown', text: '' };
165
+ currentMarkdown.text += text;
166
+ break;
167
+ }
168
+ case 'markdownFinish':
169
+ if (currentMarkdown)
170
+ segments.push(currentMarkdown);
171
+ currentMarkdown = null;
172
+ break;
173
+ case 'callStart':
174
+ currentCall = {
175
+ kind: 'call',
176
+ validation: ev.validation,
177
+ tellaskHead: '',
178
+ body: '',
179
+ callId: '',
180
+ };
181
+ break;
182
+ case 'callHeadLineChunk': {
183
+ if (!currentCall)
184
+ currentCall = {
185
+ kind: 'call',
186
+ validation: { kind: 'malformed', reason: 'missing_mention_prefix' },
187
+ tellaskHead: '',
188
+ body: '',
189
+ callId: '',
190
+ };
191
+ currentCall.tellaskHead += ev.chunk;
192
+ break;
193
+ }
194
+ case 'tellaskBodyChunk': {
195
+ if (!currentCall)
196
+ currentCall = {
197
+ kind: 'call',
198
+ validation: { kind: 'malformed', reason: 'missing_mention_prefix' },
199
+ tellaskHead: '',
200
+ body: '',
201
+ callId: '',
202
+ };
203
+ currentCall.body += ev.chunk;
204
+ break;
205
+ }
206
+ case 'callFinish':
207
+ if (currentCall) {
208
+ currentCall.callId = ev.callId;
209
+ segments.push(currentCall);
210
+ }
211
+ currentCall = null;
212
+ break;
213
+ case 'callHeadLineFinish':
214
+ case 'tellaskBodyStart':
215
+ case 'tellaskBodyFinish':
216
+ break;
217
+ default: {
218
+ const _exhaustive = ev;
219
+ void _exhaustive;
220
+ break;
221
+ }
222
+ }
223
+ }
224
+ if (currentMarkdown)
225
+ segments.push(currentMarkdown);
226
+ if (currentCall)
227
+ segments.push(currentCall);
228
+ return segments;
229
+ }
230
+ function verifyEventSequence(events) {
231
+ const issues = [];
232
+ let markdownActive = false;
233
+ let callActive = false;
234
+ let callHeadlineFinished = false;
235
+ let tellaskBodyActive = false;
236
+ for (let i = 0; i < events.length; i++) {
237
+ const ev = events[i];
238
+ switch (ev.kind) {
239
+ case 'markdownStart':
240
+ if (markdownActive)
241
+ issues.push(`event[${i}]: markdownStart while markdownActive`);
242
+ markdownActive = true;
243
+ break;
244
+ case 'markdownChunk':
245
+ if (!markdownActive)
246
+ issues.push(`event[${i}]: markdownChunk without markdownStart`);
247
+ break;
248
+ case 'markdownFinish':
249
+ if (!markdownActive)
250
+ issues.push(`event[${i}]: markdownFinish without markdownStart`);
251
+ markdownActive = false;
252
+ break;
253
+ case 'callStart':
254
+ if (callActive)
255
+ issues.push(`event[${i}]: callStart while callActive`);
256
+ callActive = true;
257
+ callHeadlineFinished = false;
258
+ tellaskBodyActive = false;
259
+ break;
260
+ case 'callHeadLineChunk':
261
+ if (!callActive)
262
+ issues.push(`event[${i}]: callHeadLineChunk without callStart`);
263
+ if (callHeadlineFinished)
264
+ issues.push(`event[${i}]: callHeadLineChunk after callHeadLineFinish`);
265
+ break;
266
+ case 'callHeadLineFinish':
267
+ if (!callActive)
268
+ issues.push(`event[${i}]: callHeadLineFinish without callStart`);
269
+ callHeadlineFinished = true;
270
+ break;
271
+ case 'tellaskBodyStart':
272
+ if (!callActive)
273
+ issues.push(`event[${i}]: tellaskBodyStart without callStart`);
274
+ if (!callHeadlineFinished)
275
+ issues.push(`event[${i}]: tellaskBodyStart before callHeadLineFinish`);
276
+ if (tellaskBodyActive)
277
+ issues.push(`event[${i}]: tellaskBodyStart while tellaskBodyActive`);
278
+ tellaskBodyActive = true;
279
+ break;
280
+ case 'tellaskBodyChunk':
281
+ if (!tellaskBodyActive)
282
+ issues.push(`event[${i}]: tellaskBodyChunk without tellaskBodyStart`);
283
+ break;
284
+ case 'tellaskBodyFinish':
285
+ if (!tellaskBodyActive)
286
+ issues.push(`event[${i}]: tellaskBodyFinish without tellaskBodyStart`);
287
+ tellaskBodyActive = false;
288
+ break;
289
+ case 'callFinish':
290
+ if (!callActive)
291
+ issues.push(`event[${i}]: callFinish without callStart`);
292
+ if (tellaskBodyActive)
293
+ issues.push(`event[${i}]: callFinish while tellaskBodyActive`);
294
+ callActive = false;
295
+ callHeadlineFinished = false;
296
+ tellaskBodyActive = false;
297
+ break;
298
+ default: {
299
+ const _exhaustive = ev;
300
+ void _exhaustive;
301
+ issues.push(`event[${i}]: unknown event`);
302
+ break;
303
+ }
304
+ }
305
+ }
306
+ if (markdownActive)
307
+ issues.push(`end: markdownActive not finished`);
308
+ if (callActive)
309
+ issues.push(`end: callActive not finished`);
310
+ if (tellaskBodyActive)
311
+ issues.push(`end: tellaskBodyActive not finished`);
312
+ return { ok: issues.length === 0, issues };
313
+ }
314
+ function makeXorShift32(seed) {
315
+ let x = seed | 0;
316
+ return () => {
317
+ x ^= x << 13;
318
+ x ^= x >>> 17;
319
+ x ^= x << 5;
320
+ return x >>> 0;
321
+ };
322
+ }
323
+ function splitIntoRandomChunks(inputLength, seed, maxChunkSize) {
324
+ const sizes = [];
325
+ const next = makeXorShift32(seed);
326
+ let remaining = inputLength;
327
+ while (remaining > 0) {
328
+ const r = next();
329
+ const size = 1 + (r % Math.max(1, maxChunkSize));
330
+ const actual = Math.min(size, remaining);
331
+ sizes.push(actual);
332
+ remaining -= actual;
333
+ }
334
+ return sizes;
335
+ }
336
+ async function parseTellaskWithChunkPlan(input, chunkSizesPlan, upstreamChunkSize) {
337
+ const receiver = new DiagTellaskReceiver();
338
+ const parser = new tellask_1.TellaskStreamParser(receiver);
339
+ const upstreamChunks = [];
340
+ const chunkPlanUsed = [];
341
+ let chunkPlanExtendedToCoverRemainder = false;
342
+ const plan = chunkSizesPlan !== null
343
+ ? [...chunkSizesPlan]
344
+ : buildFixedChunkPlan(input.length, upstreamChunkSize);
345
+ let pos = 0;
346
+ for (let idx = 0; idx < plan.length; idx++) {
347
+ const sz = plan[idx] ?? 0;
348
+ const remaining = input.length - pos;
349
+ const actual = sz <= 0 ? 0 : Math.min(sz, remaining);
350
+ const chunk = actual <= 0 ? '' : input.substring(pos, pos + actual);
351
+ receiver.setUpstreamChunkContext(upstreamChunks.length, actual);
352
+ upstreamChunks.push({
353
+ index: upstreamChunks.length,
354
+ startPos: pos,
355
+ endPos: pos + actual,
356
+ size: actual,
357
+ contentPreview: previewText(chunk, 80),
358
+ });
359
+ chunkPlanUsed.push(actual);
360
+ await parser.takeUpstreamChunk(chunk);
361
+ pos += actual;
362
+ if (pos >= input.length)
363
+ break;
364
+ }
365
+ if (pos < input.length) {
366
+ const remaining = input.substring(pos);
367
+ receiver.setUpstreamChunkContext(upstreamChunks.length, remaining.length);
368
+ upstreamChunks.push({
369
+ index: upstreamChunks.length,
370
+ startPos: pos,
371
+ endPos: input.length,
372
+ size: remaining.length,
373
+ contentPreview: previewText(remaining, 80),
374
+ });
375
+ chunkPlanUsed.push(remaining.length);
376
+ chunkPlanExtendedToCoverRemainder = true;
377
+ await parser.takeUpstreamChunk(remaining);
378
+ }
379
+ await parser.finalize();
380
+ const collectedCalls = parser.getCollectedCalls();
381
+ const events = receiver.events;
382
+ const segments = eventsToSegments(events);
383
+ return {
384
+ upstreamChunks,
385
+ events,
386
+ segments,
387
+ collectedCalls,
388
+ chunkPlanUsed,
389
+ chunkPlanExtendedToCoverRemainder,
390
+ };
391
+ }
392
+ function buildFixedChunkPlan(inputLen, chunkSize) {
393
+ if (inputLen <= 0)
394
+ return [];
395
+ const size = Math.max(1, chunkSize);
396
+ const out = [];
397
+ let remaining = inputLen;
398
+ while (remaining > 0) {
399
+ const actual = Math.min(size, remaining);
400
+ out.push(actual);
401
+ remaining -= actual;
402
+ }
403
+ return out;
404
+ }
405
+ function computeChunkingMetrics(events, upstreamChunks) {
406
+ const counts = new Map();
407
+ let downstreamChunkEvents = 0;
408
+ let smallerThanUpstream = 0;
409
+ const examples = [];
410
+ for (const ev of events) {
411
+ if (ev.kind !== 'markdownChunk' &&
412
+ ev.kind !== 'callHeadLineChunk' &&
413
+ ev.kind !== 'tellaskBodyChunk') {
414
+ continue;
415
+ }
416
+ downstreamChunkEvents++;
417
+ const prev = counts.get(ev.upstreamChunkIndex) ?? 0;
418
+ counts.set(ev.upstreamChunkIndex, prev + 1);
419
+ const downstreamSize = ev.chunk.length;
420
+ if (ev.upstreamChunkSize > 0 && downstreamSize < ev.upstreamChunkSize) {
421
+ smallerThanUpstream++;
422
+ if (examples.length < 12) {
423
+ examples.push({
424
+ eventKind: ev.kind,
425
+ upstreamChunkIndex: ev.upstreamChunkIndex,
426
+ upstreamChunkSize: ev.upstreamChunkSize,
427
+ downstreamChunkSize: downstreamSize,
428
+ downstreamPreview: previewText(ev.chunk, 60),
429
+ });
430
+ }
431
+ }
432
+ }
433
+ let withDownstream = 0;
434
+ let withMultiple = 0;
435
+ for (const chunk of upstreamChunks) {
436
+ const cnt = counts.get(chunk.index) ?? 0;
437
+ if (cnt > 0)
438
+ withDownstream++;
439
+ if (cnt > 1)
440
+ withMultiple++;
441
+ }
442
+ return {
443
+ upstreamChunks: upstreamChunks.length,
444
+ downstreamChunkEvents,
445
+ upstreamChunksWithDownstreamChunkEvents: withDownstream,
446
+ upstreamChunksWithMultipleDownstreamChunkEvents: withMultiple,
447
+ downstreamChunkEventsWithSmallerSizeThanUpstream: smallerThanUpstream,
448
+ examples,
449
+ };
450
+ }
451
+ const verifyTellaskParsingSchema = {
452
+ type: 'object',
453
+ properties: {
454
+ text: { type: 'string', description: 'Raw tellask/markdown text to parse.' },
455
+ upstream_chunk_size: {
456
+ type: 'integer',
457
+ description: 'Fixed upstream chunk size used when chunk_sizes is not provided (simulates streaming). Default: 10.',
458
+ },
459
+ chunk_sizes: {
460
+ type: 'array',
461
+ items: { type: 'integer' },
462
+ description: 'Explicit upstream chunk-size plan (like tests/tellask/realtime.ts). May include 0 for empty chunks.',
463
+ },
464
+ invariance_chunk_sizes: {
465
+ type: 'array',
466
+ items: { type: 'integer' },
467
+ description: 'Upstream chunk sizes to verify invariance against baseline single-chunk parse.',
468
+ },
469
+ random_invariance_seeds: {
470
+ type: 'array',
471
+ items: { type: 'integer' },
472
+ description: 'Seeds used to generate random chunk plans to verify invariance.',
473
+ },
474
+ random_invariance_max_chunk_size: {
475
+ type: 'integer',
476
+ description: 'Max upstream chunk size used when generating random chunk plans. Default: 32.',
477
+ },
478
+ include_events: {
479
+ type: 'boolean',
480
+ description: 'When true, include raw downstream events (truncated by max_events). Default: true.',
481
+ },
482
+ max_events: {
483
+ type: 'integer',
484
+ description: 'Max number of events to include in output when include_events=true. Default: 600.',
485
+ },
486
+ },
487
+ required: ['text'],
488
+ additionalProperties: false,
489
+ };
490
+ exports.verifyTellaskParsingTool = {
491
+ type: 'func',
492
+ name: 'verify_tellask_parsing',
493
+ description: 'Parse a raw tellask/markdown text block via TellaskStreamParser and return structured segments + streaming diagnostics.',
494
+ descriptionI18n: {
495
+ en: 'Parse a raw tellask/markdown text block via TellaskStreamParser and return structured segments + streaming diagnostics.',
496
+ zh: '将一段原始 tellask/markdown 文本交给 TellaskStreamParser 解析,并返回结构化片段与流式诊断结果。',
497
+ },
498
+ parameters: verifyTellaskParsingSchema,
499
+ argsValidation: 'dominds',
500
+ call: async (_dlg, caller, args) => {
501
+ try {
502
+ const parsed = parseVerifyTellaskParsingArgs(args);
503
+ const primary = await parseTellaskWithChunkPlan(parsed.text, parsed.chunkSizesPlan, parsed.upstreamChunkSize);
504
+ const seq = verifyEventSequence(primary.events);
505
+ const chunking = computeChunkingMetrics(primary.events, primary.upstreamChunks);
506
+ const baselineChunkSize = Math.max(1, parsed.text.length);
507
+ const baseline = await parseTellaskWithChunkPlan(parsed.text, null, baselineChunkSize);
508
+ const invarianceFailures = [];
509
+ for (const sz of parsed.invarianceChunkSizes) {
510
+ const actualSize = Math.max(1, sz);
511
+ const got = await parseTellaskWithChunkPlan(parsed.text, null, actualSize);
512
+ const diff = segmentsDiff(baseline.segments, got.segments);
513
+ if (diff.kind !== 'equal') {
514
+ invarianceFailures.push({ upstreamChunkSize: actualSize, diff });
515
+ }
516
+ }
517
+ const randomFailures = [];
518
+ for (const seed of parsed.randomInvarianceSeeds) {
519
+ const plan = splitIntoRandomChunks(parsed.text.length, seed, parsed.randomInvarianceMaxChunkSize);
520
+ const got = await parseTellaskWithChunkPlan(parsed.text, plan, parsed.upstreamChunkSize);
521
+ const diff = segmentsDiff(baseline.segments, got.segments);
522
+ if (diff.kind !== 'equal') {
523
+ randomFailures.push({
524
+ seed,
525
+ maxChunkSize: parsed.randomInvarianceMaxChunkSize,
526
+ chunkPlanPreview: previewText(plan.join(','), 120),
527
+ diff,
528
+ });
529
+ }
530
+ }
531
+ const ok = seq.ok && invarianceFailures.length === 0 && randomFailures.length === 0;
532
+ const output = {
533
+ ok,
534
+ caller: { id: caller.id, name: caller.name },
535
+ input: {
536
+ length: parsed.text.length,
537
+ upstream_chunk_size: parsed.upstreamChunkSize,
538
+ chunk_sizes_plan_provided: parsed.chunkSizesPlan !== null,
539
+ },
540
+ primary: {
541
+ chunk_plan_used: primary.chunkPlanUsed,
542
+ chunk_plan_extended_to_cover_remainder: primary.chunkPlanExtendedToCoverRemainder,
543
+ upstream_chunks: primary.upstreamChunks,
544
+ segments: primary.segments,
545
+ collected_calls: primary.collectedCalls,
546
+ events: parsed.includeEvents
547
+ ? {
548
+ total: primary.events.length,
549
+ truncated_to: Math.min(primary.events.length, parsed.maxEvents),
550
+ items: primary.events.slice(0, parsed.maxEvents),
551
+ }
552
+ : undefined,
553
+ },
554
+ baseline: {
555
+ upstream_chunk_size: baselineChunkSize,
556
+ segments: baseline.segments,
557
+ },
558
+ analysis: {
559
+ event_sequence: seq,
560
+ chunking_metrics: chunking,
561
+ invariance: {
562
+ checked_sizes: parsed.invarianceChunkSizes.map((n) => Math.max(1, n)),
563
+ failures: invarianceFailures,
564
+ },
565
+ random_invariance: {
566
+ seeds: parsed.randomInvarianceSeeds,
567
+ max_chunk_size: parsed.randomInvarianceMaxChunkSize,
568
+ failures: randomFailures,
569
+ },
570
+ },
571
+ };
572
+ return JSON.stringify(output, null, 2);
573
+ }
574
+ catch (err) {
575
+ const message = err instanceof Error ? err.message : String(err);
576
+ const stack = err instanceof Error ? err.stack : undefined;
577
+ return JSON.stringify({
578
+ ok: false,
579
+ error: { message, stack },
580
+ }, null, 2);
581
+ }
582
+ },
583
+ };