dominds 1.16.8 → 1.17.0

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 (148) hide show
  1. package/README.md +1 -1
  2. package/README.zh.md +1 -1
  3. package/dist/dialog-display-state.js +22 -1
  4. package/dist/dialog-instance-registry.js +47 -0
  5. package/dist/dialog-interruption.d.ts +1 -0
  6. package/dist/dialog-interruption.js +19 -0
  7. package/dist/dialog.d.ts +2 -1
  8. package/dist/dialog.js +37 -1
  9. package/dist/docs/app-constitution.md +2 -2
  10. package/dist/docs/app-constitution.zh.md +2 -2
  11. package/dist/docs/dialog-system.md +4 -0
  12. package/dist/docs/dialog-system.zh.md +4 -0
  13. package/dist/docs/team_mgmt-toolset.md +1 -1
  14. package/dist/docs/team_mgmt-toolset.zh.md +1 -1
  15. package/dist/llm/gen/codex.d.ts +1 -9
  16. package/dist/llm/gen/codex.js +3 -29
  17. package/dist/llm/kernel-driver/drive.js +23 -81
  18. package/dist/llm/kernel-driver/flow.js +66 -3
  19. package/dist/llm/kernel-driver/loop.js +5 -2
  20. package/dist/llm/kernel-driver/reply-guidance.d.ts +1 -0
  21. package/dist/llm/kernel-driver/reply-guidance.js +15 -5
  22. package/dist/llm/stop-reason-i18n.d.ts +1 -1
  23. package/dist/llm/stop-reason-i18n.js +0 -4
  24. package/dist/persistence.d.ts +3 -1
  25. package/dist/persistence.js +181 -34
  26. package/dist/runtime/interjection-pause-stop.js +5 -1
  27. package/dist/runtime/reply-prompt-copy.js +2 -2
  28. package/dist/tools/apply-patch.js +5 -5
  29. package/dist/tools/builtins.js +11 -12
  30. package/dist/tools/prompts/codex_inspect_and_patch_tools/en/errors.md +45 -0
  31. package/dist/tools/prompts/codex_inspect_and_patch_tools/en/index.md +37 -0
  32. package/dist/tools/prompts/codex_inspect_and_patch_tools/en/principles.md +41 -0
  33. package/dist/tools/prompts/codex_inspect_and_patch_tools/en/scenarios.md +40 -0
  34. package/dist/tools/prompts/codex_inspect_and_patch_tools/en/tools.md +47 -0
  35. package/dist/tools/prompts/codex_inspect_and_patch_tools/zh/errors.md +45 -0
  36. package/dist/tools/prompts/codex_inspect_and_patch_tools/zh/index.md +37 -0
  37. package/dist/tools/prompts/codex_inspect_and_patch_tools/zh/principles.md +41 -0
  38. package/dist/tools/prompts/codex_inspect_and_patch_tools/zh/scenarios.md +40 -0
  39. package/dist/tools/prompts/codex_inspect_and_patch_tools/zh/tools.md +47 -0
  40. package/dist/tools/team_mgmt.js +13 -21
  41. package/package.json +4 -4
  42. package/webapp/dist/assets/{_basePickBy-B7FV6Gnn.js → _basePickBy-DCLDUO6G.js} +3 -3
  43. package/webapp/dist/assets/{_basePickBy-B7FV6Gnn.js.map → _basePickBy-DCLDUO6G.js.map} +1 -1
  44. package/webapp/dist/assets/{_baseUniq-CmVnLJpw.js → _baseUniq-V58PJT8b.js} +2 -2
  45. package/webapp/dist/assets/{_baseUniq-CmVnLJpw.js.map → _baseUniq-V58PJT8b.js.map} +1 -1
  46. package/webapp/dist/assets/{arc-DSJlh9AU.js → arc-6cLC3ft0.js} +2 -2
  47. package/webapp/dist/assets/{arc-DSJlh9AU.js.map → arc-6cLC3ft0.js.map} +1 -1
  48. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-Cd2cTHzo.js → architectureDiagram-2XIMDMQ5-DZCDnc5k.js} +7 -7
  49. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-Cd2cTHzo.js.map → architectureDiagram-2XIMDMQ5-DZCDnc5k.js.map} +1 -1
  50. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-C0uEp_Tz.js → blockDiagram-WCTKOSBZ-B3x8CjfT.js} +7 -7
  51. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-C0uEp_Tz.js.map → blockDiagram-WCTKOSBZ-B3x8CjfT.js.map} +1 -1
  52. package/webapp/dist/assets/{c4Diagram-IC4MRINW-B37U92JK.js → c4Diagram-IC4MRINW-BG5ES2pq.js} +3 -3
  53. package/webapp/dist/assets/{c4Diagram-IC4MRINW-B37U92JK.js.map → c4Diagram-IC4MRINW-BG5ES2pq.js.map} +1 -1
  54. package/webapp/dist/assets/{channel-DLHnjnQf.js → channel-CKCjdwdQ.js} +2 -2
  55. package/webapp/dist/assets/{channel-DLHnjnQf.js.map → channel-CKCjdwdQ.js.map} +1 -1
  56. package/webapp/dist/assets/{chunk-4BX2VUAB-DnZvfQyp.js → chunk-4BX2VUAB-BMUaxm65.js} +2 -2
  57. package/webapp/dist/assets/{chunk-4BX2VUAB-DnZvfQyp.js.map → chunk-4BX2VUAB-BMUaxm65.js.map} +1 -1
  58. package/webapp/dist/assets/{chunk-55IACEB6-BG-cjz3M.js → chunk-55IACEB6-CZLjFLTA.js} +2 -2
  59. package/webapp/dist/assets/{chunk-55IACEB6-BG-cjz3M.js.map → chunk-55IACEB6-CZLjFLTA.js.map} +1 -1
  60. package/webapp/dist/assets/{chunk-FMBD7UC4-B1L8cPfl.js → chunk-FMBD7UC4-C6OhtkjK.js} +2 -2
  61. package/webapp/dist/assets/{chunk-FMBD7UC4-B1L8cPfl.js.map → chunk-FMBD7UC4-C6OhtkjK.js.map} +1 -1
  62. package/webapp/dist/assets/{chunk-JSJVCQXG-C65w23ZF.js → chunk-JSJVCQXG-BL3lMwkX.js} +2 -2
  63. package/webapp/dist/assets/{chunk-JSJVCQXG-C65w23ZF.js.map → chunk-JSJVCQXG-BL3lMwkX.js.map} +1 -1
  64. package/webapp/dist/assets/{chunk-KX2RTZJC-_4YSMrEL.js → chunk-KX2RTZJC-SieIRb1A.js} +2 -2
  65. package/webapp/dist/assets/{chunk-KX2RTZJC-_4YSMrEL.js.map → chunk-KX2RTZJC-SieIRb1A.js.map} +1 -1
  66. package/webapp/dist/assets/{chunk-NQ4KR5QH-ComURSQb.js → chunk-NQ4KR5QH-Dj9V3OHv.js} +4 -4
  67. package/webapp/dist/assets/{chunk-NQ4KR5QH-ComURSQb.js.map → chunk-NQ4KR5QH-Dj9V3OHv.js.map} +1 -1
  68. package/webapp/dist/assets/{chunk-QZHKN3VN-BrxvuRI6.js → chunk-QZHKN3VN-DPuk0WWI.js} +2 -2
  69. package/webapp/dist/assets/{chunk-QZHKN3VN-BrxvuRI6.js.map → chunk-QZHKN3VN-DPuk0WWI.js.map} +1 -1
  70. package/webapp/dist/assets/{chunk-WL4C6EOR-CW7tAF_z.js → chunk-WL4C6EOR-COmZsUPA.js} +6 -6
  71. package/webapp/dist/assets/{chunk-WL4C6EOR-CW7tAF_z.js.map → chunk-WL4C6EOR-COmZsUPA.js.map} +1 -1
  72. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BWrPbwfd.js → classDiagram-VBA2DB6C-D0LskUiI.js} +7 -7
  73. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BWrPbwfd.js.map → classDiagram-VBA2DB6C-D0LskUiI.js.map} +1 -1
  74. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BWrPbwfd.js → classDiagram-v2-RAHNMMFH-D0LskUiI.js} +7 -7
  75. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BWrPbwfd.js.map → classDiagram-v2-RAHNMMFH-D0LskUiI.js.map} +1 -1
  76. package/webapp/dist/assets/{clone-B-TYPsxN.js → clone-DF4VAArJ.js} +2 -2
  77. package/webapp/dist/assets/{clone-B-TYPsxN.js.map → clone-DF4VAArJ.js.map} +1 -1
  78. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-C1bfZcVY.js → cose-bilkent-S5V4N54A-BLS39Y5M.js} +2 -2
  79. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-C1bfZcVY.js.map → cose-bilkent-S5V4N54A-BLS39Y5M.js.map} +1 -1
  80. package/webapp/dist/assets/{dagre-KLK3FWXG-BfD08d2e.js → dagre-KLK3FWXG-BNcB5hir.js} +7 -7
  81. package/webapp/dist/assets/{dagre-KLK3FWXG-BfD08d2e.js.map → dagre-KLK3FWXG-BNcB5hir.js.map} +1 -1
  82. package/webapp/dist/assets/{diagram-E7M64L7V-Dyd9OucT.js → diagram-E7M64L7V-C1k_RR0F.js} +8 -8
  83. package/webapp/dist/assets/{diagram-E7M64L7V-Dyd9OucT.js.map → diagram-E7M64L7V-C1k_RR0F.js.map} +1 -1
  84. package/webapp/dist/assets/{diagram-IFDJBPK2-BN-JCceb.js → diagram-IFDJBPK2-IbfvdUeO.js} +7 -7
  85. package/webapp/dist/assets/{diagram-IFDJBPK2-BN-JCceb.js.map → diagram-IFDJBPK2-IbfvdUeO.js.map} +1 -1
  86. package/webapp/dist/assets/{diagram-P4PSJMXO-C2jh_Kry.js → diagram-P4PSJMXO-DMHGiNIM.js} +7 -7
  87. package/webapp/dist/assets/{diagram-P4PSJMXO-C2jh_Kry.js.map → diagram-P4PSJMXO-DMHGiNIM.js.map} +1 -1
  88. package/webapp/dist/assets/{erDiagram-INFDFZHY-C3Pj10OJ.js → erDiagram-INFDFZHY-DdHLX_b6.js} +5 -5
  89. package/webapp/dist/assets/{erDiagram-INFDFZHY-C3Pj10OJ.js.map → erDiagram-INFDFZHY-DdHLX_b6.js.map} +1 -1
  90. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-a5vzSSCo.js → flowDiagram-PKNHOUZH-BfFizksz.js} +7 -7
  91. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-a5vzSSCo.js.map → flowDiagram-PKNHOUZH-BfFizksz.js.map} +1 -1
  92. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DIua0Qjr.js → ganttDiagram-A5KZAMGK-CqevCVU5.js} +3 -3
  93. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DIua0Qjr.js.map → ganttDiagram-A5KZAMGK-CqevCVU5.js.map} +1 -1
  94. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-CJt16FXK.js → gitGraphDiagram-K3NZZRJ6-BOOwupHL.js} +8 -8
  95. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-CJt16FXK.js.map → gitGraphDiagram-K3NZZRJ6-BOOwupHL.js.map} +1 -1
  96. package/webapp/dist/assets/{graph-lQSuHjYm.js → graph-nrSDteEc.js} +3 -3
  97. package/webapp/dist/assets/{graph-lQSuHjYm.js.map → graph-nrSDteEc.js.map} +1 -1
  98. package/webapp/dist/assets/{index-B7llu28V.js → index-Cakki4rP.js} +70 -203
  99. package/webapp/dist/assets/{index-B7llu28V.js.map → index-Cakki4rP.js.map} +1 -1
  100. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-DzJuXz5H.js → infoDiagram-LFFYTUFH-D9wzGbBd.js} +6 -6
  101. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-DzJuXz5H.js.map → infoDiagram-LFFYTUFH-D9wzGbBd.js.map} +1 -1
  102. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-BP_s17vw.js → ishikawaDiagram-PHBUUO56-Cw505dkV.js} +2 -2
  103. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-BP_s17vw.js.map → ishikawaDiagram-PHBUUO56-Cw505dkV.js.map} +1 -1
  104. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-Lic1mhBM.js → journeyDiagram-4ABVD52K-DB9-Kk7L.js} +5 -5
  105. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-Lic1mhBM.js.map → journeyDiagram-4ABVD52K-DB9-Kk7L.js.map} +1 -1
  106. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Baf2kCwQ.js → kanban-definition-K7BYSVSG-D6f5d594.js} +3 -3
  107. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Baf2kCwQ.js.map → kanban-definition-K7BYSVSG-D6f5d594.js.map} +1 -1
  108. package/webapp/dist/assets/{layout-DUMDc8rv.js → layout-C66Gu-9j.js} +5 -5
  109. package/webapp/dist/assets/{layout-DUMDc8rv.js.map → layout-C66Gu-9j.js.map} +1 -1
  110. package/webapp/dist/assets/{linear-CZMoHeVH.js → linear-WEG-0mNF.js} +2 -2
  111. package/webapp/dist/assets/{linear-CZMoHeVH.js.map → linear-WEG-0mNF.js.map} +1 -1
  112. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-DB2sQ--_.js → mindmap-definition-YRQLILUH-C5o4PZoW.js} +4 -4
  113. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-DB2sQ--_.js.map → mindmap-definition-YRQLILUH-C5o4PZoW.js.map} +1 -1
  114. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-Dgdrlric.js → pieDiagram-SKSYHLDU-CvE77iES.js} +8 -8
  115. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-Dgdrlric.js.map → pieDiagram-SKSYHLDU-CvE77iES.js.map} +1 -1
  116. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-CJcFYfqf.js → quadrantDiagram-337W2JSQ-0WD_Zxhv.js} +3 -3
  117. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-CJcFYfqf.js.map → quadrantDiagram-337W2JSQ-0WD_Zxhv.js.map} +1 -1
  118. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CDsT-ac7.js → requirementDiagram-Z7DCOOCP-VSa_hUdb.js} +4 -4
  119. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CDsT-ac7.js.map → requirementDiagram-Z7DCOOCP-VSa_hUdb.js.map} +1 -1
  120. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-DiO55skm.js → sankeyDiagram-WA2Y5GQK-vPNok4nN.js} +2 -2
  121. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-DiO55skm.js.map → sankeyDiagram-WA2Y5GQK-vPNok4nN.js.map} +1 -1
  122. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-CNHjdBNC.js → sequenceDiagram-2WXFIKYE-DX4cZf9x.js} +4 -4
  123. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-CNHjdBNC.js.map → sequenceDiagram-2WXFIKYE-DX4cZf9x.js.map} +1 -1
  124. package/webapp/dist/assets/{stateDiagram-RAJIS63D-CtS3TXEd.js → stateDiagram-RAJIS63D-nqNJSdDU.js} +9 -9
  125. package/webapp/dist/assets/{stateDiagram-RAJIS63D-CtS3TXEd.js.map → stateDiagram-RAJIS63D-nqNJSdDU.js.map} +1 -1
  126. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BdjJA1de.js → stateDiagram-v2-FVOUBMTO-BuZBSDCT.js} +5 -5
  127. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BdjJA1de.js.map → stateDiagram-v2-FVOUBMTO-BuZBSDCT.js.map} +1 -1
  128. package/webapp/dist/assets/{timeline-definition-YZTLITO2-D3AiTIhK.js → timeline-definition-YZTLITO2--gWaXe_R.js} +3 -3
  129. package/webapp/dist/assets/{timeline-definition-YZTLITO2-D3AiTIhK.js.map → timeline-definition-YZTLITO2--gWaXe_R.js.map} +1 -1
  130. package/webapp/dist/assets/{treemap-KZPCXAKY-F6nRvLGK.js → treemap-KZPCXAKY-CAx-L6KX.js} +5 -5
  131. package/webapp/dist/assets/{treemap-KZPCXAKY-F6nRvLGK.js.map → treemap-KZPCXAKY-CAx-L6KX.js.map} +1 -1
  132. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BoukZEuo.js → vennDiagram-LZ73GAT5-BQD4mief.js} +2 -2
  133. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BoukZEuo.js.map → vennDiagram-LZ73GAT5-BQD4mief.js.map} +1 -1
  134. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-ByfGkhZz.js → xychartDiagram-JWTSCODW-D-wcj8Yx.js} +3 -3
  135. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-ByfGkhZz.js.map → xychartDiagram-JWTSCODW-D-wcj8Yx.js.map} +1 -1
  136. package/webapp/dist/index.html +1 -1
  137. package/dist/tools/plan.d.ts +0 -2
  138. package/dist/tools/plan.js +0 -171
  139. package/dist/tools/prompts/codex_style_tools/en/errors.md +0 -102
  140. package/dist/tools/prompts/codex_style_tools/en/index.md +0 -59
  141. package/dist/tools/prompts/codex_style_tools/en/principles.md +0 -87
  142. package/dist/tools/prompts/codex_style_tools/en/scenarios.md +0 -88
  143. package/dist/tools/prompts/codex_style_tools/en/tools.md +0 -119
  144. package/dist/tools/prompts/codex_style_tools/zh/errors.md +0 -102
  145. package/dist/tools/prompts/codex_style_tools/zh/index.md +0 -59
  146. package/dist/tools/prompts/codex_style_tools/zh/principles.md +0 -87
  147. package/dist/tools/prompts/codex_style_tools/zh/scenarios.md +0 -88
  148. package/dist/tools/prompts/codex_style_tools/zh/tools.md +0 -119
