dominds 1.25.11 → 1.25.12

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 (107) hide show
  1. package/README.md +1 -1
  2. package/README.zh.md +1 -1
  3. package/dist/access-control.js +9 -5
  4. package/dist/docs/team_mgmt-toolset.md +1 -1
  5. package/dist/docs/team_mgmt-toolset.zh.md +1 -1
  6. package/dist/persistence.js +5 -11
  7. package/dist/tools/builtins.js +14 -16
  8. package/dist/tools/os.d.ts +14 -0
  9. package/dist/tools/os.js +508 -101
  10. package/dist/tools/prompts/codex_inspect_and_patch_tools/en/tools.md +2 -1
  11. package/dist/tools/prompts/codex_inspect_and_patch_tools/zh/tools.md +2 -1
  12. package/package.json +1 -1
  13. package/webapp/dist/assets/{_basePickBy-BF9Zg9uq.js → _basePickBy-B1-brAPU.js} +3 -3
  14. package/webapp/dist/assets/{_basePickBy-BF9Zg9uq.js.map → _basePickBy-B1-brAPU.js.map} +1 -1
  15. package/webapp/dist/assets/{_baseUniq-CFjISsgz.js → _baseUniq-BuB0jmKD.js} +2 -2
  16. package/webapp/dist/assets/{_baseUniq-CFjISsgz.js.map → _baseUniq-BuB0jmKD.js.map} +1 -1
  17. package/webapp/dist/assets/{arc-BVyYGzE7.js → arc-CvsBvjnB.js} +2 -2
  18. package/webapp/dist/assets/{arc-BVyYGzE7.js.map → arc-CvsBvjnB.js.map} +1 -1
  19. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-SEmNTU1b.js → architectureDiagram-2XIMDMQ5-B-xGuLbb.js} +7 -7
  20. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-SEmNTU1b.js.map → architectureDiagram-2XIMDMQ5-B-xGuLbb.js.map} +1 -1
  21. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-BndD4gLF.js → blockDiagram-WCTKOSBZ-Bu53fwsa.js} +7 -7
  22. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-BndD4gLF.js.map → blockDiagram-WCTKOSBZ-Bu53fwsa.js.map} +1 -1
  23. package/webapp/dist/assets/{c4Diagram-IC4MRINW-fGAz7umu.js → c4Diagram-IC4MRINW-D9-FJ4LB.js} +3 -3
  24. package/webapp/dist/assets/{c4Diagram-IC4MRINW-fGAz7umu.js.map → c4Diagram-IC4MRINW-D9-FJ4LB.js.map} +1 -1
  25. package/webapp/dist/assets/{channel-Blt7S1Sn.js → channel-D1VPurpu.js} +2 -2
  26. package/webapp/dist/assets/{channel-Blt7S1Sn.js.map → channel-D1VPurpu.js.map} +1 -1
  27. package/webapp/dist/assets/{chunk-4BX2VUAB-C2FKcyob.js → chunk-4BX2VUAB-DB14wcWS.js} +2 -2
  28. package/webapp/dist/assets/{chunk-4BX2VUAB-C2FKcyob.js.map → chunk-4BX2VUAB-DB14wcWS.js.map} +1 -1
  29. package/webapp/dist/assets/{chunk-55IACEB6-CN8ZmdUP.js → chunk-55IACEB6-C5KCE85A.js} +2 -2
  30. package/webapp/dist/assets/{chunk-55IACEB6-CN8ZmdUP.js.map → chunk-55IACEB6-C5KCE85A.js.map} +1 -1
  31. package/webapp/dist/assets/{chunk-FMBD7UC4-B9Uq2tt2.js → chunk-FMBD7UC4-Bb6zm0iH.js} +2 -2
  32. package/webapp/dist/assets/{chunk-FMBD7UC4-B9Uq2tt2.js.map → chunk-FMBD7UC4-Bb6zm0iH.js.map} +1 -1
  33. package/webapp/dist/assets/{chunk-JSJVCQXG-vVrXi8LV.js → chunk-JSJVCQXG-CJPrv6fM.js} +2 -2
  34. package/webapp/dist/assets/{chunk-JSJVCQXG-vVrXi8LV.js.map → chunk-JSJVCQXG-CJPrv6fM.js.map} +1 -1
  35. package/webapp/dist/assets/{chunk-KX2RTZJC-DtZmdBq3.js → chunk-KX2RTZJC-8J1Swk7E.js} +2 -2
  36. package/webapp/dist/assets/{chunk-KX2RTZJC-DtZmdBq3.js.map → chunk-KX2RTZJC-8J1Swk7E.js.map} +1 -1
  37. package/webapp/dist/assets/{chunk-NQ4KR5QH-C3rU1XEw.js → chunk-NQ4KR5QH-DySHY4x9.js} +4 -4
  38. package/webapp/dist/assets/{chunk-NQ4KR5QH-C3rU1XEw.js.map → chunk-NQ4KR5QH-DySHY4x9.js.map} +1 -1
  39. package/webapp/dist/assets/{chunk-QZHKN3VN-CeHQK_vs.js → chunk-QZHKN3VN-CTO5Z-4P.js} +2 -2
  40. package/webapp/dist/assets/{chunk-QZHKN3VN-CeHQK_vs.js.map → chunk-QZHKN3VN-CTO5Z-4P.js.map} +1 -1
  41. package/webapp/dist/assets/{chunk-WL4C6EOR-Bb8GUwSo.js → chunk-WL4C6EOR-Ci_Ec8Ax.js} +6 -6
  42. package/webapp/dist/assets/{chunk-WL4C6EOR-Bb8GUwSo.js.map → chunk-WL4C6EOR-Ci_Ec8Ax.js.map} +1 -1
  43. package/webapp/dist/assets/{classDiagram-VBA2DB6C-CmP7X8Fj.js → classDiagram-VBA2DB6C-CxAxBvv7.js} +7 -7
  44. package/webapp/dist/assets/{classDiagram-VBA2DB6C-CmP7X8Fj.js.map → classDiagram-VBA2DB6C-CxAxBvv7.js.map} +1 -1
  45. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CmP7X8Fj.js → classDiagram-v2-RAHNMMFH-CxAxBvv7.js} +7 -7
  46. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CmP7X8Fj.js.map → classDiagram-v2-RAHNMMFH-CxAxBvv7.js.map} +1 -1
  47. package/webapp/dist/assets/{clone-CzGKO47U.js → clone-ePiNaiNY.js} +2 -2
  48. package/webapp/dist/assets/{clone-CzGKO47U.js.map → clone-ePiNaiNY.js.map} +1 -1
  49. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-3wbordhk.js → cose-bilkent-S5V4N54A-j-Ex-Sef.js} +2 -2
  50. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-3wbordhk.js.map → cose-bilkent-S5V4N54A-j-Ex-Sef.js.map} +1 -1
  51. package/webapp/dist/assets/{dagre-KLK3FWXG-DrM7hFR5.js → dagre-KLK3FWXG-ihZ2wOCM.js} +7 -7
  52. package/webapp/dist/assets/{dagre-KLK3FWXG-DrM7hFR5.js.map → dagre-KLK3FWXG-ihZ2wOCM.js.map} +1 -1
  53. package/webapp/dist/assets/{diagram-E7M64L7V-D-bQEVk2.js → diagram-E7M64L7V-Cp4GQGS7.js} +8 -8
  54. package/webapp/dist/assets/{diagram-E7M64L7V-D-bQEVk2.js.map → diagram-E7M64L7V-Cp4GQGS7.js.map} +1 -1
  55. package/webapp/dist/assets/{diagram-IFDJBPK2-MaU_xQfR.js → diagram-IFDJBPK2-B70cgyS5.js} +7 -7
  56. package/webapp/dist/assets/{diagram-IFDJBPK2-MaU_xQfR.js.map → diagram-IFDJBPK2-B70cgyS5.js.map} +1 -1
  57. package/webapp/dist/assets/{diagram-P4PSJMXO-BLklmc9h.js → diagram-P4PSJMXO-DMOv7eKE.js} +7 -7
  58. package/webapp/dist/assets/{diagram-P4PSJMXO-BLklmc9h.js.map → diagram-P4PSJMXO-DMOv7eKE.js.map} +1 -1
  59. package/webapp/dist/assets/{erDiagram-INFDFZHY-DHIVFsNv.js → erDiagram-INFDFZHY-BKpXWjIc.js} +5 -5
  60. package/webapp/dist/assets/{erDiagram-INFDFZHY-DHIVFsNv.js.map → erDiagram-INFDFZHY-BKpXWjIc.js.map} +1 -1
  61. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-HbMxSdg1.js → flowDiagram-PKNHOUZH-DgrItj0h.js} +7 -7
  62. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-HbMxSdg1.js.map → flowDiagram-PKNHOUZH-DgrItj0h.js.map} +1 -1
  63. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CxBETPNC.js → ganttDiagram-A5KZAMGK-7-8hlYsT.js} +3 -3
  64. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CxBETPNC.js.map → ganttDiagram-A5KZAMGK-7-8hlYsT.js.map} +1 -1
  65. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-DPV-fFTC.js → gitGraphDiagram-K3NZZRJ6-cPSaCUUk.js} +8 -8
  66. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-DPV-fFTC.js.map → gitGraphDiagram-K3NZZRJ6-cPSaCUUk.js.map} +1 -1
  67. package/webapp/dist/assets/{graph-C0MlCXJg.js → graph-CAlg3tEk.js} +3 -3
  68. package/webapp/dist/assets/{graph-C0MlCXJg.js.map → graph-CAlg3tEk.js.map} +1 -1
  69. package/webapp/dist/assets/{index-CzHjX_nj.js → index-DLTS_eOh.js} +123 -47
  70. package/webapp/dist/assets/{index-CzHjX_nj.js.map → index-DLTS_eOh.js.map} +1 -1
  71. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-ChTC2kD-.js → infoDiagram-LFFYTUFH-CHJHvxMC.js} +6 -6
  72. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-ChTC2kD-.js.map → infoDiagram-LFFYTUFH-CHJHvxMC.js.map} +1 -1
  73. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56--aJd3LM6.js → ishikawaDiagram-PHBUUO56-S8N-XZ8E.js} +2 -2
  74. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56--aJd3LM6.js.map → ishikawaDiagram-PHBUUO56-S8N-XZ8E.js.map} +1 -1
  75. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-Bzd3cZTs.js → journeyDiagram-4ABVD52K-ChHNpMtH.js} +5 -5
  76. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-Bzd3cZTs.js.map → journeyDiagram-4ABVD52K-ChHNpMtH.js.map} +1 -1
  77. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-DiFHcs58.js → kanban-definition-K7BYSVSG-Cqxd99wZ.js} +3 -3
  78. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-DiFHcs58.js.map → kanban-definition-K7BYSVSG-Cqxd99wZ.js.map} +1 -1
  79. package/webapp/dist/assets/{layout-B9Hsf17G.js → layout-uOLcVthp.js} +5 -5
  80. package/webapp/dist/assets/{layout-B9Hsf17G.js.map → layout-uOLcVthp.js.map} +1 -1
  81. package/webapp/dist/assets/{linear-6xqU78Yu.js → linear-Ga_f4H_w.js} +2 -2
  82. package/webapp/dist/assets/{linear-6xqU78Yu.js.map → linear-Ga_f4H_w.js.map} +1 -1
  83. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BUI6M5up.js → mindmap-definition-YRQLILUH-TSH7wOlZ.js} +4 -4
  84. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BUI6M5up.js.map → mindmap-definition-YRQLILUH-TSH7wOlZ.js.map} +1 -1
  85. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-FCGp31Lg.js → pieDiagram-SKSYHLDU-DPXszqns.js} +8 -8
  86. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-FCGp31Lg.js.map → pieDiagram-SKSYHLDU-DPXszqns.js.map} +1 -1
  87. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-bJcMGXM6.js → quadrantDiagram-337W2JSQ-BgA_GVhR.js} +3 -3
  88. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-bJcMGXM6.js.map → quadrantDiagram-337W2JSQ-BgA_GVhR.js.map} +1 -1
  89. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-BghuL9nW.js → requirementDiagram-Z7DCOOCP-CM-47daj.js} +4 -4
  90. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-BghuL9nW.js.map → requirementDiagram-Z7DCOOCP-CM-47daj.js.map} +1 -1
  91. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-DpuFpv6d.js → sankeyDiagram-WA2Y5GQK-CxDCwHAj.js} +2 -2
  92. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-DpuFpv6d.js.map → sankeyDiagram-WA2Y5GQK-CxDCwHAj.js.map} +1 -1
  93. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-BM6rPANl.js → sequenceDiagram-2WXFIKYE-1UJP6Fff.js} +4 -4
  94. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-BM6rPANl.js.map → sequenceDiagram-2WXFIKYE-1UJP6Fff.js.map} +1 -1
  95. package/webapp/dist/assets/{stateDiagram-RAJIS63D-C_jQSre0.js → stateDiagram-RAJIS63D-B2aqr0KQ.js} +9 -9
  96. package/webapp/dist/assets/{stateDiagram-RAJIS63D-C_jQSre0.js.map → stateDiagram-RAJIS63D-B2aqr0KQ.js.map} +1 -1
  97. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BbQxj-LI.js → stateDiagram-v2-FVOUBMTO-DvmkevVb.js} +5 -5
  98. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BbQxj-LI.js.map → stateDiagram-v2-FVOUBMTO-DvmkevVb.js.map} +1 -1
  99. package/webapp/dist/assets/{timeline-definition-YZTLITO2-qVPiYzDY.js → timeline-definition-YZTLITO2-CaOrqzT1.js} +3 -3
  100. package/webapp/dist/assets/{timeline-definition-YZTLITO2-qVPiYzDY.js.map → timeline-definition-YZTLITO2-CaOrqzT1.js.map} +1 -1
  101. package/webapp/dist/assets/{treemap-KZPCXAKY-CH_Gjw5E.js → treemap-KZPCXAKY-CWs_8GJm.js} +5 -5
  102. package/webapp/dist/assets/{treemap-KZPCXAKY-CH_Gjw5E.js.map → treemap-KZPCXAKY-CWs_8GJm.js.map} +1 -1
  103. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-rpOhNWvx.js → vennDiagram-LZ73GAT5-BuBxFDz6.js} +2 -2
  104. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-rpOhNWvx.js.map → vennDiagram-LZ73GAT5-BuBxFDz6.js.map} +1 -1
  105. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-D1TcBJrI.js → xychartDiagram-JWTSCODW-ChjL-_2b.js} +3 -3
  106. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-D1TcBJrI.js.map → xychartDiagram-JWTSCODW-ChjL-_2b.js.map} +1 -1
  107. package/webapp/dist/index.html +1 -1
