@jait/gateway 0.1.477 → 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.
- package/dist/channels/manager.d.ts +97 -0
- package/dist/channels/manager.d.ts.map +1 -0
- package/dist/channels/manager.js +278 -0
- package/dist/channels/manager.js.map +1 -0
- package/dist/channels/msteams/connector.d.ts +83 -0
- package/dist/channels/msteams/connector.d.ts.map +1 -0
- package/dist/channels/msteams/connector.js +413 -0
- package/dist/channels/msteams/connector.js.map +1 -0
- package/dist/channels/telegram/connector.d.ts +48 -0
- package/dist/channels/telegram/connector.d.ts.map +1 -0
- package/dist/channels/telegram/connector.js +127 -0
- package/dist/channels/telegram/connector.js.map +1 -0
- package/dist/channels/types.d.ts +74 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +9 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/channels/whatsapp/connector.d.ts +96 -0
- package/dist/channels/whatsapp/connector.d.ts.map +1 -0
- package/dist/channels/whatsapp/connector.js +189 -0
- package/dist/channels/whatsapp/connector.js.map +1 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +15 -0
- package/dist/db/migrations.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -1
- package/dist/plugins/contracts.d.ts +3 -0
- package/dist/plugins/contracts.d.ts.map +1 -1
- package/dist/plugins/contracts.js.map +1 -1
- package/dist/plugins/manager.d.ts +3 -0
- package/dist/plugins/manager.d.ts.map +1 -1
- package/dist/plugins/manager.js +21 -0
- package/dist/plugins/manager.js.map +1 -1
- package/dist/plugins/manifest.d.ts +7 -0
- package/dist/plugins/manifest.d.ts.map +1 -1
- package/dist/plugins/manifest.js.map +1 -1
- package/dist/plugins/openclaw-adapter.d.ts.map +1 -1
- package/dist/plugins/openclaw-adapter.js +68 -6
- package/dist/plugins/openclaw-adapter.js.map +1 -1
- package/dist/routes/channels.d.ts +14 -0
- package/dist/routes/channels.d.ts.map +1 -0
- package/dist/routes/channels.js +77 -0
- package/dist/routes/channels.js.map +1 -0
- package/dist/routes/chat.d.ts +3 -0
- package/dist/routes/chat.d.ts.map +1 -1
- package/dist/routes/chat.js +94 -14
- package/dist/routes/chat.js.map +1 -1
- package/dist/routes/plugins.d.ts +2 -1
- package/dist/routes/plugins.d.ts.map +1 -1
- package/dist/routes/plugins.js +31 -3
- package/dist/routes/plugins.js.map +1 -1
- package/dist/routes/skills.d.ts +3 -3
- package/dist/routes/skills.d.ts.map +1 -1
- package/dist/routes/skills.js +42 -19
- package/dist/routes/skills.js.map +1 -1
- package/dist/routes/store.d.ts.map +1 -1
- package/dist/routes/store.js +9 -55
- package/dist/routes/store.js.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +7 -1
- package/dist/server.js.map +1 -1
- package/dist/services/git.d.ts +9 -0
- package/dist/services/git.d.ts.map +1 -1
- package/dist/services/git.js +19 -4
- package/dist/services/git.js.map +1 -1
- package/dist/services/thread-router.d.ts +7 -0
- package/dist/services/thread-router.d.ts.map +1 -1
- package/dist/services/thread-router.js +41 -2
- package/dist/services/thread-router.js.map +1 -1
- package/dist/skills/index.d.ts +40 -2
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +135 -4
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/install.d.ts +42 -0
- package/dist/skills/install.d.ts.map +1 -0
- package/dist/skills/install.js +94 -0
- package/dist/skills/install.js.map +1 -0
- package/dist/tools/homeassistant-tools.d.ts +18 -0
- package/dist/tools/homeassistant-tools.d.ts.map +1 -0
- package/dist/tools/homeassistant-tools.js +210 -0
- package/dist/tools/homeassistant-tools.js.map +1 -0
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/prompts/prompt-registry.d.ts +2 -0
- package/dist/tools/prompts/prompt-registry.d.ts.map +1 -1
- package/dist/tools/prompts/prompt-registry.js +10 -0
- package/dist/tools/prompts/prompt-registry.js.map +1 -1
- package/dist/tools/skill-tools.d.ts +46 -0
- package/dist/tools/skill-tools.d.ts.map +1 -0
- package/dist/tools/skill-tools.js +211 -0
- package/dist/tools/skill-tools.js.map +1 -0
- package/dist/tools/tool-names.d.ts +2 -0
- package/dist/tools/tool-names.d.ts.map +1 -1
- package/dist/tools/tool-names.js +3 -0
- package/dist/tools/tool-names.js.map +1 -1
- package/package.json +6 -2
- package/web-dist/assets/{_basePickBy-BlH3VSG_.js → _basePickBy-qZfmOA0w.js} +1 -1
- package/web-dist/assets/{_baseUniq-C76REEdE.js → _baseUniq-Bic_0Ku1.js} +1 -1
- package/web-dist/assets/{arc-Ci7Y5-uI.js → arc-CEc8Gtj6.js} +1 -1
- package/web-dist/assets/{architectureDiagram-2XIMDMQ5-CB1I42fi.js → architectureDiagram-2XIMDMQ5-BU1Io8ja.js} +1 -1
- package/web-dist/assets/{blockDiagram-WCTKOSBZ-Ck9FbYo9.js → blockDiagram-WCTKOSBZ-sCUOeM9Y.js} +1 -1
- package/web-dist/assets/{c4Diagram-IC4MRINW-CHW6f5Qe.js → c4Diagram-IC4MRINW-kYgaGoR6.js} +1 -1
- package/web-dist/assets/channel-BPhEc6il.js +1 -0
- package/web-dist/assets/{chunk-4BX2VUAB-BRGmnck_.js → chunk-4BX2VUAB-g9fQ-S69.js} +1 -1
- package/web-dist/assets/{chunk-55IACEB6-rETTuU6z.js → chunk-55IACEB6-Ct3rpton.js} +1 -1
- package/web-dist/assets/{chunk-FMBD7UC4-DktgxKPB.js → chunk-FMBD7UC4-BYYKYT48.js} +1 -1
- package/web-dist/assets/{chunk-JSJVCQXG-Dfliu4AK.js → chunk-JSJVCQXG-BsVoy3Ui.js} +1 -1
- package/web-dist/assets/{chunk-KX2RTZJC-S3sGjO49.js → chunk-KX2RTZJC-CicUJ_9h.js} +1 -1
- package/web-dist/assets/{chunk-NQ4KR5QH-DHscTcf9.js → chunk-NQ4KR5QH-Yvo4cuvD.js} +1 -1
- package/web-dist/assets/{chunk-QZHKN3VN-B-4VzoBj.js → chunk-QZHKN3VN-DrBpz-k_.js} +1 -1
- package/web-dist/assets/{chunk-WL4C6EOR-DZWybiNk.js → chunk-WL4C6EOR-D2_sBPE_.js} +1 -1
- package/web-dist/assets/classDiagram-VBA2DB6C-COYaHGot.js +1 -0
- package/web-dist/assets/classDiagram-v2-RAHNMMFH-COYaHGot.js +1 -0
- package/web-dist/assets/clone-DfJVhmv7.js +1 -0
- package/web-dist/assets/{cose-bilkent-S5V4N54A-B9xY0Kqy.js → cose-bilkent-S5V4N54A-BrtHBM6x.js} +1 -1
- package/web-dist/assets/{dagre-KLK3FWXG-DvVqKE-N.js → dagre-KLK3FWXG-BzrpmYZL.js} +1 -1
- package/web-dist/assets/{diagram-E7M64L7V-BFxtLr_J.js → diagram-E7M64L7V-BlNFSjWJ.js} +1 -1
- package/web-dist/assets/{diagram-IFDJBPK2-9oSdzt-l.js → diagram-IFDJBPK2-Dqsr0-8e.js} +1 -1
- package/web-dist/assets/{diagram-P4PSJMXO-CnefTtmg.js → diagram-P4PSJMXO-BqgEtSgl.js} +1 -1
- package/web-dist/assets/{erDiagram-INFDFZHY-B_jfKATM.js → erDiagram-INFDFZHY-DQKdSExU.js} +1 -1
- package/web-dist/assets/{flowDiagram-PKNHOUZH-H0hHU5_y.js → flowDiagram-PKNHOUZH-Dfb4F2Jr.js} +1 -1
- package/web-dist/assets/{ganttDiagram-A5KZAMGK-DvgDjtyk.js → ganttDiagram-A5KZAMGK-C9pvM7B0.js} +1 -1
- package/web-dist/assets/{gitGraphDiagram-K3NZZRJ6-CfKN67ux.js → gitGraphDiagram-K3NZZRJ6-DF1ng26T.js} +1 -1
- package/web-dist/assets/{graph-QTTPZYmF.js → graph-B0qCsau1.js} +1 -1
- package/web-dist/assets/{index-B7NGRcGF.js → index-CbK7Sq05.js} +1 -1
- package/web-dist/assets/index-DFyEPY0C.js +1516 -0
- package/web-dist/assets/index-DgGQx1pV.css +32 -0
- package/web-dist/assets/{index-B2KqDTs1.js → index-bPwc_s9j.js} +1 -1
- package/web-dist/assets/{infoDiagram-LFFYTUFH-DfbwpZJy.js → infoDiagram-LFFYTUFH-DqktoSKY.js} +1 -1
- package/web-dist/assets/{ishikawaDiagram-PHBUUO56-DFAbvEqY.js → ishikawaDiagram-PHBUUO56-BSD3bhDW.js} +1 -1
- package/web-dist/assets/{journeyDiagram-4ABVD52K-D7_IzKwt.js → journeyDiagram-4ABVD52K-C1XiiAHp.js} +1 -1
- package/web-dist/assets/{kanban-definition-K7BYSVSG-ZHQe-znY.js → kanban-definition-K7BYSVSG-Bnl3u8lM.js} +1 -1
- package/web-dist/assets/{layout-CMZdvQRl.js → layout-DuulVMp8.js} +1 -1
- package/web-dist/assets/{linear-B-QauWje.js → linear-BdWH0fqS.js} +1 -1
- package/web-dist/assets/{mindmap-definition-YRQLILUH-ivr0jipJ.js → mindmap-definition-YRQLILUH-CP7IM4ly.js} +1 -1
- package/web-dist/assets/{pieDiagram-SKSYHLDU-BocSJCkn.js → pieDiagram-SKSYHLDU-C2dg01pY.js} +1 -1
- package/web-dist/assets/{quadrantDiagram-337W2JSQ-CPufpGVV.js → quadrantDiagram-337W2JSQ-Ci0HHhZZ.js} +1 -1
- package/web-dist/assets/{requirementDiagram-Z7DCOOCP-WXSlOcDd.js → requirementDiagram-Z7DCOOCP-Cpa6xzfS.js} +1 -1
- package/web-dist/assets/{sankeyDiagram-WA2Y5GQK-BlMmJCU5.js → sankeyDiagram-WA2Y5GQK-YC0w4y3m.js} +1 -1
- package/web-dist/assets/{sequenceDiagram-2WXFIKYE-D6tIU8do.js → sequenceDiagram-2WXFIKYE-DFR_JRAl.js} +1 -1
- package/web-dist/assets/{stateDiagram-RAJIS63D-DiKyETyd.js → stateDiagram-RAJIS63D-DjS0hYUM.js} +1 -1
- package/web-dist/assets/stateDiagram-v2-FVOUBMTO-DXwakUby.js +1 -0
- package/web-dist/assets/{timeline-definition-YZTLITO2-0HBRmTgM.js → timeline-definition-YZTLITO2-74ZokkIK.js} +1 -1
- package/web-dist/assets/{treemap-KZPCXAKY-DNlJvzbh.js → treemap-KZPCXAKY-B-TU24Ni.js} +1 -1
- package/web-dist/assets/{vennDiagram-LZ73GAT5-CttEpptN.js → vennDiagram-LZ73GAT5-DjG2mV1S.js} +1 -1
- package/web-dist/assets/{xychartDiagram-JWTSCODW-BlqNihqM.js → xychartDiagram-JWTSCODW-BgRI_wmA.js} +1 -1
- package/web-dist/index.html +2 -2
- package/web-dist/assets/channel-BnjEy0x0.js +0 -1
- package/web-dist/assets/classDiagram-VBA2DB6C-BMhQiG2d.js +0 -1
- package/web-dist/assets/classDiagram-v2-RAHNMMFH-BMhQiG2d.js +0 -1
- package/web-dist/assets/clone-Dvn132Py.js +0 -1
- package/web-dist/assets/index-DDA9TJcJ.js +0 -1504
- package/web-dist/assets/index-nl08IRlA.css +0 -32
- package/web-dist/assets/stateDiagram-v2-FVOUBMTO-CwYz7g9Z.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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"}
|
package/dist/routes/chat.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/routes/chat.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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:
|
|
1502
|
-
emitToSubscribers(sessionId, { type: "error", message:
|
|
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
|
-
|
|
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.
|
|
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();
|