@pcircle/memesh 4.9.4 → 4.10.2

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 (159) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/AGENTS.md +75 -13
  5. package/README.de.md +5 -5
  6. package/README.md +5 -5
  7. package/README.zh-TW.md +5 -5
  8. package/dashboard/dist/index.html +8 -8
  9. package/dist/cli/view-live.d.ts.map +1 -1
  10. package/dist/cli/view-live.js +0 -427
  11. package/dist/cli/view-live.js.map +1 -1
  12. package/dist/core/agent-message-inbox.d.ts +6 -0
  13. package/dist/core/agent-message-inbox.d.ts.map +1 -1
  14. package/dist/core/agent-message-inbox.js +28 -1
  15. package/dist/core/agent-message-inbox.js.map +1 -1
  16. package/dist/core/briefing-index.d.ts +30 -0
  17. package/dist/core/briefing-index.d.ts.map +1 -0
  18. package/dist/core/briefing-index.js +140 -0
  19. package/dist/core/briefing-index.js.map +1 -0
  20. package/dist/core/briefing-level.d.ts +22 -0
  21. package/dist/core/briefing-level.d.ts.map +1 -0
  22. package/dist/core/briefing-level.js +75 -0
  23. package/dist/core/briefing-level.js.map +1 -0
  24. package/dist/core/briefing.d.ts +7 -0
  25. package/dist/core/briefing.d.ts.map +1 -1
  26. package/dist/core/briefing.js +72 -12
  27. package/dist/core/briefing.js.map +1 -1
  28. package/dist/core/capture-liveness.d.ts +137 -0
  29. package/dist/core/capture-liveness.d.ts.map +1 -0
  30. package/dist/core/capture-liveness.js +448 -0
  31. package/dist/core/capture-liveness.js.map +1 -0
  32. package/dist/core/config.d.ts +2 -0
  33. package/dist/core/config.d.ts.map +1 -1
  34. package/dist/core/config.js +5 -1
  35. package/dist/core/config.js.map +1 -1
  36. package/dist/core/delegation.d.ts +47 -0
  37. package/dist/core/delegation.d.ts.map +1 -0
  38. package/dist/core/delegation.js +174 -0
  39. package/dist/core/delegation.js.map +1 -0
  40. package/dist/core/doctor-fixes.d.ts +1 -0
  41. package/dist/core/doctor-fixes.d.ts.map +1 -1
  42. package/dist/core/doctor-fixes.js +21 -0
  43. package/dist/core/doctor-fixes.js.map +1 -1
  44. package/dist/core/doctor.d.ts +8 -0
  45. package/dist/core/doctor.d.ts.map +1 -1
  46. package/dist/core/doctor.js +148 -3
  47. package/dist/core/doctor.js.map +1 -1
  48. package/dist/core/note-derive.d.ts +14 -0
  49. package/dist/core/note-derive.d.ts.map +1 -0
  50. package/dist/core/note-derive.js +66 -0
  51. package/dist/core/note-derive.js.map +1 -0
  52. package/dist/core/note-ingest.d.ts +34 -0
  53. package/dist/core/note-ingest.d.ts.map +1 -0
  54. package/dist/core/note-ingest.js +445 -0
  55. package/dist/core/note-ingest.js.map +1 -0
  56. package/dist/core/operations.d.ts +10 -1
  57. package/dist/core/operations.d.ts.map +1 -1
  58. package/dist/core/operations.js +129 -14
  59. package/dist/core/operations.js.map +1 -1
  60. package/dist/core/paths.d.ts +1 -0
  61. package/dist/core/paths.d.ts.map +1 -1
  62. package/dist/core/paths.js +4 -0
  63. package/dist/core/paths.js.map +1 -1
  64. package/dist/core/schema-export.d.ts.map +1 -1
  65. package/dist/core/schema-export.js +15 -5
  66. package/dist/core/schema-export.js.map +1 -1
  67. package/dist/core/serializer.d.ts +2 -0
  68. package/dist/core/serializer.d.ts.map +1 -1
  69. package/dist/core/serializer.js +119 -3
  70. package/dist/core/serializer.js.map +1 -1
  71. package/dist/core/session-insight.d.ts +44 -0
  72. package/dist/core/session-insight.d.ts.map +1 -0
  73. package/dist/core/session-insight.js +216 -0
  74. package/dist/core/session-insight.js.map +1 -0
  75. package/dist/core/task-state-store.d.ts +4 -0
  76. package/dist/core/task-state-store.d.ts.map +1 -1
  77. package/dist/core/task-state-store.js +18 -5
  78. package/dist/core/task-state-store.js.map +1 -1
  79. package/dist/core/task-state.d.ts +5 -0
  80. package/dist/core/task-state.d.ts.map +1 -1
  81. package/dist/core/task-state.js +70 -0
  82. package/dist/core/task-state.js.map +1 -1
  83. package/dist/core/turn-signal.d.ts +22 -0
  84. package/dist/core/turn-signal.d.ts.map +1 -0
  85. package/dist/core/turn-signal.js +89 -0
  86. package/dist/core/turn-signal.js.map +1 -0
  87. package/dist/core/types.d.ts +14 -3
  88. package/dist/core/types.d.ts.map +1 -1
  89. package/dist/core/update-entrypoint.d.ts +19 -0
  90. package/dist/core/update-entrypoint.d.ts.map +1 -0
  91. package/dist/core/update-entrypoint.js +222 -0
  92. package/dist/core/update-entrypoint.js.map +1 -0
  93. package/dist/core/update-notice.d.ts +69 -0
  94. package/dist/core/update-notice.d.ts.map +1 -0
  95. package/dist/core/update-notice.js +188 -0
  96. package/dist/core/update-notice.js.map +1 -0
  97. package/dist/core/work-topology.d.ts +1 -0
  98. package/dist/core/work-topology.d.ts.map +1 -1
  99. package/dist/core/work-topology.js +3 -0
  100. package/dist/core/work-topology.js.map +1 -1
  101. package/dist/host-runtime/codex-session.d.ts +10 -0
  102. package/dist/host-runtime/codex-session.d.ts.map +1 -1
  103. package/dist/host-runtime/codex-session.js +1 -1
  104. package/dist/host-runtime/codex-session.js.map +1 -1
  105. package/dist/knowledge-graph.d.ts.map +1 -1
  106. package/dist/knowledge-graph.js +24 -3
  107. package/dist/knowledge-graph.js.map +1 -1
  108. package/dist/mcp/THIRD_PARTY_NOTICES.txt +2 -2
  109. package/dist/mcp/server.js +1438 -122
  110. package/dist/mcp/server.js.map +3 -3
  111. package/dist/skills-manifest.json +61 -36
  112. package/dist/storage/fts-index.d.ts +1 -0
  113. package/dist/storage/fts-index.d.ts.map +1 -1
  114. package/dist/storage/fts-index.js +5 -0
  115. package/dist/storage/fts-index.js.map +1 -1
  116. package/dist/transports/cli/cli.d.ts.map +1 -1
  117. package/dist/transports/cli/cli.js +7846 -5613
  118. package/dist/transports/cli/cli.js.map +3 -3
  119. package/dist/transports/http/server.d.ts.map +1 -1
  120. package/dist/transports/http/server.js +48 -28
  121. package/dist/transports/http/server.js.map +1 -1
  122. package/dist/transports/mcp/handlers.d.ts +31 -7
  123. package/dist/transports/mcp/handlers.d.ts.map +1 -1
  124. package/dist/transports/mcp/handlers.js +49 -7
  125. package/dist/transports/mcp/handlers.js.map +1 -1
  126. package/dist/transports/schemas.d.ts +5 -2
  127. package/dist/transports/schemas.d.ts.map +1 -1
  128. package/dist/transports/schemas.js +30 -3
  129. package/dist/transports/schemas.js.map +1 -1
  130. package/docs/platforms/README.md +1 -0
  131. package/docs/platforms/agent-messaging.md +39 -8
  132. package/package.json +11 -6
  133. package/scripts/hooks/_generated/agent-message-inbox.js +28 -1
  134. package/scripts/hooks/_generated/briefing-index.js +147 -0
  135. package/scripts/hooks/_generated/briefing-level.js +82 -0
  136. package/scripts/hooks/_generated/capture-liveness.js +455 -0
  137. package/scripts/hooks/_generated/core-paths.js +4 -0
  138. package/scripts/hooks/_generated/fts-index.js +5 -0
  139. package/scripts/hooks/_generated/task-state.js +70 -0
  140. package/scripts/hooks/_generated/update-notice.js +195 -0
  141. package/scripts/hooks/_generated/work-topology.js +3 -0
  142. package/scripts/hooks/_shared.js +923 -27
  143. package/scripts/hooks/_stop-notes.js +504 -0
  144. package/scripts/hooks/auto-update-runner.mjs +22 -0
  145. package/scripts/hooks/decision-nudge.js +32 -5
  146. package/scripts/hooks/guard-check.js +30 -3
  147. package/scripts/hooks/post-commit.js +329 -133
  148. package/scripts/hooks/pre-compact.js +17 -2
  149. package/scripts/hooks/pre-edit-recall.js +416 -64
  150. package/scripts/hooks/session-start.js +617 -150
  151. package/scripts/hooks/session-summary.js +217 -41
  152. package/scripts/hooks/user-prompt-intent.js +124 -22
  153. package/scripts/upgrade-plugin.sh +3 -4
  154. package/skills/memesh/SKILL.md +45 -23
  155. package/dist/cli/assets/d3.v7.min.js +0 -2
  156. package/dist/core/graph.d.ts +0 -26
  157. package/dist/core/graph.d.ts.map +0 -1
  158. package/dist/core/graph.js +0 -74
  159. package/dist/core/graph.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"view-live.d.ts","sourceRoot":"","sources":["../../src/cli/view-live.ts"],"names":[],"mappings":"AAwBA,wBAAgB,yBAAyB,IAAI,MAAM,CAw5DlD"}