package/README.md CHANGED
@@ -203,7 +203,7 @@ Then:
203
203
 
204
204
  Platform note:
205
205
 
206
- - On Windows, the runtime does not register the `codex_style_tools` toolset. Do not grant `codex_style_tools` in `.minds/team.yaml` for Windows hosts.
206
+ - 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.
207
207
 
208
208
  ## Start from scratch
209
209
 
package/README.zh.md CHANGED
@@ -142,7 +142,7 @@ dominds
142
142
 
143
143
  平台说明:
144
144
 
145
- - Windows 运行时不会注册 `codex_style_tools` 工具集。在 Windows 主机上的 `.minds/team.yaml` 中不要授予 `codex_style_tools`。
145
+ - Windows 运行时不会注册 `codex_inspect_and_patch_tools` 工具集。在 Windows 主机上的 `.minds/team.yaml` 中不要授予 `codex_inspect_and_patch_tools`。
146
146
 
147
147
  ## 从零开始(空文件夹启动)
148
148
 
@@ -417,6 +417,13 @@ async function computeIdleDisplayState(dlg) {
417
417
  continueEnabled: isStoppedReasonResumable(latest.executionMarker.reason),
418
418
  };
419
419
  }
420
+ if (latest?.pendingCourseStartPrompt) {
421
+ return {
422
+ kind: 'stopped',
423
+ reason: { kind: 'pending_course_start' },
424
+ continueEnabled: true,
425
+ };
426
+ }
420
427
  const hasQ4H = await dlg.hasPendingQ4H();
