dominds 1.6.3 → 1.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/dist/apps/installed-file.js +207 -0
  2. package/dist/apps/runtime-port.js +91 -0
  3. package/dist/course-transition.js +200 -0
  4. package/dist/dialog.js +35 -0
  5. package/dist/docs/kernel-app-architecture.md +286 -0
  6. package/dist/docs/kernel-app-architecture.zh.md +285 -0
  7. package/dist/llm/driver-entry.js +28 -0
  8. package/dist/llm/driver-v2/context-health.js +121 -0
  9. package/dist/llm/driver-v2/context.js +56 -0
  10. package/dist/llm/driver-v2/core.js +1545 -0
  11. package/dist/llm/driver-v2/index.js +26 -0
  12. package/dist/llm/driver-v2/orchestrator.js +158 -0
  13. package/dist/llm/driver-v2/policy.js +129 -0
  14. package/dist/llm/driver-v2/restore-dialog-hierarchy.js +73 -0
  15. package/dist/llm/driver-v2/round.js +366 -0
  16. package/dist/llm/driver-v2/runtime-utils.js +365 -0
  17. package/dist/llm/driver-v2/saying-events.js +20 -0
  18. package/dist/llm/driver-v2/subdialog-txn.js +42 -0
  19. package/dist/llm/driver-v2/supdialog-response.js +400 -0
  20. package/dist/llm/driver-v2/tellask-bridge.js +1148 -0
  21. package/dist/llm/driver-v2/types.js +10 -0
  22. package/dist/llm/driver-v2-ref-only/context-health.js +121 -0
  23. package/dist/llm/driver-v2-ref-only/context.js +17 -0
  24. package/dist/llm/driver-v2-ref-only/core.js +1710 -0
  25. package/dist/llm/driver-v2-ref-only/index.js +26 -0
  26. package/dist/llm/driver-v2-ref-only/orchestrator.js +158 -0
  27. package/dist/llm/driver-v2-ref-only/policy.js +129 -0
  28. package/dist/llm/driver-v2-ref-only/restore-dialog-hierarchy.js +73 -0
  29. package/dist/llm/driver-v2-ref-only/round.js +366 -0
  30. package/dist/llm/driver-v2-ref-only/runtime-utils.js +473 -0
  31. package/dist/llm/driver-v2-ref-only/saying-events.js +18 -0
  32. package/dist/llm/driver-v2-ref-only/subdialog-txn.js +42 -0
  33. package/dist/llm/driver-v2-ref-only/supdialog-response.js +453 -0
  34. package/dist/llm/driver-v2-ref-only/tellask-bridge.js +1178 -0
  35. package/dist/llm/driver-v2-ref-only/types.js +10 -0
  36. package/dist/static/assets/{_basePickBy-DSCRdLZO.js → _basePickBy-BI5Rq0uy.js} +3 -3
  37. package/dist/static/assets/{_basePickBy-DSCRdLZO.js.map → _basePickBy-BI5Rq0uy.js.map} +1 -1
  38. package/dist/static/assets/{_baseUniq-4QF_OoKK.js → _baseUniq-B198d-KY.js} +2 -2
  39. package/dist/static/assets/{_baseUniq-4QF_OoKK.js.map → _baseUniq-B198d-KY.js.map} +1 -1
  40. package/dist/static/assets/{arc-BVQeKKx9.js → arc-DaOMBOGX.js} +2 -2
  41. package/dist/static/assets/{arc-BVQeKKx9.js.map → arc-DaOMBOGX.js.map} +1 -1
  42. package/dist/static/assets/{architectureDiagram-VXUJARFQ-B4I8KFTn.js → architectureDiagram-VXUJARFQ-D-S9nnw1.js} +7 -7
  43. package/dist/static/assets/{architectureDiagram-VXUJARFQ-B4I8KFTn.js.map → architectureDiagram-VXUJARFQ-D-S9nnw1.js.map} +1 -1
  44. package/dist/static/assets/{blockDiagram-VD42YOAC-CexS18Qs.js → blockDiagram-VD42YOAC-BTOxO1BR.js} +7 -7
  45. package/dist/static/assets/{blockDiagram-VD42YOAC-CexS18Qs.js.map → blockDiagram-VD42YOAC-BTOxO1BR.js.map} +1 -1
  46. package/dist/static/assets/{c4Diagram-YG6GDRKO-CuSqcxrm.js → c4Diagram-YG6GDRKO-BC30TrOS.js} +3 -3
  47. package/dist/static/assets/{c4Diagram-YG6GDRKO-CuSqcxrm.js.map → c4Diagram-YG6GDRKO-BC30TrOS.js.map} +1 -1
  48. package/dist/static/assets/{channel-BYCxsEk5.js → channel-BxJm9rVf.js} +2 -2
  49. package/dist/static/assets/{channel-BYCxsEk5.js.map → channel-BxJm9rVf.js.map} +1 -1
  50. package/dist/static/assets/{chunk-4BX2VUAB-N8tlmsFc.js → chunk-4BX2VUAB-DZhNVfjS.js} +2 -2
  51. package/dist/static/assets/{chunk-4BX2VUAB-N8tlmsFc.js.map → chunk-4BX2VUAB-DZhNVfjS.js.map} +1 -1
  52. package/dist/static/assets/{chunk-55IACEB6-DxOFWSAF.js → chunk-55IACEB6-CNu24wD5.js} +2 -2
  53. package/dist/static/assets/{chunk-55IACEB6-DxOFWSAF.js.map → chunk-55IACEB6-CNu24wD5.js.map} +1 -1
  54. package/dist/static/assets/{chunk-B4BG7PRW-C1tSyN_l.js → chunk-B4BG7PRW-B4pvVnuq.js} +5 -5
  55. package/dist/static/assets/{chunk-B4BG7PRW-C1tSyN_l.js.map → chunk-B4BG7PRW-B4pvVnuq.js.map} +1 -1
  56. package/dist/static/assets/{chunk-DI55MBZ5-BTmIrFZd.js → chunk-DI55MBZ5-DPtQdiEz.js} +4 -4
  57. package/dist/static/assets/{chunk-DI55MBZ5-BTmIrFZd.js.map → chunk-DI55MBZ5-DPtQdiEz.js.map} +1 -1
  58. package/dist/static/assets/{chunk-FMBD7UC4-s7Uar1x2.js → chunk-FMBD7UC4-BvHbQUmg.js} +2 -2
  59. package/dist/static/assets/{chunk-FMBD7UC4-s7Uar1x2.js.map → chunk-FMBD7UC4-BvHbQUmg.js.map} +1 -1
  60. package/dist/static/assets/{chunk-QN33PNHL-DC20K06j.js → chunk-QN33PNHL-BDzIqYT9.js} +2 -2
  61. package/dist/static/assets/{chunk-QN33PNHL-DC20K06j.js.map → chunk-QN33PNHL-BDzIqYT9.js.map} +1 -1
  62. package/dist/static/assets/{chunk-QZHKN3VN-6mPLLfRu.js → chunk-QZHKN3VN-DCSYTX8L.js} +2 -2
  63. package/dist/static/assets/{chunk-QZHKN3VN-6mPLLfRu.js.map → chunk-QZHKN3VN-DCSYTX8L.js.map} +1 -1
  64. package/dist/static/assets/{chunk-TZMSLE5B-GrDvKWzz.js → chunk-TZMSLE5B-CSzc4mi_.js} +2 -2
  65. package/dist/static/assets/{chunk-TZMSLE5B-GrDvKWzz.js.map → chunk-TZMSLE5B-CSzc4mi_.js.map} +1 -1
  66. package/dist/static/assets/{classDiagram-2ON5EDUG-fO59bj9m.js → classDiagram-2ON5EDUG-CJsEP-fz.js} +6 -6
  67. package/dist/static/assets/{classDiagram-2ON5EDUG-fO59bj9m.js.map → classDiagram-2ON5EDUG-CJsEP-fz.js.map} +1 -1
  68. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-fO59bj9m.js → classDiagram-v2-WZHVMYZB-CJsEP-fz.js} +6 -6
  69. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-fO59bj9m.js.map → classDiagram-v2-WZHVMYZB-CJsEP-fz.js.map} +1 -1
  70. package/dist/static/assets/{clone-IE0Tnwxn.js → clone-CNyZHFPL.js} +2 -2
  71. package/dist/static/assets/{clone-IE0Tnwxn.js.map → clone-CNyZHFPL.js.map} +1 -1
  72. package/dist/static/assets/{cose-bilkent-S5V4N54A-CfeoQnK-.js → cose-bilkent-S5V4N54A-DMvvhmW4.js} +2 -2
  73. package/dist/static/assets/{cose-bilkent-S5V4N54A-CfeoQnK-.js.map → cose-bilkent-S5V4N54A-DMvvhmW4.js.map} +1 -1
  74. package/dist/static/assets/{dagre-6UL2VRFP-DsiyUZhi.js → dagre-6UL2VRFP-BuNhcUpS.js} +7 -7
  75. package/dist/static/assets/{dagre-6UL2VRFP-DsiyUZhi.js.map → dagre-6UL2VRFP-BuNhcUpS.js.map} +1 -1
  76. package/dist/static/assets/{diagram-PSM6KHXK-IAjJ50CC.js → diagram-PSM6KHXK-D0APVthl.js} +8 -8
  77. package/dist/static/assets/{diagram-PSM6KHXK-IAjJ50CC.js.map → diagram-PSM6KHXK-D0APVthl.js.map} +1 -1
  78. package/dist/static/assets/{diagram-QEK2KX5R-DiZLndjJ.js → diagram-QEK2KX5R-_TJXK1XR.js} +7 -7
  79. package/dist/static/assets/{diagram-QEK2KX5R-DiZLndjJ.js.map → diagram-QEK2KX5R-_TJXK1XR.js.map} +1 -1
  80. package/dist/static/assets/{diagram-S2PKOQOG-ZL3Kts-u.js → diagram-S2PKOQOG-D58YgxwF.js} +7 -7
  81. package/dist/static/assets/{diagram-S2PKOQOG-ZL3Kts-u.js.map → diagram-S2PKOQOG-D58YgxwF.js.map} +1 -1
  82. package/dist/static/assets/{erDiagram-Q2GNP2WA-DbVLZtGY.js → erDiagram-Q2GNP2WA-DoStgM_4.js} +5 -5
  83. package/dist/static/assets/{erDiagram-Q2GNP2WA-DbVLZtGY.js.map → erDiagram-Q2GNP2WA-DoStgM_4.js.map} +1 -1
  84. package/dist/static/assets/{flowDiagram-NV44I4VS-CVd2p2Br.js → flowDiagram-NV44I4VS-CjRvEre8.js} +6 -6
  85. package/dist/static/assets/{flowDiagram-NV44I4VS-CVd2p2Br.js.map → flowDiagram-NV44I4VS-CjRvEre8.js.map} +1 -1
  86. package/dist/static/assets/{ganttDiagram-JELNMOA3-6NsYNEcf.js → ganttDiagram-JELNMOA3-BUTAh-bt.js} +3 -3
  87. package/dist/static/assets/{ganttDiagram-JELNMOA3-6NsYNEcf.js.map → ganttDiagram-JELNMOA3-BUTAh-bt.js.map} +1 -1
  88. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-B0Y7WTbj.js → gitGraphDiagram-V2S2FVAM-jNkE61r9.js} +8 -8
  89. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-B0Y7WTbj.js.map → gitGraphDiagram-V2S2FVAM-jNkE61r9.js.map} +1 -1
  90. package/dist/static/assets/{graph-BE1Fw6SE.js → graph-CCjti2O0.js} +3 -3
  91. package/dist/static/assets/{graph-BE1Fw6SE.js.map → graph-CCjti2O0.js.map} +1 -1
  92. package/dist/static/assets/{index-1Tlt2ebA.js → index-DLmfFirx.js} +328 -320
  93. package/dist/static/assets/index-DLmfFirx.js.map +1 -0
  94. package/dist/static/assets/{infoDiagram-HS3SLOUP-p6CQsk4A.js → infoDiagram-HS3SLOUP-BFxdxbX3.js} +6 -6
  95. package/dist/static/assets/{infoDiagram-HS3SLOUP-p6CQsk4A.js.map → infoDiagram-HS3SLOUP-BFxdxbX3.js.map} +1 -1
  96. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-DR4cvYtN.js → journeyDiagram-XKPGCS4Q-BCLnxPc7.js} +5 -5
  97. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-DR4cvYtN.js.map → journeyDiagram-XKPGCS4Q-BCLnxPc7.js.map} +1 -1
  98. package/dist/static/assets/{kanban-definition-3W4ZIXB7-JPOdtj9o.js → kanban-definition-3W4ZIXB7-BDeqtjCx.js} +3 -3
  99. package/dist/static/assets/{kanban-definition-3W4ZIXB7-JPOdtj9o.js.map → kanban-definition-3W4ZIXB7-BDeqtjCx.js.map} +1 -1
  100. package/dist/static/assets/{layout-BOn5O0Mv.js → layout-BcSBhjCx.js} +5 -5
  101. package/dist/static/assets/{layout-BOn5O0Mv.js.map → layout-BcSBhjCx.js.map} +1 -1
  102. package/dist/static/assets/{linear-BVAPTXI-.js → linear-yE500fJs.js} +2 -2
  103. package/dist/static/assets/{linear-BVAPTXI-.js.map → linear-yE500fJs.js.map} +1 -1
  104. package/dist/static/assets/{mindmap-definition-VGOIOE7T-DUJXw6w6.js → mindmap-definition-VGOIOE7T-B7T5bXb-.js} +4 -4
  105. package/dist/static/assets/{mindmap-definition-VGOIOE7T-DUJXw6w6.js.map → mindmap-definition-VGOIOE7T-B7T5bXb-.js.map} +1 -1
  106. package/dist/static/assets/{pieDiagram-ADFJNKIX-76JJOJvZ.js → pieDiagram-ADFJNKIX-CWFbaJ0k.js} +8 -8
  107. package/dist/static/assets/{pieDiagram-ADFJNKIX-76JJOJvZ.js.map → pieDiagram-ADFJNKIX-CWFbaJ0k.js.map} +1 -1
  108. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-iKXJUo4i.js → quadrantDiagram-AYHSOK5B-DNdamKCt.js} +3 -3
  109. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-iKXJUo4i.js.map → quadrantDiagram-AYHSOK5B-DNdamKCt.js.map} +1 -1
  110. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-B0uk_5yk.js → requirementDiagram-UZGBJVZJ-Ct8UB1vk.js} +4 -4
  111. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-B0uk_5yk.js.map → requirementDiagram-UZGBJVZJ-Ct8UB1vk.js.map} +1 -1
  112. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-O3weNg52.js → sankeyDiagram-TZEHDZUN-DC7E0Ymo.js} +2 -2
  113. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-O3weNg52.js.map → sankeyDiagram-TZEHDZUN-DC7E0Ymo.js.map} +1 -1
  114. package/dist/static/assets/{sequenceDiagram-WL72ISMW-DFnXuPNE.js → sequenceDiagram-WL72ISMW-IiC8_KXA.js} +4 -4
  115. package/dist/static/assets/{sequenceDiagram-WL72ISMW-DFnXuPNE.js.map → sequenceDiagram-WL72ISMW-IiC8_KXA.js.map} +1 -1
  116. package/dist/static/assets/{stateDiagram-FKZM4ZOC-BZjZXttD.js → stateDiagram-FKZM4ZOC-CCJb2r9z.js} +9 -9
  117. package/dist/static/assets/{stateDiagram-FKZM4ZOC-BZjZXttD.js.map → stateDiagram-FKZM4ZOC-CCJb2r9z.js.map} +1 -1
  118. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-C_R3IF0y.js → stateDiagram-v2-4FDKWEC3-BvHtU6GE.js} +5 -5
  119. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-C_R3IF0y.js.map → stateDiagram-v2-4FDKWEC3-BvHtU6GE.js.map} +1 -1
  120. package/dist/static/assets/{timeline-definition-IT6M3QCI-Kkhw0x0F.js → timeline-definition-IT6M3QCI-Bn2Z-SBO.js} +3 -3
  121. package/dist/static/assets/{timeline-definition-IT6M3QCI-Kkhw0x0F.js.map → timeline-definition-IT6M3QCI-Bn2Z-SBO.js.map} +1 -1
  122. package/dist/static/assets/{treemap-GDKQZRPO-DCcRUg7I.js → treemap-GDKQZRPO-BQopYfN_.js} +5 -5
  123. package/dist/static/assets/{treemap-GDKQZRPO-DCcRUg7I.js.map → treemap-GDKQZRPO-BQopYfN_.js.map} +1 -1
  124. package/dist/static/assets/{xychartDiagram-PRI3JC2R-DQKFjqLB.js → xychartDiagram-PRI3JC2R-CsLeQwkI.js} +3 -3
  125. package/dist/static/assets/{xychartDiagram-PRI3JC2R-DQKFjqLB.js.map → xychartDiagram-PRI3JC2R-CsLeQwkI.js.map} +1 -1
  126. package/dist/static/index.html +1 -1
  127. package/dist/tools/prompts/memory/en/errors.md +155 -0
  128. package/dist/tools/prompts/memory/en/index.md +47 -0
  129. package/dist/tools/prompts/memory/en/principles.md +79 -0
  130. package/dist/tools/prompts/memory/en/scenarios.md +174 -0
  131. package/dist/tools/prompts/memory/en/tools.md +154 -0
  132. package/dist/tools/prompts/memory/zh/errors.md +155 -0
  133. package/dist/tools/prompts/memory/zh/index.md +47 -0
  134. package/dist/tools/prompts/memory/zh/principles.md +79 -0
  135. package/dist/tools/prompts/memory/zh/scenarios.md +174 -0
  136. package/dist/tools/prompts/memory/zh/tools.md +154 -0
  137. package/package.json +1 -1
  138. package/dist/static/assets/index-1Tlt2ebA.js.map +0 -1
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.INSTALLED_APPS_REL_PATH = void 0;
7
+ exports.loadInstalledAppsFile = loadInstalledAppsFile;
8
+ exports.writeInstalledAppsFile = writeInstalledAppsFile;
9
+ exports.upsertInstalledApp = upsertInstalledApp;
10
+ exports.removeInstalledApp = removeInstalledApp;
11
+ exports.setAppEnabled = setAppEnabled;
12
+ exports.setAppRuntimePort = setAppRuntimePort;
13
+ exports.findInstalledApp = findInstalledApp;
14
+ const promises_1 = __importDefault(require("fs/promises"));
15
+ const path_1 = __importDefault(require("path"));
16
+ const yaml_1 = __importDefault(require("yaml"));
17
+ const time_1 = require("../shared/utils/time");
18
+ exports.INSTALLED_APPS_REL_PATH = path_1.default.join('.apps', 'installed.yaml');
19
+ function isRecord(v) {
20
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
21
+ }
22
+ function asString(v) {
23
+ return typeof v === 'string' ? v : null;
24
+ }
25
+ function asBool(v) {
26
+ return typeof v === 'boolean' ? v : null;
27
+ }
28
+ function asNullableNumber(v) {
29
+ if (v === null)
30
+ return null;
31
+ if (typeof v === 'number' && Number.isFinite(v))
32
+ return v;
33
+ return null;
34
+ }
35
+ function parseSource(v, at) {
36
+ if (!isRecord(v))
37
+ return { ok: false, errorText: `Invalid ${at}: expected object` };
38
+ const kind = asString(v['kind']);
39
+ if (kind !== 'npx' && kind !== 'local') {
40
+ return { ok: false, errorText: `Invalid ${at}.kind: expected 'npx'|'local'` };
41
+ }
42
+ if (kind === 'npx') {
43
+ const spec = asString(v['spec']);
44
+ if (!spec || spec.trim() === '')
45
+ return { ok: false, errorText: `Invalid ${at}.spec: required` };
46
+ return { ok: true, source: { kind, spec } };
47
+ }
48
+ const pathAbs = asString(v['pathAbs']);
49
+ if (!pathAbs || pathAbs.trim() === '')
50
+ return { ok: false, errorText: `Invalid ${at}.pathAbs: required` };
51
+ return { ok: true, source: { kind, pathAbs } };
52
+ }
53
+ function parseRuntime(v, at) {
54
+ if (!isRecord(v))
55
+ return { ok: false, errorText: `Invalid ${at}: expected object` };
56
+ const portRaw = v['port'];
57
+ const port = asNullableNumber(portRaw);
58
+ if (port === null) {
59
+ if (portRaw !== null) {
60
+ return { ok: false, errorText: `Invalid ${at}.port: expected number|null` };
61
+ }
62
+ return { ok: true, runtime: { port: null } };
63
+ }
64
+ if (port < 0 || !Number.isInteger(port))
65
+ return { ok: false, errorText: `Invalid ${at}.port: expected non-negative integer|null` };
66
+ return { ok: true, runtime: { port: port } };
67
+ }
68
+ function parseEntry(v, at) {
69
+ if (!isRecord(v))
70
+ return { ok: false, errorText: `Invalid ${at}: expected object` };
71
+ const id = asString(v['id']);
72
+ if (!id || id.trim() === '')
73
+ return { ok: false, errorText: `Invalid ${at}.id: required` };
74
+ const enabled = asBool(v['enabled']);
75
+ if (enabled === null)
76
+ return { ok: false, errorText: `Invalid ${at}.enabled: boolean required` };
77
+ const installedAt = asString(v['installedAt']);
78
+ const updatedAt = asString(v['updatedAt']);
79
+ if (!installedAt || installedAt.trim() === '')
80
+ return { ok: false, errorText: `Invalid ${at}.installedAt: required` };
81
+ if (!updatedAt || updatedAt.trim() === '')
82
+ return { ok: false, errorText: `Invalid ${at}.updatedAt: required` };
83
+ const sourceParsed = parseSource(v['source'], `${at}.source`);
84
+ if (!sourceParsed.ok)
85
+ return sourceParsed;
86
+ const runtimeParsed = parseRuntime(v['runtime'] ?? { port: null }, `${at}.runtime`);
87
+ if (!runtimeParsed.ok)
88
+ return runtimeParsed;
89
+ // installJson is validated by install/update command on write. On read we keep permissive:
90
+ // kernel will fail fast later if it needs a missing field.
91
+ const installJson = v['installJson'];
92
+ if (!isRecord(installJson))
93
+ return { ok: false, errorText: `Invalid ${at}.installJson: expected object` };
94
+ return {
95
+ ok: true,
96
+ entry: {
97
+ id,
98
+ enabled,
99
+ source: sourceParsed.source,
100
+ runtime: runtimeParsed.runtime,
101
+ installJson: installJson,
102
+ installedAt,
103
+ updatedAt,
104
+ },
105
+ };
106
+ }
107
+ async function loadInstalledAppsFile(params) {
108
+ const filePathAbs = path_1.default.resolve(params.rtwsRootAbs, exports.INSTALLED_APPS_REL_PATH);
109
+ let raw;
110
+ try {
111
+ raw = await promises_1.default.readFile(filePathAbs, 'utf-8');
112
+ }
113
+ catch (err) {
114
+ const isEnoent = typeof err === 'object' &&
115
+ err !== null &&
116
+ 'code' in err &&
117
+ err.code === 'ENOENT';
118
+ if (isEnoent) {
119
+ return { kind: 'ok', filePathAbs, file: { schemaVersion: 1, apps: [] } };
120
+ }
121
+ return {
122
+ kind: 'error',
123
+ filePathAbs,
124
+ errorText: err instanceof Error ? err.message : String(err),
125
+ };
126
+ }
127
+ let parsed;
128
+ try {
129
+ parsed = yaml_1.default.parse(raw);
130
+ }
131
+ catch (err) {
132
+ return {
133
+ kind: 'error',
134
+ filePathAbs,
135
+ errorText: `Failed to parse YAML: ${err instanceof Error ? err.message : String(err)}`,
136
+ };
137
+ }
138
+ if (!isRecord(parsed)) {
139
+ return { kind: 'error', filePathAbs, errorText: 'Invalid installed.yaml: expected object' };
140
+ }
141
+ const schemaVersion = parsed['schemaVersion'];
142
+ if (schemaVersion !== 1) {
143
+ return {
144
+ kind: 'error',
145
+ filePathAbs,
146
+ errorText: `Unsupported schemaVersion: ${String(schemaVersion)}`,
147
+ };
148
+ }
149
+ const appsRaw = parsed['apps'];
150
+ if (!Array.isArray(appsRaw)) {
151
+ return {
152
+ kind: 'error',
153
+ filePathAbs,
154
+ errorText: 'Invalid installed.yaml: apps must be an array',
155
+ };
156
+ }
157
+ const apps = [];
158
+ for (let i = 0; i < appsRaw.length; i += 1) {
159
+ const e = parseEntry(appsRaw[i], `apps[${i}]`);
160
+ if (!e.ok)
161
+ return { kind: 'error', filePathAbs, errorText: e.errorText };
162
+ apps.push(e.entry);
163
+ }
164
+ return { kind: 'ok', filePathAbs, file: { schemaVersion: 1, apps } };
165
+ }
166
+ async function writeInstalledAppsFile(params) {
167
+ const dirAbs = path_1.default.resolve(params.rtwsRootAbs, '.apps');
168
+ await promises_1.default.mkdir(dirAbs, { recursive: true });
169
+ const filePathAbs = path_1.default.resolve(params.rtwsRootAbs, exports.INSTALLED_APPS_REL_PATH);
170
+ const yamlText = yaml_1.default.stringify(params.file);
171
+ await promises_1.default.writeFile(filePathAbs, yamlText, 'utf-8');
172
+ }
173
+ function upsertInstalledApp(params) {
174
+ const apps = [...params.existing.apps];
175
+ const idx = apps.findIndex((a) => a.id === params.next.id);
176
+ if (idx >= 0) {
177
+ apps[idx] = params.next;
178
+ }
179
+ else {
180
+ apps.push(params.next);
181
+ }
182
+ return { schemaVersion: 1, apps };
183
+ }
184
+ function removeInstalledApp(params) {
185
+ return { schemaVersion: 1, apps: params.existing.apps.filter((a) => a.id !== params.appId) };
186
+ }
187
+ function setAppEnabled(params) {
188
+ const now = (0, time_1.formatUnifiedTimestamp)(new Date());
189
+ const apps = params.existing.apps.map((a) => a.id === params.appId ? { ...a, enabled: params.enabled, updatedAt: now } : a);
190
+ return { schemaVersion: 1, apps };
191
+ }
192
+ function setAppRuntimePort(params) {
193
+ const existingApp = findInstalledApp(params.existing, params.appId);
194
+ if (!existingApp)
195
+ return params.existing;
196
+ if (existingApp.runtime.port === params.port)
197
+ return params.existing;
198
+ const now = (0, time_1.formatUnifiedTimestamp)(new Date());
199
+ const apps = params.existing.apps.map((a) => a.id === params.appId
200
+ ? { ...a, runtime: { ...a.runtime, port: params.port }, updatedAt: now }
201
+ : a);
202
+ return { schemaVersion: 1, apps };
203
+ }
204
+ function findInstalledApp(file, appId) {
205
+ const found = file.apps.find((a) => a.id === appId);
206
+ return found ?? null;
207
+ }
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.resolveStableAppRuntimePort = resolveStableAppRuntimePort;
7
+ const node_net_1 = __importDefault(require("node:net"));
8
+ const STABLE_PORT_RANGE_START = 43000;
9
+ const STABLE_PORT_RANGE_END = 49999;
10
+ const PORT_MAX = 65535;
11
+ function isPositivePort(value) {
12
+ return (typeof value === 'number' &&
13
+ Number.isInteger(value) &&
14
+ value > 0 &&
15
+ value <= PORT_MAX &&
16
+ Number.isFinite(value));
17
+ }
18
+ function hashAppId(appId) {
19
+ // FNV-1a 32-bit hash for deterministic port probing order.
20
+ let hash = 0x811c9dc5;
21
+ for (let i = 0; i < appId.length; i += 1) {
22
+ hash ^= appId.charCodeAt(i);
23
+ hash = Math.imul(hash, 0x01000193);
24
+ }
25
+ return hash >>> 0;
26
+ }
27
+ function collectReservedPorts(existingApps, appId) {
28
+ const reserved = new Set();
29
+ for (const app of existingApps) {
30
+ if (app.id === appId)
31
+ continue;
32
+ if (isPositivePort(app.runtime.port)) {
33
+ reserved.add(app.runtime.port);
34
+ }
35
+ }
36
+ return reserved;
37
+ }
38
+ async function canBindPort(port) {
39
+ return await new Promise((resolve) => {
40
+ const server = node_net_1.default.createServer();
41
+ server.unref();
42
+ const finish = (ok) => {
43
+ server.removeAllListeners('error');
44
+ server.removeAllListeners('listening');
45
+ resolve(ok);
46
+ };
47
+ server.once('error', () => {
48
+ finish(false);
49
+ });
50
+ server.once('listening', () => {
51
+ server.close(() => finish(true));
52
+ });
53
+ server.listen({ host: '127.0.0.1', port, exclusive: true });
54
+ });
55
+ }
56
+ async function pickDeterministicAvailablePort(params) {
57
+ const rangeSize = STABLE_PORT_RANGE_END - STABLE_PORT_RANGE_START + 1;
58
+ if (rangeSize <= 0) {
59
+ throw new Error('Invalid stable app runtime port range configuration');
60
+ }
61
+ const baseHash = hashAppId(params.appId);
62
+ for (let i = 0; i < rangeSize; i += 1) {
63
+ const candidate = STABLE_PORT_RANGE_START + ((baseHash + i) % rangeSize);
64
+ if (params.reservedPorts.has(candidate))
65
+ continue;
66
+ if (await canBindPort(candidate))
67
+ return candidate;
68
+ }
69
+ throw new Error(`Failed to allocate stable runtime port for app '${params.appId}': no bindable port in ${STABLE_PORT_RANGE_START}-${STABLE_PORT_RANGE_END}`);
70
+ }
71
+ async function resolveStableAppRuntimePort(params) {
72
+ if (!params.installJson.frontend)
73
+ return null;
74
+ const reservedPorts = collectReservedPorts(params.existingApps, params.appId);
75
+ if (isPositivePort(params.existingRuntimePort)) {
76
+ if (reservedPorts.has(params.existingRuntimePort)) {
77
+ throw new Error(`Invalid installed apps state: runtime port ${params.existingRuntimePort} for '${params.appId}' collides with another installed app`);
78
+ }
79
+ return params.existingRuntimePort;
80
+ }
81
+ const defaultPort = params.installJson.frontend.defaultPort;
82
+ if (isPositivePort(defaultPort) &&
83
+ !reservedPorts.has(defaultPort) &&
84
+ (await canBindPort(defaultPort))) {
85
+ return defaultPort;
86
+ }
87
+ return await pickDeterministicAvailablePort({
88
+ appId: params.appId,
89
+ reservedPorts,
90
+ });
91
+ }
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.buildClearedMindInvalidationNotice = buildClearedMindInvalidationNotice;
37
+ exports.notifyWaitingDialogsOfClearedMind = notifyWaitingDialogsOfClearedMind;
38
+ const dialog_global_registry_1 = require("./dialog-global-registry");
39
+ const dialog_instance_registry_1 = require("./dialog-instance-registry");
40
+ const log_1 = require("./log");
41
+ const persistence_1 = require("./persistence");
42
+ const runtime_language_1 = require("./shared/runtime-language");
43
+ const inter_dialog_format_1 = require("./shared/utils/inter-dialog-format");
44
+ const pending_tellask_reminder_1 = require("./tools/pending-tellask-reminder");
45
+ function buildClearedMindInvalidationNotice(language) {
46
+ if (language === 'zh') {
47
+ return '系统反馈:诉请对象已清理头脑并开启新一程对话;本轮诉请已失效,请基于最新完整上下文重新诉请祂。';
48
+ }
49
+ return 'System notice: the callee cleared its mind and started a new course; this tellask round is no longer valid. Re-tellask with the latest complete context.';
50
+ }
51
+ async function loadWaitingOwnerRecords(dialog) {
52
+ const allDialogIds = await persistence_1.DialogPersistence.listAllDialogIds('running');
53
+ const results = [];
54
+ for (const candidateId of allDialogIds) {
55
+ if (candidateId.rootId !== dialog.id.rootId) {
56
+ continue;
57
+ }
58
+ const pending = await persistence_1.DialogPersistence.loadPendingSubdialogs(candidateId, 'running');
59
+ const matching = pending.filter((record) => record.subdialogId === dialog.id.selfId);
60
+ if (matching.length === 0) {
61
+ continue;
62
+ }
63
+ results.push({
64
+ ownerDialogId: candidateId,
65
+ pendingRecords: matching,
66
+ });
67
+ }
68
+ return results;
69
+ }
70
+ function resolveOwnerDialogFromCurrentTree(currentDialog, ownerDialogId) {
71
+ if (currentDialog.id.selfId === currentDialog.id.rootId) {
72
+ const rootDialog = currentDialog;
73
+ if (ownerDialogId === rootDialog.id.selfId) {
74
+ return rootDialog;
75
+ }
76
+ return rootDialog.lookupDialog(ownerDialogId);
77
+ }
78
+ // Rationale: in this code path, every non-root dialog is a SubDialog. Prefer the live
79
+ // in-memory root tree first so existing dialog objects receive state/message updates.
80
+ const rootDialog = currentDialog.rootDialog;
81
+ if (ownerDialogId === rootDialog.id.selfId) {
82
+ return rootDialog;
83
+ }
84
+ return rootDialog.lookupDialog(ownerDialogId);
85
+ }
86
+ async function resolveOwnerDialog(currentDialog, rootId, ownerDialogId) {
87
+ const live = resolveOwnerDialogFromCurrentTree(currentDialog, ownerDialogId.selfId);
88
+ if (live) {
89
+ return live;
90
+ }
91
+ const rootDialog = await (0, dialog_instance_registry_1.getOrRestoreRootDialog)(rootId, 'running');
92
+ if (!rootDialog) {
93
+ return undefined;
94
+ }
95
+ if (ownerDialogId.selfId === rootDialog.id.selfId) {
96
+ return rootDialog;
97
+ }
98
+ return await (0, dialog_instance_registry_1.ensureDialogLoaded)(rootDialog, ownerDialogId, 'running');
99
+ }
100
+ async function syncPendingTellaskReminderOrThrow(ownerDialog) {
101
+ const changed = await (0, pending_tellask_reminder_1.syncPendingTellaskReminderState)(ownerDialog);
102
+ if (!changed) {
103
+ return;
104
+ }
105
+ await ownerDialog.processReminderUpdates();
106
+ }
107
+ async function reviveOwnerDialogIfReady(ownerDialog) {
108
+ const hasQ4H = await ownerDialog.hasPendingQ4H();
109
+ const hasPendingSubdialogs = await ownerDialog.hasPendingSubdialogs();
110
+ if (hasQ4H || hasPendingSubdialogs) {
111
+ return;
112
+ }
113
+ if (ownerDialog.id.selfId === ownerDialog.id.rootId) {
114
+ const hasRegistryEntry = dialog_global_registry_1.globalDialogRegistry.get(ownerDialog.id.rootId) !== undefined;
115
+ await persistence_1.DialogPersistence.setNeedsDrive(ownerDialog.id, true, ownerDialog.status);
116
+ if (hasRegistryEntry) {
117
+ dialog_global_registry_1.globalDialogRegistry.markNeedsDrive(ownerDialog.id.rootId, {
118
+ source: 'kernel_driver_supply_response',
119
+ reason: 'callee_cleared_mind_invalidated_pending_waiters',
120
+ });
121
+ return;
122
+ }
123
+ }
124
+ const { driveDialogStream } = await Promise.resolve().then(() => __importStar(require('./llm/kernel-driver')));
125
+ void driveDialogStream(ownerDialog, undefined, true, {
126
+ suppressDiligencePush: ownerDialog.disableDiligencePush,
127
+ source: 'kernel_driver_supply_response_parent_revive',
128
+ reason: 'callee_cleared_mind_invalidated_pending_waiters',
129
+ });
130
+ }
131
+ async function notifyWaitingDialogsOfClearedMind(dialog) {
132
+ if (dialog.status !== 'running') {
133
+ return 0;
134
+ }
135
+ const waitingOwners = await loadWaitingOwnerRecords(dialog);
136
+ if (waitingOwners.length === 0) {
137
+ return 0;
138
+ }
139
+ const language = (0, runtime_language_1.getWorkLanguage)();
140
+ const responseBody = buildClearedMindInvalidationNotice(language);
141
+ let totalInvalidated = 0;
142
+ for (const owner of waitingOwners) {
143
+ const ownerDialog = await resolveOwnerDialog(dialog, dialog.id.rootId, owner.ownerDialogId);
144
+ if (!ownerDialog) {
145
+ throw new Error(`Failed to restore owner dialog while invalidating cleared-mind tellask waiters: root=${dialog.id.rootId} owner=${owner.ownerDialogId.valueOf()} callee=${dialog.id.valueOf()}`);
146
+ }
147
+ const pendingOutcome = await persistence_1.DialogPersistence.mutatePendingSubdialogs(ownerDialog.id, (previous) => {
148
+ const next = previous.filter((record) => record.subdialogId !== dialog.id.selfId);
149
+ return { kind: 'replace', records: next };
150
+ }, undefined, ownerDialog.status);
151
+ for (const pendingRecord of owner.pendingRecords) {
152
+ const requesterId = ownerDialog.agentId;
153
+ const response = (0, inter_dialog_format_1.formatTeammateResponseContent)({
154
+ callName: pendingRecord.callName,
155
+ responderId: dialog.agentId,
156
+ requesterId,
157
+ mentionList: pendingRecord.mentionList,
158
+ sessionSlug: pendingRecord.sessionSlug,
159
+ tellaskContent: pendingRecord.tellaskContent,
160
+ responseBody,
161
+ status: 'failed',
162
+ language,
163
+ });
164
+ await ownerDialog.receiveTeammateResponse(dialog.agentId, pendingRecord.callName, pendingRecord.mentionList, pendingRecord.tellaskContent, 'failed', dialog.id, {
165
+ response,
166
+ agentId: dialog.agentId,
167
+ callId: pendingRecord.callId,
168
+ originMemberId: requesterId,
169
+ sessionSlug: pendingRecord.sessionSlug,
170
+ });
171
+ const immediateMirror = {
172
+ type: 'tellask_result_msg',
173
+ role: 'tool',
174
+ responderId: dialog.agentId,
175
+ mentionList: pendingRecord.mentionList,
176
+ tellaskContent: pendingRecord.tellaskContent,
177
+ status: 'failed',
178
+ callId: pendingRecord.callId,
179
+ content: response,
180
+ };
181
+ await ownerDialog.addChatMessages(immediateMirror);
182
+ totalInvalidated += 1;
183
+ }
184
+ try {
185
+ await syncPendingTellaskReminderOrThrow(ownerDialog);
186
+ }
187
+ catch (err) {
188
+ log_1.log.error('Failed to sync pending-tellask reminder after cleared-mind invalidation', err, {
189
+ rootId: dialog.id.rootId,
190
+ calleeDialogId: dialog.id.selfId,
191
+ ownerDialogId: ownerDialog.id.selfId,
192
+ });
193
+ throw err;
194
+ }
195
+ if (pendingOutcome.records.length === 0) {
196
+ await reviveOwnerDialogIfReady(ownerDialog);
197
+ }
198
+ }
199
+ return totalInvalidated;
200
+ }
package/dist/dialog.js CHANGED
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.DialogStore = exports.RootDialog = exports.SubDialog = exports.Dialog = exports.DialogID = void 0;
4
37
  /**
@@ -663,6 +696,8 @@ class Dialog {
663
696
  runControl: runControlSpec,
664
697
  });
665
698
  }
699
+ const { notifyWaitingDialogsOfClearedMind } = await Promise.resolve().then(() => __importStar(require('./course-transition')));
700
+ await notifyWaitingDialogsOfClearedMind(this);
666
701
  }
667
702
  // Proxy methods for DialogStore - route calls through dialog object instead of direct dlgStore access
668
703
  async receiveFuncResult(result) {