@jait/gateway 0.1.520 → 0.1.522
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 +2 -0
- package/dist/channels/manager.d.ts.map +1 -1
- package/dist/channels/manager.js +1 -1
- package/dist/channels/manager.js.map +1 -1
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +1 -0
- package/dist/db/connection.js.map +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +11 -0
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/schema.d.ts +19 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +1 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/jait-provider.js +5 -5
- package/dist/providers/jait-provider.js.map +1 -1
- package/dist/providers/model-fetchers.d.ts +6 -0
- package/dist/providers/model-fetchers.d.ts.map +1 -1
- package/dist/providers/model-fetchers.js +29 -0
- package/dist/providers/model-fetchers.js.map +1 -1
- package/dist/routes/auth.d.ts.map +1 -1
- package/dist/routes/auth.js +10 -0
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/chat.d.ts.map +1 -1
- package/dist/routes/chat.js +38 -0
- package/dist/routes/chat.js.map +1 -1
- package/dist/services/users.d.ts +5 -0
- package/dist/services/users.d.ts.map +1 -1
- package/dist/services/users.js +8 -0
- package/dist/services/users.js.map +1 -1
- package/dist/tools/agent-loop.d.ts +1 -0
- package/dist/tools/agent-loop.d.ts.map +1 -1
- package/dist/tools/agent-loop.js +6 -0
- package/dist/tools/agent-loop.js.map +1 -1
- package/package.json +1 -1
- package/web-dist/assets/{_basePickBy-D97xdOAU.js → _basePickBy--DxX5TCG.js} +1 -1
- package/web-dist/assets/{_baseUniq-WW7JAj1l.js → _baseUniq-BdzySWUN.js} +1 -1
- package/web-dist/assets/{arc-3mhc1c6Z.js → arc-BbaIVFkf.js} +1 -1
- package/web-dist/assets/{architectureDiagram-2XIMDMQ5-BNi--qrb.js → architectureDiagram-2XIMDMQ5-DpJu2lRb.js} +1 -1
- package/web-dist/assets/{blockDiagram-WCTKOSBZ-GRQWMiTX.js → blockDiagram-WCTKOSBZ-C1lxwyQH.js} +1 -1
- package/web-dist/assets/{c4Diagram-IC4MRINW-C42ZAGzO.js → c4Diagram-IC4MRINW-Cb7wImJW.js} +1 -1
- package/web-dist/assets/channel-BpFm6ugS.js +1 -0
- package/web-dist/assets/{chunk-4BX2VUAB-DBagJPoH.js → chunk-4BX2VUAB-B84uYDQp.js} +1 -1
- package/web-dist/assets/{chunk-55IACEB6-Bb2d5l7K.js → chunk-55IACEB6-DX_hxQVe.js} +1 -1
- package/web-dist/assets/{chunk-FMBD7UC4-CS4028UO.js → chunk-FMBD7UC4-Bj7pSopv.js} +1 -1
- package/web-dist/assets/{chunk-JSJVCQXG-pEPkRBug.js → chunk-JSJVCQXG-BabDGnL3.js} +1 -1
- package/web-dist/assets/{chunk-KX2RTZJC-DPZPReEB.js → chunk-KX2RTZJC-ugM9Ht1d.js} +1 -1
- package/web-dist/assets/{chunk-NQ4KR5QH-CxkV1_9p.js → chunk-NQ4KR5QH-BnWBk10T.js} +1 -1
- package/web-dist/assets/{chunk-QZHKN3VN-CwRRfkgR.js → chunk-QZHKN3VN-CF2PD9Ab.js} +1 -1
- package/web-dist/assets/{chunk-WL4C6EOR-fFqRBlWe.js → chunk-WL4C6EOR-C4gfdYgP.js} +1 -1
- package/web-dist/assets/classDiagram-VBA2DB6C-CBc45QrJ.js +1 -0
- package/web-dist/assets/classDiagram-v2-RAHNMMFH-CBc45QrJ.js +1 -0
- package/web-dist/assets/clone-pC-usfRE.js +1 -0
- package/web-dist/assets/{cose-bilkent-S5V4N54A-DN3v9QU8.js → cose-bilkent-S5V4N54A-CDW-Ck7k.js} +1 -1
- package/web-dist/assets/{dagre-KLK3FWXG-MbLMo82j.js → dagre-KLK3FWXG-zFN0atQ7.js} +1 -1
- package/web-dist/assets/{diagram-E7M64L7V--9bssKST.js → diagram-E7M64L7V-BIEGNbpN.js} +1 -1
- package/web-dist/assets/{diagram-IFDJBPK2-6cDHg5fI.js → diagram-IFDJBPK2-C9VziJ3R.js} +1 -1
- package/web-dist/assets/{diagram-P4PSJMXO-CnppAHOs.js → diagram-P4PSJMXO-BLEFoxNj.js} +1 -1
- package/web-dist/assets/{erDiagram-INFDFZHY-TLp6z50h.js → erDiagram-INFDFZHY-nO923lHe.js} +1 -1
- package/web-dist/assets/{flowDiagram-PKNHOUZH-DWGC6P2V.js → flowDiagram-PKNHOUZH-CUPAqDXT.js} +1 -1
- package/web-dist/assets/{ganttDiagram-A5KZAMGK-xRTztCVN.js → ganttDiagram-A5KZAMGK-MphMQ0fw.js} +1 -1
- package/web-dist/assets/{gitGraphDiagram-K3NZZRJ6-C71gFMh3.js → gitGraphDiagram-K3NZZRJ6-CBBis1j4.js} +1 -1
- package/web-dist/assets/{graph-llADkI2L.js → graph-DuJvZz7l.js} +1 -1
- package/web-dist/assets/{index-CdADtvED.js → index-Bm8MgY2H.js} +1 -1
- package/web-dist/assets/{index-DF1xQK9v.js → index-DkliEn-M.js} +255 -255
- package/web-dist/assets/{index-qskLMmip.js → index-Ui1TnMQG.js} +1 -1
- package/web-dist/assets/{infoDiagram-LFFYTUFH-4auIkcGV.js → infoDiagram-LFFYTUFH-BsQpK4JI.js} +1 -1
- package/web-dist/assets/{ishikawaDiagram-PHBUUO56-QNl96mQj.js → ishikawaDiagram-PHBUUO56-DA_p-0vP.js} +1 -1
- package/web-dist/assets/{journeyDiagram-4ABVD52K-CRkJoa9h.js → journeyDiagram-4ABVD52K-79DZWOI4.js} +1 -1
- package/web-dist/assets/{kanban-definition-K7BYSVSG-Bfoj75nt.js → kanban-definition-K7BYSVSG-BPY9bj2Q.js} +1 -1
- package/web-dist/assets/{layout-ZxnBXXOL.js → layout-f6Q96A7h.js} +1 -1
- package/web-dist/assets/{linear-BkTIMqg7.js → linear-DtciIsOj.js} +1 -1
- package/web-dist/assets/{mindmap-definition-YRQLILUH-2y6NaKAS.js → mindmap-definition-YRQLILUH-ZiwbjSmh.js} +1 -1
- package/web-dist/assets/{pieDiagram-SKSYHLDU-C7mUVJbX.js → pieDiagram-SKSYHLDU-CPVnDl9k.js} +1 -1
- package/web-dist/assets/{quadrantDiagram-337W2JSQ-CdZLSE27.js → quadrantDiagram-337W2JSQ-JArycW7f.js} +1 -1
- package/web-dist/assets/{requirementDiagram-Z7DCOOCP-D1ICfZ5y.js → requirementDiagram-Z7DCOOCP-4xf2atx4.js} +1 -1
- package/web-dist/assets/{sankeyDiagram-WA2Y5GQK-B5xjy5zy.js → sankeyDiagram-WA2Y5GQK-DaZwFByE.js} +1 -1
- package/web-dist/assets/{sequenceDiagram-2WXFIKYE-rUHHa6Ef.js → sequenceDiagram-2WXFIKYE-DZ6aG0T1.js} +1 -1
- package/web-dist/assets/{stateDiagram-RAJIS63D-B0snaZqf.js → stateDiagram-RAJIS63D-5Gds6_tN.js} +1 -1
- package/web-dist/assets/stateDiagram-v2-FVOUBMTO-leQk59Lj.js +1 -0
- package/web-dist/assets/{timeline-definition-YZTLITO2-YTe8muSH.js → timeline-definition-YZTLITO2-DXEwc2PD.js} +1 -1
- package/web-dist/assets/{treemap-KZPCXAKY-BaJ0_K6k.js → treemap-KZPCXAKY-BH6x89yr.js} +1 -1
- package/web-dist/assets/{vennDiagram-LZ73GAT5-Clg7FJSd.js → vennDiagram-LZ73GAT5-C6IodL6O.js} +1 -1
- package/web-dist/assets/{xychartDiagram-JWTSCODW-CN5F0XWs.js → xychartDiagram-JWTSCODW-DQHs6YeB.js} +1 -1
- package/web-dist/index.html +1 -1
- package/web-dist/assets/channel-C8_OwGkq.js +0 -1
- package/web-dist/assets/classDiagram-VBA2DB6C-C78vWo8s.js +0 -1
- package/web-dist/assets/classDiagram-v2-RAHNMMFH-C78vWo8s.js +0 -1
- package/web-dist/assets/clone-Cyv8PlV4.js +0 -1
- package/web-dist/assets/stateDiagram-v2-FVOUBMTO-BYlXc09O.js +0 -1
package/dist/routes/chat.js
CHANGED
|
@@ -1342,6 +1342,9 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
|
|
|
1342
1342
|
"Content-Type": "text/event-stream",
|
|
1343
1343
|
"Cache-Control": "no-cache",
|
|
1344
1344
|
Connection: "keep-alive",
|
|
1345
|
+
// Prevent reverse proxies (nginx etc.) from buffering the SSE stream,
|
|
1346
|
+
// which would otherwise swallow chunks and let the connection time out.
|
|
1347
|
+
"X-Accel-Buffering": "no",
|
|
1345
1348
|
"Access-Control-Allow-Origin": reqOrigin,
|
|
1346
1349
|
"Access-Control-Allow-Credentials": "true",
|
|
1347
1350
|
});
|
|
@@ -1463,6 +1466,21 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
|
|
|
1463
1466
|
}
|
|
1464
1467
|
}
|
|
1465
1468
|
};
|
|
1469
|
+
// ── SSE keepalive heartbeat ──
|
|
1470
|
+
// While the agentic loop runs a long tool or waits for a slow LLM response,
|
|
1471
|
+
// no SSE data events are emitted and the connection can go idle for tens of
|
|
1472
|
+
// seconds. Browsers and reverse proxies then close the socket, surfacing as
|
|
1473
|
+
// "fetch failed" on the frontend and dropping the in-progress assistant
|
|
1474
|
+
// message. Emit an SSE comment (": keepalive\n\n") every 15s — comments are
|
|
1475
|
+
// ignored by the EventSource/reader parser but keep the TCP connection alive.
|
|
1476
|
+
const keepalive = setInterval(() => {
|
|
1477
|
+
if (clientDisconnected) {
|
|
1478
|
+
clearInterval(keepalive);
|
|
1479
|
+
return;
|
|
1480
|
+
}
|
|
1481
|
+
safeWrite(`: keepalive\n\n`);
|
|
1482
|
+
}, 15_000);
|
|
1483
|
+
reply.raw.on("close", () => { clearInterval(keepalive); });
|
|
1466
1484
|
const matchedSkillIds = new Set(matchSkills(content, promptCtx.skills ?? []));
|
|
1467
1485
|
const matchedSkills = (promptCtx.skills ?? []).filter((skill) => matchedSkillIds.has(skill.id));
|
|
1468
1486
|
const turnSkillToolCall = buildSyntheticSkillToolCall(matchedSkills);
|
|
@@ -1536,6 +1554,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
|
|
|
1536
1554
|
cliProvider = providerRegistry.get(requestProvider) ?? null;
|
|
1537
1555
|
}
|
|
1538
1556
|
if (!cliProvider) {
|
|
1557
|
+
clearInterval(keepalive);
|
|
1539
1558
|
safeWrite(`data: ${JSON.stringify({ type: "error", message: `Unknown provider: ${requestProvider}` })}\n\n`);
|
|
1540
1559
|
reply.raw.end();
|
|
1541
1560
|
return;
|
|
@@ -2075,6 +2094,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
|
|
|
2075
2094
|
model: requestBodyModel || undefined,
|
|
2076
2095
|
jaitBackend,
|
|
2077
2096
|
runtimeMode: requestRuntimeMode ?? undefined,
|
|
2097
|
+
reasoningEffort: userSettings?.reasoningEffort ?? undefined,
|
|
2078
2098
|
},
|
|
2079
2099
|
abort: streamAbort,
|
|
2080
2100
|
maxRounds: resolveMaxToolRounds(userSettings?.apiKeys, config.agentMaxRounds),
|
|
@@ -2197,6 +2217,8 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
|
|
|
2197
2217
|
const tcJson = partialToolCalls.length > 0 ? JSON.stringify(partialToolCalls) : undefined;
|
|
2198
2218
|
persistMessage(sessionId, "assistant", fullContent || "", tcJson, resultSegmentsJson, contextFlowJson);
|
|
2199
2219
|
}
|
|
2220
|
+
// Stop the SSE keepalive heartbeat now that the turn is finishing.
|
|
2221
|
+
clearInterval(keepalive);
|
|
2200
2222
|
activeStreams.delete(sessionId);
|
|
2201
2223
|
sessionAbortControllers.delete(sessionId);
|
|
2202
2224
|
sessionSteeringControllers.delete(sessionId);
|
|
@@ -2454,6 +2476,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
|
|
|
2454
2476
|
"Content-Type": "text/event-stream",
|
|
2455
2477
|
"Cache-Control": "no-cache",
|
|
2456
2478
|
Connection: "keep-alive",
|
|
2479
|
+
"X-Accel-Buffering": "no",
|
|
2457
2480
|
"Access-Control-Allow-Origin": reqOrigin,
|
|
2458
2481
|
"Access-Control-Allow-Credentials": "true",
|
|
2459
2482
|
});
|
|
@@ -2503,10 +2526,13 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
|
|
|
2503
2526
|
const snapshotSeq = sessionStreamSeq.get(sessionId) ?? 0;
|
|
2504
2527
|
let closed = false;
|
|
2505
2528
|
let unsubscribe = () => { };
|
|
2529
|
+
let keepalive = null;
|
|
2506
2530
|
const closeStream = () => {
|
|
2507
2531
|
if (closed)
|
|
2508
2532
|
return;
|
|
2509
2533
|
closed = true;
|
|
2534
|
+
if (keepalive)
|
|
2535
|
+
clearInterval(keepalive);
|
|
2510
2536
|
unsubscribe();
|
|
2511
2537
|
try {
|
|
2512
2538
|
reply.raw.end();
|
|
@@ -2516,6 +2542,18 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
|
|
|
2516
2542
|
reply.raw.on("close", () => {
|
|
2517
2543
|
closeStream();
|
|
2518
2544
|
});
|
|
2545
|
+
// Keep the SSE connection alive during idle periods (long tool runs / slow
|
|
2546
|
+
// LLM responses) so browsers/proxies don't drop it with "fetch failed".
|
|
2547
|
+
keepalive = setInterval(() => {
|
|
2548
|
+
if (closed)
|
|
2549
|
+
return;
|
|
2550
|
+
try {
|
|
2551
|
+
reply.raw.write(`: keepalive\n\n`);
|
|
2552
|
+
}
|
|
2553
|
+
catch {
|
|
2554
|
+
closeStream();
|
|
2555
|
+
}
|
|
2556
|
+
}, 15_000);
|
|
2519
2557
|
unsubscribe = subscribe(sessionId, snapshotSeq, (event) => {
|
|
2520
2558
|
if (closed)
|
|
2521
2559
|
return;
|