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,545 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.handleGetBuiltinPrompts = handleGetBuiltinPrompts;
40
+ exports.handleGetWorkspacePrompts = handleGetWorkspacePrompts;
41
+ exports.handleGetPromptCatalog = handleGetPromptCatalog;
42
+ exports.handleSaveWorkspacePrompt = handleSaveWorkspacePrompt;
43
+ exports.handleTeamMgmtManual = handleTeamMgmtManual;
44
+ const promises_1 = __importDefault(require("fs/promises"));
45
+ const path_1 = __importDefault(require("path"));
46
+ const yaml_1 = __importDefault(require("yaml"));
47
+ const log_1 = require("../log");
48
+ const log = (0, log_1.createLogger)('prompts-routes');
49
+ function isRecord(value) {
50
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
51
+ }
52
+ function requireNonEmptyString(value) {
53
+ return typeof value === 'string' && value.trim() !== '' ? value : null;
54
+ }
55
+ function parseSaveWorkspacePromptTemplateRequest(raw) {
56
+ if (!isRecord(raw))
57
+ return null;
58
+ const groupKey = requireNonEmptyString(raw['groupKey']);
59
+ const uiLanguageRaw = raw['uiLanguage'];
60
+ const uiLanguage = uiLanguageRaw === 'zh' || uiLanguageRaw === 'en' ? uiLanguageRaw : null;
61
+ const name = requireNonEmptyString(raw['name']);
62
+ const content = requireNonEmptyString(raw['content']);
63
+ if (!groupKey || !uiLanguage || !name || !content)
64
+ return null;
65
+ const fileNameRaw = raw['fileName'];
66
+ const fileName = typeof fileNameRaw === 'string' && fileNameRaw.trim() !== '' ? fileNameRaw : undefined;
67
+ const descriptionRaw = raw['description'];
68
+ const description = typeof descriptionRaw === 'string' && descriptionRaw.trim() !== '' ? descriptionRaw : undefined;
69
+ return { name, uiLanguage, fileName, description, content, groupKey };
70
+ }
71
+ function buildWorkspaceTemplateTokenFromName(name) {
72
+ return sanitizeWorkspaceTemplateFileName(name);
73
+ }
74
+ function buildWorkspaceTemplateTokenFromFileName(fileName) {
75
+ return sanitizeWorkspaceTemplateFileName(fileName);
76
+ }
77
+ function parseCatalogYaml(rawText) {
78
+ try {
79
+ const parsed = yaml_1.default.parse(rawText);
80
+ if (!isRecord(parsed))
81
+ return null;
82
+ const out = {};
83
+ for (const [k, v] of Object.entries(parsed)) {
84
+ if (!isRecord(v))
85
+ continue;
86
+ out[k] = {
87
+ name: typeof v['name'] === 'string' ? v['name'] : undefined,
88
+ 'name-zh': typeof v['name-zh'] === 'string' ? v['name-zh'] : undefined,
89
+ snippets: v['snippets'],
90
+ };
91
+ }
92
+ return out;
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ }
98
+ async function loadCatalogFromPath(abs) {
99
+ try {
100
+ const raw = await promises_1.default.readFile(abs, 'utf-8');
101
+ return parseCatalogYaml(raw);
102
+ }
103
+ catch {
104
+ return null;
105
+ }
106
+ }
107
+ function stripLangSuffixFromSnippetId(id) {
108
+ if (id.endsWith('.zh.md'))
109
+ return id.slice(0, -'.zh.md'.length);
110
+ if (id.endsWith('.en.md'))
111
+ return id.slice(0, -'.en.md'.length);
112
+ if (id.endsWith('.md'))
113
+ return id.slice(0, -'.md'.length);
114
+ return id;
115
+ }
116
+ async function buildPromptCatalog() {
117
+ const builtin = await readBuiltinPromptTemplates();
118
+ const workspace = await readWorkspacePromptTemplates();
119
+ const serverRoot = path_1.default.resolve(__dirname, '..', '..');
120
+ const builtinCatalogAbs = path_1.default.resolve(serverRoot, 'dist', 'snippets', 'catalog.yaml');
121
+ const builtinCatalogFallbackAbs = path_1.default.resolve(serverRoot, 'snippets', 'catalog.yaml');
122
+ const rtwsRoot = path_1.default.resolve(process.cwd());
123
+ const workspaceCatalogAbs = path_1.default.resolve(rtwsRoot, '.minds', 'prompts', 'catalog.yaml');
124
+ const builtinCatalog = (await loadCatalogFromPath(builtinCatalogAbs)) ??
125
+ (await loadCatalogFromPath(builtinCatalogFallbackAbs));
126
+ const workspaceCatalog = await loadCatalogFromPath(workspaceCatalogAbs);
127
+ if (!builtinCatalog && !workspaceCatalog) {
128
+ return [
129
+ {
130
+ key: 'all',
131
+ titleI18n: { en: 'All', zh: '全部' },
132
+ templates: [...builtin, ...workspace],
133
+ },
134
+ ];
135
+ }
136
+ const builtinByToken = new Map();
137
+ for (const tpl of builtin) {
138
+ const p = typeof tpl.path === 'string' ? tpl.path : '';
139
+ if (!p.startsWith('snippets/'))
140
+ continue;
141
+ const noExt = stripLangSuffixFromSnippetId(p);
142
+ const token = noExt.replace(/^snippets\//, '');
143
+ if (!builtinByToken.has(token))
144
+ builtinByToken.set(token, tpl);
145
+ }
146
+ const workspaceByGroupAndToken = new Map();
147
+ for (const tpl of workspace) {
148
+ const p = typeof tpl.path === 'string' ? tpl.path : '';
149
+ if (!p.startsWith('.minds/prompts/'))
150
+ continue;
151
+ const rel = p.slice('.minds/prompts/'.length);
152
+ const parts = rel.split('/').filter((x) => x !== '');
153
+ const groupKey = parts[0];
154
+ const rest = parts.slice(1).join('/');
155
+ if (!groupKey || !rest)
156
+ continue;
157
+ const token = stripLangSuffixFromSnippetId(rest);
158
+ const k = `${groupKey}/${token}`;
159
+ if (!workspaceByGroupAndToken.has(k))
160
+ workspaceByGroupAndToken.set(k, tpl);
161
+ }
162
+ const keys = [];
163
+ if (builtinCatalog) {
164
+ keys.push(...Object.keys(builtinCatalog));
165
+ }
166
+ if (workspaceCatalog) {
167
+ for (const k of Object.keys(workspaceCatalog)) {
168
+ if (!keys.includes(k))
169
+ keys.push(k);
170
+ }
171
+ }
172
+ const groups = [];
173
+ for (const groupKey of keys) {
174
+ const metaBuiltin = builtinCatalog ? builtinCatalog[groupKey] : undefined;
175
+ const metaWorkspace = workspaceCatalog ? workspaceCatalog[groupKey] : undefined;
176
+ const titleEn = metaWorkspace?.name ?? metaBuiltin?.name ?? groupKey;
177
+ const titleZh = metaWorkspace?.['name-zh'] ??
178
+ metaBuiltin?.['name-zh'] ??
179
+ metaWorkspace?.name ??
180
+ metaBuiltin?.name ??
181
+ groupKey;
182
+ const templates = [];
183
+ if (metaBuiltin && Array.isArray(metaBuiltin.snippets)) {
184
+ for (const raw of metaBuiltin.snippets) {
185
+ if (typeof raw !== 'string')
186
+ continue;
187
+ const token = raw.trim();
188
+ if (!token)
189
+ continue;
190
+ const tpl = builtinByToken.get(token);
191
+ if (tpl)
192
+ templates.push(tpl);
193
+ }
194
+ }
195
+ if (metaWorkspace && Array.isArray(metaWorkspace.snippets)) {
196
+ for (const raw of metaWorkspace.snippets) {
197
+ if (typeof raw !== 'string')
198
+ continue;
199
+ const token = raw.trim();
200
+ if (!token)
201
+ continue;
202
+ const tpl = workspaceByGroupAndToken.get(`${groupKey}/${token}`);
203
+ if (tpl)
204
+ templates.push(tpl);
205
+ }
206
+ }
207
+ if (templates.length === 0)
208
+ continue;
209
+ // If a workspace template uses the same display name as a builtin template,
210
+ // prefer the workspace version to support "override" via same-name saves.
211
+ const workspaceNames = new Set();
212
+ for (const tpl of templates) {
213
+ if (tpl.source === 'workspace')
214
+ workspaceNames.add(tpl.name);
215
+ }
216
+ const filtered = [];
217
+ const seenNames = new Set();
218
+ for (const tpl of templates) {
219
+ if (tpl.source === 'builtin' && workspaceNames.has(tpl.name)) {
220
+ continue;
221
+ }
222
+ if (seenNames.has(tpl.name)) {
223
+ continue;
224
+ }
225
+ seenNames.add(tpl.name);
226
+ filtered.push(tpl);
227
+ }
228
+ groups.push({ key: groupKey, titleI18n: { en: titleEn, zh: titleZh }, templates: filtered });
229
+ }
230
+ if (groups.length === 0) {
231
+ return [
232
+ {
233
+ key: 'all',
234
+ titleI18n: { en: 'All', zh: '全部' },
235
+ templates: [...builtin, ...workspace],
236
+ },
237
+ ];
238
+ }
239
+ return groups;
240
+ }
241
+ function parseTeamMgmtManualRequest(raw) {
242
+ if (!isRecord(raw))
243
+ return null;
244
+ const uiLanguageRaw = raw['uiLanguage'];
245
+ const uiLanguage = uiLanguageRaw === 'zh' || uiLanguageRaw === 'en' ? uiLanguageRaw : null;
246
+ if (!uiLanguage)
247
+ return null;
248
+ const topicsValue = raw['topics'];
249
+ if (topicsValue === undefined) {
250
+ return { uiLanguage, topics: undefined };
251
+ }
252
+ if (!Array.isArray(topicsValue))
253
+ return null;
254
+ const topics = [];
255
+ for (const v of topicsValue) {
256
+ if (typeof v !== 'string')
257
+ return null;
258
+ topics.push(v);
259
+ }
260
+ return { uiLanguage, topics };
261
+ }
262
+ function safeTemplateIdFromPath(relPath) {
263
+ return relPath.replace(/\\/g, '/');
264
+ }
265
+ function stripOptionalBom(text) {
266
+ return text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;
267
+ }
268
+ function parseFrontmatter(rawText) {
269
+ const normalized = stripOptionalBom(rawText).replace(/\r\n/g, '\n');
270
+ const m = normalized.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
271
+ if (!m)
272
+ return { kind: 'none', body: rawText };
273
+ const fmText = m[1] ?? '';
274
+ const body = m[2] ?? '';
275
+ try {
276
+ const parsed = yaml_1.default.parse(fmText);
277
+ if (!isRecord(parsed))
278
+ return { kind: 'none', body };
279
+ const name = typeof parsed['name'] === 'string' ? parsed['name'] : undefined;
280
+ const description = typeof parsed['description'] === 'string' ? parsed['description'] : undefined;
281
+ return { kind: 'parsed', body, name, description };
282
+ }
283
+ catch {
284
+ return { kind: 'none', body };
285
+ }
286
+ }
287
+ function safeBasenameToName(filename) {
288
+ const base = filename.replace(/\.md$/i, '').trim();
289
+ return base === '' ? filename : base;
290
+ }
291
+ function ensureInsideDir(dirAbs, candidateAbs) {
292
+ return candidateAbs === dirAbs || candidateAbs.startsWith(dirAbs + path_1.default.sep);
293
+ }
294
+ async function listMarkdownFilesRecursively(dirAbs) {
295
+ const out = [];
296
+ const walk = async (abs) => {
297
+ let entries;
298
+ try {
299
+ entries = await promises_1.default.readdir(abs, { withFileTypes: true });
300
+ }
301
+ catch {
302
+ return;
303
+ }
304
+ for (const ent of entries) {
305
+ const childAbs = path_1.default.join(abs, ent.name);
306
+ if (ent.isDirectory()) {
307
+ await walk(childAbs);
308
+ continue;
309
+ }
310
+ if (ent.isFile() && ent.name.toLowerCase().endsWith('.md')) {
311
+ out.push(childAbs);
312
+ }
313
+ }
314
+ };
315
+ await walk(dirAbs);
316
+ return out;
317
+ }
318
+ async function readBuiltinPromptTemplates() {
319
+ const serverRoot = path_1.default.resolve(__dirname, '..', '..');
320
+ const candidates = [
321
+ path_1.default.resolve(serverRoot, 'dist', 'snippets'),
322
+ path_1.default.resolve(serverRoot, 'snippets'),
323
+ ];
324
+ let snippetsDir = null;
325
+ for (const dir of candidates) {
326
+ try {
327
+ const st = await promises_1.default.stat(dir);
328
+ if (st.isDirectory()) {
329
+ snippetsDir = dir;
330
+ break;
331
+ }
332
+ }
333
+ catch {
334
+ // ignore
335
+ }
336
+ }
337
+ if (!snippetsDir)
338
+ return [];
339
+ const files = await listMarkdownFilesRecursively(snippetsDir);
340
+ const templates = [];
341
+ for (const abs of files) {
342
+ if (path_1.default.basename(abs).toLowerCase() === 'readme.md')
343
+ continue;
344
+ try {
345
+ const raw = await promises_1.default.readFile(abs, 'utf-8');
346
+ const parsed = parseFrontmatter(raw);
347
+ const rel = path_1.default.relative(snippetsDir, abs).replace(/\\/g, '/');
348
+ templates.push({
349
+ id: `builtin:${safeTemplateIdFromPath(rel)}`,
350
+ name: parsed.kind === 'parsed' && parsed.name
351
+ ? parsed.name
352
+ : safeBasenameToName(path_1.default.basename(abs)),
353
+ description: parsed.kind === 'parsed' ? parsed.description : undefined,
354
+ content: parsed.kind === 'parsed' ? parsed.body : raw,
355
+ source: 'builtin',
356
+ path: `snippets/${rel}`,
357
+ });
358
+ }
359
+ catch {
360
+ // ignore unreadable file
361
+ }
362
+ }
363
+ return templates;
364
+ }
365
+ async function readWorkspacePromptTemplates() {
366
+ const rtwsRoot = path_1.default.resolve(process.cwd());
367
+ const promptsDir = path_1.default.resolve(rtwsRoot, '.minds', 'prompts');
368
+ const files = await listMarkdownFilesRecursively(promptsDir);
369
+ const templates = [];
370
+ for (const abs of files) {
371
+ try {
372
+ const raw = await promises_1.default.readFile(abs, 'utf-8');
373
+ const parsed = parseFrontmatter(raw);
374
+ const rel = path_1.default.relative(promptsDir, abs).replace(/\\/g, '/');
375
+ templates.push({
376
+ id: `workspace:${safeTemplateIdFromPath(rel)}`,
377
+ name: parsed.kind === 'parsed' && parsed.name
378
+ ? parsed.name
379
+ : safeBasenameToName(path_1.default.basename(abs)),
380
+ description: parsed.kind === 'parsed' ? parsed.description : undefined,
381
+ content: parsed.kind === 'parsed' ? parsed.body : raw,
382
+ source: 'workspace',
383
+ path: `.minds/prompts/${rel}`,
384
+ });
385
+ }
386
+ catch {
387
+ // ignore
388
+ }
389
+ }
390
+ return templates;
391
+ }
392
+ function sanitizeWorkspaceTemplateFileName(name) {
393
+ const trimmed = name.trim();
394
+ const base = trimmed.replace(/[^a-zA-Z0-9\-_\u4e00-\u9fff]+/g, '-').replace(/-+/g, '-');
395
+ const safe = base.replace(/^[-_]+/, '').replace(/[-_]+$/, '');
396
+ return safe === '' ? 'prompt' : safe;
397
+ }
398
+ async function upsertWorkspaceCatalogEntry(promptsDirAbs, groupKey, token) {
399
+ const catalogAbs = path_1.default.resolve(promptsDirAbs, 'catalog.yaml');
400
+ let catalog = {};
401
+ try {
402
+ const raw = await promises_1.default.readFile(catalogAbs, 'utf-8');
403
+ const parsed = parseCatalogYaml(raw);
404
+ if (parsed)
405
+ catalog = parsed;
406
+ }
407
+ catch {
408
+ // ignore
409
+ }
410
+ const existing = catalog[groupKey];
411
+ const meta = isRecord(existing) ? { ...existing } : {};
412
+ const prevSnippets = meta['snippets'];
413
+ const snippets = [];
414
+ if (Array.isArray(prevSnippets)) {
415
+ for (const item of prevSnippets) {
416
+ if (typeof item === 'string' && item.trim() !== '')
417
+ snippets.push(item.trim());
418
+ }
419
+ }
420
+ if (!snippets.includes(token))
421
+ snippets.push(token);
422
+ meta['snippets'] = snippets;
423
+ catalog[groupKey] = meta;
424
+ await promises_1.default.mkdir(promptsDirAbs, { recursive: true });
425
+ await promises_1.default.writeFile(catalogAbs, yaml_1.default.stringify(catalog), 'utf-8');
426
+ }
427
+ async function handleGetBuiltinPrompts() {
428
+ try {
429
+ const templates = await readBuiltinPromptTemplates();
430
+ return { success: true, templates };
431
+ }
432
+ catch (error) {
433
+ log.error('Failed to read builtin prompts', error);
434
+ return { success: false, error: 'Failed to load builtin prompts' };
435
+ }
436
+ }
437
+ async function handleGetWorkspacePrompts() {
438
+ try {
439
+ const templates = await readWorkspacePromptTemplates();
440
+ return { success: true, templates };
441
+ }
442
+ catch (error) {
443
+ log.error('Failed to read workspace prompts', error);
444
+ return { success: false, error: 'Failed to load workspace prompts' };
445
+ }
446
+ }
447
+ async function handleGetPromptCatalog() {
448
+ try {
449
+ const groups = await buildPromptCatalog();
450
+ return { success: true, groups };
451
+ }
452
+ catch (error) {
453
+ log.error('Failed to build prompt catalog', error);
454
+ return { success: false, error: 'Failed to load prompt catalog' };
455
+ }
456
+ }
457
+ async function handleSaveWorkspacePrompt(rawBody) {
458
+ let parsed;
459
+ try {
460
+ parsed = rawBody ? JSON.parse(rawBody) : {};
461
+ }
462
+ catch {
463
+ return { success: false, error: 'Invalid JSON body' };
464
+ }
465
+ const req = parseSaveWorkspacePromptTemplateRequest(parsed);
466
+ if (!req)
467
+ return { success: false, error: 'Invalid request body' };
468
+ const rtwsRoot = path_1.default.resolve(process.cwd());
469
+ const promptsDir = path_1.default.resolve(rtwsRoot, '.minds', 'prompts');
470
+ const safeName = typeof req.fileName === 'string' && req.fileName.trim() !== ''
471
+ ? sanitizeWorkspaceTemplateFileName(req.fileName)
472
+ : sanitizeWorkspaceTemplateFileName(req.name);
473
+ const langSuffix = req.uiLanguage;
474
+ const fileBasename = safeName.endsWith(`.${langSuffix}`) ? safeName : `${safeName}.${langSuffix}`;
475
+ const groupKey = sanitizeWorkspaceTemplateFileName(req.groupKey);
476
+ const fileAbs = path_1.default.resolve(promptsDir, groupKey, `${fileBasename}.md`);
477
+ if (!ensureInsideDir(promptsDir, fileAbs)) {
478
+ return { success: false, error: 'Invalid template name' };
479
+ }
480
+ try {
481
+ await promises_1.default.mkdir(path_1.default.dirname(fileAbs), { recursive: true });
482
+ const headerData = { name: req.name.trim() };
483
+ if (typeof req.description === 'string' && req.description.trim() !== '') {
484
+ headerData['description'] = req.description.trim();
485
+ }
486
+ const header = yaml_1.default.stringify(headerData).trimEnd();
487
+ const serialized = `---\n${header}\n---\n\n${req.content.trimEnd()}\n`;
488
+ await promises_1.default.writeFile(fileAbs, serialized, 'utf-8');
489
+ await upsertWorkspaceCatalogEntry(promptsDir, groupKey, typeof req.fileName === 'string' && req.fileName.trim() !== ''
490
+ ? buildWorkspaceTemplateTokenFromFileName(req.fileName)
491
+ : buildWorkspaceTemplateTokenFromName(req.name));
492
+ const rel = path_1.default.relative(promptsDir, fileAbs).replace(/\\/g, '/');
493
+ return {
494
+ success: true,
495
+ template: {
496
+ id: `workspace:${safeTemplateIdFromPath(rel)}`,
497
+ name: req.name.trim(),
498
+ description: typeof req.description === 'string' ? req.description : undefined,
499
+ content: req.content,
500
+ source: 'workspace',
501
+ path: `.minds/prompts/${rel}`,
502
+ },
503
+ };
504
+ }
505
+ catch (error) {
506
+ log.error('Failed to save workspace prompt', error);
507
+ return { success: false, error: 'Failed to save prompt template' };
508
+ }
509
+ }
510
+ async function handleTeamMgmtManual(rawBody) {
511
+ let parsed;
512
+ try {
513
+ parsed = rawBody ? JSON.parse(rawBody) : {};
514
+ }
515
+ catch {
516
+ return { success: false, error: 'Invalid JSON body' };
517
+ }
518
+ const req = parseTeamMgmtManualRequest(parsed);
519
+ if (!req)
520
+ return { success: false, error: 'Invalid request body' };
521
+ try {
522
+ const { getTool } = await Promise.resolve().then(() => __importStar(require('../tools/registry')));
523
+ const tool = getTool('team_mgmt_manual');
524
+ if (!tool || tool.type !== 'func') {
525
+ return { success: false, error: 'team_mgmt_manual tool not available' };
526
+ }
527
+ const fakeDlg = {
528
+ getLastUserLanguageCode: () => req.uiLanguage,
529
+ };
530
+ const { Team } = await Promise.resolve().then(() => __importStar(require('../team')));
531
+ const caller = new Team.Member({
532
+ id: 'webui',
533
+ name: 'WebUI',
534
+ read_dirs: ['.minds/**'],
535
+ write_dirs: ['.minds/**'],
536
+ });
537
+ const markdown = await tool.call(fakeDlg, caller, { topics: req.topics ?? [] });
538
+ return { success: true, markdown: String(markdown) };
539
+ }
540
+ catch (error) {
541
+ const msg = error instanceof Error ? error.message : 'Failed to load team manual';
542
+ log.error('Failed to call team_mgmt_manual', error);
543
+ return { success: false, error: msg };
544
+ }
545
+ }
@@ -90,6 +90,10 @@ class HttpServerCore {
90
90
  return;
91
91
  }
92
92
  }
93
+ // Backend-direct workspace file preview page.
94
+ if (await (0, api_routes_1.handleWorkspaceFilePreviewPage)(req, res, pathname)) {
95
+ return;
96
+ }
93
97
  // Handle API routes
94
98
  if (pathname.startsWith('/api/')) {
95
99
  const authCheck = (0, auth_1.getHttpAuthCheck)(req, this.config.auth ?? { kind: 'disabled' });
@@ -99,6 +99,7 @@ async function queueUserSupplementAtGenerationBoundary(dialog, prompt) {
99
99
  msgId: prompt.msgId,
100
100
  grammar: prompt.grammar,
101
101
  userLanguageCode: prompt.userLanguageCode,
102
+ origin: 'user',
102
103
  });
103
104
  (0, evt_registry_1.postDialogEvent)(dialog, {
104
105
  type: 'queue_user_msg_evt',
@@ -199,6 +200,9 @@ async function handleWebSocketMessage(ws, packet) {
199
200
  case 'get_problems':
200
201
  await handleGetProblems(ws, packet);
201
202
  break;
203
+ case 'clear_resolved_problems':
204
+ await handleClearResolvedProblems(ws, packet);
205
+ break;
202
206
  case 'create_dialog':
203
207
  await handleCreateDialog(ws, packet);
204
208
  break;
@@ -516,6 +520,18 @@ async function handleGetProblems(ws, packet) {
516
520
  const _req = packet;
517
521
  ws.send(JSON.stringify((0, problems_1.createProblemsSnapshotMessage)()));
518
522
  }
523
+ async function handleClearResolvedProblems(ws, packet) {
524
+ if (packet.type !== 'clear_resolved_problems') {
525
+ throw new Error('Internal error: handleClearResolvedProblems called with non clear_resolved_problems packet');
526
+ }
527
+ const _req = packet;
528
+ const removedCount = (0, problems_1.clearResolvedProblems)();
529
+ ws.send(JSON.stringify({
530
+ type: 'clear_resolved_problems_result',
531
+ removedCount,
532
+ timestamp: (0, time_1.formatUnifiedTimestamp)(new Date()),
533
+ }));
534
+ }
519
535
  async function handleSetUiLanguage(ws, packet) {
520
536
  if (packet.type !== 'set_ui_language') {
521
537
  throw new Error('Internal error: handleSetUiLanguage called with non set_ui_language packet');
@@ -1214,6 +1230,7 @@ async function handleUserAnswer2Q4H(ws, packet) {
1214
1230
  msgId: effectivePrompt.msgId,
1215
1231
  grammar: effectivePrompt.grammar,
1216
1232
  userLanguageCode: effectivePrompt.userLanguageCode,
1233
+ origin: 'user',
1217
1234
  q4hAnswerCallIds: askHumanCallIds,
1218
1235
  runControl: undefined,
1219
1236
  });