@jait/gateway 0.1.478 → 0.1.481

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 (149) hide show
  1. package/dist/channels/manager.d.ts +97 -0
  2. package/dist/channels/manager.d.ts.map +1 -0
  3. package/dist/channels/manager.js +278 -0
  4. package/dist/channels/manager.js.map +1 -0
  5. package/dist/channels/msteams/connector.d.ts +83 -0
  6. package/dist/channels/msteams/connector.d.ts.map +1 -0
  7. package/dist/channels/msteams/connector.js +413 -0
  8. package/dist/channels/msteams/connector.js.map +1 -0
  9. package/dist/channels/telegram/connector.d.ts +48 -0
  10. package/dist/channels/telegram/connector.d.ts.map +1 -0
  11. package/dist/channels/telegram/connector.js +127 -0
  12. package/dist/channels/telegram/connector.js.map +1 -0
  13. package/dist/channels/types.d.ts +74 -0
  14. package/dist/channels/types.d.ts.map +1 -0
  15. package/dist/channels/types.js +9 -0
  16. package/dist/channels/types.js.map +1 -0
  17. package/dist/channels/whatsapp/connector.d.ts +96 -0
  18. package/dist/channels/whatsapp/connector.d.ts.map +1 -0
  19. package/dist/channels/whatsapp/connector.js +189 -0
  20. package/dist/channels/whatsapp/connector.js.map +1 -0
  21. package/dist/db/migrations.d.ts.map +1 -1
  22. package/dist/db/migrations.js +15 -0
  23. package/dist/db/migrations.js.map +1 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +37 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/plugins/contracts.d.ts +3 -0
  28. package/dist/plugins/contracts.d.ts.map +1 -1
  29. package/dist/plugins/contracts.js.map +1 -1
  30. package/dist/plugins/manager.d.ts +3 -0
  31. package/dist/plugins/manager.d.ts.map +1 -1
  32. package/dist/plugins/manager.js +21 -0
  33. package/dist/plugins/manager.js.map +1 -1
  34. package/dist/plugins/manifest.d.ts +7 -0
  35. package/dist/plugins/manifest.d.ts.map +1 -1
  36. package/dist/plugins/manifest.js.map +1 -1
  37. package/dist/plugins/openclaw-adapter.d.ts.map +1 -1
  38. package/dist/plugins/openclaw-adapter.js +68 -6
  39. package/dist/plugins/openclaw-adapter.js.map +1 -1
  40. package/dist/routes/channels.d.ts +14 -0
  41. package/dist/routes/channels.d.ts.map +1 -0
  42. package/dist/routes/channels.js +77 -0
  43. package/dist/routes/channels.js.map +1 -0
  44. package/dist/routes/chat.d.ts +3 -0
  45. package/dist/routes/chat.d.ts.map +1 -1
  46. package/dist/routes/chat.js +94 -14
  47. package/dist/routes/chat.js.map +1 -1
  48. package/dist/routes/plugins.d.ts +2 -1
  49. package/dist/routes/plugins.d.ts.map +1 -1
  50. package/dist/routes/plugins.js +31 -3
  51. package/dist/routes/plugins.js.map +1 -1
  52. package/dist/routes/skills.d.ts +3 -3
  53. package/dist/routes/skills.d.ts.map +1 -1
  54. package/dist/routes/skills.js +42 -19
  55. package/dist/routes/skills.js.map +1 -1
  56. package/dist/routes/store.d.ts.map +1 -1
  57. package/dist/routes/store.js +9 -55
  58. package/dist/routes/store.js.map +1 -1
  59. package/dist/server.d.ts +1 -0
  60. package/dist/server.d.ts.map +1 -1
  61. package/dist/server.js +7 -1
  62. package/dist/server.js.map +1 -1
  63. package/dist/services/thread-router.d.ts +7 -0
  64. package/dist/services/thread-router.d.ts.map +1 -1
  65. package/dist/services/thread-router.js +41 -2
  66. package/dist/services/thread-router.js.map +1 -1
  67. package/dist/skills/index.d.ts +40 -2
  68. package/dist/skills/index.d.ts.map +1 -1
  69. package/dist/skills/index.js +135 -4
  70. package/dist/skills/index.js.map +1 -1
  71. package/dist/skills/install.d.ts +42 -0
  72. package/dist/skills/install.d.ts.map +1 -0
  73. package/dist/skills/install.js +94 -0
  74. package/dist/skills/install.js.map +1 -0
  75. package/dist/tools/index.d.ts +1 -0
  76. package/dist/tools/index.d.ts.map +1 -1
  77. package/dist/tools/index.js +1 -0
  78. package/dist/tools/index.js.map +1 -1
  79. package/dist/tools/prompts/prompt-registry.d.ts +2 -0
  80. package/dist/tools/prompts/prompt-registry.d.ts.map +1 -1
  81. package/dist/tools/prompts/prompt-registry.js +10 -0
  82. package/dist/tools/prompts/prompt-registry.js.map +1 -1
  83. package/dist/tools/skill-tools.d.ts +46 -0
  84. package/dist/tools/skill-tools.d.ts.map +1 -0
  85. package/dist/tools/skill-tools.js +211 -0
  86. package/dist/tools/skill-tools.js.map +1 -0
  87. package/dist/tools/tool-names.d.ts +2 -0
  88. package/dist/tools/tool-names.d.ts.map +1 -1
  89. package/dist/tools/tool-names.js +3 -0
  90. package/dist/tools/tool-names.js.map +1 -1
  91. package/package.json +6 -2
  92. package/web-dist/assets/{_basePickBy-CtzswvYr.js → _basePickBy-qZfmOA0w.js} +1 -1
  93. package/web-dist/assets/{_baseUniq-BV8j8R0m.js → _baseUniq-Bic_0Ku1.js} +1 -1
  94. package/web-dist/assets/{arc-DYblKoMs.js → arc-CEc8Gtj6.js} +1 -1
  95. package/web-dist/assets/{architectureDiagram-2XIMDMQ5-DdYS2_FZ.js → architectureDiagram-2XIMDMQ5-BU1Io8ja.js} +1 -1
  96. package/web-dist/assets/{blockDiagram-WCTKOSBZ-CHV7p7YD.js → blockDiagram-WCTKOSBZ-sCUOeM9Y.js} +1 -1
  97. package/web-dist/assets/{c4Diagram-IC4MRINW-DX6Shx7D.js → c4Diagram-IC4MRINW-kYgaGoR6.js} +1 -1
  98. package/web-dist/assets/channel-BPhEc6il.js +1 -0
  99. package/web-dist/assets/{chunk-4BX2VUAB-CYUKMj7j.js → chunk-4BX2VUAB-g9fQ-S69.js} +1 -1
  100. package/web-dist/assets/{chunk-55IACEB6-C_pAOqtV.js → chunk-55IACEB6-Ct3rpton.js} +1 -1
  101. package/web-dist/assets/{chunk-FMBD7UC4-CIZqHR5k.js → chunk-FMBD7UC4-BYYKYT48.js} +1 -1
  102. package/web-dist/assets/{chunk-JSJVCQXG-DYHQrpzJ.js → chunk-JSJVCQXG-BsVoy3Ui.js} +1 -1
  103. package/web-dist/assets/{chunk-KX2RTZJC-BgqsEdiW.js → chunk-KX2RTZJC-CicUJ_9h.js} +1 -1
  104. package/web-dist/assets/{chunk-NQ4KR5QH-D2WvBqlM.js → chunk-NQ4KR5QH-Yvo4cuvD.js} +1 -1
  105. package/web-dist/assets/{chunk-QZHKN3VN-DQicMYR9.js → chunk-QZHKN3VN-DrBpz-k_.js} +1 -1
  106. package/web-dist/assets/{chunk-WL4C6EOR-By7qDLjO.js → chunk-WL4C6EOR-D2_sBPE_.js} +1 -1
  107. package/web-dist/assets/classDiagram-VBA2DB6C-COYaHGot.js +1 -0
  108. package/web-dist/assets/classDiagram-v2-RAHNMMFH-COYaHGot.js +1 -0
  109. package/web-dist/assets/clone-DfJVhmv7.js +1 -0
  110. package/web-dist/assets/{cose-bilkent-S5V4N54A-CAb2XzjW.js → cose-bilkent-S5V4N54A-BrtHBM6x.js} +1 -1
  111. package/web-dist/assets/{dagre-KLK3FWXG-DIu0KirA.js → dagre-KLK3FWXG-BzrpmYZL.js} +1 -1
  112. package/web-dist/assets/{diagram-E7M64L7V-CuPAALFE.js → diagram-E7M64L7V-BlNFSjWJ.js} +1 -1
  113. package/web-dist/assets/{diagram-IFDJBPK2-BsEbvT5C.js → diagram-IFDJBPK2-Dqsr0-8e.js} +1 -1
  114. package/web-dist/assets/{diagram-P4PSJMXO-DQbRSXfR.js → diagram-P4PSJMXO-BqgEtSgl.js} +1 -1
  115. package/web-dist/assets/{erDiagram-INFDFZHY-B6cJ6aKk.js → erDiagram-INFDFZHY-DQKdSExU.js} +1 -1
  116. package/web-dist/assets/{flowDiagram-PKNHOUZH-DnKunoWE.js → flowDiagram-PKNHOUZH-Dfb4F2Jr.js} +1 -1
  117. package/web-dist/assets/{ganttDiagram-A5KZAMGK-BR7KrsV2.js → ganttDiagram-A5KZAMGK-C9pvM7B0.js} +1 -1
  118. package/web-dist/assets/{gitGraphDiagram-K3NZZRJ6-C-ErQxYo.js → gitGraphDiagram-K3NZZRJ6-DF1ng26T.js} +1 -1
  119. package/web-dist/assets/{graph-D7YxCgKd.js → graph-B0qCsau1.js} +1 -1
  120. package/web-dist/assets/{index-XVcTRbqO.js → index-CbK7Sq05.js} +1 -1
  121. package/web-dist/assets/index-DFyEPY0C.js +1516 -0
  122. package/web-dist/assets/index-DgGQx1pV.css +32 -0
  123. package/web-dist/assets/{index-CiiwCpdd.js → index-bPwc_s9j.js} +1 -1
  124. package/web-dist/assets/{infoDiagram-LFFYTUFH-CbKsgryz.js → infoDiagram-LFFYTUFH-DqktoSKY.js} +1 -1
  125. package/web-dist/assets/{ishikawaDiagram-PHBUUO56-BnvFJhGI.js → ishikawaDiagram-PHBUUO56-BSD3bhDW.js} +1 -1
  126. package/web-dist/assets/{journeyDiagram-4ABVD52K-DUD5gNjq.js → journeyDiagram-4ABVD52K-C1XiiAHp.js} +1 -1
  127. package/web-dist/assets/{kanban-definition-K7BYSVSG-DXzciomb.js → kanban-definition-K7BYSVSG-Bnl3u8lM.js} +1 -1
  128. package/web-dist/assets/{layout-C9r4P4eW.js → layout-DuulVMp8.js} +1 -1
  129. package/web-dist/assets/{linear-BAVnYIxH.js → linear-BdWH0fqS.js} +1 -1
  130. package/web-dist/assets/{mindmap-definition-YRQLILUH-DXQhtB98.js → mindmap-definition-YRQLILUH-CP7IM4ly.js} +1 -1
  131. package/web-dist/assets/{pieDiagram-SKSYHLDU-BZwj0of8.js → pieDiagram-SKSYHLDU-C2dg01pY.js} +1 -1
  132. package/web-dist/assets/{quadrantDiagram-337W2JSQ-ClIxI022.js → quadrantDiagram-337W2JSQ-Ci0HHhZZ.js} +1 -1
  133. package/web-dist/assets/{requirementDiagram-Z7DCOOCP-IFfsBq00.js → requirementDiagram-Z7DCOOCP-Cpa6xzfS.js} +1 -1
  134. package/web-dist/assets/{sankeyDiagram-WA2Y5GQK-an0KnQCU.js → sankeyDiagram-WA2Y5GQK-YC0w4y3m.js} +1 -1
  135. package/web-dist/assets/{sequenceDiagram-2WXFIKYE-B_luBYr6.js → sequenceDiagram-2WXFIKYE-DFR_JRAl.js} +1 -1
  136. package/web-dist/assets/{stateDiagram-RAJIS63D-D-WYrcjl.js → stateDiagram-RAJIS63D-DjS0hYUM.js} +1 -1
  137. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-DXwakUby.js +1 -0
  138. package/web-dist/assets/{timeline-definition-YZTLITO2-CqnYRrYr.js → timeline-definition-YZTLITO2-74ZokkIK.js} +1 -1
  139. package/web-dist/assets/{treemap-KZPCXAKY-OjDH3ivT.js → treemap-KZPCXAKY-B-TU24Ni.js} +1 -1
  140. package/web-dist/assets/{vennDiagram-LZ73GAT5-DL7r5f3I.js → vennDiagram-LZ73GAT5-DjG2mV1S.js} +1 -1
  141. package/web-dist/assets/{xychartDiagram-JWTSCODW-ClidW0sx.js → xychartDiagram-JWTSCODW-BgRI_wmA.js} +1 -1
  142. package/web-dist/index.html +2 -2
  143. package/web-dist/assets/channel-D4Mqh1zG.js +0 -1
  144. package/web-dist/assets/classDiagram-VBA2DB6C-6vAu_D6k.js +0 -1
  145. package/web-dist/assets/classDiagram-v2-RAHNMMFH-6vAu_D6k.js +0 -1
  146. package/web-dist/assets/clone-VFeIDFpO.js +0 -1
  147. package/web-dist/assets/index-CMhCaoMH.css +0 -32
  148. package/web-dist/assets/index-D633QnFF.js +0 -1504
  149. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-B2ATdc9J.js +0 -1
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Channel management REST routes.
3
+ *
4
+ * GET /api/channels — list channels with status + QR
5
+ * GET /api/channels/:id/status — current status + QR (for polling during linking)
6
+ * POST /api/channels/:id/start — start/link a channel
7
+ * POST /api/channels/:id/stop — stop a channel
8
+ * PATCH /api/channels/:id/config — update channel config (allowed senders, tools, …)
9
+ */
10
+ import { requireAuth } from "../security/http-auth.js";
11
+ export function registerChannelRoutes(app, config, channelManager) {
12
+ async function requireChannelAuth(req, reply) {
13
+ return requireAuth(req, reply, config.jwtSecret);
14
+ }
15
+ /** List channels + status. */
16
+ app.get("/api/channels", async (req, reply) => {
17
+ const authUser = await requireChannelAuth(req, reply);
18
+ if (!authUser)
19
+ return;
20
+ return channelManager.list();
21
+ });
22
+ /** Poll status + QR for one channel (used by the linking UI). */
23
+ app.get("/api/channels/:id/status", async (req, reply) => {
24
+ const authUser = await requireChannelAuth(req, reply);
25
+ if (!authUser)
26
+ return;
27
+ const managed = channelManager.get(req.params.id);
28
+ if (!managed)
29
+ return reply.status(404).send({ error: "Channel not found" });
30
+ return {
31
+ id: managed.connector.id,
32
+ status: managed.status,
33
+ qr: managed.detail.qr ?? managed.connector.currentQr(),
34
+ error: managed.detail.error,
35
+ };
36
+ });
37
+ /** Start / link a channel. */
38
+ app.post("/api/channels/:id/start", async (req, reply) => {
39
+ const authUser = await requireChannelAuth(req, reply);
40
+ if (!authUser)
41
+ return;
42
+ try {
43
+ await channelManager.start(req.params.id);
44
+ const managed = channelManager.get(req.params.id);
45
+ return { ok: true, status: managed?.status, qr: managed?.detail.qr ?? managed?.connector.currentQr() ?? null };
46
+ }
47
+ catch (err) {
48
+ return reply.status(400).send({ error: err instanceof Error ? err.message : String(err) });
49
+ }
50
+ });
51
+ /** Stop a channel. */
52
+ app.post("/api/channels/:id/stop", async (req, reply) => {
53
+ const authUser = await requireChannelAuth(req, reply);
54
+ if (!authUser)
55
+ return;
56
+ try {
57
+ await channelManager.stop(req.params.id);
58
+ return { ok: true };
59
+ }
60
+ catch (err) {
61
+ return reply.status(400).send({ error: err instanceof Error ? err.message : String(err) });
62
+ }
63
+ });
64
+ /** Update channel config. */
65
+ app.patch("/api/channels/:id/config", async (req, reply) => {
66
+ const authUser = await requireChannelAuth(req, reply);
67
+ if (!authUser)
68
+ return;
69
+ const managed = channelManager.get(req.params.id);
70
+ if (!managed)
71
+ return reply.status(404).send({ error: "Channel not found" });
72
+ const body = req.body ?? {};
73
+ const next = channelManager.setConfig(req.params.id, body);
74
+ return next;
75
+ });
76
+ }
77
+ //# sourceMappingURL=channels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.js","sourceRoot":"","sources":["../../src/routes/channels.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,8 @@ import type { SessionStateService } from "../services/session-state.js";
14
14
  import type { ProjectService } from "../services/projects.js";
