@jait/gateway 0.1.523 → 0.1.525

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 (59) hide show
  1. package/dist/routes/chat.d.ts.map +1 -1
  2. package/dist/routes/chat.js +77 -9
  3. package/dist/routes/chat.js.map +1 -1
  4. package/package.json +1 -1
  5. package/web-dist/assets/{_basePickBy-CW9dv5ES.js → _basePickBy-C7ckq97M.js} +1 -1
  6. package/web-dist/assets/{_baseUniq-tp2rQJt2.js → _baseUniq-DvlwY7QV.js} +1 -1
  7. package/web-dist/assets/{arc-DEK1BP15.js → arc-BLGG6bBw.js} +1 -1
  8. package/web-dist/assets/{architectureDiagram-2XIMDMQ5-CdjTPRoF.js → architectureDiagram-2XIMDMQ5-Ch7zpRWA.js} +1 -1
  9. package/web-dist/assets/{blockDiagram-WCTKOSBZ-C3ekyg97.js → blockDiagram-WCTKOSBZ-DlZxHglt.js} +1 -1
  10. package/web-dist/assets/{c4Diagram-IC4MRINW-BqfK0yKj.js → c4Diagram-IC4MRINW-CzuYrFfZ.js} +1 -1
  11. package/web-dist/assets/channel-h72nG4iP.js +1 -0
  12. package/web-dist/assets/{chunk-4BX2VUAB-BwqjSlOe.js → chunk-4BX2VUAB-BAdG87Bf.js} +1 -1
  13. package/web-dist/assets/{chunk-55IACEB6-BvpAtX8G.js → chunk-55IACEB6-BvmyQSvl.js} +1 -1
  14. package/web-dist/assets/{chunk-FMBD7UC4-DHPDc_A7.js → chunk-FMBD7UC4-Djpd-gX6.js} +1 -1
  15. package/web-dist/assets/{chunk-JSJVCQXG-D7EcoHYg.js → chunk-JSJVCQXG-D97foLYA.js} +1 -1
  16. package/web-dist/assets/{chunk-KX2RTZJC-BbWn98p_.js → chunk-KX2RTZJC-CYeo_WwF.js} +1 -1
  17. package/web-dist/assets/{chunk-NQ4KR5QH-Dpd9TE5c.js → chunk-NQ4KR5QH-Cm7a7fP7.js} +1 -1
  18. package/web-dist/assets/{chunk-QZHKN3VN-DT-Co28q.js → chunk-QZHKN3VN-CWE7XCmH.js} +1 -1
  19. package/web-dist/assets/{chunk-WL4C6EOR-D-DE9wFf.js → chunk-WL4C6EOR-BHm-lDSQ.js} +1 -1
  20. package/web-dist/assets/classDiagram-VBA2DB6C-ByyKM7U_.js +1 -0
  21. package/web-dist/assets/classDiagram-v2-RAHNMMFH-ByyKM7U_.js +1 -0
  22. package/web-dist/assets/clone-CJoHZWnP.js +1 -0
  23. package/web-dist/assets/{cose-bilkent-S5V4N54A-CRwLCwSr.js → cose-bilkent-S5V4N54A-DOEjmvfR.js} +1 -1
  24. package/web-dist/assets/{dagre-KLK3FWXG-BpSL1_V3.js → dagre-KLK3FWXG-rUbCH7u_.js} +1 -1
  25. package/web-dist/assets/{diagram-E7M64L7V-BPNenbRk.js → diagram-E7M64L7V-B5meCwLF.js} +1 -1
  26. package/web-dist/assets/{diagram-IFDJBPK2-C1riLTjY.js → diagram-IFDJBPK2-CBcwaGxy.js} +1 -1
  27. package/web-dist/assets/{diagram-P4PSJMXO-BPJEdHYa.js → diagram-P4PSJMXO-BFeIFvoJ.js} +1 -1
  28. package/web-dist/assets/{erDiagram-INFDFZHY-BQ0pwW28.js → erDiagram-INFDFZHY-CuQso3oV.js} +1 -1
  29. package/web-dist/assets/{flowDiagram-PKNHOUZH-BijsABcb.js → flowDiagram-PKNHOUZH-CyqBTzaW.js} +1 -1
  30. package/web-dist/assets/{ganttDiagram-A5KZAMGK-DLuiiYZx.js → ganttDiagram-A5KZAMGK-D63yMO49.js} +1 -1
  31. package/web-dist/assets/{gitGraphDiagram-K3NZZRJ6-BjPYgV0b.js → gitGraphDiagram-K3NZZRJ6-B9fjyi9M.js} +1 -1
  32. package/web-dist/assets/{graph-BXTtfw1y.js → graph-BhyHBihp.js} +1 -1
  33. package/web-dist/assets/{index-C1q9tEIz.js → index-7UqiZrUH.js} +1 -1
  34. package/web-dist/assets/{index-DXvTPdDZ.js → index-DD7-8gYQ.js} +1 -1
  35. package/web-dist/assets/{index-Dh3lB4TR.js → index-DPzm2c9C.js} +355 -355
  36. package/web-dist/assets/{infoDiagram-LFFYTUFH-BPI6JiOe.js → infoDiagram-LFFYTUFH-J8J84Ke2.js} +1 -1
  37. package/web-dist/assets/{ishikawaDiagram-PHBUUO56-ChBxWr2r.js → ishikawaDiagram-PHBUUO56-Kc6I_c2W.js} +1 -1
  38. package/web-dist/assets/{journeyDiagram-4ABVD52K-CgDXH0jG.js → journeyDiagram-4ABVD52K-BqcoW97Y.js} +1 -1
  39. package/web-dist/assets/{kanban-definition-K7BYSVSG-BFX4ySJM.js → kanban-definition-K7BYSVSG-B0xDfj9_.js} +1 -1
  40. package/web-dist/assets/{layout-BUNIQkZV.js → layout-DKpSc8R9.js} +1 -1
  41. package/web-dist/assets/{linear-B4OhYQY5.js → linear-DEDM5mHu.js} +1 -1
  42. package/web-dist/assets/{mindmap-definition-YRQLILUH-Q3ZC0HBk.js → mindmap-definition-YRQLILUH-Dq_UQEj_.js} +1 -1
  43. package/web-dist/assets/{pieDiagram-SKSYHLDU-9s_jG4k9.js → pieDiagram-SKSYHLDU-CiG4Pgow.js} +1 -1
  44. package/web-dist/assets/{quadrantDiagram-337W2JSQ-z3RbjEye.js → quadrantDiagram-337W2JSQ-C8xkyIK8.js} +1 -1
  45. package/web-dist/assets/{requirementDiagram-Z7DCOOCP-DVMoP5dw.js → requirementDiagram-Z7DCOOCP-BZcdIg4-.js} +1 -1
  46. package/web-dist/assets/{sankeyDiagram-WA2Y5GQK-CTEbEhQm.js → sankeyDiagram-WA2Y5GQK-DcoeT76j.js} +1 -1
  47. package/web-dist/assets/{sequenceDiagram-2WXFIKYE-BuLuz-ok.js → sequenceDiagram-2WXFIKYE-D66yA6zT.js} +1 -1
  48. package/web-dist/assets/{stateDiagram-RAJIS63D-DQKos8Yr.js → stateDiagram-RAJIS63D-CzfgY1F2.js} +1 -1
  49. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-MqlPXvcl.js +1 -0
  50. package/web-dist/assets/{timeline-definition-YZTLITO2-DtU9nDNV.js → timeline-definition-YZTLITO2-KIZP3QL_.js} +1 -1
  51. package/web-dist/assets/{treemap-KZPCXAKY-I0pjr5h7.js → treemap-KZPCXAKY-KF3XEEXy.js} +1 -1
  52. package/web-dist/assets/{vennDiagram-LZ73GAT5-5BVW3qLc.js → vennDiagram-LZ73GAT5-B3FHWAhp.js} +1 -1
  53. package/web-dist/assets/{xychartDiagram-JWTSCODW-4-loE604.js → xychartDiagram-JWTSCODW-7IR8h6he.js} +1 -1
  54. package/web-dist/index.html +1 -1
  55. package/web-dist/assets/channel-DQCq4O2o.js +0 -1
  56. package/web-dist/assets/classDiagram-VBA2DB6C-D7z1tpoQ.js +0 -1
  57. package/web-dist/assets/classDiagram-v2-RAHNMMFH-D7z1tpoQ.js +0 -1
  58. package/web-dist/assets/clone-B5ePMUXA.js +0 -1
  59. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-ZxCbDvKy.js +0 -1
