@agentdeck/shared 1.0.3 → 1.0.5
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/dist/command-builders.d.ts +1 -1
- package/dist/command-builders.d.ts.map +1 -1
- package/dist/command-builders.js +2 -2
- package/dist/command-builders.js.map +1 -1
- package/dist/d200h-layout.d.ts +22 -1
- package/dist/d200h-layout.d.ts.map +1 -1
- package/dist/d200h-layout.js +72 -13
- package/dist/d200h-layout.js.map +1 -1
- package/dist/format-utils.d.ts +76 -0
- package/dist/format-utils.d.ts.map +1 -1
- package/dist/format-utils.js +111 -0
- package/dist/format-utils.js.map +1 -1
- package/dist/idotmatrix-identity.d.ts +50 -0
- package/dist/idotmatrix-identity.d.ts.map +1 -0
- package/dist/idotmatrix-identity.js +70 -0
- package/dist/idotmatrix-identity.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/net-utils.js +3 -3
- package/dist/net-utils.js.map +1 -1
- package/dist/protocol.d.ts +189 -7
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +21 -0
- package/dist/protocol.js.map +1 -1
- package/dist/session-utils.d.ts +45 -1
- package/dist/session-utils.d.ts.map +1 -1
- package/dist/session-utils.js +64 -2
- package/dist/session-utils.js.map +1 -1
- package/dist/subagent-activity.d.ts +19 -0
- package/dist/subagent-activity.d.ts.map +1 -0
- package/dist/subagent-activity.js +62 -0
- package/dist/subagent-activity.js.map +1 -0
- package/dist/timeline.d.ts.map +1 -1
- package/dist/timeline.js +5 -0
- package/dist/timeline.js.map +1 -1
- package/package.json +6 -6
- package/LICENSE +0 -21
package/dist/format-utils.js
CHANGED
|
@@ -98,6 +98,34 @@ export function truncateUtf8Bytes(value, maxBytes) {
|
|
|
98
98
|
}
|
|
99
99
|
return value.slice(0, end);
|
|
100
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Defensive clean for an API-provided scoped-model display name before it lands
|
|
103
|
+
* in compact gauge text: drop control chars / newlines, collapse runs of
|
|
104
|
+
* whitespace, trim. The usage API's `limits[]` payload is undocumented, so a
|
|
105
|
+
* stray newline or control byte would otherwise break a single-line SVG layout.
|
|
106
|
+
* XML-escaping (in each renderer) still handles `< & >`; this is the
|
|
107
|
+
* layout-safety pass that runs before uppercase + truncate.
|
|
108
|
+
*
|
|
109
|
+
* Canonical here rather than in one plugin so every scoped-limit surface (SD
|
|
110
|
+
* encoder, SD keypad, D200H tiles) cleans labels identically.
|
|
111
|
+
*/
|
|
112
|
+
export function sanitizeScopedLabel(label) {
|
|
113
|
+
return (label ?? '')
|
|
114
|
+
// eslint-disable-next-line no-control-regex
|
|
115
|
+
.replace(/[\u0000-\u001f\u007f-\u009f]/g, ' ')
|
|
116
|
+
.replace(/\s+/g, ' ')
|
|
117
|
+
.trim();
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Sanitize + uppercase + code-point-safe truncate a scoped-model label for a
|
|
121
|
+
* compact gauge. Iterating code points (not UTF-16 units) keeps the cut on a
|
|
122
|
+
* character boundary, same rule as truncateUtf8Bytes above. Falls back to
|
|
123
|
+
* "MODEL" when the API label is empty or was entirely control characters.
|
|
124
|
+
*/
|
|
125
|
+
export function formatScopedLabel(label, max) {
|
|
126
|
+
const clean = sanitizeScopedLabel(label).toUpperCase();
|
|
127
|
+
return Array.from(clean).slice(0, max).join('') || 'MODEL';
|
|
128
|
+
}
|
|
101
129
|
/** Format uptime from seconds: 3725 → "1h 2m" */
|
|
102
130
|
export function formatUptime(sec) {
|
|
103
131
|
if (sec < 60)
|
|
@@ -153,6 +181,89 @@ export function isCodexWindowStale(resetsAt, graceMs = 5 * 60_000) {
|
|
|
153
181
|
return false;
|
|
154
182
|
return Date.now() - t > graceMs;
|
|
155
183
|
}
|
|
184
|
+
/**
|
|
185
|
+
* How old a Codex snapshot may get before its numbers stop reading as live.
|
|
186
|
+
*
|
|
187
|
+
* Codex writes a `rate_limits` line on every turn, so during real use snapshots
|
|
188
|
+
* are seconds apart; anything older than this means "nobody asked Codex in a
|
|
189
|
+
* while", not "usage is holding steady". An ABSOLUTE threshold on purpose — a
|
|
190
|
+
* fraction of the window length would scale to 8h+ on the weekly window and be
|
|
191
|
+
* useless, which is exactly the hole this closes.
|
|
192
|
+
*/
|
|
193
|
+
export const CODEX_SNAPSHOT_STALE_MS = 30 * 60_000;
|
|
194
|
+
/**
|
|
195
|
+
* Age of a Codex snapshot in ms, or undefined when unknown/unparseable.
|
|
196
|
+
* `capturedAt` is when the snapshot was WRITTEN (see `CodexRateLimits.capturedAt`),
|
|
197
|
+
* which is the only thing that can distinguish "94% right now" from "94% four
|
|
198
|
+
* hours ago" — the window's `resetsAt` cannot, since a weekly window stays in the
|
|
199
|
+
* future for up to 7 days.
|
|
200
|
+
*/
|
|
201
|
+
export function codexSnapshotAgeMs(capturedAt, nowMs = Date.now()) {
|
|
202
|
+
if (!capturedAt)
|
|
203
|
+
return undefined;
|
|
204
|
+
const t = new Date(capturedAt).getTime();
|
|
205
|
+
if (isNaN(t))
|
|
206
|
+
return undefined;
|
|
207
|
+
return Math.max(0, nowMs - t);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* True when the snapshot is too old to present as live.
|
|
211
|
+
*
|
|
212
|
+
* This is deliberately NOT the same signal as `isCodexWindowStale` and must NOT
|
|
213
|
+
* be folded into the wire `stale` flag: `stale` means "this window has ENDED, the
|
|
214
|
+
* number no longer applies" and slot-based consumers (Pixoo renderers, ESP32
|
|
215
|
+
* firmware) HIDE the gauge on it. An aged snapshot still carries the last true
|
|
216
|
+
* reading of a live window, so it keeps rendering — dimmed, with its age shown.
|
|
217
|
+
*
|
|
218
|
+
* Derived at the consumer from `capturedAt`, never precomputed by the producer:
|
|
219
|
+
* a producer-side boolean would freeze at push time and read "fresh" an hour later,
|
|
220
|
+
* the same way the frozen percent did.
|
|
221
|
+
*/
|
|
222
|
+
export function isCodexSnapshotAged(capturedAt, nowMs = Date.now(), maxAgeMs = CODEX_SNAPSHOT_STALE_MS) {
|
|
223
|
+
const age = codexSnapshotAgeMs(capturedAt, nowMs);
|
|
224
|
+
return age != null && age > maxAgeMs;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Compact "when was this measured" label for a gauge footnote: `"34m ago"`,
|
|
228
|
+
* `"3h ago"`, `"2d ago"`. Returns undefined when there is nothing to say.
|
|
229
|
+
* Rounds DOWN so the label never overstates freshness.
|
|
230
|
+
*/
|
|
231
|
+
export function formatSnapshotAge(capturedAt, nowMs = Date.now()) {
|
|
232
|
+
const age = codexSnapshotAgeMs(capturedAt, nowMs);
|
|
233
|
+
if (age == null)
|
|
234
|
+
return undefined;
|
|
235
|
+
const min = Math.floor(age / 60_000);
|
|
236
|
+
if (min < 1)
|
|
237
|
+
return 'now';
|
|
238
|
+
if (min < 60)
|
|
239
|
+
return `${min}m ago`;
|
|
240
|
+
const hours = Math.floor(min / 60);
|
|
241
|
+
if (hours < 24)
|
|
242
|
+
return `${hours}h ago`;
|
|
243
|
+
return `${Math.floor(hours / 24)}d ago`;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* The one footnote a Codex gauge should print under its percentage, and whether
|
|
247
|
+
* the gauge should be dimmed. Single decision point so every surface (D200H tile,
|
|
248
|
+
* SD encoder, menubar, Android rail, Swift preview) resolves the three states the
|
|
249
|
+
* same way:
|
|
250
|
+
*
|
|
251
|
+
* - window ended (`stale`) → "stale", dim — the number no longer applies
|
|
252
|
+
* - snapshot aged (> 30m old) → "3h ago", dim — last true reading, not live
|
|
253
|
+
* - live → undefined — caller prints its countdown
|
|
254
|
+
*
|
|
255
|
+
* `stale` wins over age: an ended window is a stronger statement than an old read.
|
|
256
|
+
*/
|
|
257
|
+
export function codexUsageFootnote(win, capturedAt, nowMs = Date.now()) {
|
|
258
|
+
if (!win)
|
|
259
|
+
return undefined;
|
|
260
|
+
if (win.stale === true)
|
|
261
|
+
return { text: 'stale', dim: true };
|
|
262
|
+
if (isCodexSnapshotAged(capturedAt, nowMs)) {
|
|
263
|
+
return { text: formatSnapshotAge(capturedAt, nowMs) ?? 'stale', dim: true };
|
|
264
|
+
}
|
|
265
|
+
return undefined;
|
|
266
|
+
}
|
|
156
267
|
/**
|
|
157
268
|
* Antigravity plan name → compact "AGY <tier>" chip.
|
|
158
269
|
*
|
package/dist/format-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-utils.js","sourceRoot":"","sources":["../src/format-utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"format-utils.js","sourceRoot":"","sources":["../src/format-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* iDotMatrix BLE identity SSOT — the GATT UUIDs and the advertised-name
|
|
3
|
+
* families that identify a panel speaking the iDotMatrix protocol.
|
|
4
|
+
*
|
|
5
|
+
* The same 32x32 panel ships under several brand names (iDotMatrix `IDM-…`,
|
|
6
|
+
* iPixel `iPixel-…`), so discovery must not key on one vendor's name prefix.
|
|
7
|
+
* Issue #115 was exactly that: an iPixel panel that connects and renders fine
|
|
8
|
+
* once its address is hand-written into `settings.json` never appeared in any
|
|
9
|
+
* Scan UI, because both scanners filtered on `IDM-`. Match the advertised
|
|
10
|
+
* service UUID first (protocol truth, brand-independent) and fall back to the
|
|
11
|
+
* known name families for panels that keep the service out of their
|
|
12
|
+
* advertisement packet — the fallback is why the scan filter cannot be
|
|
13
|
+
* service-only either.
|
|
14
|
+
*
|
|
15
|
+
* Two scanners consume this: the Swift CoreBluetooth one in the App Store
|
|
16
|
+
* daemon and the Python/bleak one in the terminal-managed daemon. Neither can
|
|
17
|
+
* import TypeScript, so both read generated mirrors of this file:
|
|
18
|
+
* pnpm generate-idotmatrix-identity
|
|
19
|
+
* drift-gated by `shared/src/__tests__/idotmatrix-identity.test.ts`.
|
|
20
|
+
*/
|
|
21
|
+
/** Advertised service that carries the DIY-drawing write characteristic. */
|
|
22
|
+
export declare const IDOTMATRIX_SERVICE_UUID = "000000fa-0000-1000-8000-00805f9b34fb";
|
|
23
|
+
/** Write-without-response characteristic used for mode/brightness/image. */
|
|
24
|
+
export declare const IDOTMATRIX_WRITE_CHARACTERISTIC_UUID = "0000fa02-0000-1000-8000-00805f9b34fb";
|
|
25
|
+
/**
|
|
26
|
+
* Known advertised-name families, uppercase; compared case-insensitively as
|
|
27
|
+
* prefixes. A user can widen this at runtime with `idotmatrixNamePrefixes` in
|
|
28
|
+
* settings.json rather than waiting on a release for the next rebrand.
|
|
29
|
+
*/
|
|
30
|
+
export declare const IDOTMATRIX_NAME_PREFIXES: readonly string[];
|
|
31
|
+
/**
|
|
32
|
+
* Expand a 16-bit (`fa02`) or 32-bit (`000000fa`) BLE UUID to its full
|
|
33
|
+
* Bluetooth-base 128-bit form, lowercased. Advertisement payloads carry
|
|
34
|
+
* whichever form the peripheral chose to transmit, and CoreBluetooth hands
|
|
35
|
+
* back the short one verbatim, so equality has to run on the expanded string.
|
|
36
|
+
* Short forms are left-padded first — `CBUUID.uuidString` is not guaranteed to
|
|
37
|
+
* keep leading zeroes, and `fa` and `00fa` are the same service.
|
|
38
|
+
*/
|
|
39
|
+
export declare function normalizeBleUuid(value: string): string;
|
|
40
|
+
/** Whether an advertised local name belongs to a known iDotMatrix family. */
|
|
41
|
+
export declare function matchesIDotMatrixName(name: string, extraPrefixes?: readonly string[]): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* The discovery predicate both scanners apply to every peripheral they see:
|
|
44
|
+
* service UUID first, known/configured name families second.
|
|
45
|
+
*/
|
|
46
|
+
export declare function isIDotMatrixAdvertisement(advertisement: {
|
|
47
|
+
name?: string;
|
|
48
|
+
serviceUuids?: readonly string[];
|
|
49
|
+
}, extraPrefixes?: readonly string[]): boolean;
|
|
50
|
+
//# sourceMappingURL=idotmatrix-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idotmatrix-identity.d.ts","sourceRoot":"","sources":["../src/idotmatrix-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB,yCAAyC,CAAC;AAE9E,4EAA4E;AAC5E,eAAO,MAAM,oCAAoC,yCAAyC,CAAC;AAE3F;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAAuB,CAAC;AAE9E;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,aAAa,GAAE,SAAS,MAAM,EAAO,GACpC,OAAO,CAQT;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,aAAa,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAClE,aAAa,GAAE,SAAS,MAAM,EAAO,GACpC,OAAO,CAKT"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* iDotMatrix BLE identity SSOT — the GATT UUIDs and the advertised-name
|
|
3
|
+
* families that identify a panel speaking the iDotMatrix protocol.
|
|
4
|
+
*
|
|
5
|
+
* The same 32x32 panel ships under several brand names (iDotMatrix `IDM-…`,
|
|
6
|
+
* iPixel `iPixel-…`), so discovery must not key on one vendor's name prefix.
|
|
7
|
+
* Issue #115 was exactly that: an iPixel panel that connects and renders fine
|
|
8
|
+
* once its address is hand-written into `settings.json` never appeared in any
|
|
9
|
+
* Scan UI, because both scanners filtered on `IDM-`. Match the advertised
|
|
10
|
+
* service UUID first (protocol truth, brand-independent) and fall back to the
|
|
11
|
+
* known name families for panels that keep the service out of their
|
|
12
|
+
* advertisement packet — the fallback is why the scan filter cannot be
|
|
13
|
+
* service-only either.
|
|
14
|
+
*
|
|
15
|
+
* Two scanners consume this: the Swift CoreBluetooth one in the App Store
|
|
16
|
+
* daemon and the Python/bleak one in the terminal-managed daemon. Neither can
|
|
17
|
+
* import TypeScript, so both read generated mirrors of this file:
|
|
18
|
+
* pnpm generate-idotmatrix-identity
|
|
19
|
+
* drift-gated by `shared/src/__tests__/idotmatrix-identity.test.ts`.
|
|
20
|
+
*/
|
|
21
|
+
/** Advertised service that carries the DIY-drawing write characteristic. */
|
|
22
|
+
export const IDOTMATRIX_SERVICE_UUID = '000000fa-0000-1000-8000-00805f9b34fb';
|
|
23
|
+
/** Write-without-response characteristic used for mode/brightness/image. */
|
|
24
|
+
export const IDOTMATRIX_WRITE_CHARACTERISTIC_UUID = '0000fa02-0000-1000-8000-00805f9b34fb';
|
|
25
|
+
/**
|
|
26
|
+
* Known advertised-name families, uppercase; compared case-insensitively as
|
|
27
|
+
* prefixes. A user can widen this at runtime with `idotmatrixNamePrefixes` in
|
|
28
|
+
* settings.json rather than waiting on a release for the next rebrand.
|
|
29
|
+
*/
|
|
30
|
+
export const IDOTMATRIX_NAME_PREFIXES = ['IDM-', 'IPIXEL'];
|
|
31
|
+
/**
|
|
32
|
+
* Expand a 16-bit (`fa02`) or 32-bit (`000000fa`) BLE UUID to its full
|
|
33
|
+
* Bluetooth-base 128-bit form, lowercased. Advertisement payloads carry
|
|
34
|
+
* whichever form the peripheral chose to transmit, and CoreBluetooth hands
|
|
35
|
+
* back the short one verbatim, so equality has to run on the expanded string.
|
|
36
|
+
* Short forms are left-padded first — `CBUUID.uuidString` is not guaranteed to
|
|
37
|
+
* keep leading zeroes, and `fa` and `00fa` are the same service.
|
|
38
|
+
*/
|
|
39
|
+
export function normalizeBleUuid(value) {
|
|
40
|
+
const s = value.trim().toLowerCase();
|
|
41
|
+
if (/^[0-9a-f]{1,4}$/.test(s))
|
|
42
|
+
return `0000${s.padStart(4, '0')}-0000-1000-8000-00805f9b34fb`;
|
|
43
|
+
if (/^[0-9a-f]{5,8}$/.test(s))
|
|
44
|
+
return `${s.padStart(8, '0')}-0000-1000-8000-00805f9b34fb`;
|
|
45
|
+
return s;
|
|
46
|
+
}
|
|
47
|
+
/** Whether an advertised local name belongs to a known iDotMatrix family. */
|
|
48
|
+
export function matchesIDotMatrixName(name, extraPrefixes = []) {
|
|
49
|
+
const n = name.trim().toUpperCase();
|
|
50
|
+
if (!n)
|
|
51
|
+
return false;
|
|
52
|
+
for (const prefix of [...IDOTMATRIX_NAME_PREFIXES, ...extraPrefixes]) {
|
|
53
|
+
const p = prefix.trim().toUpperCase();
|
|
54
|
+
if (p && n.startsWith(p))
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The discovery predicate both scanners apply to every peripheral they see:
|
|
61
|
+
* service UUID first, known/configured name families second.
|
|
62
|
+
*/
|
|
63
|
+
export function isIDotMatrixAdvertisement(advertisement, extraPrefixes = []) {
|
|
64
|
+
for (const uuid of advertisement.serviceUuids ?? []) {
|
|
65
|
+
if (normalizeBleUuid(uuid) === IDOTMATRIX_SERVICE_UUID)
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
return matchesIDotMatrixName(advertisement.name ?? '', extraPrefixes);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=idotmatrix-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idotmatrix-identity.js","sourceRoot":"","sources":["../src/idotmatrix-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,uBAAuB,GAAG,sCAAsC,CAAC;AAE9E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,oCAAoC,GAAG,sCAAsC,CAAC;AAE3F;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,8BAA8B,CAAC;IAC9F,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,8BAA8B,CAAC;IAC1F,OAAO,CAAC,CAAC;AACX,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,gBAAmC,EAAE;IAErC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,wBAAwB,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC;QACrE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,aAAkE,EAClE,gBAAmC,EAAE;IAErC,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;QACpD,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,uBAAuB;YAAE,OAAO,IAAI,CAAC;IACtE,CAAC;IACD,OAAO,qBAAqB,CAAC,aAAa,CAAC,IAAI,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;AACxE,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export * from './adapter.js';
|
|
|
6
6
|
export * from './voice-paths.js';
|
|
7
7
|
export * from './net-utils.js';
|
|
8
8
|
export * from './timeline.js';
|
|
9
|
+
export * from './subagent-activity.js';
|
|
9
10
|
export * from './timeline-icons.js';
|
|
10
11
|
export * from './timeline-label.js';
|
|
11
12
|
export * from './timeline-task-display.js';
|
|
@@ -20,6 +21,7 @@ export * from './connection-status.js';
|
|
|
20
21
|
export * from './design-tokens.js';
|
|
21
22
|
export * from './svg-renderers/index.js';
|
|
22
23
|
export * from './d200h-layout.js';
|
|
24
|
+
export * from './idotmatrix-identity.js';
|
|
23
25
|
export * from './llm-settings.js';
|
|
24
26
|
export * from './eval-schema.js';
|
|
25
27
|
export * from './sample.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ export * from './adapter.js';
|
|
|
6
6
|
export * from './voice-paths.js';
|
|
7
7
|
export * from './net-utils.js';
|
|
8
8
|
export * from './timeline.js';
|
|
9
|
+
export * from './subagent-activity.js';
|
|
9
10
|
export * from './timeline-icons.js';
|
|
10
11
|
export * from './timeline-label.js';
|
|
11
12
|
export * from './timeline-task-display.js';
|
|
@@ -20,6 +21,7 @@ export * from './connection-status.js';
|
|
|
20
21
|
export * from './design-tokens.js';
|
|
21
22
|
export * from './svg-renderers/index.js';
|
|
22
23
|
export * from './d200h-layout.js';
|
|
24
|
+
export * from './idotmatrix-identity.js';
|
|
23
25
|
export * from './llm-settings.js';
|
|
24
26
|
export * from './eval-schema.js';
|
|
25
27
|
export * from './sample.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC"}
|
package/dist/net-utils.js
CHANGED
|
@@ -19,11 +19,11 @@ function defaultRouteIp() {
|
|
|
19
19
|
let directIp = null;
|
|
20
20
|
try {
|
|
21
21
|
if (process.platform === 'darwin') {
|
|
22
|
-
const out = execFileSync('route', ['-n', 'get', 'default'], { timeout: 1000, encoding: 'utf8' });
|
|
22
|
+
const out = execFileSync('route', ['-n', 'get', 'default'], { timeout: 1000, encoding: 'utf8', windowsHide: true });
|
|
23
23
|
iface = out.match(/interface:\s*(\S+)/)?.[1] ?? null;
|
|
24
24
|
}
|
|
25
25
|
else if (process.platform === 'linux') {
|
|
26
|
-
const out = execFileSync('ip', ['route', 'get', '1.1.1.1'], { timeout: 1000, encoding: 'utf8' });
|
|
26
|
+
const out = execFileSync('ip', ['route', 'get', '1.1.1.1'], { timeout: 1000, encoding: 'utf8', windowsHide: true });
|
|
27
27
|
iface = out.match(/\bdev\s+(\S+)/)?.[1] ?? null;
|
|
28
28
|
}
|
|
29
29
|
else if (process.platform === 'win32') {
|
|
@@ -34,7 +34,7 @@ function defaultRouteIp() {
|
|
|
34
34
|
// `route print -4 0.0.0.0` resolves this by emitting the *source interface IP*
|
|
35
35
|
// of each default route directly in the Interface column; pick the lowest
|
|
36
36
|
// metric so VPN/host-only adapters lose to the physical route.
|
|
37
|
-
const out = execFileSync('route', ['print', '-4', '0.0.0.0'], { timeout: 1000, encoding: 'utf8' });
|
|
37
|
+
const out = execFileSync('route', ['print', '-4', '0.0.0.0'], { timeout: 1000, encoding: 'utf8', windowsHide: true });
|
|
38
38
|
let bestMetric = Infinity;
|
|
39
39
|
for (const line of out.split('\n')) {
|
|
40
40
|
// Network Netmask Gateway Interface Metric
|
package/dist/net-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"net-utils.js","sourceRoot":"","sources":["../src/net-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;;;GAOG;AACH,IAAI,UAAU,GAA6C,IAAI,CAAC;AAChE,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,8EAA8E;IAC9E,yDAAyD;IACzD,IAAI,UAAU,IAAI,GAAG,GAAG,UAAU,CAAC,EAAE,GAAG,IAAI;QAAE,OAAO,UAAU,CAAC,EAAE,CAAC;IACnE,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"net-utils.js","sourceRoot":"","sources":["../src/net-utils.ts"],"names":[],"mappings":"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"}
|