@agentdeck/bridge 1.0.5 → 1.0.7

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 (128) hide show
  1. package/assets/fm-helper/agentdeck-fm-helper +0 -0
  2. package/dist/apme/collector.d.ts +10 -0
  3. package/dist/apme/collector.d.ts.map +1 -1
  4. package/dist/apme/collector.js +39 -10
  5. package/dist/apme/collector.js.map +1 -1
  6. package/dist/apme/dashboard-html.d.ts.map +1 -1
  7. package/dist/apme/dashboard-html.js +289 -0
  8. package/dist/apme/dashboard-html.js.map +1 -1
  9. package/dist/apme/graph.d.ts +48 -0
  10. package/dist/apme/graph.d.ts.map +1 -0
  11. package/dist/apme/graph.js +226 -0
  12. package/dist/apme/graph.js.map +1 -0
  13. package/dist/apme/http.d.ts.map +1 -1
  14. package/dist/apme/http.js +52 -0
  15. package/dist/apme/http.js.map +1 -1
  16. package/dist/apme/judge-detect.d.ts.map +1 -1
  17. package/dist/apme/judge-detect.js +26 -2
  18. package/dist/apme/judge-detect.js.map +1 -1
  19. package/dist/apme/store.d.ts +69 -1
  20. package/dist/apme/store.d.ts.map +1 -1
  21. package/dist/apme/store.js +238 -4
  22. package/dist/apme/store.js.map +1 -1
  23. package/dist/apme/types.d.ts +1 -1
  24. package/dist/apme/types.d.ts.map +1 -1
  25. package/dist/apme/types.js.map +1 -1
  26. package/dist/ble-sync-spawn.d.ts +25 -2
  27. package/dist/ble-sync-spawn.d.ts.map +1 -1
  28. package/dist/ble-sync-spawn.js +38 -2
  29. package/dist/ble-sync-spawn.js.map +1 -1
  30. package/dist/ble-sync-status.d.ts +77 -0
  31. package/dist/ble-sync-status.d.ts.map +1 -0
  32. package/dist/ble-sync-status.js +157 -0
  33. package/dist/ble-sync-status.js.map +1 -0
  34. package/dist/bridge-core.d.ts.map +1 -1
  35. package/dist/bridge-core.js +7 -1
  36. package/dist/bridge-core.js.map +1 -1
  37. package/dist/cli.js +0 -0
  38. package/dist/codex-rate-limits-live.d.ts +60 -0
  39. package/dist/codex-rate-limits-live.d.ts.map +1 -0
  40. package/dist/codex-rate-limits-live.js +282 -0
  41. package/dist/codex-rate-limits-live.js.map +1 -0
  42. package/dist/d200h/hid-protocol.d.ts +62 -0
  43. package/dist/d200h/hid-protocol.d.ts.map +1 -0
  44. package/dist/d200h/hid-protocol.js +124 -0
  45. package/dist/d200h/hid-protocol.js.map +1 -0
  46. package/dist/d200h/image-renderer.d.ts +24 -0
  47. package/dist/d200h/image-renderer.d.ts.map +1 -0
  48. package/dist/d200h/image-renderer.js +321 -0
  49. package/dist/d200h/image-renderer.js.map +1 -0
  50. package/dist/daemon-server.d.ts.map +1 -1
  51. package/dist/daemon-server.js +163 -10
  52. package/dist/daemon-server.js.map +1 -1
  53. package/dist/daemon.js +1 -1
  54. package/dist/device-voice-reply.d.ts +1 -10
  55. package/dist/device-voice-reply.d.ts.map +1 -1
  56. package/dist/device-voice-reply.js +4 -33
  57. package/dist/device-voice-reply.js.map +1 -1
  58. package/dist/foundation-models-helper.d.ts.map +1 -1
  59. package/dist/foundation-models-helper.js +59 -22
  60. package/dist/foundation-models-helper.js.map +1 -1
  61. package/dist/hook-migration.d.ts +2 -0
  62. package/dist/hook-migration.d.ts.map +1 -0
  63. package/dist/hook-migration.js +116 -0
  64. package/dist/hook-migration.js.map +1 -0
  65. package/dist/idotmatrix/idotmatrix-daemon-sync.d.ts +8 -0
  66. package/dist/idotmatrix/idotmatrix-daemon-sync.d.ts.map +1 -1
  67. package/dist/idotmatrix/idotmatrix-daemon-sync.js +19 -3
  68. package/dist/idotmatrix/idotmatrix-daemon-sync.js.map +1 -1
  69. package/dist/modules/d200h-module.d.ts +65 -0
  70. package/dist/modules/d200h-module.d.ts.map +1 -0
  71. package/dist/modules/d200h-module.js +495 -0
  72. package/dist/modules/d200h-module.js.map +1 -0
  73. package/dist/modules/d200h-renderer.d.ts +7 -0
  74. package/dist/modules/d200h-renderer.d.ts.map +1 -0
  75. package/dist/modules/d200h-renderer.js +321 -0
  76. package/dist/modules/d200h-renderer.js.map +1 -0
  77. package/dist/modules/idotmatrix-module.d.ts.map +1 -1
  78. package/dist/modules/idotmatrix-module.js +12 -1
  79. package/dist/modules/idotmatrix-module.js.map +1 -1
  80. package/dist/modules/timebox-module.d.ts.map +1 -1
  81. package/dist/modules/timebox-module.js +12 -1
  82. package/dist/modules/timebox-module.js.map +1 -1
  83. package/dist/modules/trmnl-module.d.ts +38 -0
  84. package/dist/modules/trmnl-module.d.ts.map +1 -0
  85. package/dist/modules/trmnl-module.js +111 -0
  86. package/dist/modules/trmnl-module.js.map +1 -0
  87. package/dist/openclaw-session.d.ts +6 -0
  88. package/dist/openclaw-session.d.ts.map +1 -1
  89. package/dist/openclaw-session.js +7 -1
  90. package/dist/openclaw-session.js.map +1 -1
  91. package/dist/timebox/timebox-daemon-sync.d.ts +8 -0
  92. package/dist/timebox/timebox-daemon-sync.d.ts.map +1 -1
  93. package/dist/timebox/timebox-daemon-sync.js +29 -1
  94. package/dist/timebox/timebox-daemon-sync.js.map +1 -1
  95. package/dist/timeline-summarizer.d.ts +12 -2
  96. package/dist/timeline-summarizer.d.ts.map +1 -1
  97. package/dist/timeline-summarizer.js +66 -4
  98. package/dist/timeline-summarizer.js.map +1 -1
  99. package/dist/trmnl/byos-server.d.ts +39 -0
  100. package/dist/trmnl/byos-server.d.ts.map +1 -0
  101. package/dist/trmnl/byos-server.js +301 -0
  102. package/dist/trmnl/byos-server.js.map +1 -0
  103. package/dist/trmnl/frame-cache.d.ts +37 -0
  104. package/dist/trmnl/frame-cache.d.ts.map +1 -0
  105. package/dist/trmnl/frame-cache.js +157 -0
  106. package/dist/trmnl/frame-cache.js.map +1 -0
  107. package/dist/trmnl/image-renderer.d.ts +27 -0
  108. package/dist/trmnl/image-renderer.d.ts.map +1 -0
  109. package/dist/trmnl/image-renderer.js +235 -0
  110. package/dist/trmnl/image-renderer.js.map +1 -0
  111. package/dist/trmnl/trmnl-settings.d.ts +96 -0
  112. package/dist/trmnl/trmnl-settings.d.ts.map +1 -0
  113. package/dist/trmnl/trmnl-settings.js +177 -0
  114. package/dist/trmnl/trmnl-settings.js.map +1 -0
  115. package/dist/trmnl/trmnl-telemetry.d.ts +47 -0
  116. package/dist/trmnl/trmnl-telemetry.d.ts.map +1 -0
  117. package/dist/trmnl/trmnl-telemetry.js +56 -0
  118. package/dist/trmnl/trmnl-telemetry.js.map +1 -0
  119. package/dist/whisper-server-manager.d.ts +19 -0
  120. package/dist/whisper-server-manager.d.ts.map +1 -0
  121. package/dist/whisper-server-manager.js +171 -0
  122. package/dist/whisper-server-manager.js.map +1 -0
  123. package/fm-helper/Info.plist +27 -0
  124. package/package.json +13 -14
  125. package/scripts/build-fm-helper.mjs +35 -3
  126. package/src/idotmatrix/sync.py +16 -1
  127. package/src/pysync/matrix_sync_common.py +83 -0
  128. package/src/timebox/sync_ble.py +16 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"byos-server.js","sourceRoot":"","sources":["../../src/trmnl/byos-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * TRMNL frame cache — the rendered 1-bit PNG dashboards the BYOS HTTP routes
3
+ * serve. The device module keeps them fresh by re-rendering on state change; the
4
+ * daemon's /api/display + /trmnl/image routes read them. Unlike push devices
5
+ * (Pixoo/D200H), TRMNL pulls on its own schedule, so we only hold the latest
6
+ * frame per resolution and let each device fetch it when it polls.
7
+ *
8
+ * Frames are keyed by `"<W>x<H>"` rather than a single global frame: different
9
+ * BYOS panels report different resolutions, and each must get a correctly-sized
10
+ * image. The map is bounded (typically one resolution is in use) to cap memory.
11
+ */
12
+ import { type TrmnlFrame } from './image-renderer.js';
13
+ /** Visual-state fingerprint (excludes the wall clock so it doesn't churn). */
14
+ export declare function trmnlStateHash(evt: any): string;
15
+ /** AWAITING/WORKING counts from the last known state — drives adaptive cadence. */
16
+ export declare function getTrmnlActivity(): {
17
+ awaiting: number;
18
+ working: number;
19
+ };
20
+ /** Store the latest broadcast state for lazy rendering, without rendering now. */
21
+ export declare function setTrmnlState(evt: any): void;
22
+ /**
23
+ * Re-render every cached resolution whose visual state changed. Returns true if
24
+ * any new frame was produced. Called by the device module on each broadcast. If
25
+ * no device has polled yet, primes the default resolution so a first poll is
26
+ * instant.
27
+ */
28
+ export declare function refreshTrmnlFrame(evt: any): boolean;
29
+ /** Force a render from the last known state for a resolution (e.g. after setup). */
30
+ export declare function forceRenderTrmnlFrame(width?: number, height?: number): TrmnlFrame;
31
+ /** Frame for a resolution, lazily rendered from the last known state if absent. */
32
+ export declare function getTrmnlFrame(width?: number, height?: number): TrmnlFrame;
33
+ /** Frame for an exact `"<W>x<H>"` key, or undefined if not cached. */
34
+ export declare function getTrmnlFrameByKey(key: string): TrmnlFrame | undefined;
35
+ /** Active resolution keys currently held in the cache. */
36
+ export declare function getTrmnlFrameKeys(): string[];
37
+ //# sourceMappingURL=frame-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-cache.d.ts","sourceRoot":"","sources":["../../src/trmnl/frame-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAsCxE,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CA+B/C;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAUxE;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAE5C;AAuBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAcnD;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAEjF;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAGzE;AAED,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAEtE;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * TRMNL frame cache — the rendered 1-bit PNG dashboards the BYOS HTTP routes
3
+ * serve. The device module keeps them fresh by re-rendering on state change; the
4
+ * daemon's /api/display + /trmnl/image routes read them. Unlike push devices
5
+ * (Pixoo/D200H), TRMNL pulls on its own schedule, so we only hold the latest
6
+ * frame per resolution and let each device fetch it when it polls.
7
+ *
8
+ * Frames are keyed by `"<W>x<H>"` rather than a single global frame: different
9
+ * BYOS panels report different resolutions, and each must get a correctly-sized
10
+ * image. The map is bounded (typically one resolution is in use) to cap memory.
11
+ */
12
+ import { renderTrmnlFrame } from './image-renderer.js';
13
+ import { TRMNL_WIDTH, TRMNL_HEIGHT } from '@agentdeck/shared';
14
+ const DEFAULT_KEY = `${TRMNL_WIDTH}x${TRMNL_HEIGHT}`;
15
+ /** Bound on distinct resolutions held at once (insertion-order LRU eviction). */
16
+ const MAX_FRAMES = 8;
17
+ /** Resolution-keyed cache. Insertion order doubles as LRU recency. */
18
+ const frames = new Map();
19
+ const lastHashByKey = new Map();
20
+ let lastStateEvt = {
21
+ state: 'IDLE',
22
+ projectName: '',
23
+ modelName: '',
24
+ mode: 'default',
25
+ agentType: 'daemon',
26
+ fiveHourPercent: 0,
27
+ sevenDayPercent: 0,
28
+ totalTokens: 0,
29
+ totalCost: 0,
30
+ options: [],
31
+ currentTool: '',
32
+ allSessions: [],
33
+ };
34
+ function sizeKey(width, height) {
35
+ const w = width && width > 0 ? Math.round(width) : TRMNL_WIDTH;
36
+ const h = height && height > 0 ? Math.round(height) : TRMNL_HEIGHT;
37
+ return `${w}x${h}`;
38
+ }
39
+ function parseKey(key) {
40
+ const m = /^(\d+)x(\d+)$/.exec(key);
41
+ if (!m)
42
+ return { width: TRMNL_WIDTH, height: TRMNL_HEIGHT };
43
+ return { width: Number(m[1]), height: Number(m[2]) };
44
+ }
45
+ /** Visual-state fingerprint (excludes the wall clock so it doesn't churn). */
46
+ export function trmnlStateHash(evt) {
47
+ const sessions = Array.isArray(evt?.allSessions) ? evt.allSessions : [];
48
+ const sessKey = sessions
49
+ .map((s) => `${s?.id}:${s?.agentType}:${s?.state}:${s?.projectName}:${s?.modelName}:${s?.goal ?? ''}`)
50
+ .join('|');
51
+ // No wall-clock / freshness component: a real TRMNL caches by `filename` and
52
+ // skips the (battery + flaky-WiFi) re-download when it's unchanged. So the hash
53
+ // must change ONLY on real visual change — never churn it for a ticking clock.
54
+ return [
55
+ evt?.state,
56
+ evt?.projectName,
57
+ evt?.modelName,
58
+ evt?.usageKnown ? Math.round(evt?.fiveHourPercent ?? 0) : 'na',
59
+ evt?.usageKnown ? Math.round(evt?.sevenDayPercent ?? 0) : 'na',
60
+ // Reset windows roll over rarely — include them so a rollover re-renders the
61
+ // countdown, but they don't churn minute-to-minute.
62
+ evt?.fiveHourResetsAt ?? '',
63
+ evt?.sevenDayResetsAt ?? '',
64
+ // Codex (ChatGPT) rolling windows render a second footer row — fold them in
65
+ // so a Codex-only usage change still re-renders the panel (otherwise the
66
+ // Claude-only hash above would mask it and the TRMNL would skip the redraw).
67
+ evt?.codexRateLimits?.primary?.usedPercent != null
68
+ ? Math.round(evt.codexRateLimits.primary.usedPercent)
69
+ : 'na',
70
+ evt?.codexRateLimits?.secondary?.usedPercent != null
71
+ ? Math.round(evt.codexRateLimits.secondary.usedPercent)
72
+ : 'na',
73
+ evt?.codexRateLimits?.primary?.resetsAt ?? '',
74
+ evt?.codexRateLimits?.secondary?.resetsAt ?? '',
75
+ sessKey,
76
+ ].join('~');
77
+ }
78
+ /** AWAITING/WORKING counts from the last known state — drives adaptive cadence. */
79
+ export function getTrmnlActivity() {
80
+ const sessions = Array.isArray(lastStateEvt?.allSessions) ? lastStateEvt.allSessions : [];
81
+ let awaiting = 0;
82
+ let working = 0;
83
+ for (const s of sessions) {
84
+ const st = String(s?.state ?? '').toLowerCase();
85
+ if (st.startsWith('awaiting'))
86
+ awaiting++;
87
+ else if (st === 'processing')
88
+ working++;
89
+ }
90
+ return { awaiting, working };
91
+ }
92
+ /** Store the latest broadcast state for lazy rendering, without rendering now. */
93
+ export function setTrmnlState(evt) {
94
+ lastStateEvt = evt;
95
+ }
96
+ /** Render (and cache) the current state for one resolution key, with LRU eviction. */
97
+ function renderForKey(key) {
98
+ const { width, height } = parseKey(key);
99
+ let frame = renderTrmnlFrame(lastStateEvt, undefined, { width, height });
100
+ // A degraded frame is a blank fallback (render threw). Keep serving the last
101
+ // good frame for this resolution — a stale dashboard beats an empty panel.
102
+ // The state hash still advances so we retry on the next real state change.
103
+ const prev = frames.get(key);
104
+ if (frame.degraded && prev && !prev.degraded)
105
+ frame = prev;
106
+ frames.delete(key); // re-insert to mark most-recently-used
107
+ frames.set(key, frame);
108
+ lastHashByKey.set(key, trmnlStateHash(lastStateEvt));
109
+ while (frames.size > MAX_FRAMES) {
110
+ const oldest = frames.keys().next().value;
111
+ if (oldest === undefined)
112
+ break;
113
+ frames.delete(oldest);
114
+ lastHashByKey.delete(oldest);
115
+ }
116
+ return frame;
117
+ }
118
+ /**
119
+ * Re-render every cached resolution whose visual state changed. Returns true if
120
+ * any new frame was produced. Called by the device module on each broadcast. If
121
+ * no device has polled yet, primes the default resolution so a first poll is
122
+ * instant.
123
+ */
124
+ export function refreshTrmnlFrame(evt) {
125
+ lastStateEvt = evt;
126
+ const hash = trmnlStateHash(evt);
127
+ if (frames.size === 0) {
128
+ renderForKey(DEFAULT_KEY);
129
+ return true;
130
+ }
131
+ let rendered = false;
132
+ for (const key of [...frames.keys()]) {
133
+ if (lastHashByKey.get(key) === hash)
134
+ continue;
135
+ renderForKey(key);
136
+ rendered = true;
137
+ }
138
+ return rendered;
139
+ }
140
+ /** Force a render from the last known state for a resolution (e.g. after setup). */
141
+ export function forceRenderTrmnlFrame(width, height) {
142
+ return renderForKey(sizeKey(width, height));
143
+ }
144
+ /** Frame for a resolution, lazily rendered from the last known state if absent. */
145
+ export function getTrmnlFrame(width, height) {
146
+ const key = sizeKey(width, height);
147
+ return frames.get(key) ?? renderForKey(key);
148
+ }
149
+ /** Frame for an exact `"<W>x<H>"` key, or undefined if not cached. */
150
+ export function getTrmnlFrameByKey(key) {
151
+ return frames.get(key);
152
+ }
153
+ /** Active resolution keys currently held in the cache. */
154
+ export function getTrmnlFrameKeys() {
155
+ return [...frames.keys()];
156
+ }
157
+ //# sourceMappingURL=frame-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-cache.js","sourceRoot":"","sources":["../../src/trmnl/frame-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /** Initialize the renderer (loads resvg-js if available). Call once at start. */
2
+ export declare function initTrmnlRenderer(): Promise<void>;
3
+ export declare function isTrmnlResvgLoaded(): boolean;
4
+ export interface TrmnlFrame {
5
+ buffer: Buffer;
6
+ /** Short stable hash of the image bytes — used as the BYOS `filename`. */
7
+ contentHash: string;
8
+ width: number;
9
+ height: number;
10
+ contentType: 'image/png';
11
+ /**
12
+ * True when this frame is a blank fallback (render threw or resvg missing),
13
+ * NOT a real dashboard. The frame cache uses this to keep serving the last
14
+ * good frame instead of flashing the panel to an empty white screen.
15
+ */
16
+ degraded?: boolean;
17
+ }
18
+ /**
19
+ * Render the AgentDeck dashboard for the given broadcast state into a 1-bit PNG.
20
+ * Accepts a raw state event or a pre-parsed DashState (passed through to the
21
+ * shared layout). `now` may be supplied for deterministic tests.
22
+ */
23
+ export declare function renderTrmnlFrame(stateEvt: any, now?: Date, size?: {
24
+ width: number;
25
+ height: number;
26
+ }): TrmnlFrame;
27
+ //# sourceMappingURL=image-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-renderer.d.ts","sourceRoot":"","sources":["../../src/trmnl/image-renderer.ts"],"names":[],"mappings":"AA8EA,iFAAiF;AACjF,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEvD;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AA4GD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAMD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,GAAG,EACb,GAAG,CAAC,EAAE,IAAI,EACV,IAAI,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC,UAAU,CAwCZ"}
@@ -0,0 +1,235 @@
1
+ /**
2
+ * TRMNL image renderer — rasterizes the shared 800×480 dashboard SVG to a
3
+ * 1-bit (black/white) grayscale PNG sized for the TRMNL 7.5" e-ink panel.
4
+ *
5
+ * Pipeline: shared `renderTrmnlDashboard` SVG → resvg rasterize (800×480 RGBA)
6
+ * → luminance threshold → packed 1-bit PNG (color type 0, bit depth 1) encoded
7
+ * with Node's built-in `zlib` (no new dependency). A 1-bit PNG of mostly-white
8
+ * line art deflates to a few KB, comfortably under TRMNL's 90 KB download cap.
9
+ *
10
+ * Falls back to a blank 1-bit PNG when resvg-js is unavailable (matches the
11
+ * D200H renderer's optional-dependency pattern).
12
+ */
13
+ import { deflateSync } from 'zlib';
14
+ import { createHash } from 'crypto';
15
+ import { fileURLToPath } from 'node:url';
16
+ import { dirname, join } from 'node:path';
17
+ import { existsSync } from 'node:fs';
18
+ import { renderTrmnlDashboard, TRMNL_WIDTH, TRMNL_HEIGHT } from '@agentdeck/shared';
19
+ import { debug, logTagged } from '../logger.js';
20
+ const TAG = 'trmnl-render';
21
+ // --- Font supply for resvg (same trap/fix as the D200H renderer) ---
22
+ // resvg drops every <text> element unless given a font to shape glyphs with.
23
+ // Load the bundled OFL faces via `fontFiles` for crisp Latin/mono, AND enable
24
+ // `loadSystemFonts` so resvg can FALL BACK to the OS's CJK faces — session goals
25
+ // are user prompts, often Korean/Chinese, which the Latin-only bundled fonts
26
+ // render as boxes. Unlike the 14-tile-per-frame D200H renderer, TRMNL renders one
27
+ // frame only on real state change, so the per-`new Resvg()` system-font scan is an
28
+ // acceptable cost here.
29
+ const FONT_OPTS = (() => {
30
+ try {
31
+ // bridge/{src,dist}/trmnl/image-renderer.{ts,js} → bridge/assets/fonts
32
+ const here = dirname(fileURLToPath(import.meta.url));
33
+ const fontsDir = join(here, '..', '..', 'assets', 'fonts');
34
+ const files = [
35
+ 'IBMPlexSans-Regular.ttf',
36
+ 'IBMPlexSans-Bold.ttf',
37
+ 'JetBrainsMono-Regular.ttf',
38
+ 'JetBrainsMono-Bold.ttf',
39
+ ]
40
+ .map((n) => join(fontsDir, n))
41
+ .filter((p) => existsSync(p));
42
+ if (files.length > 0) {
43
+ return { fontFiles: files, loadSystemFonts: true, defaultFontFamily: 'IBM Plex Sans' };
44
+ }
45
+ debug(TAG, `bundled fonts not found under ${fontsDir} — falling back to system fonts`);
46
+ }
47
+ catch (err) {
48
+ debug(TAG, `font path resolution failed (${err}) — falling back to system fonts`);
49
+ }
50
+ return { loadSystemFonts: true, defaultFontFamily: 'Helvetica Neue' };
51
+ })();
52
+ let Resvg = null;
53
+ let resvgLoaded = false;
54
+ async function loadResvg() {
55
+ if (resvgLoaded)
56
+ return Resvg;
57
+ resvgLoaded = true;
58
+ try {
59
+ const mod = await import('@resvg/resvg-js');
60
+ Resvg = mod.Resvg ?? mod.default?.Resvg;
61
+ debug(TAG, 'resvg-js loaded — SVG rendering enabled');
62
+ return Resvg;
63
+ }
64
+ catch {
65
+ debug(TAG, 'resvg-js not available — falling back to blank 1-bit PNG');
66
+ return null;
67
+ }
68
+ }
69
+ /** Initialize the renderer (loads resvg-js if available). Call once at start. */
70
+ export async function initTrmnlRenderer() {
71
+ await loadResvg();
72
+ }
73
+ export function isTrmnlResvgLoaded() {
74
+ return Resvg !== null;
75
+ }
76
+ // --- PNG (1-bit grayscale) encoding ---
77
+ const crcTable = new Uint32Array(256);
78
+ for (let n = 0; n < 256; n++) {
79
+ let c = n;
80
+ for (let k = 0; k < 8; k++)
81
+ c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
82
+ crcTable[n] = c >>> 0;
83
+ }
84
+ function crc32(buf) {
85
+ let crc = 0xffffffff;
86
+ for (let i = 0; i < buf.length; i++)
87
+ crc = crcTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8);
88
+ return (crc ^ 0xffffffff) >>> 0;
89
+ }
90
+ function pngChunk(type, data) {
91
+ const typeBytes = Buffer.from(type, 'ascii');
92
+ const len = Buffer.alloc(4);
93
+ len.writeUInt32BE(data.length, 0);
94
+ const crc = Buffer.alloc(4);
95
+ crc.writeUInt32BE(crc32(Buffer.concat([typeBytes, data])), 0);
96
+ return Buffer.concat([len, typeBytes, data, crc]);
97
+ }
98
+ const PNG_SIG = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
99
+ /**
100
+ * Encode a 1-bit grayscale PNG from a packed bitmap.
101
+ * `bits` holds one bit per pixel, MSB-first, `bytesPerRow` bytes per scanline,
102
+ * where 1 = white and 0 = black (PNG grayscale convention).
103
+ */
104
+ function encode1BitPng(bits, width, height, bytesPerRow) {
105
+ const ihdr = Buffer.alloc(13);
106
+ ihdr.writeUInt32BE(width, 0);
107
+ ihdr.writeUInt32BE(height, 4);
108
+ ihdr[8] = 1; // bit depth
109
+ ihdr[9] = 0; // color type: grayscale
110
+ ihdr[10] = 0; // compression
111
+ ihdr[11] = 0; // filter
112
+ ihdr[12] = 0; // interlace
113
+ // Raw image data: each scanline prefixed with filter byte 0 (None).
114
+ const raw = Buffer.alloc((bytesPerRow + 1) * height);
115
+ for (let y = 0; y < height; y++) {
116
+ const dst = y * (bytesPerRow + 1);
117
+ raw[dst] = 0; // filter: None
118
+ for (let x = 0; x < bytesPerRow; x++)
119
+ raw[dst + 1 + x] = bits[y * bytesPerRow + x];
120
+ }
121
+ const idat = deflateSync(raw, { level: 9 });
122
+ return Buffer.concat([
123
+ PNG_SIG,
124
+ pngChunk('IHDR', ihdr),
125
+ pngChunk('IDAT', idat),
126
+ pngChunk('IEND', Buffer.alloc(0)),
127
+ ]);
128
+ }
129
+ /**
130
+ * Box-downsample a supersampled RGBA buffer (`ss`× the target size) to a packed
131
+ * 1-bit bitmap (1 = white, 0 = black). Averaging each ss×ss block of luma BEFORE
132
+ * thresholding is what sharpens text on a 1-bit panel: a hard threshold of a
133
+ * 1×-rendered glyph drops/jaggies thin strokes (notably Hangul), whereas the
134
+ * averaged edge lands on the majority-coverage boundary, so the same glyph reads
135
+ * crisp. `ss === 1` degrades to a plain threshold.
136
+ */
137
+ function rgbaToPacked1Bit(pixels, srcWidth, srcHeight, ss = 1) {
138
+ const width = Math.floor(srcWidth / ss);
139
+ const height = Math.floor(srcHeight / ss);
140
+ const bytesPerRow = (width + 7) >> 3;
141
+ const bits = new Uint8Array(bytesPerRow * height);
142
+ bits.fill(0xff); // default white
143
+ const norm = 1 / (ss * ss);
144
+ for (let y = 0; y < height; y++) {
145
+ for (let x = 0; x < width; x++) {
146
+ let sum = 0;
147
+ for (let dy = 0; dy < ss; dy++) {
148
+ const sy = Math.min(y * ss + dy, srcHeight - 1);
149
+ const rowBase = sy * srcWidth;
150
+ for (let dx = 0; dx < ss; dx++) {
151
+ const sx = Math.min(x * ss + dx, srcWidth - 1);
152
+ const p = (rowBase + sx) * 4;
153
+ // Rec.601 luma; transparent pixels (alpha 0) read as white since our SVG
154
+ // paints a full white background, so alpha is effectively always 255.
155
+ sum += (pixels[p] * 299 + pixels[p + 1] * 587 + pixels[p + 2] * 114) / 1000;
156
+ }
157
+ }
158
+ if (sum * norm < 128) {
159
+ // black pixel → clear the bit
160
+ bits[y * bytesPerRow + (x >> 3)] &= ~(0x80 >> (x & 7));
161
+ }
162
+ }
163
+ }
164
+ return { bits, bytesPerRow, width, height };
165
+ }
166
+ /** A fully-white 1-bit PNG (fallback when resvg is unavailable). */
167
+ function blankPng(width, height) {
168
+ const bytesPerRow = (width + 7) >> 3;
169
+ const bits = new Uint8Array(bytesPerRow * height).fill(0xff);
170
+ return encode1BitPng(bits, width, height, bytesPerRow);
171
+ }
172
+ function hashBuffer(buf) {
173
+ return createHash('sha1').update(buf).digest('hex').slice(0, 16);
174
+ }
175
+ /**
176
+ * Render the AgentDeck dashboard for the given broadcast state into a 1-bit PNG.
177
+ * Accepts a raw state event or a pre-parsed DashState (passed through to the
178
+ * shared layout). `now` may be supplied for deterministic tests.
179
+ */
180
+ export function renderTrmnlFrame(stateEvt, now, size) {
181
+ const width = size?.width && size.width > 0 ? Math.round(size.width) : TRMNL_WIDTH;
182
+ const height = size?.height && size.height > 0 ? Math.round(size.height) : TRMNL_HEIGHT;
183
+ let buffer;
184
+ let degraded = false;
185
+ if (Resvg) {
186
+ try {
187
+ const svg = renderTrmnlDashboard(stateEvt, { ...(now ? { now } : {}), width, height });
188
+ // Supersample so the 1-bit threshold has sub-pixel edge info (crisper text,
189
+ // esp. Hangul). Cap the rasterized width so large panels don't blow up the
190
+ // per-frame render: 800→3×, ~1200→2×, ≥2400→1×.
191
+ const ss = Math.max(1, Math.min(3, Math.floor(2400 / width)));
192
+ const resvg = new Resvg(svg, {
193
+ fitTo: { mode: 'width', value: width * ss },
194
+ font: FONT_OPTS,
195
+ background: '#ffffff',
196
+ });
197
+ const rendered = resvg.render();
198
+ const packed = rgbaToPacked1Bit(rendered.pixels, rendered.width, rendered.height, ss);
199
+ buffer = encode1BitPng(packed.bits, packed.width, packed.height, packed.bytesPerRow);
200
+ }
201
+ catch (err) {
202
+ // Always visible (not debug-gated): a failed render used to silently ship
203
+ // a blank white frame to the panel — the classic "dashboard disappeared"
204
+ // report with zero trace. Rate-limited per error message.
205
+ noteRenderFailure(String(err));
206
+ buffer = blankPng(width, height);
207
+ degraded = true;
208
+ }
209
+ }
210
+ else {
211
+ buffer = blankPng(width, height);
212
+ degraded = true;
213
+ }
214
+ return {
215
+ buffer,
216
+ contentHash: hashBuffer(buffer),
217
+ width,
218
+ height,
219
+ contentType: 'image/png',
220
+ ...(degraded ? { degraded: true } : {}),
221
+ };
222
+ }
223
+ // Rate-limit render-failure logging so a hot broadcast loop can't spam stderr:
224
+ // each distinct error message logs at most once per minute.
225
+ const RENDER_FAIL_LOG_INTERVAL_MS = 60_000;
226
+ const lastRenderFailLogAt = new Map();
227
+ function noteRenderFailure(message) {
228
+ const now = Date.now();
229
+ const last = lastRenderFailLogAt.get(message) ?? 0;
230
+ if (now - last < RENDER_FAIL_LOG_INTERVAL_MS)
231
+ return;
232
+ lastRenderFailLogAt.set(message, now);
233
+ logTagged(TAG, `render failed (frame cache keeps the last good frame): ${message}`);
234
+ }
235
+ //# sourceMappingURL=image-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-renderer.js","sourceRoot":"","sources":["../../src/trmnl/image-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ export declare const TRMNL_DEFAULT_REFRESH = 180;
2
+ /**
3
+ * Cadence used only while an agent is AWAITING the user. NOT used for "working":
4
+ * a battery e-ink panel deep-sleeps between polls and full-flashes the screen on
5
+ * every refresh, so we only tighten the loop when the user actually needs to act.
6
+ */
7
+ export declare const TRMNL_DEFAULT_REFRESH_ACTIVE = 60;
8
+ /** Floor on any cadence — too-frequent polls drain the panel battery + flash it. */
9
+ export declare const TRMNL_MIN_REFRESH = 30;
10
+ /**
11
+ * Seconds the firmware waits for the image download before giving up (its
12
+ * `image_url_timeout`). Generous so a slow/flaky WiFi link doesn't trip the
13
+ * device's "not responding" (WIFI_FAILED) screen. Firmware caps at ~65s, so we
14
+ * keep a healthy default (most "not responding" cycles are a lossy image GET
15
+ * timing out, not a server error — see docs/devices.md TRMNL section).
16
+ */
17
+ export declare const TRMNL_DEFAULT_IMAGE_TIMEOUT = 50;
18
+ /** Hard cap the firmware honors (it clamps `image_url_timeout` ~65s internally). */
19
+ export declare const TRMNL_MAX_IMAGE_TIMEOUT = 65;
20
+ /**
21
+ * RSSI (dBm) at or below which the panel's WiFi link is treated as weak/lossy.
22
+ * A weak link is the dominant real-world cause of "not responding" (WIFI_FAILED):
23
+ * the image download drops packets and times out. RSSI is sent by the firmware on
24
+ * every poll, so we can react per-poll. (-78 ≈ marginal; below it, retransmits
25
+ * stack up and the default window can be too tight.)
26
+ */
27
+ export declare const TRMNL_WEAK_RSSI_DBM = -78;
28
+ /** Image-download window served on a weak link — near the firmware cap. */
29
+ export declare const TRMNL_WEAK_LINK_IMAGE_TIMEOUT = 60;
30
+ export interface TrmnlDevice {
31
+ /** Normalized (uppercase, colon-separated) MAC address — the device identity. */
32
+ mac: string;
33
+ /** Secret issued at /api/setup, presented back as the Access-Token header. */
34
+ apiKey: string;
35
+ /** Short human-friendly id shown on the device + in logs. */
36
+ friendlyId: string;
37
+ /** Optional user label. */
38
+ name?: string;
39
+ }
40
+ export interface TrmnlConfig {
41
+ enabled: boolean;
42
+ /** Idle/working cadence (seconds) — the slow, battery-friendly default. */
43
+ refreshRate: number;
44
+ /** Cadence (seconds) while a session is AWAITING the user. */
45
+ refreshActive: number;
46
+ /** Image-download timeout (seconds) handed to the firmware as image_url_timeout. */
47
+ imageUrlTimeout: number;
48
+ autoRegister: boolean;
49
+ devices: TrmnlDevice[];
50
+ }
51
+ /**
52
+ * Cadence for a poll. We only speed up for AWAITING (the user needs to act);
53
+ * "working" stays on the slow cadence because a deep-sleep e-ink panel can't be
54
+ * pushed and each wake full-flashes the screen + costs battery.
55
+ */
56
+ export declare function effectiveRefreshRate(cfg: TrmnlConfig, activity: {
57
+ awaiting: number;
58
+ working: number;
59
+ }): number;
60
+ /**
61
+ * Image-download timeout (seconds) for a single poll. Widens toward the firmware
62
+ * cap when the panel reports a weak WiFi signal, so a lossy image GET still has
63
+ * the maximum window to finish before the firmware shows "not responding"
64
+ * (WIFI_FAILED) — the #1 source of TRMNL flicker on a marginal link. A strong link
65
+ * keeps the lower default so a genuinely dead link doesn't hold the radio on
66
+ * (battery). RSSI absent (older firmware) ⇒ default; the default itself is already
67
+ * generous. Clamped to [5, firmware cap].
68
+ */
69
+ export declare function effectiveImageTimeout(cfg: TrmnlConfig, opts?: {
70
+ rssi?: number | null;
71
+ }): number;
72
+ /** Load the trmnl config with defaults filled in. */
73
+ export declare function loadTrmnlConfig(): TrmnlConfig;
74
+ /**
75
+ * Normalize a MAC to a stable identity key. A canonical 12-hex address becomes
76
+ * uppercase colon-separated pairs; any other id (some firmware/cloud setups
77
+ * report non-standard or punctuated identifiers) collapses to its bare uppercase
78
+ * hex digits. Returning the raw, untrimmed string for the odd case would orphan
79
+ * or duplicate a device whose punctuation varies between polls — so we always
80
+ * derive a deterministic key from the hex content.
81
+ */
82
+ export declare function normalizeMac(mac: string): string;
83
+ /** True when two MAC spellings resolve to the same canonical identity. */
84
+ export declare function sameMac(a: string, b: string): boolean;
85
+ export declare function findDeviceByMac(mac: string): TrmnlDevice | undefined;
86
+ /**
87
+ * Find or create a device record for the given MAC. Returns the device and
88
+ * whether it was newly created. Respects `autoRegister`: when off, a new MAC
89
+ * is NOT persisted and `created` is false with `device` undefined.
90
+ */
91
+ export declare function ensureDevice(mac: string, name?: string): {
92
+ device?: TrmnlDevice;
93
+ created: boolean;
94
+ };
95
+ export declare function removeDevice(mac: string): boolean;
96
+ //# sourceMappingURL=trmnl-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trmnl-settings.d.ts","sourceRoot":"","sources":["../../src/trmnl/trmnl-settings.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAC/C,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,oFAAoF;AACpF,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,2EAA2E;AAC3E,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAC;IACZ,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,oFAAoF;IACpF,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC9C,MAAM,CAER;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAAG,MAAM,CAMnG;AAeD,qDAAqD;AACrD,wBAAgB,eAAe,IAAI,WAAW,CAoB7C;AAQD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,0EAA0E;AAC1E,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEpE;AAWD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG;IAAE,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAgBnG;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOjD"}