@@ -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;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;AAqbD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAyCtF;AAmgBD,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,QAm/DnC"}
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;AAqbD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAyCtF;AA+hBD,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,QAyiEnC"}
@@ -768,16 +768,26 @@ function rowToUIMsg(sessionId, row, visibleIndex) {
768
768
  msg.thinking = row.thinking;
769
769
  }
770
770
  if (row.contextFlow) {
771
- try {
772
- const parsed = JSON.parse(row.contextFlow);
773
- if (parsed && typeof parsed === "object" && Array.isArray(parsed.rounds)) {
774
- msg.contextFlow = parsed;
775
- }
776
- }
777
- catch { /* ignore */ }
771
+ // Lightweight badges instead of parsing the (potentially multi-MB)
772
+ // context_flow JSON. The frontend lazy-loads the full payload on demand
773
+ // via GET /api/sessions/:sessionId/messages/:index/context-flow.
774
+ msg.hasContextFlow = true;
775
+ msg.hasMemoryProvenance = hasMemoryProvenanceInContextFlow(row.contextFlow);
778
776
  }
779
777
  return msg;
780
778
  }
779
+ /**
780
+ * Quick peek at the start of a context_flow JSON string to determine whether
781
+ * it contains injected memories — without parsing the entire (huge) blob.
782
+ * The `memory` object is near the top of the serialized shape, so checking the
783
+ * first ~2 KB is sufficient.
784
+ */
785
+ function hasMemoryProvenanceInContextFlow(json) {
786
+ if (!json || json.length < 20)
787
+ return false;
788
+ const head = json.slice(0, 2048);
789
+ return head.includes('"memory"') && head.includes('"injectedIds"') && head.includes('[');
790
+ }
781
791
  function persistedMessageWindow(db, sessionId, limit, before) {
782
792
  const totalRow = db
783
793
  .select({ count: sql `count(*)` })
@@ -852,7 +862,10 @@ function buildVisibleHistoryMessages(sessionId, history, options) {
852
862
  content,
853
863
  toolCalls,
854
864
  segments,
855
- contextFlow,
865
+ // Strip the (potentially multi-MB) contextFlow from the snapshot. The
866
+ // frontend lazy-loads it on demand via the context-flow endpoint.
867
+ ...(contextFlow ? { hasContextFlow: true } : {}),
868
+ ...(contextFlow?.memory && contextFlow.memory.injectedIds.length > 0 ? { hasMemoryProvenance: true } : {}),
856
869
  thinking,
857
870
  }));
