@agentdeck/bridge 1.0.1 → 1.0.3
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.
- package/assets/fm-helper/agentdeck-fm-helper +0 -0
- package/dist/apme/collector.d.ts.map +1 -1
- package/dist/apme/collector.js +5 -2
- package/dist/apme/collector.js.map +1 -1
- package/dist/apme/runner.d.ts +11 -0
- package/dist/apme/runner.d.ts.map +1 -1
- package/dist/apme/runner.js +60 -4
- package/dist/apme/runner.js.map +1 -1
- package/dist/apme/settings.d.ts +10 -0
- package/dist/apme/settings.d.ts.map +1 -1
- package/dist/apme/settings.js +14 -0
- package/dist/apme/settings.js.map +1 -1
- package/dist/awaiting-overlay.d.ts +44 -10
- package/dist/awaiting-overlay.d.ts.map +1 -1
- package/dist/awaiting-overlay.js +96 -28
- package/dist/awaiting-overlay.js.map +1 -1
- package/dist/bridge-core.d.ts +10 -0
- package/dist/bridge-core.d.ts.map +1 -1
- package/dist/bridge-core.js +47 -12
- package/dist/bridge-core.js.map +1 -1
- package/dist/card-feed.d.ts +107 -0
- package/dist/card-feed.d.ts.map +1 -0
- package/dist/card-feed.js +277 -0
- package/dist/card-feed.js.map +1 -0
- package/dist/card-modules.d.ts +87 -0
- package/dist/card-modules.d.ts.map +1 -0
- package/dist/card-modules.js +179 -0
- package/dist/card-modules.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +93 -0
- package/dist/cli.js.map +1 -1
- package/dist/daemon-server.d.ts.map +1 -1
- package/dist/daemon-server.js +1025 -50
- package/dist/daemon-server.js.map +1 -1
- package/dist/daemon-ws-client.d.ts +2 -1
- package/dist/daemon-ws-client.d.ts.map +1 -1
- package/dist/daemon-ws-client.js +2 -1
- package/dist/daemon-ws-client.js.map +1 -1
- package/dist/daemon.js +1 -1
- package/dist/device-photo.d.ts +86 -0
- package/dist/device-photo.d.ts.map +1 -0
- package/dist/device-photo.js +200 -0
- package/dist/device-photo.js.map +1 -0
- package/dist/device-voice-reply.d.ts +124 -0
- package/dist/device-voice-reply.d.ts.map +1 -0
- package/dist/device-voice-reply.js +236 -0
- package/dist/device-voice-reply.js.map +1 -0
- package/dist/device-voice.d.ts +56 -0
- package/dist/device-voice.d.ts.map +1 -0
- package/dist/device-voice.js +134 -0
- package/dist/device-voice.js.map +1 -0
- package/dist/esp32-serial.d.ts +40 -0
- package/dist/esp32-serial.d.ts.map +1 -1
- package/dist/esp32-serial.js +109 -13
- package/dist/esp32-serial.js.map +1 -1
- package/dist/foundation-models-helper.d.ts +30 -0
- package/dist/foundation-models-helper.d.ts.map +1 -1
- package/dist/foundation-models-helper.js +45 -0
- package/dist/foundation-models-helper.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/mdns.d.ts +11 -0
- package/dist/mdns.d.ts.map +1 -1
- package/dist/mdns.js +13 -0
- package/dist/mdns.js.map +1 -1
- package/dist/observed-inject.d.ts +119 -0
- package/dist/observed-inject.d.ts.map +1 -0
- package/dist/observed-inject.js +405 -0
- package/dist/observed-inject.js.map +1 -0
- package/dist/passive-observer.d.ts +14 -0
- package/dist/passive-observer.d.ts.map +1 -1
- package/dist/passive-observer.js +35 -5
- package/dist/passive-observer.js.map +1 -1
- package/dist/peripheral-mapping.d.ts +65 -0
- package/dist/peripheral-mapping.d.ts.map +1 -0
- package/dist/peripheral-mapping.js +115 -0
- package/dist/peripheral-mapping.js.map +1 -0
- package/dist/session-aggregator.d.ts +4 -1
- package/dist/session-aggregator.d.ts.map +1 -1
- package/dist/session-aggregator.js +5 -5
- package/dist/session-aggregator.js.map +1 -1
- package/dist/session-id-resolve.d.ts +17 -0
- package/dist/session-id-resolve.d.ts.map +1 -0
- package/dist/session-id-resolve.js +35 -0
- package/dist/session-id-resolve.js.map +1 -0
- package/dist/session-registry.d.ts +12 -0
- package/dist/session-registry.d.ts.map +1 -1
- package/dist/session-registry.js +31 -0
- package/dist/session-registry.js.map +1 -1
- package/dist/session-transcript-timeline.d.ts +7 -0
- package/dist/session-transcript-timeline.d.ts.map +1 -1
- package/dist/session-transcript-timeline.js +16 -6
- package/dist/session-transcript-timeline.js.map +1 -1
- package/dist/timeline-store.js +2 -2
- package/dist/timeline-store.js.map +1 -1
- package/dist/usage-event.d.ts.map +1 -1
- package/dist/usage-event.js +14 -7
- package/dist/usage-event.js.map +1 -1
- package/dist/voice.d.ts +13 -10
- package/dist/voice.d.ts.map +1 -1
- package/dist/voice.js +26 -272
- package/dist/voice.js.map +1 -1
- package/dist/ws-server.d.ts +14 -0
- package/dist/ws-server.d.ts.map +1 -1
- package/dist/ws-server.js +66 -1
- package/dist/ws-server.js.map +1 -1
- package/fm-helper/AgentDeckFMHelper.swift +303 -0
- package/package.json +3 -3
- package/dist/d200h/hid-protocol.d.ts +0 -62
- package/dist/d200h/hid-protocol.d.ts.map +0 -1
- package/dist/d200h/hid-protocol.js +0 -124
- package/dist/d200h/hid-protocol.js.map +0 -1
- package/dist/d200h/image-renderer.d.ts +0 -24
- package/dist/d200h/image-renderer.d.ts.map +0 -1
- package/dist/d200h/image-renderer.js +0 -321
- package/dist/d200h/image-renderer.js.map +0 -1
- package/dist/hook-migration.d.ts +0 -2
- package/dist/hook-migration.d.ts.map +0 -1
- package/dist/hook-migration.js +0 -104
- package/dist/hook-migration.js.map +0 -1
- package/dist/modules/d200h-module.d.ts +0 -65
- package/dist/modules/d200h-module.d.ts.map +0 -1
- package/dist/modules/d200h-module.js +0 -495
- package/dist/modules/d200h-module.js.map +0 -1
- package/dist/modules/d200h-renderer.d.ts +0 -7
- package/dist/modules/d200h-renderer.d.ts.map +0 -1
- package/dist/modules/d200h-renderer.js +0 -321
- package/dist/modules/d200h-renderer.js.map +0 -1
- package/dist/modules/trmnl-module.d.ts +0 -38
- package/dist/modules/trmnl-module.d.ts.map +0 -1
- package/dist/modules/trmnl-module.js +0 -111
- package/dist/modules/trmnl-module.js.map +0 -1
- package/dist/trmnl/byos-server.d.ts +0 -39
- package/dist/trmnl/byos-server.d.ts.map +0 -1
- package/dist/trmnl/byos-server.js +0 -301
- package/dist/trmnl/byos-server.js.map +0 -1
- package/dist/trmnl/frame-cache.d.ts +0 -37
- package/dist/trmnl/frame-cache.d.ts.map +0 -1
- package/dist/trmnl/frame-cache.js +0 -157
- package/dist/trmnl/frame-cache.js.map +0 -1
- package/dist/trmnl/image-renderer.d.ts +0 -27
- package/dist/trmnl/image-renderer.d.ts.map +0 -1
- package/dist/trmnl/image-renderer.js +0 -235
- package/dist/trmnl/image-renderer.js.map +0 -1
- package/dist/trmnl/trmnl-settings.d.ts +0 -96
- package/dist/trmnl/trmnl-settings.d.ts.map +0 -1
- package/dist/trmnl/trmnl-settings.js +0 -177
- package/dist/trmnl/trmnl-settings.js.map +0 -1
- package/dist/trmnl/trmnl-telemetry.d.ts +0 -47
- package/dist/trmnl/trmnl-telemetry.d.ts.map +0 -1
- package/dist/trmnl/trmnl-telemetry.js +0 -56
- package/dist/trmnl/trmnl-telemetry.js.map +0 -1
- package/dist/whisper-server-manager.d.ts +0 -19
- package/dist/whisper-server-manager.d.ts.map +0 -1
- package/dist/whisper-server-manager.js +0 -171
- package/dist/whisper-server-manager.js.map +0 -1
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* D200H Image Renderer — Renders AgentDeck state as 196×196 PNG key icons
|
|
3
|
-
* using the shared SVG renderers (same visual output as Stream Deck plugin).
|
|
4
|
-
*
|
|
5
|
-
* Pipeline: state → shared SVG generators (144×144) → resvg rasterize (196×196 PNG) → ZIP
|
|
6
|
-
*
|
|
7
|
-
* Falls back to solid-color PNGs if resvg-js is not available.
|
|
8
|
-
*/
|
|
9
|
-
import { deflateSync } from 'zlib';
|
|
10
|
-
import { fileURLToPath } from 'node:url';
|
|
11
|
-
import { dirname, join } from 'node:path';
|
|
12
|
-
import { existsSync } from 'node:fs';
|
|
13
|
-
// Layout/command engine is shared with the Ulanzi Studio plugin (single source
|
|
14
|
-
// of truth for the reflowing 5×3 grid). Rasterization + ZIP packing stay here.
|
|
15
|
-
import { computeLayout, parseState, buildButtonCommandMap, renderUsageWideSlot, } from '@agentdeck/shared';
|
|
16
|
-
import { debug } from '../logger.js';
|
|
17
|
-
// Re-export the engine bits the D200H module + tests import from here.
|
|
18
|
-
export { parseState, buildButtonCommandMap };
|
|
19
|
-
import { validateZipBoundaries } from './hid-protocol.js';
|
|
20
|
-
const TAG = 'd200h-render';
|
|
21
|
-
const ICON_SIZE = 196;
|
|
22
|
-
// --- Font supply for resvg ---
|
|
23
|
-
// resvg drops every <text> element unless it has a font to shape glyphs with.
|
|
24
|
-
// We load a small set of bundled OFL fonts explicitly via `fontFiles` (NOT
|
|
25
|
-
// `loadSystemFonts`, which re-scans the whole OS font tree on every `new Resvg()`
|
|
26
|
-
// — i.e. 14× per frame — and is the reason the original code set it to `false`).
|
|
27
|
-
// `defaultFontFamily` makes unresolved families in the shared SVG renderers
|
|
28
|
-
// (e.g. `Inter`, `Arial`, `monospace`) fall back to a design-system face
|
|
29
|
-
// instead of rendering nothing. Computed once at module load.
|
|
30
|
-
const FONT_OPTS = (() => {
|
|
31
|
-
try {
|
|
32
|
-
// bridge/{src,dist}/d200h/image-renderer.{ts,js} → bridge/assets/fonts
|
|
33
|
-
const here = dirname(fileURLToPath(import.meta.url));
|
|
34
|
-
const fontsDir = join(here, '..', '..', 'assets', 'fonts');
|
|
35
|
-
const files = [
|
|
36
|
-
'IBMPlexSans-Regular.ttf',
|
|
37
|
-
'IBMPlexSans-Bold.ttf',
|
|
38
|
-
'JetBrainsMono-Regular.ttf',
|
|
39
|
-
'JetBrainsMono-Bold.ttf',
|
|
40
|
-
]
|
|
41
|
-
.map((n) => join(fontsDir, n))
|
|
42
|
-
.filter((p) => existsSync(p));
|
|
43
|
-
if (files.length > 0) {
|
|
44
|
-
return { fontFiles: files, loadSystemFonts: false, defaultFontFamily: 'IBM Plex Sans' };
|
|
45
|
-
}
|
|
46
|
-
debug(TAG, `bundled fonts not found under ${fontsDir} — falling back to system fonts`);
|
|
47
|
-
}
|
|
48
|
-
catch (err) {
|
|
49
|
-
debug(TAG, `font path resolution failed (${err}) — falling back to system fonts`);
|
|
50
|
-
}
|
|
51
|
-
// Defense-in-depth: if bundled fonts are missing, still render text via the OS.
|
|
52
|
-
return { loadSystemFonts: true, defaultFontFamily: 'Helvetica Neue' };
|
|
53
|
-
})();
|
|
54
|
-
let Resvg = null;
|
|
55
|
-
let resvgLoaded = false;
|
|
56
|
-
async function loadResvg() {
|
|
57
|
-
if (resvgLoaded)
|
|
58
|
-
return Resvg;
|
|
59
|
-
resvgLoaded = true;
|
|
60
|
-
try {
|
|
61
|
-
const mod = await import('@resvg/resvg-js');
|
|
62
|
-
Resvg = mod.Resvg ?? mod.default?.Resvg;
|
|
63
|
-
debug(TAG, 'resvg-js loaded — SVG rendering enabled');
|
|
64
|
-
return Resvg;
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
debug(TAG, 'resvg-js not available — falling back to solid-color PNGs');
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
/** Initialize the renderer (call once at module start). */
|
|
72
|
-
export async function initRenderer() {
|
|
73
|
-
await loadResvg();
|
|
74
|
-
}
|
|
75
|
-
export function isResvgLoaded() {
|
|
76
|
-
return Resvg !== null;
|
|
77
|
-
}
|
|
78
|
-
// --- SVG → 196×196 PNG rasterization ---
|
|
79
|
-
function svgToPng(svg144) {
|
|
80
|
-
if (!Resvg)
|
|
81
|
-
return fallbackSolidPng(20, 20, 25); // dark fallback
|
|
82
|
-
// Wrap 144×144 SVG content into 196×196 viewport with auto-scaling
|
|
83
|
-
const inner = svg144.replace(/<\/?svg[^>]*>/g, '');
|
|
84
|
-
const wrapped = `<svg xmlns="http://www.w3.org/2000/svg" width="${ICON_SIZE}" height="${ICON_SIZE}" viewBox="0 0 144 144">${inner}</svg>`;
|
|
85
|
-
try {
|
|
86
|
-
const resvg = new Resvg(wrapped, {
|
|
87
|
-
fitTo: { mode: 'width', value: ICON_SIZE },
|
|
88
|
-
font: FONT_OPTS,
|
|
89
|
-
});
|
|
90
|
-
return Buffer.from(resvg.render().asPng());
|
|
91
|
-
}
|
|
92
|
-
catch (err) {
|
|
93
|
-
debug(TAG, `SVG rasterization failed: ${err}`);
|
|
94
|
-
return fallbackSolidPng(20, 20, 25);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/** Rasterize custom-sized SVG (e.g. 288×144 → 392×196 for merged slot). */
|
|
98
|
-
function svgToPngWide(svg, width, height) {
|
|
99
|
-
if (!Resvg)
|
|
100
|
-
return fallbackSolidPng(20, 20, 25);
|
|
101
|
-
try {
|
|
102
|
-
const resvg = new Resvg(svg, {
|
|
103
|
-
fitTo: { mode: 'width', value: width },
|
|
104
|
-
font: FONT_OPTS,
|
|
105
|
-
});
|
|
106
|
-
return Buffer.from(resvg.render().asPng());
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
debug(TAG, `Wide SVG rasterization failed: ${err}`);
|
|
110
|
-
return fallbackSolidPng(20, 20, 25);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
// --- ZIP creation (reused from original, with boundary validation) ---
|
|
114
|
-
function crc32(buf) {
|
|
115
|
-
let crc = 0xffffffff;
|
|
116
|
-
for (let i = 0; i < buf.length; i++) {
|
|
117
|
-
crc = crcTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8);
|
|
118
|
-
}
|
|
119
|
-
return (crc ^ 0xffffffff) >>> 0;
|
|
120
|
-
}
|
|
121
|
-
const crcTable = new Uint32Array(256);
|
|
122
|
-
for (let n = 0; n < 256; n++) {
|
|
123
|
-
let c = n;
|
|
124
|
-
for (let k = 0; k < 8; k++) {
|
|
125
|
-
c = (c & 1) ? (0xedb88320 ^ (c >>> 1)) : (c >>> 1);
|
|
126
|
-
}
|
|
127
|
-
crcTable[n] = c;
|
|
128
|
-
}
|
|
129
|
-
function normalizeExtraLength(length) {
|
|
130
|
-
if (length <= 0)
|
|
131
|
-
return 0;
|
|
132
|
-
return Math.max(4, length);
|
|
133
|
-
}
|
|
134
|
-
function makeZipExtraField(length) {
|
|
135
|
-
const normalized = normalizeExtraLength(length);
|
|
136
|
-
if (normalized === 0)
|
|
137
|
-
return Buffer.alloc(0);
|
|
138
|
-
const extra = Buffer.alloc(normalized, 0x41);
|
|
139
|
-
extra.writeUInt16LE(0x4141, 0);
|
|
140
|
-
extra.writeUInt16LE(Math.max(0, normalized - 4), 2);
|
|
141
|
-
return extra;
|
|
142
|
-
}
|
|
143
|
-
function firstInvalidZipBoundaryOffset(zipData) {
|
|
144
|
-
for (let i = 1016; i < zipData.length; i += 1024) {
|
|
145
|
-
if (zipData[i] === 0x00 || zipData[i] === 0x7c)
|
|
146
|
-
return i;
|
|
147
|
-
}
|
|
148
|
-
return null;
|
|
149
|
-
}
|
|
150
|
-
function createZipInMemory(files, extraLengths = []) {
|
|
151
|
-
const centralDir = [];
|
|
152
|
-
const localParts = [];
|
|
153
|
-
const layouts = [];
|
|
154
|
-
let offset = 0;
|
|
155
|
-
let index = 0;
|
|
156
|
-
for (const [name, data] of files) {
|
|
157
|
-
const nameBytes = Buffer.from(name, 'utf-8');
|
|
158
|
-
const crc = crc32(data);
|
|
159
|
-
const extraLen = normalizeExtraLength(extraLengths[index] ?? 0);
|
|
160
|
-
const extra = makeZipExtraField(extraLen);
|
|
161
|
-
const localExtraOffset = offset + 30 + nameBytes.length;
|
|
162
|
-
const local = Buffer.alloc(30 + nameBytes.length + extra.length);
|
|
163
|
-
local.writeUInt32LE(0x04034b50, 0);
|
|
164
|
-
local.writeUInt16LE(20, 4);
|
|
165
|
-
local.writeUInt16LE(0, 6);
|
|
166
|
-
local.writeUInt16LE(0, 8);
|
|
167
|
-
local.writeUInt16LE(0, 10);
|
|
168
|
-
local.writeUInt16LE(0, 12);
|
|
169
|
-
local.writeUInt32LE(crc, 14);
|
|
170
|
-
local.writeUInt32LE(data.length, 18);
|
|
171
|
-
local.writeUInt32LE(data.length, 22);
|
|
172
|
-
local.writeUInt16LE(nameBytes.length, 26);
|
|
173
|
-
local.writeUInt16LE(extra.length, 28);
|
|
174
|
-
nameBytes.copy(local, 30);
|
|
175
|
-
extra.copy(local, 30 + nameBytes.length);
|
|
176
|
-
const central = Buffer.alloc(46 + nameBytes.length + extra.length);
|
|
177
|
-
central.writeUInt32LE(0x02014b50, 0);
|
|
178
|
-
central.writeUInt16LE(20, 4);
|
|
179
|
-
central.writeUInt16LE(20, 6);
|
|
180
|
-
central.writeUInt16LE(0, 8);
|
|
181
|
-
central.writeUInt16LE(0, 10);
|
|
182
|
-
central.writeUInt16LE(0, 12);
|
|
183
|
-
central.writeUInt16LE(0, 14);
|
|
184
|
-
central.writeUInt32LE(crc, 16);
|
|
185
|
-
central.writeUInt32LE(data.length, 20);
|
|
186
|
-
central.writeUInt32LE(data.length, 24);
|
|
187
|
-
central.writeUInt16LE(nameBytes.length, 28);
|
|
188
|
-
central.writeUInt16LE(extra.length, 30);
|
|
189
|
-
central.writeUInt16LE(0, 32);
|
|
190
|
-
central.writeUInt16LE(0, 34);
|
|
191
|
-
central.writeUInt16LE(0, 36);
|
|
192
|
-
central.writeUInt32LE(0, 38);
|
|
193
|
-
central.writeUInt32LE(offset, 42);
|
|
194
|
-
nameBytes.copy(central, 46);
|
|
195
|
-
extra.copy(central, 46 + nameBytes.length);
|
|
196
|
-
localParts.push(local, data);
|
|
197
|
-
centralDir.push(central);
|
|
198
|
-
layouts.push({ extraInsertOffset: localExtraOffset });
|
|
199
|
-
offset += local.length + data.length;
|
|
200
|
-
index += 1;
|
|
201
|
-
}
|
|
202
|
-
const centralDirData = Buffer.concat(centralDir);
|
|
203
|
-
const eocd = Buffer.alloc(22);
|
|
204
|
-
eocd.writeUInt32LE(0x06054b50, 0);
|
|
205
|
-
eocd.writeUInt16LE(0, 4);
|
|
206
|
-
eocd.writeUInt16LE(0, 6);
|
|
207
|
-
eocd.writeUInt16LE(files.size, 8);
|
|
208
|
-
eocd.writeUInt16LE(files.size, 10);
|
|
209
|
-
eocd.writeUInt32LE(centralDirData.length, 12);
|
|
210
|
-
eocd.writeUInt32LE(offset, 16);
|
|
211
|
-
eocd.writeUInt16LE(0, 20);
|
|
212
|
-
return { zip: Buffer.concat([...localParts, centralDirData, eocd]), layouts };
|
|
213
|
-
}
|
|
214
|
-
// --- Fallback solid-color PNG (when resvg-js unavailable) ---
|
|
215
|
-
function fallbackSolidPng(r, g, b) {
|
|
216
|
-
const w = ICON_SIZE, h = ICON_SIZE;
|
|
217
|
-
const ihdr = Buffer.alloc(13);
|
|
218
|
-
ihdr.writeUInt32BE(w, 0);
|
|
219
|
-
ihdr.writeUInt32BE(h, 4);
|
|
220
|
-
ihdr[8] = 8;
|
|
221
|
-
ihdr[9] = 2; // 8-bit RGB
|
|
222
|
-
const rowLen = 1 + w * 3;
|
|
223
|
-
const raw = Buffer.alloc(rowLen * h);
|
|
224
|
-
for (let y = 0; y < h; y++) {
|
|
225
|
-
const off = y * rowLen;
|
|
226
|
-
raw[off] = 0;
|
|
227
|
-
for (let x = 0; x < w; x++) {
|
|
228
|
-
const px = off + 1 + x * 3;
|
|
229
|
-
raw[px] = r;
|
|
230
|
-
raw[px + 1] = g;
|
|
231
|
-
raw[px + 2] = b;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
const compressed = deflateSync(raw);
|
|
235
|
-
const sig = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
|
|
236
|
-
function pngChunk(type, data) {
|
|
237
|
-
const typeBytes = Buffer.from(type, 'ascii');
|
|
238
|
-
const len = Buffer.alloc(4);
|
|
239
|
-
len.writeUInt32BE(data.length, 0);
|
|
240
|
-
const crcData = Buffer.concat([typeBytes, data]);
|
|
241
|
-
const crc = Buffer.alloc(4);
|
|
242
|
-
crc.writeUInt32BE(crc32(crcData), 0);
|
|
243
|
-
return Buffer.concat([len, typeBytes, data, crc]);
|
|
244
|
-
}
|
|
245
|
-
return Buffer.concat([sig, pngChunk('IHDR', ihdr), pngChunk('IDAT', compressed), pngChunk('IEND', Buffer.alloc(0))]);
|
|
246
|
-
}
|
|
247
|
-
// --- Public API ---
|
|
248
|
-
/**
|
|
249
|
-
* Render the full AgentDeck dashboard as a ZIP ready for SET_BUTTONS.
|
|
250
|
-
* Uses shared SVG renderers → resvg rasterization for SD+-quality output.
|
|
251
|
-
*/
|
|
252
|
-
export function renderDashboardZip(stateEvt) {
|
|
253
|
-
const state = parseState(stateEvt);
|
|
254
|
-
const layout = computeLayout(state);
|
|
255
|
-
const manifest = {};
|
|
256
|
-
const files = new Map();
|
|
257
|
-
for (let i = 0; i < layout.length; i++) {
|
|
258
|
-
const slot = layout[i];
|
|
259
|
-
const iconPath = `icons/btn${i}.png`;
|
|
260
|
-
const colRow = `${slot.col}_${slot.row}`;
|
|
261
|
-
const png = svgToPng(slot.svg);
|
|
262
|
-
files.set(iconPath, png);
|
|
263
|
-
manifest[colRow] = {
|
|
264
|
-
State: 0,
|
|
265
|
-
ViewParam: [{ Text: slot.label, Icon: iconPath }],
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
// Merged hardware slot (3_2) — 392×196 PNG with StreamDeck-style usage display
|
|
269
|
-
// No Action = device firmware clock overlay suppressed (solves clock overlap)
|
|
270
|
-
const wideUsageSvg = renderUsageWideSlot(state.fiveHourPercent, state.sevenDayPercent, state.usageKnown !== false);
|
|
271
|
-
const wideUsagePng = svgToPngWide(wideUsageSvg, 392, 196);
|
|
272
|
-
files.set('icons/usage-wide.png', wideUsagePng);
|
|
273
|
-
manifest['3_2'] = {
|
|
274
|
-
State: 0,
|
|
275
|
-
ViewParam: [{ Icon: 'icons/usage-wide.png', Text: '' }],
|
|
276
|
-
};
|
|
277
|
-
files.set('manifest.json', Buffer.from(JSON.stringify(manifest), 'utf-8'));
|
|
278
|
-
// Build ZIP with boundary validation
|
|
279
|
-
const orderedEntries = [...files.entries()];
|
|
280
|
-
const extraLengths = new Array(orderedEntries.length).fill(0);
|
|
281
|
-
for (let attempt = 0; attempt < 256; attempt++) {
|
|
282
|
-
const artifact = createZipInMemory(new Map(orderedEntries), extraLengths);
|
|
283
|
-
const invalidOffset = firstInvalidZipBoundaryOffset(artifact.zip);
|
|
284
|
-
if (invalidOffset == null)
|
|
285
|
-
return artifact.zip;
|
|
286
|
-
let targetIndex = -1;
|
|
287
|
-
for (let i = artifact.layouts.length - 1; i >= 0; i--) {
|
|
288
|
-
if (artifact.layouts[i].extraInsertOffset <= invalidOffset) {
|
|
289
|
-
targetIndex = i;
|
|
290
|
-
break;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
if (targetIndex < 0)
|
|
294
|
-
return artifact.zip;
|
|
295
|
-
const currentExtra = extraLengths[targetIndex];
|
|
296
|
-
const extraInsertOffset = artifact.layouts[targetIndex].extraInsertOffset;
|
|
297
|
-
let shift = 1;
|
|
298
|
-
while (shift <= 512) {
|
|
299
|
-
if (invalidOffset < extraInsertOffset + currentExtra + shift)
|
|
300
|
-
break;
|
|
301
|
-
const candidate = artifact.zip[invalidOffset - shift];
|
|
302
|
-
if (candidate !== 0x00 && candidate !== 0x7c)
|
|
303
|
-
break;
|
|
304
|
-
shift += 1;
|
|
305
|
-
}
|
|
306
|
-
extraLengths[targetIndex] = normalizeExtraLength(extraLengths[targetIndex] + shift);
|
|
307
|
-
debug(TAG, `ZIP boundary invalid at ${invalidOffset}, shifting entry ${targetIndex} by ${shift} byte(s)`);
|
|
308
|
-
}
|
|
309
|
-
const fallback = createZipInMemory(new Map(orderedEntries), extraLengths).zip;
|
|
310
|
-
debug(TAG, `WARNING: ZIP boundary validation failed after search; stillValid=${validateZipBoundaries(fallback)}`);
|
|
311
|
-
return fallback;
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Create a simple hash of the visual state for change detection.
|
|
315
|
-
*/
|
|
316
|
-
export function stateHash(stateEvt) {
|
|
317
|
-
const s = parseState(stateEvt);
|
|
318
|
-
const sessIds = s.allSessions.map(sess => sess.id).join(',');
|
|
319
|
-
return `${s.state}|${s.mode}|${s.projectName}|${s.modelName}|${s.fiveHourPercent}|${s.sevenDayPercent}|${s.totalTokens}|${s.totalCost}|${s.options.map(o => o.label).join(',')}|${s.currentTool}|${sessIds}`;
|
|
320
|
-
}
|
|
321
|
-
//# sourceMappingURL=image-renderer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"image-renderer.js","sourceRoot":"","sources":["../../src/d200h/image-renderer.ts"],"names":[],"mappings":"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"}
|
package/dist/hook-migration.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hook-migration.d.ts","sourceRoot":"","sources":["../src/hook-migration.ts"],"names":[],"mappings":"AA8FA,wBAAgB,oBAAoB,IAAI,IAAI,CAsB3C"}
|
package/dist/hook-migration.js
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { homedir } from 'os';
|
|
4
|
-
const HOOK_EVENTS = [
|
|
5
|
-
'SessionStart',
|
|
6
|
-
'SessionEnd',
|
|
7
|
-
'PreToolUse',
|
|
8
|
-
'PostToolUse',
|
|
9
|
-
'Stop',
|
|
10
|
-
'Notification',
|
|
11
|
-
'UserPromptSubmit',
|
|
12
|
-
];
|
|
13
|
-
function buildHookCommand(eventName) {
|
|
14
|
-
return [
|
|
15
|
-
`PORT="\${AGENTDECK_PORT:-}"`,
|
|
16
|
-
`if [ -z "$PORT" ]; then`,
|
|
17
|
-
` for F in "$HOME/.agentdeck/daemon.json" "$HOME/Library/Containers/bound.serendipity.agent.deck/Data/Library/Application Support/AgentDeck/daemon.json" "$HOME/Library/Group Containers/group.bound.serendipity.agent.deck/daemon.json"; do`,
|
|
18
|
-
` [ -f "$F" ] || continue`,
|
|
19
|
-
` P=$(python3 -c "import json;d=json.load(open('$F'));print(d.get('httpPort') or d.get('port',''))" 2>/dev/null)`,
|
|
20
|
-
` [ -n "$P" ] && curl -sf --max-time 0.3 "http://127.0.0.1:$P/health" >/dev/null 2>&1 && { PORT="$P"; break; }`,
|
|
21
|
-
` done`,
|
|
22
|
-
`fi`,
|
|
23
|
-
`PORT="\${PORT:-9120}"`,
|
|
24
|
-
`curl -sf -X POST "http://127.0.0.1:$PORT/hooks/${eventName}" -H 'Content-Type: application/json' -d @- 2>/dev/null || true`,
|
|
25
|
-
].join('\n');
|
|
26
|
-
}
|
|
27
|
-
function buildHookEntry(eventName) {
|
|
28
|
-
const needsToolMatcher = ['PreToolUse', 'PostToolUse'].includes(eventName);
|
|
29
|
-
return {
|
|
30
|
-
matcher: needsToolMatcher ? '*' : '',
|
|
31
|
-
hooks: [{ type: 'command', command: buildHookCommand(eventName) }],
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
function applyHooks(settings) {
|
|
35
|
-
if (!settings.hooks)
|
|
36
|
-
settings.hooks = {};
|
|
37
|
-
for (const event of HOOK_EVENTS) {
|
|
38
|
-
if (!settings.hooks[event])
|
|
39
|
-
settings.hooks[event] = [];
|
|
40
|
-
settings.hooks[event] = settings.hooks[event].filter((h) => {
|
|
41
|
-
if (h.command?.includes('AGENTDECK_PORT') || h.command?.includes('localhost:9120'))
|
|
42
|
-
return false;
|
|
43
|
-
if (Array.isArray(h.hooks) && h.hooks.some((hh) => hh.command?.includes('AGENTDECK_PORT') || hh.command?.includes('localhost:9120'))) {
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
return true;
|
|
47
|
-
});
|
|
48
|
-
settings.hooks[event].push(buildHookEntry(event));
|
|
49
|
-
}
|
|
50
|
-
return settings;
|
|
51
|
-
}
|
|
52
|
-
function migrateHooks(settings) {
|
|
53
|
-
let migrated = false;
|
|
54
|
-
if (!settings.hooks)
|
|
55
|
-
return { settings, migrated };
|
|
56
|
-
for (const event of Object.keys(settings.hooks)) {
|
|
57
|
-
const hooks = settings.hooks[event];
|
|
58
|
-
if (!Array.isArray(hooks))
|
|
59
|
-
continue;
|
|
60
|
-
for (let i = 0; i < hooks.length; i++) {
|
|
61
|
-
const hook = hooks[i];
|
|
62
|
-
if (hook.command?.includes('localhost:9120') && !hook.command?.includes('AGENTDECK_PORT')) {
|
|
63
|
-
hook.command = hook.command.replace(/localhost:9120/g, 'localhost:${AGENTDECK_PORT:-9120}');
|
|
64
|
-
migrated = true;
|
|
65
|
-
}
|
|
66
|
-
if (hook.type === 'command' && hook.command?.includes('AGENTDECK_PORT') && !hook.hooks) {
|
|
67
|
-
hooks[i] = { matcher: '', hooks: [{ type: hook.type, command: hook.command }] };
|
|
68
|
-
migrated = true;
|
|
69
|
-
}
|
|
70
|
-
if (Array.isArray(hook.hooks)) {
|
|
71
|
-
for (const inner of hook.hooks) {
|
|
72
|
-
if (inner.command?.includes('localhost:9120') && !inner.command?.includes('AGENTDECK_PORT')) {
|
|
73
|
-
inner.command = inner.command.replace(/localhost:9120/g, 'localhost:${AGENTDECK_PORT:-9120}');
|
|
74
|
-
migrated = true;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
return { settings, migrated };
|
|
81
|
-
}
|
|
82
|
-
export function migrateHooksIfNeeded() {
|
|
83
|
-
try {
|
|
84
|
-
const settingsPath = join(homedir(), '.claude', 'settings.local.json');
|
|
85
|
-
if (!existsSync(settingsPath))
|
|
86
|
-
return;
|
|
87
|
-
const raw = readFileSync(settingsPath, 'utf-8');
|
|
88
|
-
if (!raw.includes('AGENTDECK_PORT') && !raw.includes('localhost:9120'))
|
|
89
|
-
return;
|
|
90
|
-
const settings = JSON.parse(raw);
|
|
91
|
-
let { migrated } = migrateHooks(settings);
|
|
92
|
-
if (raw.includes('AGENTDECK_PORT') && !raw.includes('daemon.json')) {
|
|
93
|
-
applyHooks(settings);
|
|
94
|
-
migrated = true;
|
|
95
|
-
}
|
|
96
|
-
if (migrated) {
|
|
97
|
-
writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
// Best effort only; hook migration must not block session startup.
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
//# sourceMappingURL=hook-migration.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hook-migration.js","sourceRoot":"","sources":["../src/hook-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* D200H HID Device Module — communicates with Ulanzi D200H via stock HID protocol.
|
|
3
|
-
*
|
|
4
|
-
* The D200H boots into HID mode (VID 0x2207, PID 0x0019) after 4 seconds.
|
|
5
|
-
* This module:
|
|
6
|
-
* - Detects the device via node-hid enumeration
|
|
7
|
-
* - Sends dashboard images via SET_BUTTONS (ZIP with manifest.json + PNGs)
|
|
8
|
-
* - Receives button press events and dispatches commands
|
|
9
|
-
* - Manages brightness and keep-alive
|
|
10
|
-
*
|
|
11
|
-
* No ADB, no firmware modification, no on-device agent needed.
|
|
12
|
-
*/
|
|
13
|
-
import type { DeviceModule, BridgeContext } from './types.js';
|
|
14
|
-
export declare class D200hModule implements DeviceModule {
|
|
15
|
-
readonly name = "d200h";
|
|
16
|
-
private hidModule;
|
|
17
|
-
private consumerDevice;
|
|
18
|
-
private keyboardDevice;
|
|
19
|
-
private pollTimer;
|
|
20
|
-
private readTimer;
|
|
21
|
-
private keepAliveTimer;
|
|
22
|
-
private commandHandler;
|
|
23
|
-
private lastStateHash;
|
|
24
|
-
private lastState;
|
|
25
|
-
private lastSessions;
|
|
26
|
-
private hostDisplayOn;
|
|
27
|
-
private dimEnabled;
|
|
28
|
-
private dimMode;
|
|
29
|
-
private dimLevel;
|
|
30
|
-
private lastDimSignature;
|
|
31
|
-
private displaySuppressed;
|
|
32
|
-
private externalOwner;
|
|
33
|
-
private currentCommandMap;
|
|
34
|
-
private connected;
|
|
35
|
-
private isUpdating;
|
|
36
|
-
private pendingUpdate;
|
|
37
|
-
private writeOK;
|
|
38
|
-
private writeFail;
|
|
39
|
-
private buttonPressCount;
|
|
40
|
-
private hidReportCount;
|
|
41
|
-
private lastWriteError;
|
|
42
|
-
private lastOpenError;
|
|
43
|
-
shouldActivate(config: 'auto' | boolean): Promise<boolean>;
|
|
44
|
-
start(ctx: BridgeContext): Promise<void>;
|
|
45
|
-
stop(): Promise<void>;
|
|
46
|
-
statusSnapshot(): Record<string, unknown>;
|
|
47
|
-
private loadHidModule;
|
|
48
|
-
private findDevice;
|
|
49
|
-
/**
|
|
50
|
-
* Arbitrate device ownership with the Ulanzi Studio plugin. When it connects,
|
|
51
|
-
* release the D200H and suspend reconnect so Ulanzi Studio drives it; when it
|
|
52
|
-
* disconnects, resume direct-HID.
|
|
53
|
-
*/
|
|
54
|
-
setExternalOwner(owner: boolean): void;
|
|
55
|
-
private tryConnect;
|
|
56
|
-
private disconnect;
|
|
57
|
-
private startReading;
|
|
58
|
-
private readFrom;
|
|
59
|
-
private updateDisplay;
|
|
60
|
-
private sendKeepAlive;
|
|
61
|
-
private applyDisplayState;
|
|
62
|
-
private applyDisplayBrightness;
|
|
63
|
-
private writeToDevice;
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=d200h-module.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"d200h-module.d.ts","sourceRoot":"","sources":["../../src/modules/d200h-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0C9D,qBAAa,WAAY,YAAW,YAAY;IAC9C,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,SAAS,CAYf;IACF,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,iBAAiB,CAAS;IAGlC,OAAO,CAAC,aAAa,CAAS;IAG9B,OAAO,CAAC,iBAAiB,CAAyC;IAClE,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,aAAa,CAAuB;IAEtC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB1D,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAwDxC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;YAiB3B,aAAa;IAU3B,OAAO,CAAC,UAAU;IAyBlB;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAkBtC,OAAO,CAAC,UAAU;IA2DlB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,QAAQ;YA4CF,aAAa;IA2D3B,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,sBAAsB;IAc9B,OAAO,CAAC,aAAa;CAsBtB"}
|