dominds 1.20.2 → 1.20.3

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 (127) hide show
  1. package/dist/docs/OEC-philosophy.md +1 -1
  2. package/dist/minds/load.js +1 -0
  3. package/dist/minds/minds-i18n.js +2 -2
  4. package/dist/minds/system-prompt-parts.js +7 -7
  5. package/dist/server/api-routes.js +65 -0
  6. package/dist/server/static-server.js +1 -0
  7. package/dist/tools/builtins.js +2 -0
  8. package/dist/tools/ctrl.d.ts +2 -0
  9. package/dist/tools/ctrl.js +111 -16
  10. package/dist/tools/prompts/control/en/errors.md +2 -2
  11. package/dist/tools/prompts/control/en/index.md +1 -1
  12. package/dist/tools/prompts/control/en/principles.md +5 -4
  13. package/dist/tools/prompts/control/en/tools.md +19 -3
  14. package/dist/tools/prompts/control/zh/errors.md +2 -2
  15. package/dist/tools/prompts/control/zh/index.md +1 -1
  16. package/dist/tools/prompts/control/zh/principles.md +5 -4
  17. package/dist/tools/prompts/control/zh/tools.md +19 -3
  18. package/dist/tools/prompts/personal_memory/en/principles.md +1 -1
  19. package/dist/tools/prompts/personal_memory/zh/principles.md +1 -1
  20. package/dist/tools/prompts/team_memory/en/principles.md +1 -1
  21. package/dist/tools/prompts/team_memory/zh/principles.md +1 -1
  22. package/dist/tools/team_mgmt.js +2 -2
  23. package/dist/utils/task-package.d.ts +9 -0
  24. package/dist/utils/task-package.js +29 -4
  25. package/dist/utils/taskdoc-search-worker-client.d.ts +12 -0
  26. package/dist/utils/taskdoc-search-worker-client.js +320 -0
  27. package/dist/utils/taskdoc-search-worker.d.ts +1 -0
  28. package/dist/utils/taskdoc-search-worker.js +42 -0
  29. package/dist/utils/taskdoc-search.d.ts +28 -7
  30. package/dist/utils/taskdoc-search.js +62 -15
  31. package/package.json +4 -4
  32. package/webapp/dist/assets/{_basePickBy-B7M9Q0Fa.js → _basePickBy-B2wYdQcR.js} +3 -3
  33. package/webapp/dist/assets/{_basePickBy-B7M9Q0Fa.js.map → _basePickBy-B2wYdQcR.js.map} +1 -1
  34. package/webapp/dist/assets/{_baseUniq-DAeYoL6j.js → _baseUniq-zKoHgk38.js} +2 -2
  35. package/webapp/dist/assets/{_baseUniq-DAeYoL6j.js.map → _baseUniq-zKoHgk38.js.map} +1 -1
  36. package/webapp/dist/assets/{arc-Bh4nDbNR.js → arc-D8bQ-Nzm.js} +2 -2
  37. package/webapp/dist/assets/{arc-Bh4nDbNR.js.map → arc-D8bQ-Nzm.js.map} +1 -1
  38. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CxqmdsIm.js → architectureDiagram-2XIMDMQ5-BiimGQW5.js} +7 -7
  39. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CxqmdsIm.js.map → architectureDiagram-2XIMDMQ5-BiimGQW5.js.map} +1 -1
  40. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-CxIWLtpt.js → blockDiagram-WCTKOSBZ-BXPbS_wx.js} +7 -7
  41. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-CxIWLtpt.js.map → blockDiagram-WCTKOSBZ-BXPbS_wx.js.map} +1 -1
  42. package/webapp/dist/assets/{c4Diagram-IC4MRINW-1qErOIgG.js → c4Diagram-IC4MRINW-BZC0c1Ke.js} +3 -3
  43. package/webapp/dist/assets/{c4Diagram-IC4MRINW-1qErOIgG.js.map → c4Diagram-IC4MRINW-BZC0c1Ke.js.map} +1 -1
  44. package/webapp/dist/assets/{channel-DkgZHNUe.js → channel-BP3Qyxui.js} +2 -2
  45. package/webapp/dist/assets/{channel-DkgZHNUe.js.map → channel-BP3Qyxui.js.map} +1 -1
  46. package/webapp/dist/assets/{chunk-4BX2VUAB-BmdMbU9v.js → chunk-4BX2VUAB-BXABHFQC.js} +2 -2
  47. package/webapp/dist/assets/{chunk-4BX2VUAB-BmdMbU9v.js.map → chunk-4BX2VUAB-BXABHFQC.js.map} +1 -1
  48. package/webapp/dist/assets/{chunk-55IACEB6-D6LDTDBy.js → chunk-55IACEB6-KdM20zpJ.js} +2 -2
  49. package/webapp/dist/assets/{chunk-55IACEB6-D6LDTDBy.js.map → chunk-55IACEB6-KdM20zpJ.js.map} +1 -1
  50. package/webapp/dist/assets/{chunk-FMBD7UC4-C-BdCe4C.js → chunk-FMBD7UC4-B2T04oKB.js} +2 -2
  51. package/webapp/dist/assets/{chunk-FMBD7UC4-C-BdCe4C.js.map → chunk-FMBD7UC4-B2T04oKB.js.map} +1 -1
  52. package/webapp/dist/assets/{chunk-JSJVCQXG-WA_BLIm9.js → chunk-JSJVCQXG-Bz-hhsBJ.js} +2 -2
  53. package/webapp/dist/assets/{chunk-JSJVCQXG-WA_BLIm9.js.map → chunk-JSJVCQXG-Bz-hhsBJ.js.map} +1 -1
  54. package/webapp/dist/assets/{chunk-KX2RTZJC-CA7sDJO5.js → chunk-KX2RTZJC-B1TcA_CH.js} +2 -2
  55. package/webapp/dist/assets/{chunk-KX2RTZJC-CA7sDJO5.js.map → chunk-KX2RTZJC-B1TcA_CH.js.map} +1 -1
  56. package/webapp/dist/assets/{chunk-NQ4KR5QH-wlvxalE3.js → chunk-NQ4KR5QH-BwsfKfyl.js} +4 -4
  57. package/webapp/dist/assets/{chunk-NQ4KR5QH-wlvxalE3.js.map → chunk-NQ4KR5QH-BwsfKfyl.js.map} +1 -1
  58. package/webapp/dist/assets/{chunk-QZHKN3VN-Bo1VMcph.js → chunk-QZHKN3VN-BX453Nua.js} +2 -2
  59. package/webapp/dist/assets/{chunk-QZHKN3VN-Bo1VMcph.js.map → chunk-QZHKN3VN-BX453Nua.js.map} +1 -1
  60. package/webapp/dist/assets/{chunk-WL4C6EOR-B-Pk44be.js → chunk-WL4C6EOR-COCTYZ-S.js} +6 -6
  61. package/webapp/dist/assets/{chunk-WL4C6EOR-B-Pk44be.js.map → chunk-WL4C6EOR-COCTYZ-S.js.map} +1 -1
  62. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BqKuyb49.js → classDiagram-VBA2DB6C-aWgCJGiX.js} +7 -7
  63. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BqKuyb49.js.map → classDiagram-VBA2DB6C-aWgCJGiX.js.map} +1 -1
  64. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BqKuyb49.js → classDiagram-v2-RAHNMMFH-aWgCJGiX.js} +7 -7
  65. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BqKuyb49.js.map → classDiagram-v2-RAHNMMFH-aWgCJGiX.js.map} +1 -1
  66. package/webapp/dist/assets/{clone-BX5z8WVZ.js → clone-UCWLNsJ4.js} +2 -2
  67. package/webapp/dist/assets/{clone-BX5z8WVZ.js.map → clone-UCWLNsJ4.js.map} +1 -1
  68. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-B-s11SgN.js → cose-bilkent-S5V4N54A-Blf43_-z.js} +2 -2
  69. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-B-s11SgN.js.map → cose-bilkent-S5V4N54A-Blf43_-z.js.map} +1 -1
  70. package/webapp/dist/assets/{dagre-KLK3FWXG-DmQFV2qK.js → dagre-KLK3FWXG-BLTVAduG.js} +7 -7
  71. package/webapp/dist/assets/{dagre-KLK3FWXG-DmQFV2qK.js.map → dagre-KLK3FWXG-BLTVAduG.js.map} +1 -1
  72. package/webapp/dist/assets/{diagram-E7M64L7V-QRaBfST8.js → diagram-E7M64L7V-eHyGJiW2.js} +8 -8
  73. package/webapp/dist/assets/{diagram-E7M64L7V-QRaBfST8.js.map → diagram-E7M64L7V-eHyGJiW2.js.map} +1 -1
  74. package/webapp/dist/assets/{diagram-IFDJBPK2-lrWn1Obo.js → diagram-IFDJBPK2-BzZS2fFL.js} +7 -7
  75. package/webapp/dist/assets/{diagram-IFDJBPK2-lrWn1Obo.js.map → diagram-IFDJBPK2-BzZS2fFL.js.map} +1 -1
  76. package/webapp/dist/assets/{diagram-P4PSJMXO-sTU7Hh-Y.js → diagram-P4PSJMXO-CUUSxkwu.js} +7 -7
  77. package/webapp/dist/assets/{diagram-P4PSJMXO-sTU7Hh-Y.js.map → diagram-P4PSJMXO-CUUSxkwu.js.map} +1 -1
  78. package/webapp/dist/assets/{erDiagram-INFDFZHY-Cx6jc9Wq.js → erDiagram-INFDFZHY-DF_doi5_.js} +5 -5
  79. package/webapp/dist/assets/{erDiagram-INFDFZHY-Cx6jc9Wq.js.map → erDiagram-INFDFZHY-DF_doi5_.js.map} +1 -1
  80. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DfGI49Dz.js → flowDiagram-PKNHOUZH-YcqCG3mt.js} +7 -7
  81. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DfGI49Dz.js.map → flowDiagram-PKNHOUZH-YcqCG3mt.js.map} +1 -1
  82. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-nrcHWWaM.js → ganttDiagram-A5KZAMGK-BZNRb7SP.js} +3 -3
  83. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-nrcHWWaM.js.map → ganttDiagram-A5KZAMGK-BZNRb7SP.js.map} +1 -1
  84. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js → gitGraphDiagram-K3NZZRJ6-nAdujBg_.js} +8 -8
  85. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js.map → gitGraphDiagram-K3NZZRJ6-nAdujBg_.js.map} +1 -1
  86. package/webapp/dist/assets/{graph-R5G-y8tB.js → graph-Cv-ZJ4Fl.js} +3 -3
  87. package/webapp/dist/assets/{graph-R5G-y8tB.js.map → graph-Cv-ZJ4Fl.js.map} +1 -1
  88. package/webapp/dist/assets/{index--fy89xGh.js → index-Dhf_wAfo.js} +332 -134
  89. package/webapp/dist/assets/index-Dhf_wAfo.js.map +1 -0
  90. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-PIoZHr7s.js → infoDiagram-LFFYTUFH-CwtMOnIR.js} +6 -6
  91. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-PIoZHr7s.js.map → infoDiagram-LFFYTUFH-CwtMOnIR.js.map} +1 -1
  92. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-oCM-LYk1.js → ishikawaDiagram-PHBUUO56-Cfb8MPoG.js} +2 -2
  93. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-oCM-LYk1.js.map → ishikawaDiagram-PHBUUO56-Cfb8MPoG.js.map} +1 -1
  94. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-C2qidjQ5.js → journeyDiagram-4ABVD52K-u0xpmaEL.js} +5 -5
  95. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-C2qidjQ5.js.map → journeyDiagram-4ABVD52K-u0xpmaEL.js.map} +1 -1
  96. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Du0TC8WS.js → kanban-definition-K7BYSVSG-BuwDgdXi.js} +3 -3
  97. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Du0TC8WS.js.map → kanban-definition-K7BYSVSG-BuwDgdXi.js.map} +1 -1
  98. package/webapp/dist/assets/{layout-VmEo1OEB.js → layout-DwFR5fz7.js} +5 -5
  99. package/webapp/dist/assets/{layout-VmEo1OEB.js.map → layout-DwFR5fz7.js.map} +1 -1
  100. package/webapp/dist/assets/{linear-B662YHAc.js → linear-DK9kuyt6.js} +2 -2
  101. package/webapp/dist/assets/{linear-B662YHAc.js.map → linear-DK9kuyt6.js.map} +1 -1
  102. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-D7arZj95.js → mindmap-definition-YRQLILUH-BP26yHUE.js} +4 -4
  103. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-D7arZj95.js.map → mindmap-definition-YRQLILUH-BP26yHUE.js.map} +1 -1
  104. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DvjPP4PA.js → pieDiagram-SKSYHLDU-Dg05ljR9.js} +8 -8
  105. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DvjPP4PA.js.map → pieDiagram-SKSYHLDU-Dg05ljR9.js.map} +1 -1
  106. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-B_JUGMj_.js → quadrantDiagram-337W2JSQ-BZwWQDeQ.js} +3 -3
  107. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-B_JUGMj_.js.map → quadrantDiagram-337W2JSQ-BZwWQDeQ.js.map} +1 -1
  108. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DF0mpvE3.js → requirementDiagram-Z7DCOOCP-IZuN0Vt3.js} +4 -4
  109. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DF0mpvE3.js.map → requirementDiagram-Z7DCOOCP-IZuN0Vt3.js.map} +1 -1
  110. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CoXlxv00.js → sankeyDiagram-WA2Y5GQK-BsVp8N4k.js} +2 -2
  111. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CoXlxv00.js.map → sankeyDiagram-WA2Y5GQK-BsVp8N4k.js.map} +1 -1
  112. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYqT5Pg7.js → sequenceDiagram-2WXFIKYE-BkAT5uON.js} +4 -4
  113. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYqT5Pg7.js.map → sequenceDiagram-2WXFIKYE-BkAT5uON.js.map} +1 -1
  114. package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9b1mN8-.js → stateDiagram-RAJIS63D-qk_ajPAy.js} +9 -9
  115. package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9b1mN8-.js.map → stateDiagram-RAJIS63D-qk_ajPAy.js.map} +1 -1
  116. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DNzgudL_.js → stateDiagram-v2-FVOUBMTO-CNtP8Lfm.js} +5 -5
  117. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DNzgudL_.js.map → stateDiagram-v2-FVOUBMTO-CNtP8Lfm.js.map} +1 -1
  118. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CkyKUY7A.js → timeline-definition-YZTLITO2-DLU-Pyr1.js} +3 -3
  119. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CkyKUY7A.js.map → timeline-definition-YZTLITO2-DLU-Pyr1.js.map} +1 -1
  120. package/webapp/dist/assets/{treemap-KZPCXAKY-CZd09kF-.js → treemap-KZPCXAKY-hHk6fxaq.js} +5 -5
  121. package/webapp/dist/assets/{treemap-KZPCXAKY-CZd09kF-.js.map → treemap-KZPCXAKY-hHk6fxaq.js.map} +1 -1
  122. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BxVF5Olo.js → vennDiagram-LZ73GAT5-CM1zd5GO.js} +2 -2
  123. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BxVF5Olo.js.map → vennDiagram-LZ73GAT5-CM1zd5GO.js.map} +1 -1
  124. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BRwRloPc.js → xychartDiagram-JWTSCODW-CccDexUn.js} +3 -3
  125. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BRwRloPc.js.map → xychartDiagram-JWTSCODW-CccDexUn.js.map} +1 -1
  126. package/webapp/dist/index.html +1 -1
  127. package/webapp/dist/assets/index--fy89xGh.js.map +0 -1