858
871
  // If there is a live streaming accumulator for this session, inject a
@@ -876,7 +889,6 @@ function buildVisibleHistoryMessages(sessionId, history, options) {
876
889
  content: acc.content,
877
890
  toolCalls: acc.toolCalls.length > 0 ? mapPersistedToolCallsForUI(acc.toolCalls) : undefined,
878
891
  segments: acc.segments.length > 0 ? acc.segments : undefined,
879
- contextFlow: undefined,
880
892
  thinking: acc.thinking || undefined,
881
893
  });
882
894
  }
@@ -2456,6 +2468,62 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
2456
2468
  messages: windowed.messages,
2457
2469
  };
2458
2470
  });
2471
+ // ── GET /api/sessions/:sessionId/messages/:index/context-flow ─────────
2472
+ // Lazy-load the full contextFlow JSON for a single message. The snapshot /
2473
+ // messages endpoints only return lightweight `hasContextFlow` /
2474
+ // `hasMemoryProvenance` badges; the (potentially multi-MB) payload is
2475
+ // fetched here only when the user opens the LLM-context dialog.
2476
+ app.get("/api/sessions/:sessionId/messages/:messageIndex/context-flow", async (request, reply) => {
2477
+ const authUser = await requireAuth(request, reply, config.jwtSecret);
2478
+ if (!authUser)
2479
+ return;
2480
+ const { sessionId, messageIndex } = request.params;
2481
+ if (sessionService) {
2482
+ const session = sessionService.getById(sessionId, authUser.id);
2483
+ if (!session) {
2484
+ return reply.status(404).send({ error: "NOT_FOUND", details: "Session not found" });
2485
+ }
2486
+ }
2487
+ const index = Number.parseInt(messageIndex, 10);
2488
+ if (!Number.isFinite(index) || index < 0) {
2489
+ return reply.status(400).send({ error: "VALIDATION_ERROR", details: "messageIndex must be a non-negative integer" });
2490
+ }
2491
+ // For active streams, the in-memory history has the live contextFlow
2492
+ // attached (and the DB row may not be persisted yet). Otherwise read
2493
+ // directly from the DB to avoid hydrating the full session.
2494
+ const isStreaming = activeStreams.has(sessionId);
2495
+ if (isStreaming || !db) {
2496
+ hydrateSession(sessionId);
2497
+ const history = sessionHistory.get(sessionId) ?? [];
2498
+ const visible = buildVisibleHistoryEntries(sessionId, history, { includePendingAssistantToolCalls: isStreaming });
2499
+ const entry = visible[index];
2500
+ if (!entry)
2501
+ return reply.status(404).send({ error: "NOT_FOUND", details: "Message not found" });
2502
+ return { contextFlow: entry.contextFlow ?? null };
2503
+ }
2504
+ // DB path: fetch rows in the same order the messages endpoint returns them
2505
+ // (ordered by createdAt, id), then resolve the visible index.
2506
+ const rows = db
2507
+ .select({ contextFlow: messagesTable.contextFlow, role: messagesTable.role, content: messagesTable.content, toolCalls: messagesTable.toolCalls })
2508
+ .from(messagesTable)
2509
+ .where(eq(messagesTable.sessionId, sessionId))
2510
+ .orderBy(messagesTable.createdAt, messagesTable.id)
2511
+ .all();
2512
+ const visibleRows = rows.filter((r) => !(r.role === "assistant" && !r.content && !r.toolCalls));
2513
+ const row = visibleRows[index];
2514
+ if (!row)
2515
+ return reply.status(404).send({ error: "NOT_FOUND", details: "Message not found" });
2516
+ if (!row.contextFlow)
2517
+ return { contextFlow: null };
2518
+ try {
2519
+ const parsed = JSON.parse(row.contextFlow);
2520
+ if (parsed && typeof parsed === "object" && Array.isArray(parsed.rounds)) {
2521
+ return { contextFlow: parsed };
2522
+ }
2523
+ }
2524
+ catch { /* fall through to null */ }
2525
+ return { contextFlow: null };
2526
+ });
2459
2527
  // SSE stream-resume: join an in-progress session's token stream
2460
2528
  // Client receives a snapshot of current content, then live tokens until done.
2461
2529
  app.get("/api/sessions/:sessionId/stream", async (request, reply) => {