hanoman 0.2.4 → 0.2.6

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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.2.4",
3
- "sha": "5675d4f5",
4
- "builtAt": "2026-08-31T14:43:04.080Z"
2
+ "version": "0.2.6",
3
+ "sha": "b1dfa07d",
4
+ "builtAt": "2026-09-03T09:13:40.923Z"
5
5
  }
package/dist/cli.js CHANGED
@@ -11065,6 +11065,13 @@ var init_presence = __esm({
11065
11065
  }
11066
11066
  });
11067
11067
 
11068
+ // ../shared/src/pending.ts
11069
+ var init_pending = __esm({
11070
+ "../shared/src/pending.ts"() {
11071
+ "use strict";
11072
+ }
11073
+ });
11074
+
11068
11075
  // ../shared/src/index.ts
11069
11076
  var init_src = __esm({
11070
11077
  "../shared/src/index.ts"() {
@@ -11105,6 +11112,7 @@ var init_src = __esm({
11105
11112
  init_session_dialog();
11106
11113
  init_session_ask();
11107
11114
  init_presence();
11115
+ init_pending();
11108
11116
  init_team();
11109
11117
  }
11110
11118
  });
package/dist/server.js CHANGED
@@ -11775,6 +11775,16 @@ var init_presence = __esm({
11775
11775
  }
11776
11776
  });
11777
11777
 
11778
+ // ../shared/src/pending.ts
11779
+ var EMPTY_PENDING, OPEN_LEAD_FLOW_STATUSES;
11780
+ var init_pending = __esm({
11781
+ "../shared/src/pending.ts"() {
11782
+ "use strict";
11783
+ EMPTY_PENDING = { triage: 0, backlog: 0, prd: 0, lead: 0 };
11784
+ OPEN_LEAD_FLOW_STATUSES = ["menunggu", "sebagian"];
11785
+ }
11786
+ });
11787
+
11778
11788
  // ../shared/src/index.ts
11779
11789
  var init_src = __esm({
11780
11790
  "../shared/src/index.ts"() {
@@ -11815,6 +11825,7 @@ var init_src = __esm({
11815
11825
  init_session_dialog();
11816
11826
  init_session_ask();
11817
11827
  init_presence();
11828
+ init_pending();
11818
11829
  init_team();
11819
11830
  }
11820
11831
  });
@@ -40769,6 +40780,35 @@ async function presenceView(o = {}) {
40769
40780
  return { enabled: rows.length > 0, devices: devices2 };
40770
40781
  }
40771
40782
 
40783
+ // src/services/pending-counts.ts
40784
+ init_src();
40785
+ init_db();
40786
+ var PRD_TTL_MS = 6e4;
40787
+ var prdCache = null;
40788
+ async function prdDraftCount(now, prds) {
40789
+ if (prdCache && now - prdCache.at < PRD_TTL_MS) return prdCache.count;
40790
+ try {
40791
+ const count = (await prds()).filter((p3) => p3.status === "draft").length;
40792
+ prdCache = { at: now, count };
40793
+ } catch {
40794
+ prdCache = { at: now, count: prdCache?.count ?? 0 };
40795
+ }
40796
+ return prdCache.count;
40797
+ }
40798
+ async function pendingCounts(now = Date.now(), prds = listAllPrds) {
40799
+ const [tickets2, issues, backlog, lead, prd] = await Promise.all([
40800
+ prisma.ticket.count({ where: { status: "new" } }),
40801
+ prisma.githubIssue.count({ where: { status: "new" } }),
40802
+ // `startedAt` = kapan sesi PERTAMA lahir (ADR-0090), null = belum pernah dikerjakan. Stage
40803
+ // `done` dikecualikan karena item bisa ditandai selesai manual tanpa sesi (SPEC-804/ADR-0120) —
40804
+ // tanpa gerbang itu ia terhitung selamanya sebagai pekerjaan yang belum diajukan.
40805
+ prisma.spec.count({ where: { startedAt: null, stage: { not: "done" } } }),
40806
+ prisma.leadFlow.count({ where: { status: { in: [...OPEN_LEAD_FLOW_STATUSES] } } }),
40807
+ prdDraftCount(now, prds)
40808
+ ]);
40809
+ return { ...EMPTY_PENDING, triage: tickets2 + issues, backlog, prd, lead };
40810
+ }
40811
+
40772
40812
  // src/services/events.ts
40773
40813
  init_db();
40774
40814
  init_config2();
@@ -41646,7 +41686,14 @@ var GROUPS = [
41646
41686
  // dihitung). 3 dtk: presence berdenyut 30 dtk, jadi kadens lebih rapat hanya menambah build tanpa
41647
41687
  // menambah informasi. `presenceView` menyegarkan sesi mesin ini sendiri di dalamnya — satu
41648
41688
  // `tmux list-panes` asinkron, tak menahan event loop.
41649
- { everyTicks: 3, cookieOnly: true, last: "", build: async () => ({ t: "presence", ...await presenceView() }) }
41689
+ { everyTicks: 3, cookieOnly: true, last: "", build: async () => ({ t: "presence", ...await presenceView() }) },
41690
+ // SPEC-961 · grup GLOBAL ke-11 · angka "butuh pengajuan" untuk badge sidebar. 5 dtk: badge bukan
41691
+ // board — yang dijanjikannya adalah "ada yang menunggu", bukan detik keberapa ia muncul — dan
41692
+ // dedup signature membuat frame lahir hanya saat salah satu angka berubah (jarang). Empat angka,
41693
+ // bukan empat grup: keempatnya berubah dari peristiwa yang sama (item diajukan/diputuskan) dan
41694
+ // dibaca satu komponen yang sama. `cookieOnly` TIDAK dipasang — muatannya jumlah agregat tanpa
41695
+ // id/judul, dan agent token sudah boleh membaca daftar sumbernya lewat capability masing-masing.
41696
+ { everyTicks: 5, last: "", build: async () => ({ t: "pending", counts: await pendingCounts() }) }
41650
41697
  ];
41651
41698
  function broadcast2(msg, cookieOnly = false) {
41652
41699
  const s2 = JSON.stringify(msg);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hanoman",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "description": "Orchestrator + dashboard workflow docs-driven untuk sesi Claude Code / Codex",
5
5
  "type": "module",
6
6
  "repository": {