dominds 1.25.0 → 1.25.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/README.zh.md +4 -3
- package/dist/dialog-display-state.d.ts +3 -3
- package/dist/dialog-display-state.js +12 -8
- package/dist/dialog.d.ts +3 -3
- package/dist/dialog.js +42 -20
- package/dist/docs/design.md +4 -0
- package/dist/docs/design.zh.md +4 -0
- package/dist/docs/dlg-drive-algo.zh.md +5 -0
- package/dist/docs/roadmap.md +2 -0
- package/dist/docs/roadmap.zh.md +2 -0
- package/dist/llm/gen/mock.d.ts +2 -2
- package/dist/llm/gen/mock.js +2 -2
- package/dist/llm/kernel-driver/drive.js +41 -14
- package/dist/llm/kernel-driver/engine.d.ts +1 -1
- package/dist/llm/kernel-driver/idle-reminder-wake.js +1 -1
- package/dist/llm/kernel-driver/sideDialog.d.ts +1 -1
- package/dist/llm/kernel-driver/sideDialog.js +7 -3
- package/dist/llm/kernel-driver/tellask-special.js +1 -6
- package/dist/llm/kernel-driver/types.d.ts +1 -1
- package/dist/minds/system-prompt-parts.js +4 -4
- package/dist/persistence.d.ts +1 -7
- package/dist/persistence.js +186 -149
- package/dist/priming.js +116 -35
- package/dist/runtime/driver-messages.d.ts +1 -1
- package/dist/runtime/driver-messages.js +37 -19
- package/dist/server/api-routes.js +18 -0
- package/dist/server/server-core.d.ts +1 -0
- package/dist/server/server-core.js +11 -0
- package/dist/server/websocket-handler.js +2 -1
- package/dist/shared-reminders.d.ts +11 -3
- package/dist/shared-reminders.js +62 -34
- package/dist/team.js +4 -1
- package/dist/tool.d.ts +1 -1
- package/dist/tool.js +1 -1
- package/dist/tools/app-reminders.js +8 -2
- package/dist/tools/builtins.js +30 -0
- package/dist/tools/ctrl.js +34 -109
- package/dist/tools/fs.d.ts +2 -0
- package/dist/tools/fs.js +281 -2
- package/dist/tools/os.d.ts +11 -0
- package/dist/tools/os.js +26 -15
- package/dist/tools/picture.d.ts +1 -0
- package/dist/tools/picture.js +64 -1
- package/dist/tools/prompts/codex_inspect_and_patch_tools/en/tools.md +5 -0
- package/dist/tools/prompts/codex_inspect_and_patch_tools/zh/tools.md +5 -0
- package/dist/tools/prompts/control/en/errors.md +5 -19
- package/dist/tools/prompts/control/en/index.md +5 -4
- package/dist/tools/prompts/control/en/principles.md +23 -19
- package/dist/tools/prompts/control/en/scenarios.md +17 -11
- package/dist/tools/prompts/control/en/tools.md +4 -6
- package/dist/tools/prompts/control/zh/errors.md +5 -19
- package/dist/tools/prompts/control/zh/index.md +5 -4
- package/dist/tools/prompts/control/zh/principles.md +22 -19
- package/dist/tools/prompts/control/zh/scenarios.md +17 -11
- package/dist/tools/prompts/control/zh/tools.md +4 -6
- package/dist/tools/prompts/fs_read/en/errors.md +6 -0
- package/dist/tools/prompts/fs_read/en/index.md +17 -0
- package/dist/tools/prompts/fs_read/en/principles.md +5 -0
- package/dist/tools/prompts/fs_read/en/scenarios.md +3 -0
- package/dist/tools/prompts/fs_read/en/tools.md +11 -0
- package/dist/tools/prompts/fs_read/zh/errors.md +6 -0
- package/dist/tools/prompts/fs_read/zh/index.md +17 -0
- package/dist/tools/prompts/fs_read/zh/principles.md +5 -0
- package/dist/tools/prompts/fs_read/zh/scenarios.md +3 -0
- package/dist/tools/prompts/fs_read/zh/tools.md +11 -0
- package/dist/tools/prompts/os/en/index.md +1 -1
- package/dist/tools/prompts/os/en/principles.md +1 -1
- package/dist/tools/prompts/os/en/scenarios.md +21 -0
- package/dist/tools/prompts/os/en/tools.md +6 -0
- package/dist/tools/prompts/os/zh/index.md +1 -1
- package/dist/tools/prompts/os/zh/principles.md +1 -1
- package/dist/tools/prompts/os/zh/scenarios.md +21 -0
- package/dist/tools/prompts/os/zh/tools.md +6 -0
- package/dist/tools/prompts/personal_memory/en/index.md +1 -1
- package/dist/tools/prompts/personal_memory/en/principles.md +2 -2
- package/dist/tools/prompts/personal_memory/zh/index.md +1 -1
- package/dist/tools/prompts/personal_memory/zh/principles.md +2 -2
- package/dist/tools/registry.d.ts +6 -0
- package/dist/tools/ripgrep.d.ts +5 -0
- package/dist/tools/ripgrep.js +482 -1
- package/dist/tools/team_mgmt.js +8 -8
- package/dist/tools/txt.d.ts +34 -0
- package/dist/tools/txt.js +221 -1
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-ZLV93S3E.js → _basePickBy-CbWZ8qnS.js} +3 -3
- package/webapp/dist/assets/_basePickBy-CbWZ8qnS.js.map +1 -0
- package/webapp/dist/assets/{_baseUniq-D0wSOJ06.js → _baseUniq-IY-Vfzx1.js} +2 -2
- package/webapp/dist/assets/_baseUniq-IY-Vfzx1.js.map +1 -0
- package/webapp/dist/assets/{arc-BHclbMTS.js → arc--U2Vks6y.js} +2 -2
- package/webapp/dist/assets/arc--U2Vks6y.js.map +1 -0
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CK99gE_D.js → architectureDiagram-VXUJARFQ-DpryGqjy.js} +8 -26
- package/webapp/dist/assets/architectureDiagram-VXUJARFQ-DpryGqjy.js.map +1 -0
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-fE5MBTEU.js → blockDiagram-VD42YOAC-TTufCfiE.js} +170 -187
- package/webapp/dist/assets/blockDiagram-VD42YOAC-TTufCfiE.js.map +1 -0
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-BSLyPyoU.js → c4Diagram-YG6GDRKO-B4RPsw5H.js} +4 -4
- package/webapp/dist/assets/c4Diagram-YG6GDRKO-B4RPsw5H.js.map +1 -0
- package/webapp/dist/assets/{channel-DSvMpp-a.js → channel-DAtGYJHZ.js} +2 -2
- package/webapp/dist/assets/channel-DAtGYJHZ.js.map +1 -0
- package/webapp/dist/assets/{chunk-4BX2VUAB-OXEX170k.js → chunk-4BX2VUAB-JtO__vAF.js} +2 -2
- package/webapp/dist/assets/chunk-4BX2VUAB-JtO__vAF.js.map +1 -0
- package/webapp/dist/assets/{chunk-55IACEB6-BFQ_spQD.js → chunk-55IACEB6-JMRC8yG1.js} +2 -2
- package/webapp/dist/assets/chunk-55IACEB6-JMRC8yG1.js.map +1 -0
- package/webapp/dist/assets/{chunk-WL4C6EOR-PtH-blkK.js → chunk-B4BG7PRW-BDIpf8Iz.js} +121 -171
- package/webapp/dist/assets/chunk-B4BG7PRW-BDIpf8Iz.js.map +1 -0
- package/webapp/dist/assets/{chunk-NQ4KR5QH-B_ZhWMXR.js → chunk-DI55MBZ5-j9B4rifK.js} +7 -9
- package/webapp/dist/assets/chunk-DI55MBZ5-j9B4rifK.js.map +1 -0
- package/webapp/dist/assets/{chunk-FMBD7UC4-CbQ2BBPs.js → chunk-FMBD7UC4-DFXKLjHC.js} +2 -2
- package/webapp/dist/assets/chunk-FMBD7UC4-DFXKLjHC.js.map +1 -0
- package/webapp/dist/assets/{chunk-KX2RTZJC-BMd-daMY.js → chunk-QN33PNHL-BKzkeJ-b.js} +2 -2
- package/webapp/dist/assets/chunk-QN33PNHL-BKzkeJ-b.js.map +1 -0
- package/webapp/dist/assets/{chunk-QZHKN3VN-Cbf92xIw.js → chunk-QZHKN3VN-DiZd3UNl.js} +2 -2
- package/webapp/dist/assets/chunk-QZHKN3VN-DiZd3UNl.js.map +1 -0
- package/webapp/dist/assets/{chunk-JSJVCQXG-C4P1mjCL.js → chunk-TZMSLE5B-BaE4C244.js} +6 -14
- package/webapp/dist/assets/chunk-TZMSLE5B-BaE4C244.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-Dc3ncaD0.js → classDiagram-2ON5EDUG-CNF8ZohD.js} +6 -7
- package/webapp/dist/assets/classDiagram-2ON5EDUG-CNF8ZohD.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-Dc3ncaD0.js → classDiagram-v2-WZHVMYZB-CNF8ZohD.js} +6 -7
- package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-CNF8ZohD.js.map +1 -0
- package/webapp/dist/assets/{clone-E9Ad85BC.js → clone-Nq0Ko0Gv.js} +2 -2
- package/webapp/dist/assets/clone-Nq0Ko0Gv.js.map +1 -0
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-B-nj0o74.js → cose-bilkent-S5V4N54A-uHPLSeKv.js} +2 -2
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-uHPLSeKv.js.map +1 -0
- package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
- package/webapp/dist/assets/{dagre-KLK3FWXG-CyJYNIbm.js → dagre-6UL2VRFP-C1awWpU3.js} +7 -7
- package/webapp/dist/assets/dagre-6UL2VRFP-C1awWpU3.js.map +1 -0
- package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-C8eweQ7b.js → diagram-PSM6KHXK-Bf69p76M.js} +10 -10
- package/webapp/dist/assets/diagram-PSM6KHXK-Bf69p76M.js.map +1 -0
- package/webapp/dist/assets/{diagram-IFDJBPK2-DMdygRl0.js → diagram-QEK2KX5R-Bvlbx8Jp.js} +8 -9
- package/webapp/dist/assets/diagram-QEK2KX5R-Bvlbx8Jp.js.map +1 -0
- package/webapp/dist/assets/{diagram-P4PSJMXO-BQDZHb0a.js → diagram-S2PKOQOG-CGjGalBu.js} +8 -8
- package/webapp/dist/assets/diagram-S2PKOQOG-CGjGalBu.js.map +1 -0
- package/webapp/dist/assets/{erDiagram-INFDFZHY-C1HaXN6E.js → erDiagram-Q2GNP2WA-Ds3qhwkG.js} +75 -96
- package/webapp/dist/assets/erDiagram-Q2GNP2WA-Ds3qhwkG.js.map +1 -0
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-24nNqQyo.js → flowDiagram-NV44I4VS-B1wDG_l5.js} +81 -98
- package/webapp/dist/assets/flowDiagram-NV44I4VS-B1wDG_l5.js.map +1 -0
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-BWPOFaLV.js → ganttDiagram-JELNMOA3-BwuYt2bO.js} +3 -28
- package/webapp/dist/assets/ganttDiagram-JELNMOA3-BwuYt2bO.js.map +1 -0
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D7_L-p_Y.js → gitGraphDiagram-V2S2FVAM-B2Tw773z.js} +46 -38
- package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-B2Tw773z.js.map +1 -0
- package/webapp/dist/assets/graph-CS_H7jBi.js +425 -0
- package/webapp/dist/assets/graph-CS_H7jBi.js.map +1 -0
- package/webapp/dist/assets/{index-CDCDAfqP.js → index-arD81Nnh.js} +1086 -1044
- package/webapp/dist/assets/{index-CDCDAfqP.js.map → index-arD81Nnh.js.map} +1 -1
- package/webapp/dist/assets/{index-BQoNJEGT.css → index-yycTJNYb.css} +1 -1
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CvaBM5j6.js → infoDiagram-HS3SLOUP-C9_JKYhm.js} +7 -7
- package/webapp/dist/assets/infoDiagram-HS3SLOUP-C9_JKYhm.js.map +1 -0
- package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-TQR6_teO.js → journeyDiagram-XKPGCS4Q-BhZggYOL.js} +5 -5
- package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-BhZggYOL.js.map +1 -0
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-B-BOuC-U.js → kanban-definition-3W4ZIXB7-B-R2Xm4Y.js} +3 -5
- package/webapp/dist/assets/kanban-definition-3W4ZIXB7-B-R2Xm4Y.js.map +1 -0
- package/webapp/dist/assets/{layout-B8yqIqbx.js → layout-BzMatxDa.js} +5 -5
- package/webapp/dist/assets/layout-BzMatxDa.js.map +1 -0
- package/webapp/dist/assets/{linear-CoLfiZKK.js → linear-BuuJkw_U.js} +2 -2
- package/webapp/dist/assets/linear-BuuJkw_U.js.map +1 -0
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-P70BMIHI.js → mindmap-definition-VGOIOE7T-BR7oDKBR.js} +5 -7
- package/webapp/dist/assets/mindmap-definition-VGOIOE7T-BR7oDKBR.js.map +1 -0
- package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DsS_4dTB.js → pieDiagram-ADFJNKIX--QWeT2vZ.js} +8 -8
- package/webapp/dist/assets/pieDiagram-ADFJNKIX--QWeT2vZ.js.map +1 -0
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DoM9PEq-.js → quadrantDiagram-AYHSOK5B-BpqtmN3r.js} +3 -3
- package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-BpqtmN3r.js.map +1 -0
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-Bn3lYMMI.js → requirementDiagram-UZGBJVZJ-CIXjIi4F.js} +6 -16
- package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-CIXjIi4F.js.map +1 -0
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-97kCegRT.js → sankeyDiagram-TZEHDZUN-DJIt7SRz.js} +2 -2
- package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-DJIt7SRz.js.map +1 -0
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DXqjQjf6.js → sequenceDiagram-WL72ISMW-BpDK1ROT.js} +201 -601
- package/webapp/dist/assets/sequenceDiagram-WL72ISMW-BpDK1ROT.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-DQcTPKWP.js → stateDiagram-FKZM4ZOC-BoKGfmHf.js} +9 -9
- package/webapp/dist/assets/stateDiagram-FKZM4ZOC-BoKGfmHf.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DHmxRVJn.js → stateDiagram-v2-4FDKWEC3--haXC2JK.js} +5 -5
- package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3--haXC2JK.js.map +1 -0
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-BlovQQ4B.js → timeline-definition-IT6M3QCI-BmSg3Hjf.js} +3 -3
- package/webapp/dist/assets/timeline-definition-IT6M3QCI-BmSg3Hjf.js.map +1 -0
- package/webapp/dist/assets/{treemap-KZPCXAKY-CGu93c9S.js → treemap-GDKQZRPO-D9OuyDVA.js} +24 -37
- package/webapp/dist/assets/treemap-GDKQZRPO-D9OuyDVA.js.map +1 -0
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BKa1DxVq.js → xychartDiagram-PRI3JC2R-CVqSvO_S.js} +4 -4
- package/webapp/dist/assets/xychartDiagram-PRI3JC2R-CVqSvO_S.js.map +1 -0
- package/webapp/dist/index.html +2 -2
- package/webapp/dist/assets/_basePickBy-ZLV93S3E.js.map +0 -1
- package/webapp/dist/assets/_baseUniq-D0wSOJ06.js.map +0 -1
- package/webapp/dist/assets/arc-BHclbMTS.js.map +0 -1
- package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-CK99gE_D.js.map +0 -1
- package/webapp/dist/assets/blockDiagram-WCTKOSBZ-fE5MBTEU.js.map +0 -1
- package/webapp/dist/assets/c4Diagram-IC4MRINW-BSLyPyoU.js.map +0 -1
- package/webapp/dist/assets/channel-DSvMpp-a.js.map +0 -1
- package/webapp/dist/assets/chunk-4BX2VUAB-OXEX170k.js.map +0 -1
- package/webapp/dist/assets/chunk-55IACEB6-BFQ_spQD.js.map +0 -1
- package/webapp/dist/assets/chunk-FMBD7UC4-CbQ2BBPs.js.map +0 -1
- package/webapp/dist/assets/chunk-JSJVCQXG-C4P1mjCL.js.map +0 -1
- package/webapp/dist/assets/chunk-KX2RTZJC-BMd-daMY.js.map +0 -1
- package/webapp/dist/assets/chunk-NQ4KR5QH-B_ZhWMXR.js.map +0 -1
- package/webapp/dist/assets/chunk-QZHKN3VN-Cbf92xIw.js.map +0 -1
- package/webapp/dist/assets/chunk-WL4C6EOR-PtH-blkK.js.map +0 -1
- package/webapp/dist/assets/classDiagram-VBA2DB6C-Dc3ncaD0.js.map +0 -1
- package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-Dc3ncaD0.js.map +0 -1
- package/webapp/dist/assets/clone-E9Ad85BC.js.map +0 -1
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-B-nj0o74.js.map +0 -1
- package/webapp/dist/assets/dagre-KLK3FWXG-CyJYNIbm.js.map +0 -1
- package/webapp/dist/assets/diagram-E7M64L7V-C8eweQ7b.js.map +0 -1
- package/webapp/dist/assets/diagram-IFDJBPK2-DMdygRl0.js.map +0 -1
- package/webapp/dist/assets/diagram-P4PSJMXO-BQDZHb0a.js.map +0 -1
- package/webapp/dist/assets/erDiagram-INFDFZHY-C1HaXN6E.js.map +0 -1
- package/webapp/dist/assets/flowDiagram-PKNHOUZH-24nNqQyo.js.map +0 -1
- package/webapp/dist/assets/ganttDiagram-A5KZAMGK-BWPOFaLV.js.map +0 -1
- package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-D7_L-p_Y.js.map +0 -1
- package/webapp/dist/assets/graph-OHu4dL2n.js +0 -782
- package/webapp/dist/assets/graph-OHu4dL2n.js.map +0 -1
- package/webapp/dist/assets/infoDiagram-LFFYTUFH-CvaBM5j6.js.map +0 -1
- package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-DB1l2Uue.js +0 -966
- package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-DB1l2Uue.js.map +0 -1
- package/webapp/dist/assets/journeyDiagram-4ABVD52K-TQR6_teO.js.map +0 -1
- package/webapp/dist/assets/kanban-definition-K7BYSVSG-B-BOuC-U.js.map +0 -1
- package/webapp/dist/assets/layout-B8yqIqbx.js.map +0 -1
- package/webapp/dist/assets/linear-CoLfiZKK.js.map +0 -1
- package/webapp/dist/assets/mindmap-definition-YRQLILUH-P70BMIHI.js.map +0 -1
- package/webapp/dist/assets/pieDiagram-SKSYHLDU-DsS_4dTB.js.map +0 -1
- package/webapp/dist/assets/quadrantDiagram-337W2JSQ-DoM9PEq-.js.map +0 -1
- package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-Bn3lYMMI.js.map +0 -1
- package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-97kCegRT.js.map +0 -1
- package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-DXqjQjf6.js.map +0 -1
- package/webapp/dist/assets/stateDiagram-RAJIS63D-DQcTPKWP.js.map +0 -1
- package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-DHmxRVJn.js.map +0 -1
- package/webapp/dist/assets/timeline-definition-YZTLITO2-BlovQQ4B.js.map +0 -1
- package/webapp/dist/assets/treemap-KZPCXAKY-CGu93c9S.js.map +0 -1
- package/webapp/dist/assets/vennDiagram-LZ73GAT5-Do1jprrz.js +0 -2487
- package/webapp/dist/assets/vennDiagram-LZ73GAT5-Do1jprrz.js.map +0 -1
- package/webapp/dist/assets/xychartDiagram-JWTSCODW-BKa1DxVq.js.map +0 -1
package/dist/tools/fs.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.rmSymlinkTool = exports.createSymlinkTool = exports.readSymlinkTool = exports.moveDirTool = exports.moveFileTool = exports.mkDirTool = exports.rmFileTool = exports.rmDirTool = exports.listDirTool = void 0;
|
|
6
|
+
exports.rmSymlinkTool = exports.createSymlinkTool = exports.fsReadSymlinkTool = exports.readSymlinkTool = exports.moveDirTool = exports.moveFileTool = exports.mkDirTool = exports.rmFileTool = exports.rmDirTool = exports.fsListDirTool = exports.listDirTool = void 0;
|
|
7
7
|
/**
|
|
8
8
|
* Module: tools/fs
|
|
9
9
|
*
|
|
@@ -337,7 +337,7 @@ exports.listDirTool = {
|
|
|
337
337
|
: entry.type === 'symlink'
|
|
338
338
|
? '🔗'
|
|
339
339
|
: '❓';
|
|
340
|
-
const sizeStr = entry.size ? formatSize(entry.size)
|
|
340
|
+
const sizeStr = entry.size === undefined ? '-' : formatSize(entry.size);
|
|
341
341
|
const linesStr = entry.lines ? entry.lines.toString() : '-';
|
|
342
342
|
const targetTypeStr = entry.type === 'symlink' && entry.symlinkResolvedType
|
|
343
343
|
? ` (${entry.symlinkResolvedType})`
|
|
@@ -369,6 +369,220 @@ exports.listDirTool = {
|
|
|
369
369
|
}
|
|
370
370
|
},
|
|
371
371
|
};
|
|
372
|
+
exports.fsListDirTool = {
|
|
373
|
+
type: 'func',
|
|
374
|
+
name: 'fs_list_dir',
|
|
375
|
+
description: 'List local filesystem directory contents without restricting paths to rtws (runtime workspace).',
|
|
376
|
+
descriptionI18n: {
|
|
377
|
+
en: 'List local filesystem directory contents without restricting paths to rtws (runtime workspace).',
|
|
378
|
+
zh: '列出本机文件系统目录内容,不限制路径必须位于 rtws(运行时工作区)内。',
|
|
379
|
+
},
|
|
380
|
+
parameters: {
|
|
381
|
+
type: 'object',
|
|
382
|
+
additionalProperties: false,
|
|
383
|
+
properties: {
|
|
384
|
+
path: {
|
|
385
|
+
type: 'string',
|
|
386
|
+
description: "Directory path to read. Absolute paths are accepted; relative paths resolve from the current process cwd. Defaults to '.'.",
|
|
387
|
+
},
|
|
388
|
+
},
|
|
389
|
+
},
|
|
390
|
+
argsValidation: 'dominds',
|
|
391
|
+
call: async (_dlg, _caller, args) => {
|
|
392
|
+
const workLanguage = (0, work_language_1.getWorkLanguage)();
|
|
393
|
+
const labels = workLanguage === 'zh'
|
|
394
|
+
? {
|
|
395
|
+
notFound: (p) => `❌ **未找到**\n\n目录 \`${p}\` 不存在。`,
|
|
396
|
+
notDir: (p) => `❌ **错误**\n\n路径 \`${p}\` 不是目录。`,
|
|
397
|
+
readDirFailed: (msg) => `❌ **错误**\n\n读取目录失败:${msg}`,
|
|
398
|
+
dirHeader: '📁 **目录:**',
|
|
399
|
+
symlinkPathNotice: (p, target) => target
|
|
400
|
+
? `🔗 **说明:** \`${p}\` 是符号链接(→ \`${target}\`),已按目录跟随读取。`
|
|
401
|
+
: `🔗 **说明:** \`${p}\` 是符号链接,已按目录跟随读取。`,
|
|
402
|
+
emptyDir: '_此目录为空。_',
|
|
403
|
+
table: {
|
|
404
|
+
name: '名称',
|
|
405
|
+
type: '类型',
|
|
406
|
+
size: '大小',
|
|
407
|
+
lines: '行数',
|
|
408
|
+
target: '目标',
|
|
409
|
+
},
|
|
410
|
+
}
|
|
411
|
+
: {
|
|
412
|
+
notFound: (p) => `❌ **Not Found**\n\nDirectory \`${p}\` does not exist.`,
|
|
413
|
+
notDir: (p) => `❌ **Error**\n\nPath \`${p}\` is not a directory.`,
|
|
414
|
+
readDirFailed: (msg) => `❌ **Error**\n\nFailed to read directory: ${msg}`,
|
|
415
|
+
dirHeader: '📁 **Directory:**',
|
|
416
|
+
symlinkPathNotice: (p, target) => target
|
|
417
|
+
? `🔗 **Note:** \`${p}\` is a symlink (→ \`${target}\`), and was followed as a directory.`
|
|
418
|
+
: `🔗 **Note:** \`${p}\` is a symlink and was followed as a directory.`,
|
|
419
|
+
emptyDir: '_This directory is empty._',
|
|
420
|
+
table: {
|
|
421
|
+
name: 'Name',
|
|
422
|
+
type: 'Type',
|
|
423
|
+
size: 'Size',
|
|
424
|
+
lines: 'Lines',
|
|
425
|
+
target: 'Target',
|
|
426
|
+
},
|
|
427
|
+
};
|
|
428
|
+
let requestedPath = '.';
|
|
429
|
+
const pathValue = args['path'];
|
|
430
|
+
if (typeof pathValue === 'string' && pathValue.trim() !== '') {
|
|
431
|
+
requestedPath = pathValue.trim();
|
|
432
|
+
}
|
|
433
|
+
const dir = path_1.default.resolve(process.cwd(), requestedPath);
|
|
434
|
+
const displayPath = path_1.default.isAbsolute(requestedPath) ? dir : requestedPath;
|
|
435
|
+
try {
|
|
436
|
+
let inputPathIsSymlink = false;
|
|
437
|
+
let inputPathSymlinkTarget;
|
|
438
|
+
try {
|
|
439
|
+
const statsInfo = await statWithSymlinkInfo(dir);
|
|
440
|
+
inputPathIsSymlink = statsInfo.isSymlink;
|
|
441
|
+
inputPathSymlinkTarget = statsInfo.symlinkTarget;
|
|
442
|
+
if (!statsInfo.followStat.isDirectory()) {
|
|
443
|
+
return fail(labels.notDir(displayPath));
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
catch (error) {
|
|
447
|
+
if (typeof error === 'object' &&
|
|
448
|
+
error !== null &&
|
|
449
|
+
'code' in error &&
|
|
450
|
+
error.code === 'ENOENT') {
|
|
451
|
+
return fail(labels.notFound(displayPath));
|
|
452
|
+
}
|
|
453
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
454
|
+
return fail(labels.readDirFailed(msg));
|
|
455
|
+
}
|
|
456
|
+
const entries = await promises_1.default.readdir(dir, { withFileTypes: true });
|
|
457
|
+
const data = [];
|
|
458
|
+
for (const entry of entries) {
|
|
459
|
+
const entryPath = path_1.default.join(dir, entry.name);
|
|
460
|
+
const dirEntry = {
|
|
461
|
+
name: entry.name,
|
|
462
|
+
type: 'other',
|
|
463
|
+
};
|
|
464
|
+
try {
|
|
465
|
+
const stats = await promises_1.default.lstat(entryPath);
|
|
466
|
+
if (entry.isDirectory()) {
|
|
467
|
+
dirEntry.type = 'dir';
|
|
468
|
+
dirEntry.size = stats.size;
|
|
469
|
+
}
|
|
470
|
+
else if (entry.isFile()) {
|
|
471
|
+
dirEntry.type = 'file';
|
|
472
|
+
dirEntry.size = stats.size;
|
|
473
|
+
if (isTextFile(entry.name)) {
|
|
474
|
+
dirEntry.lines = await countLines(entryPath);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
else if (entry.isSymbolicLink()) {
|
|
478
|
+
dirEntry.type = 'symlink';
|
|
479
|
+
dirEntry.size = stats.size;
|
|
480
|
+
try {
|
|
481
|
+
const target = await promises_1.default.readlink(entryPath);
|
|
482
|
+
dirEntry.target = target;
|
|
483
|
+
try {
|
|
484
|
+
const targetStats = await promises_1.default.stat(entryPath);
|
|
485
|
+
if (targetStats.isDirectory()) {
|
|
486
|
+
dirEntry.symlinkResolvedType = 'dir';
|
|
487
|
+
}
|
|
488
|
+
else if (targetStats.isFile()) {
|
|
489
|
+
dirEntry.symlinkResolvedType = 'file';
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
dirEntry.symlinkResolvedType = 'other';
|
|
493
|
+
}
|
|
494
|
+
if (targetStats.isFile() && (isTextFile(entry.name) || isTextFile(target))) {
|
|
495
|
+
dirEntry.lines = await countLines(entryPath);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
catch (err) {
|
|
499
|
+
log_1.log.warn(`Failed to stat symlink target ${entryPath}:`, err);
|
|
500
|
+
dirEntry.symlinkResolvedType = 'broken';
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
catch (err) {
|
|
504
|
+
log_1.log.warn(`Failed to read symlink ${entryPath}:`, err);
|
|
505
|
+
dirEntry.target = '<unreadable>';
|
|
506
|
+
dirEntry.symlinkResolvedType = 'other';
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
dirEntry.type = 'other';
|
|
511
|
+
dirEntry.size = stats.size;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
catch (_error) {
|
|
515
|
+
if (entry.isDirectory()) {
|
|
516
|
+
dirEntry.type = 'dir';
|
|
517
|
+
}
|
|
518
|
+
else if (entry.isFile()) {
|
|
519
|
+
dirEntry.type = 'file';
|
|
520
|
+
}
|
|
521
|
+
else if (entry.isSymbolicLink()) {
|
|
522
|
+
dirEntry.type = 'symlink';
|
|
523
|
+
dirEntry.target = '<error>';
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
data.push(dirEntry);
|
|
527
|
+
}
|
|
528
|
+
let markdown = `${labels.dirHeader} \`${displayPath}\`\n\n`;
|
|
529
|
+
if (inputPathIsSymlink) {
|
|
530
|
+
markdown += `${labels.symlinkPathNotice(displayPath, inputPathSymlinkTarget)}\n\n`;
|
|
531
|
+
}
|
|
532
|
+
if (data.length === 0) {
|
|
533
|
+
markdown += labels.emptyDir;
|
|
534
|
+
}
|
|
535
|
+
else {
|
|
536
|
+
const shownEntries = data.slice(0, LIST_DIR_MAX_RENDERED_ENTRIES);
|
|
537
|
+
const omittedEntries = Math.max(0, data.length - shownEntries.length);
|
|
538
|
+
if (omittedEntries > 0) {
|
|
539
|
+
markdown +=
|
|
540
|
+
workLanguage === 'zh'
|
|
541
|
+
? `⚠️ **说明:** 目录项过多;为避免输出过长,仅展示前 ${shownEntries.length} 项,省略 ${omittedEntries} 项。\n\n`
|
|
542
|
+
: `⚠️ **Note:** Directory contains many entries; to keep the output bounded, showing the first ${shownEntries.length} entries and omitting ${omittedEntries}.\n\n`;
|
|
543
|
+
}
|
|
544
|
+
markdown += `| ${labels.table.name} | ${labels.table.type} | ${labels.table.size} | ${labels.table.lines} | ${labels.table.target} |\n`;
|
|
545
|
+
markdown += '|------|------|------|-------|--------|\n';
|
|
546
|
+
for (const entry of shownEntries) {
|
|
547
|
+
const typeIcon = entry.type === 'dir'
|
|
548
|
+
? '📁'
|
|
549
|
+
: entry.type === 'file'
|
|
550
|
+
? '📄'
|
|
551
|
+
: entry.type === 'symlink'
|
|
552
|
+
? '🔗'
|
|
553
|
+
: '❓';
|
|
554
|
+
const sizeStr = entry.size === undefined ? '-' : formatSize(entry.size);
|
|
555
|
+
const linesStr = entry.lines ? entry.lines.toString() : '-';
|
|
556
|
+
const targetTypeStr = entry.type === 'symlink' && entry.symlinkResolvedType
|
|
557
|
+
? ` (${entry.symlinkResolvedType})`
|
|
558
|
+
: '';
|
|
559
|
+
const renderedName = (0, output_limit_1.truncateInlineText)(entry.name, LIST_DIR_NAME_CHAR_LIMIT);
|
|
560
|
+
const targetStr = entry.target
|
|
561
|
+
? (0, output_limit_1.truncateInlineText)(`→ ${entry.target}${targetTypeStr}`, LIST_DIR_TARGET_CHAR_LIMIT)
|
|
562
|
+
: '-';
|
|
563
|
+
markdown += `| ${typeIcon} \`${renderedName}\` | ${entry.type} | ${sizeStr} | ${linesStr} | ${targetStr} |\n`;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
return ok(markdown);
|
|
567
|
+
}
|
|
568
|
+
catch (error) {
|
|
569
|
+
if (typeof error === 'object' &&
|
|
570
|
+
error !== null &&
|
|
571
|
+
'code' in error &&
|
|
572
|
+
error.code === 'ENOENT') {
|
|
573
|
+
return fail(labels.notFound(displayPath));
|
|
574
|
+
}
|
|
575
|
+
if (typeof error === 'object' &&
|
|
576
|
+
error !== null &&
|
|
577
|
+
'code' in error &&
|
|
578
|
+
error.code === 'ENOTDIR') {
|
|
579
|
+
return fail(labels.notDir(displayPath));
|
|
580
|
+
}
|
|
581
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
582
|
+
return fail(labels.readDirFailed(msg));
|
|
583
|
+
}
|
|
584
|
+
},
|
|
585
|
+
};
|
|
372
586
|
exports.rmDirTool = {
|
|
373
587
|
type: 'func',
|
|
374
588
|
name: 'rm_dir',
|
|
@@ -1045,6 +1259,71 @@ exports.readSymlinkTool = {
|
|
|
1045
1259
|
}
|
|
1046
1260
|
},
|
|
1047
1261
|
};
|
|
1262
|
+
exports.fsReadSymlinkTool = {
|
|
1263
|
+
type: 'func',
|
|
1264
|
+
name: 'fs_read_symlink',
|
|
1265
|
+
description: 'Read a local filesystem symlink target without following it, without restricting paths to rtws.',
|
|
1266
|
+
descriptionI18n: {
|
|
1267
|
+
en: 'Read a local filesystem symlink target without following it, without restricting paths to rtws.',
|
|
1268
|
+
zh: '读取本机文件系统符号链接目标(不跟随链接),不限制路径必须位于 rtws 内。',
|
|
1269
|
+
},
|
|
1270
|
+
parameters: {
|
|
1271
|
+
type: 'object',
|
|
1272
|
+
additionalProperties: false,
|
|
1273
|
+
required: ['path'],
|
|
1274
|
+
properties: {
|
|
1275
|
+
path: {
|
|
1276
|
+
type: 'string',
|
|
1277
|
+
description: 'Symlink path. Absolute paths are accepted; relative paths resolve from the current process cwd.',
|
|
1278
|
+
},
|
|
1279
|
+
},
|
|
1280
|
+
},
|
|
1281
|
+
argsValidation: 'dominds',
|
|
1282
|
+
call: async (_dlg, _caller, args) => {
|
|
1283
|
+
const pathValue = args['path'];
|
|
1284
|
+
const requestedPath = typeof pathValue === 'string' ? pathValue.trim() : '';
|
|
1285
|
+
if (!requestedPath) {
|
|
1286
|
+
return failYaml([
|
|
1287
|
+
`status: error`,
|
|
1288
|
+
`mode: fs_read_symlink`,
|
|
1289
|
+
`error: PATH_REQUIRED`,
|
|
1290
|
+
`summary: ${yamlQuote('Fs-read-symlink failed: path required.')}`,
|
|
1291
|
+
].join('\n'));
|
|
1292
|
+
}
|
|
1293
|
+
const absPath = path_1.default.resolve(process.cwd(), requestedPath);
|
|
1294
|
+
const displayPath = path_1.default.isAbsolute(requestedPath) ? absPath : requestedPath;
|
|
1295
|
+
try {
|
|
1296
|
+
const pathStat = await promises_1.default.lstat(absPath);
|
|
1297
|
+
if (!pathStat.isSymbolicLink()) {
|
|
1298
|
+
return failYaml([
|
|
1299
|
+
`status: error`,
|
|
1300
|
+
`mode: fs_read_symlink`,
|
|
1301
|
+
`path: ${yamlQuote(displayPath)}`,
|
|
1302
|
+
`error: NOT_SYMLINK`,
|
|
1303
|
+
`summary: ${yamlQuote('Fs-read-symlink failed: path is not a symlink.')}`,
|
|
1304
|
+
].join('\n'));
|
|
1305
|
+
}
|
|
1306
|
+
const target = await promises_1.default.readlink(absPath);
|
|
1307
|
+
return okYaml([
|
|
1308
|
+
`status: ok`,
|
|
1309
|
+
`mode: fs_read_symlink`,
|
|
1310
|
+
`path: ${yamlQuote(displayPath)}`,
|
|
1311
|
+
`target: ${yamlQuote(target)}`,
|
|
1312
|
+
`summary: ${yamlQuote(`Fs-read-symlink: ${displayPath} -> ${target}.`)}`,
|
|
1313
|
+
].join('\n'));
|
|
1314
|
+
}
|
|
1315
|
+
catch (error) {
|
|
1316
|
+
const yaml = [
|
|
1317
|
+
`status: error`,
|
|
1318
|
+
`mode: fs_read_symlink`,
|
|
1319
|
+
`path: ${yamlQuote(displayPath)}`,
|
|
1320
|
+
`error: FAILED`,
|
|
1321
|
+
`summary: ${yamlQuote(error instanceof Error ? error.message : String(error))}`,
|
|
1322
|
+
].join('\n');
|
|
1323
|
+
return failYaml(yaml);
|
|
1324
|
+
}
|
|
1325
|
+
},
|
|
1326
|
+
};
|
|
1048
1327
|
exports.createSymlinkTool = {
|
|
1049
1328
|
type: 'func',
|
|
1050
1329
|
name: 'create_symlink',
|
package/dist/tools/os.d.ts
CHANGED
|
@@ -6,8 +6,19 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { FuncTool, ReminderOwner } from '../tool';
|
|
8
8
|
export declare function resetTrackedDaemonsForTests(): void;
|
|
9
|
+
type ShellSpawnSpec = Readonly<{
|
|
10
|
+
command: string;
|
|
11
|
+
args: string[];
|
|
12
|
+
shellLabel: string;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function resolveShellCmdSpawnSpecForTests(command: string, shell: string | undefined, platform: NodeJS.Platform): ShellSpawnSpec;
|
|
15
|
+
export declare function resolveReadonlyShellSpawnSpecForTests(command: string, platform: NodeJS.Platform): Readonly<{
|
|
16
|
+
command: string;
|
|
17
|
+
args: string[];
|
|
18
|
+
}>;
|
|
9
19
|
export declare const shellCmdReminderOwner: ReminderOwner;
|
|
10
20
|
export declare const shellCmdTool: FuncTool;
|
|
11
21
|
export declare const readonlyShellTool: FuncTool;
|
|
12
22
|
export declare const stopDaemonTool: FuncTool;
|
|
13
23
|
export declare const getDaemonOutputTool: FuncTool;
|
|
24
|
+
export {};
|
package/dist/tools/os.js
CHANGED
|
@@ -11,6 +11,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.getDaemonOutputTool = exports.stopDaemonTool = exports.readonlyShellTool = exports.shellCmdTool = exports.shellCmdReminderOwner = void 0;
|
|
13
13
|
exports.resetTrackedDaemonsForTests = resetTrackedDaemonsForTests;
|
|
14
|
+
exports.resolveShellCmdSpawnSpecForTests = resolveShellCmdSpawnSpecForTests;
|
|
15
|
+
exports.resolveReadonlyShellSpawnSpecForTests = resolveReadonlyShellSpawnSpecForTests;
|
|
14
16
|
const time_1 = require("@longrun-ai/kernel/utils/time");
|
|
15
17
|
const child_process_1 = require("child_process");
|
|
16
18
|
const crypto_1 = __importDefault(require("crypto"));
|
|
@@ -278,7 +280,7 @@ async function ensureTrackedDaemonForAgent(agentId, pid) {
|
|
|
278
280
|
if (existing) {
|
|
279
281
|
return existing;
|
|
280
282
|
}
|
|
281
|
-
const reminders = await (0, shared_reminders_1.
|
|
283
|
+
const reminders = await (0, shared_reminders_1.loadSharedReminders)({ kind: 'agent', agentId });
|
|
282
284
|
for (const reminder of reminders) {
|
|
283
285
|
if (isShellCmdReminder(reminder) && reminder.meta.pid === pid) {
|
|
284
286
|
return await ensureTrackedDaemonFromReminder(reminder);
|
|
@@ -679,7 +681,7 @@ async function removeDaemonRemindersForPid(dlg, pid) {
|
|
|
679
681
|
for (let i = indicesToRemove.length - 1; i >= 0; i--) {
|
|
680
682
|
dlg.deleteReminder(indicesToRemove[i]);
|
|
681
683
|
}
|
|
682
|
-
await (0, shared_reminders_1.
|
|
684
|
+
await (0, shared_reminders_1.mutateSharedReminders)({ kind: 'agent', agentId: dlg.agentId }, (reminders) => {
|
|
683
685
|
for (let i = reminders.length - 1; i >= 0; i--) {
|
|
684
686
|
const reminder = reminders[i];
|
|
685
687
|
if (isShellCmdReminder(reminder) && reminder.meta.pid === pid) {
|
|
@@ -816,9 +818,12 @@ function parseGetDaemonOutputArgs(args) {
|
|
|
816
818
|
}
|
|
817
819
|
return { pid, stdout, stderr };
|
|
818
820
|
}
|
|
819
|
-
function
|
|
821
|
+
function encodePowerShellCommand(command) {
|
|
822
|
+
return Buffer.from(command, 'utf16le').toString('base64');
|
|
823
|
+
}
|
|
824
|
+
function resolveShellCmdSpawnSpec(command, shell, platform = process.platform) {
|
|
820
825
|
const preferredShell = typeof shell === 'string' && shell.trim() !== '' ? shell.trim() : undefined;
|
|
821
|
-
if (
|
|
826
|
+
if (platform === 'win32') {
|
|
822
827
|
if (preferredShell) {
|
|
823
828
|
const base = path_1.default.basename(preferredShell).toLowerCase();
|
|
824
829
|
if (base === 'powershell' ||
|
|
@@ -827,14 +832,14 @@ function resolveShellCmdSpawnSpec(command, shell) {
|
|
|
827
832
|
base === 'pwsh.exe') {
|
|
828
833
|
return {
|
|
829
834
|
command: preferredShell,
|
|
830
|
-
args: ['-NoLogo', '-NoProfile', '-
|
|
835
|
+
args: ['-NoLogo', '-NoProfile', '-EncodedCommand', encodePowerShellCommand(command)],
|
|
831
836
|
shellLabel: preferredShell,
|
|
832
837
|
};
|
|
833
838
|
}
|
|
834
839
|
if (base === 'cmd' || base === 'cmd.exe') {
|
|
835
840
|
return {
|
|
836
841
|
command: preferredShell,
|
|
837
|
-
args: ['/d', '/
|
|
842
|
+
args: ['/d', '/c', command],
|
|
838
843
|
shellLabel: preferredShell,
|
|
839
844
|
};
|
|
840
845
|
}
|
|
@@ -846,7 +851,7 @@ function resolveShellCmdSpawnSpec(command, shell) {
|
|
|
846
851
|
}
|
|
847
852
|
return {
|
|
848
853
|
command: 'cmd.exe',
|
|
849
|
-
args: ['/d', '/
|
|
854
|
+
args: ['/d', '/c', command],
|
|
850
855
|
shellLabel: 'cmd.exe',
|
|
851
856
|
};
|
|
852
857
|
}
|
|
@@ -857,12 +862,18 @@ function resolveShellCmdSpawnSpec(command, shell) {
|
|
|
857
862
|
shellLabel: resolvedShell,
|
|
858
863
|
};
|
|
859
864
|
}
|
|
860
|
-
function
|
|
861
|
-
|
|
862
|
-
|
|
865
|
+
function resolveShellCmdSpawnSpecForTests(command, shell, platform) {
|
|
866
|
+
return resolveShellCmdSpawnSpec(command, shell, platform);
|
|
867
|
+
}
|
|
868
|
+
function resolveReadonlyShellSpawnSpec(command, platform = process.platform) {
|
|
869
|
+
if (platform === 'win32') {
|
|
870
|
+
return { command: 'cmd.exe', args: ['/d', '/c', command] };
|
|
863
871
|
}
|
|
864
872
|
return { command: 'bash', args: ['-c', command] };
|
|
865
873
|
}
|
|
874
|
+
function resolveReadonlyShellSpawnSpecForTests(command, platform) {
|
|
875
|
+
return resolveReadonlyShellSpawnSpec(command, platform);
|
|
876
|
+
}
|
|
866
877
|
function resolveCmdRunnerEntrypointAbs() {
|
|
867
878
|
const distCandidate = path_1.default.resolve(__dirname, 'cmd-runner.js');
|
|
868
879
|
if (fs_1.default.existsSync(distCandidate)) {
|
|
@@ -1105,7 +1116,7 @@ const shellCmdSchema = {
|
|
|
1105
1116
|
},
|
|
1106
1117
|
shell: {
|
|
1107
1118
|
type: 'string',
|
|
1108
|
-
description: 'Shell to use for execution (default: bash on Linux/macOS; cmd.exe on Windows)',
|
|
1119
|
+
description: 'Shell to use for execution (default: bash on Linux/macOS; cmd.exe on Windows). On Windows, powershell.exe/pwsh commands are passed via -EncodedCommand.',
|
|
1109
1120
|
},
|
|
1110
1121
|
scrollbackLines: {
|
|
1111
1122
|
type: 'number',
|
|
@@ -1523,11 +1534,11 @@ exports.shellCmdTool = {
|
|
|
1523
1534
|
content: `[Daemon PID ${initialMessage.daemonPid} - This content should not be visible, check dynamic rendering]`,
|
|
1524
1535
|
owner: exports.shellCmdReminderOwner,
|
|
1525
1536
|
meta: reminderMeta,
|
|
1526
|
-
scope: '
|
|
1537
|
+
scope: 'runtime',
|
|
1527
1538
|
renderMode: 'markdown',
|
|
1528
1539
|
});
|
|
1529
1540
|
try {
|
|
1530
|
-
await (0, shared_reminders_1.
|
|
1541
|
+
await (0, shared_reminders_1.mutateSharedReminders)({ kind: 'agent', agentId: dlg.agentId }, (reminders) => {
|
|
1531
1542
|
reminders.push(reminder);
|
|
1532
1543
|
});
|
|
1533
1544
|
dlg.touchReminders();
|
|
@@ -2252,7 +2263,7 @@ exports.stopDaemonTool = {
|
|
|
2252
2263
|
const language = (0, work_language_1.getWorkLanguage)();
|
|
2253
2264
|
const t = getOsToolMessages(language);
|
|
2254
2265
|
const { pid, entirePg } = parseStopDaemonArgs(args);
|
|
2255
|
-
const reminders = await (0, shared_reminders_1.
|
|
2266
|
+
const reminders = await (0, shared_reminders_1.loadSharedReminders)({ kind: 'agent', agentId: dlg.agentId });
|
|
2256
2267
|
const reminder = reminders.find((candidate) => isShellCmdReminder(candidate) && candidate.meta.pid === pid);
|
|
2257
2268
|
if (!reminder || !isShellCmdReminder(reminder)) {
|
|
2258
2269
|
return (0, tool_1.toolFailure)(t.noDaemonFound(pid));
|
|
@@ -2309,7 +2320,7 @@ exports.getDaemonOutputTool = {
|
|
|
2309
2320
|
const language = (0, work_language_1.getWorkLanguage)();
|
|
2310
2321
|
const t = getOsToolMessages(language);
|
|
2311
2322
|
const { pid, stdout, stderr } = parseGetDaemonOutputArgs(args);
|
|
2312
|
-
const reminders = await (0, shared_reminders_1.
|
|
2323
|
+
const reminders = await (0, shared_reminders_1.loadSharedReminders)({ kind: 'agent', agentId: dlg.agentId });
|
|
2313
2324
|
const reminder = reminders.find((candidate) => isShellCmdReminder(candidate) && candidate.meta.pid === pid);
|
|
2314
2325
|
if (!reminder || !isShellCmdReminder(reminder)) {
|
|
2315
2326
|
return (0, tool_1.toolFailure)(t.noDaemonFound(pid));
|
package/dist/tools/picture.d.ts
CHANGED
package/dist/tools/picture.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.writePictureTool = exports.readPictureTool = void 0;
|
|
6
|
+
exports.writePictureTool = exports.fsReadPictureTool = exports.readPictureTool = void 0;
|
|
7
7
|
const crypto_1 = require("crypto");
|
|
8
8
|
const promises_1 = __importDefault(require("fs/promises"));
|
|
9
9
|
const path_1 = __importDefault(require("path"));
|
|
@@ -33,6 +33,12 @@ function ensureInsideWorkspace(rel) {
|
|
|
33
33
|
}
|
|
34
34
|
throw new Error('Path must be within rtws (runtime workspace)');
|
|
35
35
|
}
|
|
36
|
+
function resolveLocalFilesystemPath(inputPath) {
|
|
37
|
+
return path_1.default.resolve(process.cwd(), inputPath);
|
|
38
|
+
}
|
|
39
|
+
function displayLocalFilesystemPath(inputPath, absPath) {
|
|
40
|
+
return path_1.default.isAbsolute(inputPath) ? absPath : inputPath;
|
|
41
|
+
}
|
|
36
42
|
function requirePathArg(args) {
|
|
37
43
|
const value = args['path'];
|
|
38
44
|
if (typeof value !== 'string' || value.trim() === '') {
|
|
@@ -246,6 +252,63 @@ exports.readPictureTool = {
|
|
|
246
252
|
}
|
|
247
253
|
},
|
|
248
254
|
};
|
|
255
|
+
exports.fsReadPictureTool = {
|
|
256
|
+
type: 'func',
|
|
257
|
+
name: 'fs_read_picture',
|
|
258
|
+
description: 'Read a PNG/JPEG/WebP/GIF image from the local filesystem without restricting paths to rtws, then attach it as an image content item for the next LLM context.',
|
|
259
|
+
descriptionI18n: {
|
|
260
|
+
en: 'Read a PNG/JPEG/WebP/GIF image from the local filesystem without restricting paths to rtws, then attach it as an image content item for the next LLM context.',
|
|
261
|
+
zh: '读取本机文件系统中的 PNG/JPEG/WebP/GIF 图片(不限制路径必须位于 rtws 内),并作为图片 content item 放入后续 LLM 上下文。',
|
|
262
|
+
},
|
|
263
|
+
parameters: {
|
|
264
|
+
type: 'object',
|
|
265
|
+
additionalProperties: false,
|
|
266
|
+
properties: {
|
|
267
|
+
path: {
|
|
268
|
+
type: 'string',
|
|
269
|
+
description: 'Image path to read. Absolute paths are accepted; relative paths resolve from the current process cwd. Supported extensions: .png, .jpg, .jpeg, .webp, .gif.',
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
required: ['path'],
|
|
273
|
+
},
|
|
274
|
+
argsValidation: 'dominds',
|
|
275
|
+
call: async (dlg, _caller, args) => {
|
|
276
|
+
try {
|
|
277
|
+
const requestedPath = requirePathArg(args);
|
|
278
|
+
const absPath = resolveLocalFilesystemPath(requestedPath);
|
|
279
|
+
const displayPath = displayLocalFilesystemPath(requestedPath, absPath);
|
|
280
|
+
const mimeType = extToMimeType(displayPath);
|
|
281
|
+
if (mimeType === null) {
|
|
282
|
+
return fail('Unsupported image extension. Supported extensions: .png, .jpg, .jpeg, .webp, .gif');
|
|
283
|
+
}
|
|
284
|
+
const stat = await promises_1.default.stat(absPath);
|
|
285
|
+
if (!stat.isFile())
|
|
286
|
+
return fail(`Path is not a file: ${displayPath}`);
|
|
287
|
+
if (stat.size <= 0 || stat.size > PICTURE_MAX_BYTES) {
|
|
288
|
+
return fail(`Image must be between 1 byte and ${String(PICTURE_MAX_BYTES)} bytes`);
|
|
289
|
+
}
|
|
290
|
+
const bytes = await promises_1.default.readFile(absPath);
|
|
291
|
+
validateImageBytesMatchMimeType(bytes, mimeType);
|
|
292
|
+
const item = await persistPictureArtifact({
|
|
293
|
+
dlg,
|
|
294
|
+
toolName: 'fs_read_picture',
|
|
295
|
+
mimeType,
|
|
296
|
+
bytes,
|
|
297
|
+
});
|
|
298
|
+
return ok(formatPictureResultYaml({
|
|
299
|
+
status: 'ok',
|
|
300
|
+
action: 'fs_read_picture',
|
|
301
|
+
path: displayPath,
|
|
302
|
+
mimeType,
|
|
303
|
+
byteLength: bytes.length,
|
|
304
|
+
artifactRelPath: item.artifact.relPath,
|
|
305
|
+
}), [item]);
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
return fail(error instanceof Error ? error.message : String(error));
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
};
|
|
249
312
|
exports.writePictureTool = {
|
|
250
313
|
type: 'func',
|
|
251
314
|
name: 'write_picture',
|
|
@@ -12,6 +12,11 @@ Typical uses:
|
|
|
12
12
|
- read-only `git status` / `git diff` / `git log` / `git show`
|
|
13
13
|
- version probes and simple filesystem inspection
|
|
14
14
|
|
|
15
|
+
Windows notes:
|
|
16
|
+
|
|
17
|
+
- Prefer no-space forward-slash paths such as `D:/path/to/file`
|
|
18
|
+
- Avoid nested `cmd /c "..."`
|
|
19
|
+
|
|
15
20
|
Example:
|
|
16
21
|
|
|
17
22
|
```typescript
|
|
@@ -26,20 +26,6 @@
|
|
|
26
26
|
- Use the correct reminder id
|
|
27
27
|
- First use `add_reminder` to create a reminder
|
|
28
28
|
|
|
29
|
-
### REMINDER_INVALID_POSITION
|
|
30
|
-
|
|
31
|
-
**Description:** Reminder position is invalid.
|
|
32
|
-
|
|
33
|
-
**Cause:**
|
|
34
|
-
|
|
35
|
-
- Position is out of valid range
|
|
36
|
-
- Position format is incorrect
|
|
37
|
-
|
|
38
|
-
**Solution:**
|
|
39
|
-
|
|
40
|
-
- Ensure position is between 1 and current reminder count
|
|
41
|
-
- By default, not specifying position will append to the end
|
|
42
|
-
|
|
43
29
|
### TASKDOC_CATEGORY_INVALID
|
|
44
30
|
|
|
45
31
|
**Description:** Taskdoc category is invalid.
|
|
@@ -85,13 +71,13 @@
|
|
|
85
71
|
|
|
86
72
|
## Frequently Asked Questions
|
|
87
73
|
|
|
88
|
-
### Q: What's the difference between dialog
|
|
74
|
+
### Q: What's the difference between dialog, task, agent reminders, and memory?
|
|
89
75
|
|
|
90
|
-
A: `dialog` reminders are only for the current dialog's
|
|
76
|
+
A: `dialog` reminders are only for the current dialog's current work. `task` reminders are for current work under the same Taskdoc and are the default for `add_reminder`. `agent` reminders stay visible in all later dialogs you lead, but only for urgent, short-lived, globally visible cues. None of them are long-term knowledge. `personal_memory` is for durable facts and reusable knowledge saved to disk; if the information should synchronize the team's current effective state, key decisions, next step, or still-active blockers, write it to Taskdoc `progress` instead of a reminder.
|
|
91
77
|
|
|
92
|
-
### Q: How do I choose `
|
|
78
|
+
### Q: How do I choose `dialog`, `task`, and `agent`?
|
|
93
79
|
|
|
94
|
-
A:
|
|
80
|
+
A: Default to `task` so the reminder remains visible when continuing the same Taskdoc in a new dialog. Use `dialog` only for truly dialog-local notes; use `agent` only for urgent, short-lived, globally visible cues.
|
|
95
81
|
|
|
96
82
|
### Q: Do do_mind / mind_more / change_mind / never_mind start a new course?
|
|
97
83
|
|
|
@@ -111,4 +97,4 @@ A: There's no strict limit, but it's recommended to keep the number of reminders
|
|
|
111
97
|
|
|
112
98
|
### Q: How do I view all current reminders?
|
|
113
99
|
|
|
114
|
-
A: The agent can access all visible reminders by `reminder_id` during response generation. That includes current-dialog reminders plus any visible
|
|
100
|
+
A: The agent can access all visible reminders by `reminder_id` during response generation. That includes current-dialog reminders plus any visible task/agent/system reminders available to you.
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
control is Dominds' **dialog control toolset** for managing dialog state, reminders, taskdocs, and inter-dialog reply closure semantics:
|
|
28
28
|
|
|
29
|
-
- **Reminder management**:
|
|
29
|
+
- **Reminder management**: Three reminder scopes: `dialog` / `task` / `agent`. Default to `task` for current work under the same Taskdoc; use `dialog` only for truly dialog-local notes; use `agent` only for urgent, short-lived, globally visible cues
|
|
30
30
|
- **Taskdoc operations**: Append to, replace, or delete task contract sections (goals/constraints/progress); within Taskdoc, `progress` is the team-shared, quasi-real-time, scannable task bulletin board
|
|
31
31
|
- **Context maintenance**: Reduce cognitive load without losing key resume state
|
|
32
32
|
- **Reply routing**: Separate `tellaskBack`, `replyTellask*`, and plain text by responsibility in Side Dialog / ask-back flows
|
|
@@ -51,7 +51,7 @@ control is Dominds' **dialog control toolset** for managing dialog state, remind
|
|
|
51
51
|
|
|
52
52
|
### Reminder
|
|
53
53
|
|
|
54
|
-
Reminders are temporary
|
|
54
|
+
Reminders are temporary current-work information for:
|
|
55
55
|
|
|
56
56
|
- Marking pending tasks
|
|
57
57
|
- Tracking current next steps / blockers
|
|
@@ -62,8 +62,9 @@ Reminders are not for manually copying Dominds runtime-maintained environment st
|
|
|
62
62
|
|
|
63
63
|
Scope rule:
|
|
64
64
|
|
|
65
|
-
- `dialog`: current-dialog
|
|
66
|
-
- `
|
|
65
|
+
- `dialog`: current-dialog current work
|
|
66
|
+
- `task`: current work under the current Taskdoc, and the default scope
|
|
67
|
+
- `agent`: urgent, short-lived, globally visible cues you should keep seeing in all later dialogs you lead
|
|
67
68
|
|
|
68
69
|
### Taskdoc
|
|
69
70
|
|