421
428
  const hasSubdialogs = await dlg.hasPendingSubdialogs();
422
429
  if (hasQ4H && hasSubdialogs) {
@@ -449,6 +456,13 @@ async function computeIdleDisplayStateFromPersistence(dialogId) {
449
456
  continueEnabled: isStoppedReasonResumable(latest.executionMarker.reason),
450
457
  };
451
458
  }
459
+ if (latest?.pendingCourseStartPrompt) {
460
+ return {
461
+ kind: 'stopped',
462
+ reason: { kind: 'pending_course_start' },
463
+ continueEnabled: true,
464
+ };
465
+ }
452
466
  const q4h = await persistence_1.DialogPersistence.loadQuestions4HumanState(dialogId, 'running');
453
467
  const pendingSubdialogs = await persistence_1.DialogPersistence.loadPendingSubdialogs(dialogId, 'running');
454
468
  const hasQ4H = q4h.length > 0;
@@ -502,6 +516,13 @@ async function refreshRunControlProjectionFromPersistenceFacts(dialogId, trigger
502
516
  continueEnabled: isStoppedReasonResumable(latest.executionMarker.reason),
503
517
  };
504
518
  }
519
+ if (latest.pendingCourseStartPrompt) {
520
+ return {
521
+ kind: 'stopped',
522
+ reason: { kind: 'pending_course_start' },
523
+ continueEnabled: true,
524
+ };
525
+ }
505
526
  const q4h = await persistence_1.DialogPersistence.loadQuestions4HumanState(dialogId, 'running');