package/README.md CHANGED
@@ -251,7 +251,7 @@ Then:
251
251
 
252
252
  Platform note:
253
253
 
254
- - On Windows, the runtime does not register the `codex_inspect_and_patch_tools` toolset. Do not grant `codex_inspect_and_patch_tools` in `.minds/team.yaml` for Windows hosts.
254
+ - Windows also registers `codex_inspect_and_patch_tools`; its `readonly_shell` tool runs through `cmd.exe`, so prefer allowlisted commands available in that shell/PATH, such as `rg`, `git`, `dir`, `type`, and `where`.
255
255
 
256
256
  ## Start from scratch
257
257
 
package/README.zh.md CHANGED
@@ -190,7 +190,7 @@ dominds
190
190
 
191
191
  平台说明:
192
192
 
193
- - Windows 运行时不会注册 `codex_inspect_and_patch_tools` 工具集。在 Windows 主机上的 `.minds/team.yaml` 中不要授予 `codex_inspect_and_patch_tools`。
193
+ - Windows 也会注册 `codex_inspect_and_patch_tools`;其中 `readonly_shell` 通过 `cmd.exe` 执行,因此优先使用该 shell/PATH 中可用的白名单命令,例如 `rg`、`git`、`dir`、`type` `where`。
194
194
 
