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.
- package/README.md +1 -1
- package/README.zh.md +1 -1
- package/dist/access-control.js +9 -5
- package/dist/docs/team_mgmt-toolset.md +1 -1
- package/dist/docs/team_mgmt-toolset.zh.md +1 -1
- package/dist/llm/kernel-driver/sideDialog.d.ts +1 -0
- package/dist/llm/kernel-driver/sideDialog.js +29 -11
- package/dist/llm/kernel-driver/tellask-special.js +3 -0
- package/dist/persistence.d.ts +1 -0
- package/dist/persistence.js +23 -11
- package/dist/server/api-routes.js +65 -0
- package/dist/server/dialog-forensics-routes.d.ts +2 -0
- package/dist/server/dialog-forensics-routes.js +549 -0
- package/dist/server/dominds-self-update.js +54 -31
- package/dist/tools/builtins.js +14 -16
- package/dist/tools/os.d.ts +14 -0
- package/dist/tools/os.js +508 -101
- package/dist/tools/prompts/codex_inspect_and_patch_tools/en/tools.md +2 -1
- package/dist/tools/prompts/codex_inspect_and_patch_tools/zh/tools.md +2 -1
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-BF9Zg9uq.js → _basePickBy-B1-brAPU.js} +3 -3
- package/webapp/dist/assets/{_basePickBy-BF9Zg9uq.js.map → _basePickBy-B1-brAPU.js.map} +1 -1
- package/webapp/dist/assets/{_baseUniq-CFjISsgz.js → _baseUniq-BuB0jmKD.js} +2 -2
- package/webapp/dist/assets/{_baseUniq-CFjISsgz.js.map → _baseUniq-BuB0jmKD.js.map} +1 -1
- package/webapp/dist/assets/{arc-BVyYGzE7.js → arc-CvsBvjnB.js} +2 -2
- package/webapp/dist/assets/{arc-BVyYGzE7.js.map → arc-CvsBvjnB.js.map} +1 -1
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-SEmNTU1b.js → architectureDiagram-2XIMDMQ5-B-xGuLbb.js} +7 -7
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-SEmNTU1b.js.map → architectureDiagram-2XIMDMQ5-B-xGuLbb.js.map} +1 -1
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-BndD4gLF.js → blockDiagram-WCTKOSBZ-Bu53fwsa.js} +7 -7
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-BndD4gLF.js.map → blockDiagram-WCTKOSBZ-Bu53fwsa.js.map} +1 -1
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-fGAz7umu.js → c4Diagram-IC4MRINW-D9-FJ4LB.js} +3 -3
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-fGAz7umu.js.map → c4Diagram-IC4MRINW-D9-FJ4LB.js.map} +1 -1
- package/webapp/dist/assets/{channel-Blt7S1Sn.js → channel-D1VPurpu.js} +2 -2
- package/webapp/dist/assets/{channel-Blt7S1Sn.js.map → channel-D1VPurpu.js.map} +1 -1
- package/webapp/dist/assets/{chunk-4BX2VUAB-C2FKcyob.js → chunk-4BX2VUAB-DB14wcWS.js} +2 -2
- package/webapp/dist/assets/{chunk-4BX2VUAB-C2FKcyob.js.map → chunk-4BX2VUAB-DB14wcWS.js.map} +1 -1
- package/webapp/dist/assets/{chunk-55IACEB6-CN8ZmdUP.js → chunk-55IACEB6-C5KCE85A.js} +2 -2
- package/webapp/dist/assets/{chunk-55IACEB6-CN8ZmdUP.js.map → chunk-55IACEB6-C5KCE85A.js.map} +1 -1
- package/webapp/dist/assets/{chunk-FMBD7UC4-B9Uq2tt2.js → chunk-FMBD7UC4-Bb6zm0iH.js} +2 -2
- package/webapp/dist/assets/{chunk-FMBD7UC4-B9Uq2tt2.js.map → chunk-FMBD7UC4-Bb6zm0iH.js.map} +1 -1
- package/webapp/dist/assets/{chunk-JSJVCQXG-vVrXi8LV.js → chunk-JSJVCQXG-CJPrv6fM.js} +2 -2
- package/webapp/dist/assets/{chunk-JSJVCQXG-vVrXi8LV.js.map → chunk-JSJVCQXG-CJPrv6fM.js.map} +1 -1
- package/webapp/dist/assets/{chunk-KX2RTZJC-DtZmdBq3.js → chunk-KX2RTZJC-8J1Swk7E.js} +2 -2
- package/webapp/dist/assets/{chunk-KX2RTZJC-DtZmdBq3.js.map → chunk-KX2RTZJC-8J1Swk7E.js.map} +1 -1
- package/webapp/dist/assets/{chunk-NQ4KR5QH-C3rU1XEw.js → chunk-NQ4KR5QH-DySHY4x9.js} +4 -4
- package/webapp/dist/assets/{chunk-NQ4KR5QH-C3rU1XEw.js.map → chunk-NQ4KR5QH-DySHY4x9.js.map} +1 -1
- package/webapp/dist/assets/{chunk-QZHKN3VN-CeHQK_vs.js → chunk-QZHKN3VN-CTO5Z-4P.js} +2 -2
- package/webapp/dist/assets/{chunk-QZHKN3VN-CeHQK_vs.js.map → chunk-QZHKN3VN-CTO5Z-4P.js.map} +1 -1
- package/webapp/dist/assets/{chunk-WL4C6EOR-Bb8GUwSo.js → chunk-WL4C6EOR-Ci_Ec8Ax.js} +6 -6
- package/webapp/dist/assets/{chunk-WL4C6EOR-Bb8GUwSo.js.map → chunk-WL4C6EOR-Ci_Ec8Ax.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-CmP7X8Fj.js → classDiagram-VBA2DB6C-CxAxBvv7.js} +7 -7
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-CmP7X8Fj.js.map → classDiagram-VBA2DB6C-CxAxBvv7.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CmP7X8Fj.js → classDiagram-v2-RAHNMMFH-CxAxBvv7.js} +7 -7
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CmP7X8Fj.js.map → classDiagram-v2-RAHNMMFH-CxAxBvv7.js.map} +1 -1
- package/webapp/dist/assets/{clone-CzGKO47U.js → clone-ePiNaiNY.js} +2 -2
- package/webapp/dist/assets/{clone-CzGKO47U.js.map → clone-ePiNaiNY.js.map} +1 -1
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-3wbordhk.js → cose-bilkent-S5V4N54A-j-Ex-Sef.js} +2 -2
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-3wbordhk.js.map → cose-bilkent-S5V4N54A-j-Ex-Sef.js.map} +1 -1
- package/webapp/dist/assets/{dagre-KLK3FWXG-DrM7hFR5.js → dagre-KLK3FWXG-ihZ2wOCM.js} +7 -7
- package/webapp/dist/assets/{dagre-KLK3FWXG-DrM7hFR5.js.map → dagre-KLK3FWXG-ihZ2wOCM.js.map} +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-D-bQEVk2.js → diagram-E7M64L7V-Cp4GQGS7.js} +8 -8
- package/webapp/dist/assets/{diagram-E7M64L7V-D-bQEVk2.js.map → diagram-E7M64L7V-Cp4GQGS7.js.map} +1 -1
- package/webapp/dist/assets/{diagram-IFDJBPK2-MaU_xQfR.js → diagram-IFDJBPK2-B70cgyS5.js} +7 -7
- package/webapp/dist/assets/{diagram-IFDJBPK2-MaU_xQfR.js.map → diagram-IFDJBPK2-B70cgyS5.js.map} +1 -1
- package/webapp/dist/assets/{diagram-P4PSJMXO-BLklmc9h.js → diagram-P4PSJMXO-DMOv7eKE.js} +7 -7
- package/webapp/dist/assets/{diagram-P4PSJMXO-BLklmc9h.js.map → diagram-P4PSJMXO-DMOv7eKE.js.map} +1 -1
- package/webapp/dist/assets/{erDiagram-INFDFZHY-DHIVFsNv.js → erDiagram-INFDFZHY-BKpXWjIc.js} +5 -5
- package/webapp/dist/assets/{erDiagram-INFDFZHY-DHIVFsNv.js.map → erDiagram-INFDFZHY-BKpXWjIc.js.map} +1 -1
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-HbMxSdg1.js → flowDiagram-PKNHOUZH-DgrItj0h.js} +7 -7
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-HbMxSdg1.js.map → flowDiagram-PKNHOUZH-DgrItj0h.js.map} +1 -1
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CxBETPNC.js → ganttDiagram-A5KZAMGK-7-8hlYsT.js} +3 -3
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CxBETPNC.js.map → ganttDiagram-A5KZAMGK-7-8hlYsT.js.map} +1 -1
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-DPV-fFTC.js → gitGraphDiagram-K3NZZRJ6-cPSaCUUk.js} +8 -8
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-DPV-fFTC.js.map → gitGraphDiagram-K3NZZRJ6-cPSaCUUk.js.map} +1 -1
- package/webapp/dist/assets/{graph-C0MlCXJg.js → graph-CAlg3tEk.js} +3 -3
- package/webapp/dist/assets/{graph-C0MlCXJg.js.map → graph-CAlg3tEk.js.map} +1 -1
- package/webapp/dist/assets/{index-CzHjX_nj.js → index-DLTS_eOh.js} +123 -47
- package/webapp/dist/assets/{index-CzHjX_nj.js.map → index-DLTS_eOh.js.map} +1 -1
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-ChTC2kD-.js → infoDiagram-LFFYTUFH-CHJHvxMC.js} +6 -6
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-ChTC2kD-.js.map → infoDiagram-LFFYTUFH-CHJHvxMC.js.map} +1 -1
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56--aJd3LM6.js → ishikawaDiagram-PHBUUO56-S8N-XZ8E.js} +2 -2
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56--aJd3LM6.js.map → ishikawaDiagram-PHBUUO56-S8N-XZ8E.js.map} +1 -1
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-Bzd3cZTs.js → journeyDiagram-4ABVD52K-ChHNpMtH.js} +5 -5
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-Bzd3cZTs.js.map → journeyDiagram-4ABVD52K-ChHNpMtH.js.map} +1 -1
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-DiFHcs58.js → kanban-definition-K7BYSVSG-Cqxd99wZ.js} +3 -3
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-DiFHcs58.js.map → kanban-definition-K7BYSVSG-Cqxd99wZ.js.map} +1 -1
- package/webapp/dist/assets/{layout-B9Hsf17G.js → layout-uOLcVthp.js} +5 -5
- package/webapp/dist/assets/{layout-B9Hsf17G.js.map → layout-uOLcVthp.js.map} +1 -1
- package/webapp/dist/assets/{linear-6xqU78Yu.js → linear-Ga_f4H_w.js} +2 -2
- package/webapp/dist/assets/{linear-6xqU78Yu.js.map → linear-Ga_f4H_w.js.map} +1 -1
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BUI6M5up.js → mindmap-definition-YRQLILUH-TSH7wOlZ.js} +4 -4
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BUI6M5up.js.map → mindmap-definition-YRQLILUH-TSH7wOlZ.js.map} +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-FCGp31Lg.js → pieDiagram-SKSYHLDU-DPXszqns.js} +8 -8
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-FCGp31Lg.js.map → pieDiagram-SKSYHLDU-DPXszqns.js.map} +1 -1
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-bJcMGXM6.js → quadrantDiagram-337W2JSQ-BgA_GVhR.js} +3 -3
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-bJcMGXM6.js.map → quadrantDiagram-337W2JSQ-BgA_GVhR.js.map} +1 -1
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-BghuL9nW.js → requirementDiagram-Z7DCOOCP-CM-47daj.js} +4 -4
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-BghuL9nW.js.map → requirementDiagram-Z7DCOOCP-CM-47daj.js.map} +1 -1
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-DpuFpv6d.js → sankeyDiagram-WA2Y5GQK-CxDCwHAj.js} +2 -2
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-DpuFpv6d.js.map → sankeyDiagram-WA2Y5GQK-CxDCwHAj.js.map} +1 -1
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-BM6rPANl.js → sequenceDiagram-2WXFIKYE-1UJP6Fff.js} +4 -4
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-BM6rPANl.js.map → sequenceDiagram-2WXFIKYE-1UJP6Fff.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-C_jQSre0.js → stateDiagram-RAJIS63D-B2aqr0KQ.js} +9 -9
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-C_jQSre0.js.map → stateDiagram-RAJIS63D-B2aqr0KQ.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BbQxj-LI.js → stateDiagram-v2-FVOUBMTO-DvmkevVb.js} +5 -5
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BbQxj-LI.js.map → stateDiagram-v2-FVOUBMTO-DvmkevVb.js.map} +1 -1
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-qVPiYzDY.js → timeline-definition-YZTLITO2-CaOrqzT1.js} +3 -3
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-qVPiYzDY.js.map → timeline-definition-YZTLITO2-CaOrqzT1.js.map} +1 -1
- package/webapp/dist/assets/{treemap-KZPCXAKY-CH_Gjw5E.js → treemap-KZPCXAKY-CWs_8GJm.js} +5 -5
- package/webapp/dist/assets/{treemap-KZPCXAKY-CH_Gjw5E.js.map → treemap-KZPCXAKY-CWs_8GJm.js.map} +1 -1
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-rpOhNWvx.js → vennDiagram-LZ73GAT5-BuBxFDz6.js} +2 -2
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-rpOhNWvx.js.map → vennDiagram-LZ73GAT5-BuBxFDz6.js.map} +1 -1
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-D1TcBJrI.js → xychartDiagram-JWTSCODW-ChjL-_2b.js} +3 -3
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-D1TcBJrI.js.map → xychartDiagram-JWTSCODW-ChjL-_2b.js.map} +1 -1
- 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
|
-
-
|
|
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
|
|
193
|
+
- Windows 也会注册 `codex_inspect_and_patch_tools`;其中 `readonly_shell` 通过 `cmd.exe` 执行,因此优先使用该 shell/PATH 中可用的白名单命令,例如 `rg`、`git`、`dir`、`type` 和 `where`。
|
|
194
194
|
|
|
195
195
|
## 从零开始(空文件夹启动)
|
|
196
196
|
|
package/dist/access-control.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
88
|
-
let normalizedDirPattern = dirPattern
|
|
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
|
|
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
|
|
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
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
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 (
|
|
668
|
-
(sideDialog.currentCourse
|
|
669
|
-
|
|
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: [
|
package/dist/persistence.d.ts
CHANGED
|
@@ -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>;
|
package/dist/persistence.js
CHANGED
|
@@ -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
|
|
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: '
|
|
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
|
|
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
|
|
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 (
|
|
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')
|