506
527
  const pendingSubdialogs = await persistence_1.DialogPersistence.loadPendingSubdialogs(dialogId, 'running');
507
528
  const hasQ4H = q4h.length > 0;
@@ -605,7 +626,7 @@ async function reconcileDisplayStatesAfterRestart() {
605
626
  if (!nextIdle) {
606
627
  continue;
607
628
  }
608
- const next = nextIdle.kind === 'blocked'
629
+ const next = nextIdle.kind === 'blocked' || nextIdle.kind === 'stopped' || nextIdle.kind === 'dead'
609
630
  ? nextIdle
610
631
  : {
611
632
  kind: 'stopped',
@@ -24,6 +24,39 @@ function clampNonNegativeFiniteInt(value, fallback) {
24
24
  return fallback;
25
25
  return Math.max(0, Math.floor(value));
26
26
  }
27
+ async function resolvePendingCourseStartPromptForRestore(args) {
28
+ const pending = args.latest?.pendingCourseStartPrompt;
29
+ if (!pending) {
30
+ return { pendingCourseStartPrompt: undefined };
31
+ }
32
+ const alreadyPersisted = args.messages.some((message) => {
33
+ return message.type === 'prompting_msg' && message.msgId === pending.msgId;
34
+ });
35
+ if (alreadyPersisted) {
36
+ if (args.status === 'running') {
37
+ await persistence_1.DialogPersistence.clearPendingCourseStartPrompt(args.dialogId, pending.msgId, args.status);
38
+ }
39
+ return { pendingCourseStartPrompt: undefined };
40
+ }
41
+ return {
42
+ pendingCourseStartPrompt: {
43
+ content: pending.content,
44
+ msgId: pending.msgId,
45
+ grammar: 'markdown',
46
+ origin: 'runtime',
47
+ ...(pending.userLanguageCode === undefined
48
+ ? {}
49
+ : { userLanguageCode: pending.userLanguageCode }),
50
+ ...(pending.tellaskReplyDirective === undefined
51
+ ? {}
52
+ : { tellaskReplyDirective: pending.tellaskReplyDirective }),
53
+ ...(pending.skipTaskdoc === undefined ? {} : { skipTaskdoc: pending.skipTaskdoc }),
54
+ ...(pending.subdialogReplyTarget === undefined
55
+ ? {}
56
+ : { subdialogReplyTarget: pending.subdialogReplyTarget }),
57
+ },
58
+ };
59
+ }
27
60
  async function getOrRestoreRootDialog(rootId, status) {
28
61
  const existing = dialog_global_registry_1.globalDialogRegistry.get(rootId);
29
62
  if (existing) {
@@ -41,6 +74,12 @@ async function getOrRestoreRootDialog(rootId, status) {
41
74
  return undefined;
42
75
  }
43
76
  const latest = await persistence_1.DialogPersistence.loadDialogLatest(rootDialogId, status);
77
+ const { pendingCourseStartPrompt } = await resolvePendingCourseStartPromptForRestore({
78
+ dialogId: rootDialogId,
79
+ status,
80
+ messages: rootState.messages,
81
+ latest,
82
+ });
44
83
  let diligencePushMax = diligence_1.DEFAULT_DILIGENCE_PUSH_MAX;
45
84
  try {
46
85
  const team = await team_1.Team.load();
@@ -56,6 +95,7 @@ async function getOrRestoreRootDialog(rootId, status) {
56
95
  reminders: rootState.reminders,
57
96
  currentCourse: rootState.currentCourse,
58
97
  contextHealth: rootState.contextHealth,
98
+ pendingCourseStartPrompt,
59
99
  });
60
100
  const persistedDisableDiligencePush = latest && typeof latest.disableDiligencePush === 'boolean'
61
101
  ? latest.disableDiligencePush
@@ -97,6 +137,12 @@ async function ensureDialogLoaded(rootDialog, targetId, status, visitedSelfIds =
97
137
  if (!state)
98
138
  return undefined;
99
139
  const latest = await persistence_1.DialogPersistence.loadDialogLatest(targetId, status);
140
+ const { pendingCourseStartPrompt } = await resolvePendingCourseStartPromptForRestore({
141
+ dialogId: targetId,
142
+ status,
143
+ messages: state.messages,
144
+ latest,
145
+ });
100
146
  const assignmentFromSup = state.metadata.assignmentFromSup;
101
147
  if (!assignmentFromSup)
102
148
  return undefined;
@@ -112,6 +158,7 @@ async function ensureDialogLoaded(rootDialog, targetId, status, visitedSelfIds =
112
158
  reminders: state.reminders,
113
159
  currentCourse: state.currentCourse,
114
160
  contextHealth: state.contextHealth,
161
+ pendingCourseStartPrompt,
115
162
  });
116
163
  subdialog.disableDiligencePush = latest?.disableDiligencePush ?? false;
117
164
  if (subdialog.sessionSlug) {
@@ -16,3 +16,4 @@ import type { DialogInterruptionReason } from '@longrun-ai/kernel/types/display-
16
16
  * provider/model and should keep protecting the system.
17
17
  */
18
18
  export declare function isInterruptionReasonManualResumeEligible(reason: DialogInterruptionReason): boolean;
19
+ export declare function doesInterruptionReasonRequireExplicitResume(reason: DialogInterruptionReason): boolean;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isInterruptionReasonManualResumeEligible = isInterruptionReasonManualResumeEligible;
4
+ exports.doesInterruptionReasonRequireExplicitResume = doesInterruptionReasonRequireExplicitResume;
4
5
  /**
5
6
  * Decides whether a finalized stopped dialog should expose manual Continue.
6
7
  *
@@ -22,6 +23,24 @@ function isInterruptionReasonManualResumeEligible(reason) {
22
23
  case 'user_stop':
23
24
  case 'emergency_stop':
24
25
  case 'server_restart':
26
+ case 'pending_course_start':
27
+ case 'fork_continue_ready':
28
+ case 'system_stop':
29
+ case 'llm_retry_stopped':
30
+ return true;
31
+ default: {
32
+ const _exhaustive = reason;
33
+ return _exhaustive;
34
+ }
35
+ }
36
+ }
37
+ function doesInterruptionReasonRequireExplicitResume(reason) {
38
+ switch (reason.kind) {
39
+ case 'pending_course_start':
40
+ return false;
41
+ case 'user_stop':
42
+ case 'emergency_stop':
43
+ case 'server_restart':
25
44
  case 'fork_continue_ready':
26
45
  case 'system_stop':
27
46
  case 'llm_retry_stopped':
package/dist/dialog.d.ts CHANGED
@@ -106,6 +106,7 @@ export interface DialogInitParams {
106
106
  createdAt?: string;
107
107
  updatedAt?: string;
108
108
  contextHealth?: ContextHealthSnapshot;
109
+ pendingCourseStartPrompt?: DialogPrompt;
109
110
  };
110
111
  }
111
112
  export type VisibleReminderTarget = Readonly<{
@@ -678,7 +679,7 @@ export declare abstract class DialogStore {
678
679
  /**
679
680
  * Start a new course in storage
680
681
  */
681
- startNewCourse(_dialog: Dialog, _newCoursePrompt: string): Promise<void>;
682
+ startNewCourse(_dialog: Dialog, _newCoursePrompt: DialogPrompt): Promise<void>;
682
683
  /**
683
684
  * Handle stream error
684
685
  */
package/dist/dialog.js CHANGED
@@ -67,6 +67,38 @@ function getGlobalDialogMutex(dialogId) {
67
67
  function compareVisibleReminderTargetOrder(a, b) {
68
68
  return (0, tool_1.compareReminderDisplayOrder)(a.reminder, b.reminder);
69
69
  }
70
+ function buildSubdialogAssignmentPromptMeta(subdialog) {
71
+ const assignment = subdialog.assignmentFromSup;
72
+ switch (assignment.callName) {
73
+ case 'tellask':
74
+ return {
75
+ tellaskReplyDirective: {
76
+ expectedReplyCallName: 'replyTellask',
77
+ targetCallId: assignment.callId,
78
+ tellaskContent: assignment.tellaskContent,
79
+ },
80
+ subdialogReplyTarget: {
81
+ ownerDialogId: assignment.callerDialogId,
82
+ callType: 'B',
83
+ callId: assignment.callId,
84
+ },
85
+ };
86
+ case 'tellaskSessionless':
87
+ case 'freshBootsReasoning':
88
+ return {
89
+ tellaskReplyDirective: {
90
+ expectedReplyCallName: 'replyTellaskSessionless',
91
+ targetCallId: assignment.callId,
92
+ tellaskContent: assignment.tellaskContent,
93
+ },
94
+ subdialogReplyTarget: {
95
+ ownerDialogId: assignment.callerDialogId,
96
+ callType: 'C',
97
+ callId: assignment.callId,
98
+ },
99
+ };
100
+ }
101
+ }
70
102
  /**
71
103
  * Abstract base class for all dialog types.
72
104
  * Contains common properties and methods shared between RootDialog and SubDialog.
@@ -132,6 +164,9 @@ class Dialog {
132
164
  this._lastUserLanguageCode = (0, work_language_1.getWorkLanguage)();
133
165
  this._lastContextHealth = initialState?.contextHealth;
134
166
  this._lastContextHealthGenseq = undefined;
167
+ if (initialState?.pendingCourseStartPrompt) {
168
+ this.setNewCourseStartPrompt(initialState.pendingCourseStartPrompt);
169
+ }
135
170
  this.resetCourseLanguageNotice();
136
171
  }
137
172
  setLastContextHealth(snapshot) {
@@ -844,6 +879,7 @@ class Dialog {
844
879
  grammar: 'markdown',
845
880
  userLanguageCode: this._lastUserLanguageCode,
846
881
  origin: 'runtime',
882
+ ...(this instanceof SubDialog ? buildSubdialogAssignmentPromptMeta(this) : {}),
847
883
  };
848
884
  const runControlSpec = options?.runControl ?? this._activeRunControlSpec;
849
885
  let nextPrompt = basePrompt;
@@ -863,7 +899,7 @@ class Dialog {
863
899
  await this.dlgStore.clearQuestions4Human(this);
864
900
  // Delegate to DialogStore for course start persistence
865
901
  if (this.dlgStore) {
866
- await this.dlgStore.startNewCourse(this, nextPrompt.content);
902
+ await this.dlgStore.startNewCourse(this, nextPrompt);
867
903
  }
868
904
  const storeCourse = this.dlgStore
869
905
  ? await this.dlgStore.loadCurrentCourse(this.id)
@@ -444,7 +444,7 @@ Suggested team shape:
444
444
  - non-goal: does not directly edit product code or take over build/process management.
445
445
  - `web_developer`
446
446
  - primary responsibility: implement UI/interaction fixes, consume `web_tester` findings, and close the loop;
447
- - default toolsets: code-edit/search tools such as `codex_style_tools` (or equivalent) plus optional access to read tester evidence;
447
+ - default toolsets: code-edit/search tools such as `codex_inspect_and_patch_tools` (or equivalent) plus optional access to read tester evidence;
448
448
  - non-goal: should not blur browser acceptance into an implicit “I also tested it” posture; when acceptance is needed, it should explicitly tell/ask `web_tester`.
449
449
 
450
450
  Suggested `team.yaml` fragment:
@@ -463,7 +463,7 @@ members:
463
463
  icon: '🛠️'
464
464
  toolsets:
465
465
  - ws_read
466
- - codex_style_tools
466
+ - codex_inspect_and_patch_tools
467
467
  ```
468
468
 
469
469
  Requirements for the `playwright_interactive` toolset design:
@@ -443,7 +443,7 @@ Web Dev App 需要明确区分三套命名,避免再次漂移:
443
443
  - 非目标:不直接修改业务代码;不接管构建/进程管理。
444
444
  - `web_developer`
445
445
  - 主要职责:实现页面/UI/交互修复,消费 `web_tester` 的缺陷报告并完成闭环。
446
- - 默认工具集:代码修改/检索工具(如 `codex_style_tools` 或等价工具)+ 可选读取 `web_tester` 产出的证据。
446
+ - 默认工具集:代码修改/检索工具(如 `codex_inspect_and_patch_tools` 或等价工具)+ 可选读取 `web_tester` 产出的证据。
447
447
  - 非目标:不把浏览器验收职责模糊地“顺手做掉”;需要时应显式 tellask `web_tester` 做验收。
448
448
 
449
449
  建议的 `team.yaml` 片段:
@@ -462,7 +462,7 @@ members:
462
462
  icon: '🛠️'
463
463
  toolsets:
464
464
  - ws_read
465
- - codex_style_tools
465
+ - codex_inspect_and_patch_tools
466
466
  ```
467
467
 
468
468
  关于 `playwright_interactive` 工具集的设计要求:
@@ -168,6 +168,8 @@ When a dialog still carries an inter-dialog reply obligation, but the user tempo
168
168
  5. As long as the user keeps sending new messages, the dialog stays in temporary interjection-chat handling, and that paused projection remains in place only if it was established in the first place.
169
169
  6. Only an explicit UI `Continue` attempts to restore the original task.
170
170
 
171
+ **Strict boundary**: a formal `askHuman` answer is not part of this "user interjection" category. As soon as a prompt carries a real `q4hAnswerCallId`, it belongs to the askHuman reply channel and semantically continues an already-materialized question/answer chain; it must never be downgraded into temporary local side-chat.
172
+
171
173
  **Key point**: this `stopped` state is only a temporary run-control / UI projection. It is not the same as an ordinary system-stop failure, and it is not the final business source of truth. It also does not apply to every interjection; it exists only when there really is a parked original task to resume.
172
174
 
173
175
  After the user clicks `Continue`, the backend MUST re-evaluate fresh persistence facts and decide which true-source case now applies. It must not infer the result purely from the visible `displayState`:
@@ -183,6 +185,7 @@ After the user clicks `Continue`, the backend MUST re-evaluate fresh persistence
183
185
 
184
186
  - `refreshRunControlProjectionFromPersistenceFacts()` MUST preserve the special "interjection handled; original task paused" `stopped` projection until the user explicitly clicks `Continue`; otherwise the UI collapses back to ordinary `blocked` too early and breaks multi-turn interjection UX. Conversely, when there is no parked original task, this paused projection should not be created at all.
185
187
  - The actual outcome of `Continue` MUST be decided in the resume drive path by re-reading fresh persistence facts. "Continue is clickable" does not mean "the dialog will definitely enter proceeding immediately".
188
+ - If `Continue` reveals that the true state is still `blocked`, the reply-obligation reassertion copy should be materialized immediately as a runtime guide in both `dlg.msgs` and persisted course history, while also surfacing as a frontend bubble. That lets the later real resume path rely on ordinary context replay instead of synthesizing a second duplicate runtime prompt.
186
189
  - The run-control toolbar's `resumable` count should align with "manual Continue attempt is meaningful". Therefore an interjection-paused `stopped` dialog still counts as resumable even when underlying blocker facts remain, because the business meaning of `Continue` there is "exit the temporary paused projection and re-evaluate from source-of-truth facts".
187
190
 
188
191
  **Mental-model warning**:
@@ -190,6 +193,7 @@ After the user clicks `Continue`, the backend MUST re-evaluate fresh persistence
190
193
  - Do not reason about this flow from `displayState.kind === 'stopped'` alone.
191
194
  - Do not reason about it from blocker facts alone and then wonder why the UI still shows `stopped`.
192
195
  - Do not reason about it from `resume_dialog` eligibility alone and assume resumption always means immediate running.
196
+ - Do not flatten every `origin === 'user'` prompt into "interjection"; a non-empty `q4hAnswerCallId` means askHuman answer continuation and follows a different semantic path.
193
197
 
194
198
  You need all of the following together to understand the behavior correctly:
195
199
 
@@ -167,6 +167,8 @@
167
167
  5. 只要用户继续发送新消息,就继续作为插话临时对话处理;这个 paused projection 仅在它已被建立时持续保持。
168
168
  6. 只有用户显式点击 UI `Continue`,系统才尝试恢复原任务。
169
169
 
170
+ **严格边界**:`askHuman` 的正式回答不属于这里的“用户插话”。只要一条 prompt 带着真实的 `q4hAnswerCallId`,它就属于 askHuman 回复通道,语义上是在继续已 materialize 的提问/应答链路,绝不能被压入“本地临时插话聊天”。
171
+
170
172
  **关键点**:这里的 `stopped` 只是一个临时 run-control / UI 投影,不等于普通 system-stop 失败,也不是最终的业务真源;并且它不是所有插话都会出现,只在“确有一个待恢复的原任务被临时停靠”时出现。
171
173
 
172
174
  点击 `Continue` 后,后端必须重新从 persistence 真源判定当前对话属于哪一种情况,而不能只根据表面的 `displayState` 做静态推断:
@@ -182,6 +184,7 @@
182
184
 
183
185
  - `refreshRunControlProjectionFromPersistenceFacts()` 在用户尚未点击 `Continue` 前,必须保留这层“插话已处理;原任务已暂停”的 `stopped` 投影;否则 UI 会过早塌回普通 `blocked`,破坏多轮插话体验。反过来,如果当前其实没有待恢复原任务,则根本不应建立这层 paused projection。
184
186
  - 真正决定 `Continue` 结果的逻辑,必须在恢复驱动路径中重新读取 fresh persistence facts;不能把“可点 Continue”误解为“必然立即 proceeding”。
187
+ - 若 `Continue` 后真源仍是 `blocked`,回复责任重申文案应当立即作为 runtime guide 同时进入 `dlg.msgs` 与持久化课程历史,并同步发前端气泡;这样后面真正恢复 drive 时只需正常读取上下文,不应再额外补发一条重复的 runtime prompt。
185
188
  - run-control 工具栏中的 `resumable` 计数,应与“是否允许手动 Continue 尝试”保持一致。因此,处于 interjection-paused `stopped` 的对话即便底层仍有 blocker,也应计入 `resumable`;因为 `Continue` 的业务语义正是“退出这层临时 paused projection,并从真源重判下一步”。
186
189
 
187
190
  **心智模型提醒**:
@@ -189,6 +192,7 @@
189
192
  - 不能只看 `displayState.kind === 'stopped'` 就理解这条链路。
190
193
  - 不能只看 blocker facts 就理解为什么 UI 仍显示 `stopped`。
191
194
  - 也不能只看 `resume_dialog` eligibility 就推断恢复后一定马上运行。
195
+ - 更不能把所有 `origin === 'user'` 的输入都笼统视作“用户插话”;`q4hAnswerCallId` 非空的 prompt 是 askHuman answer continuation,必须按另一条语义链处理。
192
196
 
193
197
  必须把以下几块一起看,才能形成完整且精确的理解:
194
198
 
@@ -533,7 +533,7 @@ Best practices:
533
533
 
534
534
  - Make `member_defaults` conservative. Grant additional tools/dirs on a per-member basis.
535
535
  - Prefer toolsets over individually enumerating tools unless you need a one-off tool.
536
- - Platform note: Windows runtime intentionally does not register `codex_style_tools`; do not grant that toolset in `.minds/team.yaml` on Windows hosts.
536
+ - 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.
537
537
  - Keep `.minds/team.yaml` ownership tight; only the team manager should be able to edit it.
538
538
  - Avoid repeating built-in constraints in `team.yaml`:
539
539
  - `*.tsk/**` (encapsulated Taskdocs) are hard-denied for all general file tools.
@@ -452,7 +452,7 @@ members:
452
452
 
453
453
  - 使 `member_defaults` 保守。按成员授予额外的工具/目录
454
454
  - 优先使用工具集而不是单独枚举工具,除非你需要一次性工具
455
- - 平台说明:Windows 运行时不会注册 `codex_style_tools`;在 Windows 主机上的 `.minds/team.yaml` 中不要授予该工具集
455
+ - 平台说明:Windows 运行时不会注册 `codex_inspect_and_patch_tools`;在 Windows 主机上的 `.minds/team.yaml` 中不要授予该工具集
456
456
  - 保持 `.minds/team.yaml` 的所有权严格;只有团队管理者应该能够编辑它
457
457
  - 避免在 `team.yaml` 中重复内置约束:
458
458
  - `*.tsk/**`(封装的差遣牒任务包)对所有通用文件工具被硬性拒绝
@@ -11,15 +11,7 @@ import type { FuncTool } from '../../tool';
11
11
  import type { ChatMessage, ProviderConfig } from '../client';
12
12
  import type { LlmBatchResult, LlmFailureDisposition, LlmGenerator, LlmRequestContext, LlmStreamReceiver, LlmStreamResult } from '../gen';
13
13
  export declare function resolveCodexServiceTier(serviceTier: ChatGptResponsesRequest['service_tier'] | undefined): Exclude<NonNullable<ChatGptResponsesRequest['service_tier']>, 'default'> | undefined;
14
- export declare function spliceCodexBuiltinPrompt(params: {
15
- template: string;
16
- defaultModel: string;
17
- loadPrompt: (model: string) => string | null;
18
- }): string;
19
- export declare function resolveCodexInstructions(systemPrompt: string, options?: {
20
- defaultModel?: string;
21
- loadPrompt?: (model: string) => string | null;
22
- }): string;
14
+ export declare function resolveCodexInstructions(systemPrompt: string): string;
23
15
  export declare class CodexGen implements LlmGenerator {
24
16
  get apiType(): string;
25
17
  classifyFailure(error: unknown): LlmFailureDisposition | undefined;
@@ -35,7 +35,6 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.CodexGen = void 0;
37
37
  exports.resolveCodexServiceTier = resolveCodexServiceTier;
38
- exports.spliceCodexBuiltinPrompt = spliceCodexBuiltinPrompt;
39
38
  exports.resolveCodexInstructions = resolveCodexInstructions;
40
39
  const log_1 = require("../../log");
41
40
  const i18n_text_1 = require("../../runtime/i18n-text");
@@ -47,7 +46,6 @@ const tool_output_limit_1 = require("./tool-output-limit");
47
46
  const tool_result_image_ingest_1 = require("./tool-result-image-ingest");
48
47
  const log = (0, log_1.createLogger)('llm/codex');
49
48
  const codexFallbackInstructions = 'You are Codex CLI.';
50
- const CODEX_SYSTEM_PROMPT_DIRECTIVE_PATTERN = /^([ \t]*)@codex-system-prompt(?::([A-Za-z0-9._-]+))?([ \t]*)$/gm;
51
49
  function resolveCodexServiceTier(serviceTier) {
52
50
  // The ChatGPT codex backend rejects the literal `default` tier even though some SDK typings
53
51
  // still list it. Omitting the field preserves the standard tier semantics without a 400.
@@ -116,29 +114,8 @@ function tryExtractApiReturnedModel(value) {
116
114
  const trimmed = model.trim();
117
115
  return trimmed.length > 0 ? trimmed : undefined;
118
116
  }
119
- function spliceCodexBuiltinPrompt(params) {
120
- let replaced = false;
121
- const resolved = params.template.replace(CODEX_SYSTEM_PROMPT_DIRECTIVE_PATTERN, (_match, leading, overrideModel, trailing) => {
122
- const selectedModel = overrideModel ?? params.defaultModel;
123
- const prompt = params.loadPrompt(selectedModel);
124
- if (prompt === null) {
125
- throw new Error(`Bundled Codex prompt template not found for model: ${selectedModel}`);
126
- }
127
- replaced = true;
128
- return `${leading}${prompt}${trailing}`;
129
- });
130
- return replaced ? resolved : params.template;
131
- }
132
- function resolveCodexInstructions(systemPrompt, options) {
133
- const baseInstructions = systemPrompt.trim().length > 0 ? systemPrompt : codexFallbackInstructions;
134
- if (options?.defaultModel === undefined || options.loadPrompt === undefined) {
135
- return baseInstructions;
136
- }
137
- return spliceCodexBuiltinPrompt({
138
- template: baseInstructions,
139
- defaultModel: options.defaultModel,
140
- loadPrompt: options.loadPrompt,
141
- });
117
+ function resolveCodexInstructions(systemPrompt) {
118
+ return systemPrompt.trim().length > 0 ? systemPrompt : codexFallbackInstructions;
142
119
  }
143
120
  function funcToolToCodex(funcTool) {
144
121
  // MCP schemas are passed through to providers. Codex tool schema types are narrower; runtime
@@ -534,10 +511,7 @@ class CodexGen {
534
511
  if (!agent.model) {
535
512
  throw new Error(`Internal error: Model is undefined for agent '${agent.id}'`);
536
513
  }
537
- const instructions = resolveCodexInstructions(systemPrompt, {
538
- defaultModel: agent.model,
539
- loadPrompt: codexAuth.loadCodexPromptSync,
540
- });
514
+ const instructions = resolveCodexInstructions(systemPrompt);
541
515
  const payload = await buildCodexRequest(providerConfig, agent, instructions, funcTools, requestContext, context, receiver.toolResultImageIngest);
542
516
  let sayingStarted = false;
543
517
  let thinkingStarted = false;