@agentdeck/bridge 1.0.6 → 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.
- package/assets/fm-helper/agentdeck-fm-helper +0 -0
- package/dist/apme/collector.d.ts +10 -0
- package/dist/apme/collector.d.ts.map +1 -1
- package/dist/apme/collector.js +39 -10
- package/dist/apme/collector.js.map +1 -1
- package/dist/apme/dashboard-html.d.ts.map +1 -1
- package/dist/apme/dashboard-html.js +289 -0
- package/dist/apme/dashboard-html.js.map +1 -1
- package/dist/apme/graph.d.ts +48 -0
- package/dist/apme/graph.d.ts.map +1 -0
- package/dist/apme/graph.js +226 -0
- package/dist/apme/graph.js.map +1 -0
- package/dist/apme/http.d.ts.map +1 -1
- package/dist/apme/http.js +52 -0
- package/dist/apme/http.js.map +1 -1
- package/dist/apme/judge-detect.d.ts.map +1 -1
- package/dist/apme/judge-detect.js +26 -2
- package/dist/apme/judge-detect.js.map +1 -1
- package/dist/apme/store.d.ts +69 -1
- package/dist/apme/store.d.ts.map +1 -1
- package/dist/apme/store.js +238 -4
- package/dist/apme/store.js.map +1 -1
- package/dist/apme/types.d.ts +1 -1
- package/dist/apme/types.d.ts.map +1 -1
- package/dist/apme/types.js.map +1 -1
- package/dist/ble-sync-spawn.d.ts +25 -2
- package/dist/ble-sync-spawn.d.ts.map +1 -1
- package/dist/ble-sync-spawn.js +38 -2
- package/dist/ble-sync-spawn.js.map +1 -1
- package/dist/ble-sync-status.d.ts +77 -0
- package/dist/ble-sync-status.d.ts.map +1 -0
- package/dist/ble-sync-status.js +157 -0
- package/dist/ble-sync-status.js.map +1 -0
- package/dist/bridge-core.d.ts.map +1 -1
- package/dist/bridge-core.js +7 -1
- package/dist/bridge-core.js.map +1 -1
- package/dist/cli.js +0 -0
- package/dist/codex-rate-limits-live.d.ts +60 -0
- package/dist/codex-rate-limits-live.d.ts.map +1 -0
- package/dist/codex-rate-limits-live.js +282 -0
- package/dist/codex-rate-limits-live.js.map +1 -0
- package/dist/d200h/hid-protocol.d.ts +62 -0
- package/dist/d200h/hid-protocol.d.ts.map +1 -0
- package/dist/d200h/hid-protocol.js +124 -0
- package/dist/d200h/hid-protocol.js.map +1 -0
- package/dist/d200h/image-renderer.d.ts +24 -0
- package/dist/d200h/image-renderer.d.ts.map +1 -0
- package/dist/d200h/image-renderer.js +321 -0
- package/dist/d200h/image-renderer.js.map +1 -0
- package/dist/daemon-server.d.ts.map +1 -1
- package/dist/daemon-server.js +79 -0
- package/dist/daemon-server.js.map +1 -1
- package/dist/daemon.js +1 -1
- package/dist/hook-migration.d.ts +2 -0
- package/dist/hook-migration.d.ts.map +1 -0
- package/dist/hook-migration.js +116 -0
- package/dist/hook-migration.js.map +1 -0
- package/dist/idotmatrix/idotmatrix-daemon-sync.d.ts +8 -0
- package/dist/idotmatrix/idotmatrix-daemon-sync.d.ts.map +1 -1
- package/dist/idotmatrix/idotmatrix-daemon-sync.js +19 -3
- package/dist/idotmatrix/idotmatrix-daemon-sync.js.map +1 -1
- package/dist/modules/d200h-module.d.ts +65 -0
- package/dist/modules/d200h-module.d.ts.map +1 -0
- package/dist/modules/d200h-module.js +495 -0
- package/dist/modules/d200h-module.js.map +1 -0
- package/dist/modules/d200h-renderer.d.ts +7 -0
- package/dist/modules/d200h-renderer.d.ts.map +1 -0
- package/dist/modules/d200h-renderer.js +321 -0
- package/dist/modules/d200h-renderer.js.map +1 -0
- package/dist/modules/idotmatrix-module.d.ts.map +1 -1
- package/dist/modules/idotmatrix-module.js +12 -1
- package/dist/modules/idotmatrix-module.js.map +1 -1
- package/dist/modules/timebox-module.d.ts.map +1 -1
- package/dist/modules/timebox-module.js +12 -1
- package/dist/modules/timebox-module.js.map +1 -1
- package/dist/modules/trmnl-module.d.ts +38 -0
- package/dist/modules/trmnl-module.d.ts.map +1 -0
- package/dist/modules/trmnl-module.js +111 -0
- package/dist/modules/trmnl-module.js.map +1 -0
- package/dist/timebox/timebox-daemon-sync.d.ts +8 -0
- package/dist/timebox/timebox-daemon-sync.d.ts.map +1 -1
- package/dist/timebox/timebox-daemon-sync.js +29 -1
- package/dist/timebox/timebox-daemon-sync.js.map +1 -1
- package/dist/timeline-summarizer.d.ts +12 -2
- package/dist/timeline-summarizer.d.ts.map +1 -1
- package/dist/timeline-summarizer.js +66 -4
- package/dist/timeline-summarizer.js.map +1 -1
- package/dist/trmnl/byos-server.d.ts +39 -0
- package/dist/trmnl/byos-server.d.ts.map +1 -0
- package/dist/trmnl/byos-server.js +301 -0
- package/dist/trmnl/byos-server.js.map +1 -0
- package/dist/trmnl/frame-cache.d.ts +37 -0
- package/dist/trmnl/frame-cache.d.ts.map +1 -0
- package/dist/trmnl/frame-cache.js +157 -0
- package/dist/trmnl/frame-cache.js.map +1 -0
- package/dist/trmnl/image-renderer.d.ts +27 -0
- package/dist/trmnl/image-renderer.d.ts.map +1 -0
- package/dist/trmnl/image-renderer.js +235 -0
- package/dist/trmnl/image-renderer.js.map +1 -0
- package/dist/trmnl/trmnl-settings.d.ts +96 -0
- package/dist/trmnl/trmnl-settings.d.ts.map +1 -0
- package/dist/trmnl/trmnl-settings.js +177 -0
- package/dist/trmnl/trmnl-settings.js.map +1 -0
- package/dist/trmnl/trmnl-telemetry.d.ts +47 -0
- package/dist/trmnl/trmnl-telemetry.d.ts.map +1 -0
- package/dist/trmnl/trmnl-telemetry.js +56 -0
- package/dist/trmnl/trmnl-telemetry.js.map +1 -0
- package/dist/whisper-server-manager.d.ts +19 -0
- package/dist/whisper-server-manager.d.ts.map +1 -0
- package/dist/whisper-server-manager.js +171 -0
- package/dist/whisper-server-manager.js.map +1 -0
- package/package.json +13 -14
- package/src/idotmatrix/sync.py +16 -1
- package/src/pysync/matrix_sync_common.py +83 -0
- package/src/timebox/sync_ble.py +16 -0
package/dist/daemon.js
CHANGED
|
@@ -17,7 +17,7 @@ const program = new Command();
|
|
|
17
17
|
program
|
|
18
18
|
.name('agentdeck')
|
|
19
19
|
.description('AgentDeck daemon (legacy entry point — use `agentdeck daemon` instead)')
|
|
20
|
-
.version('1.0.
|
|
20
|
+
.version('1.0.7');
|
|
21
21
|
program
|
|
22
22
|
.command('start', { isDefault: true })
|
|
23
23
|
.description('Start monitoring daemon')
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-migration.d.ts","sourceRoot":"","sources":["../src/hook-migration.ts"],"names":[],"mappings":"AAkGA,wBAAgB,oBAAoB,IAAI,IAAI,CA+B3C"}
|
|
@@ -0,0 +1,116 @@
|
|
|
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
|
+
'PostToolUseFailure',
|
|
10
|
+
'Stop',
|
|
11
|
+
'Notification',
|
|
12
|
+
'UserPromptSubmit',
|
|
13
|
+
];
|
|
14
|
+
function buildHookCommand(eventName) {
|
|
15
|
+
return [
|
|
16
|
+
`PORT="\${AGENTDECK_PORT:-}"`,
|
|
17
|
+
`if [ -z "$PORT" ]; then`,
|
|
18
|
+
` 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`,
|
|
19
|
+
` [ -f "$F" ] || continue`,
|
|
20
|
+
` P=$(python3 -c "import json;d=json.load(open('$F'));print(d.get('httpPort') or d.get('port',''))" 2>/dev/null)`,
|
|
21
|
+
` [ -n "$P" ] && curl -sf --connect-timeout 0.2 --max-time 0.3 "http://127.0.0.1:$P/health" >/dev/null 2>&1 && { PORT="$P"; break; }`,
|
|
22
|
+
` done`,
|
|
23
|
+
`fi`,
|
|
24
|
+
`PORT="\${PORT:-9120}"`,
|
|
25
|
+
// Bounded timeouts: an unbounded POST to a restarting daemon outlives
|
|
26
|
+
// Claude's ~1.5s SessionEnd abort budget and surfaces as
|
|
27
|
+
// `SessionEnd hook [...] failed: Hook cancelled`. See hooks/src/install.ts.
|
|
28
|
+
`curl -sf --connect-timeout 0.2 --max-time 0.8 -X POST "http://127.0.0.1:$PORT/hooks/${eventName}" -H 'Content-Type: application/json' -d @- >/dev/null 2>&1 || true`,
|
|
29
|
+
].join('\n');
|
|
30
|
+
}
|
|
31
|
+
function buildHookEntry(eventName) {
|
|
32
|
+
const needsToolMatcher = ['PreToolUse', 'PostToolUse', 'PostToolUseFailure'].includes(eventName);
|
|
33
|
+
return {
|
|
34
|
+
matcher: needsToolMatcher ? '*' : '',
|
|
35
|
+
hooks: [{ type: 'command', command: buildHookCommand(eventName) }],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function applyHooks(settings) {
|
|
39
|
+
if (!settings.hooks)
|
|
40
|
+
settings.hooks = {};
|
|
41
|
+
for (const event of HOOK_EVENTS) {
|
|
42
|
+
if (!settings.hooks[event])
|
|
43
|
+
settings.hooks[event] = [];
|
|
44
|
+
settings.hooks[event] = settings.hooks[event].filter((h) => {
|
|
45
|
+
if (h.command?.includes('AGENTDECK_PORT') || h.command?.includes('localhost:9120'))
|
|
46
|
+
return false;
|
|
47
|
+
if (Array.isArray(h.hooks) && h.hooks.some((hh) => hh.command?.includes('AGENTDECK_PORT') || hh.command?.includes('localhost:9120'))) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
});
|
|
52
|
+
settings.hooks[event].push(buildHookEntry(event));
|
|
53
|
+
}
|
|
54
|
+
return settings;
|
|
55
|
+
}
|
|
56
|
+
function migrateHooks(settings) {
|
|
57
|
+
let migrated = false;
|
|
58
|
+
if (!settings.hooks)
|
|
59
|
+
return { settings, migrated };
|
|
60
|
+
for (const event of Object.keys(settings.hooks)) {
|
|
61
|
+
const hooks = settings.hooks[event];
|
|
62
|
+
if (!Array.isArray(hooks))
|
|
63
|
+
continue;
|
|
64
|
+
for (let i = 0; i < hooks.length; i++) {
|
|
65
|
+
const hook = hooks[i];
|
|
66
|
+
if (hook.command?.includes('localhost:9120') && !hook.command?.includes('AGENTDECK_PORT')) {
|
|
67
|
+
hook.command = hook.command.replace(/localhost:9120/g, 'localhost:${AGENTDECK_PORT:-9120}');
|
|
68
|
+
migrated = true;
|
|
69
|
+
}
|
|
70
|
+
if (hook.type === 'command' && hook.command?.includes('AGENTDECK_PORT') && !hook.hooks) {
|
|
71
|
+
hooks[i] = { matcher: '', hooks: [{ type: hook.type, command: hook.command }] };
|
|
72
|
+
migrated = true;
|
|
73
|
+
}
|
|
74
|
+
if (Array.isArray(hook.hooks)) {
|
|
75
|
+
for (const inner of hook.hooks) {
|
|
76
|
+
if (inner.command?.includes('localhost:9120') && !inner.command?.includes('AGENTDECK_PORT')) {
|
|
77
|
+
inner.command = inner.command.replace(/localhost:9120/g, 'localhost:${AGENTDECK_PORT:-9120}');
|
|
78
|
+
migrated = true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return { settings, migrated };
|
|
85
|
+
}
|
|
86
|
+
export function migrateHooksIfNeeded() {
|
|
87
|
+
try {
|
|
88
|
+
const settingsPath = join(homedir(), '.claude', 'settings.local.json');
|
|
89
|
+
if (!existsSync(settingsPath))
|
|
90
|
+
return;
|
|
91
|
+
const raw = readFileSync(settingsPath, 'utf-8');
|
|
92
|
+
if (!raw.includes('AGENTDECK_PORT') && !raw.includes('localhost:9120'))
|
|
93
|
+
return;
|
|
94
|
+
const settings = JSON.parse(raw);
|
|
95
|
+
let { migrated } = migrateHooks(settings);
|
|
96
|
+
if (raw.includes('AGENTDECK_PORT') && !raw.includes('daemon.json')) {
|
|
97
|
+
applyHooks(settings);
|
|
98
|
+
migrated = true;
|
|
99
|
+
}
|
|
100
|
+
// Structured AskUserQuestion overlays need the failure/interrupt boundary.
|
|
101
|
+
// Add only this missing event here: the legacy bridge-local applyHooks
|
|
102
|
+
// helper intentionally remains out of the normal refresh path.
|
|
103
|
+
if (!settings.hooks?.PostToolUseFailure) {
|
|
104
|
+
settings.hooks ??= {};
|
|
105
|
+
settings.hooks.PostToolUseFailure = [buildHookEntry('PostToolUseFailure')];
|
|
106
|
+
migrated = true;
|
|
107
|
+
}
|
|
108
|
+
if (migrated) {
|
|
109
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Best effort only; hook migration must not block session startup.
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=hook-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-migration.js","sourceRoot":"","sources":["../src/hook-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* App Store Swift build, so spawning a subprocess here does not touch the
|
|
16
16
|
* Apple 2.5.2 sandbox invariants.
|
|
17
17
|
*/
|
|
18
|
+
import { type BleLinkSnapshot } from '../ble-sync-status.js';
|
|
18
19
|
/**
|
|
19
20
|
* Start (or no-op if already running) the managed BLE sync for the first
|
|
20
21
|
* configured iDotMatrix device, fed by the daemon at `httpPort`.
|
|
@@ -30,4 +31,11 @@ export declare function startIDotMatrixSync(httpPort: number): void;
|
|
|
30
31
|
* (re-config restart), just signal the child and return synchronously.
|
|
31
32
|
*/
|
|
32
33
|
export declare function stopIDotMatrixSync(awaitFarewell?: boolean): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Live link state for the configured iDotMatrix panel, in the `BLEMatrixHealth`
|
|
36
|
+
* wire shape. Called by `IDotMatrixModule.statusSnapshot()` so `/health` reports
|
|
37
|
+
* whether the panel is actually being driven — the configured-device list alone
|
|
38
|
+
* left every dashboard drawing a streaming panel as disconnected.
|
|
39
|
+
*/
|
|
40
|
+
export declare function idotMatrixLinkSnapshot(configuredDeviceCount: number): BleLinkSnapshot;
|
|
33
41
|
//# sourceMappingURL=idotmatrix-daemon-sync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idotmatrix-daemon-sync.d.ts","sourceRoot":"","sources":["../../src/idotmatrix/idotmatrix-daemon-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"idotmatrix-daemon-sync.d.ts","sourceRoot":"","sources":["../../src/idotmatrix/idotmatrix-daemon-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAgCnF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CA8B1D;AAwDD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,aAAa,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB7E;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,qBAAqB,EAAE,MAAM,GAAG,eAAe,CAErF"}
|
|
@@ -17,12 +17,15 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { loadIDotMatrixDevices } from './idotmatrix-settings.js';
|
|
19
19
|
import { createSyncCycleSquelch, spawnPythonSync, terminateSyncChild } from '../ble-sync-spawn.js';
|
|
20
|
+
import { createBleLinkTracker } from '../ble-sync-status.js';
|
|
20
21
|
import { getBleRuntimeStatus } from '../python-ble-runtime.js';
|
|
21
22
|
let child = null;
|
|
22
23
|
let stopping = false;
|
|
23
24
|
let respawnTimer = null;
|
|
24
25
|
let consecutiveFailures = 0;
|
|
25
26
|
let startedAt = 0;
|
|
27
|
+
/** Live BLE link state, fed by the child's `AGENTDECK_STATUS` lines. */
|
|
28
|
+
const link = createBleLinkTracker();
|
|
26
29
|
/** Address+brightness of the device the running child is driving (for reload-on-change). */
|
|
27
30
|
let runningKey = null;
|
|
28
31
|
/** Identity of the driven config — a change means the running child is stale. */
|
|
@@ -66,6 +69,9 @@ export function startIDotMatrixSync(httpPort) {
|
|
|
66
69
|
const runtime = getBleRuntimeStatus();
|
|
67
70
|
if (!runtime.ready || !runtime.python) {
|
|
68
71
|
log(`BLE sync unavailable (${runtime.reason}); run \`agentdeck ble setup\``);
|
|
72
|
+
// Record *why* nothing is driving the panel so /health can say so instead
|
|
73
|
+
// of reporting an unexplained `connected:false`.
|
|
74
|
+
link.noteUnavailable(`BLE sync unavailable: ${runtime.reason}`);
|
|
69
75
|
return;
|
|
70
76
|
}
|
|
71
77
|
spawnSync(runtime.python, runtime.paths.scripts.idotmatrixSync, httpPort);
|
|
@@ -83,13 +89,12 @@ function spawnSync(venvPython, syncScript, httpPort) {
|
|
|
83
89
|
squelch.logStart(`Starting BLE sync for ${device.name ?? addr} (bridge ${url}, brightness ${brightness}%)`);
|
|
84
90
|
startedAt = Date.now();
|
|
85
91
|
runningKey = deviceKey(device);
|
|
92
|
+
link.noteSpawn();
|
|
86
93
|
// iDotMatrix software brightness boost canonical = 1.22 — keep in sync:
|
|
87
94
|
// sync.py (run_sync boost default), IDotMatrixModule.swift (boostBrightnessContrast).
|
|
88
95
|
// stdout/stderr are captured into small rings so clean exits and crashes both
|
|
89
96
|
// leave enough context without flooding the daemon log while running.
|
|
90
|
-
const { proc, stderrTail, outputTail } = spawnPythonSync(venvPython, [
|
|
91
|
-
syncScript, '-a', addr, '-u', url, '-b', String(brightness), '--boost', '1.22',
|
|
92
|
-
]);
|
|
97
|
+
const { proc, stderrTail, outputTail } = spawnPythonSync(venvPython, [syncScript, '-a', addr, '-u', url, '-b', String(brightness), '--boost', '1.22'], { onStatus: (payload) => link.applyStatusLine(payload) });
|
|
93
98
|
child = proc;
|
|
94
99
|
proc.on('error', (err) => {
|
|
95
100
|
log(`BLE sync failed to spawn: ${err.message}`);
|
|
@@ -110,6 +115,7 @@ function spawnSync(venvPython, syncScript, httpPort) {
|
|
|
110
115
|
const delay = Math.min(MAX_BACKOFF_MS, BASE_BACKOFF_MS * consecutiveFailures);
|
|
111
116
|
const tail = stderrTail() || outputTail();
|
|
112
117
|
const why = tail ? `; output: ${tail}` : '';
|
|
118
|
+
link.noteExit(tail || `BLE sync exited (code=${code} signal=${signal})`, Date.now() + delay);
|
|
113
119
|
squelch.logExit(code, signal, uptimeMs, tail, `BLE sync exited (code=${code} signal=${signal})${why}; respawning in ${Math.round(delay / 1000)}s`);
|
|
114
120
|
respawnTimer = setTimeout(() => spawnSync(venvPython, syncScript, httpPort), delay);
|
|
115
121
|
if (respawnTimer.unref)
|
|
@@ -134,6 +140,7 @@ export async function stopIDotMatrixSync(awaitFarewell = false) {
|
|
|
134
140
|
const proc = child;
|
|
135
141
|
child = null;
|
|
136
142
|
runningKey = null;
|
|
143
|
+
link.noteUnavailable('BLE sync stopped');
|
|
137
144
|
if (!proc)
|
|
138
145
|
return;
|
|
139
146
|
if (awaitFarewell) {
|
|
@@ -148,4 +155,13 @@ export async function stopIDotMatrixSync(awaitFarewell = false) {
|
|
|
148
155
|
}
|
|
149
156
|
}
|
|
150
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Live link state for the configured iDotMatrix panel, in the `BLEMatrixHealth`
|
|
160
|
+
* wire shape. Called by `IDotMatrixModule.statusSnapshot()` so `/health` reports
|
|
161
|
+
* whether the panel is actually being driven — the configured-device list alone
|
|
162
|
+
* left every dashboard drawing a streaming panel as disconnected.
|
|
163
|
+
*/
|
|
164
|
+
export function idotMatrixLinkSnapshot(configuredDeviceCount) {
|
|
165
|
+
return link.snapshot(configuredDeviceCount);
|
|
166
|
+
}
|
|
151
167
|
//# sourceMappingURL=idotmatrix-daemon-sync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idotmatrix-daemon-sync.js","sourceRoot":"","sources":["../../src/idotmatrix/idotmatrix-daemon-sync.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"idotmatrix-daemon-sync.js","sourceRoot":"","sources":["../../src/idotmatrix/idotmatrix-daemon-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|