dominds 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +157 -0
- package/README.md +250 -0
- package/README.zh.md +161 -0
- package/dist/access-control.js +253 -0
- package/dist/cli/create.js +263 -0
- package/dist/cli/read.js +84 -0
- package/dist/cli/tui.js +199 -0
- package/dist/cli/webui.js +169 -0
- package/dist/cli.js +227 -0
- package/dist/dialog-factory.js +53 -0
- package/dist/dialog-global-registry.js +68 -0
- package/dist/dialog-instance-registry.js +78 -0
- package/dist/dialog-run-state.js +198 -0
- package/dist/dialog.js +1024 -0
- package/dist/evt-registry.js +103 -0
- package/dist/index.js +8 -0
- package/dist/llm/client.js +69 -0
- package/dist/llm/defaults.yaml +386 -0
- package/dist/llm/driver.js +3214 -0
- package/dist/llm/gen/anthropic.js +611 -0
- package/dist/llm/gen/codex.js +375 -0
- package/dist/llm/gen/mock.js +326 -0
- package/dist/llm/gen/openai.js +470 -0
- package/dist/llm/gen/registry.js +26 -0
- package/dist/llm/gen.js +2 -0
- package/dist/llm/tools-projection.js +37 -0
- package/dist/log.js +228 -0
- package/dist/mcp/config.js +230 -0
- package/dist/mcp/sdk-client.js +129 -0
- package/dist/mcp/server-runtime.js +57 -0
- package/dist/mcp/stdio-client.js +280 -0
- package/dist/mcp/supervisor.js +979 -0
- package/dist/mcp/tool-names.js +109 -0
- package/dist/minds/builtin/cmdr/persona.md +3 -0
- package/dist/minds/builtin/dijiang/knowledge.md +287 -0
- package/dist/minds/builtin/dijiang/persona.md +7 -0
- package/dist/minds/builtin/fuxi/persona.en.md +59 -0
- package/dist/minds/builtin/fuxi/persona.zh.md +49 -0
- package/dist/minds/builtin/pangu/persona.en.md +78 -0
- package/dist/minds/builtin/pangu/persona.zh.md +71 -0
- package/dist/minds/load.js +617 -0
- package/dist/minds/minds-i18n.js +131 -0
- package/dist/minds/system-prompt.js +281 -0
- package/dist/persistence.js +3128 -0
- package/dist/problems.js +109 -0
- package/dist/server/api-routes.js +1031 -0
- package/dist/server/auth.js +180 -0
- package/dist/server/mime-types.js +32 -0
- package/dist/server/prompts-routes.js +543 -0
- package/dist/server/server-core.js +235 -0
- package/dist/server/setup-routes.js +697 -0
- package/dist/server/static-server.js +132 -0
- package/dist/server/websocket-handler.js +1011 -0
- package/dist/server.js +164 -0
- package/dist/shared/async-fifo-mutex.js +36 -0
- package/dist/shared/diligence.js +20 -0
- package/dist/shared/dotenv.js +144 -0
- package/dist/shared/evt.js +195 -0
- package/dist/shared/i18n/driver-messages.js +267 -0
- package/dist/shared/i18n/text.js +9 -0
- package/dist/shared/i18n/tool-result-messages.js +51 -0
- package/dist/shared/rtws-cli.js +73 -0
- package/dist/shared/runtime-language.js +47 -0
- package/dist/shared/team-mgmt-manual.js +116 -0
- package/dist/shared/types/context-health.js +2 -0
- package/dist/shared/types/dialog.js +11 -0
- package/dist/shared/types/i18n.js +2 -0
- package/dist/shared/types/index.js +26 -0
- package/dist/shared/types/language.js +40 -0
- package/dist/shared/types/problems.js +2 -0
- package/dist/shared/types/prompts.js +2 -0
- package/dist/shared/types/q4h.js +7 -0
- package/dist/shared/types/run-state.js +8 -0
- package/dist/shared/types/setup.js +2 -0
- package/dist/shared/types/storage.js +10 -0
- package/dist/shared/types/tellask.js +8 -0
- package/dist/shared/types/tools-registry.js +2 -0
- package/dist/shared/types/wire.js +12 -0
- package/dist/shared/utils/fmt.js +9 -0
- package/dist/shared/utils/html.js +20 -0
- package/dist/shared/utils/id.js +18 -0
- package/dist/shared/utils/inter-dialog-format.js +101 -0
- package/dist/shared/utils/time.js +13 -0
- package/dist/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/static/assets/_baseUniq-Crfl3d5Y.js +661 -0
- package/dist/static/assets/_baseUniq-Crfl3d5Y.js.map +1 -0
- package/dist/static/assets/arc-CbA_x9GD.js +132 -0
- package/dist/static/assets/arc-CbA_x9GD.js.map +1 -0
- package/dist/static/assets/architectureDiagram-VXUJARFQ-lcFS8ZQJ.js +8685 -0
- package/dist/static/assets/architectureDiagram-VXUJARFQ-lcFS8ZQJ.js.map +1 -0
- package/dist/static/assets/blockDiagram-VD42YOAC-B3Q36qRc.js +3608 -0
- package/dist/static/assets/blockDiagram-VD42YOAC-B3Q36qRc.js.map +1 -0
- package/dist/static/assets/c4Diagram-YG6GDRKO-Mt-aq3VH.js +2482 -0
- package/dist/static/assets/c4Diagram-YG6GDRKO-Mt-aq3VH.js.map +1 -0
- package/dist/static/assets/channel-BVr1Yke-.js +8 -0
- package/dist/static/assets/channel-BVr1Yke-.js.map +1 -0
- package/dist/static/assets/chunk-4BX2VUAB-qCIn5Iic.js +17 -0
- package/dist/static/assets/chunk-4BX2VUAB-qCIn5Iic.js.map +1 -0
- package/dist/static/assets/chunk-55IACEB6-q172NeCV.js +14 -0
- package/dist/static/assets/chunk-55IACEB6-q172NeCV.js.map +1 -0
- package/dist/static/assets/chunk-B4BG7PRW-CMJmtYzq.js +1827 -0
- package/dist/static/assets/chunk-B4BG7PRW-CMJmtYzq.js.map +1 -0
- package/dist/static/assets/chunk-DI55MBZ5-DiuwwZPL.js +1916 -0
- package/dist/static/assets/chunk-DI55MBZ5-DiuwwZPL.js.map +1 -0
- package/dist/static/assets/chunk-FMBD7UC4-06sqZTTn.js +20 -0
- package/dist/static/assets/chunk-FMBD7UC4-06sqZTTn.js.map +1 -0
- package/dist/static/assets/chunk-QN33PNHL-CnpBNkpP.js +25 -0
- package/dist/static/assets/chunk-QN33PNHL-CnpBNkpP.js.map +1 -0
- package/dist/static/assets/chunk-QZHKN3VN-CNgjMR-e.js +18 -0
- package/dist/static/assets/chunk-QZHKN3VN-CNgjMR-e.js.map +1 -0
- package/dist/static/assets/chunk-TZMSLE5B-BxtzW6--.js +109 -0
- package/dist/static/assets/chunk-TZMSLE5B-BxtzW6--.js.map +1 -0
- package/dist/static/assets/classDiagram-2ON5EDUG-29huvmn-.js +23 -0
- package/dist/static/assets/classDiagram-2ON5EDUG-29huvmn-.js.map +1 -0
- package/dist/static/assets/classDiagram-v2-WZHVMYZB-29huvmn-.js +23 -0
- package/dist/static/assets/classDiagram-v2-WZHVMYZB-29huvmn-.js.map +1 -0
- package/dist/static/assets/clone-D2OgLSSn.js +9 -0
- package/dist/static/assets/clone-D2OgLSSn.js.map +1 -0
- package/dist/static/assets/cose-bilkent-S5V4N54A-BNegDCxl.js +4943 -0
- package/dist/static/assets/cose-bilkent-S5V4N54A-BNegDCxl.js.map +1 -0
- package/dist/static/assets/cytoscape.esm-Bm8DJGmZ.js +30240 -0
- package/dist/static/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -0
- package/dist/static/assets/dagre-6UL2VRFP-f1XrTRSn.js +695 -0
- package/dist/static/assets/dagre-6UL2VRFP-f1XrTRSn.js.map +1 -0
- package/dist/static/assets/defaultLocale-DVr69WTU.js +207 -0
- package/dist/static/assets/defaultLocale-DVr69WTU.js.map +1 -0
- package/dist/static/assets/diagram-PSM6KHXK-8w1WbeDi.js +849 -0
- package/dist/static/assets/diagram-PSM6KHXK-8w1WbeDi.js.map +1 -0
- package/dist/static/assets/diagram-QEK2KX5R-CF4wtMmR.js +303 -0
- package/dist/static/assets/diagram-QEK2KX5R-CF4wtMmR.js.map +1 -0
- package/dist/static/assets/diagram-S2PKOQOG-8p3Avgn2.js +213 -0
- package/dist/static/assets/diagram-S2PKOQOG-8p3Avgn2.js.map +1 -0
- package/dist/static/assets/erDiagram-Q2GNP2WA-BMKLxlM9.js +1159 -0
- package/dist/static/assets/erDiagram-Q2GNP2WA-BMKLxlM9.js.map +1 -0
- package/dist/static/assets/favicon-Cmg5RbCj.svg +8 -0
- package/dist/static/assets/flowDiagram-NV44I4VS-CgEuPNK2.js +2332 -0
- package/dist/static/assets/flowDiagram-NV44I4VS-CgEuPNK2.js.map +1 -0
- package/dist/static/assets/ganttDiagram-JELNMOA3-bJkDCf-9.js +3681 -0
- package/dist/static/assets/ganttDiagram-JELNMOA3-bJkDCf-9.js.map +1 -0
- package/dist/static/assets/gitGraphDiagram-NY62KEGX-4QE9kesp.js +1206 -0
- package/dist/static/assets/gitGraphDiagram-NY62KEGX-4QE9kesp.js.map +1 -0
- package/dist/static/assets/graph-CS0Pmm7c.js +597 -0
- package/dist/static/assets/graph-CS0Pmm7c.js.map +1 -0
- package/dist/static/assets/index-BS6HnGzC.js +112303 -0
- package/dist/static/assets/index-BS6HnGzC.js.map +1 -0
- package/dist/static/assets/index-DaIsSzC_.css +483 -0
- package/dist/static/assets/infoDiagram-WHAUD3N6-ypBcKfUs.js +34 -0
- package/dist/static/assets/infoDiagram-WHAUD3N6-ypBcKfUs.js.map +1 -0
- package/dist/static/assets/init-ZxktEp_H.js +17 -0
- package/dist/static/assets/init-ZxktEp_H.js.map +1 -0
- package/dist/static/assets/journeyDiagram-XKPGCS4Q-QnrxDowJ.js +1255 -0
- package/dist/static/assets/journeyDiagram-XKPGCS4Q-QnrxDowJ.js.map +1 -0
- package/dist/static/assets/kanban-definition-3W4ZIXB7-CfvEc4z5.js +1048 -0
- package/dist/static/assets/kanban-definition-3W4ZIXB7-CfvEc4z5.js.map +1 -0
- package/dist/static/assets/layout-8TGxpm23.js +2218 -0
- package/dist/static/assets/layout-8TGxpm23.js.map +1 -0
- package/dist/static/assets/linear-BATBPQQv.js +341 -0
- package/dist/static/assets/linear-BATBPQQv.js.map +1 -0
- package/dist/static/assets/min-B3oVH3AC.js +42 -0
- package/dist/static/assets/min-B3oVH3AC.js.map +1 -0
- package/dist/static/assets/mindmap-definition-VGOIOE7T-L7VLwwF8.js +1127 -0
- package/dist/static/assets/mindmap-definition-VGOIOE7T-L7VLwwF8.js.map +1 -0
- package/dist/static/assets/ordinal-CxptdPJm.js +77 -0
- package/dist/static/assets/ordinal-CxptdPJm.js.map +1 -0
- package/dist/static/assets/pieDiagram-ADFJNKIX-CFW3zIhM.js +241 -0
- package/dist/static/assets/pieDiagram-ADFJNKIX-CFW3zIhM.js.map +1 -0
- package/dist/static/assets/quadrantDiagram-AYHSOK5B-B7ssen3E.js +1338 -0
- package/dist/static/assets/quadrantDiagram-AYHSOK5B-B7ssen3E.js.map +1 -0
- package/dist/static/assets/requirementDiagram-UZGBJVZJ-D0v5BArv.js +1162 -0
- package/dist/static/assets/requirementDiagram-UZGBJVZJ-D0v5BArv.js.map +1 -0
- package/dist/static/assets/sankeyDiagram-TZEHDZUN-B7slncJe.js +1195 -0
- package/dist/static/assets/sankeyDiagram-TZEHDZUN-B7slncJe.js.map +1 -0
- package/dist/static/assets/sequenceDiagram-WL72ISMW-oXU2lRh_.js +3875 -0
- package/dist/static/assets/sequenceDiagram-WL72ISMW-oXU2lRh_.js.map +1 -0
- package/dist/static/assets/stateDiagram-FKZM4ZOC-CFYsEd0x.js +452 -0
- package/dist/static/assets/stateDiagram-FKZM4ZOC-CFYsEd0x.js.map +1 -0
- package/dist/static/assets/stateDiagram-v2-4FDKWEC3-C0UWaNA7.js +22 -0
- package/dist/static/assets/stateDiagram-v2-4FDKWEC3-C0UWaNA7.js.map +1 -0
- package/dist/static/assets/timeline-definition-IT6M3QCI-C3KODUrh.js +1223 -0
- package/dist/static/assets/timeline-definition-IT6M3QCI-C3KODUrh.js.map +1 -0
- package/dist/static/assets/treemap-KMMF4GRG-DAGDLhj2.js +18753 -0
- package/dist/static/assets/treemap-KMMF4GRG-DAGDLhj2.js.map +1 -0
- package/dist/static/assets/xychartDiagram-PRI3JC2R-C0J9iwTO.js +1888 -0
- package/dist/static/assets/xychartDiagram-PRI3JC2R-C0J9iwTO.js.map +1 -0
- package/dist/static/index.html +71 -0
- package/dist/static/testing/dom-observation-utils.js +425 -0
- package/dist/static/testing/e2e-test-helper.js +3119 -0
- package/dist/team.js +1160 -0
- package/dist/tellask.js +431 -0
- package/dist/tool.js +150 -0
- package/dist/tools/apply-patch.js +542 -0
- package/dist/tools/builtins.js +196 -0
- package/dist/tools/context-health.js +177 -0
- package/dist/tools/ctrl.js +478 -0
- package/dist/tools/diag.js +583 -0
- package/dist/tools/env.js +184 -0
- package/dist/tools/fs.js +818 -0
- package/dist/tools/mcp.js +138 -0
- package/dist/tools/mem.js +349 -0
- package/dist/tools/os.js +751 -0
- package/dist/tools/prompts/team_mgmt.en.md +70 -0
- package/dist/tools/prompts/team_mgmt.zh.md +70 -0
- package/dist/tools/prompts/ws_mod.en.md +86 -0
- package/dist/tools/prompts/ws_mod.zh.md +87 -0
- package/dist/tools/registry-snapshot.js +31 -0
- package/dist/tools/registry.js +121 -0
- package/dist/tools/ripgrep.js +678 -0
- package/dist/tools/team-mgmt.js +3300 -0
- package/dist/tools/txt.js +3178 -0
- package/dist/utils/id.js +72 -0
- package/dist/utils/task-doc.js +236 -0
- package/dist/utils/task-package.js +522 -0
- package/dist/utils/taskdoc-search.js +280 -0
- package/dist/utils/taskdoc.js +400 -0
- package/package.json +69 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Module: llm/gen/mock
|
|
4
|
+
*
|
|
5
|
+
* Mock LLM generator that uses a static response database for testing and development.
|
|
6
|
+
*
|
|
7
|
+
* === MOCK DATABASE FORMAT (YAML) ===
|
|
8
|
+
*
|
|
9
|
+
* ```yaml
|
|
10
|
+
* responses:
|
|
11
|
+
* # Comments are supported! Explain which test step uses each entry.
|
|
12
|
+
* # E.g., # docs/e2e-story-test/basics/reminders.md: Step 1
|
|
13
|
+
* - message: "hello"
|
|
14
|
+
* role: "user"
|
|
15
|
+
* response: "Hi there!"
|
|
16
|
+
* - message: "error text"
|
|
17
|
+
* role: "tool"
|
|
18
|
+
* response: "corrected response"
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* === ROLE-BASED MATCHING (EXACT ONLY) ===
|
|
22
|
+
*
|
|
23
|
+
* The mock looks at the EXACT last message in context (no fallback):
|
|
24
|
+
* - role='user' from prompting_msg → matches entries with role='user'
|
|
25
|
+
* - role='tool' from func_result_msg → matches entries with role='tool'
|
|
26
|
+
*
|
|
27
|
+
* Matching rules (strict exact matching, NO fallback):
|
|
28
|
+
* 1. Exact: "tool:error text" matches response with message="error text" AND role="tool"
|
|
29
|
+
* 2. Exact: "user:hello" matches response with message="hello" AND role="user"
|
|
30
|
+
* 3. No match: returns fallback response explaining how to add mocks
|
|
31
|
+
*
|
|
32
|
+
* === BENEFITS OF YAML FORMAT ===
|
|
33
|
+
*
|
|
34
|
+
* - Comments: Document which test step uses each entry
|
|
35
|
+
* - Easy cleanup: Identify unused entries by checking test step references
|
|
36
|
+
* - Maintainability: Update comments when tests change, never lose referenced entries
|
|
37
|
+
*
|
|
38
|
+
* === EXAMPLE: TOOL ERROR RECOVERY ===
|
|
39
|
+
*
|
|
40
|
+
* // Turn 1: User asks, LLM makes syntax error
|
|
41
|
+
* # docs/e2e-story-test/reminders.md: User creates reminders
|
|
42
|
+
* - message: "create reminders"
|
|
43
|
+
* role: "user"
|
|
44
|
+
* response: "Call the function tool `add_reminder` with {\"content\":\"goals...\"}"
|
|
45
|
+
*
|
|
46
|
+
* // Turn 2: Tool error (func_result_msg with role='tool'), LLM self-corrects
|
|
47
|
+
* # docs/e2e-story-test/reminders.md: Tool syntax error recovery
|
|
48
|
+
* - message: "Error: Invalid args. Use: add_reminder({ content: string, position: number }) (position=0 means append)."
|
|
49
|
+
* role: "tool"
|
|
50
|
+
* response: "Call the function tool `add_reminder` with {\"content\":\"Goals...\",\"position\":1}"
|
|
51
|
+
*/
|
|
52
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
53
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
54
|
+
};
|
|
55
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
56
|
+
exports.MockGen = void 0;
|
|
57
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
58
|
+
const path_1 = __importDefault(require("path"));
|
|
59
|
+
const yaml_1 = __importDefault(require("yaml"));
|
|
60
|
+
const log_1 = require("../../log");
|
|
61
|
+
class MockGen {
|
|
62
|
+
constructor() {
|
|
63
|
+
this.databaseCache = new Map();
|
|
64
|
+
}
|
|
65
|
+
get apiType() {
|
|
66
|
+
return 'mock';
|
|
67
|
+
}
|
|
68
|
+
async loadResponseDatabase(dbPath, modelName) {
|
|
69
|
+
const cacheKey = `${dbPath}:${modelName}`;
|
|
70
|
+
const dbFilePath = path_1.default.join(dbPath, `${modelName}.yaml`);
|
|
71
|
+
const cached = this.databaseCache.get(cacheKey);
|
|
72
|
+
if (cached) {
|
|
73
|
+
try {
|
|
74
|
+
const stats = await promises_1.default.stat(dbFilePath);
|
|
75
|
+
if (stats.mtimeMs === cached.lastModified) {
|
|
76
|
+
return cached;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Continue to reload
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const content = await promises_1.default.readFile(dbFilePath, 'utf-8');
|
|
85
|
+
const rawDatabase = yaml_1.default.parse(content);
|
|
86
|
+
// EXACT MATCHING ONLY: Store entries with role prefix
|
|
87
|
+
// No fallback to message-only entries
|
|
88
|
+
const lookupMap = new Map();
|
|
89
|
+
for (const resp of rawDatabase.responses) {
|
|
90
|
+
if (!resp.role) {
|
|
91
|
+
log_1.log.warn(`⚠️ Mock response without role: "${resp.message.substring(0, 50)}..."`);
|
|
92
|
+
log_1.log.warn('💡 All mock responses should have a "role" field (e.g., "user" or "tool")');
|
|
93
|
+
}
|
|
94
|
+
const key = resp.role
|
|
95
|
+
? `${resp.role}:${resp.message.trim().toLowerCase()}`
|
|
96
|
+
: resp.message.trim().toLowerCase();
|
|
97
|
+
lookupMap.set(key, resp);
|
|
98
|
+
}
|
|
99
|
+
const stats = await promises_1.default.stat(dbFilePath);
|
|
100
|
+
const cachedDb = {
|
|
101
|
+
filePath: dbFilePath,
|
|
102
|
+
lastModified: stats.mtimeMs,
|
|
103
|
+
lookupMap,
|
|
104
|
+
};
|
|
105
|
+
this.databaseCache.set(cacheKey, cachedDb);
|
|
106
|
+
return cachedDb;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
log_1.log.warn(`⚠️ Mock database not found: ${dbFilePath}`);
|
|
110
|
+
log_1.log.warn('💡 Create the file with: responses: [{ message: "...", role: "...", response: "..." }]');
|
|
111
|
+
const emptyDb = {
|
|
112
|
+
filePath: dbFilePath,
|
|
113
|
+
lastModified: Date.now(),
|
|
114
|
+
lookupMap: new Map(),
|
|
115
|
+
};
|
|
116
|
+
this.databaseCache.set(cacheKey, emptyDb);
|
|
117
|
+
return emptyDb;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Find matching response using EXACT last message only.
|
|
122
|
+
* NO fallback to message-only matching - if exact match fails, return null.
|
|
123
|
+
*/
|
|
124
|
+
findMatchingResponse(database, input, role) {
|
|
125
|
+
if (!role) {
|
|
126
|
+
throw new Error('role is required for mock response matching');
|
|
127
|
+
}
|
|
128
|
+
const normalizedInput = input.trim().toLowerCase();
|
|
129
|
+
const lookupMap = database.lookupMap;
|
|
130
|
+
// Exact match only: "role:message"
|
|
131
|
+
const exactKey = `${role}:${normalizedInput}`;
|
|
132
|
+
return lookupMap.get(exactKey) || null;
|
|
133
|
+
}
|
|
134
|
+
makeFallbackResponse(dbPath, input, role, modelName) {
|
|
135
|
+
return `🤖 **Mock Response Not Found**
|
|
136
|
+
|
|
137
|
+
No mock response for the specified message with role=${JSON.stringify(role)} !!
|
|
138
|
+
|
|
139
|
+
Database: \`${path_1.default.join(dbPath, `${modelName}.yaml`)}\`
|
|
140
|
+
|
|
141
|
+
Add to database:
|
|
142
|
+
\`\`\`yaml
|
|
143
|
+
responses:
|
|
144
|
+
- message: ${JSON.stringify(input.trim())}
|
|
145
|
+
role: ${JSON.stringify(role)}
|
|
146
|
+
response: "Your response here"
|
|
147
|
+
\`\`\``;
|
|
148
|
+
}
|
|
149
|
+
async genToReceiver(providerConfig, agent, systemPrompt, _funcTools, context, receiver, _genseq, abortSignal) {
|
|
150
|
+
const dbPath = providerConfig.baseUrl;
|
|
151
|
+
if (!agent.model) {
|
|
152
|
+
throw new Error('Model undefined for agent: ' + agent.id);
|
|
153
|
+
}
|
|
154
|
+
const modelName = agent.model;
|
|
155
|
+
const lastMsg = context[context.length - 1];
|
|
156
|
+
const content = lastMsg && 'content' in lastMsg ? lastMsg.content : '';
|
|
157
|
+
const role = lastMsg?.role ?? '';
|
|
158
|
+
if (abortSignal?.aborted) {
|
|
159
|
+
throw new Error('AbortError');
|
|
160
|
+
}
|
|
161
|
+
await receiver.thinkingStart();
|
|
162
|
+
await receiver.thinkingChunk(`[${modelName}] `);
|
|
163
|
+
await receiver.thinkingChunk(content.substring(0, 50) || '(empty)');
|
|
164
|
+
await receiver.thinkingFinish();
|
|
165
|
+
const db = await this.loadResponseDatabase(dbPath, modelName);
|
|
166
|
+
const matched = this.findMatchingResponse(db, content, role);
|
|
167
|
+
if (matched?.streamError) {
|
|
168
|
+
throw new Error(matched.streamError);
|
|
169
|
+
}
|
|
170
|
+
const responseText = matched?.response ?? this.makeFallbackResponse(dbPath, content, role, modelName);
|
|
171
|
+
let usage = { kind: 'unavailable' };
|
|
172
|
+
if (matched && matched.usageUnavailable === true) {
|
|
173
|
+
usage = { kind: 'unavailable' };
|
|
174
|
+
}
|
|
175
|
+
else if (matched && matched.usage) {
|
|
176
|
+
const promptTokens = matched.usage.promptTokens;
|
|
177
|
+
const completionTokens = typeof matched.usage.completionTokens === 'number' ? matched.usage.completionTokens : 0;
|
|
178
|
+
const totalTokens = typeof matched.usage.totalTokens === 'number'
|
|
179
|
+
? matched.usage.totalTokens
|
|
180
|
+
: promptTokens + completionTokens;
|
|
181
|
+
usage = {
|
|
182
|
+
kind: 'available',
|
|
183
|
+
promptTokens,
|
|
184
|
+
completionTokens,
|
|
185
|
+
totalTokens,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
const promptChars = systemPrompt.length +
|
|
190
|
+
context.reduce((acc, msg) => {
|
|
191
|
+
switch (msg.type) {
|
|
192
|
+
case 'environment_msg':
|
|
193
|
+
case 'transient_guide_msg':
|
|
194
|
+
case 'prompting_msg':
|
|
195
|
+
case 'saying_msg':
|
|
196
|
+
case 'thinking_msg':
|
|
197
|
+
case 'func_result_msg':
|
|
198
|
+
case 'call_result_msg':
|
|
199
|
+
return acc + msg.content.length;
|
|
200
|
+
case 'func_call_msg':
|
|
201
|
+
return acc + msg.name.length + msg.arguments.length;
|
|
202
|
+
default: {
|
|
203
|
+
const _exhaustive = msg;
|
|
204
|
+
throw new Error(`Unsupported chat message: ${_exhaustive}`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}, 0);
|
|
208
|
+
const promptTokens = Math.ceil(promptChars / 4);
|
|
209
|
+
const completionTokens = Math.ceil(responseText.length / 4);
|
|
210
|
+
usage = {
|
|
211
|
+
kind: 'available',
|
|
212
|
+
promptTokens,
|
|
213
|
+
completionTokens,
|
|
214
|
+
totalTokens: promptTokens + completionTokens,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
await receiver.sayingStart();
|
|
218
|
+
const words = responseText.split(/(\s+)/);
|
|
219
|
+
for (const word of words) {
|
|
220
|
+
if (abortSignal?.aborted) {
|
|
221
|
+
throw new Error('AbortError');
|
|
222
|
+
}
|
|
223
|
+
await receiver.sayingChunk(word);
|
|
224
|
+
}
|
|
225
|
+
await receiver.sayingFinish();
|
|
226
|
+
return { usage, llmGenModel: modelName };
|
|
227
|
+
}
|
|
228
|
+
async genMoreMessages(providerConfig, agent, systemPrompt, _funcTools, context, genseq, abortSignal) {
|
|
229
|
+
if (abortSignal?.aborted) {
|
|
230
|
+
throw new Error('AbortError');
|
|
231
|
+
}
|
|
232
|
+
const dbPath = providerConfig.baseUrl;
|
|
233
|
+
if (!agent.model) {
|
|
234
|
+
throw new Error('Model undefined for agent: ' + agent.id);
|
|
235
|
+
}
|
|
236
|
+
const modelName = agent.model;
|
|
237
|
+
const lastMsg = context[context.length - 1];
|
|
238
|
+
const content = lastMsg && 'content' in lastMsg ? lastMsg.content : '';
|
|
239
|
+
const role = lastMsg?.role ?? '';
|
|
240
|
+
try {
|
|
241
|
+
const db = await this.loadResponseDatabase(dbPath, modelName);
|
|
242
|
+
const matched = this.findMatchingResponse(db, content, role);
|
|
243
|
+
const responseText = matched?.response ?? this.makeFallbackResponse(dbPath, content, role, modelName);
|
|
244
|
+
const thinking = {
|
|
245
|
+
type: 'thinking_msg',
|
|
246
|
+
role: 'assistant',
|
|
247
|
+
genseq,
|
|
248
|
+
content: `[${modelName}] ${content.substring(0, 100)}`,
|
|
249
|
+
};
|
|
250
|
+
const saying = {
|
|
251
|
+
type: 'saying_msg',
|
|
252
|
+
role: 'assistant',
|
|
253
|
+
genseq,
|
|
254
|
+
content: matched?.streamError ? `❌ Mock Error: ${matched.streamError}` : responseText,
|
|
255
|
+
};
|
|
256
|
+
let usage = { kind: 'unavailable' };
|
|
257
|
+
if (matched && matched.usageUnavailable === true) {
|
|
258
|
+
usage = { kind: 'unavailable' };
|
|
259
|
+
}
|
|
260
|
+
else if (matched && matched.usage) {
|
|
261
|
+
const promptTokens = matched.usage.promptTokens;
|
|
262
|
+
const completionTokens = typeof matched.usage.completionTokens === 'number' ? matched.usage.completionTokens : 0;
|
|
263
|
+
const totalTokens = typeof matched.usage.totalTokens === 'number'
|
|
264
|
+
? matched.usage.totalTokens
|
|
265
|
+
: promptTokens + completionTokens;
|
|
266
|
+
usage = {
|
|
267
|
+
kind: 'available',
|
|
268
|
+
promptTokens,
|
|
269
|
+
completionTokens,
|
|
270
|
+
totalTokens,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
const promptChars = systemPrompt.length +
|
|
275
|
+
context.reduce((acc, msg) => {
|
|
276
|
+
switch (msg.type) {
|
|
277
|
+
case 'environment_msg':
|
|
278
|
+
case 'transient_guide_msg':
|
|
279
|
+
case 'prompting_msg':
|
|
280
|
+
case 'saying_msg':
|
|
281
|
+
case 'thinking_msg':
|
|
282
|
+
case 'func_result_msg':
|
|
283
|
+
case 'call_result_msg':
|
|
284
|
+
return acc + msg.content.length;
|
|
285
|
+
case 'func_call_msg':
|
|
286
|
+
return acc + msg.name.length + msg.arguments.length;
|
|
287
|
+
default: {
|
|
288
|
+
const _exhaustive = msg;
|
|
289
|
+
throw new Error(`Unsupported chat message: ${_exhaustive}`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}, 0);
|
|
293
|
+
const promptTokens = Math.ceil(promptChars / 4);
|
|
294
|
+
const completionTokens = Math.ceil(responseText.length / 4);
|
|
295
|
+
usage = {
|
|
296
|
+
kind: 'available',
|
|
297
|
+
promptTokens,
|
|
298
|
+
completionTokens,
|
|
299
|
+
totalTokens: promptTokens + completionTokens,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
return { messages: [thinking, saying], usage, llmGenModel: modelName };
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
306
|
+
const saying = {
|
|
307
|
+
type: 'saying_msg',
|
|
308
|
+
role: 'assistant',
|
|
309
|
+
genseq,
|
|
310
|
+
content: `❌ Mock Error: ${errMsg}`,
|
|
311
|
+
};
|
|
312
|
+
const thinking = {
|
|
313
|
+
type: 'thinking_msg',
|
|
314
|
+
role: 'assistant',
|
|
315
|
+
content: `[${modelName}] error: ${errMsg}`,
|
|
316
|
+
genseq,
|
|
317
|
+
};
|
|
318
|
+
return {
|
|
319
|
+
messages: [thinking, saying],
|
|
320
|
+
usage: { kind: 'unavailable' },
|
|
321
|
+
llmGenModel: modelName,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
exports.MockGen = MockGen;
|