dominds 1.6.7 → 1.7.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.
Files changed (152) 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 +40 -12
  4. package/dist/dialog-fork.js +10 -6
  5. package/dist/dialog.js +12 -12
  6. package/dist/docs/kernel-app-architecture.md +286 -0
  7. package/dist/docs/kernel-app-architecture.zh.md +285 -0
  8. package/dist/llm/driver-entry.js +28 -0
  9. package/dist/llm/driver-v2/context-health.js +121 -0
  10. package/dist/llm/driver-v2/context.js +56 -0
  11. package/dist/llm/driver-v2/core.js +1545 -0
  12. package/dist/llm/driver-v2/index.js +26 -0
  13. package/dist/llm/driver-v2/orchestrator.js +158 -0
  14. package/dist/llm/driver-v2/policy.js +129 -0
  15. package/dist/llm/driver-v2/restore-dialog-hierarchy.js +73 -0
  16. package/dist/llm/driver-v2/round.js +366 -0
  17. package/dist/llm/driver-v2/runtime-utils.js +365 -0
  18. package/dist/llm/driver-v2/saying-events.js +20 -0
  19. package/dist/llm/driver-v2/subdialog-txn.js +42 -0
  20. package/dist/llm/driver-v2/supdialog-response.js +400 -0
  21. package/dist/llm/driver-v2/tellask-bridge.js +1148 -0
  22. package/dist/llm/driver-v2/types.js +10 -0
  23. package/dist/llm/driver-v2-ref-only/context-health.js +121 -0
  24. package/dist/llm/driver-v2-ref-only/context.js +17 -0
  25. package/dist/llm/driver-v2-ref-only/core.js +1710 -0
  26. package/dist/llm/driver-v2-ref-only/index.js +26 -0
  27. package/dist/llm/driver-v2-ref-only/orchestrator.js +158 -0
  28. package/dist/llm/driver-v2-ref-only/policy.js +129 -0
  29. package/dist/llm/driver-v2-ref-only/restore-dialog-hierarchy.js +73 -0
  30. package/dist/llm/driver-v2-ref-only/round.js +366 -0
  31. package/dist/llm/driver-v2-ref-only/runtime-utils.js +473 -0
  32. package/dist/llm/driver-v2-ref-only/saying-events.js +18 -0
  33. package/dist/llm/driver-v2-ref-only/subdialog-txn.js +42 -0
  34. package/dist/llm/driver-v2-ref-only/supdialog-response.js +453 -0
  35. package/dist/llm/driver-v2-ref-only/tellask-bridge.js +1178 -0
  36. package/dist/llm/driver-v2-ref-only/types.js +10 -0
  37. package/dist/llm/gen/anthropic.js +1 -1
  38. package/dist/llm/gen/codex.js +1 -0
  39. package/dist/llm/gen/mock.js +5 -0
  40. package/dist/llm/gen/openai-compatible.js +1 -0
  41. package/dist/llm/gen/openai.js +1 -0
  42. package/dist/llm/kernel-driver/context.js +7 -2
  43. package/dist/llm/kernel-driver/drive.js +1 -1
  44. package/dist/llm/kernel-driver/flow.js +2 -2
  45. package/dist/llm/kernel-driver/subdialog.js +42 -14
  46. package/dist/llm/kernel-driver/tellask-special.js +11 -11
  47. package/dist/persistence.js +361 -73
  48. package/dist/priming.js +203 -27
  49. package/dist/server/websocket-handler.js +1 -1
  50. package/dist/shared/utils/inter-dialog-format.js +79 -2
  51. package/dist/static/assets/{_basePickBy-B9gw9xu3.js → _basePickBy-B5JpcIlf.js} +3 -3
  52. package/dist/static/assets/{_basePickBy-B9gw9xu3.js.map → _basePickBy-B5JpcIlf.js.map} +1 -1
  53. package/dist/static/assets/{_baseUniq-CdteP2Ad.js → _baseUniq-B6ENA5xp.js} +2 -2
  54. package/dist/static/assets/{_baseUniq-CdteP2Ad.js.map → _baseUniq-B6ENA5xp.js.map} +1 -1
  55. package/dist/static/assets/{arc-BaFSInZP.js → arc-CztgHQ6S.js} +2 -2
  56. package/dist/static/assets/{arc-BaFSInZP.js.map → arc-CztgHQ6S.js.map} +1 -1
  57. package/dist/static/assets/{architectureDiagram-VXUJARFQ-kO0ROBqa.js → architectureDiagram-VXUJARFQ-CdI-KLc0.js} +7 -7
  58. package/dist/static/assets/{architectureDiagram-VXUJARFQ-kO0ROBqa.js.map → architectureDiagram-VXUJARFQ-CdI-KLc0.js.map} +1 -1
  59. package/dist/static/assets/{blockDiagram-VD42YOAC-D766EIYA.js → blockDiagram-VD42YOAC-BALBf4XM.js} +7 -7
  60. package/dist/static/assets/{blockDiagram-VD42YOAC-D766EIYA.js.map → blockDiagram-VD42YOAC-BALBf4XM.js.map} +1 -1
  61. package/dist/static/assets/{c4Diagram-YG6GDRKO-DwL98wWS.js → c4Diagram-YG6GDRKO-a1k6yPrP.js} +3 -3
  62. package/dist/static/assets/{c4Diagram-YG6GDRKO-DwL98wWS.js.map → c4Diagram-YG6GDRKO-a1k6yPrP.js.map} +1 -1
  63. package/dist/static/assets/{channel-CcUPWS87.js → channel-CWNdqJ-I.js} +2 -2
  64. package/dist/static/assets/{channel-CcUPWS87.js.map → channel-CWNdqJ-I.js.map} +1 -1
  65. package/dist/static/assets/{chunk-4BX2VUAB-BeTSwCuA.js → chunk-4BX2VUAB-BQeTUB5q.js} +2 -2
  66. package/dist/static/assets/{chunk-4BX2VUAB-BeTSwCuA.js.map → chunk-4BX2VUAB-BQeTUB5q.js.map} +1 -1
  67. package/dist/static/assets/{chunk-55IACEB6-C6Tzr8i_.js → chunk-55IACEB6-DDefFY4X.js} +2 -2
  68. package/dist/static/assets/{chunk-55IACEB6-C6Tzr8i_.js.map → chunk-55IACEB6-DDefFY4X.js.map} +1 -1
  69. package/dist/static/assets/{chunk-B4BG7PRW-DSi9x25j.js → chunk-B4BG7PRW-B3r4W-g_.js} +5 -5
  70. package/dist/static/assets/{chunk-B4BG7PRW-DSi9x25j.js.map → chunk-B4BG7PRW-B3r4W-g_.js.map} +1 -1
  71. package/dist/static/assets/{chunk-DI55MBZ5-CfAPRphL.js → chunk-DI55MBZ5-BDKIjQbt.js} +4 -4
  72. package/dist/static/assets/{chunk-DI55MBZ5-CfAPRphL.js.map → chunk-DI55MBZ5-BDKIjQbt.js.map} +1 -1
  73. package/dist/static/assets/{chunk-FMBD7UC4-B-M6vSiI.js → chunk-FMBD7UC4-BRjO7LO2.js} +2 -2
  74. package/dist/static/assets/{chunk-FMBD7UC4-B-M6vSiI.js.map → chunk-FMBD7UC4-BRjO7LO2.js.map} +1 -1
  75. package/dist/static/assets/{chunk-QN33PNHL-yU2oNaRc.js → chunk-QN33PNHL-DtUbDqMq.js} +2 -2
  76. package/dist/static/assets/{chunk-QN33PNHL-yU2oNaRc.js.map → chunk-QN33PNHL-DtUbDqMq.js.map} +1 -1
  77. package/dist/static/assets/{chunk-QZHKN3VN-jPTrvtzO.js → chunk-QZHKN3VN-HvxW4tgI.js} +2 -2
  78. package/dist/static/assets/{chunk-QZHKN3VN-jPTrvtzO.js.map → chunk-QZHKN3VN-HvxW4tgI.js.map} +1 -1
  79. package/dist/static/assets/{chunk-TZMSLE5B-Bls_D3TM.js → chunk-TZMSLE5B-8kvbFL8c.js} +2 -2
  80. package/dist/static/assets/{chunk-TZMSLE5B-Bls_D3TM.js.map → chunk-TZMSLE5B-8kvbFL8c.js.map} +1 -1
  81. package/dist/static/assets/{classDiagram-2ON5EDUG-6HSV8O5b.js → classDiagram-2ON5EDUG-BT0K1-Ue.js} +6 -6
  82. package/dist/static/assets/{classDiagram-2ON5EDUG-6HSV8O5b.js.map → classDiagram-2ON5EDUG-BT0K1-Ue.js.map} +1 -1
  83. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-6HSV8O5b.js → classDiagram-v2-WZHVMYZB-BT0K1-Ue.js} +6 -6
  84. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-6HSV8O5b.js.map → classDiagram-v2-WZHVMYZB-BT0K1-Ue.js.map} +1 -1
  85. package/dist/static/assets/{clone-CtKoD5Su.js → clone-C8ji-9VG.js} +2 -2
  86. package/dist/static/assets/{clone-CtKoD5Su.js.map → clone-C8ji-9VG.js.map} +1 -1
  87. package/dist/static/assets/{cose-bilkent-S5V4N54A-C8Q_0ZER.js → cose-bilkent-S5V4N54A-DgZIHStr.js} +2 -2
  88. package/dist/static/assets/{cose-bilkent-S5V4N54A-C8Q_0ZER.js.map → cose-bilkent-S5V4N54A-DgZIHStr.js.map} +1 -1
  89. package/dist/static/assets/{dagre-6UL2VRFP-CYIohfVW.js → dagre-6UL2VRFP-CoLMSS7V.js} +7 -7
  90. package/dist/static/assets/{dagre-6UL2VRFP-CYIohfVW.js.map → dagre-6UL2VRFP-CoLMSS7V.js.map} +1 -1
  91. package/dist/static/assets/{diagram-PSM6KHXK-BTYKp-4w.js → diagram-PSM6KHXK-BbaRu7Ko.js} +8 -8
  92. package/dist/static/assets/{diagram-PSM6KHXK-BTYKp-4w.js.map → diagram-PSM6KHXK-BbaRu7Ko.js.map} +1 -1
  93. package/dist/static/assets/{diagram-QEK2KX5R-CopAPXBx.js → diagram-QEK2KX5R-w2QJoEvf.js} +7 -7
  94. package/dist/static/assets/{diagram-QEK2KX5R-CopAPXBx.js.map → diagram-QEK2KX5R-w2QJoEvf.js.map} +1 -1
  95. package/dist/static/assets/{diagram-S2PKOQOG-BxYzu2CQ.js → diagram-S2PKOQOG-CZ3V7aTH.js} +7 -7
  96. package/dist/static/assets/{diagram-S2PKOQOG-BxYzu2CQ.js.map → diagram-S2PKOQOG-CZ3V7aTH.js.map} +1 -1
  97. package/dist/static/assets/{erDiagram-Q2GNP2WA-8SOoYoCD.js → erDiagram-Q2GNP2WA-B_D5zZGW.js} +5 -5
  98. package/dist/static/assets/{erDiagram-Q2GNP2WA-8SOoYoCD.js.map → erDiagram-Q2GNP2WA-B_D5zZGW.js.map} +1 -1
  99. package/dist/static/assets/{flowDiagram-NV44I4VS-x3ds9tRp.js → flowDiagram-NV44I4VS-CdleeZSt.js} +6 -6
  100. package/dist/static/assets/{flowDiagram-NV44I4VS-x3ds9tRp.js.map → flowDiagram-NV44I4VS-CdleeZSt.js.map} +1 -1
  101. package/dist/static/assets/{ganttDiagram-JELNMOA3-JJe52R5B.js → ganttDiagram-JELNMOA3-D4I0mcXy.js} +3 -3
  102. package/dist/static/assets/{ganttDiagram-JELNMOA3-JJe52R5B.js.map → ganttDiagram-JELNMOA3-D4I0mcXy.js.map} +1 -1
  103. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-D5WErFAP.js → gitGraphDiagram-V2S2FVAM-2TDy5WsI.js} +8 -8
  104. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-D5WErFAP.js.map → gitGraphDiagram-V2S2FVAM-2TDy5WsI.js.map} +1 -1
  105. package/dist/static/assets/{graph-D2qG911_.js → graph-6qmT9kvE.js} +3 -3
  106. package/dist/static/assets/{graph-D2qG911_.js.map → graph-6qmT9kvE.js.map} +1 -1
  107. package/dist/static/assets/{index-BRvFzt7r.js → index-DZjf7VGN.js} +272 -80
  108. package/dist/static/assets/{index-BRvFzt7r.js.map → index-DZjf7VGN.js.map} +1 -1
  109. package/dist/static/assets/{infoDiagram-HS3SLOUP-CJgZXXei.js → infoDiagram-HS3SLOUP-Cdngu1wO.js} +6 -6
  110. package/dist/static/assets/{infoDiagram-HS3SLOUP-CJgZXXei.js.map → infoDiagram-HS3SLOUP-Cdngu1wO.js.map} +1 -1
  111. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-DsA_9YlY.js → journeyDiagram-XKPGCS4Q-C8JGH9qX.js} +5 -5
  112. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-DsA_9YlY.js.map → journeyDiagram-XKPGCS4Q-C8JGH9qX.js.map} +1 -1
  113. package/dist/static/assets/{kanban-definition-3W4ZIXB7-l0WL_yMI.js → kanban-definition-3W4ZIXB7-CgcdAoUr.js} +3 -3
  114. package/dist/static/assets/{kanban-definition-3W4ZIXB7-l0WL_yMI.js.map → kanban-definition-3W4ZIXB7-CgcdAoUr.js.map} +1 -1
  115. package/dist/static/assets/{layout-CpX1UYDN.js → layout--9zDsdfQ.js} +5 -5
  116. package/dist/static/assets/{layout-CpX1UYDN.js.map → layout--9zDsdfQ.js.map} +1 -1
  117. package/dist/static/assets/{linear-BwAZ1jvU.js → linear-f6M3OqrG.js} +2 -2
  118. package/dist/static/assets/{linear-BwAZ1jvU.js.map → linear-f6M3OqrG.js.map} +1 -1
  119. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CbPr4yzk.js → mindmap-definition-VGOIOE7T-O6D8o0NA.js} +4 -4
  120. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CbPr4yzk.js.map → mindmap-definition-VGOIOE7T-O6D8o0NA.js.map} +1 -1
  121. package/dist/static/assets/{pieDiagram-ADFJNKIX-Dm1nDIqq.js → pieDiagram-ADFJNKIX-B73iJXia.js} +8 -8
  122. package/dist/static/assets/{pieDiagram-ADFJNKIX-Dm1nDIqq.js.map → pieDiagram-ADFJNKIX-B73iJXia.js.map} +1 -1
  123. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-ZsrsqMXx.js → quadrantDiagram-AYHSOK5B-1MkdhL3o.js} +3 -3
  124. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-ZsrsqMXx.js.map → quadrantDiagram-AYHSOK5B-1MkdhL3o.js.map} +1 -1
  125. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-Dcm7em76.js → requirementDiagram-UZGBJVZJ-BANDg6Jt.js} +4 -4
  126. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-Dcm7em76.js.map → requirementDiagram-UZGBJVZJ-BANDg6Jt.js.map} +1 -1
  127. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CZaCjU14.js → sankeyDiagram-TZEHDZUN-XEoMNqRv.js} +2 -2
  128. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CZaCjU14.js.map → sankeyDiagram-TZEHDZUN-XEoMNqRv.js.map} +1 -1
  129. package/dist/static/assets/{sequenceDiagram-WL72ISMW-CcfoaMSR.js → sequenceDiagram-WL72ISMW-Brw-9CPI.js} +4 -4
  130. package/dist/static/assets/{sequenceDiagram-WL72ISMW-CcfoaMSR.js.map → sequenceDiagram-WL72ISMW-Brw-9CPI.js.map} +1 -1
  131. package/dist/static/assets/{stateDiagram-FKZM4ZOC-BVIDD43e.js → stateDiagram-FKZM4ZOC-CVzsrvr2.js} +9 -9
  132. package/dist/static/assets/{stateDiagram-FKZM4ZOC-BVIDD43e.js.map → stateDiagram-FKZM4ZOC-CVzsrvr2.js.map} +1 -1
  133. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-B9GL2xr3.js → stateDiagram-v2-4FDKWEC3-B9j-EAhS.js} +5 -5
  134. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-B9GL2xr3.js.map → stateDiagram-v2-4FDKWEC3-B9j-EAhS.js.map} +1 -1
  135. package/dist/static/assets/{timeline-definition-IT6M3QCI-8iKDS8Ig.js → timeline-definition-IT6M3QCI-S3mM3ltV.js} +3 -3
  136. package/dist/static/assets/{timeline-definition-IT6M3QCI-8iKDS8Ig.js.map → timeline-definition-IT6M3QCI-S3mM3ltV.js.map} +1 -1
  137. package/dist/static/assets/{treemap-GDKQZRPO-CbxnTnrn.js → treemap-GDKQZRPO-Cf1b3Cgv.js} +5 -5
  138. package/dist/static/assets/{treemap-GDKQZRPO-CbxnTnrn.js.map → treemap-GDKQZRPO-Cf1b3Cgv.js.map} +1 -1
  139. package/dist/static/assets/{xychartDiagram-PRI3JC2R-C0KMwrOR.js → xychartDiagram-PRI3JC2R-CYvqfglb.js} +3 -3
  140. package/dist/static/assets/{xychartDiagram-PRI3JC2R-C0KMwrOR.js.map → xychartDiagram-PRI3JC2R-CYvqfglb.js.map} +1 -1
  141. package/dist/static/index.html +1 -1
  142. package/dist/tools/prompts/memory/en/errors.md +155 -0
  143. package/dist/tools/prompts/memory/en/index.md +47 -0
  144. package/dist/tools/prompts/memory/en/principles.md +79 -0
  145. package/dist/tools/prompts/memory/en/scenarios.md +174 -0
  146. package/dist/tools/prompts/memory/en/tools.md +154 -0
  147. package/dist/tools/prompts/memory/zh/errors.md +155 -0
  148. package/dist/tools/prompts/memory/zh/index.md +47 -0
  149. package/dist/tools/prompts/memory/zh/principles.md +79 -0
  150. package/dist/tools/prompts/memory/zh/scenarios.md +174 -0
  151. package/dist/tools/prompts/memory/zh/tools.md +154 -0
  152. package/package.json +1 -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