15
15
  import type { ProviderRegistry } from "../providers/registry.js";
16
16
  import type { SkillRegistry } from "../skills/index.js";
17
+ import type { ArchitectureDiagramService } from "../services/architecture-diagrams.js";
18
+ export declare function normalizeProviderSessionError(message: string): string;
17
19
  export declare function isSourceVisible(entry: MemoryEntry): boolean;
18
20
  export declare function getExternalFileMutationPath(tool: string, args: unknown): string | null;
19
21
  export interface ChatRouteDeps {
@@ -29,6 +31,7 @@ export interface ChatRouteDeps {
29
31
  projectService?: ProjectService;
30
32
  providerRegistry?: ProviderRegistry;
31
33
  skillRegistry?: SkillRegistry;
34
+ architectureDiagrams?: ArchitectureDiagramService;
32
35
  toolExecutor?: (toolName: string, input: unknown, context: ToolContext, options?: {
33
36
  dryRun?: boolean;
34
37
  consentTimeoutMs?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/routes/chat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAA4B,MAAM,uBAAuB,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAe,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAgCjE,OAAO,KAAK,EAAS,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA6H/D,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE3D;AAyUD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAyCtF;AAiZD,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,EAAE,CAAC,EAAE,cAAc,CAAC;IACpB,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,CACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,KACtD,OAAO,CAAC,UAAU,CAAC,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,SAAS,EACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,EACjC,iBAAiB,CAAC,EAAE,cAAc,QA83DnC"}
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/routes/chat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAA4B,MAAM,uBAAuB,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAe,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAgCjE,OAAO,KAAK,EAAS,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAgGvF,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBrE;AAyED,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE3D;AAyUD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAyCtF;AAiZD,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,EAAE,CAAC,EAAE,cAAc,CAAC;IACpB,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,oBAAoB,CAAC,EAAE,0BAA0B,CAAC;IAClD,YAAY,CAAC,EAAE,CACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,KACtD,OAAO,CAAC,UAAU,CAAC,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,SAAS,EACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,EACjC,iBAAiB,CAAC,EAAE,cAAc,QAq5DnC"}
@@ -17,17 +17,74 @@ import { matchSkills } from "../services/thread-router.js";
17
17
  import { isValidChatMode, } from "../tools/chat-modes.js";
18
18
  import { buildSystemPrompt } from "../tools/prompts/index.js";
19
19
  import { getResponseStyleInstructions, isResponseStyle } from "../tools/prompts/shared-sections.js";
20
- function formatExternalProviderFirstTurn(systemPrompt, userContent) {
21
- return [
20
+ function formatExternalProviderFirstTurn(systemPrompt, userContent, recentContextBlock) {
21
+ const parts = [
22
22
  "Jait session instructions:",
23
23
  "<system>",
24
24
  systemPrompt,
25
25
  "</system>",
26
26
  "",
27
- "User request:",
28
- userContent,
27
+ ];
28
+ if (recentContextBlock) {
29
+ parts.push(recentContextBlock, "");
30
+ }
31
+ parts.push("User request:", userContent);
32
+ return parts.join("\n");
33
+ }
34
+ function normalizeExternalContextContent(content) {
35
+ if (typeof content === "string")
36
+ return content;
37
+ if (content === null || content === undefined)
38
+ return "";
39
+ try {
40
+ return JSON.stringify(content);
41
+ }
42
+ catch {
43
+ return String(content);
44
+ }
45
+ }
46
+ function truncateExternalContextContent(content, max = 1200) {
47
+ const compact = content.replace(/\s+/g, " ").trim();
48
+ if (compact.length <= max)
49
+ return compact;
50
+ return `${compact.slice(0, max - 3)}...`;
51
+ }
52
+ function buildExternalProviderRecentContext(history, limit = 4) {
53
+ const visibleMessages = history
54
+ .slice(0, -1)
55
+ .filter((message) => ((message.role === "user" || message.role === "assistant")
56
+ && normalizeExternalContextContent(message.content).trim().length > 0))
57
+ .slice(-limit);
58
+ if (visibleMessages.length === 0)
59
+ return null;
60
+ return [
61
+ `Recent active chat context (last ${limit} messages before this turn):`,
62
+ ...visibleMessages.map((message) => {
63
+ const roleLabel = message.role === "user" ? "User" : "Assistant";
64
+ return `${roleLabel}: ${truncateExternalContextContent(normalizeExternalContextContent(message.content))}`;
65
+ }),
29
66
  ].join("\n");
30
67
  }
68
+ export function normalizeProviderSessionError(message) {
69
+ const compact = message.trim() || "Session error";
70
+ const lower = compact.toLowerCase();
71
+ const isAuthOrLimitError = [
72
+ "authentication required",
73
+ "auth required",
74
+ "not authenticated",
75
+ "not logged in",
76
+ "login required",
77
+ "please log in",
78
+ "credentials",
79
+ "api key",
80
+ "usage limit",
81
+ "rate limit",
82
+ "quota",
83
+ "limit reached",
84
+ "limit exceeded",
85
+ ].some((needle) => lower.includes(needle));
86
+ return isAuthOrLimitError ? "Authentication required" : compact;
87
+ }
31
88
  function buildCliProviderSystemPrompt(provider, model, mode, promptCtx) {
32
89
  return buildSystemPrompt(mode, {
33
90
  model: model?.trim() || provider,
@@ -40,13 +97,16 @@ function buildCliProviderSystemPrompt(provider, model, mode, promptCtx) {
40
97
  backend: provider,
41
98
  });
42
99
  }
43
- function buildExternalProviderContextFlow(requestProvider, model, setupMessage, systemPrompt, userContent, sentAt, note, memory) {
100
+ function buildExternalProviderContextFlow(requestProvider, model, setupMessage, systemPrompt, userContent, sentAt, note, memory, recentContextBlock) {
44
101
  const messages = [
45
102
  { role: "system", content: setupMessage },
46
103
  ];
47
104
  if (systemPrompt) {
48
105
  messages.push({ role: "system", content: systemPrompt });
49
106
  }
107
+ if (recentContextBlock) {
108
+ messages.push({ role: "system", content: recentContextBlock });
109
+ }
50
110
  messages.push({ role: "user", content: userContent });
51
111
  return {
52
112
  provider: requestProvider,
@@ -707,6 +767,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
707
767
  let projectService;
708
768
  let providerRegistry;
709
769
  let skillRegistry;
770
+ let architectureDiagrams;
710
771
  if (depsOrDb && typeof depsOrDb === "object" && "sessionService" in depsOrDb) {
711
772
  const deps = depsOrDb;
712
773
  db = deps.db;
@@ -722,6 +783,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
722
783
  projectService = deps.projectService;
723
784
  providerRegistry = deps.providerRegistry;
724
785
  skillRegistry = deps.skillRegistry;
786
+ architectureDiagrams = deps.architectureDiagrams;
725
787
  }
726
788
  else {
727
789
  db = depsOrDb;
@@ -1105,9 +1167,22 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1105
1167
  const wsRoot = surfaceRegistry
1106
1168
  ? resolveProjectRoot(surfaceRegistry, sessionId, projectRecord?.rootPath ?? sessionRecord?.projectPath)
1107
1169
  : ((projectRecord?.rootPath ?? sessionRecord?.projectPath)?.trim() || process.cwd());
1170
+ // Graphify: surface the saved project architecture graph so the agent
1171
+ // understands the codebase layout up front (generated via architecture.generate).
1172
+ let architectureGraph;
1173
+ if (architectureDiagrams && wsRoot) {
1174
+ try {
1175
+ architectureGraph = architectureDiagrams.getByProject(wsRoot, authUser.id)?.diagram
1176
+ ?? architectureDiagrams.getByProject(wsRoot)?.diagram;
1177
+ }
1178
+ catch {
1179
+ architectureGraph = undefined;
1180
+ }
1181
+ }
1108
1182
  const promptCtx = {
1109
1183
  projectRoot: wsRoot,
1110
1184
  skills: skillRegistry?.listEnabled(),
1185
+ architectureGraph,
1111
1186
  responseStyle,
1112
1187
  backend: llmRuntime.backend,
1113
1188
  };
@@ -1497,18 +1572,19 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1497
1572
  }
1498
1573
  break;
1499
1574
  case "session.error":
1500
- sessionError = event.error;
1501
- safeWrite(`data: ${JSON.stringify({ type: "error", message: event.error })}\n\n`);
1502
- emitToSubscribers(sessionId, { type: "error", message: event.error });
1575
+ sessionError = normalizeProviderSessionError(event.error);
1576
+ safeWrite(`data: ${JSON.stringify({ type: "error", message: sessionError })}\n\n`);
1577
+ emitToSubscribers(sessionId, { type: "error", message: sessionError });
1503
1578
  break;
1504
1579
  }
1505
1580
  });
1506
1581
  const responseStyleBlock = getResponseStyleInstructions(responseStyle);
1507
1582
  const cliSystemPrompt = buildCliProviderSystemPrompt(requestProvider, typeof body["model"] === "string" ? body["model"] : undefined, chatMode, promptCtx);
1508
1583
  const cliUserContent = memoryBlock ? `${memoryBlock}\n\n${content}` : content;
1584
+ const recentContextBlock = isNewCliSession ? buildExternalProviderRecentContext(history) : null;
1509
1585
  let cliContent = cliUserContent;
1510
1586
  if (isNewCliSession) {
1511
- cliContent = formatExternalProviderFirstTurn(cliSystemPrompt, cliUserContent);
1587
+ cliContent = formatExternalProviderFirstTurn(cliSystemPrompt, cliUserContent, recentContextBlock);
1512
1588
  }
1513
1589
  else if (responseStyleBlock) {
1514
1590
  cliContent = `<responseStyle>\n${responseStyleBlock}\n</responseStyle>\n\n${cliContent}`;
@@ -1549,7 +1625,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1549
1625
  : "Jait did not paste its internal system prompt into this provider turn.",
1550
1626
  "Provider-native hidden system prompts may still exist inside the CLI provider and are not visible to Jait.",
1551
1627
  ].join("\n");
1552
- const cliContextFlow = buildExternalProviderContextFlow(requestProvider, typeof body["model"] === "string" ? body["model"] : undefined, setupContent, cliSystemPrompt, cliUserContent, sentAt, "CLI providers keep their own session context. This captures the Jait setup metadata, the external-provider system prompt, and the user turn content. On reused CLI sessions, the system prompt is shown for inspection even though it was only sent when Jait initialized or recovered the provider session.", memoryFlow);
1628
+ const cliContextFlow = buildExternalProviderContextFlow(requestProvider, typeof body["model"] === "string" ? body["model"] : undefined, setupContent, cliSystemPrompt, cliUserContent, sentAt, "CLI providers keep their own session context. This captures the Jait setup metadata, the external-provider system prompt, and the user turn content. On reused CLI sessions, the system prompt is shown for inspection even though it was only sent when Jait initialized or recovered the provider session.", memoryFlow, recentContextBlock);
1553
1629
  contextFlowJson = JSON.stringify(cliContextFlow);
1554
1630
  safeWrite(`data: ${JSON.stringify({ type: "context_flow", ...cliContextFlow })}\n\n`);
1555
1631
  emitToSubscribers(sessionId, { type: "context_flow", ...cliContextFlow });
@@ -1584,8 +1660,8 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1584
1660
  }
1585
1661
  });
1586
1662
  const refreshedSystemPrompt = buildCliProviderSystemPrompt(requestProvider, typeof body["model"] === "string" ? body["model"] : undefined, chatMode, promptCtx);
1587
- let recoveryContent = content;
1588
- recoveryContent = formatExternalProviderFirstTurn(refreshedSystemPrompt, cliUserContent);
1663
+ const recoveryContextBlock = buildExternalProviderRecentContext(history);
1664
+ const recoveryContent = formatExternalProviderFirstTurn(refreshedSystemPrompt, cliUserContent, recoveryContextBlock);
1589
1665
  const sentAt = new Date().toISOString();
1590
1666
  const setupContent = [
1591
1667
  "CLI provider recovery session setup captured by Jait.",
@@ -1598,7 +1674,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1598
1674
  "Jait pasted its external-provider system prompt into this recovery provider session turn.",
1599
1675
  "Provider-native hidden system prompts may still exist inside the CLI provider and are not visible to Jait.",
1600
1676
  ].join("\n");
1601
- const cliContextFlow = buildExternalProviderContextFlow(requestProvider, typeof body["model"] === "string" ? body["model"] : undefined, setupContent, refreshedSystemPrompt, cliUserContent, sentAt, "CLI providers keep their own session context. This captures the Jait recovery setup metadata, the current Jait session system prompt, and the user turn content.", memoryFlow);
1677
+ const cliContextFlow = buildExternalProviderContextFlow(requestProvider, typeof body["model"] === "string" ? body["model"] : undefined, setupContent, refreshedSystemPrompt, cliUserContent, sentAt, "CLI providers keep their own session context. This captures the Jait recovery setup metadata, the current Jait session system prompt, and the user turn content.", memoryFlow, recoveryContextBlock);
1602
1678
  contextFlowJson = JSON.stringify(cliContextFlow);
1603
1679
  safeWrite(`data: ${JSON.stringify({ type: "context_flow", ...cliContextFlow })}\n\n`);
1604
1680
  emitToSubscribers(sessionId, { type: "context_flow", ...cliContextFlow });
@@ -1623,7 +1699,11 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1623
1699
  return;
1624
1700
  if (event.type === "session.completed" || event.type === "session.error" || event.type === "turn.completed") {
1625
1701
  if (event.type === "session.error") {
1626
- sessionError = typeof event.message === "string" ? event.message : "Session error";
1702
+ sessionError = normalizeProviderSessionError(typeof event.error === "string"
1703
+ ? event.error
1704
+ : typeof event.message === "string"
1705
+ ? event.message
1706
+ : "Session error");
1627
1707
  activeCliSessions.delete(sessionId);
1628
1708
  }
1629
1709
  unsubSteerDone();