vibe-squire 2.2.1 → 2.3.1

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.
@@ -17,6 +17,7 @@ const common_1 = require("@nestjs/common");
17
17
  const swagger_1 = require("@nestjs/swagger");
18
18
  const prisma_service_1 = require("../prisma/prisma.service");
19
19
  const poll_run_history_service_1 = require("../sync/poll-run-history.service");
20
+ const triage_live_state_queries_1 = require("../sync/triage-live-state.queries");
20
21
  const ui_presenter_1 = require("./ui-presenter");
21
22
  const DEFAULT_LIMIT = 40;
22
23
  const MAX_LIMIT = 100;
@@ -37,27 +38,9 @@ let ActivityApiController = class ActivityApiController {
37
38
  }
38
39
  const rows = await this.pollRunHistory.listRecentForUi(limit);
39
40
  const allPrUrls = new Set(rows.flatMap((r) => r.items.map((i) => i.prUrl)));
40
- const [syncedRows, declinedRows] = await Promise.all([
41
- allPrUrls.size > 0
42
- ? this.prisma.syncedPullRequest.findMany({
43
- where: { prUrl: { in: [...allPrUrls] } },
44
- select: { prUrl: true },
45
- })
46
- : [],
47
- allPrUrls.size > 0
48
- ? this.prisma.declinedPullRequest.findMany({
49
- where: { prUrl: { in: [...allPrUrls] } },
50
- select: { prUrl: true },
51
- })
52
- : [],
53
- ]);
54
- const acceptedPrUrls = new Set(syncedRows.map((r) => r.prUrl));
55
- const declinedPrUrls = new Set(declinedRows.map((r) => r.prUrl));
41
+ const live = await (0, triage_live_state_queries_1.fetchTriageLiveState)(this.prisma, allPrUrls);
56
42
  return {
57
- runs: (0, ui_presenter_1.presentActivityRunsForView)(rows, {
58
- acceptedPrUrls,
59
- declinedPrUrls,
60
- }),
43
+ runs: (0, ui_presenter_1.presentActivityRunsForView)(rows, live),
61
44
  };
62
45
  }
63
46
  };