1
+ {"version":3,"file":"view-live.d.ts","sourceRoot":"","sources":["../../src/cli/view-live.ts"],"names":[],"mappings":"AAWA,wBAAgB,yBAAyB,IAAI,MAAM,CAo/ClD"}
@@ -1,10 +1,3 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import { fileURLToPath } from 'url';
4
- const moduleDir = path.dirname(fileURLToPath(import.meta.url));
5
- const bundledD3 = fs
6
- .readFileSync(path.join(moduleDir, 'assets', 'd3.v7.min.js'), 'utf8')
7
- .replace(/<\/script/gi, '<\\/script');
8
1
  export function generateLiveDashboardHtml() {
9
2
  const CSS = `
10
3
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
@@ -287,35 +280,6 @@ export function generateLiveDashboardHtml() {
287
280
  .bar-count { width: 36px; text-align: right; color: var(--text-muted); flex-shrink: 0; font-family: var(--font-mono); font-size: 12px; }
288
281
  .tag-cloud { display: flex; flex-wrap: wrap; gap: 8px; }
289
282
 
290
- /* Timeline */
291
- .chain { display: flex; align-items: center; flex-wrap: wrap; gap: 0; margin-bottom: 16px; padding: 16px; background: var(--bg-secondary); border: 1px solid var(--border); border-radius: var(--radius); }
292
- .chain-node { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 8px 14px; font-size: 13px; position: relative; transition: border-color 0.15s; }
293
- .chain-node:hover { border-color: var(--accent); }
294
- .chain-node.archived { opacity: 0.4; }
295
- .chain-node .cn-name { font-weight: 600; color: var(--text-primary); }
296
- .chain-node .cn-type { font-size: 11px; color: var(--text-muted); font-family: var(--font-mono); }
297
- .chain-arrow { font-size: 16px; color: var(--accent); padding: 0 8px; flex-shrink: 0; opacity: 0.6; }
298
-
299
- /* Graph */
300
- .graph-svg-wrap { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; position: relative; }
301
- .graph-svg-wrap svg { width: 100%; height: 520px; display: block; }
302
- .graph-controls { display: flex; gap: 8px; margin-bottom: 12px; align-items: center; font-size: 12px; color: var(--text-muted); }
303
-
304
- /* Graph tooltip */
305
- .graph-tooltip {
306
- position: absolute;
307
- background: var(--bg-card);
308
- border: 1px solid var(--border);
309
- border-radius: var(--radius-sm);
310
- padding: 12px 16px;
311
- font-size: 12px;
312
- pointer-events: none;
313
- backdrop-filter: blur(12px);
314
- box-shadow: var(--shadow-lg);
315
- max-width: 280px;
316
- z-index: 10;
317
- }
318
-
319
283
  /* Manage */
320
284
  .manage-action-cell { display: flex; gap: 6px; flex-wrap: wrap; }
321
285
 
@@ -412,14 +376,6 @@ export function generateLiveDashboardHtml() {
412
376
  return value;
413
377
  }
414
378
 
415
- function graphData(value) {
416
- if (!value || typeof value !== 'object'
417
- || !Array.isArray(value.entities) || !Array.isArray(value.relations)) {
418
- throw new Error('Invalid graph response');
419
- }
420
- return value;
421
- }
422
-
423
379
  function configData(response) {
424
380
  var value = successData(response, 'config');
425
381
  if (!value || typeof value !== 'object' || !value.config
@@ -444,14 +400,6 @@ export function generateLiveDashboardHtml() {
444
400
  // Theme is persisted client-side in localStorage only. An earlier
445
401
  // POST /v1/config { theme } wrote a config.theme that nothing ever
446
402
  // read back; removed with that dead field.
447
- // Update graph label colors if graph has been rendered
448
- var newLabelColor = isLight ? '#09090b' : '#fafafa';
449
- var graphWrap = document.getElementById('graph-svg-wrap');
450
- if (graphWrap) {
451
- graphWrap.querySelectorAll('svg g text:not([font-size="9"])').forEach(function(el) {
452
- el.setAttribute('fill', newLabelColor);
453
- });
454
- }
455
403
  });
456
404
  }
457
405
  })();
@@ -466,9 +414,7 @@ export function generateLiveDashboardHtml() {
466
414
  document.querySelectorAll('.tab-content').forEach(function (el) { el.classList.remove('active'); });
467
415
  document.getElementById('tab-' + tab).classList.add('active');
468
416
  if (tab === 'browse') loadBrowse();
469
- if (tab === 'graph') loadGraph();
470
417
  if (tab === 'analytics') loadAnalytics();
471
- if (tab === 'timeline') loadTimeline();
472
418
  if (tab === 'manage') loadManage();
473
419
  if (tab === 'settings') loadSettings();
474
420
  });
@@ -705,225 +651,6 @@ export function generateLiveDashboardHtml() {
705
651
  browseFilter.addEventListener('input', function () { renderBrowseTable(this.value); });
706
652
  document.getElementById('browse-refresh').addEventListener('click', loadBrowse);
707
653
 
708
- // ---- Graph tab ----
709
- var graphLoaded = false;
710
-
711
- async function loadGraph() {
712
- if (graphLoaded) return;
713
- graphLoaded = true;
714
- var wrap = document.getElementById('graph-svg-wrap');
715
- showSpinner(wrap);
716
- try {
717
- var data = await apiCall('GET', '/v1/graph');
718
- var graph = graphData(successData(data, 'graph'));
719
- renderGraph(graph.entities, graph.relations, wrap);
720
- } catch (err) {
721
- showError(wrap, err.message);
722
- graphLoaded = false;
723
- }
724
- }
725
-
726
- function renderGraph(entities, relations, container) {
727
- container.textContent = '';
728
-
729
- if (entities.length === 0) {
730
- showPlaceholder(container, 'No entities yet. Start remembering to build your graph.');
731
- return;
732
- }
733
-
734
- var svgNS = 'http://www.w3.org/2000/svg';
735
- var svg = document.createElementNS(svgNS, 'svg');
736
- svg.setAttribute('width', '100%');
737
- svg.setAttribute('height', '520');
738
- container.appendChild(svg);
739
-
740
- var width = container.clientWidth || 900;
741
- var height = 520;
742
-
743
- // Only show top connected nodes to keep graph readable
744
- var MAX_NODES = 60;
745
- var degreeMap = {};
746
- relations.forEach(function (r) {
747
- degreeMap[r.from] = (degreeMap[r.from] || 0) + 1;
748
- degreeMap[r.to] = (degreeMap[r.to] || 0) + 1;
749
- });
750
-
751
- var topNames;
752
- if (Object.keys(degreeMap).length > 0) {
753
- topNames = new Set(
754
- Object.entries(degreeMap)
755
- .sort(function (a, b) { return b[1] - a[1]; })
756
- .slice(0, MAX_NODES)
757
- .map(function (e) { return e[0]; })
758
- );
759
- } else {
760
- topNames = new Set(entities.slice(0, MAX_NODES).map(function (e) { return e.name; }));
761
- }
762
-
763
- var graphEntities = entities.filter(function (e) { return topNames.has(e.name); });
764
- if (graphEntities.length === 0) graphEntities = entities.slice(0, MAX_NODES);
765
-
766
- var colorPalette = ['#3b82f6','#8b5cf6','#10b981','#f59e0b','#ef4444','#06b6d4','#ec4899','#84cc16','#f97316','#6366f1'];
767
- var typeColorMap = {};
768
- var colorIdx = 0;
769
- graphEntities.forEach(function (e) {
770
- if (!typeColorMap[e.type]) {
771
- typeColorMap[e.type] = colorPalette[colorIdx % colorPalette.length];
772
- colorIdx++;
773
- }
774
- });
775
-
776
- // Build nodes and links
777
- var nodeMap = {};
778
- var nodes = graphEntities.map(function (e, i) {
779
- var firstObs = (e.observations && e.observations.length > 0) ? e.observations[0] : null;
780
- var n = { id: e.name, type: e.type, status: e.status, obs: e.observations ? e.observations.length : 0, firstObs: firstObs, x: 0, y: 0, vx: 0, vy: 0, fx: null, fy: null };
781
- nodeMap[e.name] = n;
782
- return n;
783
- });
784
-
785
- var links = relations
786
- .filter(function (r) { return nodeMap[r.from] && nodeMap[r.to]; })
787
- .map(function (r) { return { source: r.from, target: r.to, type: r.type }; });
788
-
789
- // Force simulation using pure JS (no D3 needed for basic layout)
790
- // Initialize positions in a circle
791
- nodes.forEach(function (n, i) {
792
- var angle = (2 * Math.PI * i) / nodes.length;
793
- var r = Math.min(width, height) * 0.35;
794
- n.x = width / 2 + r * Math.cos(angle);
795
- n.y = height / 2 + r * Math.sin(angle);
796
- });
797
-
798
- // Create SVG elements using D3 (bundled)
799
- var d3svg = d3.select(svg);
800
- d3svg.attr('viewBox', [0, 0, width, height]);
801
-
802
- // Defs: arrow marker + glow filter + grid pattern
803
- var defs = d3svg.append('defs');
804
-
805
- // Arrow marker
806
- defs.append('marker')
807
- .attr('id', 'arrow')
808
- .attr('viewBox', '0 0 10 10').attr('refX', 20).attr('refY', 5)
809
- .attr('markerWidth', 6).attr('markerHeight', 6).attr('orient', 'auto')
810
- .append('path').attr('d', 'M 0 0 L 10 5 L 0 10 z').attr('fill', 'rgba(59,130,246,0.4)');
811
-
812
- // Glow filter
813
- var filter = defs.append('filter').attr('id', 'node-glow').attr('x', '-50%').attr('y', '-50%').attr('width', '200%').attr('height', '200%');
814
- filter.append('feGaussianBlur').attr('stdDeviation', '3').attr('result', 'coloredBlur');
815
- var feMerge = filter.append('feMerge');
816
- feMerge.append('feMergeNode').attr('in', 'coloredBlur');
817
- feMerge.append('feMergeNode').attr('in', 'SourceGraphic');
818
-
819
- // Grid pattern background
820
- var gridSize = 32;
821
- var gridPattern = defs.append('pattern')
822
- .attr('id', 'grid').attr('width', gridSize).attr('height', gridSize)
823
- .attr('patternUnits', 'userSpaceOnUse');
824
- gridPattern.append('path')
825
- .attr('d', 'M ' + gridSize + ' 0 L 0 0 0 ' + gridSize)
826
- .attr('fill', 'none').attr('stroke', 'rgba(39,39,42,0.4)').attr('stroke-width', '0.5');
827
-
828
- // Background rect with grid
829
- d3svg.append('rect')
830
- .attr('width', width).attr('height', height)
831
- .attr('fill', 'url(#grid)');
832
-
833
- var g = d3svg.append('g');
834
-
835
- d3svg.call(d3.zoom().scaleExtent([0.2, 5]).on('zoom', function (event) {
836
- g.attr('transform', event.transform);
837
- }));
838
-
839
- var linkSel = g.append('g')
840
- .selectAll('line').data(links).join('line')
841
- .attr('stroke', 'rgba(59,130,246,0.25)').attr('stroke-width', 1.5)
842
- .attr('marker-end', 'url(#arrow)');
843
-
844
- var linkLabel = g.append('g')
845
- .selectAll('text').data(links).join('text')
846
- .attr('font-size', 9).attr('fill', 'rgba(113,113,122,0.8)').attr('text-anchor', 'middle')
847
- .attr('font-family', 'JetBrains Mono, ui-monospace, monospace')
848
- .text(function (d) { return d.type; });
849
-
850
- var nodeSel = g.append('g')
851
- .selectAll('circle').data(nodes).join('circle')
852
- .attr('r', function (d) { return Math.max(6, Math.min(20, 6 + d.obs * 1.5)); })
853
- .attr('fill', function (d) { return typeColorMap[d.type] || '#3b82f6'; })
854
- .attr('stroke', 'rgba(9,9,11,0.8)').attr('stroke-width', 1.5)
855
- .attr('opacity', function (d) { return d.status === 'archived' ? 0.3 : 0.9; })
856
- .attr('filter', function (d) { return d.status === 'archived' ? null : 'url(#node-glow)'; })
857
- .style('cursor', 'pointer')
858
- .call(d3.drag()
859
- .on('start', function (event, d) { if (!event.active) sim.alphaTarget(0.3).restart(); d.fx = d.x; d.fy = d.y; })
860
- .on('drag', function (event, d) { d.fx = event.x; d.fy = event.y; })
861
- .on('end', function (event, d) { if (!event.active) sim.alphaTarget(0); d.fx = null; d.fy = null; }));
862
-
863
- // Hover pulse effect
864
- nodeSel.on('mouseenter', function () {
865
- d3.select(this).attr('stroke', '#3b82f6').attr('stroke-width', 2.5);
866
- }).on('mouseleave', function () {
867
- d3.select(this).attr('stroke', 'rgba(9,9,11,0.8)').attr('stroke-width', 1.5);
868
- });
869
-
870
- var labelColor = document.body.classList.contains('light') ? '#09090b' : '#fafafa';
871
- var labelSel = g.append('g')
872
- .selectAll('text').data(nodes).join('text')
873
- .attr('font-size', 11).attr('fill', labelColor).attr('dy', 4)
874
- .attr('font-family', 'Inter, system-ui, sans-serif').attr('font-weight', '500')
875
- .text(function (d) {
876
- var label = d.firstObs ? d.firstObs : d.id;
877
- return label.length > 25 ? label.slice(0, 25) + '\u2026' : label;
878
- });
879
-
880
- // Tooltip
881
- var ttEl = document.getElementById('live-tooltip');
882
- nodeSel.on('mouseover', function (event, d) {
883
- ttEl.style.display = 'block';
884
- var obsPreview = d.firstObs ? (d.firstObs.length > 80 ? d.firstObs.slice(0, 80) + '\u2026' : d.firstObs) : '(no observations)';
885
- ttEl.querySelector('.tt-name').textContent = obsPreview;
886
- ttEl.querySelector('.tt-type').textContent = d.type + (d.status === 'archived' ? ' \u2014 archived' : '');
887
- ttEl.querySelector('.tt-obs').textContent = d.id + ' \u00b7 ' + d.obs + ' observation' + (d.obs !== 1 ? 's' : '');
888
- }).on('mousemove', function (event) {
889
- ttEl.style.left = (event.pageX + 14) + 'px';
890
- ttEl.style.top = (event.pageY - 10) + 'px';
891
- }).on('mouseout', function () { ttEl.style.display = 'none'; });
892
-
893
- var sim = d3.forceSimulation(nodes)
894
- .force('link', d3.forceLink(links).id(function (d) { return d.id; }).distance(150))
895
- .force('charge', d3.forceManyBody().strength(-400))
896
- .force('center', d3.forceCenter(width / 2, height / 2))
897
- .force('collision', d3.forceCollide().radius(22));
898
-
899
- sim.on('tick', function () {
900
- linkSel
901
- .attr('x1', function (d) { return d.source.x; }).attr('y1', function (d) { return d.source.y; })
902
- .attr('x2', function (d) { return d.target.x; }).attr('y2', function (d) { return d.target.y; });
903
- linkLabel
904
- .attr('x', function (d) { return (d.source.x + d.target.x) / 2; })
905
- .attr('y', function (d) { return (d.source.y + d.target.y) / 2; });
906
- nodeSel.attr('cx', function (d) { return d.x; }).attr('cy', function (d) { return d.y; });
907
- labelSel.attr('x', function (d) { return d.x + 10; }).attr('y', function (d) { return d.y; });
908
- });
909
-
910
- // Legend
911
- var legend = document.createElement('div');
912
- legend.style.cssText = 'display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;font-size:12px;padding:0 2px;font-family:Inter,system-ui,sans-serif;';
913
- Object.entries(typeColorMap).forEach(function (pair) {
914
- var item = document.createElement('span');
915
- item.style.cssText = 'display:flex;align-items:center;gap:5px;color:var(--text-secondary,#a1a1aa);';
916
- var dot = document.createElement('span');
917
- dot.style.cssText = 'width:8px;height:8px;border-radius:50%;display:inline-block;background:' + pair[1] + ';box-shadow:0 0 4px ' + pair[1] + '66;';
918
- var lbl = document.createElement('span');
919
- lbl.textContent = pair[0];
920
- item.appendChild(dot);
921
- item.appendChild(lbl);
922
- legend.appendChild(item);
923
- });
924
- container.appendChild(legend);
925
- }
926
-
927
654
  // ---- Analytics tab ----
928
655
  var analyticsLoaded = false;
929
656
 
@@ -1124,129 +851,6 @@ export function generateLiveDashboardHtml() {
1124
851
  }
1125
852
  }
1126
853
 
1127
- // ---- Timeline tab ----
1128
- var timelineLoaded = false;
1129
-
1130
- async function loadTimeline() {
1131
- if (timelineLoaded) return;
1132
- timelineLoaded = true;
1133
- var container = document.getElementById('timeline-body');
1134
- showSpinner(container);
1135
- try {
1136
- var data = await apiCall('GET', '/v1/graph');
1137
- var graph = graphData(successData(data, 'graph'));
1138
- renderTimeline(graph.entities, graph.relations, container);
1139
- } catch (err) {
1140
- showError(container, err.message);
1141
- timelineLoaded = false;
1142
- }
1143
- }
1144
-
1145
- function renderTimeline(entities, relations, container) {
1146
- container.textContent = '';
1147
-
1148
- // Build entity map
1149
- var entityMap = {};
1150
- entities.forEach(function (e) { entityMap[e.name] = e; });
1151
-
1152
- // Find supersedes relations
1153
- var supersedes = relations.filter(function (r) { return r.type === 'supersedes'; });
1154
-
1155
- if (supersedes.length === 0) {
1156
- showPlaceholder(container, 'No evolution chains yet. Use "supersedes" relations to track knowledge evolution.');
1157
- return;
1158
- }
1159
-
1160
- // Build chains: find roots (nodes that are not a "to" in any supersedes)
1161
- var hasIncoming = new Set(supersedes.map(function (r) { return r.to; }));
1162
- var roots = [...new Set(supersedes.map(function (r) { return r.from; }))].filter(function (name) {
1163
- return !hasIncoming.has(name);
1164
- });
1165
-
1166
- // If no pure roots, just use all froms
1167
- if (roots.length === 0) {
1168
- roots = [...new Set(supersedes.map(function (r) { return r.from; }))];
1169
- }
1170
-
1171
- // Build adjacency: from -> [to, ...]
1172
- var nextMap = {};
1173
- supersedes.forEach(function (r) {
1174
- if (!nextMap[r.from]) nextMap[r.from] = [];
1175
- nextMap[r.from].push(r.to);
1176
- });
1177
-
1178
- // Walk each chain
1179
- var visited = new Set();
1180
- var chainCount = 0;
1181
-
1182
- roots.forEach(function (root) {
1183
- if (visited.has(root)) return;
1184
- var chain = [];
1185
- var cursor = root;
1186
- var safety = 0;
1187
- while (cursor && !visited.has(cursor) && safety < 50) {
1188
- visited.add(cursor);
1189
- chain.push(cursor);
1190
- var nexts = nextMap[cursor];
1191
- cursor = nexts && nexts[0];
1192
- safety++;
1193
- }
1194
- if (chain.length < 2) return;
1195
- chainCount++;
1196
-
1197
- var chainEl = document.createElement('div');
1198
- chainEl.className = 'chain';
1199
-
1200
- chain.forEach(function (name, idx) {
1201
- if (idx > 0) {
1202
- var arrow = document.createElement('span');
1203
- arrow.className = 'chain-arrow';
1204
- arrow.textContent = '\\u2192';
1205
- chainEl.appendChild(arrow);
1206
- }
1207
- var node = document.createElement('div');
1208
- var ent = entityMap[name];
1209
- node.className = 'chain-node' + (ent && ent.status === 'archived' ? ' archived' : '');
1210
- var nameEl = document.createElement('div');
1211
- nameEl.className = 'cn-name';
1212
- // Show first observation as primary content, fall back to entity name
1213
- var obsContent = (ent && ent.observations && ent.observations[0])
1214
- ? ent.observations[0]
1215
- : name;
1216
- nameEl.textContent = obsContent.length > 60 ? obsContent.slice(0, 60) + '\u2026' : obsContent;
1217
- nameEl.title = obsContent; // full text on hover
1218
- var typeEl = document.createElement('div');
1219
- typeEl.className = 'cn-type';
1220
- typeEl.textContent = (ent ? ent.type : '') + (ent ? ' \u00b7 ' : '');
1221
- // Add timestamp
1222
- if (ent && ent.created_at) {
1223
- try {
1224
- var tDate = new Date(ent.created_at);
1225
- var timeSpan = document.createElement('span');
1226
- timeSpan.style.cssText = 'font-size:11px;color:var(--text-muted);font-family:var(--font-mono);';
1227
- timeSpan.textContent = tDate.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' });
1228
- typeEl.textContent = (ent ? ent.type + ' \u00b7 ' : '');
1229
- typeEl.appendChild(timeSpan);
1230
- } catch (_) {}
1231
- }
1232
- // Add entity name as secondary metadata
1233
- var entityNameEl = document.createElement('div');
1234
- entityNameEl.style.cssText = 'font-size:10px;color:var(--text-muted);font-family:var(--font-mono);opacity:0.7;margin-top:2px;';
1235
- entityNameEl.textContent = name;
1236
- node.appendChild(nameEl);
1237
- node.appendChild(typeEl);
1238
- node.appendChild(entityNameEl);
1239
- chainEl.appendChild(node);
1240
- });
1241
-
1242
- container.appendChild(chainEl);
1243
- });
1244
-
1245
- if (chainCount === 0) {
1246
- showPlaceholder(container, 'No multi-step evolution chains found.');
1247
- }
1248
- }
1249
-
1250
854
  // ---- Manage tab ----
1251
855
  var allManageEntities = [];
1252
856
  var manageFilter = '';
@@ -1808,10 +1412,6 @@ export function generateLiveDashboardHtml() {
1808
1412
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
1809
1413
  <title>MeMesh — Dashboard</title>
1810
1414
  <style>${CSS}</style>
1811
- <!-- bundled d3.js -->
1812
- <script>
1813
- ${bundledD3}
1814
- </script>
1815
1415
  </head>
1816
1416
  <body>
1817
1417
 
@@ -1832,9 +1432,7 @@ ${bundledD3}
1832
1432
  <nav class="nav" id="nav">
1833
1433
  <button class="active" data-tab="search">Search</button>
1834
1434
  <button data-tab="browse">Browse</button>
1835
- <button data-tab="graph">Graph</button>
1836
1435
  <button data-tab="analytics">Analytics</button>
1837
- <button data-tab="timeline">Timeline</button>
1838
1436
  <button data-tab="manage">Manage</button>
1839
1437
  <button data-tab="settings">Settings</button>
1840
1438
  </nav>
@@ -1863,16 +1461,6 @@ ${bundledD3}
1863
1461
  </div>
1864
1462
  </div>
1865
1463
 
1866
- <div class="tab-content" id="tab-graph">
1867
- <div class="card">
1868
- <h2>Knowledge Graph</h2>
1869
- <div class="graph-controls">
1870
- <span>Scroll to zoom \u00b7 Drag nodes \u00b7 Pan with mouse</span>
1871
- </div>
1872
- <div class="graph-svg-wrap" id="graph-svg-wrap"></div>
1873
- </div>
1874
- </div>
1875
-
1876
1464
  <div class="tab-content" id="tab-analytics">
1877
1465
  <div class="card">
1878
1466
  <h2>Analytics</h2>
@@ -1880,14 +1468,6 @@ ${bundledD3}
1880
1468
  </div>
1881
1469
  </div>
1882
1470
 
1883
- <div class="tab-content" id="tab-timeline">
1884
- <div class="card">
1885
- <h2>Evolution Timeline</h2>
1886
- <p style="font-size:13px;color:var(--text-muted);margin-bottom:16px;">Entities connected by \u201csupersedes\u201d relations, showing knowledge evolution chains.</p>
1887
- <div id="timeline-body"></div>
1888
- </div>
1889
- </div>
1890
-
1891
1471
  <div class="tab-content" id="tab-manage">
1892
1472
  <div class="card">
1893
1473
  <h2>Manage Memories</h2>
@@ -1918,13 +1498,6 @@ ${bundledD3}
1918
1498
  </div>
1919
1499
  </div>
1920
1500
 
1921
- <!-- Graph tooltip -->
1922
- <div id="live-tooltip" class="graph-tooltip" style="display:none;">
1923
- <div class="tt-name" style="font-weight:600;color:var(--text-primary);font-size:13px;margin-bottom:3px;"></div>
1924
- <div class="tt-type" style="color:var(--accent-hover);font-size:11px;font-family:var(--font-mono);margin-bottom:4px;"></div>
1925
- <div class="tt-obs" style="color:var(--text-muted);font-size:12px;"></div>
1926
- </div>
1927
-
1928
1501
  <!-- Feedback widget -->
1929
1502
  <button id="feedback-btn">&#x1f4ac; Feedback</button>
1930
1503
  <div id="feedback-panel">
@@ -1 +1 @@
1
- {"version":3,"file":"view-live.js","sourceRoot":"","sources":["../../src/cli/view-live.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"view-live.js","sourceRoot":"","sources":["../../src/cli/view-live.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,yBAAyB;IACvC,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqVX,CAAC,IAAI,EAAE,CAAC;IAIT,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuiCd,CAAC,IAAI,EAAE,CAAC;IAET,OAAO;;;;;;WAME,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAwGJ,MAAM;;QAER,CAAC;AACT,CAAC"}
@@ -3,8 +3,14 @@ interface InboxDb {
3
3
  get(...params: unknown[]): unknown;
4
4
  };
5
5
  }
6
+ interface InboxListDb {
7
+ prepare(sql: string): {
8
+ all(...params: unknown[]): unknown[];
9
+ };
10
+ }
6
11
  export declare function unreadDeliveryCount(db: InboxDb, project: string, recipient?: string): number;
7
12
  export declare function recipientEverSeen(db: InboxDb, project: string, recipient: string): boolean | undefined;
8
13
  export declare function unreadInboxLines(count: number, project: string, recipient?: string, everSeen?: boolean): string[];
14
+ export declare function unreadInboxLinesFor(db: InboxListDb, recipient?: string): string[];
9
15
  export {};
10
16
  //# sourceMappingURL=agent-message-inbox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-message-inbox.d.ts","sourceRoot":"","sources":["../../src/core/agent-message-inbox.ts"],"names":[],"mappings":"AAoCA,UAAU,OAAO;IACf,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;KAAE,CAAC;CAC9D;AAOD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAsB5F;AA+BD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAatG;AAQD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAejH"}
1
+ {"version":3,"file":"agent-message-inbox.d.ts","sourceRoot":"","sources":["../../src/core/agent-message-inbox.ts"],"names":[],"mappings":"AAoCA,UAAU,OAAO;IACf,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;KAAE,CAAC;CAC9D;AAGD,UAAU,WAAW;IACnB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAA;KAAE,CAAC;CAChE;AAOD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAsB5F;AA+BD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAatG;AAQD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAejH;AAaD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CA6BjF"}
@@ -40,11 +40,38 @@ export function unreadInboxLines(count, project, recipient, everSeen) {
40
40
  const displayRecipient = JSON.stringify(recipient);
41
41
  if (count > 0) {
42
42
  const noun = count === 1 ? 'message' : 'messages';
43
- return [`${count} ${noun} waiting for ${displayRecipient} in project ${displayProject} — poll the message tool with project ${displayProject} and recipient ${displayRecipient}, then fetch each message_id; fetching does not acknowledge.`];
43
+ return [`${count} ${noun} waiting for ${displayRecipient} in project ${displayProject} — poll the message tool with project ${displayProject} and recipient ${displayRecipient}, then fetch each message_id and record the intake action for it: fetching alone does not acknowledge, and only intake ends this line.`];
44
44
  }
45
45
  if (everSeen === false) {
46
46
  return [`No messages waiting for ${displayRecipient} in project ${displayProject} — and this recipient id has never been seen in this project (check for a typo).`];
47
47
  }
48
48
  return [];
49
49
  }
50
+ export function unreadInboxLinesFor(db, recipient) {
51
+ if (!recipient)
52
+ return [];
53
+ try {
54
+ const rows = db.prepare(`SELECT d.project AS project, COUNT(*) AS n
55
+ FROM agent_message_deliveries d
56
+ WHERE d.recipient = ?
57
+ AND NOT EXISTS (
58
+ SELECT 1 FROM agent_message_receipts r
59
+ WHERE r.project = d.project
60
+ AND r.recipient = d.recipient
61
+ AND r.message_id = d.message_id
62
+ AND r.receipt_kind = 'intake'
63
+ )
64
+ GROUP BY d.project
65
+ ORDER BY n DESC, d.project
66
+ LIMIT 5`).all(recipient);
67
+ return rows.flatMap((row) => typeof row.project === 'string' && typeof row.n === 'number' && row.n > 0
68
+ ? unreadInboxLines(row.n, row.project, recipient)
69
+ : []);
70
+ }
71
+ catch (err) {
72
+ if (/no such table: agent_message_deliveries/.test(String(err?.message)))
73
+ return [];
74
+ throw err;
75
+ }
76
+ }
50
77
  //# sourceMappingURL=agent-message-inbox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-message-inbox.js","sourceRoot":"","sources":["../../src/core/agent-message-inbox.ts"],"names":[],"mappings":"AA6CA,MAAM,UAAU,mBAAmB,CAAC,EAAW,EAAE,OAAe,EAAE,SAAkB;IAClF,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB;;;;;;;;;;WAUK,CACN,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAA+B,CAAC;QACxD,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QACjB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QAEP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AA+BD,MAAM,UAAU,iBAAiB,CAAC,EAAW,EAAE,OAAe,EAAE,SAAiB;IAC/E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB;;;;iBAIW,CACZ,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAkC,CAAC;QACnG,OAAO,GAAG,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAQD,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,OAAe,EAAE,SAAkB,EAAE,QAAkB;IACrG,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAI1B,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;QAClD,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI,gBAAgB,gBAAgB,eAAe,cAAc,yCAAyC,cAAc,kBAAkB,gBAAgB,8DAA8D,CAAC,CAAC;IAChP,CAAC;IACD,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,2BAA2B,gBAAgB,eAAe,cAAc,kFAAkF,CAAC,CAAC;IACtK,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"agent-message-inbox.js","sourceRoot":"","sources":["../../src/core/agent-message-inbox.ts"],"names":[],"mappings":"AAkDA,MAAM,UAAU,mBAAmB,CAAC,EAAW,EAAE,OAAe,EAAE,SAAkB;IAClF,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB;;;;;;;;;;WAUK,CACN,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAA+B,CAAC;QACxD,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QACjB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QAEP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AA+BD,MAAM,UAAU,iBAAiB,CAAC,EAAW,EAAE,OAAe,EAAE,SAAiB;IAC/E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB;;;;iBAIW,CACZ,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAkC,CAAC;QACnG,OAAO,GAAG,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAQD,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,OAAe,EAAE,SAAkB,EAAE,QAAkB;IACrG,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAI1B,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;QAClD,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI,gBAAgB,gBAAgB,eAAe,cAAc,yCAAyC,cAAc,kBAAkB,gBAAgB,wIAAwI,CAAC,CAAC;IAC1T,CAAC;IACD,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,2BAA2B,gBAAgB,eAAe,cAAc,kFAAkF,CAAC,CAAC;IACtK,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAaD,MAAM,UAAU,mBAAmB,CAAC,EAAe,EAAE,SAAkB;IACrE,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;;;;;;;;;;;eAYS,CACV,CAAC,GAAG,CAAC,SAAS,CAA4C,CAAC;QAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAC1B,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC;YACvE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC;YACjD,CAAC,CAAC,EAAE,CACP,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QAGb,IAAI,yCAAyC,CAAC,IAAI,CAAC,MAAM,CAAE,GAA6B,EAAE,OAAO,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAC/G,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ export declare const INDEX_MAX_LINES = 40;
2
+ export declare const INDEX_MAX_BYTES = 3072;
3
+ export declare const INDEX_STALE_DAYS = 180;
4
+ export declare const INDEX_LINE_MAX_CHARS = 120;
5
+ export declare const INDEX_SNIPPET_FETCH_CHARS = 4000;
6
+ export declare const INDEX_CANDIDATE_CAP = 2000;
7
+ export declare const INDEX_EXCLUDED_TYPES: readonly string[];
8
+ export declare function isIndexableType(type: string | null | undefined): boolean;
9
+ export interface IndexCandidate {
10
+ id: number;
11
+ type: string | null;
12
+ title?: string | null;
13
+ snippet?: string | null;
14
+ lastActivity: string | null;
15
+ metadata?: unknown;
16
+ }
17
+ export interface BriefingIndex {
18
+ lines: string[];
19
+ shown: number;
20
+ more: number;
21
+ older: number;
22
+ truncated: boolean;
23
+ bytes: number;
24
+ tokens: number;
25
+ ids: number[];
26
+ }
27
+ export declare function buildBriefingIndex(candidates: readonly IndexCandidate[], projectName: string, now: number, options?: {
28
+ truncated?: boolean;
29
+ }): BriefingIndex;
30
+ //# sourceMappingURL=briefing-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"briefing-index.d.ts","sourceRoot":"","sources":["../../src/core/briefing-index.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAIxC,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAI9C,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAexC,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAA4C,CAAC;AAE/F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAExE;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAM5B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAE5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB,KAAK,EAAE,MAAM,CAAC;IAEd,IAAI,EAAE,MAAM,CAAC;IAEb,KAAK,EAAE,MAAM,CAAC;IAEd,SAAS,EAAE,OAAO,CAAC;IAGnB,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,MAAM,CAAC;IAEf,GAAG,EAAE,MAAM,EAAE,CAAC;CACf;AA4JD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,SAAS,cAAc,EAAE,EACrC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,aAAa,CAkDf"}