dominds 1.20.3 → 1.20.5

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 (159) hide show
  1. package/README.md +4 -4
  2. package/README.zh.md +2 -2
  3. package/dist/access-control.js +2 -2
  4. package/dist/cli/webui.d.ts +1 -1
  5. package/dist/cli/webui.js +29 -9
  6. package/dist/dialog-factory.d.ts +3 -0
  7. package/dist/dialog-factory.js +2 -6
  8. package/dist/dialog-fork.js +4 -2
  9. package/dist/dialog.d.ts +11 -0
  10. package/dist/dialog.js +6 -0
  11. package/dist/docs/cli-usage.md +2 -1
  12. package/dist/docs/cli-usage.zh.md +6 -3
  13. package/dist/docs/context-health.md +2 -2
  14. package/dist/docs/context-health.zh.md +2 -2
  15. package/dist/docs/design.md +3 -3
  16. package/dist/docs/design.zh.md +3 -3
  17. package/dist/docs/dialog-system.md +33 -10
  18. package/dist/docs/dialog-system.zh.md +29 -10
  19. package/dist/docs/dominds-terminology.md +4 -4
  20. package/dist/docs/encapsulated-taskdoc.md +17 -10
  21. package/dist/docs/encapsulated-taskdoc.zh.md +18 -11
  22. package/dist/docs/q4h.md +14 -10
  23. package/dist/docs/q4h.zh.md +13 -11
  24. package/dist/docs/tellask-revive-context-refactor.zh.md +1 -0
  25. package/dist/llm/kernel-driver/drive.js +32 -1
  26. package/dist/llm/kernel-driver/flow.js +2 -2
  27. package/dist/llm/kernel-driver/sideDialog.d.ts +9 -0
  28. package/dist/llm/kernel-driver/sideDialog.js +14 -12
  29. package/dist/llm/kernel-driver/tellask-special.js +163 -16
  30. package/dist/llm/kernel-driver/types.d.ts +3 -0
  31. package/dist/minds/load.js +14 -4
  32. package/dist/minds/minds-i18n.js +2 -2
  33. package/dist/minds/system-prompt-parts.js +8 -8
  34. package/dist/persistence.d.ts +3 -1
  35. package/dist/persistence.js +47 -34
  36. package/dist/priming.js +68 -9
  37. package/dist/runtime/driver-messages.js +8 -4
  38. package/dist/server/port-selection.d.ts +19 -0
  39. package/dist/server/port-selection.js +57 -0
  40. package/dist/server/server-core.d.ts +2 -2
  41. package/dist/server/server-core.js +21 -7
  42. package/dist/server.d.ts +3 -0
  43. package/dist/server.js +109 -44
  44. package/dist/team.d.ts +2 -3
  45. package/dist/team.js +17 -4
  46. package/dist/tools/builtins.js +3 -0
  47. package/dist/tools/ctrl.d.ts +10 -8
  48. package/dist/tools/ctrl.js +141 -22
  49. package/dist/tools/prompts/control/en/errors.md +2 -2
  50. package/dist/tools/prompts/control/en/principles.md +13 -12
  51. package/dist/tools/prompts/control/en/tools.md +23 -5
  52. package/dist/tools/prompts/control/zh/errors.md +2 -2
  53. package/dist/tools/prompts/control/zh/principles.md +13 -12
  54. package/dist/tools/prompts/control/zh/tools.md +23 -5
  55. package/dist/tools/prompts/personal_memory/en/principles.md +1 -1
  56. package/dist/tools/prompts/personal_memory/zh/principles.md +1 -1
  57. package/dist/tools/prompts/team_memory/en/principles.md +1 -1
  58. package/dist/tools/prompts/team_memory/zh/principles.md +1 -1
  59. package/dist/tools/registry.d.ts +6 -0
  60. package/dist/tools/team_mgmt.js +5 -5
  61. package/dist/utils/task-package.d.ts +15 -1
  62. package/dist/utils/task-package.js +51 -1
  63. package/dist/utils/taskdoc.js +60 -22
  64. package/package.json +4 -4
  65. package/webapp/dist/assets/{_basePickBy-B2wYdQcR.js → _basePickBy-DFzVggWM.js} +3 -3
  66. package/webapp/dist/assets/{_basePickBy-B2wYdQcR.js.map → _basePickBy-DFzVggWM.js.map} +1 -1
  67. package/webapp/dist/assets/{_baseUniq-zKoHgk38.js → _baseUniq-CXD_3O9i.js} +2 -2
  68. package/webapp/dist/assets/{_baseUniq-zKoHgk38.js.map → _baseUniq-CXD_3O9i.js.map} +1 -1
  69. package/webapp/dist/assets/{arc-D8bQ-Nzm.js → arc--yzhIodb.js} +2 -2
  70. package/webapp/dist/assets/{arc-D8bQ-Nzm.js.map → arc--yzhIodb.js.map} +1 -1
  71. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-BiimGQW5.js → architectureDiagram-2XIMDMQ5-B2jDlUga.js} +7 -7
  72. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-BiimGQW5.js.map → architectureDiagram-2XIMDMQ5-B2jDlUga.js.map} +1 -1
  73. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-BXPbS_wx.js → blockDiagram-WCTKOSBZ-BUPbccZo.js} +7 -7
  74. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-BXPbS_wx.js.map → blockDiagram-WCTKOSBZ-BUPbccZo.js.map} +1 -1
  75. package/webapp/dist/assets/{c4Diagram-IC4MRINW-BZC0c1Ke.js → c4Diagram-IC4MRINW-DwTime9I.js} +3 -3
  76. package/webapp/dist/assets/{c4Diagram-IC4MRINW-BZC0c1Ke.js.map → c4Diagram-IC4MRINW-DwTime9I.js.map} +1 -1
  77. package/webapp/dist/assets/{channel-BP3Qyxui.js → channel-C44ixz_J.js} +2 -2
  78. package/webapp/dist/assets/{channel-BP3Qyxui.js.map → channel-C44ixz_J.js.map} +1 -1
  79. package/webapp/dist/assets/{chunk-4BX2VUAB-BXABHFQC.js → chunk-4BX2VUAB-D8GtQm2f.js} +2 -2
  80. package/webapp/dist/assets/{chunk-4BX2VUAB-BXABHFQC.js.map → chunk-4BX2VUAB-D8GtQm2f.js.map} +1 -1
  81. package/webapp/dist/assets/{chunk-55IACEB6-KdM20zpJ.js → chunk-55IACEB6-D581Sluc.js} +2 -2
  82. package/webapp/dist/assets/{chunk-55IACEB6-KdM20zpJ.js.map → chunk-55IACEB6-D581Sluc.js.map} +1 -1
  83. package/webapp/dist/assets/{chunk-FMBD7UC4-B2T04oKB.js → chunk-FMBD7UC4-DflSPxF8.js} +2 -2
  84. package/webapp/dist/assets/{chunk-FMBD7UC4-B2T04oKB.js.map → chunk-FMBD7UC4-DflSPxF8.js.map} +1 -1
  85. package/webapp/dist/assets/{chunk-JSJVCQXG-Bz-hhsBJ.js → chunk-JSJVCQXG-CcUETDd7.js} +2 -2
  86. package/webapp/dist/assets/{chunk-JSJVCQXG-Bz-hhsBJ.js.map → chunk-JSJVCQXG-CcUETDd7.js.map} +1 -1
  87. package/webapp/dist/assets/{chunk-KX2RTZJC-B1TcA_CH.js → chunk-KX2RTZJC-DfcLbXaY.js} +2 -2
  88. package/webapp/dist/assets/{chunk-KX2RTZJC-B1TcA_CH.js.map → chunk-KX2RTZJC-DfcLbXaY.js.map} +1 -1
  89. package/webapp/dist/assets/{chunk-NQ4KR5QH-BwsfKfyl.js → chunk-NQ4KR5QH-B0hUHzGe.js} +4 -4
  90. package/webapp/dist/assets/{chunk-NQ4KR5QH-BwsfKfyl.js.map → chunk-NQ4KR5QH-B0hUHzGe.js.map} +1 -1
  91. package/webapp/dist/assets/{chunk-QZHKN3VN-BX453Nua.js → chunk-QZHKN3VN-V0IQhkyq.js} +2 -2
  92. package/webapp/dist/assets/{chunk-QZHKN3VN-BX453Nua.js.map → chunk-QZHKN3VN-V0IQhkyq.js.map} +1 -1
  93. package/webapp/dist/assets/{chunk-WL4C6EOR-COCTYZ-S.js → chunk-WL4C6EOR-Dlq3MRVu.js} +6 -6
  94. package/webapp/dist/assets/{chunk-WL4C6EOR-COCTYZ-S.js.map → chunk-WL4C6EOR-Dlq3MRVu.js.map} +1 -1
  95. package/webapp/dist/assets/{classDiagram-VBA2DB6C-aWgCJGiX.js → classDiagram-VBA2DB6C-23iqCPis.js} +7 -7
  96. package/webapp/dist/assets/{classDiagram-VBA2DB6C-aWgCJGiX.js.map → classDiagram-VBA2DB6C-23iqCPis.js.map} +1 -1
  97. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-aWgCJGiX.js → classDiagram-v2-RAHNMMFH-23iqCPis.js} +7 -7
  98. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-aWgCJGiX.js.map → classDiagram-v2-RAHNMMFH-23iqCPis.js.map} +1 -1
  99. package/webapp/dist/assets/{clone-UCWLNsJ4.js → clone-DOk1nA0K.js} +2 -2
  100. package/webapp/dist/assets/{clone-UCWLNsJ4.js.map → clone-DOk1nA0K.js.map} +1 -1
  101. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-Blf43_-z.js → cose-bilkent-S5V4N54A-BRI_M3Z1.js} +2 -2
  102. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-Blf43_-z.js.map → cose-bilkent-S5V4N54A-BRI_M3Z1.js.map} +1 -1
  103. package/webapp/dist/assets/{dagre-KLK3FWXG-BLTVAduG.js → dagre-KLK3FWXG-PjbaHNi2.js} +7 -7
  104. package/webapp/dist/assets/{dagre-KLK3FWXG-BLTVAduG.js.map → dagre-KLK3FWXG-PjbaHNi2.js.map} +1 -1
  105. package/webapp/dist/assets/{diagram-E7M64L7V-eHyGJiW2.js → diagram-E7M64L7V-C9jrc2Yj.js} +8 -8
  106. package/webapp/dist/assets/{diagram-E7M64L7V-eHyGJiW2.js.map → diagram-E7M64L7V-C9jrc2Yj.js.map} +1 -1
  107. package/webapp/dist/assets/{diagram-IFDJBPK2-BzZS2fFL.js → diagram-IFDJBPK2-D_B_8ZEE.js} +7 -7
  108. package/webapp/dist/assets/{diagram-IFDJBPK2-BzZS2fFL.js.map → diagram-IFDJBPK2-D_B_8ZEE.js.map} +1 -1
  109. package/webapp/dist/assets/{diagram-P4PSJMXO-CUUSxkwu.js → diagram-P4PSJMXO-BAGUvld_.js} +7 -7
  110. package/webapp/dist/assets/{diagram-P4PSJMXO-CUUSxkwu.js.map → diagram-P4PSJMXO-BAGUvld_.js.map} +1 -1
  111. package/webapp/dist/assets/{erDiagram-INFDFZHY-DF_doi5_.js → erDiagram-INFDFZHY-5ufs8FDF.js} +5 -5
  112. package/webapp/dist/assets/{erDiagram-INFDFZHY-DF_doi5_.js.map → erDiagram-INFDFZHY-5ufs8FDF.js.map} +1 -1
  113. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-YcqCG3mt.js → flowDiagram-PKNHOUZH-Bax4wCyq.js} +7 -7
  114. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-YcqCG3mt.js.map → flowDiagram-PKNHOUZH-Bax4wCyq.js.map} +1 -1
  115. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-BZNRb7SP.js → ganttDiagram-A5KZAMGK-9ZX_VymK.js} +3 -3
  116. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-BZNRb7SP.js.map → ganttDiagram-A5KZAMGK-9ZX_VymK.js.map} +1 -1
  117. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-nAdujBg_.js → gitGraphDiagram-K3NZZRJ6-YbGo4EFg.js} +8 -8
  118. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-nAdujBg_.js.map → gitGraphDiagram-K3NZZRJ6-YbGo4EFg.js.map} +1 -1
  119. package/webapp/dist/assets/{graph-Cv-ZJ4Fl.js → graph-B4UFhGtz.js} +3 -3
  120. package/webapp/dist/assets/{graph-Cv-ZJ4Fl.js.map → graph-B4UFhGtz.js.map} +1 -1
  121. package/webapp/dist/assets/{index-Dhf_wAfo.js → index-D7y9EEAl.js} +621 -530
  122. package/webapp/dist/assets/{index-Dhf_wAfo.js.map → index-D7y9EEAl.js.map} +1 -1
  123. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CwtMOnIR.js → infoDiagram-LFFYTUFH-K9JKlk7P.js} +6 -6
  124. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CwtMOnIR.js.map → infoDiagram-LFFYTUFH-K9JKlk7P.js.map} +1 -1
  125. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Cfb8MPoG.js → ishikawaDiagram-PHBUUO56-D7h7bNU_.js} +2 -2
  126. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Cfb8MPoG.js.map → ishikawaDiagram-PHBUUO56-D7h7bNU_.js.map} +1 -1
  127. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-u0xpmaEL.js → journeyDiagram-4ABVD52K-BHhkjUnE.js} +5 -5
  128. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-u0xpmaEL.js.map → journeyDiagram-4ABVD52K-BHhkjUnE.js.map} +1 -1
  129. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-BuwDgdXi.js → kanban-definition-K7BYSVSG-BsdCCeJO.js} +3 -3
  130. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-BuwDgdXi.js.map → kanban-definition-K7BYSVSG-BsdCCeJO.js.map} +1 -1
  131. package/webapp/dist/assets/{layout-DwFR5fz7.js → layout-CTqY3yh8.js} +5 -5
  132. package/webapp/dist/assets/{layout-DwFR5fz7.js.map → layout-CTqY3yh8.js.map} +1 -1
  133. package/webapp/dist/assets/{linear-DK9kuyt6.js → linear-D3vXpsJz.js} +2 -2
  134. package/webapp/dist/assets/{linear-DK9kuyt6.js.map → linear-D3vXpsJz.js.map} +1 -1
  135. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BP26yHUE.js → mindmap-definition-YRQLILUH-Df26nneZ.js} +4 -4
  136. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BP26yHUE.js.map → mindmap-definition-YRQLILUH-Df26nneZ.js.map} +1 -1
  137. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-Dg05ljR9.js → pieDiagram-SKSYHLDU-CORXrWQD.js} +8 -8
  138. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-Dg05ljR9.js.map → pieDiagram-SKSYHLDU-CORXrWQD.js.map} +1 -1
  139. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-BZwWQDeQ.js → quadrantDiagram-337W2JSQ-D1iEgnz7.js} +3 -3
  140. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-BZwWQDeQ.js.map → quadrantDiagram-337W2JSQ-D1iEgnz7.js.map} +1 -1
  141. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-IZuN0Vt3.js → requirementDiagram-Z7DCOOCP-BTi9foPw.js} +4 -4
  142. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-IZuN0Vt3.js.map → requirementDiagram-Z7DCOOCP-BTi9foPw.js.map} +1 -1
  143. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-BsVp8N4k.js → sankeyDiagram-WA2Y5GQK-DlXqXBte.js} +2 -2
  144. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-BsVp8N4k.js.map → sankeyDiagram-WA2Y5GQK-DlXqXBte.js.map} +1 -1
  145. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-BkAT5uON.js → sequenceDiagram-2WXFIKYE-DtV5AvqW.js} +4 -4
  146. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-BkAT5uON.js.map → sequenceDiagram-2WXFIKYE-DtV5AvqW.js.map} +1 -1
  147. package/webapp/dist/assets/{stateDiagram-RAJIS63D-qk_ajPAy.js → stateDiagram-RAJIS63D-BD05KYfc.js} +9 -9
  148. package/webapp/dist/assets/{stateDiagram-RAJIS63D-qk_ajPAy.js.map → stateDiagram-RAJIS63D-BD05KYfc.js.map} +1 -1
  149. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-CNtP8Lfm.js → stateDiagram-v2-FVOUBMTO-ZWU-eA69.js} +5 -5
  150. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-CNtP8Lfm.js.map → stateDiagram-v2-FVOUBMTO-ZWU-eA69.js.map} +1 -1
  151. package/webapp/dist/assets/{timeline-definition-YZTLITO2-DLU-Pyr1.js → timeline-definition-YZTLITO2-Bz0iSxAq.js} +3 -3
  152. package/webapp/dist/assets/{timeline-definition-YZTLITO2-DLU-Pyr1.js.map → timeline-definition-YZTLITO2-Bz0iSxAq.js.map} +1 -1
  153. package/webapp/dist/assets/{treemap-KZPCXAKY-hHk6fxaq.js → treemap-KZPCXAKY-VCn63bTk.js} +5 -5
  154. package/webapp/dist/assets/{treemap-KZPCXAKY-hHk6fxaq.js.map → treemap-KZPCXAKY-VCn63bTk.js.map} +1 -1
  155. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-CM1zd5GO.js → vennDiagram-LZ73GAT5-DMD4pzqJ.js} +2 -2
  156. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-CM1zd5GO.js.map → vennDiagram-LZ73GAT5-DMD4pzqJ.js.map} +1 -1
  157. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-CccDexUn.js → xychartDiagram-JWTSCODW-B5BYuiJN.js} +3 -3
  158. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-CccDexUn.js.map → xychartDiagram-JWTSCODW-B5BYuiJN.js.map} +1 -1
  159. package/webapp/dist/index.html +1 -1
