dominds 1.25.11 → 1.25.13

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 (115) 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/llm/kernel-driver/sideDialog.d.ts +1 -0
  7. package/dist/llm/kernel-driver/sideDialog.js +29 -11
  8. package/dist/llm/kernel-driver/tellask-special.js +3 -0
  9. package/dist/persistence.d.ts +1 -0
  10. package/dist/persistence.js +23 -11
  11. package/dist/server/api-routes.js +65 -0
  12. package/dist/server/dialog-forensics-routes.d.ts +2 -0
  13. package/dist/server/dialog-forensics-routes.js +549 -0
  14. package/dist/server/dominds-self-update.js +54 -31
  15. package/dist/tools/builtins.js +14 -16
  16. package/dist/tools/os.d.ts +14 -0
  17. package/dist/tools/os.js +508 -101
  18. package/dist/tools/prompts/codex_inspect_and_patch_tools/en/tools.md +2 -1
  19. package/dist/tools/prompts/codex_inspect_and_patch_tools/zh/tools.md +2 -1
  20. package/package.json +3 -3
  21. package/webapp/dist/assets/{_basePickBy-BF9Zg9uq.js → _basePickBy-B1-brAPU.js} +3 -3
  22. package/webapp/dist/assets/{_basePickBy-BF9Zg9uq.js.map → _basePickBy-B1-brAPU.js.map} +1 -1
  23. package/webapp/dist/assets/{_baseUniq-CFjISsgz.js → _baseUniq-BuB0jmKD.js} +2 -2
  24. package/webapp/dist/assets/{_baseUniq-CFjISsgz.js.map → _baseUniq-BuB0jmKD.js.map} +1 -1
  25. package/webapp/dist/assets/{arc-BVyYGzE7.js → arc-CvsBvjnB.js} +2 -2
  26. package/webapp/dist/assets/{arc-BVyYGzE7.js.map → arc-CvsBvjnB.js.map} +1 -1
  27. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-SEmNTU1b.js → architectureDiagram-2XIMDMQ5-B-xGuLbb.js} +7 -7
  28. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-SEmNTU1b.js.map → architectureDiagram-2XIMDMQ5-B-xGuLbb.js.map} +1 -1
  29. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-BndD4gLF.js → blockDiagram-WCTKOSBZ-Bu53fwsa.js} +7 -7
  30. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-BndD4gLF.js.map → blockDiagram-WCTKOSBZ-Bu53fwsa.js.map} +1 -1
  31. package/webapp/dist/assets/{c4Diagram-IC4MRINW-fGAz7umu.js → c4Diagram-IC4MRINW-D9-FJ4LB.js} +3 -3
  32. package/webapp/dist/assets/{c4Diagram-IC4MRINW-fGAz7umu.js.map → c4Diagram-IC4MRINW-D9-FJ4LB.js.map} +1 -1
  33. package/webapp/dist/assets/{channel-Blt7S1Sn.js → channel-D1VPurpu.js} +2 -2
  34. package/webapp/dist/assets/{channel-Blt7S1Sn.js.map → channel-D1VPurpu.js.map} +1 -1
  35. package/webapp/dist/assets/{chunk-4BX2VUAB-C2FKcyob.js → chunk-4BX2VUAB-DB14wcWS.js} +2 -2
  36. package/webapp/dist/assets/{chunk-4BX2VUAB-C2FKcyob.js.map → chunk-4BX2VUAB-DB14wcWS.js.map} +1 -1
  37. package/webapp/dist/assets/{chunk-55IACEB6-CN8ZmdUP.js → chunk-55IACEB6-C5KCE85A.js} +2 -2
  38. package/webapp/dist/assets/{chunk-55IACEB6-CN8ZmdUP.js.map → chunk-55IACEB6-C5KCE85A.js.map} +1 -1
  39. package/webapp/dist/assets/{chunk-FMBD7UC4-B9Uq2tt2.js → chunk-FMBD7UC4-Bb6zm0iH.js} +2 -2
  40. package/webapp/dist/assets/{chunk-FMBD7UC4-B9Uq2tt2.js.map → chunk-FMBD7UC4-Bb6zm0iH.js.map} +1 -1
  41. package/webapp/dist/assets/{chunk-JSJVCQXG-vVrXi8LV.js → chunk-JSJVCQXG-CJPrv6fM.js} +2 -2
  42. package/webapp/dist/assets/{chunk-JSJVCQXG-vVrXi8LV.js.map → chunk-JSJVCQXG-CJPrv6fM.js.map} +1 -1
  43. package/webapp/dist/assets/{chunk-KX2RTZJC-DtZmdBq3.js → chunk-KX2RTZJC-8J1Swk7E.js} +2 -2
  44. package/webapp/dist/assets/{chunk-KX2RTZJC-DtZmdBq3.js.map → chunk-KX2RTZJC-8J1Swk7E.js.map} +1 -1
  45. package/webapp/dist/assets/{chunk-NQ4KR5QH-C3rU1XEw.js → chunk-NQ4KR5QH-DySHY4x9.js} +4 -4
  46. package/webapp/dist/assets/{chunk-NQ4KR5QH-C3rU1XEw.js.map → chunk-NQ4KR5QH-DySHY4x9.js.map} +1 -1
  47. package/webapp/dist/assets/{chunk-QZHKN3VN-CeHQK_vs.js → chunk-QZHKN3VN-CTO5Z-4P.js} +2 -2
  48. package/webapp/dist/assets/{chunk-QZHKN3VN-CeHQK_vs.js.map → chunk-QZHKN3VN-CTO5Z-4P.js.map} +1 -1
  49. package/webapp/dist/assets/{chunk-WL4C6EOR-Bb8GUwSo.js → chunk-WL4C6EOR-Ci_Ec8Ax.js} +6 -6
  50. package/webapp/dist/assets/{chunk-WL4C6EOR-Bb8GUwSo.js.map → chunk-WL4C6EOR-Ci_Ec8Ax.js.map} +1 -1
  51. package/webapp/dist/assets/{classDiagram-VBA2DB6C-CmP7X8Fj.js → classDiagram-VBA2DB6C-CxAxBvv7.js} +7 -7
  52. package/webapp/dist/assets/{classDiagram-VBA2DB6C-CmP7X8Fj.js.map → classDiagram-VBA2DB6C-CxAxBvv7.js.map} +1 -1
  53. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CmP7X8Fj.js → classDiagram-v2-RAHNMMFH-CxAxBvv7.js} +7 -7
  54. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CmP7X8Fj.js.map → classDiagram-v2-RAHNMMFH-CxAxBvv7.js.map} +1 -1
  55. package/webapp/dist/assets/{clone-CzGKO47U.js → clone-ePiNaiNY.js} +2 -2
  56. package/webapp/dist/assets/{clone-CzGKO47U.js.map → clone-ePiNaiNY.js.map} +1 -1
  57. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-3wbordhk.js → cose-bilkent-S5V4N54A-j-Ex-Sef.js} +2 -2
  58. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-3wbordhk.js.map → cose-bilkent-S5V4N54A-j-Ex-Sef.js.map} +1 -1
  59. package/webapp/dist/assets/{dagre-KLK3FWXG-DrM7hFR5.js → dagre-KLK3FWXG-ihZ2wOCM.js} +7 -7
  60. package/webapp/dist/assets/{dagre-KLK3FWXG-DrM7hFR5.js.map → dagre-KLK3FWXG-ihZ2wOCM.js.map} +1 -1
  61. package/webapp/dist/assets/{diagram-E7M64L7V-D-bQEVk2.js → diagram-E7M64L7V-Cp4GQGS7.js} +8 -8
  62. package/webapp/dist/assets/{diagram-E7M64L7V-D-bQEVk2.js.map → diagram-E7M64L7V-Cp4GQGS7.js.map} +1 -1
  63. package/webapp/dist/assets/{diagram-IFDJBPK2-MaU_xQfR.js → diagram-IFDJBPK2-B70cgyS5.js} +7 -7
  64. package/webapp/dist/assets/{diagram-IFDJBPK2-MaU_xQfR.js.map → diagram-IFDJBPK2-B70cgyS5.js.map} +1 -1
  65. package/webapp/dist/assets/{diagram-P4PSJMXO-BLklmc9h.js → diagram-P4PSJMXO-DMOv7eKE.js} +7 -7
  66. package/webapp/dist/assets/{diagram-P4PSJMXO-BLklmc9h.js.map → diagram-P4PSJMXO-DMOv7eKE.js.map} +1 -1
  67. package/webapp/dist/assets/{erDiagram-INFDFZHY-DHIVFsNv.js → erDiagram-INFDFZHY-BKpXWjIc.js} +5 -5
  68. package/webapp/dist/assets/{erDiagram-INFDFZHY-DHIVFsNv.js.map → erDiagram-INFDFZHY-BKpXWjIc.js.map} +1 -1
  69. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-HbMxSdg1.js → flowDiagram-PKNHOUZH-DgrItj0h.js} +7 -7
  70. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-HbMxSdg1.js.map → flowDiagram-PKNHOUZH-DgrItj0h.js.map} +1 -1
  71. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CxBETPNC.js → ganttDiagram-A5KZAMGK-7-8hlYsT.js} +3 -3
  72. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CxBETPNC.js.map → ganttDiagram-A5KZAMGK-7-8hlYsT.js.map} +1 -1
  73. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-DPV-fFTC.js → gitGraphDiagram-K3NZZRJ6-cPSaCUUk.js} +8 -8
  74. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-DPV-fFTC.js.map → gitGraphDiagram-K3NZZRJ6-cPSaCUUk.js.map} +1 -1
  75. package/webapp/dist/assets/{graph-C0MlCXJg.js → graph-CAlg3tEk.js} +3 -3
  76. package/webapp/dist/assets/{graph-C0MlCXJg.js.map → graph-CAlg3tEk.js.map} +1 -1
  77. package/webapp/dist/assets/{index-CzHjX_nj.js → index-DLTS_eOh.js} +123 -47
  78. package/webapp/dist/assets/{index-CzHjX_nj.js.map → index-DLTS_eOh.js.map} +1 -1
  79. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-ChTC2kD-.js → infoDiagram-LFFYTUFH-CHJHvxMC.js} +6 -6
  80. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-ChTC2kD-.js.map → infoDiagram-LFFYTUFH-CHJHvxMC.js.map} +1 -1
  81. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56--aJd3LM6.js → ishikawaDiagram-PHBUUO56-S8N-XZ8E.js} +2 -2
  82. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56--aJd3LM6.js.map → ishikawaDiagram-PHBUUO56-S8N-XZ8E.js.map} +1 -1
  83. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-Bzd3cZTs.js → journeyDiagram-4ABVD52K-ChHNpMtH.js} +5 -5
  84. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-Bzd3cZTs.js.map → journeyDiagram-4ABVD52K-ChHNpMtH.js.map} +1 -1
  85. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-DiFHcs58.js → kanban-definition-K7BYSVSG-Cqxd99wZ.js} +3 -3
  86. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-DiFHcs58.js.map → kanban-definition-K7BYSVSG-Cqxd99wZ.js.map} +1 -1
  87. package/webapp/dist/assets/{layout-B9Hsf17G.js → layout-uOLcVthp.js} +5 -5
  88. package/webapp/dist/assets/{layout-B9Hsf17G.js.map → layout-uOLcVthp.js.map} +1 -1
  89. package/webapp/dist/assets/{linear-6xqU78Yu.js → linear-Ga_f4H_w.js} +2 -2
  90. package/webapp/dist/assets/{linear-6xqU78Yu.js.map → linear-Ga_f4H_w.js.map} +1 -1
  91. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BUI6M5up.js → mindmap-definition-YRQLILUH-TSH7wOlZ.js} +4 -4
  92. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BUI6M5up.js.map → mindmap-definition-YRQLILUH-TSH7wOlZ.js.map} +1 -1
  93. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-FCGp31Lg.js → pieDiagram-SKSYHLDU-DPXszqns.js} +8 -8
  94. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-FCGp31Lg.js.map → pieDiagram-SKSYHLDU-DPXszqns.js.map} +1 -1
  95. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-bJcMGXM6.js → quadrantDiagram-337W2JSQ-BgA_GVhR.js} +3 -3
  96. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-bJcMGXM6.js.map → quadrantDiagram-337W2JSQ-BgA_GVhR.js.map} +1 -1
  97. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-BghuL9nW.js → requirementDiagram-Z7DCOOCP-CM-47daj.js} +4 -4
  98. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-BghuL9nW.js.map → requirementDiagram-Z7DCOOCP-CM-47daj.js.map} +1 -1
  99. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-DpuFpv6d.js → sankeyDiagram-WA2Y5GQK-CxDCwHAj.js} +2 -2
  100. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-DpuFpv6d.js.map → sankeyDiagram-WA2Y5GQK-CxDCwHAj.js.map} +1 -1
  101. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-BM6rPANl.js → sequenceDiagram-2WXFIKYE-1UJP6Fff.js} +4 -4
  102. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-BM6rPANl.js.map → sequenceDiagram-2WXFIKYE-1UJP6Fff.js.map} +1 -1
  103. package/webapp/dist/assets/{stateDiagram-RAJIS63D-C_jQSre0.js → stateDiagram-RAJIS63D-B2aqr0KQ.js} +9 -9
  104. package/webapp/dist/assets/{stateDiagram-RAJIS63D-C_jQSre0.js.map → stateDiagram-RAJIS63D-B2aqr0KQ.js.map} +1 -1
  105. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BbQxj-LI.js → stateDiagram-v2-FVOUBMTO-DvmkevVb.js} +5 -5
  106. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BbQxj-LI.js.map → stateDiagram-v2-FVOUBMTO-DvmkevVb.js.map} +1 -1
  107. package/webapp/dist/assets/{timeline-definition-YZTLITO2-qVPiYzDY.js → timeline-definition-YZTLITO2-CaOrqzT1.js} +3 -3
  108. package/webapp/dist/assets/{timeline-definition-YZTLITO2-qVPiYzDY.js.map → timeline-definition-YZTLITO2-CaOrqzT1.js.map} +1 -1
  109. package/webapp/dist/assets/{treemap-KZPCXAKY-CH_Gjw5E.js → treemap-KZPCXAKY-CWs_8GJm.js} +5 -5
  110. package/webapp/dist/assets/{treemap-KZPCXAKY-CH_Gjw5E.js.map → treemap-KZPCXAKY-CWs_8GJm.js.map} +1 -1
  111. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-rpOhNWvx.js → vennDiagram-LZ73GAT5-BuBxFDz6.js} +2 -2
  112. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-rpOhNWvx.js.map → vennDiagram-LZ73GAT5-BuBxFDz6.js.map} +1 -1
  113. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-D1TcBJrI.js → xychartDiagram-JWTSCODW-ChjL-_2b.js} +3 -3
  114. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-D1TcBJrI.js.map → xychartDiagram-JWTSCODW-ChjL-_2b.js.map} +1 -1
  115. 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/**`(封装的差遣牒任务包)对所有通用文件工具被硬性拒绝
@@ -47,5 +47,6 @@ export declare function supplySideDialogResponseToAssignedAskerIfPendingV2(args:
47
47
  callId: string;
48
48
  replyCallName: 'replyTellask' | 'replyTellaskSessionless' | 'replyTellaskBack';
49
49
  };
50
+ allowExplicitReplyWithoutAssignmentAnchor?: boolean;
50
51
  scheduleDrive: ScheduleDriveFn;
51
52
  }): Promise<boolean>;
@@ -655,18 +655,36 @@ async function supplySideDialogResponseToAssignedAskerIfPendingV2(args) {
655
655
  status: sideDialog.status,
656
656
  });
657
657
  if (!assignmentAnchorRef) {
658
- log_1.log.debug('Skip assigned Type B response supply before updated assignment is rendered locally', undefined, {
659
- rootId: sideDialog.mainDialog.id.rootId,
660
- sideDialogId: sideDialog.id.selfId,
661
- askerDialogId: askerDialog.id.selfId,
662
- callId: activeCalleeDispatch.callId,
663
- responseGenseq,
664
- });
665
- return false;
658
+ const replyResolution = args.replyResolution;
659
+ if (args.allowExplicitReplyWithoutAssignmentAnchor === true &&
660
+ args.deliveryMode === 'reply_tool' &&
661
+ replyResolution !== undefined) {
662
+ log_1.log.warn('Delivering assigned Type B reply without local assignment anchor', undefined, {
663
+ rootId: sideDialog.mainDialog.id.rootId,
664
+ sideDialogId: sideDialog.id.selfId,
665
+ askerDialogId: askerDialog.id.selfId,
666
+ callId: activeCalleeDispatch.callId,
667
+ replyCallId: replyResolution.callId,
668
+ replyCallName: replyResolution.replyCallName,
669
+ responseCourse: sideDialog.currentCourse,
670
+ responseGenseq,
671
+ });
672
+ }
673
+ else {
674
+ log_1.log.debug('Skip assigned Type B response supply before updated assignment is rendered locally', undefined, {
675
+ rootId: sideDialog.mainDialog.id.rootId,
676
+ sideDialogId: sideDialog.id.selfId,
677
+ askerDialogId: askerDialog.id.selfId,
678
+ callId: activeCalleeDispatch.callId,
679
+ responseGenseq,
680
+ });
681
+ return false;
682
+ }
666
683
  }
667
- if (sideDialog.currentCourse < assignmentAnchorRef.course ||
668
- (sideDialog.currentCourse === assignmentAnchorRef.course &&
669
- responseGenseq < assignmentAnchorRef.genseq)) {
684
+ if (assignmentAnchorRef !== undefined &&
685
+ (sideDialog.currentCourse < assignmentAnchorRef.course ||
686
+ (sideDialog.currentCourse === assignmentAnchorRef.course &&
687
+ responseGenseq < assignmentAnchorRef.genseq))) {
670
688
  log_1.log.debug('Skip assigned stale Type B response supply from before latest local assignment', undefined, {
671
689
  rootId: sideDialog.mainDialog.id.rootId,
672
690
  sideDialogId: sideDialog.id.selfId,
@@ -1957,13 +1957,16 @@ async function executeReplyTellaskCall(args) {
1957
1957
  sideDialog: args.dlg,
1958
1958
  responseText: args.call.replyContent,
1959
1959
  responseGenseq: genseq,
1960
+ deliveryMode: 'reply_tool',
1960
1961
  replyResolution: {
1961
1962
  callId: args.call.callId,
1962
1963
  replyCallName: args.call.callName,
1963
1964
  },
1965
+ allowExplicitReplyWithoutAssignmentAnchor: true,
1964
1966
  scheduleDrive: args.callbacks.scheduleDrive,
1965
1967
  });
1966
1968
  if (!supplied) {
1969
+ await persistence_1.DialogPersistence.clearPendingReplyDeliveryForCall(args.dlg.id, args.call.callId, args.dlg.status);
1967
1970
  return {
1968
1971
  delivered: false,
1969
1972
  messages: [
@@ -660,6 +660,7 @@ export declare class DialogPersistence {
660
660
  static loadActiveTellaskReplyObligation(dialogId: DialogID, status?: DialogStatusKind): Promise<TellaskReplyDirective | undefined>;
661
661
  static markReplyDeliveryDelivered(dialogId: DialogID, replyCallId: string, deliveredAt: string, status?: DialogStatusKind): Promise<void>;
662
662
  static markReplyDeliveryToolResultRecorded(dialogId: DialogID, replyCallId: string, status?: DialogStatusKind): Promise<void>;
663
+ static clearPendingReplyDeliveryForCall(dialogId: DialogID, replyCallId: string, status?: DialogStatusKind): Promise<void>;
663
664
  static lookupRecordedTellaskCall(dialogId: DialogID, callId: string, status?: DialogStatusKind): Promise<DialogTellaskCallState['calls'][number] | undefined>;
664
665
  static recordTellaskCall(dialogId: DialogID, record: TellaskCallRecord, course: number, status?: DialogStatusKind): Promise<void>;
665
666
  static hasRecordedTellaskResult(dialogId: DialogID, callId: string, status?: DialogStatusKind): Promise<boolean>;
@@ -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 {
@@ -8437,6 +8431,24 @@ class DialogPersistence {
8437
8431
  };
8438
8432
  }, status);
8439
8433
  }
8434
+ static async clearPendingReplyDeliveryForCall(dialogId, replyCallId, status = 'running') {
8435
+ await this.mutateDialogLatest(dialogId, (previous) => {
8436
+ const replyDelivery = previous.replyDelivery;
8437
+ if (!replyDelivery ||
8438
+ replyDelivery.replyCallId !== replyCallId ||
8439
+ replyDelivery.status !== 'pending') {
8440
+ return { kind: 'noop' };
8441
+ }
8442
+ return {
8443
+ kind: 'patch',
8444
+ patch: {
8445
+ replyDelivery: undefined,
8446
+ nextStep: removeNextStepTrigger(previous.nextStep, (trigger) => trigger.kind === 'reply_delivery_recovery' &&
8447
+ trigger.replyDeliveryId === replyDelivery.replyDeliveryId),
8448
+ },
8449
+ };
8450
+ }, status);
8451
+ }
8440
8452
  static async lookupRecordedTellaskCall(dialogId, callId, status = 'running') {
8441
8453
  const normalizedCallId = callId.trim();
8442
8454
  if (normalizedCallId === '') {
@@ -66,6 +66,7 @@ const id_1 = require("../utils/id");
66
66
  const taskdoc_search_1 = require("../utils/taskdoc-search");
67
67
  const taskdoc_search_worker_client_1 = require("../utils/taskdoc-search-worker-client");
68
68
  const create_dialog_contract_1 = require("./create-dialog-contract");
69
+ const dialog_forensics_routes_1 = require("./dialog-forensics-routes");
69
70
  const dominds_runtime_status_1 = require("./dominds-runtime-status");
70
71
  const dominds_self_update_1 = require("./dominds-self-update");
71
72
  const mime_types_1 = require("./mime-types");
@@ -1063,6 +1064,12 @@ async function handleApiRoute(req, res, pathname, context) {
1063
1064
  if (pathname === '/api/info' && req.method === 'GET') {
1064
1065
  return await handleGetRuntimeInfo(res, context);
1065
1066
  }
1067
+ if (pathname === '/api/dialog-forensics.zip' && req.method === 'GET') {
1068
+ return await (0, dialog_forensics_routes_1.handleDialogForensicsZipRoute)(req.url, res);
1069
+ }
1070
+ if (pathname === '/api/rtws/raw' && req.method === 'GET') {
1071
+ return await handleGetRtwsRaw(req, res);
1072
+ }
1066
1073
  if (pathname === '/api/dominds/self-update' && req.method === 'POST') {
1067
1074
  const body = await readRequestBody(req);
1068
1075
  let parsed;
@@ -1407,6 +1414,64 @@ async function handleApiRoute(req, res, pathname, context) {
1407
1414
  return true;
1408
1415
  }
1409
1416
  }
1417
+ function encodeContentDispositionFilenameStar(name) {
1418
+ return encodeURIComponent(name).replace(/['()*]/g, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`);
1419
+ }
1420
+ function contentDispositionInlineFilename(name) {
1421
+ const fallback = name.replace(/[^\x20-\x7e]|[\r\n\\"]/g, '_');
1422
+ return `inline; filename="${fallback}"; filename*=UTF-8''${encodeContentDispositionFilenameStar(name)}`;
1423
+ }
1424
+ async function handleGetRtwsRaw(req, res) {
1425
+ const urlObj = new URL(req.url ?? '', 'http://127.0.0.1');
1426
+ const rawPath = urlObj.searchParams.get('path');
1427
+ if (rawPath === null || rawPath.trim() === '') {
1428
+ respondJson(res, 400, { success: false, error: '`path` is required' });
1429
+ return true;
1430
+ }
1431
+ const pathRel = normalizeRtwsRelativePath(rawPath, { allowRoot: false });
1432
+ if (pathRel === null) {
1433
+ respondJson(res, 400, { success: false, error: 'Invalid rtws path' });
1434
+ return true;
1435
+ }
1436
+ try {
1437
+ const resolved = await resolveWorkspacePreviewPath(pathRel);
1438
+ const stat = await promises_1.default.stat(resolved.candidateAbsPath);
1439
+ if (!stat.isFile()) {
1440
+ respondJson(res, 400, {
1441
+ success: false,
1442
+ error: 'Path must resolve to a file',
1443
+ path: pathRel,
1444
+ });
1445
+ return true;
1446
+ }
1447
+ const headBytes = await readFileHead(resolved.candidateAbsPath, 512);
1448
+ const mimeType = (0, mime_types_1.sniffMimeType)(pathRel, headBytes);
1449
+ const data = await promises_1.default.readFile(resolved.candidateAbsPath);
1450
+ res.writeHead(200, {
1451
+ 'Content-Type': mimeType,
1452
+ 'Content-Length': data.byteLength,
1453
+ 'Content-Disposition': contentDispositionInlineFilename(path.basename(pathRel)),
1454
+ 'Cache-Control': 'no-store',
1455
+ 'X-Content-Type-Options': 'nosniff',
1456
+ });
1457
+ res.end(data);
1458
+ return true;
1459
+ }
1460
+ catch (error) {
1461
+ const code = getErrorCode(error);
1462
+ if (code === 'ENOENT') {
1463
+ respondJson(res, 404, { success: false, error: 'Path not found', path: pathRel });
1464
+ return true;
1465
+ }
1466
+ if (code === 'OUTSIDE_RTWS') {
1467
+ respondJson(res, 403, { success: false, error: 'Path resolves outside rtws', path: pathRel });
1468
+ return true;
1469
+ }
1470
+ log.error('Failed to read rtws raw file', error, { path: pathRel });
1471
+ respondJson(res, 500, { success: false, error: 'Failed to read rtws raw file', path: pathRel });
1472
+ return true;
1473
+ }
1474
+ }
1410
1475
  function resolveRtwsDiligencePath(lang) {
1411
1476
  const parsed = typeof lang === 'string' ? (0, language_1.normalizeLanguageCode)(lang) : null;
1412
1477
  if (parsed === 'zh')
@@ -0,0 +1,2 @@
1
+ import type { ServerResponse } from 'http';
2
+ export declare function handleDialogForensicsZipRoute(reqUrl: string | undefined, res: ServerResponse): Promise<boolean>;