@@ -1 +1 @@
1
- {"version":3,"file":"activity-api.controller.js","sourceRoot":"","sources":["../../src/ui/activity-api.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAwD;AACxD,6CAAuE;AACvE,6DAAyD;AACzD,+EAAyE;AACzE,iDAA4D;AAE5D,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,SAAS,GAAG,GAAG,CAAC;AAIf,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAEb;IACA;IAFnB,YACmB,cAAqC,EACrC,MAAqB;QADrB,mBAAc,GAAd,cAAc,CAAuB;QACrC,WAAM,GAAN,MAAM,CAAe;IACrC,CAAC;IAUE,AAAN,KAAK,CAAC,IAAI,CAAiB,QAAiB;QAC1C,IAAI,KAAK,GAAG,aAAa,CAAC;QAC1B,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAE9D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACnD,SAAS,CAAC,IAAI,GAAG,CAAC;gBAChB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC;oBACrC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE;oBACxC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;iBACxB,CAAC;gBACJ,CAAC,CAAC,EAAE;YACN,SAAS,CAAC,IAAI,GAAG,CAAC;gBAChB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC;oBACvC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE;oBACxC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;iBACxB,CAAC;gBACJ,CAAC,CAAC,EAAE;SACP,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAoB,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAClD,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,YAAY,CAAC,GAAG,CAAC,CAAC,CAAoB,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CACpD,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,IAAA,yCAA0B,EAAC,IAAI,EAAE;gBACrC,cAAc;gBACd,cAAc;aACf,CAAC;SACH,CAAC;IACJ,CAAC;CACF,CAAA;AArDY,sDAAqB;AAc1B;IARL,IAAA,YAAG,EAAC,MAAM,CAAC;IACX,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,qDAAqD;KAC/D,CAAC;IACD,IAAA,uBAAa,EAAC;QACb,WAAW,EACT,6EAA6E;KAChF,CAAC;IACU,WAAA,IAAA,cAAK,EAAC,OAAO,CAAC,CAAA;;;;iDAsCzB;gCApDU,qBAAqB;IAFjC,IAAA,iBAAO,EAAC,UAAU,CAAC;IACnB,IAAA,mBAAU,EAAC,cAAc,CAAC;qCAGU,gDAAqB;QAC7B,8BAAa;GAH7B,qBAAqB,CAqDjC"}
1
+ {"version":3,"file":"activity-api.controller.js","sourceRoot":"","sources":["../../src/ui/activity-api.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAwD;AACxD,6CAAuE;AACvE,6DAAyD;AACzD,+EAAyE;AACzE,iFAAyE;AACzE,iDAA4D;AAE5D,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,SAAS,GAAG,GAAG,CAAC;AAIf,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAEb;IACA;IAFnB,YACmB,cAAqC,EACrC,MAAqB;QADrB,mBAAc,GAAd,cAAc,CAAuB;QACrC,WAAM,GAAN,MAAM,CAAe;IACrC,CAAC;IAUE,AAAN,KAAK,CAAC,IAAI,CAAiB,QAAiB;QAC1C,IAAI,KAAK,GAAG,aAAa,CAAC;QAC1B,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,MAAM,IAAA,gDAAoB,EAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEhE,OAAO;YACL,IAAI,EAAE,IAAA,yCAA0B,EAAC,IAAI,EAAE,IAAI,CAAC;SAC7C,CAAC;IACJ,CAAC;CACF,CAAA;AA9BY,sDAAqB;AAc1B;IARL,IAAA,YAAG,EAAC,MAAM,CAAC;IACX,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,qDAAqD;KAC/D,CAAC;IACD,IAAA,uBAAa,EAAC;QACb,WAAW,EACT,6EAA6E;KAChF,CAAC;IACU,WAAA,IAAA,cAAK,EAAC,OAAO,CAAC,CAAA;;;;iDAezB;gCA7BU,qBAAqB;IAFjC,IAAA,iBAAO,EAAC,UAAU,CAAC;IACnB,IAAA,mBAAU,EAAC,cAAc,CAAC;qCAGU,gDAAqB;QAC7B,8BAAa;GAH7B,qBAAqB,CA8BjC"}
@@ -130,10 +130,16 @@
130
130
  return '';
131
131
  }
132
132
 
133
- function renderItemsTable(items) {
133
+ function renderItemsTable(items, opts) {
134
134
  if (!items || !items.length) return '';
135
+ var highlight = opts && opts.highlight;
135
136
  applyOptimistic(items);
136
137
  var sorted = sortItemsForTriage(items);
138
+ var hasTriageable =
139
+ highlight &&
140
+ sorted.some(function (it) {
141
+ return isTriageable(effectiveOf(it));
142
+ });
137
143
  var rows = sorted
138
144
  .map(function (it) {
139
145
  var detailParts = [];
@@ -190,10 +196,16 @@
190
196
  })
191
197
  .join('');
192
198
  return (
193
- '<details class="activity-details">' +
199
+ '<details class="activity-details"' +
200
+ (hasTriageable ? ' open' : '') +
201
+ '>' +
194
202
  '<summary class="activity-details-summary">PR details (' +
195
203
  items.length +
196
- ')</summary>' +
204
+ ')' +
205
+ (hasTriageable
206
+ ? ' · <span class="triage-attention-hint">needs attention</span>'
207
+ : '') +
208
+ '</summary>' +
197
209
  '<div class="table-wrap activity-items-wrap">' +
198
210
  '<table class="data-table activity-items-table">' +
199
211
  '<thead><tr><th>PR</th><th>Repo</th><th>Outcome</th><th>Detail</th></tr></thead>' +
@@ -203,7 +215,8 @@
203
215
  );
204
216
  }
205
217
 
206
- function renderRun(r) {
218
+ function renderRun(r, opts) {
219
+ var highlight = opts && opts.highlight;
207
220
  var meta =
208
221
  '<div class="activity-run-meta">' +
209
222
  '<span class="activity-run-time mono">' +
@@ -265,7 +278,9 @@
265
278
  '</p>';
266
279
  }
267
280
 
268
- var details = r.itemCount ? renderItemsTable(r.items) : '';
281
+ var details = r.itemCount
282
+ ? renderItemsTable(r.items, { highlight: highlight })
283
+ : '';
269
284
 
270
285
  return (
271
286
  '<div class="card activity-run">' +
@@ -278,6 +293,44 @@
278
293
  );
279
294
  }
280
295
 
296
+ function findLatestCompletedRun(runs) {
297
+ for (var i = 0; i < runs.length; i++) {
298
+ if (runs[i].phase === 'completed') return runs[i];
299
+ }
300
+ return null;
301
+ }
302
+
303
+ function countTriageableInRun(run) {
304
+ if (!run) return 0;
305
+ var items = run.items || [];
306
+ var seen = {};
307
+ var count = 0;
308
+ for (var i = 0; i < items.length; i++) {
309
+ var eff = items[i].effectiveDecision || items[i].decision;
310
+ if (isTriageable(eff) && !seen[items[i].prUrl]) {
311
+ seen[items[i].prUrl] = true;
312
+ count++;
313
+ }
314
+ }
315
+ return count;
316
+ }
317
+
318
+ function renderTriageBanner(latestRun) {
319
+ if (!latestRun) return '';
320
+ applyOptimistic(latestRun.items || []);
321
+ var count = countTriageableInRun(latestRun);
322
+ if (count === 0) return '';
323
+ return (
324
+ '<div class="banner banner-triage-attention">' +
325
+ '<strong>' +
326
+ count +
327
+ ' PR' +
328
+ (count === 1 ? '' : 's') +
329
+ '</strong> awaiting your review or decline decision.' +
330
+ '</div>'
331
+ );
332
+ }
333
+
281
334
  function renderRuns(runs) {
282
335
  if (!runs || !runs.length) {
283
336
  return (
@@ -286,7 +339,16 @@
286
339
  '</div>'
287
340
  );
288
341
  }
289
- return runs.map(renderRun).join('');
342
+ var latestCompleted = findLatestCompletedRun(runs);
343
+ var latestId = latestCompleted && latestCompleted.id;
344
+ return (
345
+ renderTriageBanner(latestCompleted) +
346
+ runs
347
+ .map(function (r) {
348
+ return renderRun(r, { highlight: r.id === latestId });
349
+ })
350
+ .join('')
351
+ );
290
352
  }
291
353
 
292
354
  var pollTimer = null;
@@ -4,6 +4,7 @@
4
4
  var SSE_EVENT =
5
5
  VS.STATUS_SNAPSHOT_EVENT || g.__VS_SSE_EVENT__ || 'vibesquire:status-snapshot';
6
6
  var stateEl = document.getElementById('nav-sse-state');
7
+ var badgeEl = document.getElementById('nav-triage-badge');
7
8
 
8
9
  function setSse(s) {
9
10
  if (!stateEl) return;
@@ -11,6 +12,87 @@
11
12
  stateEl.className = 'sse sse-' + s;
12
13
  }
13
14
 
15
+ /* ── Nav badge ── */
16
+
17
+ function updateTriageBadge(count) {
18
+ if (!badgeEl) return;
19
+ if (count > 0) {
20
+ badgeEl.textContent = String(count);
21
+ badgeEl.hidden = false;
22
+ } else {
23
+ badgeEl.textContent = '';
24
+ badgeEl.hidden = true;
25
+ }
26
+ }
27
+
28
+ /* ── Web Notifications ── */
29
+
30
+ var lastNotifiedTriageKey = '';
31
+
32
+ function requestNotificationPermission() {
33
+ if (!('Notification' in g)) return;
34
+ if (Notification.permission === 'default') {
35
+ Notification.requestPermission();
36
+ }
37
+ }
38
+
39
+ function maybeNotifyTriage(count) {
40
+ if (!('Notification' in g) || Notification.permission !== 'granted') return;
41
+ if (count <= 0) {
42
+ lastNotifiedTriageKey = '';
43
+ return;
44
+ }
45
+ var key = String(count);
46
+ if (key === lastNotifiedTriageKey) return;
47
+ lastNotifiedTriageKey = key;
48
+ new Notification('vibe-squire: PRs need triage', {
49
+ body: count + ' PR(s) awaiting your review or decline decision',
50
+ icon: '/ui/assets/favicon.svg',
51
+ tag: 'vs-triage',
52
+ });
53
+ }
54
+
55
+ /* ── Favicon notification dot ── */
56
+
57
+ var faviconLink = document.querySelector('link[rel="icon"]');
58
+ var baseFaviconImg = null;
59
+ var faviconCanvas = null;
60
+ var faviconReady = false;
61
+ var lastFaviconHasDot = false;
62
+
63
+ (function initFavicon() {
64
+ if (!faviconLink) return;
65
+ var img = new Image();
66
+ img.onload = function () {
67
+ baseFaviconImg = img;
68
+ faviconCanvas = document.createElement('canvas');
69
+ faviconCanvas.width = 32;
70
+ faviconCanvas.height = 32;
71
+ faviconReady = true;
72
+ };
73
+ img.src = '/ui/assets/favicon.svg';
74
+ })();
75
+
76
+ function setFaviconDot(show) {
77
+ if (!faviconReady || show === lastFaviconHasDot) return;
78
+ lastFaviconHasDot = show;
79
+ var ctx = faviconCanvas.getContext('2d');
80
+ ctx.clearRect(0, 0, 32, 32);
81
+ ctx.drawImage(baseFaviconImg, 0, 0, 32, 32);
82
+ if (show) {
83
+ ctx.beginPath();
84
+ ctx.arc(25, 7, 6, 0, 2 * Math.PI);
85
+ ctx.fillStyle = '#c9a227';
86
+ ctx.fill();
87
+ ctx.lineWidth = 1.5;
88
+ ctx.strokeStyle = '#121815';
89
+ ctx.stroke();
90
+ }
91
+ faviconLink.href = faviconCanvas.toDataURL('image/png');
92
+ }
93
+
94
+ /* ── Snapshot dispatch ── */
95
+
14
96
  function publishSnapshot(snap) {
15
97
  if (!snap || typeof snap !== 'object') return;
16
98
  try {
@@ -18,9 +100,18 @@
18
100
  } catch {
19
101
  /* ignore */
20
102
  }
103
+ var triageCount =
104
+ typeof snap.pending_triage_count === 'number'
105
+ ? snap.pending_triage_count
106
+ : 0;
107
+ updateTriageBadge(triageCount);
108
+ maybeNotifyTriage(triageCount);
109
+ setFaviconDot(triageCount > 0);
21
110
  g.dispatchEvent(new CustomEvent(SSE_EVENT, { detail: snap }));
22
111
  }
23
112
 
113
+ /* ── SSE connection ── */
114
+
24
115
  var es = new EventSource('/api/status/stream');
25
116
  setSse('connecting');
26
117
  es.onopen = function () {
@@ -40,4 +131,6 @@
40
131
  /* ignore */
41
132
  }
42
133
  };
134
+
135
+ requestNotificationPermission();
43
136
  })();