195
195
  ## 从零开始(空文件夹启动)
196
196
 
@@ -10,19 +10,23 @@ exports.getAccessDeniedMessage = getAccessDeniedMessage;
10
10
  const path_1 = __importDefault(require("path"));
11
11
  const log_1 = require("./log");
12
12
  function isEncapsulatedTaskPath(targetPath) {
13
- const normalized = targetPath.replace(/\\/g, '/');
13
+ const normalized = normalizeAccessControlPath(targetPath);
14
14
  // Matches: "foo.tsk", "foo.tsk/", "a/b/foo.tsk/x", etc.
15
15
  return /(^|\/)[^/]+\.tsk(\/|$)/.test(normalized);
16
16
  }
17
17
  function isMindsPath(targetPath) {
18
- const normalized = targetPath.replace(/\\/g, '/').replace(/^\/+/, '');
18
+ const normalized = normalizeAccessControlPath(targetPath).replace(/^\/+/, '');
19
19
  return normalized === '.minds' || normalized.startsWith('.minds/');
20
20
  }
21
21
  function isMainDialogsPath(targetPath) {
22
22
  // Only deny `.dialogs/**` at rtws root; allow nested `foo/.dialogs/**` for dev rtws layouts.
23
- const normalized = targetPath.replace(/\\/g, '/').replace(/^\/+/, '');
23
+ const normalized = normalizeAccessControlPath(targetPath).replace(/^\/+/, '');
24
24
  return normalized === '.dialogs' || normalized.startsWith('.dialogs/');
25
25
  }