+ }
@@ -150,7 +150,7 @@ async function notifyWaitingDialogsOfClearedMind(dialog) {
150
150
  }, undefined, ownerDialog.status);
151
151
  for (const pendingRecord of owner.pendingRecords) {
152
152
  const requesterId = ownerDialog.agentId;
153
- const response = (0, inter_dialog_format_1.formatTeammateResponseContent)({
153
+ const response = (0, inter_dialog_format_1.formatTellaskResponseContent)({
154
154
  callName: pendingRecord.callName,
155
155
  responderId: dialog.agentId,
156
156
  requesterId,
@@ -161,23 +161,51 @@ async function notifyWaitingDialogsOfClearedMind(dialog) {
161
161
  status: 'failed',
162
162
  language,
163
163
  });
164
- await ownerDialog.receiveTeammateResponse(dialog.agentId, pendingRecord.callName, pendingRecord.mentionList, pendingRecord.tellaskContent, 'failed', dialog.id, {
164
+ const carryoverOriginCourse = pendingRecord.callingCourse;
165
+ const carryoverContent = carryoverOriginCourse !== undefined && carryoverOriginCourse !== ownerDialog.currentCourse
166
+ ? (0, inter_dialog_format_1.formatTellaskCarryoverResultContent)({
167
+ originCourse: carryoverOriginCourse,
168
+ callName: pendingRecord.callName,
169
+ responderId: dialog.agentId,
170
+ mentionList: pendingRecord.mentionList,
171
+ sessionSlug: pendingRecord.sessionSlug,
172
+ tellaskContent: pendingRecord.tellaskContent,
173
+ responseBody,
174
+ status: 'failed',
175
+ language,
176
+ })
177
+ : undefined;
178
+ await ownerDialog.receiveTellaskResponse(dialog.agentId, pendingRecord.callName, pendingRecord.mentionList, pendingRecord.tellaskContent, 'failed', dialog.id, {
165
179
  response,
166
180
  agentId: dialog.agentId,
167
181
  callId: pendingRecord.callId,
168
182
  originMemberId: requesterId,
183
+ originCourse: carryoverOriginCourse,
184
+ carryoverContent,
169
185
  sessionSlug: pendingRecord.sessionSlug,
170
186
  });
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
- };
187
+ const immediateMirror = carryoverContent !== undefined
188
+ ? {
189
+ type: 'tellask_carryover_result_msg',
190
+ role: 'user',
191
+ content: carryoverContent,
192
+ originCourse: carryoverOriginCourse,
193
+ responderId: dialog.agentId,
194
+ callName: pendingRecord.callName,
195
+ tellaskContent: pendingRecord.tellaskContent,
196
+ status: 'failed',
197
+ callId: pendingRecord.callId,
198
+ }
199
+ : {
200
+ type: 'tellask_result_msg',
201
+ role: 'tool',
202
+ responderId: dialog.agentId,
203
+ mentionList: pendingRecord.mentionList,
204
+ tellaskContent: pendingRecord.tellaskContent,
205
+ status: 'failed',
206
+ callId: pendingRecord.callId,
207
+ content: response,
208
+ };
181
209
  await ownerDialog.addChatMessages(immediateMirror);
182
210
  totalInvalidated += 1;
183
211
  }
@@ -100,12 +100,14 @@ function isPersistedMessageRecord(record) {
100
100
  case 'human_text_record':
101
101
  case 'func_call_record':
102
102
  case 'func_result_record':
103
- case 'teammate_call_result_record':
104
- case 'teammate_response_record':
103
+ case 'tellask_call_result_record':
104
+ case 'tellask_response_record':
105
+ case 'tellask_carryover_result_record':
105
106
  return true;
106
107
  case 'web_search_call_record':
107
108
  case 'quest_for_sup_record':
108
- case 'teammate_call_anchor_record':
109
+ case 'tellask_call_carryover_record':
110
+ case 'tellask_call_anchor_record':
109
111
  case 'gen_start_record':
110
112
  case 'gen_finish_record':
111
113
  case 'subdialog_created_record':
@@ -172,9 +174,11 @@ function rewriteRecordForFork(record, newRootId) {
172
174
  case 'web_search_call_record':
173
175
  case 'human_text_record':
174
176
  case 'quest_for_sup_record':
175
- case 'teammate_call_result_record':
176
- case 'teammate_call_anchor_record':
177
- case 'teammate_response_record':
177
+ case 'tellask_call_result_record':
178
+ case 'tellask_call_carryover_record':
179
+ case 'tellask_call_anchor_record':
180
+ case 'tellask_response_record':
181
+ case 'tellask_carryover_result_record':
178
182
  case 'gen_start_record':
179
183
  case 'gen_finish_record':
180
184
  return record;
package/dist/dialog.js CHANGED
@@ -143,7 +143,7 @@ class Dialog {
143
143
  this.disableDiligencePush = false;
144
144
  // Current callId for tellask call correlation
145
145
  // - Set during teammate_call_finish_evt (from tellask-special function calls)
146
- // - Retrieved during inline call-result emission (for receiveTeammateCallResult callId parameter)
146
+ // - Retrieved during inline call-result emission (for receiveTellaskCallResult callId parameter)
147
147
  // - Enables frontend to attach result INLINE to the calling section
148
148
  // - NOT used for teammate tellasks (which use calleeDialogId instead)
149
149
  this._currentCallId = null;
@@ -792,14 +792,14 @@ class Dialog {
792
792
  /**
793
793
  * Receive call result with callId for inline correlation
794
794
  */
795
- async receiveTeammateCallResult(responderId, callName, mentionList, tellaskContent, result, status, callId) {
796
- return await this.dlgStore.receiveTeammateCallResult(this, responderId, callName, mentionList, tellaskContent, result, status, callId);
795
+ async receiveTellaskCallResult(responderId, callName, mentionList, tellaskContent, result, status, callId) {
796
+ return await this.dlgStore.receiveTellaskCallResult(this, responderId, callName, mentionList, tellaskContent, result, status, callId);
797
797
  }
798
798
  /**
799
799
  * Receive teammate response (separate bubble for @teammate tellasks)
800
800
  */
801
- async receiveTeammateResponse(responderId, callName, mentionList, tellaskContent, status, subdialogId, options) {
802
- return await this.dlgStore.receiveTeammateResponse(this, responderId, callName, mentionList, tellaskContent, status, subdialogId, options);
801
+ async receiveTellaskResponse(responderId, callName, mentionList, tellaskContent, status, subdialogId, options) {
802
+ return await this.dlgStore.receiveTellaskResponse(this, responderId, callName, mentionList, tellaskContent, status, subdialogId, options);
803
803
  }
804
804
  async updateQuestions4Human(questions) {
805
805
  return await this.dlgStore.updateQuestions4Human(this, questions);
@@ -871,7 +871,7 @@ class Dialog {
871
871
  // Emit virtual generating_start_evt for subdialog response bubble
872
872
  await this.notifyGeneratingStart();
873
873
  const rawResponse = response;
874
- // Emit TeammateResponseEvent
874
+ // Emit TellaskResponseEvent
875
875
  const evt = (() => {
876
876
  switch (callName) {
877
877
  case 'tellask':
@@ -880,7 +880,7 @@ class Dialog {
880
880
  `(dialogId=${this.id.selfId}, subdialogId=${subdialogId.selfId}, callId=${callId})`);
881
881
  }
882
882
  return {
883
- type: 'teammate_response_evt',
883
+ type: 'tellask_response_evt',
884
884
  responderId,
885
885
  calleeDialogId: subdialogId.selfId,
886
886
  callName,
@@ -896,7 +896,7 @@ class Dialog {
896
896
  };
897
897
  case 'tellaskSessionless':
898
898
  return {
899
- type: 'teammate_response_evt',
899
+ type: 'tellask_response_evt',
900
900
  responderId,
901
901
  calleeDialogId: subdialogId.selfId,
902
902
  callName,
@@ -911,7 +911,7 @@ class Dialog {
911
911
  };
912
912
  case 'freshBootsReasoning':
913
913
  return {
914
- type: 'teammate_response_evt',
914
+ type: 'tellask_response_evt',
915
915
  responderId,
916
916
  calleeDialogId: subdialogId.selfId,
917
917
  callName,
@@ -930,7 +930,7 @@ class Dialog {
930
930
  await this.notifyGeneratingFinish();
931
931
  }
932
932
  catch (err) {
933
- log_1.log.warn('Failed to post teammate_response_evt event', undefined, {
933
+ log_1.log.warn('Failed to post tellask_response_evt event', undefined, {
934
934
  error: err,
935
935
  message: err instanceof Error ? err.message : String(err),
936
936
  });
@@ -1144,11 +1144,11 @@ class DialogStore {
1144
1144
  /**
1145
1145
  * Receive call result with callId for inline correlation
1146
1146
  */
1147
- async receiveTeammateCallResult(_dialog, _responderId, _callName, _mentionList, _tellaskContent, _result, _status, _callId) { }
1147
+ async receiveTellaskCallResult(_dialog, _responderId, _callName, _mentionList, _tellaskContent, _result, _status, _callId) { }
1148
1148
  /**
1149
1149
  * Receive teammate response (separate bubble for @teammate tellasks)
1150
1150
  */
1151
- async receiveTeammateResponse(_dialog, _responderId, _callName, _mentionList, _tellaskContent, _status, _subdialogId, _options) { }
1151
+ async receiveTellaskResponse(_dialog, _responderId, _callName, _mentionList, _tellaskContent, _status, _subdialogId, _options) { }
1152
1152
  async updateQuestions4Human(_dialog, _questions) { }
1153
1153
  /**
1154
1154
  * Load Questions for Human state from storage