dominds 1.4.2 → 1.5.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 +24 -0
- package/README.zh.md +24 -0
- package/dist/apps/app-json.js +38 -3
- package/dist/apps/dialog-run-controls.js +4 -0
- package/dist/apps/enabled-apps.js +8 -1
- package/dist/apps/installed-file.js +207 -0
- package/dist/apps/run-app-json.js +6 -6
- package/dist/apps/runtime-port.js +91 -0
- package/dist/apps/runtime.js +316 -68
- package/dist/apps-host/client.js +153 -3
- package/dist/apps-host/host.js +339 -2
- package/dist/apps-host/ipc-types.js +215 -30
- package/dist/cli/install.js +21 -1
- package/dist/dialog-fork.js +609 -0
- package/dist/dialog.js +2 -2
- package/dist/docs/agent-priming.md +38 -0
- package/dist/docs/agent-priming.zh.md +34 -0
- package/dist/docs/app-constitution.md +153 -2
- package/dist/docs/app-constitution.zh.md +153 -2
- package/dist/docs/dialog-persistence.md +31 -0
- package/dist/docs/dialog-persistence.zh.md +31 -0
- package/dist/docs/dialog-system.md +29 -0
- package/dist/docs/dialog-system.zh.md +29 -0
- package/dist/docs/kernel-app-architecture.md +286 -0
- package/dist/docs/kernel-app-architecture.zh.md +285 -0
- package/dist/llm/defaults.yaml +16 -0
- package/dist/llm/driver-entry.js +28 -0
- package/dist/llm/driver-v2/context-health.js +121 -0
- package/dist/llm/driver-v2/context.js +56 -0
- package/dist/llm/driver-v2/core.js +1545 -0
- package/dist/llm/driver-v2/index.js +26 -0
- package/dist/llm/driver-v2/orchestrator.js +158 -0
- package/dist/llm/driver-v2/policy.js +129 -0
- package/dist/llm/driver-v2/restore-dialog-hierarchy.js +73 -0
- package/dist/llm/driver-v2/round.js +366 -0
- package/dist/llm/driver-v2/runtime-utils.js +365 -0
- package/dist/llm/driver-v2/saying-events.js +20 -0
- package/dist/llm/driver-v2/subdialog-txn.js +42 -0
- package/dist/llm/driver-v2/supdialog-response.js +400 -0
- package/dist/llm/driver-v2/tellask-bridge.js +1148 -0
- package/dist/llm/driver-v2/types.js +10 -0
- package/dist/llm/driver-v2-ref-only/context-health.js +121 -0
- package/dist/llm/driver-v2-ref-only/context.js +17 -0
- package/dist/llm/driver-v2-ref-only/core.js +1710 -0
- package/dist/llm/driver-v2-ref-only/index.js +26 -0
- package/dist/llm/driver-v2-ref-only/orchestrator.js +158 -0
- package/dist/llm/driver-v2-ref-only/policy.js +129 -0
- package/dist/llm/driver-v2-ref-only/restore-dialog-hierarchy.js +73 -0
- package/dist/llm/driver-v2-ref-only/round.js +366 -0
- package/dist/llm/driver-v2-ref-only/runtime-utils.js +473 -0
- package/dist/llm/driver-v2-ref-only/saying-events.js +18 -0
- package/dist/llm/driver-v2-ref-only/subdialog-txn.js +42 -0
- package/dist/llm/driver-v2-ref-only/supdialog-response.js +453 -0
- package/dist/llm/driver-v2-ref-only/tellask-bridge.js +1178 -0
- package/dist/llm/driver-v2-ref-only/types.js +10 -0
- package/dist/llm/gen/anthropic.js +68 -15
- package/dist/llm/gen/codex.js +59 -10
- package/dist/llm/gen/openai-compatible.js +38 -9
- package/dist/llm/gen/openai.js +58 -11
- package/dist/llm/gen/tool-output-limit.js +50 -0
- package/dist/llm/kernel-driver/subdialog.js +23 -12
- package/dist/llm/kernel-driver/tellask-special.js +20 -4
- package/dist/minds/load.js +7 -0
- package/dist/persistence.js +216 -30
- package/dist/priming.js +171 -18
- package/dist/server/api-routes.js +82 -0
- package/dist/server/setup-routes.js +15 -0
- package/dist/shared/types/storage.js +77 -0
- package/dist/static/assets/{_basePickBy-B2o4z1Hf.js → _basePickBy-B-A5XrWM.js} +3 -3
- package/dist/static/assets/{_basePickBy-B2o4z1Hf.js.map → _basePickBy-B-A5XrWM.js.map} +1 -1
- package/dist/static/assets/{_baseUniq-CLmcxjdl.js → _baseUniq-BANLb0cu.js} +2 -2
- package/dist/static/assets/{_baseUniq-CLmcxjdl.js.map → _baseUniq-BANLb0cu.js.map} +1 -1
- package/dist/static/assets/{arc-CymD_KN7.js → arc-CYZYnojf.js} +2 -2
- package/dist/static/assets/{arc-CymD_KN7.js.map → arc-CYZYnojf.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-DJQfSJUH.js → architectureDiagram-VXUJARFQ-Cxf4pmYG.js} +7 -7
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-DJQfSJUH.js.map → architectureDiagram-VXUJARFQ-Cxf4pmYG.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-pHVz60D0.js → blockDiagram-VD42YOAC-wvs0G30c.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-pHVz60D0.js.map → blockDiagram-VD42YOAC-wvs0G30c.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-B0WnCfAT.js → c4Diagram-YG6GDRKO-BKFNexn4.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-B0WnCfAT.js.map → c4Diagram-YG6GDRKO-BKFNexn4.js.map} +1 -1
- package/dist/static/assets/{channel-CX9BlKil.js → channel-_1qpxJWy.js} +2 -2
- package/dist/static/assets/{channel-CX9BlKil.js.map → channel-_1qpxJWy.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-lXArRj3o.js → chunk-4BX2VUAB-BIdC0phm.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-lXArRj3o.js.map → chunk-4BX2VUAB-BIdC0phm.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-CdqwynH9.js → chunk-55IACEB6-BNvGenQ9.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-CdqwynH9.js.map → chunk-55IACEB6-BNvGenQ9.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-Y-uXcJst.js → chunk-B4BG7PRW-jmf-1Wv7.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-Y-uXcJst.js.map → chunk-B4BG7PRW-jmf-1Wv7.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-C5xSbRST.js → chunk-DI55MBZ5-nmEmcikR.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-C5xSbRST.js.map → chunk-DI55MBZ5-nmEmcikR.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-5uefwCjI.js → chunk-FMBD7UC4-kGysaq_j.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-5uefwCjI.js.map → chunk-FMBD7UC4-kGysaq_j.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-DzWVcvpI.js → chunk-QN33PNHL-8JwMLFIJ.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-DzWVcvpI.js.map → chunk-QN33PNHL-8JwMLFIJ.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-BrrvAZdP.js → chunk-QZHKN3VN-DZleEj00.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-BrrvAZdP.js.map → chunk-QZHKN3VN-DZleEj00.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-DyKOlPTY.js → chunk-TZMSLE5B-CXxl_uqH.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-DyKOlPTY.js.map → chunk-TZMSLE5B-CXxl_uqH.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-FCrnlCWC.js → classDiagram-2ON5EDUG-C-7R0QB6.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-FCrnlCWC.js.map → classDiagram-2ON5EDUG-C-7R0QB6.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-FCrnlCWC.js → classDiagram-v2-WZHVMYZB-C-7R0QB6.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-FCrnlCWC.js.map → classDiagram-v2-WZHVMYZB-C-7R0QB6.js.map} +1 -1
- package/dist/static/assets/{clone-BlI81KqZ.js → clone-BwOKYSj8.js} +2 -2
- package/dist/static/assets/{clone-BlI81KqZ.js.map → clone-BwOKYSj8.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-yM7S2atz.js → cose-bilkent-S5V4N54A-BCBalM7p.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-yM7S2atz.js.map → cose-bilkent-S5V4N54A-BCBalM7p.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-BcweuZHt.js → dagre-6UL2VRFP-uV2ekQoj.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-BcweuZHt.js.map → dagre-6UL2VRFP-uV2ekQoj.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-D4-QwLW1.js → diagram-PSM6KHXK-D-ZMog1-.js} +8 -8
- package/dist/static/assets/{diagram-PSM6KHXK-D4-QwLW1.js.map → diagram-PSM6KHXK-D-ZMog1-.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-BVbuejJn.js → diagram-QEK2KX5R-BThSELUH.js} +7 -7
- package/dist/static/assets/{diagram-QEK2KX5R-BVbuejJn.js.map → diagram-QEK2KX5R-BThSELUH.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-pB6N6Tq_.js → diagram-S2PKOQOG-Di-YN5cd.js} +7 -7
- package/dist/static/assets/{diagram-S2PKOQOG-pB6N6Tq_.js.map → diagram-S2PKOQOG-Di-YN5cd.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-DLKmthuw.js → erDiagram-Q2GNP2WA-lBZ9DITn.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-DLKmthuw.js.map → erDiagram-Q2GNP2WA-lBZ9DITn.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-BsBhWukh.js → flowDiagram-NV44I4VS-C_60PNQR.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-BsBhWukh.js.map → flowDiagram-NV44I4VS-C_60PNQR.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-Debz-J-C.js → ganttDiagram-JELNMOA3-Dvqq-VHJ.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-Debz-J-C.js.map → ganttDiagram-JELNMOA3-Dvqq-VHJ.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-BnAPFBGR.js → gitGraphDiagram-V2S2FVAM-BTj8orRe.js} +8 -8
- package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-BnAPFBGR.js.map → gitGraphDiagram-V2S2FVAM-BTj8orRe.js.map} +1 -1
- package/dist/static/assets/{graph-DbzWiBNK.js → graph-BqCzR2Nl.js} +3 -3
- package/dist/static/assets/{graph-DbzWiBNK.js.map → graph-BqCzR2Nl.js.map} +1 -1
- package/dist/static/assets/{index-B-8J28g7.js → index-DrTqAfFy.js} +386 -201
- package/dist/static/assets/index-DrTqAfFy.js.map +1 -0
- package/dist/static/assets/{infoDiagram-HS3SLOUP-CZ5hWoxV.js → infoDiagram-HS3SLOUP-DlC6wsrv.js} +6 -6
- package/dist/static/assets/{infoDiagram-HS3SLOUP-CZ5hWoxV.js.map → infoDiagram-HS3SLOUP-DlC6wsrv.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CKN3oSxk.js → journeyDiagram-XKPGCS4Q-Dg_RgtQX.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CKN3oSxk.js.map → journeyDiagram-XKPGCS4Q-Dg_RgtQX.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BQCMklfJ.js → kanban-definition-3W4ZIXB7-DuGS3lId.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BQCMklfJ.js.map → kanban-definition-3W4ZIXB7-DuGS3lId.js.map} +1 -1
- package/dist/static/assets/{layout-C5B58szc.js → layout-FDz2bstZ.js} +5 -5
- package/dist/static/assets/{layout-C5B58szc.js.map → layout-FDz2bstZ.js.map} +1 -1
- package/dist/static/assets/{linear-_32fut6G.js → linear-CzsdvPGb.js} +2 -2
- package/dist/static/assets/{linear-_32fut6G.js.map → linear-CzsdvPGb.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-C_goMzjx.js → mindmap-definition-VGOIOE7T-WsAF5UNp.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-C_goMzjx.js.map → mindmap-definition-VGOIOE7T-WsAF5UNp.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-BQ2n0cOB.js → pieDiagram-ADFJNKIX-DJpRJ5ei.js} +8 -8
- package/dist/static/assets/{pieDiagram-ADFJNKIX-BQ2n0cOB.js.map → pieDiagram-ADFJNKIX-DJpRJ5ei.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-BLg7_neg.js → quadrantDiagram-AYHSOK5B-CMyIzTkY.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-BLg7_neg.js.map → quadrantDiagram-AYHSOK5B-CMyIzTkY.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DwkJt0zi.js → requirementDiagram-UZGBJVZJ-D_yqVXGu.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DwkJt0zi.js.map → requirementDiagram-UZGBJVZJ-D_yqVXGu.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DmxmatUB.js → sankeyDiagram-TZEHDZUN-D4-cF724.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DmxmatUB.js.map → sankeyDiagram-TZEHDZUN-D4-cF724.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-KHU_eApU.js → sequenceDiagram-WL72ISMW-B7J3gWYN.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-KHU_eApU.js.map → sequenceDiagram-WL72ISMW-B7J3gWYN.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-B3DBCxAL.js → stateDiagram-FKZM4ZOC-DwEYYCcu.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-B3DBCxAL.js.map → stateDiagram-FKZM4ZOC-DwEYYCcu.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-C-uIk7gh.js → stateDiagram-v2-4FDKWEC3-D4LOOQV5.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-C-uIk7gh.js.map → stateDiagram-v2-4FDKWEC3-D4LOOQV5.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-SysEcQCC.js → timeline-definition-IT6M3QCI-CyG-TJ_A.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-SysEcQCC.js.map → timeline-definition-IT6M3QCI-CyG-TJ_A.js.map} +1 -1
- package/dist/static/assets/{treemap-GDKQZRPO-d0AbKEc4.js → treemap-GDKQZRPO-yY4GiKmU.js} +5 -5
- package/dist/static/assets/{treemap-GDKQZRPO-d0AbKEc4.js.map → treemap-GDKQZRPO-yY4GiKmU.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-CmSQMxUh.js → xychartDiagram-PRI3JC2R-5TYN_q15.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-CmSQMxUh.js.map → xychartDiagram-PRI3JC2R-5TYN_q15.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/dist/team.js +33 -4
- package/dist/tools/app-reminders.js +280 -0
- package/dist/tools/prompts/memory/en/errors.md +155 -0
- package/dist/tools/prompts/memory/en/index.md +47 -0
- package/dist/tools/prompts/memory/en/principles.md +79 -0
- package/dist/tools/prompts/memory/en/scenarios.md +174 -0
- package/dist/tools/prompts/memory/en/tools.md +154 -0
- package/dist/tools/prompts/memory/zh/errors.md +155 -0
- package/dist/tools/prompts/memory/zh/index.md +47 -0
- package/dist/tools/prompts/memory/zh/principles.md +79 -0
- package/dist/tools/prompts/memory/zh/scenarios.md +174 -0
- package/dist/tools/prompts/memory/zh/tools.md +154 -0
- package/dist/tools/ripgrep.js +197 -63
- package/package.json +2 -2
- package/dist/static/assets/index-B-8J28g7.js.map +0 -1
package/dist/static/index.html
CHANGED
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
padding: 20px;
|
|
53
53
|
}
|
|
54
54
|
</style>
|
|
55
|
-
<script type="module" crossorigin src="/assets/index-
|
|
55
|
+
<script type="module" crossorigin src="/assets/index-DrTqAfFy.js"></script>
|
|
56
56
|
<link rel="stylesheet" crossorigin href="/assets/index-CD5wtC_i.css">
|
|
57
57
|
</head>
|
|
58
58
|
<body>
|
package/dist/team.js
CHANGED
|
@@ -14,6 +14,7 @@ exports.Team = void 0;
|
|
|
14
14
|
*/
|
|
15
15
|
const promises_1 = __importDefault(require("fs/promises"));
|
|
16
16
|
const yaml_1 = __importDefault(require("yaml"));
|
|
17
|
+
const enabled_apps_1 = require("./apps/enabled-apps");
|
|
17
18
|
const teammates_1 = require("./apps/teammates");
|
|
18
19
|
const client_1 = require("./llm/client");
|
|
19
20
|
const log_1 = require("./log");
|
|
@@ -530,10 +531,26 @@ exports.Team = Team;
|
|
|
530
531
|
async function validateMemberToolsetBindings(team, md) {
|
|
531
532
|
const registeredToolsets = new Set(Object.keys((0, registry_1.listToolsets)()));
|
|
532
533
|
const mcpDeclared = await readMcpDeclaredToolsets();
|
|
534
|
+
let enabledAppToolsets = new Set();
|
|
535
|
+
try {
|
|
536
|
+
const snapshot = await (0, enabled_apps_1.loadEnabledAppsSnapshot)({ rtwsRootAbs: process.cwd() });
|
|
537
|
+
enabledAppToolsets = new Set(snapshot.enabledApps.flatMap((app) => (app.installJson.contributes?.toolsets ?? []).map((toolset) => toolset.id)));
|
|
538
|
+
}
|
|
539
|
+
catch (err) {
|
|
540
|
+
addIssue('apps/toolsets/load', 'Failed to load enabled app toolsets while validating .minds/team.yaml toolset bindings.', err instanceof Error ? err.message : String(err));
|
|
541
|
+
}
|
|
533
542
|
const validateAt = (args) => {
|
|
534
543
|
for (const toolsetName of args.toolsets) {
|
|
535
|
-
|
|
544
|
+
const registeredMeta = (0, registry_1.getToolsetMeta)(toolsetName);
|
|
545
|
+
if (registeredToolsets.has(toolsetName)) {
|
|
546
|
+
if (registeredMeta?.source === 'app') {
|
|
547
|
+
continue;
|
|
548
|
+
}
|
|
549
|
+
continue;
|
|
550
|
+
}
|
|
551
|
+
if (enabledAppToolsets.has(toolsetName)) {
|
|
536
552
|
continue;
|
|
553
|
+
}
|
|
537
554
|
if (mcpDeclared.kind === 'loaded' && mcpDeclared.declaredServerIds.has(toolsetName)) {
|
|
538
555
|
if (mcpDeclared.invalidServerIds.has(toolsetName)) {
|
|
539
556
|
addIssue(`${args.idPrefix}/toolsets/${sanitizeProblemIdSegment(toolsetName)}/mcp_declared_invalid`, `Invalid .minds/team.yaml: ${args.atPrefix}.toolsets contains an MCP toolset whose server config is invalid.`, [
|
|
@@ -554,9 +571,10 @@ exports.Team = Team;
|
|
|
554
571
|
continue;
|
|
555
572
|
}
|
|
556
573
|
addIssue(`${args.idPrefix}/toolsets/${sanitizeProblemIdSegment(toolsetName)}/missing`, `Invalid .minds/team.yaml: ${args.atPrefix}.toolsets contains an unknown toolset.`, [
|
|
557
|
-
`Resolved ${args.atPrefix}.toolsets includes '${toolsetName}', but this toolset is
|
|
558
|
-
`
|
|
559
|
-
`
|
|
574
|
+
`Resolved ${args.atPrefix}.toolsets includes '${toolsetName}', but this toolset is not currently registered in runtime registry and is not declared in .minds/mcp.yaml.`,
|
|
575
|
+
`If '${toolsetName}' is expected from an enabled app, confirm the app is installed/enabled in this rtws and that its contributes.toolsets were loaded successfully.`,
|
|
576
|
+
`Otherwise, fix ${args.atPrefix}.toolsets to a valid built-in/app toolset name, or declare MCP server '${toolsetName}' in .minds/mcp.yaml.`,
|
|
577
|
+
`Tip: run team_mgmt_validate_mcp_cfg({}) for MCP checks, and inspect / refresh enabled apps if this toolset should come from an app.`,
|
|
560
578
|
].join('\n'));
|
|
561
579
|
}
|
|
562
580
|
};
|
|
@@ -871,6 +889,7 @@ exports.Team = Team;
|
|
|
871
889
|
Team.TEAM_YAML_MODEL_PARAMS_OPENAI_KEYS = [
|
|
872
890
|
'temperature',
|
|
873
891
|
'max_tokens',
|
|
892
|
+
'service_tier',
|
|
874
893
|
'top_p',
|
|
875
894
|
'frequency_penalty',
|
|
876
895
|
'presence_penalty',
|
|
@@ -942,6 +961,7 @@ exports.Team = Team;
|
|
|
942
961
|
verbosity: `Did you mean \`${modelParamsAt}.codex.verbosity\` (preferred for provider: codex) or \`${modelParamsAt}.openai.verbosity\`?`,
|
|
943
962
|
parallel_tool_calls: `Did you mean \`${modelParamsAt}.codex.parallel_tool_calls\` (preferred for provider: codex) or \`${modelParamsAt}.openai.parallel_tool_calls\`?`,
|
|
944
963
|
web_search: `Did you mean \`${modelParamsAt}.codex.web_search\` (preferred for provider: codex) or \`${modelParamsAt}.openai.web_search\`?`,
|
|
964
|
+
service_tier: `Did you mean \`${modelParamsAt}.codex.service_tier\` (preferred for provider: codex) or \`${modelParamsAt}.openai.service_tier\`?`,
|
|
945
965
|
temperature: `Did you mean \`${modelParamsAt}.codex.temperature\` / \`${modelParamsAt}.openai.temperature\` (or \`${modelParamsAt}.anthropic.temperature\`)?`,
|
|
946
966
|
top_p: `Did you mean \`${modelParamsAt}.codex.top_p\` / \`${modelParamsAt}.openai.top_p\` (or \`${modelParamsAt}.anthropic.top_p\`)?`,
|
|
947
967
|
max_tokens: `Did you mean \`${modelParamsAt}.max_tokens\` / \`${modelParamsAt}.general.max_tokens\` (provider-agnostic), or \`${modelParamsAt}.codex.max_tokens\` / \`${modelParamsAt}.openai.max_tokens\` / \`${modelParamsAt}.anthropic.max_tokens\`?`,
|
|
@@ -1606,6 +1626,15 @@ exports.Team = Team;
|
|
|
1606
1626
|
asOptionalString(params.user, `${at2}.user`);
|
|
1607
1627
|
asOptionalBoolean(params.parallel_tool_calls, `${at2}.parallel_tool_calls`);
|
|
1608
1628
|
asOptionalBoolean(params.json_response, `${at2}.json_response`);
|
|
1629
|
+
const serviceTier = params.service_tier;
|
|
1630
|
+
if (serviceTier !== undefined &&
|
|
1631
|
+
serviceTier !== 'auto' &&
|
|
1632
|
+
serviceTier !== 'default' &&
|
|
1633
|
+
serviceTier !== 'flex' &&
|
|
1634
|
+
serviceTier !== 'scale' &&
|
|
1635
|
+
serviceTier !== 'priority') {
|
|
1636
|
+
throw new Error(`Invalid ${at2}.service_tier: expected auto|default|flex|scale|priority (got ${describeValueType(serviceTier)})`);
|
|
1637
|
+
}
|
|
1609
1638
|
const reasoningEffort = params.reasoning_effort;
|
|
1610
1639
|
if (reasoningEffort !== undefined &&
|
|
1611
1640
|
reasoningEffort !== 'none' &&
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildAppReminderOwnerRegistryName = buildAppReminderOwnerRegistryName;
|
|
4
|
+
exports.ensureAppReminderOwnersRegistered = ensureAppReminderOwnersRegistered;
|
|
5
|
+
exports.unregisterAppReminderOwnersForApps = unregisterAppReminderOwnersForApps;
|
|
6
|
+
exports.applyAppReminderRequests = applyAppReminderRequests;
|
|
7
|
+
const evt_registry_1 = require("../evt-registry");
|
|
8
|
+
const driver_messages_1 = require("../shared/i18n/driver-messages");
|
|
9
|
+
const runtime_language_1 = require("../shared/runtime-language");
|
|
10
|
+
const tool_1 = require("../tool");
|
|
11
|
+
const registry_1 = require("./registry");
|
|
12
|
+
const APP_REMINDER_META_KEYS = new Set([
|
|
13
|
+
'kind',
|
|
14
|
+
'appId',
|
|
15
|
+
'ownerRef',
|
|
16
|
+
'managedByTool',
|
|
17
|
+
'source',
|
|
18
|
+
'updateExample',
|
|
19
|
+
'ownerMeta',
|
|
20
|
+
]);
|
|
21
|
+
const appReminderDescriptors = new Map();
|
|
22
|
+
function isRecord(value) {
|
|
23
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
24
|
+
}
|
|
25
|
+
function isJsonRecord(value) {
|
|
26
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
27
|
+
}
|
|
28
|
+
function isAppReminderMeta(value) {
|
|
29
|
+
if (!isRecord(value))
|
|
30
|
+
return false;
|
|
31
|
+
if (value['kind'] !== 'app_reminder_owner')
|
|
32
|
+
return false;
|
|
33
|
+
if (typeof value['appId'] !== 'string' || value['appId'].trim() === '')
|
|
34
|
+
return false;
|
|
35
|
+
if (typeof value['ownerRef'] !== 'string' || value['ownerRef'].trim() === '')
|
|
36
|
+
return false;
|
|
37
|
+
if (typeof value['managedByTool'] !== 'string' || value['managedByTool'].trim() === '')
|
|
38
|
+
return false;
|
|
39
|
+
if (typeof value['source'] !== 'string' || value['source'].trim() === '')
|
|
40
|
+
return false;
|
|
41
|
+
if (typeof value['updateExample'] !== 'string' || value['updateExample'].trim() === '')
|
|
42
|
+
return false;
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
function normalizeInsertPosition(remindersLength, position) {
|
|
46
|
+
if (position === undefined)
|
|
47
|
+
return remindersLength;
|
|
48
|
+
if (!Number.isFinite(position))
|
|
49
|
+
return remindersLength;
|
|
50
|
+
const normalized = Math.floor(position);
|
|
51
|
+
if (normalized <= 0)
|
|
52
|
+
return 0;
|
|
53
|
+
if (normalized >= remindersLength)
|
|
54
|
+
return remindersLength;
|
|
55
|
+
return normalized;
|
|
56
|
+
}
|
|
57
|
+
function toManagedByTool(owner) {
|
|
58
|
+
const managedByTool = owner.managedByTool?.trim();
|
|
59
|
+
if (managedByTool && managedByTool.length > 0)
|
|
60
|
+
return managedByTool;
|
|
61
|
+
return owner.ref;
|
|
62
|
+
}
|
|
63
|
+
function toUpdateExample(owner) {
|
|
64
|
+
const updateExample = owner.updateExample?.trim();
|
|
65
|
+
if (updateExample && updateExample.length > 0)
|
|
66
|
+
return updateExample;
|
|
67
|
+
return `${toManagedByTool(owner)}({ ... })`;
|
|
68
|
+
}
|
|
69
|
+
function buildDescriptor(params) {
|
|
70
|
+
return {
|
|
71
|
+
appId: params.appId,
|
|
72
|
+
ownerRef: params.owner.ref,
|
|
73
|
+
registryName: buildAppReminderOwnerRegistryName(params.appId, params.owner.ref),
|
|
74
|
+
managedByTool: toManagedByTool(params.owner),
|
|
75
|
+
source: toManagedByTool(params.owner),
|
|
76
|
+
updateExample: toUpdateExample(params.owner),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function buildAppReminderMeta(descriptor, ownerMeta) {
|
|
80
|
+
const baseMeta = {
|
|
81
|
+
kind: 'app_reminder_owner',
|
|
82
|
+
appId: descriptor.appId,
|
|
83
|
+
ownerRef: descriptor.ownerRef,
|
|
84
|
+
managedByTool: descriptor.managedByTool,
|
|
85
|
+
source: descriptor.source,
|
|
86
|
+
updateExample: descriptor.updateExample,
|
|
87
|
+
};
|
|
88
|
+
if (isJsonRecord(ownerMeta)) {
|
|
89
|
+
return { ...ownerMeta, ...baseMeta };
|
|
90
|
+
}
|
|
91
|
+
if (ownerMeta !== undefined) {
|
|
92
|
+
return { ...baseMeta, ownerMeta };
|
|
93
|
+
}
|
|
94
|
+
return baseMeta;
|
|
95
|
+
}
|
|
96
|
+
function extractOwnerMeta(meta) {
|
|
97
|
+
if (!isJsonRecord(meta)) {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
const payloadEntries = Object.entries(meta).filter(([key]) => !APP_REMINDER_META_KEYS.has(key));
|
|
101
|
+
if (payloadEntries.length > 0) {
|
|
102
|
+
return Object.fromEntries(payloadEntries);
|
|
103
|
+
}
|
|
104
|
+
return meta['ownerMeta'];
|
|
105
|
+
}
|
|
106
|
+
function toReminderState(reminder) {
|
|
107
|
+
return {
|
|
108
|
+
content: reminder.content,
|
|
109
|
+
meta: extractOwnerMeta(reminder.meta),
|
|
110
|
+
echoback: reminder.echoback,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function findOwnedReminderEntries(dlg, descriptor, owner) {
|
|
114
|
+
const entries = [];
|
|
115
|
+
for (let index = 0; index < dlg.reminders.length; index += 1) {
|
|
116
|
+
const reminder = dlg.reminders[index];
|
|
117
|
+
if (!reminder || reminder.owner !== owner || !isAppReminderMeta(reminder.meta)) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (reminder.meta.appId !== descriptor.appId ||
|
|
121
|
+
reminder.meta.ownerRef !== descriptor.ownerRef) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
entries.push({ index, reminder });
|
|
125
|
+
}
|
|
126
|
+
return entries;
|
|
127
|
+
}
|
|
128
|
+
function fallbackRenderedReminder(reminder, reminderNo) {
|
|
129
|
+
const language = (0, runtime_language_1.getWorkLanguage)();
|
|
130
|
+
return {
|
|
131
|
+
type: 'transient_guide_msg',
|
|
132
|
+
role: 'assistant',
|
|
133
|
+
content: (0, driver_messages_1.formatReminderItemGuide)(language, reminderNo, reminder.content, {
|
|
134
|
+
meta: reminder.meta,
|
|
135
|
+
}),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
async function persistAndPublishReminders(dlg) {
|
|
139
|
+
await dlg.dlgStore.persistReminders(dlg, dlg.reminders);
|
|
140
|
+
const reminderNoByIndex = (0, tool_1.computeReminderNoByIndex)(dlg.reminders);
|
|
141
|
+
const reminders = dlg.reminders.map((reminder, index) => ({
|
|
142
|
+
content: reminder.content,
|
|
143
|
+
meta: isRecord(reminder.meta) ? reminder.meta : undefined,
|
|
144
|
+
reminder_no: reminderNoByIndex.get(index),
|
|
145
|
+
echoback: (0, tool_1.reminderEchoBackEnabled)(reminder),
|
|
146
|
+
}));
|
|
147
|
+
const evt = { type: 'full_reminders_update', reminders };
|
|
148
|
+
(0, evt_registry_1.postDialogEvent)(dlg, evt);
|
|
149
|
+
}
|
|
150
|
+
function createAppReminderOwner(params) {
|
|
151
|
+
const { descriptor, resolveHostClient } = params;
|
|
152
|
+
const owner = {
|
|
153
|
+
name: descriptor.registryName,
|
|
154
|
+
async updateReminder(dlg, reminder) {
|
|
155
|
+
if (reminder.owner !== owner || !isAppReminderMeta(reminder.meta)) {
|
|
156
|
+
return { treatment: 'keep' };
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
const client = resolveHostClient();
|
|
160
|
+
const result = await client.updateReminder(descriptor.appId, descriptor.ownerRef, {
|
|
161
|
+
dialogId: dlg.id.selfId,
|
|
162
|
+
reminder: toReminderState(reminder),
|
|
163
|
+
});
|
|
164
|
+
if (result.treatment !== 'update') {
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
treatment: 'update',
|
|
169
|
+
updatedContent: result.updatedContent ?? reminder.content,
|
|
170
|
+
updatedMeta: result.updatedMeta !== undefined
|
|
171
|
+
? buildAppReminderMeta(descriptor, result.updatedMeta)
|
|
172
|
+
: reminder.meta,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return { treatment: 'keep' };
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
async renderReminder(dlg, reminder, index) {
|
|
180
|
+
if (reminder.owner !== owner || !isAppReminderMeta(reminder.meta)) {
|
|
181
|
+
return fallbackRenderedReminder(reminder, index + 1);
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
const client = resolveHostClient();
|
|
185
|
+
return await client.renderReminder(descriptor.appId, descriptor.ownerRef, {
|
|
186
|
+
dialogId: dlg.id.selfId,
|
|
187
|
+
reminder: toReminderState(reminder),
|
|
188
|
+
reminderNo: index + 1,
|
|
189
|
+
workLanguage: (0, runtime_language_1.getWorkLanguage)(),
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return fallbackRenderedReminder(reminder, index + 1);
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
return owner;
|
|
198
|
+
}
|
|
199
|
+
function buildAppReminderOwnerRegistryName(appId, ownerRef) {
|
|
200
|
+
return `app/${appId}/${ownerRef}`;
|
|
201
|
+
}
|
|
202
|
+
function ensureAppReminderOwnersRegistered(params) {
|
|
203
|
+
for (const app of params.enabledApps) {
|
|
204
|
+
const reminderOwners = app.installJson.contributes?.reminderOwners ?? [];
|
|
205
|
+
const seenOwnerRefs = new Set();
|
|
206
|
+
for (const owner of reminderOwners) {
|
|
207
|
+
if (seenOwnerRefs.has(owner.ref)) {
|
|
208
|
+
throw new Error(`App '${app.appId}' declares duplicate reminder owner ref '${owner.ref}'`);
|
|
209
|
+
}
|
|
210
|
+
seenOwnerRefs.add(owner.ref);
|
|
211
|
+
const descriptor = buildDescriptor({ appId: app.appId, owner });
|
|
212
|
+
appReminderDescriptors.set(descriptor.registryName, descriptor);
|
|
213
|
+
if ((0, registry_1.getReminderOwner)(descriptor.registryName)) {
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
(0, registry_1.registerReminderOwner)(createAppReminderOwner({ descriptor, resolveHostClient: params.resolveHostClient }));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function unregisterAppReminderOwnersForApps(params) {
|
|
221
|
+
const appIdSet = new Set(params.appIds);
|
|
222
|
+
for (const [registryName, descriptor] of appReminderDescriptors.entries()) {
|
|
223
|
+
if (!appIdSet.has(descriptor.appId)) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
(0, registry_1.unregisterReminderOwner)(registryName);
|
|
227
|
+
appReminderDescriptors.delete(registryName);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async function applyAppReminderRequests(dlg, params) {
|
|
231
|
+
const client = params.resolveHostClient();
|
|
232
|
+
let changed = false;
|
|
233
|
+
for (const request of params.reminderRequests) {
|
|
234
|
+
const registryName = buildAppReminderOwnerRegistryName(params.appId, request.ownerRef);
|
|
235
|
+
const descriptor = appReminderDescriptors.get(registryName);
|
|
236
|
+
const owner = (0, registry_1.getReminderOwner)(registryName);
|
|
237
|
+
if (!descriptor || !owner) {
|
|
238
|
+
throw new Error(`App '${params.appId}' attempted to use unregistered reminder owner '${request.ownerRef}'`);
|
|
239
|
+
}
|
|
240
|
+
const ownedEntries = findOwnedReminderEntries(dlg, descriptor, owner);
|
|
241
|
+
const result = await client.applyReminder(params.appId, request.ownerRef, request, {
|
|
242
|
+
dialogId: dlg.id.selfId,
|
|
243
|
+
ownedReminders: ownedEntries.map((entry) => toReminderState(entry.reminder)),
|
|
244
|
+
});
|
|
245
|
+
switch (result.treatment) {
|
|
246
|
+
case 'noop':
|
|
247
|
+
break;
|
|
248
|
+
case 'add': {
|
|
249
|
+
dlg.addReminder(result.reminder.content, owner, buildAppReminderMeta(descriptor, result.reminder.meta), normalizeInsertPosition(dlg.reminders.length, result.position), { echoback: result.reminder.echoback });
|
|
250
|
+
changed = true;
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
case 'update': {
|
|
254
|
+
const target = ownedEntries[result.ownedIndex];
|
|
255
|
+
if (!target) {
|
|
256
|
+
throw new Error(`App '${params.appId}' reminder owner '${request.ownerRef}' returned invalid ownedIndex=${result.ownedIndex}`);
|
|
257
|
+
}
|
|
258
|
+
dlg.updateReminder(target.index, result.reminder.content, buildAppReminderMeta(descriptor, result.reminder.meta), { echoback: result.reminder.echoback });
|
|
259
|
+
changed = true;
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
case 'delete': {
|
|
263
|
+
const target = ownedEntries[result.ownedIndex];
|
|
264
|
+
if (!target) {
|
|
265
|
+
throw new Error(`App '${params.appId}' reminder owner '${request.ownerRef}' returned invalid ownedIndex=${result.ownedIndex}`);
|
|
266
|
+
}
|
|
267
|
+
dlg.deleteReminder(target.index);
|
|
268
|
+
changed = true;
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
default: {
|
|
272
|
+
const _exhaustive = result;
|
|
273
|
+
throw new Error(`Unsupported app reminder apply result: ${String(_exhaustive)}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (changed) {
|
|
278
|
+
await persistAndPublishReminders(dlg);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# memory Error Handling
|
|
2
|
+
|
|
3
|
+
## Template (Errors)
|
|
4
|
+
|
|
5
|
+
### Error Chain (required)
|
|
6
|
+
|
|
7
|
+
1. Trigger Condition
|
|
8
|
+
2. Detection Signal
|
|
9
|
+
3. Recovery Steps
|
|
10
|
+
4. Success Criteria
|
|
11
|
+
5. Escalation Path (optional)
|
|
12
|
+
|
|
13
|
+
## Error Codes
|
|
14
|
+
|
|
15
|
+
### MEMORY_ALREADY_EXISTS
|
|
16
|
+
|
|
17
|
+
**Description:** Path already exists, cannot use `add_memory` to create new memory.
|
|
18
|
+
|
|
19
|
+
**Cause:**
|
|
20
|
+
|
|
21
|
+
- The path you're trying to add is already occupied by another memory
|
|
22
|
+
|
|
23
|
+
**Solution:**
|
|
24
|
+
|
|
25
|
+
- Use `replace_memory` to update existing memory
|
|
26
|
+
- Or use a different path to create new memory
|
|
27
|
+
|
|
28
|
+
**Example:**
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
Error:
|
|
32
|
+
status: error
|
|
33
|
+
error_code: MEMORY_ALREADY_EXISTS
|
|
34
|
+
message: Path "project/todo" already exists, please use replace_memory to update
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### MEMORY_NOT_FOUND
|
|
38
|
+
|
|
39
|
+
**Description:** Path does not exist, cannot perform operation.
|
|
40
|
+
|
|
41
|
+
**Cause:**
|
|
42
|
+
|
|
43
|
+
- The memory path you're trying to access doesn't exist
|
|
44
|
+
- The path was deleted or never created
|
|
45
|
+
|
|
46
|
+
**Solution:**
|
|
47
|
+
|
|
48
|
+
- For update/delete operations, first use `add_memory` to create
|
|
49
|
+
- Check if the path is correct
|
|
50
|
+
|
|
51
|
+
**Example:**
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
Error:
|
|
55
|
+
status: error
|
|
56
|
+
error_code: MEMORY_NOT_FOUND
|
|
57
|
+
message: Path "project/todo" does not exist, please use add_memory to create first
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### MEMORY_PATH_INVALID
|
|
61
|
+
|
|
62
|
+
**Description:** Path format is invalid.
|
|
63
|
+
|
|
64
|
+
**Cause:**
|
|
65
|
+
|
|
66
|
+
- Path contains illegal characters
|
|
67
|
+
- Path length exceeds limit
|
|
68
|
+
|
|
69
|
+
**Solution:**
|
|
70
|
+
|
|
71
|
+
- Ensure path only contains letters, numbers, underscores, slashes
|
|
72
|
+
- Path length should not exceed 255 characters
|
|
73
|
+
|
|
74
|
+
**Example:**
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
Error:
|
|
78
|
+
status: error
|
|
79
|
+
error_code: MEMORY_PATH_INVALID
|
|
80
|
+
message: Path "project/*invalid*" contains illegal characters
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### MEMORY_CONTENT_TOO_LARGE
|
|
84
|
+
|
|
85
|
+
**Description:** Memory content is too large.
|
|
86
|
+
|
|
87
|
+
**Cause:**
|
|
88
|
+
|
|
89
|
+
- Single memory content exceeds 1MB limit
|
|
90
|
+
|
|
91
|
+
**Solution:**
|
|
92
|
+
|
|
93
|
+
- Compress content
|
|
94
|
+
- Split into multiple memories
|
|
95
|
+
- Use external storage (e.g., files)
|
|
96
|
+
|
|
97
|
+
**Example:**
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
Error:
|
|
101
|
+
status: error
|
|
102
|
+
error_code: MEMORY_CONTENT_TOO_LARGE
|
|
103
|
+
message: Content size 1.2MB exceeds 1MB limit
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### MEMORY_STORAGE_ERROR
|
|
107
|
+
|
|
108
|
+
**Description:** Storage error.
|
|
109
|
+
|
|
110
|
+
**Cause:**
|
|
111
|
+
|
|
112
|
+
- Insufficient disk space
|
|
113
|
+
- Permission issues
|
|
114
|
+
- File system error
|
|
115
|
+
|
|
116
|
+
**Solution:**
|
|
117
|
+
|
|
118
|
+
- Check disk space
|
|
119
|
+
- Check file permissions
|
|
120
|
+
- Retry operation
|
|
121
|
+
|
|
122
|
+
**Example:**
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
Error:
|
|
126
|
+
status: error
|
|
127
|
+
error_code: MEMORY_STORAGE_ERROR
|
|
128
|
+
message: Cannot write to storage, insufficient disk space
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Frequently Asked Questions
|
|
132
|
+
|
|
133
|
+
### Q: Does memory auto-save?
|
|
134
|
+
|
|
135
|
+
A: Yes, all memory operations are immediately persisted to disk. No manual save is needed.
|
|
136
|
+
|
|
137
|
+
### Q: Is there a limit on the number of memories?
|
|
138
|
+
|
|
139
|
+
A: There's no strict limit, but it's recommended to keep the number of memories reasonable (less than 100 recommended).
|
|
140
|
+
|
|
141
|
+
### Q: Can other members see my memories?
|
|
142
|
+
|
|
143
|
+
A: No, memory is a personal memory tool, only the current agent can access it. If you need to share with team members, please use team_memory.
|
|
144
|
+
|
|
145
|
+
### Q: Will clear_memory delete all memories?
|
|
146
|
+
|
|
147
|
+
A: Yes, `clear_memory` will delete all personal memories, this operation is irreversible. Please use with caution.
|
|
148
|
+
|
|
149
|
+
### Q: Do memories expire?
|
|
150
|
+
|
|
151
|
+
A: No, memories are permanently saved until explicitly deleted.
|
|
152
|
+
|
|
153
|
+
### Q: How do I view all current memories?
|
|
154
|
+
|
|
155
|
+
A: The agent can access all personal memories during response generation. You can directly ask the agent what memories it currently has.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# memory Personal Memory Tools Manual
|
|
2
|
+
|
|
3
|
+
## Template (Index)
|
|
4
|
+
|
|
5
|
+
### One-line Positioning
|
|
6
|
+
|
|
7
|
+
- <What this toolset is for, in one sentence>
|
|
8
|
+
|
|
9
|
+
### Tool List
|
|
10
|
+
|
|
11
|
+
- <Enumerate core tools or point to Tools/Schema section>
|
|
12
|
+
|
|
13
|
+
### 30-Second Quickstart
|
|
14
|
+
|
|
15
|
+
1. <call ...>
|
|
16
|
+
2. <observe ...>
|
|
17
|
+
3. <next step ...>
|
|
18
|
+
|
|
19
|
+
### Navigation
|
|
20
|
+
|
|
21
|
+
- principles / tools / scenarios / errors
|
|
22
|
+
|
|
23
|
+
### Boundaries vs Other Toolsets
|
|
24
|
+
|
|
25
|
+
- <When to use this vs a sibling toolset>
|
|
26
|
+
|
|
27
|
+
memory is Dominds' **personal memory toolset** for managing an agent's private memory:
|
|
28
|
+
|
|
29
|
+
- **Privacy**: Memory is only visible to the current agent, not shared with other members
|
|
30
|
+
- **Persistence**: Memory is persisted to disk and retained after conversation restarts
|
|
31
|
+
- **Structured**: Supports organizing memory by path for easy categorization and retrieval
|
|
32
|
+
|
|
33
|
+
## Quick Navigation
|
|
34
|
+
|
|
35
|
+
| Topic | Description |
|
|
36
|
+
| ----------------------------- | ----------------------------------------------- |
|
|
37
|
+
| [principles](./principles.md) | Core concepts, memory lifecycle, best practices |
|
|
38
|
+
| [tools](./tools.md) | Complete tool list and interface contracts |
|
|
39
|
+
| [scenarios](./scenarios.md) | Common usage scenarios (copy-paste ready) |
|
|
40
|
+
| [errors](./errors.md) | Error codes and solutions |
|
|
41
|
+
|
|
42
|
+
## Status
|
|
43
|
+
|
|
44
|
+
- Status: Implemented
|
|
45
|
+
- Main implementation files:
|
|
46
|
+
- Tool implementation: `dominds/main/tools/mem.ts`
|
|
47
|
+
- Toolset metadata: `dominds/main/tools/builtins.ts`, `dominds/main/tools/registry.ts`
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# memory Principles and Core Concepts
|
|
2
|
+
|
|
3
|
+
## Template (Principles)
|
|
4
|
+
|
|
5
|
+
### Design Goals
|
|
6
|
+
|
|
7
|
+
- <Goal 1>
|
|
8
|
+
- <Goal 2>
|
|
9
|
+
|
|
10
|
+
### Contract Principles
|
|
11
|
+
|
|
12
|
+
- <Input/Output contract rules>
|
|
13
|
+
|
|
14
|
+
### Safety & Boundaries
|
|
15
|
+
|
|
16
|
+
- <Access constraints / guardrails>
|
|
17
|
+
|
|
18
|
+
### Failure & Recovery
|
|
19
|
+
|
|
20
|
+
- <What to do when a call fails>
|
|
21
|
+
|
|
22
|
+
### Glossary
|
|
23
|
+
|
|
24
|
+
- <Toolset-specific terms>
|
|
25
|
+
|
|
26
|
+
## Memory Model
|
|
27
|
+
|
|
28
|
+
The memory toolset uses a **path key-value storage** model:
|
|
29
|
+
|
|
30
|
+
- **Path**: Unique identifier for the memory, similar to a file system path, e.g., `project/todo` or `user/preferences/theme`
|
|
31
|
+
- **Content**: Actual content of the memory, can be arbitrary text
|
|
32
|
+
|
|
33
|
+
## Tool Overview
|
|
34
|
+
|
|
35
|
+
| Tool | Function |
|
|
36
|
+
| -------------- | -------------------------------------------- |
|
|
37
|
+
| add_memory | Create new memory (when path does not exist) |
|
|
38
|
+
| replace_memory | Update existing memory (when path exists) |
|
|
39
|
+
| drop_memory | Delete memory |
|
|
40
|
+
| clear_memory | Clear all personal memory (irrecoverable) |
|
|
41
|
+
|
|
42
|
+
## Memory Lifecycle
|
|
43
|
+
|
|
44
|
+
1. **Create (add)**: Use `add_memory` to create new memory
|
|
45
|
+
2. **Read**: Agent can read existing memory during response generation
|
|
46
|
+
3. **Update (replace)**: Use `replace_memory` to update memory content
|
|
47
|
+
4. **Delete (drop)**: Use `drop_memory` to delete specific memory
|
|
48
|
+
|
|
49
|
+
## Best Practices
|
|
50
|
+
|
|
51
|
+
### 1. Path Naming Conventions
|
|
52
|
+
|
|
53
|
+
- Use descriptive paths: `project/architecture`, `user/preferences/language`
|
|
54
|
+
- Avoid special characters: Do not include `/`, `\`, `*`, etc. in paths
|
|
55
|
+
- Use hierarchical structure: Organize memory by topic, e.g., `project/todo`, `project/done`
|
|
56
|
+
|
|
57
|
+
### 2. Content Format
|
|
58
|
+
|
|
59
|
+
- Keep content concise: Each memory should cover only one topic
|
|
60
|
+
- Use structured format: Can use Markdown format to organize content
|
|
61
|
+
- Regular cleanup: Periodically check and delete outdated memories
|
|
62
|
+
|
|
63
|
+
### 3. Usage Scenarios
|
|
64
|
+
|
|
65
|
+
- **Task persistence**: Save long-term task progress
|
|
66
|
+
- **Context memory**: Save important information from conversation context
|
|
67
|
+
- **Preference settings**: Save user preferences and configuration information
|
|
68
|
+
|
|
69
|
+
## Relationship with Other Tools
|
|
70
|
+
|
|
71
|
+
- **team_memory**: Team shared memory, visible to all members
|
|
72
|
+
- **reminder**: Temporary reminder, session-level
|
|
73
|
+
- **change_mind**: Update taskdoc (goals/constraints/progress)
|
|
74
|
+
|
|
75
|
+
## Limitations and Notes
|
|
76
|
+
|
|
77
|
+
1. Memory content has size limit (max 1MB per memory)
|
|
78
|
+
2. Memory path cannot exceed 255 characters
|
|
79
|
+
3. `clear_memory` will delete all memory, **irrecoverable**
|