@@ -143,6 +143,7 @@ status: ok|error
143
143
  **参数:**
144
144
 
145
145
  - `selector`(必需):章节选择器(goals/constraints/progress)
146
+ - `category`(可选):额外章节目录;与 `selector` 组合定位 `<category>/<selector>.md`
146
147
  - `content`(必需):新内容(整段替换)
147
148
 
148
149
  **返回:**
@@ -156,7 +157,7 @@ updated_at: <更新时间戳>
156
157
  **特点:**
157
158
 
158
159
  - 每次调用替换整个章节
159
- - 不重置对话轮次
160
+ - 不开启新 course
160
161
  - 变更对所有队友可见
161
162
  - 约束规则:`constraints` 只写任务特有硬要求,不得重复系统提示/工具文档中的全局规则;一经发现重复,必须删除并告知用户
162
163
 
@@ -184,10 +185,25 @@ mind_more({
184
185
  - 只追加,不会自动去重、改写或压缩旧内容
185
186
  - 适合给 `progress` 补一两条当前仍有效的状态、决策、下一步或阻塞
186
187
  - 不适合把每一步调查过程、长日志、完整方案或验收记录当流水账追加进去;这些细节应写入 rtws 正式文档,差遣牒只写摘要和文档定位 pointer
187
- - 若需要删除陈旧项、重排结构或压缩公告牌,仍使用 `change_mind` 做整章替换
188
+ - 若需要删除陈旧项、重排结构或压缩公告牌,仍使用 `change_mind` 做整章替换;若要删除整个章节文件,使用 `never_mind`
188
189
  - 当同一主题已经有多条阶段记录时,优先 `change_mind` 合并成当前仍有效的简明公告,而不是继续 `mind_more`
189
190
 
190
- ### 7. recall_taskdoc
191
+ ### 7. never_mind
192
+
193
+ 删除差遣牒章节文件。
194
+
195
+ **参数:**
196
+
197
+ - `selector`(必需):章节选择器;顶层章节可用 `goals` / `constraints` / `progress`
198
+ - `category`(可选):额外章节目录;与 `selector` 组合定位 `<category>/<selector>.md`
199
+
200
+ **特点:**
201
+
202
+ - 只删除整章文件,不做内容编辑
203
+ - 仅用于章节整体不再成立;如果只是删除几条陈旧项或压缩结构,优先用 `change_mind` 写回整理后的全文
204
+ - 不开启新 course
205
+
206
+ ### 8. recall_taskdoc
191
207
 
192
208
  读取差遣牒章节。
193
209
 
@@ -90,7 +90,7 @@ The `personal_memory` toolset uses a **path key-value storage** model:
90
90
 
91
91
  - **team_memory**: Team shared memory, visible to all members
92
92
  - **reminder**: Temporary reminder, session-level
93
- - **mind_more / change_mind**: Append to or replace Taskdoc (goals/constraints/progress)
93
+ - **mind_more / change_mind / never_mind**: Append to, replace, or delete Taskdoc sections (goals/constraints/progress)
94
94
 
95
95
  ## Limitations and Notes
96
96
 
@@ -90,7 +90,7 @@ personal_memory 工具集采用**路径键值存储**模型:
90
90
 
91
91
  - **team_memory**:团队共享记忆,所有成员可见
92
92
  - **reminder**:临时提醒,会话级别
93
- - **mind_more / change_mind**:追加或替换差遣牒(goals/constraints/progress)
93
+ - **mind_more / change_mind / never_mind**:追加、替换或删除差遣牒章节(goals/constraints/progress)
94
94
 
95
95
  ## 限制与注意事项
96
96
 
@@ -80,7 +80,7 @@ The team_memory toolset uses a **path key-value storage** model, similar to pers
80
80
 
81
81
  - **personal_memory**: Personal memory, only current agent visible
82
82
  - **reminder**: Temporary reminder, session-level
83
- - **mind_more / change_mind**: Append to or replace Taskdoc (goals/constraints/progress)
83
+ - **mind_more / change_mind / never_mind**: Append to, replace, or delete Taskdoc sections (goals/constraints/progress)
84
84
 
85
85
  > Note: `team_memory` carries long-lived team consensus; Taskdoc `progress` carries quasi-real-time team-wide task announcements during execution. Do not mix them.
86
86
 
@@ -80,7 +80,7 @@ team_memory 工具集采用**路径键值存储**模型,与 personal_memory
80
80
 
81
81
  - **personal_memory**:个人记忆,仅当前智能体可见
82
82
  - **reminder**:临时提醒,会话级别
83
- - **mind_more / change_mind**:追加或替换差遣牒(goals/constraints/progress)
83
+ - **mind_more / change_mind / never_mind**:追加、替换或删除差遣牒章节(goals/constraints/progress)
84
84
 
85
85
  > 注:`team_memory` 承接团队长期共识;Taskdoc `progress` 承接任务执行期的准实时全队公告,不应混淆。
86
86
 
@@ -3221,7 +3221,7 @@ function renderPermissionsManual(language) {
3221
3221
  '模式支持 `*` 和 `**`,按“目录范围”语义匹配(按目录/路径前缀范围来理解)。',
3222
3222
  '示例:`dominds/**` 会匹配 `dominds/README.md`、`dominds/main/server.ts`、`dominds/webapp/src/...` 等路径。',
3223
3223
  '示例:`.minds/**` 会匹配 `.minds/team.yaml`、`.minds/team/<id>/persona.zh.md` 等;常用于限制普通成员访问 minds 资产。',
3224
- '`*.tsk/` 是封装差遣牒:只能用函数工具 `mind_more` / `change_mind` 维护。任何通用文件工具都无法访问该目录树(硬编码无条件拒绝)。',
3224
+ '`*.tsk/` 是封装差遣牒:只能用函数工具 `mind_more` / `change_mind` / `never_mind` 维护。任何通用文件工具都无法访问该目录树(硬编码无条件拒绝)。',
3225
3225
  '`.minds/**` 是 rtws(运行时工作区)的“团队配置/记忆/资产”目录:任何通用文件工具都无法访问(硬编码无条件拒绝)。只有专用的 `.minds/` 工具集(例如 `team_mgmt`)可访问它。',
3226
3226
  '在当前内建模型中,`.minds/team/**`、`.minds/team.yaml`、`.minds/skills/**`、`.minds/priming/**` 等团队资产目录,只有持有 `team_mgmt` 的成员才应修改。',
3227
3227
  '`.minds/team/<id>/*` 的“角色归属对象”只表示它描述哪个角色,不构成任何额外写权限。未持有 `team_mgmt` 的成员,即使只是想更新“自己的” persona/knowhow/pitfalls,也应通过回贴建议内容,由具备权限的团队管理者代写。',
@@ -3249,7 +3249,7 @@ function renderPermissionsManual(language) {
3249
3249
  'Patterns support `*` and `**` with directory-scope semantics (think directory/path-range matching).',
3250
3250
  'Example: `dominds/**` matches `dominds/README.md`, `dominds/main/server.ts`, `dominds/webapp/src/...`, etc.',
3251
3251
  'Example: `.minds/**` matches `.minds/team.yaml` and `.minds/team/<id>/persona.*.md`; commonly used to restrict normal members from minds assets.',
3252
- '`*.tsk/` is an encapsulated Taskdoc: it must be maintained via `mind_more` / `change_mind` only. It is hard-denied for all general file tools.',
3252
+ '`*.tsk/` is an encapsulated Taskdoc: it must be maintained via `mind_more` / `change_mind` / `never_mind` only. It is hard-denied for all general file tools.',
3253
3253
  '`.minds/**` stores rtws (runtime workspace) team config/memory/assets: it is hard-denied for all general file tools. Only dedicated `.minds/`-scoped toolsets (e.g. `team_mgmt`) may access it.',
3254
3254
  'In the current built-in model, team asset paths such as `.minds/team/**`, `.minds/team.yaml`, `.minds/skills/**`, and `.minds/priming/**` should only be modified by members who hold `team_mgmt`.',
3255
3255
  'The “owner role” of `.minds/team/<id>/*` only tells you which role the asset describes; it does not grant extra write permission. Without `team_mgmt`, a member should not rewrite even “their own” persona/knowhow/pitfalls directly, and should instead hand back suggested content for an authorized team manager to apply.',
@@ -129,6 +129,15 @@ export declare function appendTaskPackageByChangeMindTarget(params: {
129
129
  sep: string;
130
130
  updatedBy?: string;
131
131
  }): Promise<void>;
132
+ export declare function deleteTaskPackageByChangeMindTarget(params: {
133
+ taskPackageDirFullPath: string;
134
+ target: TaskPackageChangeMindTarget;
135
+ }): Promise<{
136
+ kind: 'deleted';
137
+ } | {
138
+ kind: 'missing';
139
+ }>;
140
+ export declare function taskPackageRelativePathForChangeMindTarget(target: TaskPackageChangeMindTarget): string;
132
141
  export declare function ensureTaskPackage(taskPackageDirFullPath: string, _updatedBy?: string): Promise<void>;
133
142
  export declare function readTaskPackageSections(taskPackageDirFullPath: string): Promise<TaskPackageSectionsState>;
134
143
  export declare function formatEffectiveTaskDocFromSections(language: LanguageCode, sections: TaskPackageSectionsState, bearInMind?: TaskPackageBearInMindState): string;
@@ -54,6 +54,8 @@ exports.taskPackageFilenameForSection = taskPackageFilenameForSection;
54
54
  exports.bearInMindFilenameForSection = bearInMindFilenameForSection;
55
55
  exports.updateTaskPackageByChangeMindTarget = updateTaskPackageByChangeMindTarget;
56
56
  exports.appendTaskPackageByChangeMindTarget = appendTaskPackageByChangeMindTarget;
57
+ exports.deleteTaskPackageByChangeMindTarget = deleteTaskPackageByChangeMindTarget;
58
+ exports.taskPackageRelativePathForChangeMindTarget = taskPackageRelativePathForChangeMindTarget;
57
59
  exports.ensureTaskPackage = ensureTaskPackage;
58
60
  exports.readTaskPackageSections = readTaskPackageSections;
59
61
  exports.formatEffectiveTaskDocFromSections = formatEffectiveTaskDocFromSections;
@@ -200,6 +202,26 @@ async function appendTaskPackageByChangeMindTarget(params) {
200
202
  const next = current === null || current.trim() === '' ? content : joinForAppend(current, content, sep);
201
203
  await writeMarkdownFileWithCanonicalEnding(filePath, next);
202
204
  }
205
+ async function deleteTaskPackageByChangeMindTarget(params) {
206
+ const filePath = taskPackageFilePathForChangeMindTarget(params.taskPackageDirFullPath, params.target);
207
+ try {
208
+ const st = await fs.promises.stat(filePath);
209
+ if (!st.isFile()) {
210
+ throw new Error(`Taskdoc section target is not a file: ${filePath}`);
211
+ }
212
+ await fs.promises.unlink(filePath);
213
+ return { kind: 'deleted' };
214
+ }
215
+ catch (err) {
216
+ if (typeof err === 'object' &&
217
+ err !== null &&
218
+ 'code' in err &&
219
+ err.code === 'ENOENT') {
220
+ return { kind: 'missing' };
221
+ }
222
+ throw err;
223
+ }
224
+ }
203
225
  async function writeMarkdownFileWithCanonicalEnding(filePath, content) {
204
226
  await fs.promises.writeFile(filePath, withCanonicalMarkdownFileEnding(content), 'utf8');
205
227
  }
@@ -209,20 +231,23 @@ function withCanonicalMarkdownFileEnding(content) {
209
231
  return '';
210
232
  return `${stripped}\n`;
211
233
  }
212
- function taskPackageFilePathForChangeMindTarget(taskPackageDirFullPath, target) {
234
+ function taskPackageRelativePathForChangeMindTarget(target) {
213
235
  switch (target.kind) {
214
236
  case 'top_level':
215
- return path.join(taskPackageDirFullPath, taskPackageFilenameForSection(target.section));
237
+ return taskPackageFilenameForSection(target.section);
216
238
  case 'bearinmind':
217
- return path.join(taskPackageDirFullPath, 'bearinmind', bearInMindFilenameForSection(target.section));
239
+ return path.join('bearinmind', bearInMindFilenameForSection(target.section));
218
240
  case 'category':
219
- return path.join(taskPackageDirFullPath, target.category, `${target.selector}.md`);
241
+ return path.join(target.category, `${target.selector}.md`);
220
242
  default: {
221
243
  const _exhaustive = target;
222
244
  return _exhaustive;
223
245
  }
224
246
  }
225
247
  }
248
+ function taskPackageFilePathForChangeMindTarget(taskPackageDirFullPath, target) {
249
+ return path.join(taskPackageDirFullPath, taskPackageRelativePathForChangeMindTarget(target));
250
+ }
226
251
  async function readTextFileIfPresent(filePath) {
227
252
  try {
228
253
  return await fs.promises.readFile(filePath, 'utf8');
@@ -0,0 +1,12 @@
1
+ import type { SearchTaskDocumentSuggestionsResult } from './taskdoc-search';
2
+ export type TaskdocSuggestionWorkerPayload = {
3
+ rootDir?: string;
4
+ query: string;
5
+ limit?: number;
6
+ };
7
+ type TaskdocSuggestionWorkerOptions = {
8
+ signal?: AbortSignal;
9
+ };
10
+ export declare function buildTaskDocumentSuggestionRequestKey(payload: TaskdocSuggestionWorkerPayload): string;
11
+ export declare function searchTaskDocumentSuggestionsInWorker(payload: TaskdocSuggestionWorkerPayload, options?: TaskdocSuggestionWorkerOptions): Promise<SearchTaskDocumentSuggestionsResult>;
12
+ export {};
@@ -0,0 +1,320 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.buildTaskDocumentSuggestionRequestKey = buildTaskDocumentSuggestionRequestKey;
40
+ exports.searchTaskDocumentSuggestionsInWorker = searchTaskDocumentSuggestionsInWorker;
41
+ const fs_1 = __importDefault(require("fs"));
42
+ const module_1 = require("module");
43
+ const path = __importStar(require("path"));
44
+ const worker_threads_1 = require("worker_threads");
45
+ const requireFn = (0, module_1.createRequire)(__filename);
46
+ const TASKDOC_SUGGESTION_WORKER_TIMEOUT_MS = 10000;
47
+ const TASKDOC_SUGGESTION_MAX_WORKERS = 2;
48
+ const TASKDOC_SUGGESTION_MAX_PENDING_WORKERS = 8;
49
+ const TASKDOC_SUGGESTION_CACHE_TTL_MS = 3000;
50
+ const TASKDOC_SUGGESTION_CACHE_MAX_ENTRIES = 64;
51
+ let activeTaskdocSuggestionWorkers = 0;
52
+ const pendingTaskdocSuggestionWorkerSlots = [];
53
+ const taskdocSuggestionCache = new Map();
54
+ const taskdocSuggestionInFlightByCacheKey = new Map();
55
+ function isRecord(value) {
56
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
57
+ }
58
+ function normalizeTaskdocSuggestionLimit(limit) {
59
+ return typeof limit === 'number' && Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : 50;
60
+ }
61
+ function normalizeTaskdocSuggestionQueryKey(query) {
62
+ const normalized = query.trim().toLowerCase();
63
+ return normalized.endsWith('.tsk') ? normalized.slice(0, -4) : normalized;
64
+ }
65
+ function buildTaskDocumentSuggestionRequestKey(payload) {
66
+ return normalizeTaskdocSuggestionQueryKey(payload.query);
67
+ }
68
+ function buildTaskDocumentSuggestionCacheKey(payload) {
69
+ return [
70
+ path.resolve(payload.rootDir ?? '.'),
71
+ String(normalizeTaskdocSuggestionLimit(payload.limit)),
72
+ buildTaskDocumentSuggestionRequestKey(payload),
73
+ ].join('\u0000');
74
+ }
75
+ function readTaskDocumentSuggestionCache(cacheKey) {
76
+ const cached = taskdocSuggestionCache.get(cacheKey);
77
+ if (!cached)
78
+ return undefined;
79
+ if (cached.expiresAtMs <= Date.now()) {
80
+ taskdocSuggestionCache.delete(cacheKey);
81
+ return undefined;
82
+ }
83
+ return cached.result;
84
+ }
85
+ function writeTaskDocumentSuggestionCache(cacheKey, result) {
86
+ if (result.kind !== 'ok')
87
+ return;
88
+ const now = Date.now();
89
+ for (const [key, cached] of taskdocSuggestionCache) {
90
+ if (cached.expiresAtMs <= now)
91
+ taskdocSuggestionCache.delete(key);
92
+ }
93
+ taskdocSuggestionCache.delete(cacheKey);
94
+ taskdocSuggestionCache.set(cacheKey, {
95
+ expiresAtMs: now + TASKDOC_SUGGESTION_CACHE_TTL_MS,
96
+ result,
97
+ });
98
+ while (taskdocSuggestionCache.size > TASKDOC_SUGGESTION_CACHE_MAX_ENTRIES) {
99
+ const oldestKey = taskdocSuggestionCache.keys().next().value;
100
+ if (typeof oldestKey !== 'string')
101
+ break;
102
+ taskdocSuggestionCache.delete(oldestKey);
103
+ }
104
+ }
105
+ async function waitForTaskDocumentSuggestionResult(promise, signal) {
106
+ if (!signal)
107
+ return await promise;
108
+ if (signal.aborted) {
109
+ return { kind: 'error', errorText: 'Taskdoc suggestion request aborted' };
110
+ }
111
+ return await new Promise((resolve) => {
112
+ let settled = false;
113
+ const settle = (result) => {
114
+ if (settled)
115
+ return;
116
+ settled = true;
117
+ signal.removeEventListener('abort', abortWait);
118
+ resolve(result);
119
+ };
120
+ const abortWait = () => {
121
+ settle({ kind: 'error', errorText: 'Taskdoc suggestion request aborted' });
122
+ };
123
+ signal.addEventListener('abort', abortWait, { once: true });
124
+ promise.then(settle, (error) => {
125
+ settle({
126
+ kind: 'error',
127
+ errorText: error instanceof Error ? error.message : 'Taskdoc suggestion worker failed',
128
+ });
129
+ });
130
+ });
131
+ }
132
+ function parseWorkerMessage(value) {
133
+ if (!isRecord(value))
134
+ throw new Error('Taskdoc suggestion worker returned non-object message');
135
+ const kind = value['kind'];
136
+ switch (kind) {
137
+ case 'ok': {
138
+ const suggestionsRaw = value['suggestions'];
139
+ if (!isRecord(suggestionsRaw)) {
140
+ throw new Error('Taskdoc suggestion worker ok message missing suggestions');
141
+ }
142
+ if (suggestionsRaw['kind'] === 'ok') {
143
+ const listRaw = suggestionsRaw['suggestions'];
144
+ if (!Array.isArray(listRaw)) {
145
+ throw new Error('Taskdoc suggestion worker ok result missing suggestions list');
146
+ }
147
+ return {
148
+ kind: 'ok',
149
+ suggestions: {
150
+ kind: 'ok',
151
+ suggestions: listRaw.map((item) => {
152
+ if (!isRecord(item)) {
153
+ throw new Error('Taskdoc suggestion worker returned invalid suggestion item');
154
+ }
155
+ const pathRaw = item['path'];
156
+ const relativePath = item['relativePath'];
157
+ const name = item['name'];
158
+ if (typeof pathRaw !== 'string' ||
159
+ typeof relativePath !== 'string' ||
160
+ typeof name !== 'string') {
161
+ throw new Error('Taskdoc suggestion worker returned malformed suggestion item');
162
+ }
163
+ return { path: pathRaw, relativePath, name };
164
+ }),
165
+ },
166
+ };
167
+ }
168
+ if (suggestionsRaw['kind'] === 'error') {
169
+ const errorText = suggestionsRaw['errorText'];
170
+ if (typeof errorText !== 'string') {
171
+ throw new Error('Taskdoc suggestion worker error result missing errorText');
172
+ }
173
+ return { kind: 'ok', suggestions: { kind: 'error', errorText } };
174
+ }
175
+ throw new Error('Taskdoc suggestion worker returned unknown suggestions kind');
176
+ }
177
+ case 'error': {
178
+ const errorText = value['errorText'];
179
+ if (typeof errorText !== 'string') {
180
+ throw new Error('Taskdoc suggestion worker error message missing errorText');
181
+ }
182
+ return { kind: 'error', errorText };
183
+ }
184
+ default:
185
+ throw new Error(`Taskdoc suggestion worker returned unknown message kind: ${String(kind)}`);
186
+ }
187
+ }
188
+ function resolveTaskdocSuggestionWorkerEntrypointAbs() {
189
+ const distCandidate = path.resolve(__dirname, 'taskdoc-search-worker.js');
190
+ if (fs_1.default.existsSync(distCandidate)) {
191
+ return { ok: true, kind: 'compiled_js', scriptAbs: distCandidate };
192
+ }
193
+ const tsCandidate = path.resolve(__dirname, 'taskdoc-search-worker.ts');
194
+ if (fs_1.default.existsSync(tsCandidate)) {
195
+ const tsxCjsRegisterAbs = requireFn.resolve('tsx/cjs');
196
+ return { ok: true, kind: 'tsx_cjs_bridge', scriptAbs: tsCandidate, tsxCjsRegisterAbs };
197
+ }
198
+ return {
199
+ ok: false,
200
+ errorText: `Cannot find taskdoc suggestion worker entrypoint at ${distCandidate} or ${tsCandidate}`,
201
+ };
202
+ }
203
+ async function acquireTaskdocSuggestionWorkerSlot() {
204
+ if (activeTaskdocSuggestionWorkers < TASKDOC_SUGGESTION_MAX_WORKERS) {
205
+ activeTaskdocSuggestionWorkers += 1;
206
+ return;
207
+ }
208
+ if (pendingTaskdocSuggestionWorkerSlots.length >= TASKDOC_SUGGESTION_MAX_PENDING_WORKERS) {
209
+ throw new Error('Taskdoc suggestion worker queue is full');
210
+ }
211
+ await new Promise((resolve) => {
212
+ const grantSlot = () => {
213
+ activeTaskdocSuggestionWorkers += 1;
214
+ resolve();
215
+ };
216
+ pendingTaskdocSuggestionWorkerSlots.push(grantSlot);
217
+ });
218
+ }
219
+ function releaseTaskdocSuggestionWorkerSlot() {
220
+ activeTaskdocSuggestionWorkers = Math.max(0, activeTaskdocSuggestionWorkers - 1);
221
+ const next = pendingTaskdocSuggestionWorkerSlots.shift();
222
+ if (next) {
223
+ next();
224
+ return;
225
+ }
226
+ }
227
+ async function runTaskDocumentSuggestionsWorker(payload) {
228
+ const entry = resolveTaskdocSuggestionWorkerEntrypointAbs();
229
+ if (!entry.ok)
230
+ return { kind: 'error', errorText: entry.errorText };
231
+ let acquiredWorkerSlot = false;
232
+ try {
233
+ await acquireTaskdocSuggestionWorkerSlot();
234
+ acquiredWorkerSlot = true;
235
+ const worker = entry.kind === 'compiled_js'
236
+ ? new worker_threads_1.Worker(entry.scriptAbs, { workerData: payload })
237
+ : new worker_threads_1.Worker('const { workerData } = require("worker_threads"); require(workerData.tsxCjsRegisterAbs); require(workerData.scriptAbs);', {
238
+ eval: true,
239
+ workerData: {
240
+ ...payload,
241
+ scriptAbs: entry.scriptAbs,
242
+ tsxCjsRegisterAbs: entry.tsxCjsRegisterAbs,
243
+ },
244
+ });
245
+ return await new Promise((resolve) => {
246
+ let settled = false;
247
+ const timeout = setTimeout(() => {
248
+ if (settled)
249
+ return;
250
+ settled = true;
251
+ releaseTaskdocSuggestionWorkerSlot();
252
+ void worker.terminate();
253
+ resolve({ kind: 'error', errorText: 'Taskdoc suggestion worker timed out' });
254
+ }, TASKDOC_SUGGESTION_WORKER_TIMEOUT_MS);
255
+ const settle = (result) => {
256
+ if (settled)
257
+ return;
258
+ settled = true;
259
+ clearTimeout(timeout);
260
+ releaseTaskdocSuggestionWorkerSlot();
261
+ void worker.terminate();
262
+ resolve(result);
263
+ };
264
+ worker.once('message', (raw) => {
265
+ try {
266
+ const message = parseWorkerMessage(raw);
267
+ if (message.kind === 'ok') {
268
+ settle(message.suggestions);
269
+ return;
270
+ }
271
+ settle({ kind: 'error', errorText: message.errorText });
272
+ }
273
+ catch (error) {
274
+ settle({
275
+ kind: 'error',
276
+ errorText: error instanceof Error ? error.message : 'Invalid taskdoc worker response',
277
+ });
278
+ }
279
+ });
280
+ worker.once('error', (error) => {
281
+ settle({ kind: 'error', errorText: error.message });
282
+ });
283
+ worker.once('exit', (code) => {
284
+ if (settled)
285
+ return;
286
+ settle({ kind: 'error', errorText: `Taskdoc suggestion worker exited with code ${code}` });
287
+ });
288
+ });
289
+ }
290
+ catch (error) {
291
+ if (acquiredWorkerSlot)
292
+ releaseTaskdocSuggestionWorkerSlot();
293
+ return {
294
+ kind: 'error',
295
+ errorText: error instanceof Error ? error.message : 'Failed to start taskdoc worker',
296
+ };
297
+ }
298
+ }
299
+ async function searchTaskDocumentSuggestionsInWorker(payload, options = {}) {
300
+ if (options.signal?.aborted) {
301
+ return { kind: 'error', errorText: 'Taskdoc suggestion request aborted' };
302
+ }
303
+ const cacheKey = buildTaskDocumentSuggestionCacheKey(payload);
304
+ const cached = readTaskDocumentSuggestionCache(cacheKey);
305
+ if (cached)
306
+ return cached;
307
+ let inFlight = taskdocSuggestionInFlightByCacheKey.get(cacheKey);
308
+ if (!inFlight) {
309
+ inFlight = runTaskDocumentSuggestionsWorker(payload)
310
+ .then((result) => {
311
+ writeTaskDocumentSuggestionCache(cacheKey, result);
312
+ return result;
313
+ })
314
+ .finally(() => {
315
+ taskdocSuggestionInFlightByCacheKey.delete(cacheKey);
316
+ });
317
+ taskdocSuggestionInFlightByCacheKey.set(cacheKey, inFlight);
318
+ }
319
+ return await waitForTaskDocumentSuggestionResult(inFlight, options.signal);
320
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const worker_threads_1 = require("worker_threads");
4
+ const taskdoc_search_1 = require("./taskdoc-search");
5
+ function isRecord(value) {
6
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
7
+ }
8
+ function parseWorkerPayload(value) {
9
+ if (!isRecord(value)) {
10
+ throw new Error('Taskdoc suggestion worker payload must be an object');
11
+ }
12
+ const query = value['query'];
13
+ if (typeof query !== 'string') {
14
+ throw new Error('Taskdoc suggestion worker payload.query must be a string');
15
+ }
16
+ const rootDirRaw = value['rootDir'];
17
+ const limitRaw = value['limit'];
18
+ return {
19
+ query,
20
+ ...(typeof rootDirRaw === 'string' ? { rootDir: rootDirRaw } : {}),
21
+ ...(typeof limitRaw === 'number' ? { limit: limitRaw } : {}),
22
+ };
23
+ }
24
+ async function main() {
25
+ if (worker_threads_1.parentPort === null) {
26
+ throw new Error('Taskdoc suggestion worker requires a parentPort');
27
+ }
28
+ try {
29
+ const payload = parseWorkerPayload(worker_threads_1.workerData);
30
+ const suggestions = await (0, taskdoc_search_1.searchTaskDocumentSuggestionsInRtws)(payload);
31
+ const message = { kind: 'ok', suggestions };
32
+ worker_threads_1.parentPort.postMessage(message);
33
+ }
34
+ catch (error) {
35
+ const message = {
36
+ kind: 'error',
37
+ errorText: error instanceof Error ? error.message : 'Taskdoc suggestion worker failed',
38
+ };
39
+ worker_threads_1.parentPort.postMessage(message);
40
+ }
41
+ }
42
+ void main();
@@ -1,10 +1,19 @@
1
- export interface TaskDocumentSummary {
2
- path: string;
3
- relativePath: string;
4
- name: string;
5
- size: number;
6
- lastModified: string;
7
- }
1
+ /**
2
+ * Module: utils/taskdoc-search
3
+ *
4
+ * rtws (runtime workspace) search utilities for Taskdocs (`*.tsk/`).
5
+ *
6
+ * Taskdocs are encapsulated directories ending in `.tsk`. For search, we treat each `*.tsk/`
7
+ * directory as a single unit and do not recurse into it.
8
+ *
9
+ * Ignore rules:
10
+ * - Default ignore patterns skip common non-task directories (at any depth).
11
+ * - A `.taskdoc-ignore` file may exist in any directory. Its patterns apply to that directory's
12
+ * subtree only (like a simplified `.gitignore`).
13
+ * - Patterns are interpreted as paths relative to the `.taskdoc-ignore` directory (unless they
14
+ * start with `/`, in which case they are rtws-root-relative).
15
+ */
16
+ import type { TaskDocumentSuggestion, TaskDocumentSummary } from '@longrun-ai/kernel/types/taskdoc';
8
17
  export type ListTaskDocumentsResult = {
9
18
  kind: 'ok';
10
19
  taskDocuments: TaskDocumentSummary[];
@@ -12,8 +21,20 @@ export type ListTaskDocumentsResult = {
12
21
  kind: 'error';
13
22
  errorText: string;
14
23
  };
24
+ export type SearchTaskDocumentSuggestionsResult = {
25
+ kind: 'ok';
26
+ suggestions: TaskDocumentSuggestion[];
27
+ } | {
28
+ kind: 'error';
29
+ errorText: string;
30
+ };
15
31
  interface ListTaskDocumentsParams {
16
32
  rootDir?: string;
17
33
  }
34
+ interface SearchTaskDocumentSuggestionsParams extends ListTaskDocumentsParams {
35
+ query: string;
36
+ limit?: number;
37
+ }
18
38
  export declare function listTaskDocumentsInRtws(params?: ListTaskDocumentsParams): Promise<ListTaskDocumentsResult>;
39
+ export declare function searchTaskDocumentSuggestionsInRtws(params: SearchTaskDocumentSuggestionsParams): Promise<SearchTaskDocumentSuggestionsResult>;
19
40
  export {};