dominds 1.25.1 → 1.25.3

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 (189) hide show
  1. package/README.md +4 -3
  2. package/README.zh.md +4 -3
  3. package/dist/cli/tui.js +2 -0
  4. package/dist/cli/webui.js +2 -0
  5. package/dist/cli.js +2 -0
  6. package/dist/process-title.d.ts +2 -0
  7. package/dist/process-title.js +13 -0
  8. package/dist/server/api-routes.js +14 -0
  9. package/dist/server/dominds-self-update.d.ts +1 -0
  10. package/dist/server/dominds-self-update.js +17 -0
  11. package/dist/team.js +4 -1
  12. package/dist/tools/builtins.js +30 -0
  13. package/dist/tools/fs.d.ts +2 -0
  14. package/dist/tools/fs.js +281 -2
  15. package/dist/tools/os.d.ts +11 -0
  16. package/dist/tools/os.js +20 -9
  17. package/dist/tools/picture.d.ts +1 -0
  18. package/dist/tools/picture.js +64 -1
  19. package/dist/tools/prompts/codex_inspect_and_patch_tools/en/tools.md +5 -0
  20. package/dist/tools/prompts/codex_inspect_and_patch_tools/zh/tools.md +5 -0
  21. package/dist/tools/prompts/fs_read/en/errors.md +6 -0
  22. package/dist/tools/prompts/fs_read/en/index.md +17 -0
  23. package/dist/tools/prompts/fs_read/en/principles.md +5 -0
  24. package/dist/tools/prompts/fs_read/en/scenarios.md +3 -0
  25. package/dist/tools/prompts/fs_read/en/tools.md +11 -0
  26. package/dist/tools/prompts/fs_read/zh/errors.md +6 -0
  27. package/dist/tools/prompts/fs_read/zh/index.md +17 -0
  28. package/dist/tools/prompts/fs_read/zh/principles.md +5 -0
  29. package/dist/tools/prompts/fs_read/zh/scenarios.md +3 -0
  30. package/dist/tools/prompts/fs_read/zh/tools.md +11 -0
  31. package/dist/tools/prompts/os/en/index.md +1 -1
  32. package/dist/tools/prompts/os/en/principles.md +1 -1
  33. package/dist/tools/prompts/os/en/scenarios.md +21 -0
  34. package/dist/tools/prompts/os/en/tools.md +6 -0
  35. package/dist/tools/prompts/os/zh/index.md +1 -1
  36. package/dist/tools/prompts/os/zh/principles.md +1 -1
  37. package/dist/tools/prompts/os/zh/scenarios.md +21 -0
  38. package/dist/tools/prompts/os/zh/tools.md +6 -0
  39. package/dist/tools/registry.d.ts +6 -0
  40. package/dist/tools/ripgrep.d.ts +5 -0
  41. package/dist/tools/ripgrep.js +482 -1
  42. package/dist/tools/txt.d.ts +34 -0
  43. package/dist/tools/txt.js +221 -1
  44. package/package.json +3 -3
  45. package/webapp/dist/assets/{_basePickBy-CG55qWp2.js → _basePickBy-CePmq6WU.js} +3 -3
  46. package/webapp/dist/assets/_basePickBy-CePmq6WU.js.map +1 -0
  47. package/webapp/dist/assets/{_baseUniq-Dd4UGB2O.js → _baseUniq-DAB2FR9P.js} +2 -2
  48. package/webapp/dist/assets/_baseUniq-DAB2FR9P.js.map +1 -0
  49. package/webapp/dist/assets/{arc-C2qiF4r3.js → arc-BmAGUHtw.js} +2 -2
  50. package/webapp/dist/assets/arc-BmAGUHtw.js.map +1 -0
  51. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-DQ4Z8fy_.js → architectureDiagram-VXUJARFQ-BBsOS4fu.js} +8 -26
  52. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-BBsOS4fu.js.map +1 -0
  53. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-CPvOuMZA.js → blockDiagram-VD42YOAC-Cuxh8em4.js} +170 -187
  54. package/webapp/dist/assets/blockDiagram-VD42YOAC-Cuxh8em4.js.map +1 -0
  55. package/webapp/dist/assets/{c4Diagram-IC4MRINW-DElaFpnJ.js → c4Diagram-YG6GDRKO-L56ctb3A.js} +4 -4
  56. package/webapp/dist/assets/c4Diagram-YG6GDRKO-L56ctb3A.js.map +1 -0
  57. package/webapp/dist/assets/{channel-BR7mZa90.js → channel-Ic6QamsR.js} +2 -2
  58. package/webapp/dist/assets/channel-Ic6QamsR.js.map +1 -0
  59. package/webapp/dist/assets/{chunk-4BX2VUAB-DTmXCBYX.js → chunk-4BX2VUAB-B8UiHrZa.js} +2 -2
  60. package/webapp/dist/assets/chunk-4BX2VUAB-B8UiHrZa.js.map +1 -0
  61. package/webapp/dist/assets/{chunk-55IACEB6-DeBB4aJ4.js → chunk-55IACEB6-9QqsT66L.js} +2 -2
  62. package/webapp/dist/assets/chunk-55IACEB6-9QqsT66L.js.map +1 -0
  63. package/webapp/dist/assets/{chunk-WL4C6EOR-V3Fq1ULq.js → chunk-B4BG7PRW-Cs-W2Q5y.js} +121 -171
  64. package/webapp/dist/assets/chunk-B4BG7PRW-Cs-W2Q5y.js.map +1 -0
  65. package/webapp/dist/assets/{chunk-NQ4KR5QH-DRcsqoac.js → chunk-DI55MBZ5-uGc9dcaR.js} +7 -9
  66. package/webapp/dist/assets/chunk-DI55MBZ5-uGc9dcaR.js.map +1 -0
  67. package/webapp/dist/assets/{chunk-FMBD7UC4-CXpgeev4.js → chunk-FMBD7UC4-DimBaUep.js} +2 -2
  68. package/webapp/dist/assets/chunk-FMBD7UC4-DimBaUep.js.map +1 -0
  69. package/webapp/dist/assets/{chunk-KX2RTZJC-DWG_wpHB.js → chunk-QN33PNHL-HUOaMARz.js} +2 -2
  70. package/webapp/dist/assets/chunk-QN33PNHL-HUOaMARz.js.map +1 -0
  71. package/webapp/dist/assets/{chunk-QZHKN3VN-B9GPAJ2s.js → chunk-QZHKN3VN-pR62PJlL.js} +2 -2
  72. package/webapp/dist/assets/chunk-QZHKN3VN-pR62PJlL.js.map +1 -0
  73. package/webapp/dist/assets/{chunk-JSJVCQXG-DWfckfhO.js → chunk-TZMSLE5B-DtHl61is.js} +6 -14
  74. package/webapp/dist/assets/chunk-TZMSLE5B-DtHl61is.js.map +1 -0
  75. package/webapp/dist/assets/{classDiagram-VBA2DB6C-DspG486Z.js → classDiagram-2ON5EDUG-DoZGDGgs.js} +6 -7
  76. package/webapp/dist/assets/classDiagram-2ON5EDUG-DoZGDGgs.js.map +1 -0
  77. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-DspG486Z.js → classDiagram-v2-WZHVMYZB-DoZGDGgs.js} +6 -7
  78. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-DoZGDGgs.js.map +1 -0
  79. package/webapp/dist/assets/{clone-M8ztABN5.js → clone-WTiKKPxQ.js} +2 -2
  80. package/webapp/dist/assets/clone-WTiKKPxQ.js.map +1 -0
  81. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-DZihobe3.js → cose-bilkent-S5V4N54A-CQdrsAwh.js} +2 -2
  82. package/webapp/dist/assets/cose-bilkent-S5V4N54A-CQdrsAwh.js.map +1 -0
  83. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  84. package/webapp/dist/assets/{dagre-KLK3FWXG-DBLWy3vi.js → dagre-6UL2VRFP-CUMu8kzn.js} +7 -7
  85. package/webapp/dist/assets/dagre-6UL2VRFP-CUMu8kzn.js.map +1 -0
  86. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  87. package/webapp/dist/assets/{diagram-E7M64L7V-D7IrPWaY.js → diagram-PSM6KHXK-DB6XicOz.js} +10 -10
  88. package/webapp/dist/assets/diagram-PSM6KHXK-DB6XicOz.js.map +1 -0
  89. package/webapp/dist/assets/{diagram-IFDJBPK2-DbF-vN3U.js → diagram-QEK2KX5R-BaeG3mbJ.js} +8 -9
  90. package/webapp/dist/assets/diagram-QEK2KX5R-BaeG3mbJ.js.map +1 -0
  91. package/webapp/dist/assets/{diagram-P4PSJMXO-BxBVRVaM.js → diagram-S2PKOQOG-DF7TLMvc.js} +8 -8
  92. package/webapp/dist/assets/diagram-S2PKOQOG-DF7TLMvc.js.map +1 -0
  93. package/webapp/dist/assets/{erDiagram-INFDFZHY-ny9JoOhV.js → erDiagram-Q2GNP2WA-BQr1dJmi.js} +75 -96
  94. package/webapp/dist/assets/erDiagram-Q2GNP2WA-BQr1dJmi.js.map +1 -0
  95. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-BMgWUlvY.js → flowDiagram-NV44I4VS-BPOTtmjM.js} +81 -98
  96. package/webapp/dist/assets/flowDiagram-NV44I4VS-BPOTtmjM.js.map +1 -0
  97. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CCYpj3PM.js → ganttDiagram-JELNMOA3-DsUkIvyS.js} +3 -28
  98. package/webapp/dist/assets/ganttDiagram-JELNMOA3-DsUkIvyS.js.map +1 -0
  99. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-BFJGaDtk.js → gitGraphDiagram-V2S2FVAM-CnXo7Mx_.js} +46 -38
  100. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-CnXo7Mx_.js.map +1 -0
  101. package/webapp/dist/assets/graph-C2Cpmq_d.js +425 -0
  102. package/webapp/dist/assets/graph-C2Cpmq_d.js.map +1 -0
  103. package/webapp/dist/assets/{index-EvfDN91D.js → index-Dpmu_hYq.js} +1193 -1037
  104. package/webapp/dist/assets/{index-EvfDN91D.js.map → index-Dpmu_hYq.js.map} +1 -1
  105. package/webapp/dist/assets/{index-BQoNJEGT.css → index-yycTJNYb.css} +1 -1
  106. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-Dnve0aOc.js → infoDiagram-HS3SLOUP-OgTfggdn.js} +7 -7
  107. package/webapp/dist/assets/infoDiagram-HS3SLOUP-OgTfggdn.js.map +1 -0
  108. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  109. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-D8_2EbDV.js → journeyDiagram-XKPGCS4Q-5a_zmNY7.js} +5 -5
  110. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-5a_zmNY7.js.map +1 -0
  111. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-BdmMXQQk.js → kanban-definition-3W4ZIXB7-DJTdbtlF.js} +3 -5
  112. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-DJTdbtlF.js.map +1 -0
  113. package/webapp/dist/assets/{layout-3tA84hoP.js → layout-BrRMWeju.js} +5 -5
  114. package/webapp/dist/assets/layout-BrRMWeju.js.map +1 -0
  115. package/webapp/dist/assets/{linear-CpN6Japh.js → linear-Dc9z6NyJ.js} +2 -2
  116. package/webapp/dist/assets/linear-Dc9z6NyJ.js.map +1 -0
  117. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-HiYNz7qL.js → mindmap-definition-VGOIOE7T-Dhltq6n6.js} +5 -7
  118. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-Dhltq6n6.js.map +1 -0
  119. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  120. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DCVp50CX.js → pieDiagram-ADFJNKIX-C-YmzhGj.js} +8 -8
  121. package/webapp/dist/assets/pieDiagram-ADFJNKIX-C-YmzhGj.js.map +1 -0
  122. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-CCX7dwY0.js → quadrantDiagram-AYHSOK5B-BxqMSMrz.js} +3 -3
  123. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-BxqMSMrz.js.map +1 -0
  124. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-Cba7jjkf.js → requirementDiagram-UZGBJVZJ-DzAytLM4.js} +6 -16
  125. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-DzAytLM4.js.map +1 -0
  126. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Bz4iUubD.js → sankeyDiagram-TZEHDZUN-C1YODWlP.js} +2 -2
  127. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-C1YODWlP.js.map +1 -0
  128. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DsFI9bic.js → sequenceDiagram-WL72ISMW-CuqvCm6T.js} +201 -601
  129. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-CuqvCm6T.js.map +1 -0
  130. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DLv9OSg4.js → stateDiagram-FKZM4ZOC-Bdl_IDuo.js} +9 -9
  131. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-Bdl_IDuo.js.map +1 -0
  132. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DVlwzCvy.js → stateDiagram-v2-4FDKWEC3-CApGpGJP.js} +5 -5
  133. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-CApGpGJP.js.map +1 -0
  134. package/webapp/dist/assets/{timeline-definition-YZTLITO2-DnKbq6n0.js → timeline-definition-IT6M3QCI-D58v81nI.js} +3 -3
  135. package/webapp/dist/assets/timeline-definition-IT6M3QCI-D58v81nI.js.map +1 -0
  136. package/webapp/dist/assets/{treemap-KZPCXAKY-D9fYHZ__.js → treemap-GDKQZRPO-DAFtS5Nq.js} +24 -37
  137. package/webapp/dist/assets/treemap-GDKQZRPO-DAFtS5Nq.js.map +1 -0
  138. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-Bt-gKvam.js → xychartDiagram-PRI3JC2R-Dfairu24.js} +4 -4
  139. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-Dfairu24.js.map +1 -0
  140. package/webapp/dist/index.html +2 -2
  141. package/webapp/dist/assets/_basePickBy-CG55qWp2.js.map +0 -1
  142. package/webapp/dist/assets/_baseUniq-Dd4UGB2O.js.map +0 -1
  143. package/webapp/dist/assets/arc-C2qiF4r3.js.map +0 -1
  144. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-DQ4Z8fy_.js.map +0 -1
  145. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-CPvOuMZA.js.map +0 -1
  146. package/webapp/dist/assets/c4Diagram-IC4MRINW-DElaFpnJ.js.map +0 -1
  147. package/webapp/dist/assets/channel-BR7mZa90.js.map +0 -1
  148. package/webapp/dist/assets/chunk-4BX2VUAB-DTmXCBYX.js.map +0 -1
  149. package/webapp/dist/assets/chunk-55IACEB6-DeBB4aJ4.js.map +0 -1
  150. package/webapp/dist/assets/chunk-FMBD7UC4-CXpgeev4.js.map +0 -1
  151. package/webapp/dist/assets/chunk-JSJVCQXG-DWfckfhO.js.map +0 -1
  152. package/webapp/dist/assets/chunk-KX2RTZJC-DWG_wpHB.js.map +0 -1
  153. package/webapp/dist/assets/chunk-NQ4KR5QH-DRcsqoac.js.map +0 -1
  154. package/webapp/dist/assets/chunk-QZHKN3VN-B9GPAJ2s.js.map +0 -1
  155. package/webapp/dist/assets/chunk-WL4C6EOR-V3Fq1ULq.js.map +0 -1
  156. package/webapp/dist/assets/classDiagram-VBA2DB6C-DspG486Z.js.map +0 -1
  157. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-DspG486Z.js.map +0 -1
  158. package/webapp/dist/assets/clone-M8ztABN5.js.map +0 -1
  159. package/webapp/dist/assets/cose-bilkent-S5V4N54A-DZihobe3.js.map +0 -1
  160. package/webapp/dist/assets/dagre-KLK3FWXG-DBLWy3vi.js.map +0 -1
  161. package/webapp/dist/assets/diagram-E7M64L7V-D7IrPWaY.js.map +0 -1
  162. package/webapp/dist/assets/diagram-IFDJBPK2-DbF-vN3U.js.map +0 -1
  163. package/webapp/dist/assets/diagram-P4PSJMXO-BxBVRVaM.js.map +0 -1
  164. package/webapp/dist/assets/erDiagram-INFDFZHY-ny9JoOhV.js.map +0 -1
  165. package/webapp/dist/assets/flowDiagram-PKNHOUZH-BMgWUlvY.js.map +0 -1
  166. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-CCYpj3PM.js.map +0 -1
  167. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-BFJGaDtk.js.map +0 -1
  168. package/webapp/dist/assets/graph-Cp0m7fHH.js +0 -782
  169. package/webapp/dist/assets/graph-Cp0m7fHH.js.map +0 -1
  170. package/webapp/dist/assets/infoDiagram-LFFYTUFH-Dnve0aOc.js.map +0 -1
  171. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-DkSZM5sz.js +0 -966
  172. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-DkSZM5sz.js.map +0 -1
  173. package/webapp/dist/assets/journeyDiagram-4ABVD52K-D8_2EbDV.js.map +0 -1
  174. package/webapp/dist/assets/kanban-definition-K7BYSVSG-BdmMXQQk.js.map +0 -1
  175. package/webapp/dist/assets/layout-3tA84hoP.js.map +0 -1
  176. package/webapp/dist/assets/linear-CpN6Japh.js.map +0 -1
  177. package/webapp/dist/assets/mindmap-definition-YRQLILUH-HiYNz7qL.js.map +0 -1
  178. package/webapp/dist/assets/pieDiagram-SKSYHLDU-DCVp50CX.js.map +0 -1
  179. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-CCX7dwY0.js.map +0 -1
  180. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-Cba7jjkf.js.map +0 -1
  181. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-Bz4iUubD.js.map +0 -1
  182. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-DsFI9bic.js.map +0 -1
  183. package/webapp/dist/assets/stateDiagram-RAJIS63D-DLv9OSg4.js.map +0 -1
  184. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-DVlwzCvy.js.map +0 -1
  185. package/webapp/dist/assets/timeline-definition-YZTLITO2-DnKbq6n0.js.map +0 -1
  186. package/webapp/dist/assets/treemap-KZPCXAKY-D9fYHZ__.js.map +0 -1
  187. package/webapp/dist/assets/vennDiagram-LZ73GAT5-CzKI47Ba.js +0 -2487
  188. package/webapp/dist/assets/vennDiagram-LZ73GAT5-CzKI47Ba.js.map +0 -1
  189. package/webapp/dist/assets/xychartDiagram-JWTSCODW-Bt-gKvam.js.map +0 -1