@@ -145,6 +145,23 @@ code {
145
145
  color: var(--accent);
146
146
  }
147
147
 
148
+ .nav-badge {
149
+ display: inline-flex;
150
+ align-items: center;
151
+ justify-content: center;
152
+ min-width: 1.25rem;
153
+ height: 1.25rem;
154
+ padding: 0 0.35rem;
155
+ border-radius: 999px;
156
+ background: var(--warn);
157
+ color: var(--bg);
158
+ font-size: 0.7rem;
159
+ font-weight: 700;
160
+ font-family: var(--mono);
161
+ margin-left: 0.4rem;
162
+ vertical-align: middle;
163
+ }
164
+
148
165
  .nav-foot {
149
166
  margin-top: auto;
150
167
  font-size: 0.72rem;
@@ -707,7 +724,8 @@ textarea.input {
707
724
 
708
725
  /* Triage rows */
709
726
  .triage-pending-row {
710
- background: rgba(61, 159, 122, 0.06);
727
+ background: rgba(201, 162, 39, 0.09);
728
+ border-left: 3px solid var(--warn);
711
729
  }
712
730
 
713
731
  .triage-declined-row {
@@ -719,3 +737,21 @@ textarea.input {
719
737
  gap: 0.35rem;
720
738
  flex-wrap: wrap;
721
739
  }
740
+
741
+ .triage-attention-hint {
742
+ color: var(--warn);
743
+ font-weight: 600;
744
+ font-size: 0.82rem;
745
+ }
746
+
747
+ /* Triage attention banner */
748
+ .banner-triage-attention {
749
+ background: rgba(201, 162, 39, 0.12);
750
+ border: 1px solid rgba(201, 162, 39, 0.3);
751
+ border-left: 3px solid var(--warn);
752
+ color: var(--text-strong);
753
+ padding: 0.65rem 1rem;
754
+ border-radius: 6px;
755
+ font-size: 0.9rem;
756
+ margin-bottom: 1rem;
757
+ }
@@ -1,11 +1,9 @@
1
1
  import type { SetupEvaluation } from '../setup/setup-evaluation.service';
2
2
  import type { PollRunHistoryService } from '../sync/poll-run-history.service';
3
3
  import type { UiNavEntry } from '../ports/ui-nav.types';
4
+ import type { TriageLiveState } from '../sync/triage-live-state.queries';
5
+ export type { TriageLiveState } from '../sync/triage-live-state.queries';
4
6
  export type PollRunRowForActivity = Awaited<ReturnType<PollRunHistoryService['listRecentForUi']>>[number];
5
- export type TriageLiveState = {
6
- acceptedPrUrls: ReadonlySet<string>;
7
- declinedPrUrls: ReadonlySet<string>;
8
- };
9
7
  export type ActivityItem = {
10
8
  prUrl: string;
11
9
  githubRepo: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ui-presenter.js","sourceRoot":"","sources":["../../src/ui/ui-presenter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui-presenter.js","sourceRoot":"","sources":["../../src/ui/ui-presenter.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@
16
16
  <a
17
17
  href="/ui/activity"
18
18
  class="nav-link {{#if (eq active 'activity')}}active{{/if}}"
19
- >Activity</a>
19
+ >Activity<span id="nav-triage-badge" class="nav-badge" hidden></span></a>
20
20
  {{/unless}}
21
21
 
22
22
  <div class="nav-settings-group">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibe-squire",
3
- "version": "2.2.1",
3
+ "version": "2.3.1",
4
4
  "description": "Local orchestrator: GitHub PR review queue → Vibe Kanban via MCP",
5
5
  "author": "alexpialetski",
6
6
  "license": "MIT",