26
+ function normalizeAccessControlPath(targetPath) {
27
+ const normalized = targetPath.replace(/\\/g, '/');
28
+ return process.platform === 'win32' ? normalized.toLowerCase() : normalized;
29
+ }
26
30
  function normalizeFileExtName(raw) {
27
31
  return raw.trim().toLowerCase().replace(/^\.+/, '');
28
32
  }
@@ -84,8 +88,8 @@ function resolveRtwsRelativePath(targetPath) {
84
88
  */
85
89
  function matchesPattern(targetPath, dirPattern) {
86
90
  // Normalize paths - remove leading/trailing slashes, convert to forward slashes, handle empty paths
87
- const normalizedTarget = targetPath.replace(/\\/g, '/').replace(/^\/+|\/+$/g, '') || '.';
88
- let normalizedDirPattern = dirPattern.replace(/\\/g, '/').replace(/^\/+|\/+$/g, '') || '.';
91
+ const normalizedTarget = normalizeAccessControlPath(targetPath).replace(/^\/+|\/+$/g, '') || '.';
92
+ let normalizedDirPattern = normalizeAccessControlPath(dirPattern).replace(/^\/+|\/+$/g, '') || '.';
89
93
  // Patterns ending in `/**` represent a directory scope and should match the directory itself too.
90
94
  // Example: `.minds/**` must match both `.minds` and `.minds/team.yaml`.
91
95
  while (normalizedDirPattern.endsWith('/**')) {
@@ -559,7 +559,7 @@ Best practices:
559
559
 
560
560
  - Make `member_defaults` conservative. Grant additional tools/dirs on a per-member basis.
561
561
  - Prefer toolsets over individually enumerating tools unless you need a one-off tool.
562
- - Platform note: Windows runtime intentionally does not register `codex_inspect_and_patch_tools`; do not grant that toolset in `.minds/team.yaml` on Windows hosts.
562
+ - Platform note: Windows also supports `codex_inspect_and_patch_tools`; `readonly_shell` runs through `cmd.exe`, so prefer allowlisted commands available in that shell/PATH.
563
563
  - Keep `.minds/team.yaml` ownership tight; only the team manager should be able to edit it.
564
564
  - Avoid repeating built-in constraints in `team.yaml`:
565
565
  - `*.tsk/**` (encapsulated Taskdocs) are hard-denied for all general file tools.
@@ -473,7 +473,7 @@ members:
473
473
 
474
474
  - 使 `member_defaults` 保守。按成员授予额外的工具/目录
475
475
  - 优先使用工具集而不是单独枚举工具,除非你需要一次性工具
476
- - 平台说明:Windows 运行时不会注册 `codex_inspect_and_patch_tools`;在 Windows 主机上的 `.minds/team.yaml` 中不要授予该工具集
476
+ - 平台说明:Windows 也支持 `codex_inspect_and_patch_tools`;`readonly_shell` 通过 `cmd.exe` 执行,因此优先使用该 shell/PATH 中可用的白名单命令
477
477
  - 保持 `.minds/team.yaml` 的所有权严格;只有团队管理者应该能够编辑它
478
478
  - 避免在 `team.yaml` 中重复内置约束:
479
479
  - `*.tsk/**`(封装的差遣牒任务包)对所有通用文件工具被硬性拒绝
@@ -2924,7 +2924,7 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2924
2924
  });
2925
2925
  acceptedTriggers = triggerSelection.acceptedTriggers;
2926
2926
  if (triggerSelection.supersededTriggers.length > 0) {
2927
- log_1.log.debug('Superseded stale next-step triggers while starting queued runtime prompt generation', undefined, {
2927
+ log_1.log.debug('Superseded stale next-step triggers while starting prompt-driven generation', undefined, {
2928
2928
  dialogId: this.dialogId.valueOf(),
2929
2929
  rootId: this.dialogId.rootId,
2930
2930
  selfId: this.dialogId.selfId,
@@ -2933,7 +2933,7 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2933
2933
  msgId: msgId ?? null,
2934
2934
  acceptedTriggerIds: acceptedTriggers.map((trigger) => trigger.triggerId),
2935
2935
  supersededTriggerIds: triggerSelection.supersededTriggers.map((trigger) => trigger.triggerId),
2936
- reason: 'queued_runtime_prompt_new_course_takes_precedence',
2936
+ reason: 'prompt_generation_takes_precedence',
2937
2937
  });
2938
2938
  }
2939
2939
  const acceptedTriggerIds = acceptedTriggers.map((trigger) => trigger.triggerId);
@@ -4960,23 +4960,17 @@ function filterNextStepTriggersForGenerationStart(args) {
4960
4960
  if (typeof args.msgId !== 'string' || args.msgId.trim() === '') {
4961
4961
  return { acceptedTriggers: orderedTriggers, supersededTriggers: [] };
4962
4962
  }
4963
- const promptTrigger = orderedTriggers.find((trigger) => trigger.kind === 'queued_prompt' &&
4964
- trigger.promptId === args.msgId &&
4965
- trigger.course === args.currentCourse);
4966
- if (promptTrigger === undefined) {
4967
- return { acceptedTriggers: orderedTriggers, supersededTriggers: [] };
4968
- }
4969
4963
  const acceptedTriggers = [];
4970
4964
  const supersededTriggers = [];
4971
4965
  for (const trigger of orderedTriggers) {
4972
- const belongsToPromptCourse = (() => {
4966
+ const shouldAcceptTrigger = (() => {
4973
4967
  switch (trigger.kind) {
4974
4968
  case 'queued_prompt':
4975
4969
  case 'user_input':
4976
4970
  case 'open_generation_recovery':
4977
4971
  return trigger.course === args.currentCourse;
4978
4972
  case 'followup':
4979
- return trigger.sourceGeneration.course === args.currentCourse;
4973
+ return false;
4980
4974
  case 'mainline_diligence':
4981
4975
  case 'result_arrival':
4982
4976
  case 'reply_delivery_recovery':
@@ -4987,7 +4981,7 @@ function filterNextStepTriggersForGenerationStart(args) {
4987
4981
  }
4988
4982
  }
4989
4983
  })();
4990
- if (belongsToPromptCourse) {
4984
+ if (shouldAcceptTrigger) {
4991
4985
  acceptedTriggers.push(trigger);
4992
4986
  }
4993
4987
  else {
@@ -319,22 +319,20 @@ for (const tool of team_mgmt_1.teamMgmtTools) {
319
319
  manualSpec: manualSpecFor('ws_mod'),
320
320
  });
321
321
  // Inspect-and-patch helpers (function tools only; useful for GPT-5.x coding agents)
322
- if (process.platform !== 'win32') {
323
- (0, registry_1.registerToolset)('codex_inspect_and_patch_tools', [os_1.readonlyShellTool, apply_patch_1.applyPatchTool]);
324
- (0, registry_1.setToolsetMeta)('codex_inspect_and_patch_tools', {
325
- source: 'dominds',
326
- descriptionI18n: {
327
- en: 'Inspect-and-patch helpers: use readonly_shell for lightweight inspection and apply_patch for reviewable edits.',
328
- zh: '检查与补丁工具:用 readonly_shell 做轻量检查,用 apply_patch 做可审查修改。',
329
- },
330
- promptI18n: {
331
- en: 'Use `apply_patch` (apply_patch patch format) to modify files. Use `readonly_shell` for simple rtws (runtime workspace) inspection via its small allowlist; commands outside the allowlist are rejected. For node/python, only exact version probes are allowed (no scripts). Chains via |/&&/|| are validated segment-by-segment. You are explicitly authorized to call `readonly_shell` yourself; do not delegate it to a shell specialist. Avoid multi-line script-style commands; single-line is preferred (|, &&, || are ok). Paths must be relative to the rtws (runtime workspace). Hard denies: `readonly_shell` refuses rtws-root `.minds/` and `.dialogs/`; `apply_patch` is subject to the same access-control (including hard denies for `*.tsk/`, `.minds/`, and rtws-root `.dialogs/`).',
332
- zh: '使用 `apply_patch`(apply_patch patch 格式)修改文件;使用 `readonly_shell` 做少量只读命令行检查,仅允许白名单命令前缀,白名单之外的命令会被拒绝。对 node/python 仅允许版本探针(不允许脚本执行)。通过 |/&&/|| 串联命令时会按子命令逐段校验。你已被明确授权自行调用 `readonly_shell`,不要把它委派给 shell 专员。不建议多行脚本式命令,优先单行(允许 |、&&、||)。路径必须相对 rtws(运行时工作区)根目录。硬拒绝点:`readonly_shell` 无条件拒绝访问 rtws root 的 `.minds/` 与 `.dialogs/`;`apply_patch` 也受相同的访问控制约束(包含对 `*.tsk/`、`.minds/`、rtws root `.dialogs/` 的硬拒绝)。',
333
- },
334
- promptFilesI18n: promptFilesFor('codex_inspect_and_patch_tools'),
335
- manualSpec: manualSpecFor('codex_inspect_and_patch_tools'),
336
- });
337
- }
322
+ (0, registry_1.registerToolset)('codex_inspect_and_patch_tools', [os_1.readonlyShellTool, apply_patch_1.applyPatchTool]);
323
+ (0, registry_1.setToolsetMeta)('codex_inspect_and_patch_tools', {
324
+ source: 'dominds',
325
+ descriptionI18n: {
326
+ en: 'Inspect-and-patch helpers: use readonly_shell for lightweight inspection and apply_patch for reviewable edits.',
327
+ zh: '检查与补丁工具:用 readonly_shell 做轻量检查,用 apply_patch 做可审查修改。',
328
+ },
329
+ promptI18n: {
330
+ en: 'Use `apply_patch` (apply_patch patch format) to modify files. Use `readonly_shell` for simple rtws (runtime workspace) inspection via its small allowlist; commands outside the allowlist are rejected. On Windows, `readonly_shell` runs through `cmd.exe`; use allowlisted commands available in that shell/PATH such as `rg`, `git`, `dir`, `type`, or `where`. For node/python, only exact version probes are allowed (no scripts). Chains via |/&&/|| are validated segment-by-segment. You are explicitly authorized to call `readonly_shell` yourself; do not delegate it to a shell specialist. Avoid multi-line script-style commands; single-line is preferred (|, &&, || are ok). Paths must be relative to the rtws (runtime workspace). Hard denies: `readonly_shell` refuses rtws-root `.minds/` and `.dialogs/`; `apply_patch` is subject to the same access-control (including hard denies for `*.tsk/`, `.minds/`, and rtws-root `.dialogs/`).',
331
+ zh: '使用 `apply_patch`(apply_patch patch 格式)修改文件;使用 `readonly_shell` 做少量只读命令行检查,仅允许白名单命令前缀,白名单之外的命令会被拒绝。Windows `readonly_shell` 通过 `cmd.exe` 执行;请使用该 shell/PATH 中可用的白名单命令,例如 `rg`、`git`、`dir`、`type` `where`。对 node/python 仅允许版本探针(不允许脚本执行)。通过 |/&&/|| 串联命令时会按子命令逐段校验。你已被明确授权自行调用 `readonly_shell`,不要把它委派给 shell 专员。不建议多行脚本式命令,优先单行(允许 |、&&、||)。路径必须相对 rtws(运行时工作区)根目录。硬拒绝点:`readonly_shell` 无条件拒绝访问 rtws root `.minds/` `.dialogs/`;`apply_patch` 也受相同的访问控制约束(包含对 `*.tsk/`、`.minds/`、rtws root `.dialogs/` 的硬拒绝)。',
332
+ },
333
+ promptFilesI18n: promptFilesFor('codex_inspect_and_patch_tools'),
334
+ manualSpec: manualSpecFor('codex_inspect_and_patch_tools'),
335
+ });
338
336
  (0, registry_1.registerToolset)('team_mgmt', [...team_mgmt_1.teamMgmtTools]);
339
337
  (0, registry_1.setToolsetMeta)('team_mgmt', {
340
338
  source: 'dominds',
@@ -19,6 +19,20 @@ export declare function formatShellExecutionErrorForTests(shell: string | undefi
19
19
  export declare function resolveReadonlyShellSpawnSpecForTests(command: string, platform: NodeJS.Platform): ShellSpawnSpec;
20
20
  export declare const shellCmdReminderOwner: ReminderOwner;
21
21
  export declare const shellCmdTool: FuncTool;
22
+ type ReadonlyShellValidationFailureReason = 'MAX_DEPTH' | 'INVALID_CD_SYNTAX' | 'UNSAFE_RELATIVE_PATH' | 'CHAIN_PARSE_EMPTY_SEGMENT' | 'CHAIN_PARSE_UNSUPPORTED_OPERATOR' | 'CHAIN_PARSE_UNTERMINATED_QUOTE' | 'CHAIN_PARSE_TRAILING_ESCAPE' | 'UNSAFE_SHELL_SYNTAX' | 'GIT_C_INVALID' | 'GIT_C_UNSAFE_PATH' | 'GIT_C_UNSUPPORTED_SUBCOMMAND' | 'COMMAND_NOT_ALLOWLISTED';
23
+ type ReadonlyShellValidationFailure = Readonly<{
24
+ reason: ReadonlyShellValidationFailureReason;
25
+ rejectedSegment: string;
26
+ }>;
27
+ type ReadonlyShellValidationResult = Readonly<{
28
+ ok: true;
29
+ }> | Readonly<{
30
+ ok: false;
31
+ failure: ReadonlyShellValidationFailure;
32
+ }>;
33
+ export declare function validateReadonlyShellCommandForTests(command: string, platform: NodeJS.Platform): ReadonlyShellValidationResult;
34
+ type ForbiddenHiddenDir = '.minds' | '.dialogs';
35
+ export declare function detectReadonlyShellForbiddenHiddenDirAccessForTests(workspaceRootAbs: string, command: string, platform: NodeJS.Platform): ForbiddenHiddenDir | null;
22
36
  export declare const readonlyShellTool: FuncTool;
23
37
  export declare const stopDaemonTool: FuncTool;
24
38
  export declare const getDaemonOutputTool: FuncTool;