package/README.md CHANGED
@@ -156,7 +156,7 @@ There are two common ways to create an rtws:
156
156
  - **Recommended**: start from a scaffold/template (see [Quick Start](#quick-start)).
157
157
  - **Minimal**: start from an empty folder (see [Start from scratch](#start-from-scratch)).
158
158
 
159
- Dominds uses your current working directory as the runtime workspace (rtws). When you start `dominds`, the WebUI will automatically redirect you to `http://localhost:5666/setup` if the rtws is missing required configuration (for example `.minds/team.yaml` or provider env vars).
159
+ Dominds uses your current working directory as the runtime workspace (rtws). When you start `dominds`, the WebUI listens on `5666` or the next available lower port, then automatically redirects to `/setup` if the rtws is missing required configuration (for example `.minds/team.yaml` or provider env vars).
160
160
 
161
161
  Note: In production mode, Dominds enables a local shared-secret auth key by default, so the browser may open with a URL containing `?auth=...`. Treat that token as sensitive.
162
162
 
@@ -195,7 +195,7 @@ dominds
195
195
 
196
196
  Then:
197
197
 
198
- 1. Your browser should land on `http://localhost:5666/setup` (either directly, or via an automatic redirect).
198
+ 1. Your browser should land on the local WebUI `/setup` page (usually `http://localhost:5666/setup`, unless that port was already occupied).
199
199
  2. In **Setup**, pick a provider + model. If your template didn’t create `.minds/team.yaml`, use Setup to create/overwrite it (this writes a minimal `member_defaults` config).
200
200
  3. Still in **Setup**, set the required provider env var (the name comes from the provider catalog, e.g. `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `CODEX_HOME`, etc.).
201
201
  - The setup UI can write it to `.env.local` (all platforms), and on Linux/macOS it can also write into `~/.zshrc` / `~/.bashrc` in managed blocks. It also applies the value to the running server process immediately.
@@ -213,11 +213,11 @@ Starting from scratch means: create an empty folder, run `dominds`, let Setup ge
213
213
  mkdir my-rtws
214
214
  cd my-rtws
215
215
 
216
- # Starts the WebUI server and opens a browser (default port: 5666)
216
+ # Starts the WebUI server and opens a browser (default port behavior: 5666-)
217
217
  dominds
218
218
  ```
219
219
 
220
- 1. The WebUI should redirect you to `http://localhost:5666/setup` because the rtws has no `.minds/team.yaml` yet.
220
+ 1. The WebUI should redirect you to the local `/setup` page because the rtws has no `.minds/team.yaml` yet.
221
221
  2. In **Setup**:
222
222
  - Select a provider + model and click **Create `.minds/team.yaml`**.
223
223
  - Provide the required provider env var and write it to your shell rc (or set it manually). Setup applies it immediately to the running server.
package/README.zh.md CHANGED
@@ -130,11 +130,11 @@ pnpm run lint:types
130
130
  dominds create web-scaffold my-project
131
131
  cd my-project
132
132
 
133
- # 2) 启动 WebUI(默认自动打开浏览器,默认端口 5666
133
+ # 2) 启动 WebUI(默认自动打开浏览器;未指定端口时等价于 5666-)
134
134
  dominds
135
135
  ```
136
136
 
137
- 首次启动后,通常会自动跳转至 `http://localhost:5666/setup` 配置页面,按以下步骤操作:
137
+ 首次启动后,通常会自动跳转至本机 WebUI 的 `/setup` 配置页面(优先使用 `http://localhost:5666/setup`,如果端口被占用则自动尝试更小端口),按以下步骤操作:
138
138
 
139
139
  1. 选择提供商(provider)及模型(model),创建或覆盖 `.minds/team.yaml`(最小化可运行配置文件)。
140
140
  2. 根据提示设置提供商所需的环境变量(配置页可将变量写入 `.env.local`,并在 Linux/macOS 上额外支持写入 `~/.zshrc` 或 `~/.bashrc` 的托管区块)。
@@ -312,12 +312,12 @@ function getAccessDeniedMessage(operation, targetPath, language = 'en') {
312
312
  lines.push('');
313
313
  if (language === 'zh') {
314
314
  lines.push(`- 说明:\`*.tsk/\` 是封装差遣牒。通用文件工具无法读/写/列目录/删除其中内容(硬编码无条件拒绝)。`);
315
- lines.push(`- 提示:少量追加请使用 \`mind_more\`(默认 progress:\`mind_more({\"items\":[\"...\"]})\`);整章替换请使用 \`change_mind\`(顶层:\`change_mind({\"selector\":\"goals|constraints|progress\",\"content\":\"...\"})\`;额外章节:\`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\"})\`)。`);
315
+ lines.push(`- 提示:新增章节请使用 \`do_mind\`;少量追加请使用 \`mind_more\`(默认 progress:\`mind_more({\"items\":[\"...\"]})\`);改写已有整章请使用 \`change_mind\`(顶层:\`change_mind({\"selector\":\"goals|constraints|progress\",\"content\":\"...\"})\`;额外章节:\`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\"})\`)。`);
316
316
  lines.push(`- 提示:读取额外章节请使用函数工具 \`recall_taskdoc\`:\`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`。`);
317
317
  }
318
318
  else {
319
319
  lines.push(`- Note: \`*.tsk/\` is an encapsulated Taskdoc. It is hard-denied for all general file tools.`);
320
- lines.push(`- Hint: For small append-only updates, use \`mind_more\` (defaults to progress: \`mind_more({\"items\":[\"...\"]})\`); for full-section replacements, use \`change_mind\` (top-level: \`change_mind({\"selector\":\"goals|constraints|progress\",\"content\":\"...\"})\`; extra sections: \`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\"})\`).`);
320
+ lines.push(`- Hint: To create a section, use \`do_mind\`; for small append-only updates, use \`mind_more\` (defaults to progress: \`mind_more({\"items\":[\"...\"]})\`); for full-section replacements of existing sections, use \`change_mind\` (top-level: \`change_mind({\"selector\":\"goals|constraints|progress\",\"content\":\"...\"})\`; extra sections: \`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\"})\`).`);
321
321
  lines.push(`- Hint: To read extra sections, use \`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`.`);
322
322
  }
323
323
  }
@@ -6,7 +6,7 @@
6
6
  * dominds webui [options]
7
7
  *
8
8
  * Options:
9
- * -p, --port <port> Port to listen on (default: 5666)
9
+ * -p, --port <port> Port to listen on. Bare port is strict; suffix + tries higher ports; suffix - tries lower ports.
10
10
  * -h, --host <host> Host to bind to (default: localhost)
11
11
  * --nobrowser Do not open a browser (opt-out)
12
12
  * -h, --help Show help
package/dist/cli/webui.js CHANGED
@@ -7,7 +7,7 @@
7
7
  * dominds webui [options]
8
8
  *
9
9
  * Options:
10
- * -p, --port <port> Port to listen on (default: 5666)
10
+ * -p, --port <port> Port to listen on. Bare port is strict; suffix + tries higher ports; suffix - tries lower ports.
11
11
  * -h, --host <host> Host to bind to (default: localhost)
12
12
  * --nobrowser Do not open a browser (opt-out)
13
13
  * -h, --help Show help
@@ -19,6 +19,7 @@ const log_1 = require("../log");
19
19
  const work_language_1 = require("../runtime/work-language");
20
20
  const server_1 = require("../server");
21
21
  const auth_1 = require("../server/auth");
22
+ const port_selection_1 = require("../server/port-selection");
22
23
  const log = (0, log_1.createLogger)('webui');
23
24
  function printHelp() {
24
25
  console.log(`
@@ -31,15 +32,18 @@ Note:
31
32
  rtws (runtime workspace) directory is \`process.cwd()\`. Use 'dominds -C <dir> webui' to run in another rtws.
32
33
 
33
34
  Options:
34
- -p, --port <port> Port to listen on (default: 5666)
35
+ -p, --port <port> Port to listen on. Bare port is strict; suffix + tries higher ports; suffix - tries lower ports.
36
+ Default without --port: auto from 5666 downward.
35
37
  -h, --host <host> Host to bind to (default: localhost)
36
38
  --mode <dev|prod> Server mode (default: prod; dev if NODE_ENV=dev)
37
39
  --nobrowser Do not open a browser (opt-out)
38
40
  --help Show this help message
39
41
 
40
42
  Examples:
41
- dominds webui # Start on default port 5666
42
- dominds webui -p 8888 # Start on port 8888
43
+ dominds webui # Start on 5666, or the next available lower port
44
+ dominds webui -p 8888 # Start strictly on port 8888
45
+ dominds webui -p 8888+ # Start on 8888, or the next available higher port
46
+ dominds webui -p 8888- # Start on 8888, or the next available lower port
43
47
  dominds webui --mode dev # Start in dev mode
44
48
  dominds webui --nobrowser # Start without opening a browser
45
49
  `);
@@ -60,22 +64,38 @@ function openInBrowser(url) {
60
64
  }
61
65
  async function main() {
62
66
  const args = process.argv.slice(2);
63
- let port = 5666;
67
+ let port;
64
68
  let host = 'localhost';
65
69
  let mode = process.env.NODE_ENV === 'dev' ? 'dev' : 'prod';
66
70
  let shouldOpen = true;
71
+ let strictPort = false;
72
+ let portAutoDirection = 'down';
67
73
  for (let i = 0; i < args.length; i++) {
68
74
  const arg = args[i];
69
75
  if (arg === '-p' || arg === '--port') {
70
76
  const next = args[i + 1];
71
- if (!next || isNaN(parseInt(next))) {
72
- console.error('Error: --port requires a valid port number');
77
+ const parsedPort = next ? (0, port_selection_1.parseWebuiPortSpec)(next) : null;
78
+ if (parsedPort === null) {
79
+ console.error('Error: --port requires a valid port number, optionally suffixed with + or -');
73
80
  printHelp();
74
81
  process.exit(1);
75
82
  }
76
- port = parseInt(next);
83
+ port = parsedPort.port;
84
+ strictPort = parsedPort.strictPort;
85
+ portAutoDirection = parsedPort.portAutoDirection;
77
86
  i++;
78
87
  }
88
+ else if (arg.startsWith('--port=')) {
89
+ const parsedPort = (0, port_selection_1.parseWebuiPortSpec)(arg.slice('--port='.length));
90
+ if (parsedPort === null) {
91
+ console.error('Error: --port requires a valid port number, optionally suffixed with + or -');
92
+ printHelp();
93
+ process.exit(1);
94
+ }
95
+ port = parsedPort.port;
96
+ strictPort = parsedPort.strictPort;
97
+ portAutoDirection = parsedPort.portAutoDirection;
98
+ }
79
99
  else if (arg === '-h' || arg === '--host') {
80
100
  const next = args[i + 1];
81
101
  if (!next) {
@@ -114,7 +134,7 @@ async function main() {
114
134
  const { language: resolvedLanguage, source } = (0, work_language_1.resolveWorkLanguage)({ env: process.env });
115
135
  (0, work_language_1.setWorkLanguage)(resolvedLanguage);
116
136
  log.info(`working language: ${(0, work_language_1.getWorkLanguage)()} (source: ${source})`);
117
- const started = await (0, server_1.startServer)({ port, host, mode });
137
+ const started = await (0, server_1.startServer)({ port, host, mode, strictPort, portAutoDirection });
118
138
  const httpServer = started.httpServer;
119
139
  const auth = started.auth;
120
140
  const baseUrl = `http://${started.host}:${started.port}`;
@@ -4,6 +4,7 @@
4
4
  * Factory for creating Dialog instances with proper type hierarchy.
5
5
  * Provides a single point of dialog creation to ensure consistent initialization.
6
6
  */
7
+ import type { CallSiteCourseNo, CallSiteGenseqNo } from '@longrun-ai/kernel/types/storage';
7
8
  import { Dialog, DialogID, DialogInitParams, DialogStore, MainDialog, SideDialog } from './dialog';
8
9
  /**
9
10
  * Factory for creating Dialog instances.
@@ -22,6 +23,8 @@ export declare class DialogFactory {
22
23
  originMemberId: string;
23
24
  askerDialogId: string;
24
25
  callId: string;
26
+ callSiteCourse: CallSiteCourseNo;
27
+ callSiteGenseq: CallSiteGenseqNo;
25
28
  sessionSlug?: string;
26
29
  collectiveTargets?: string[];
27
30
  effectiveFbrEffort?: number;
@@ -1,12 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DialogFactory = void 0;
4
- /**
5
- * Module: dialog-factory
6
- *
7
- * Factory for creating Dialog instances with proper type hierarchy.
8
- * Provides a single point of dialog creation to ensure consistent initialization.
9
- */
10
4
  const dialog_1 = require("./dialog");
11
5
  const dialog_global_registry_1 = require("./dialog-global-registry");
12
6
  const id_1 = require("./utils/id");
@@ -45,6 +39,8 @@ class DialogFactory {
45
39
  originMemberId: options.originMemberId,
46
40
  askerDialogId: options.askerDialogId,
47
41
  callId: options.callId,
42
+ callSiteCourse: options.callSiteCourse,
43
+ callSiteGenseq: options.callSiteGenseq,
48
44
  collectiveTargets: options.collectiveTargets,
49
45
  effectiveFbrEffort: options.effectiveFbrEffort,
50
46
  },
@@ -140,7 +140,8 @@ function isPersistedMessageRecord(record) {
140
140
  case 'user_image_ingest_record':
141
141
  case 'sideDialog_request_record':
142
142
  case 'tellask_reply_resolution_record':
143
- case 'tellask_call_anchor_record':
143
+ case 'tellask_anchor_record':
144
+ case 'tellask_callee_record':
144
145
  case 'gen_start_record':
145
146
  case 'gen_finish_record':
146
147
  case 'sideDialog_created_record':
@@ -212,7 +213,8 @@ function rewriteRecordForFork(record, newRootId) {
212
213
  case 'native_tool_call_record':
213
214
  case 'sideDialog_request_record':
214
215
  case 'tellask_reply_resolution_record':
215
- case 'tellask_call_anchor_record':
216
+ case 'tellask_anchor_record':
217
+ case 'tellask_callee_record':
216
218
  case 'gen_start_record':
217
219
  case 'gen_finish_record':
218
220
  return record;
package/dist/dialog.d.ts CHANGED
@@ -122,6 +122,8 @@ export interface AssignmentFromAsker {
122
122
  originMemberId: string;
123
123
  askerDialogId: string;
124
124
  callId: string;
125
+ callSiteCourse: CallSiteCourseNo;
126
+ callSiteGenseq: CallSiteGenseqNo;
125
127
  collectiveTargets?: string[];
126
128
  effectiveFbrEffort?: number;
127
129
  }
@@ -253,8 +255,11 @@ export declare abstract class Dialog {
253
255
  originMemberId: string;
254
256
  askerDialogId: string;
255
257
  callId: string;
258
+ callSiteCourse: CallSiteCourseNo;
259
+ callSiteGenseq: CallSiteGenseqNo;
256
260
  sessionSlug?: string;
257
261
  collectiveTargets?: string[];
262
+ effectiveFbrEffort?: number;
258
263
  }): Promise<SideDialog>;
259
264
  /**
260
265
  * Post a dialog event using the standard event registry.
@@ -468,6 +473,8 @@ export declare class SideDialog extends Dialog {
468
473
  originMemberId: string;
469
474
  askerDialogId: string;
470
475
  callId: string;
476
+ callSiteCourse: CallSiteCourseNo;
477
+ callSiteGenseq: CallSiteGenseqNo;
471
478
  sessionSlug?: string;
472
479
  collectiveTargets?: string[];
473
480
  effectiveFbrEffort?: number;
@@ -528,6 +535,8 @@ export declare class MainDialog extends Dialog {
528
535
  originMemberId: string;
529
536
  askerDialogId: string;
530
537
  callId: string;
538
+ callSiteCourse: CallSiteCourseNo;
539
+ callSiteGenseq: CallSiteGenseqNo;
531
540
  sessionSlug?: string;
532
541
  collectiveTargets?: string[];
533
542
  effectiveFbrEffort?: number;
@@ -561,6 +570,8 @@ export declare abstract class DialogStore {
561
570
  originMemberId: string;
562
571
  askerDialogId: string;
563
572
  callId: string;
573
+ callSiteCourse: CallSiteCourseNo;
574
+ callSiteGenseq: CallSiteGenseqNo;
564
575
  sessionSlug?: string;
565
576
  collectiveTargets?: string[];
566
577
  effectiveFbrEffort?: number;
package/dist/dialog.js CHANGED
@@ -126,6 +126,8 @@ function buildSideDialogAssignmentPromptMeta(sideDialog) {
126
126
  ownerDialogId: assignment.askerDialogId,
127
127
  callType: 'B',
128
128
  callId: assignment.callId,
129
+ callSiteCourse: assignment.callSiteCourse,
130
+ callSiteGenseq: assignment.callSiteGenseq,
129
131
  },
130
132
  };
131
133
  case 'tellaskSessionless':
@@ -141,6 +143,8 @@ function buildSideDialogAssignmentPromptMeta(sideDialog) {
141
143
  ownerDialogId: assignment.askerDialogId,
142
144
  callType: 'C',
143
145
  callId: assignment.callId,
146
+ callSiteCourse: assignment.callSiteCourse,
147
+ callSiteGenseq: assignment.callSiteGenseq,
144
148
  },
145
149
  };
146
150
  }
@@ -1791,6 +1795,8 @@ class DialogStore {
1791
1795
  originMemberId: options.originMemberId,
1792
1796
  askerDialogId: options.askerDialogId,
1793
1797
  callId: options.callId,
1798
+ callSiteCourse: options.callSiteCourse,
1799
+ callSiteGenseq: options.callSiteGenseq,
1794
1800
  collectiveTargets: options.collectiveTargets,
1795
1801
  effectiveFbrEffort: options.effectiveFbrEffort,
1796
1802
  };
@@ -81,7 +81,7 @@ Start the web-based user interface for the current rtws. This provides a graphic
81
81
 
82
82
  **Options:**
83
83
 
84
- - `-p, --port <port>` - Port to listen on (default: 5666)
84
+ - `-p, --port <port>` - Port to listen on; a bare port binds strictly, suffix `+` tries higher ports, and suffix `-` tries lower ports (omitting `--port` is equivalent to `5666-`)
85
85
  - `-h, --host <host>` - Host to bind to (default: localhost)
86
86
  - `-C, --cwd <dir>` - Change to rtws directory before starting
87
87
  - `--help` - Show help message
@@ -91,6 +91,7 @@ Start the web-based user interface for the current rtws. This provides a graphic
91
91
  ```bash
92
92
  dominds
93
93
  dominds webui -p 8080
94
+ dominds webui -p 8080+
94
95
  dominds webui -C ./my-rtws
95
96
  ```
96
97
 
@@ -81,7 +81,7 @@ dominds webui [options]
81
81
 
82
82
  **选项:**
83
83
 
84
- - `-p, --port <port>` - 监听的端口(默认:5666
84
+ - `-p, --port <port>` - 监听端口;裸端口严格绑定,后缀 `+` 向更大端口自动尝试,后缀 `-` 向更小端口自动尝试(未指定时等价于 `5666-`)
85
85
  - `-h, --host <host>` - 绑定的主机(默认:localhost)
86
86
  - `-C, --cwd <dir>` - 启动前更改 rtws 目录
87
87
  - `--help` - 显示帮助消息
@@ -89,12 +89,15 @@ dominds webui [options]
89
89
  **示例:**
90
90
 
91
91
  ```bash
92
- # 在默认端口启动 Web UI
92
+ # 5666 开始,向更小端口尝试可用端口
93
93
  dominds
94
94
 
95
- # 在特定端口启动 Web UI
95
+ # 严格绑定 8080;占用时启动失败
96
96
  dominds webui -p 8080
97
97
 
98
+ # 从 8080 开始,向更大端口尝试可用端口
99
+ dominds webui -p 8080+
100
+
98
101
  # 在特定 rtws 启动 Web UI
99
102
  dominds webui -C ./my-rtws
100
103
  ```
@@ -169,7 +169,7 @@ Current behavior:
169
169
  generations; configurable per model).
170
170
  - Each inserted prompt is split by the program according to dialog scope, so the agent does not decide
171
171
  whether it is in the Main Dialog or a Side Dialog:
172
- - Main Dialog: update Taskdoc first with `mind_more` / `change_mind`, then curate reminders (at least one call)
172
+ - Main Dialog: create or update Taskdoc first with `do_mind` / `change_mind`, then curate reminders (at least one call)
173
173
  - Side Dialog: do not maintain Taskdoc and do not draft Taskdoc update proposals; directly curate sufficiently detailed reminders (at least one call)
174
174
  - `update_reminder` (preferred) / `add_reminder`
175
175
  - Default to one structured continuation-package reminder; if the current course is already under remediation and one structured reminder cannot be produced directly from already observed facts, rough multi-reminder carry-over is acceptable
@@ -182,7 +182,7 @@ When `level === 'critical'`, the driver enters a **countdown remediation** (max
182
182
  - On each turn, the driver records a **role=user prompt** (persisted as a user message) that is
183
183
  visible in the UI as a user prompt. The prompt is scope-specific:
184
184
  - Main Dialog prompt: first write undocumented discussion details that the next course needs to know
185
- into the appropriate Taskdoc sections with `mind_more` / `change_mind`, then curate reminders via
185
+ into the appropriate Taskdoc sections with `do_mind` / `change_mind`, then curate reminders via
186
186
  `update_reminder` / `add_reminder`, and call `clear_mind`.
187
187
  - Side Dialog prompt: do not maintain Taskdoc and do not draft Taskdoc update proposals; directly
188
188
  maintain sufficiently detailed continuation-package reminders with no technical length limit, then
@@ -130,7 +130,7 @@ Dominds 计算比率:
130
130
  - 进入 `caution` 时,Dominds 插入一次提示(入口注入)。
131
131
  - 保持在 `caution` 状态时,Dominds 按节奏重新插入(默认:每 **10** 次生成;可按模型配置)。
132
132
  - 每次插入的提示都由程序按范围分流,不要求智能体自己判断主线/支线:
133
- - 主线对话:先使用 `mind_more` / `change_mind` 补齐差遣牒,再整理提醒项(至少一次调用)
133
+ - 主线对话:先使用 `do_mind` / `change_mind` 补齐差遣牒,再整理提醒项(至少一次调用)
134
134
  - 支线对话:不维护差遣牒,也不整理差遣牒更新提案;直接整理足够详尽的提醒项(至少一次调用)
135
135
  - `update_reminder`(首选)/ `add_reminder`
136
136
  - 在提醒项内维护接续包草稿
@@ -141,7 +141,7 @@ Dominds 计算比率:
141
141
  当 `level === 'critical'` 时,驱动程序进入**倒计时恢复**(最多 **5** 轮):
142
142
 
143
143
  - 每轮,驱动程序记录一条 **role=user prompt**(持久化为用户消息),在 UI 中作为用户 prompt 可见。提示按范围分开:
144
- - 主线对话提示:先用 `mind_more` / `change_mind` 把未落文档、且下一程需要知会的讨论细节写入差遣牒合适章节,再通过 `update_reminder` / `add_reminder` 整理提醒项并调用 `clear_mind`。
144
+ - 主线对话提示:先用 `do_mind` / `change_mind` 把未落文档、且下一程需要知会的讨论细节写入差遣牒合适章节,再通过 `update_reminder` / `add_reminder` 整理提醒项并调用 `clear_mind`。
145
145
  - 支线对话提示:不要维护差遣牒,也不要整理差遣牒更新提案;直接维护足够详尽的接续包提醒项,提醒项长度没有技术限制,然后调用 `clear_mind`。
146
146
  - 提示包含倒计时:经过 **N** 轮后系统将自动清空。
147
147
  - 当倒计时归零时,驱动程序**自动调用** `clear_mind`(带空参数;不要求 `reminder_content`),开始新一程且无需暂停。
@@ -412,7 +412,7 @@ For detailed implementation specifications, including core tools, technical arch
412
412
  **Key Implementation Components**:
413
413
 
414
414
  - **`clear_mind`**: Function tool for clearing conversational noise and starting a new course
415
- - **`change_mind`**: Function tool for updating authoritative Taskdocs across dialog hierarchies (no course reset)
415
+ - **Taskdoc mutation tools**: `do_mind`, `mind_more`, `change_mind`, and `never_mind` update authoritative Taskdocs across dialog hierarchies (no course reset)
416
416
  - **Reminder Management**: Dialog-scoped working memory that persists across clarity operations
417
417
  - **Hierarchical Dialog Architecture**: Tree-structured dialogs with flat storage and autonomous management
418
418
  - **Memory Layers**: Dialog-scoped and rtws-persistent memory with autonomous evolution
@@ -549,9 +549,9 @@ dominds dialog start --taskdoc-path tasks/auth-system.tsk
549
549
  **Development Phase**:
550
550
 
551
551
  - Multiple dialog trees can reference the same Taskdoc
552
- - Team members collaborate by updating the same Taskdoc (via `change_mind` operations)
552
+ - Team members collaborate by updating the same Taskdoc (via explicit Taskdoc mutation tools)
553
553
  - Progress tracking persists across conversations
554
- - Requirements evolve through `change_mind` operations
554
+ - Requirements evolve through Taskdoc mutation operations
555
555
  - rtws hard rules:
556
556
  - `*.tsk/**` is encapsulated Taskdoc state and is hard-denied for all general file tools.
557
557
  - `.minds/**` is reserved rtws state (team config/memory/assets) and is hard-denied for all general file tools; manage it via dedicated tools like `team_mgmt`.
@@ -412,7 +412,7 @@ Dominds 为 AI 智能体实现了**社会分工**——一种通过战略性心
412
412
  **关键实现组件:**
413
413
 
414
414
  - **`clear_mind`**:开启新一程对话的函数工具(用于清除对话噪音)
415
- - **`change_mind`**:用于跨对话层次结构更新权威差遣牒的函数工具(不会开启新一程对话)
415
+ - **差遣牒变更工具**:`do_mind`、`mind_more`、`change_mind` 和 `never_mind` 用于跨对话层次结构更新权威差遣牒(不会开启新一程对话)
416
416
  - **提醒项管理**:跨清理操作持续存在的对话范围工作记忆
417
417
  - **层次对话架构**:具有扁平存储和自主管理的树结构对话
418
418
  - **记忆层**:具有自主演进的对话范围和 rtws 持久化记忆
@@ -547,9 +547,9 @@ dominds dialog start --taskdoc-path tasks/auth-system.tsk
547
547
  **开发阶段:**
548
548
 
549
549
  - 多个对话树可以引用相同的差遣牒
550
- - 团队成员通过 `change_mind` 操作更新相同的差遣牒进行协作
550
+ - 团队成员通过显式差遣牒变更工具更新相同的差遣牒进行协作
551
551
  - 进度跟踪跨越对话持续存在
552
- - 要求通过 `change_mind` 操作演变
552
+ - 要求通过差遣牒变更操作演变
553
553
  - rtws 硬性规则:
554
554
  - `*.tsk/**` 是封装的差遣牒状态,所有通用文件工具都硬性拒绝。
555
555
  - `.minds/**` 是保留的 rtws 状态(团队配置/内存/资产),所有通用文件工具都硬性拒绝;通过 `team_mgmt` 等专用工具进行管理。
@@ -813,24 +813,32 @@ Invoke the function tool `clear_mind` with:
813
813
  - Taskdoc remains unchanged and accessible
814
814
  - Reminders provide continuity across the clarity operation
815
815
 
816
- ### `change_mind`
816
+ ### Taskdoc Mutation Tools
817
817
 
818
- **Purpose**: Update the shared Taskdoc content that all dialogs in the dialog tree reference (without starting a new dialog course). Treat the Taskdoc as the task’s **live coordination bulletin board**.
818
+ **Purpose**: Mutate the shared Taskdoc content that all dialogs in the dialog tree reference (without starting a new dialog course). Treat the Taskdoc as the task’s **live coordination bulletin board**.
819
819
 
820
- **Function tool arguments**:
820
+ **Tools**:
821
+
822
+ - `do_mind`: create one new section; fails if the target already exists.
823
+ - `mind_more`: append small entries to an existing section; defaults to `progress`.
824
+ - `change_mind`: replace one existing section; fails if the target does not exist.
825
+ - `never_mind`: delete one existing section.
821
826
 
822
- - `selector: "goals" | "constraints" | "progress"`
823
- - `content: string`
827
+ **Common section arguments**:
828
+
829
+ - `selector: "goals" | "constraints" | "progress"` for top-level sections; or a valid selector with `category`
830
+ - `category?: string`
831
+ - `content: string` for `do_mind` / `change_mind`
824
832
 
825
833
  Example:
826
834
 
827
835
  ```text
828
- Invoke the function tool `change_mind` with:
836
+ Invoke `do_mind` to create a missing section, or `change_mind` to replace an existing section.
829
837
  ```
830
838
 
831
839
  **Behavior**:
832
840
 
833
- - Updates the rtws (runtime workspace) Taskdoc content (exactly one section file in a `*.tsk/` Taskdoc package)
841
+ - Updates the rtws (runtime workspace) Taskdoc content (exactly one section file per call in a `*.tsk/` Taskdoc package)
834
842
  - **Does not change the Taskdoc path.** `dlg.taskDocPath` is immutable for the dialog's entire lifecycle.
835
843
  - The updated file immediately becomes available to all dialogs referencing it
836
844
  - **Does not start a new dialog course.** If starting a new dialog course is desired, use `clear_mind` separately.
@@ -840,7 +848,7 @@ Invoke the function tool `change_mind` with:
840
848
 
841
849
  **Implementation Notes**:
842
850
 
843
- - `change_mind` is only available in main dialogs (not sideDialogs); sideDialogs must ask the tellasker via a TellaskBack (`tellaskBack({ tellaskContent: "..." })`) to update the shared Taskdoc.
851
+ - Taskdoc mutation tools are only available in main dialogs (not sideDialogs); sideDialogs must ask the Taskdoc maintainer to update the shared Taskdoc and provide the new section, append entries, merged replacement draft, or section deletion request.
844
852
  - For `*.tsk/` Taskdoc packages, the Taskdoc is encapsulated: general file tools must not read/write/list/delete anything under `*.tsk/`. See [`encapsulated-taskdoc.md`](./encapsulated-taskdoc.md).
845
853
 
846
854
  ---
@@ -855,7 +863,7 @@ Invoke the function tool `change_mind` with:
855
863
 
856
864
  - Scoped to individual dialogs
857
865
  - **Survive clear_mind operations**
858
- - **Survive change_mind operations**
866
+ - **Survive Taskdoc mutation operations**
859
867
  - Provide guidance for refreshed mental focus
860
868
  - Support structured capture of insights, decisions, and next steps
861
869
 
@@ -1297,6 +1305,21 @@ sequenceDiagram
1297
1305
  end
1298
1306
  ```
1299
1307
 
1308
+ Call-site correspondence invariant: every `tellask` call-site `callId` must later have a
1309
+ same-`callId` historical correspondence point in the tellasker's dialog. A normal sideDialog reply,
1310
+ cross-course carryover, or registered-session replacement notice can close the call; silently removing
1311
+ or overwriting a pending round cannot.
1312
+
1313
+ WebUI external-link invariant: every `/dl/*` URL must be generated at the business call site with the
1314
+ target semantics written out there; avoid generic deep-link helpers. `/dl/callsite` only means the
1315
+ originating bubble in the tellasker's dialog: `selfId/course` are tellasker-dialog coordinates, and
1316
+ `callId` is that dialog's function-call id. SideDialog assignment/update targets are not call sites;
1317
+ they use `/dl/dialog` for the sideDialog, or `/dl/genseq` once the delivered assignment `genseq` is
1318
+ known.
1319
+ When an existing registered sideDialog is reused, the WebUI first links the new call-site bubble to
1320
+ the sideDialog via `tellask_call_callee_evt`; the later `tellask_call_anchor_evt` upgrades that target
1321
+ to the delivered sideDialog `genseq`.
1322
+
1300
1323
  #### TYPE C: Transient SideDialog Tellask (`Fresh Tellask`) (`tellaskSessionless({ targetAgentId: "agentId", tellaskContent: "..." })`; `freshBootsReasoning({ tellaskContent: "..." })` is FBR tool-less)
1301
1324
 
1302
1325
  ```mermaid
@@ -1437,7 +1460,7 @@ sequenceDiagram
1437
1460
  | Reminders | Preserved |
1438
1461
  | Registry | Preserved |
1439
1462
 
1440
- `change_mind` is not a clarity operation; it updates Taskdoc content in-place and does not clear messages/Q4H/reminders/registry.
1463
+ Taskdoc mutation tools are not clarity operations; they update Taskdoc content in-place and do not clear messages/Q4H/reminders/registry.
1441
1464
 
1442
1465
  ---
1443
1466
 
@@ -790,24 +790,32 @@ async function checkSideDialogRevival(askerDialog: Dialog): Promise<void> {
790
790
  - 差遣牒保持不变且可访问
791
791
  - 提醒在清晰操作中提供连续性
792
792
 
793
- ### `change_mind`
793
+ ### 差遣牒变更工具
794
794
 
795
- **目的**:更新对话树中所有对话引用的共享差遣牒内容(不开启新一程对话)。把差遣牒当作任务的**实时协调公告板**。
795
+ **目的**:变更对话树中所有对话引用的共享差遣牒内容(不开启新一程对话)。把差遣牒当作任务的**实时协调公告板**。
796
796
 
797
- **函数工具参数**:
797
+ **工具**:
798
+
799
+ - `do_mind`:创建一个新章节;若目标已存在则失败。
800
+ - `mind_more`:向已有章节追加少量条目;默认追加到 `progress`。
801
+ - `change_mind`:替换一个已有章节;若目标不存在则失败。
802
+ - `never_mind`:删除一个已有章节。
803
+
804
+ **通用章节参数**:
798
805
 
799
- - `selector: "goals" | "constraints" | "progress"`
800
- - `content: string`
806
+ - 顶层章节使用 `selector: "goals" | "constraints" | "progress"`;额外章节使用有效 `selector` 加 `category`
807
+ - `category?: string`
808
+ - `do_mind` / `change_mind` 使用 `content: string`
801
809
 
802
810
  示例:
803
811
 
804
812
  ```text
805
- 调用函数工具 `change_mind`:
813
+ 调用 `do_mind` 创建缺失章节,或调用 `change_mind` 替换已有章节。
806
814
  ```
807
815
 
808
816
  **行为**:
809
817
 
810
- - 更新 rtws(运行时工作区)差遣牒内容(`*.tsk/` 任务包中恰好一个章节文件)
818
+ - 更新 rtws(运行时工作区)差遣牒内容(每次调用变更 `*.tsk/` 任务包中恰好一个章节文件)
811
819
  - **不更改差遣牒路径。** `dlg.taskDocPath` 在对话的整个生命周期中是不可变的。
812
820
  - 更新的文件立即对引用它的所有对话可用
813
821
  - **不开启新一程对话。** 如需开启新一程对话,请单独使用 `clear_mind`。
@@ -817,7 +825,7 @@ async function checkSideDialogRevival(askerDialog: Dialog): Promise<void> {
817
825
 
818
826
  **实现说明**:
819
827
 
820
- - `change_mind` 仅在主线对话中可用(不在支线对话中);支线对话必须通过回问诉请(`tellaskBack({ tellaskContent: "..." })`)询问诉请者以更新共享差遣牒。
828
+ - 差遣牒变更工具仅在主线对话中可用(不在支线对话中);支线对话必须诉请差遣牒维护人更新共享差遣牒,并提供要新增的章节、要追加的条目、已合并好的替换稿或要删除的章节。
821
829
  - 对于 `*.tsk/` 差遣牒任务包,差遣牒是封装的:通用文件工具不得读取/写入/列出/删除 `*.tsk/` 下的任何内容。请参阅 [`encapsulated-taskdoc.zh.md`](./encapsulated-taskdoc.zh.md)。
822
830
 
823
831
  ---
@@ -832,7 +840,7 @@ async function checkSideDialogRevival(askerDialog: Dialog): Promise<void> {
832
840
 
833
841
  - 作用域为单个对话
834
842
  - **在 clear_mind 操作中存活**
835
- - **在 change_mind 操作中存活**
843
+ - **在差遣牒变更操作中存活**
836
844
  - 为刷新后的精神焦点提供指导
837
845
  - 支持结构化捕获见解、决策和下一步
838
846
 
@@ -1279,6 +1287,17 @@ sequenceDiagram
1279
1287
  end
1280
1288
  ```
1281
1289
 
1290
+ call-site 呼应不变量:每个 `tellask` 发起点的 `callId`,后续都必须在诉请者对话历史里留下同
1291
+ `callId` 的呼应点。正常支线回复、跨程 carryover、已注册会话被更新后的替代通知都可以结束这次
1292
+ call;不能静默删除或覆盖 pending 轮次。
1293
+
1294
+ WebUI 外链不变量:生成 `/dl/*` URL 时必须在业务现场显式写出目标语义,避免复用泛化 deep-link
1295
+ helper。`/dl/callsite` 只表示诉请者对话里的发起气泡:`selfId/course` 是诉请者对话坐标,`callId`
1296
+ 是该对话内的 function-call id。支线投递/更新目标不是 call-site,应使用 `/dl/dialog` 指向支线对话,
1297
+ 或在投递 `genseq` 已知后使用 `/dl/genseq` 指向支线对话内的投递生成。
1298
+ 复用已有注册支线时,WebUI 先用 `tellask_call_callee_evt` 把新发起气泡连到支线对话;后续
1299
+ `tellask_call_anchor_evt` 到达后再升级为支线投递 `genseq`。
1300
+
1282
1301
  #### TYPE C:瞬态支线对话诉请(一次性诉请)(`tellaskSessionless({ targetAgentId: "agentId", tellaskContent: "..." })`,或 `freshBootsReasoning({ tellaskContent: "..." })`)
1283
1302
 
1284
1303
  ```mermaid
@@ -1432,7 +1451,7 @@ sequenceDiagram
1432
1451
  | 提醒项 | 保留 |
1433
1452
  | 注册表 | 保留 |
1434
1453
 
1435
- `change_mind` 不是清晰度操作;它就地更新差遣牒内容,不会清除消息/Q4H/提醒项/注册表。
1454
+ 差遣牒变更工具不是清晰度操作;它们就地更新差遣牒内容,不会清除消息/Q4H/提醒项/注册表。
1436
1455
 
1437
1456
  ---
1438
1457
 
@@ -248,16 +248,16 @@ Example / 示例(概念):
248
248
  - EN: **Taskdoc package** (ZH: **任务包**) is the on-disk directory ending in `.tsk/` that contains those three section files.
249
249
  - ZH: **任务包(Taskdoc package)**是落地到磁盘上的目录形态:以 `.tsk/` 结尾的目录,包含上述三个分段文件。
250
250
 
251
- - EN: Taskdocs are the "single source of truth" for team-shared task contracts. They MUST be edited via the explicit control tool `change_mind`; generic file tools are **banned** from reading/writing anything under `**/*.tsk/`.
252
- - ZH: 差遣牒是全队共享任务契约的"单一事实来源"。必须通过显式控制工具 `change_mind` 进行修改;通用文件工具**禁止**读/写 `**/*.tsk/` 下的任何内容。
251
+ - EN: Taskdocs are the "single source of truth" for team-shared task contracts. They MUST be edited via explicit Taskdoc control tools (`do_mind`, `mind_more`, `change_mind`, `never_mind`); generic file tools are **banned** from reading/writing anything under `**/*.tsk/`.
252
+ - ZH: 差遣牒是全队共享任务契约的"单一事实来源"。必须通过显式差遣牒控制工具(`do_mind`、`mind_more`、`change_mind`、`never_mind`)进行修改;通用文件工具**禁止**读/写 `**/*.tsk/` 下的任何内容。
253
253
 
254
254
  - EN: Practically: treat the Taskdoc as the task’s **live coordination bulletin board**. If a decision/status/next-step affects others, write it back to `progress` (or `constraints`) — don’t leave it only in chat or reminders.
255
255
  - ZH: 实践上:把差遣牒当作任务的**实时协调公告板**。任何会影响他人的关键决策/当前状态/下一步,都要写回 `progress`(或 `constraints`),不要只留在对话或提醒项里。
256
256
 
257
257
  #### Section selector / 分段选择器
258
258
 
259
- - EN: The selector passed to `change_mind`: `goals` / `constraints` / `progress`.
260
- - ZH: `change_mind` 的分段选择器:`goals` / `constraints` / `progress`。
259
+ - EN: The selector passed to Taskdoc mutation tools: `goals` / `constraints` / `progress`.
260
+ - ZH: 差遣牒变更工具的分段选择器:`goals` / `constraints` / `progress`。
261
261
 
262
262
  ### rtws(运行时工作区)
263
263