package/dist/tools/os.js CHANGED
@@ -11,6 +11,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.getDaemonOutputTool = exports.stopDaemonTool = exports.readonlyShellTool = exports.shellCmdTool = exports.shellCmdReminderOwner = void 0;
13
13
  exports.resetTrackedDaemonsForTests = resetTrackedDaemonsForTests;
14
+ exports.resolveShellCmdSpawnSpecForTests = resolveShellCmdSpawnSpecForTests;
15
+ exports.resolveReadonlyShellSpawnSpecForTests = resolveReadonlyShellSpawnSpecForTests;
14
16
  const time_1 = require("@longrun-ai/kernel/utils/time");
15
17
  const child_process_1 = require("child_process");
16
18
  const crypto_1 = __importDefault(require("crypto"));
@@ -816,9 +818,12 @@ function parseGetDaemonOutputArgs(args) {
816
818
  }
817
819
  return { pid, stdout, stderr };
818
820
  }
819
- function resolveShellCmdSpawnSpec(command, shell) {
821
+ function encodePowerShellCommand(command) {
822
+ return Buffer.from(command, 'utf16le').toString('base64');
823
+ }
824
+ function resolveShellCmdSpawnSpec(command, shell, platform = process.platform) {
820
825
  const preferredShell = typeof shell === 'string' && shell.trim() !== '' ? shell.trim() : undefined;
821
- if (process.platform === 'win32') {
826
+ if (platform === 'win32') {
822
827
  if (preferredShell) {
823
828
  const base = path_1.default.basename(preferredShell).toLowerCase();
824
829
  if (base === 'powershell' ||
@@ -827,14 +832,14 @@ function resolveShellCmdSpawnSpec(command, shell) {
827
832
  base === 'pwsh.exe') {
828
833
  return {
829
834
  command: preferredShell,
830
- args: ['-NoLogo', '-NoProfile', '-Command', command],
835
+ args: ['-NoLogo', '-NoProfile', '-EncodedCommand', encodePowerShellCommand(command)],
831
836
  shellLabel: preferredShell,
832
837
  };
833
838
  }
834
839
  if (base === 'cmd' || base === 'cmd.exe') {
835
840
  return {
836
841
  command: preferredShell,
837
- args: ['/d', '/s', '/c', command],
842
+ args: ['/d', '/c', command],
838
843
  shellLabel: preferredShell,
839
844
  };
840
845
  }
@@ -846,7 +851,7 @@ function resolveShellCmdSpawnSpec(command, shell) {
846
851
  }
847
852
  return {
848
853
  command: 'cmd.exe',
849
- args: ['/d', '/s', '/c', command],
854
+ args: ['/d', '/c', command],
850
855
  shellLabel: 'cmd.exe',
851
856
  };
852
857
  }
@@ -857,12 +862,18 @@ function resolveShellCmdSpawnSpec(command, shell) {
857
862
  shellLabel: resolvedShell,
858
863
  };
859
864
  }
860
- function resolveReadonlyShellSpawnSpec(command) {
861
- if (process.platform === 'win32') {
862
- return { command: 'cmd.exe', args: ['/d', '/s', '/c', command] };
865
+ function resolveShellCmdSpawnSpecForTests(command, shell, platform) {
866
+ return resolveShellCmdSpawnSpec(command, shell, platform);
867
+ }
868
+ function resolveReadonlyShellSpawnSpec(command, platform = process.platform) {
869
+ if (platform === 'win32') {
870
+ return { command: 'cmd.exe', args: ['/d', '/c', command] };
863
871
  }
864
872
  return { command: 'bash', args: ['-c', command] };
865
873
  }
874
+ function resolveReadonlyShellSpawnSpecForTests(command, platform) {
875
+ return resolveReadonlyShellSpawnSpec(command, platform);
876
+ }
866
877
  function resolveCmdRunnerEntrypointAbs() {
867
878
  const distCandidate = path_1.default.resolve(__dirname, 'cmd-runner.js');
868
879
  if (fs_1.default.existsSync(distCandidate)) {
@@ -1105,7 +1116,7 @@ const shellCmdSchema = {
1105
1116
  },
1106
1117
  shell: {
1107
1118
  type: 'string',
1108
- description: 'Shell to use for execution (default: bash on Linux/macOS; cmd.exe on Windows)',
1119
+ description: 'Shell to use for execution (default: bash on Linux/macOS; cmd.exe on Windows). On Windows, powershell.exe/pwsh commands are passed via -EncodedCommand.',
1109
1120
  },
1110
1121
  scrollbackLines: {
1111
1122
  type: 'number',
@@ -1,3 +1,4 @@
1
1
  import type { FuncTool } from '../tool';
2
2
  export declare const readPictureTool: FuncTool;
3
+ export declare const fsReadPictureTool: FuncTool;
3
4
  export declare const writePictureTool: FuncTool;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.writePictureTool = exports.readPictureTool = void 0;
6
+ exports.writePictureTool = exports.fsReadPictureTool = exports.readPictureTool = void 0;
7
7
  const crypto_1 = require("crypto");
8
8
  const promises_1 = __importDefault(require("fs/promises"));
9
9
  const path_1 = __importDefault(require("path"));
@@ -33,6 +33,12 @@ function ensureInsideWorkspace(rel) {
33
33
  }
34
34
  throw new Error('Path must be within rtws (runtime workspace)');
35
35
  }
36
+ function resolveLocalFilesystemPath(inputPath) {
37
+ return path_1.default.resolve(process.cwd(), inputPath);
38
+ }
39
+ function displayLocalFilesystemPath(inputPath, absPath) {
40
+ return path_1.default.isAbsolute(inputPath) ? absPath : inputPath;
41
+ }
36
42
  function requirePathArg(args) {
37
43
  const value = args['path'];
38
44
  if (typeof value !== 'string' || value.trim() === '') {
@@ -246,6 +252,63 @@ exports.readPictureTool = {
246
252
  }
247
253
  },
248
254
  };
255
+ exports.fsReadPictureTool = {
256
+ type: 'func',
257
+ name: 'fs_read_picture',
258
+ description: 'Read a PNG/JPEG/WebP/GIF image from the local filesystem without restricting paths to rtws, then attach it as an image content item for the next LLM context.',
259
+ descriptionI18n: {
260
+ en: 'Read a PNG/JPEG/WebP/GIF image from the local filesystem without restricting paths to rtws, then attach it as an image content item for the next LLM context.',
261
+ zh: '读取本机文件系统中的 PNG/JPEG/WebP/GIF 图片(不限制路径必须位于 rtws 内),并作为图片 content item 放入后续 LLM 上下文。',
262
+ },
263
+ parameters: {
264
+ type: 'object',
265
+ additionalProperties: false,
266
+ properties: {
267
+ path: {
268
+ type: 'string',
269
+ description: 'Image path to read. Absolute paths are accepted; relative paths resolve from the current process cwd. Supported extensions: .png, .jpg, .jpeg, .webp, .gif.',
270
+ },
271
+ },
272
+ required: ['path'],
273
+ },
274
+ argsValidation: 'dominds',
275
+ call: async (dlg, _caller, args) => {
276
+ try {
277
+ const requestedPath = requirePathArg(args);
278
+ const absPath = resolveLocalFilesystemPath(requestedPath);
279
+ const displayPath = displayLocalFilesystemPath(requestedPath, absPath);
280
+ const mimeType = extToMimeType(displayPath);
281
+ if (mimeType === null) {
282
+ return fail('Unsupported image extension. Supported extensions: .png, .jpg, .jpeg, .webp, .gif');
283
+ }
284
+ const stat = await promises_1.default.stat(absPath);
285
+ if (!stat.isFile())
286
+ return fail(`Path is not a file: ${displayPath}`);
287
+ if (stat.size <= 0 || stat.size > PICTURE_MAX_BYTES) {
288
+ return fail(`Image must be between 1 byte and ${String(PICTURE_MAX_BYTES)} bytes`);
289
+ }
290
+ const bytes = await promises_1.default.readFile(absPath);
291
+ validateImageBytesMatchMimeType(bytes, mimeType);
292
+ const item = await persistPictureArtifact({
293
+ dlg,
294
+ toolName: 'fs_read_picture',
295
+ mimeType,
296
+ bytes,
297
+ });
298
+ return ok(formatPictureResultYaml({
299
+ status: 'ok',
300
+ action: 'fs_read_picture',
301
+ path: displayPath,
302
+ mimeType,
303
+ byteLength: bytes.length,
304
+ artifactRelPath: item.artifact.relPath,
305
+ }), [item]);
306
+ }
307
+ catch (error) {
308
+ return fail(error instanceof Error ? error.message : String(error));
309
+ }
310
+ },
311
+ };
249
312
  exports.writePictureTool = {
250
313
  type: 'func',
251
314
  name: 'write_picture',
@@ -12,6 +12,11 @@ Typical uses:
12
12
  - read-only `git status` / `git diff` / `git log` / `git show`
13
13
  - version probes and simple filesystem inspection
14
14
 
15
+ Windows notes:
16
+
17
+ - Prefer no-space forward-slash paths such as `D:/path/to/file`
18
+ - Avoid nested `cmd /c "..."`
19
+
15
20
  Example:
16
21
 
17
22
  ```typescript
@@ -12,6 +12,11 @@
12
12
  - 只读 `git status` / `git diff` / `git log` / `git show`
13
13
  - 版本探针与简单文件系统检查
14
14
 
15
+ Windows 注意:
16
+
17
+ - 优先使用不带空格的正斜杠路径,如 `D:/path/to/file`
18
+ - 避免嵌套 `cmd /c "..."`
19
+
15
20
  示例:
16
21
 
17
22
  ```typescript
@@ -0,0 +1,6 @@
1
+ # Errors
2
+
3
+ - `PATH_REQUIRED`
4
+ - `NOT_SYMLINK`
5
+ - `NOT_FOUND`
6
+ - `FAILED`
@@ -0,0 +1,17 @@
1
+ fs_read is Dominds' local-filesystem read-only toolset for reading and searching files outside rtws:
2
+
3
+ - Directory listing
4
+ - File reading
5
+ - Symlink inspection
6
+ - Content searching
7
+
8
+ ## Status
9
+
10
+ - Status: Implemented
11
+ - Main implementation files:
12
+ - Tool implementation: `dominds/main/tools/fs.ts`, `dominds/main/tools/txt.ts`, `dominds/main/tools/picture.ts`, `dominds/main/tools/ripgrep.ts`
13
+ - Toolset metadata: `dominds/main/tools/builtins.ts`, `dominds/main/tools/registry.ts`
14
+
15
+ ## Difference from ws_read
16
+
17
+ `fs_read` exposes the same read-oriented capabilities as `ws_read`, but without the rtws path restriction.
@@ -0,0 +1,5 @@
1
+ # Principles
2
+
3
+ 1. This toolset reads the local filesystem directly.
4
+ 2. It does not require paths to stay inside rtws.
5
+ 3. It remains read-only.
@@ -0,0 +1,3 @@
1
+ # Scenarios
2
+
3
+ Use `fs_read` when you need to inspect files outside the current rtws, such as a sibling checkout or a system path.
@@ -0,0 +1,11 @@
1
+ # Tools
2
+
3
+ - `fs_list_dir`
4
+ - `fs_read_symlink`
5
+ - `fs_read_file`
6
+ - `fs_read_picture`
7
+ - `fs_ripgrep_files`
8
+ - `fs_ripgrep_snippets`
9
+ - `fs_ripgrep_count`
10
+ - `fs_ripgrep_fixed`
11
+ - `fs_ripgrep_search`
@@ -0,0 +1,6 @@
1
+ # 错误
2
+
3
+ - `PATH_REQUIRED`
4
+ - `NOT_SYMLINK`
5
+ - `NOT_FOUND`
6
+ - `FAILED`
@@ -0,0 +1,17 @@
1
+ fs_read 是 Dominds 的本机文件系统只读工具集,用于读取和搜索 rtws 之外的文件:
2
+
3
+ - 目录查看
4
+ - 文件读取
5
+ - 符号链接检查
6
+ - 内容搜索
7
+
8
+ ## 状态
9
+
10
+ - 状态:已实现
11
+ - 主要实现文件:
12
+ - 工具实现:`dominds/main/tools/fs.ts`、`dominds/main/tools/txt.ts`、`dominds/main/tools/picture.ts`、`dominds/main/tools/ripgrep.ts`
13
+ - toolset 元信息:`dominds/main/tools/builtins.ts`、`dominds/main/tools/registry.ts`
14
+
15
+ ## 与 ws_read 的区别
16
+
17
+ `fs_read` 提供与 `ws_read` 相同的只读能力,但不要求路径必须位于 rtws 内。
@@ -0,0 +1,5 @@
1
+ # 原则
2
+
3
+ 1. 该工具集直接读取本机文件系统。
4
+ 2. 路径不必限制在 rtws 内。
5
+ 3. 仍然只读。
@@ -0,0 +1,3 @@
1
+ # 场景
2
+
3
+ 当你需要查看当前 rtws 之外的文件时,使用 `fs_read`,例如旁边的 checkout 或系统路径。
@@ -0,0 +1,11 @@
1
+ # 工具
2
+
3
+ - `fs_list_dir`
4
+ - `fs_read_symlink`
5
+ - `fs_read_file`
6
+ - `fs_read_picture`
7
+ - `fs_ripgrep_files`
8
+ - `fs_ripgrep_snippets`
9
+ - `fs_ripgrep_count`
10
+ - `fs_ripgrep_fixed`
11
+ - `fs_ripgrep_search`
@@ -51,5 +51,5 @@ os is Dominds' **shell and process toolset** for executing system commands and m
51
51
  ⚠️ Shell command execution requires caution:
52
52
 
53
53
  - Avoid destructive commands (e.g., `rm -rf`)
54
- - Use absolute paths to avoid path injection
54
+ - Use explicit paths to avoid path injection; on Windows, prefer forward-slash paths
55
55
  - Verify command output before executing follow-up operations
@@ -71,7 +71,7 @@ Environment variables are system variables that affect process behavior.
71
71
  ### 1. Shell Command Security
72
72
 
73
73
  - **Validate input**: Use parameterized commands to avoid injection
74
- - **Use absolute paths**: Avoid relative path ambiguity
74
+ - **Use explicit paths**: Avoid relative path ambiguity; on Windows, prefer forward-slash paths
75
75
  - **Check permissions**: Ensure sufficient permissions to execute commands
76
76
 
77
77
  ### 2. Process Management
@@ -179,3 +179,24 @@ shell_cmd({
179
179
  command: 'free -m',
180
180
  });
181
181
  ```
182
+
183
+ ## Scenario 8: Windows Paths and PowerShell
184
+
185
+ ### Scenario Description
186
+
187
+ Check files or run PowerShell commands on Windows.
188
+
189
+ ### Example
190
+
191
+ ```typescript
192
+ // Default cmd.exe path: prefer forward slashes for no-space paths to avoid backslash and quote ambiguity
193
+ shell_cmd({
194
+ command: 'if exist D:/AiWorks/chatgpt-workstation/dist/app.exe echo exists',
195
+ });
196
+
197
+ // Complex PowerShell command: choose PowerShell explicitly; Dominds encodes the command automatically
198
+ shell_cmd({
199
+ command: 'Test-Path D:/AiWorks/chatgpt-workstation/dist/app.exe',
200
+ shell: 'powershell.exe',
201
+ });
202
+ ```
@@ -30,6 +30,12 @@ Execute Shell command.
30
30
  - `scrollbackLines` (optional): Number of recent output lines to retain in scrollback
31
31
  - `timeoutSeconds` (optional): Timeout in seconds before switching to daemon tracking
32
32
 
33
+ **Windows notes:**
34
+
35
+ - With the default `cmd.exe` path, prefer no-space forward-slash paths such as `D:/path/to/file`
36
+ - For complex PowerShell commands, pass `shell: 'powershell.exe'` or `shell: 'pwsh'`; the command is encoded automatically to avoid quote and backslash ambiguity
37
+ - Do not rely on nested `cmd /c "..."`
38
+
33
39
  **Returns:**
34
40
 
35
41
  ```yaml
@@ -51,5 +51,5 @@ os 是 Dominds 的**命令行与进程工具集**,用于执行系统命令和
51
51
  ⚠️ Shell 命令执行需要谨慎操作:
52
52
 
53
53
  - 避免执行破坏性命令(如 `rm -rf`)
54
- - 使用绝对路径避免路径注入
54
+ - 使用明确路径避免路径注入;Windows 下优先用正斜杠路径
55
55
  - 验证命令输出后再执行后续操作
@@ -71,7 +71,7 @@ Shell 命令执行允许智能体运行系统命令来完成各种任务。
71
71
  ### 1. Shell 命令安全
72
72
 
73
73
  - **验证输入**:使用参数化命令避免注入
74
- - **使用绝对路径**:避免相对路径歧义
74
+ - **使用明确路径**:避免相对路径歧义;Windows 下优先用正斜杠路径
75
75
  - **检查权限**:确保有足够权限执行命令
76
76
 
77
77
  ### 2. 进程管理
@@ -179,3 +179,24 @@ shell_cmd({
179
179
  command: 'free -m',
180
180
  });
181
181
  ```
182
+
183
+ ## 场景 8:Windows 路径与 PowerShell
184
+
185
+ ### 场景描述
186
+
187
+ 在 Windows 上检查文件或运行 PowerShell 命令。
188
+
189
+ ### 示例
190
+
191
+ ```typescript
192
+ // cmd.exe 默认路径:路径无空格时优先用正斜杠,避免反斜杠和引号歧义
193
+ shell_cmd({
194
+ command: 'if exist D:/AiWorks/chatgpt-workstation/dist/app.exe echo exists',
195
+ });
196
+
197
+ // 复杂 PowerShell 命令:显式选择 PowerShell,系统会自动编码传递命令
198
+ shell_cmd({
199
+ command: 'Test-Path D:/AiWorks/chatgpt-workstation/dist/app.exe',
200
+ shell: 'powershell.exe',
201
+ });
202
+ ```
@@ -30,6 +30,12 @@
30
30
  - `scrollbackLines`(可选):滚动回看里保留的最近输出行数
31
31
  - `timeoutSeconds`(可选):超时秒数;超时后转为守护进程追踪
32
32
 
33
+ **Windows 提示:**
34
+
35
+ - 默认 `cmd.exe` 路径下,优先使用不带空格的正斜杠路径,如 `D:/path/to/file`
36
+ - 复杂 PowerShell 命令建议显式传 `shell: 'powershell.exe'` 或 `shell: 'pwsh'`;系统会自动用编码方式传递命令,避免引号和反斜杠歧义
37
+ - 不要依赖 `cmd /c "..."`
38
+
33
39
  **返回:**
34
40
 
35
41
  ```yaml
@@ -17,6 +17,12 @@ export type ToolsetMeta = {
17
17
  * system according to dialog scope rather than granted by team config.
18
18
  */
19
19
  assignable?: boolean;
20
+ /**
21
+ * Whether wildcard toolset expansion (`toolsets: ['*']`) may include this
22
+ * toolset. Defaults to true. Use false for explicitly grantable toolsets that
23
+ * should not be mass-assigned by wildcard baselines.
24
+ */
25
+ wildcardAssignable?: boolean;
20
26
  descriptionI18n?: I18nText;
21
27
  /**
22
28
  * Toolset-level prompt injected into the agent system prompt when the member
@@ -1,6 +1,11 @@
1
1
  import type { FuncTool } from '../tool';
2
2
  export declare const ripgrepFilesTool: FuncTool;
3
+ export declare const fsRipgrepFilesTool: FuncTool;
3
4
  export declare const ripgrepCountTool: FuncTool;
5
+ export declare const fsRipgrepCountTool: FuncTool;
4
6
  export declare const ripgrepSnippetsTool: FuncTool;
7
+ export declare const fsRipgrepSnippetsTool: FuncTool;
5
8
  export declare const ripgrepFixedTool: FuncTool;
9
+ export declare const fsRipgrepFixedTool: FuncTool;
6
10
  export declare const ripgrepSearchTool: FuncTool;
11
+ export declare const fsRipgrepSearchTool: FuncTool;