@agentdeck/bridge 1.0.24 → 1.2.0
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/README.md +14 -6
- package/assets/fonts/NOTICE-PocketSansWorld.md +10 -0
- package/assets/fonts/OFL-PocketSansWorld.txt +93 -0
- package/assets/fonts/PocketSansWorld_12.cpfont +0 -0
- package/assets/fonts/pocket-sans-world.manifest.json +49 -0
- package/assets/learning/LICENSE-CC-BY-SA-4.0.txt +10 -0
- package/assets/learning/NOTICE.md +33 -0
- package/assets/learning/jp-n3-ko.manifest.json +27 -0
- package/assets/learning/jp-n3-ko.pdl +0 -0
- package/dist/adapters/openclaw.d.ts +74 -4
- package/dist/adapters/openclaw.d.ts.map +1 -1
- package/dist/adapters/openclaw.js +235 -43
- package/dist/adapters/openclaw.js.map +1 -1
- package/dist/agent-cli-diagnostics.d.ts +20 -0
- package/dist/agent-cli-diagnostics.d.ts.map +1 -0
- package/dist/agent-cli-diagnostics.js +100 -0
- package/dist/agent-cli-diagnostics.js.map +1 -0
- package/dist/apme/adapters/openclaw-hook.d.ts +38 -10
- package/dist/apme/adapters/openclaw-hook.d.ts.map +1 -1
- package/dist/apme/adapters/openclaw-hook.js +181 -37
- package/dist/apme/adapters/openclaw-hook.js.map +1 -1
- package/dist/apme/collector.d.ts +55 -2
- package/dist/apme/collector.d.ts.map +1 -1
- package/dist/apme/collector.js +324 -37
- package/dist/apme/collector.js.map +1 -1
- package/dist/apme/dashboard-html.d.ts.map +1 -1
- package/dist/apme/dashboard-html.js +275 -35
- package/dist/apme/dashboard-html.js.map +1 -1
- package/dist/apme/http.d.ts.map +1 -1
- package/dist/apme/http.js +33 -5
- package/dist/apme/http.js.map +1 -1
- package/dist/apme/index.d.ts.map +1 -1
- package/dist/apme/index.js +6 -2
- package/dist/apme/index.js.map +1 -1
- package/dist/apme/pareto.d.ts +2 -1
- package/dist/apme/pareto.d.ts.map +1 -1
- package/dist/apme/pareto.js +15 -4
- package/dist/apme/pareto.js.map +1 -1
- package/dist/apme/recommend.d.ts +24 -1
- package/dist/apme/recommend.d.ts.map +1 -1
- package/dist/apme/recommend.js +43 -7
- package/dist/apme/recommend.js.map +1 -1
- package/dist/apme/store.d.ts +47 -1
- package/dist/apme/store.d.ts.map +1 -1
- package/dist/apme/store.js +397 -99
- package/dist/apme/store.js.map +1 -1
- package/dist/bridge-core.d.ts +25 -1
- package/dist/bridge-core.d.ts.map +1 -1
- package/dist/bridge-core.js +50 -9
- package/dist/bridge-core.js.map +1 -1
- package/dist/card-feed.d.ts +46 -1
- package/dist/card-feed.d.ts.map +1 -1
- package/dist/card-feed.js +166 -6
- package/dist/card-feed.js.map +1 -1
- package/dist/cli.d.ts +56 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +442 -34
- package/dist/cli.js.map +1 -1
- package/dist/codex-rate-limits-live.d.ts +180 -10
- package/dist/codex-rate-limits-live.d.ts.map +1 -1
- package/dist/codex-rate-limits-live.js +475 -22
- package/dist/codex-rate-limits-live.js.map +1 -1
- package/dist/daemon-build-identity.d.ts +124 -0
- package/dist/daemon-build-identity.d.ts.map +1 -0
- package/dist/daemon-build-identity.js +310 -0
- package/dist/daemon-build-identity.js.map +1 -0
- package/dist/daemon-server.d.ts +34 -6
- package/dist/daemon-server.d.ts.map +1 -1
- package/dist/daemon-server.js +876 -109
- package/dist/daemon-server.js.map +1 -1
- package/dist/daemon-takeover.d.ts +11 -0
- package/dist/daemon-takeover.d.ts.map +1 -1
- package/dist/daemon-takeover.js +62 -17
- package/dist/daemon-takeover.js.map +1 -1
- package/dist/daemon-ws-client.d.ts +1 -0
- package/dist/daemon-ws-client.d.ts.map +1 -1
- package/dist/daemon-ws-client.js +25 -16
- package/dist/daemon-ws-client.js.map +1 -1
- package/dist/daemon.js +1 -1
- package/dist/daemon.js.map +1 -1
- package/dist/esp32-serial.d.ts +18 -0
- package/dist/esp32-serial.d.ts.map +1 -1
- package/dist/esp32-serial.js +23 -1
- package/dist/esp32-serial.js.map +1 -1
- package/dist/font-pack.d.ts +15 -0
- package/dist/font-pack.d.ts.map +1 -0
- package/dist/font-pack.js +75 -0
- package/dist/font-pack.js.map +1 -0
- package/dist/glance-frame.d.ts.map +1 -1
- package/dist/glance-frame.js +5 -1
- package/dist/glance-frame.js.map +1 -1
- package/dist/hook-codex-sessions.d.ts +3 -1
- package/dist/hook-codex-sessions.d.ts.map +1 -1
- package/dist/hook-codex-sessions.js +27 -7
- package/dist/hook-codex-sessions.js.map +1 -1
- package/dist/http-auth-gate.d.ts.map +1 -1
- package/dist/http-auth-gate.js +9 -1
- package/dist/http-auth-gate.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/learning-pack.d.ts +24 -0
- package/dist/learning-pack.d.ts.map +1 -0
- package/dist/learning-pack.js +125 -0
- package/dist/learning-pack.js.map +1 -0
- package/dist/legacy-rearm-ledger.d.ts +56 -0
- package/dist/legacy-rearm-ledger.d.ts.map +1 -0
- package/dist/legacy-rearm-ledger.js +66 -0
- package/dist/legacy-rearm-ledger.js.map +1 -0
- package/dist/mdns.d.ts +33 -0
- package/dist/mdns.d.ts.map +1 -1
- package/dist/mdns.js +92 -3
- package/dist/mdns.js.map +1 -1
- package/dist/openclaw-session.d.ts.map +1 -1
- package/dist/openclaw-session.js +13 -0
- package/dist/openclaw-session.js.map +1 -1
- package/dist/openclaw-timeline-feed.d.ts +84 -0
- package/dist/openclaw-timeline-feed.d.ts.map +1 -0
- package/dist/openclaw-timeline-feed.js +162 -0
- package/dist/openclaw-timeline-feed.js.map +1 -0
- package/dist/openclaw-transcript-timeline.d.ts +103 -0
- package/dist/openclaw-transcript-timeline.d.ts.map +1 -0
- package/dist/openclaw-transcript-timeline.js +328 -0
- package/dist/openclaw-transcript-timeline.js.map +1 -0
- package/dist/pairing-knocks.d.ts +80 -0
- package/dist/pairing-knocks.d.ts.map +1 -0
- package/dist/pairing-knocks.js +312 -0
- package/dist/pairing-knocks.js.map +1 -0
- package/dist/passive-observer.d.ts +21 -1
- package/dist/passive-observer.d.ts.map +1 -1
- package/dist/passive-observer.js +37 -3
- package/dist/passive-observer.js.map +1 -1
- package/dist/pixoo/micro-glyphs.d.ts +4 -0
- package/dist/pixoo/micro-glyphs.d.ts.map +1 -1
- package/dist/pixoo/micro-glyphs.js +29 -0
- package/dist/pixoo/micro-glyphs.js.map +1 -1
- package/dist/pixoo/pixoo-font.d.ts.map +1 -1
- package/dist/pixoo/pixoo-font.js +3 -1
- package/dist/pixoo/pixoo-font.js.map +1 -1
- package/dist/pixoo/pixoo-renderer.d.ts +1 -1
- package/dist/pixoo/pixoo-renderer.d.ts.map +1 -1
- package/dist/pixoo/pixoo-renderer.js +17 -2
- package/dist/pixoo/pixoo-renderer.js.map +1 -1
- package/dist/pty-manager.d.ts +9 -0
- package/dist/pty-manager.d.ts.map +1 -1
- package/dist/pty-manager.js +63 -4
- package/dist/pty-manager.js.map +1 -1
- package/dist/relayed-usage.d.ts +98 -0
- package/dist/relayed-usage.d.ts.map +1 -0
- package/dist/relayed-usage.js +103 -0
- package/dist/relayed-usage.js.map +1 -0
- package/dist/session-aggregator.d.ts +3 -0
- package/dist/session-aggregator.d.ts.map +1 -1
- package/dist/session-aggregator.js.map +1 -1
- package/dist/session-registry.d.ts +1 -0
- package/dist/session-registry.d.ts.map +1 -1
- package/dist/surface-protocol.d.ts +84 -0
- package/dist/surface-protocol.d.ts.map +1 -0
- package/dist/surface-protocol.js +237 -0
- package/dist/surface-protocol.js.map +1 -0
- package/dist/timeline-store.d.ts +1 -1
- package/dist/timeline-store.d.ts.map +1 -1
- package/dist/timeline-store.js +16 -1
- package/dist/timeline-store.js.map +1 -1
- package/dist/tui/dashboard.d.ts.map +1 -1
- package/dist/tui/dashboard.js +8 -1
- package/dist/tui/dashboard.js.map +1 -1
- package/dist/tui/renderer.d.ts.map +1 -1
- package/dist/tui/renderer.js +35 -0
- package/dist/tui/renderer.js.map +1 -1
- package/dist/weather-config.d.ts +17 -0
- package/dist/weather-config.d.ts.map +1 -0
- package/dist/weather-config.js +54 -0
- package/dist/weather-config.js.map +1 -0
- package/dist/weather.d.ts +44 -4
- package/dist/weather.d.ts.map +1 -1
- package/dist/weather.js +223 -15
- package/dist/weather.js.map +1 -1
- package/dist/ws-server.d.ts +18 -0
- package/dist/ws-server.d.ts.map +1 -1
- package/dist/ws-server.js +95 -7
- package/dist/ws-server.js.map +1 -1
- package/fm-helper/AgentDeckFMHelper.swift +51 -5
- package/package.json +4 -3
- package/src/timebox/sync_ble.py +35 -16
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { mergeRelayedSessionUsage } from './usage-event.js';
|
|
2
|
+
import { pickBestCodexRateLimits } from './codex-rate-limits-live.js';
|
|
3
|
+
/**
|
|
4
|
+
* Decide what the daemon broadcasts when a session bridge relays a
|
|
5
|
+
* `usage_update`, and keep that decision out of the callback it used to be
|
|
6
|
+
* inlined in.
|
|
7
|
+
*
|
|
8
|
+
* A session bridge broadcasts usage on EVERY state change. In daemon-first mode
|
|
9
|
+
* its snapshot usually has no model context, so the Claude quota model gate
|
|
10
|
+
* (`isClaudeSubscriptionModel`) yields no percents and the event carries
|
|
11
|
+
* `usageStale=true`. Forwarding that bare event verbatim clobbered the daemon's
|
|
12
|
+
* own authoritative aggregate on the dashboard: the Claude gauge blanked to
|
|
13
|
+
* "No usage data" on every state tick (the Codex gauge, which ignores global
|
|
14
|
+
* staleness, stayed put — hence the Claude-only flicker).
|
|
15
|
+
*
|
|
16
|
+
* Suppressing the relay instead is NOT an option: `usage_update` is the ONLY
|
|
17
|
+
* carrier of per-session tokens / cost / duration (`state_update` has none of
|
|
18
|
+
* those fields), and the daemon's own `buildUsage()` reads a UsageTracker that
|
|
19
|
+
* no PTY ever feeds, so its session half is zeros. Dropping the event would
|
|
20
|
+
* blank the session numbers for every focus that legitimately carries no Claude
|
|
21
|
+
* quota — Codex, OpenCode, API billing.
|
|
22
|
+
*
|
|
23
|
+
* So the event is split by HALF, not by event: the ACCOUNT half (quota, scoped
|
|
24
|
+
* caps, extra usage, subscriptions, Codex/Ollama, `usageStale`) comes from the
|
|
25
|
+
* daemon's authoritative aggregate, the SESSION half from the relay.
|
|
26
|
+
*
|
|
27
|
+
* ## Why the Claude-bearing branch is not just the same merge
|
|
28
|
+
*
|
|
29
|
+
* When the relay carries Claude percentages the event already holds the account
|
|
30
|
+
* half the merge exists to protect, so it goes out as-is — except for
|
|
31
|
+
* `codexRateLimits`, which is the one account-half field a session bridge
|
|
32
|
+
* cannot compute as well as the daemon. A bridge keeps host processes off by
|
|
33
|
+
* design, so it has only the passive rollout read; the daemon additionally
|
|
34
|
+
* holds a throttled `codex app-server` reading. They agree whenever a
|
|
35
|
+
* plan-matching rollout exists. When none does, the daemon holds a live
|
|
36
|
+
* snapshot with real windows while the bridge holds a mismatched one that
|
|
37
|
+
* `normalizeCodexRateLimits` voids to a windowless block — and successive
|
|
38
|
+
* events then alternated between a real Codex window and a voided one, which
|
|
39
|
+
* reads as a flickering/blanking Codex gauge on every surface (issue #253).
|
|
40
|
+
*
|
|
41
|
+
* The two blocks are RECONCILED rather than one overwriting the other, by the
|
|
42
|
+
* same `pickBestCodexRateLimits` rule the daemon already applies to its own two
|
|
43
|
+
* readings. Both inputs arrive already normalized against the same `auth.json`
|
|
44
|
+
* by their own producer, so no account tier is read here: voiding has already
|
|
45
|
+
* stripped `capturedAt` from a mismatched block, which is exactly what makes it
|
|
46
|
+
* lose to a stamped one under plan-agnostic newest-wins. That matters in both
|
|
47
|
+
* directions — the daemon's block is normally the better one, but a bridge that
|
|
48
|
+
* just read a newer rollout than the daemon's last build still wins on recency.
|
|
49
|
+
*
|
|
50
|
+
* Recency rules WITHIN a limit family, not across one, and this call site is
|
|
51
|
+
* where that distinction bites hardest. A bridge has only the passive read, so
|
|
52
|
+
* once the account's weekly quota is exhausted its block is the per-model pool
|
|
53
|
+
* wearing the account's `limit_id` — and always seconds old, because the rollout
|
|
54
|
+
* is appended every couple of seconds while Codex works. So a cross-family
|
|
55
|
+
* disagreement is resolved toward the daemon's block rather than by age.
|
|
56
|
+
*
|
|
57
|
+
* But only when the daemon actually HAS that answer. `lastBuiltCodexRateLimits`
|
|
58
|
+
* is the daemon's last published value, which is the app-server reading only
|
|
59
|
+
* when it won its own pick — a daemon whose PATH carries no `codex` binary holds
|
|
60
|
+
* nothing but a rollout read, exactly like the bridge. Deciding a cross-family
|
|
61
|
+
* disagreement between two rollout reads by which process is holding one is not
|
|
62
|
+
* a rule, and with the roles reversed (the daemon on the mislabelled pool line,
|
|
63
|
+
* the bridge on the account line) it would invert the fix it exists to deliver.
|
|
64
|
+
* So `ownLiveFamilyAuthorityExpiresAtMs` gates the guard — an instant, judged
|
|
65
|
+
* against this event's clock, because the flag is produced by a usage build and
|
|
66
|
+
* consumed here later; without it the tie falls back to recency as before. A second bound applies whenever the guard does fire: a
|
|
67
|
+
* block with no weekly window — the synthetic credit gauge, a voided snapshot —
|
|
68
|
+
* can never reject anything, so a windowless block cannot displace a windowed
|
|
69
|
+
* one. Inside one family nothing changes: the fresher rollout still wins.
|
|
70
|
+
*
|
|
71
|
+
* ## Why `buildOwnUsage` is a thunk
|
|
72
|
+
*
|
|
73
|
+
* `BridgeCore.buildUsage()` is the call that arms the throttled `codex
|
|
74
|
+
* app-server` spawn gate and re-derives the whole account half. It must run on
|
|
75
|
+
* the merged branch only — the Claude-bearing branch is the daemon's most
|
|
76
|
+
* flicker-sensitive path, and its entire history is about not clobbering the
|
|
77
|
+
* dashboard. Passing it as a thunk puts that in the signature instead of in a
|
|
78
|
+
* comment, so a test can assert it was never called.
|
|
79
|
+
*
|
|
80
|
+
* `ownCodexRateLimits` is the block from the daemon's own last built usage
|
|
81
|
+
* event — a remembered value, never a fresh build, so reading it costs nothing
|
|
82
|
+
* and cannot arm the spawn. Null before the daemon has built one, in which case
|
|
83
|
+
* the relayed block stands, which is the pre-#253 behaviour.
|
|
84
|
+
*/
|
|
85
|
+
export function resolveRelayedUsageEvent(input) {
|
|
86
|
+
const { relayed, ownCodexRateLimits, ownLiveFamilyAuthorityExpiresAtMs = null, nowMs = Date.now(), buildOwnUsage, } = input;
|
|
87
|
+
const hasClaudeData = relayed.fiveHourPercent != null || relayed.sevenDayPercent != null;
|
|
88
|
+
if (!hasClaudeData) {
|
|
89
|
+
return mergeRelayedSessionUsage(buildOwnUsage(), relayed);
|
|
90
|
+
}
|
|
91
|
+
const relayedCodex = (relayed.codexRateLimits ?? null);
|
|
92
|
+
const best = pickBestCodexRateLimits(relayedCodex, ownCodexRateLimits, undefined, nowMs, {
|
|
93
|
+
liveOwnsFamilyAuthority: ownLiveFamilyAuthorityExpiresAtMs != null && nowMs < ownLiveFamilyAuthorityExpiresAtMs,
|
|
94
|
+
});
|
|
95
|
+
// Identity, not deep-equality: the picker returns one of its two arguments, so
|
|
96
|
+
// an unchanged pick must leave the relayed event object untouched — including
|
|
97
|
+
// an absent `codexRateLimits` key, which under retain-on-absent merging is
|
|
98
|
+
// "no information" and must not become an explicit `undefined`.
|
|
99
|
+
if (best === relayedCodex)
|
|
100
|
+
return relayed;
|
|
101
|
+
return { ...relayed, codexRateLimits: best ?? undefined };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=relayed-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relayed-usage.js","sourceRoot":"","sources":["../src/relayed-usage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiFG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAaxC;IACC,MAAM,EACJ,OAAO,EACP,kBAAkB,EAClB,iCAAiC,GAAG,IAAI,EACxC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,EAClB,aAAa,GACd,GAAG,KAAK,CAAC;IAEV,MAAM,aAAa,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,IAAI,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC;IACzF,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,wBAAwB,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,eAAe,IAAI,IAAI,CAA2B,CAAC;IACjF,MAAM,IAAI,GAAG,uBAAuB,CAAC,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,EAAE;QACvF,uBAAuB,EACrB,iCAAiC,IAAI,IAAI,IAAI,KAAK,GAAG,iCAAiC;KACzF,CAAC,CAAC;IACH,+EAA+E;IAC/E,8EAA8E;IAC9E,2EAA2E;IAC3E,gEAAgE;IAChE,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,OAAgC,CAAC;IACnE,OAAO,EAAE,GAAI,OAAiC,EAAE,eAAe,EAAE,IAAI,IAAI,SAAS,EAAE,CAAC;AACvF,CAAC"}
|
|
@@ -25,6 +25,9 @@ export interface EnrichedSession {
|
|
|
25
25
|
contextPercent?: number;
|
|
26
26
|
totalTokens?: number;
|
|
27
27
|
question?: string;
|
|
28
|
+
/** Supporting lines under `question` (reason approval is required, cwd,
|
|
29
|
+
* originating session key). Mirrors `SessionInfo.questionDetail`. */
|
|
30
|
+
questionDetail?: string;
|
|
28
31
|
requestId?: string;
|
|
29
32
|
promptType?: 'yes_no' | 'yes_no_always' | 'multi_select' | 'diff_review';
|
|
30
33
|
options?: PromptOption[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-aggregator.d.ts","sourceRoot":"","sources":["../src/session-aggregator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wGAAwG;IACxG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,QAAQ,GAAG,eAAe,GAAG,cAAc,GAAG,aAAa,CAAC;IACzE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB;;kFAE8E;IAC9E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kHAAkH;IAClH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;yFACqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;6EAEyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;oFAEgF;IAChF,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAaD,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAIzI;AAED,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAUhJ;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAG9D;AAoBD;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,YAAY,EAAE,EACxB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,eAAe,EAAE,CAAC,CA2C5B;AAED;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,eAAe,EAAE,CAAC,CAI5B"}
|
|
1
|
+
{"version":3,"file":"session-aggregator.d.ts","sourceRoot":"","sources":["../src/session-aggregator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-aggregator.js","sourceRoot":"","sources":["../src/session-aggregator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,kBAAkB,EAAqB,MAAM,uBAAuB,CAAC;AAE5F,OAAO,EACL,YAAY,EACZ,qBAAqB,GAGtB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-aggregator.js","sourceRoot":"","sources":["../src/session-aggregator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export declare const SURFACE_PROTOCOL_MAJOR: 1;
|
|
2
|
+
export declare const PORTABLE_READER_PROFILE: "portable-reader/v1";
|
|
3
|
+
export declare const OTA_RESUME_PARTIAL_CAPABILITY: "ota.resume-206";
|
|
4
|
+
export declare const AGENTDECK_FIRMWARE_PRODUCT_ID: "dev.agentdeck.dashboard-firmware";
|
|
5
|
+
export declare const POCKET_DAILY_PRODUCT_ID: "io.pocketdaily.reader";
|
|
6
|
+
export declare const SURFACE_SERVER_VERSION: string;
|
|
7
|
+
declare const PROFILE_CAPABILITIES: {
|
|
8
|
+
readonly 'dashboard-live/v1': Set<string>;
|
|
9
|
+
readonly 'companion-control/v1': Set<string>;
|
|
10
|
+
readonly "portable-reader/v1": Set<string>;
|
|
11
|
+
readonly 'display-only/v1': Set<string>;
|
|
12
|
+
};
|
|
13
|
+
export type SurfaceProfileId = keyof typeof PROFILE_CAPABILITIES;
|
|
14
|
+
export interface SurfaceIdentity {
|
|
15
|
+
protocol: 1;
|
|
16
|
+
profile: SurfaceProfileId;
|
|
17
|
+
clientId: string;
|
|
18
|
+
clientVersion: string;
|
|
19
|
+
productId: string;
|
|
20
|
+
capabilities: string[];
|
|
21
|
+
board: string;
|
|
22
|
+
updateChannel: string;
|
|
23
|
+
}
|
|
24
|
+
export interface SurfaceOffer {
|
|
25
|
+
protocol?: unknown;
|
|
26
|
+
clientId?: unknown;
|
|
27
|
+
clientVersion?: unknown;
|
|
28
|
+
productId?: unknown;
|
|
29
|
+
profiles?: unknown;
|
|
30
|
+
}
|
|
31
|
+
export interface SurfaceWelcome {
|
|
32
|
+
type: 'surface_welcome';
|
|
33
|
+
protocol: 1;
|
|
34
|
+
profile: SurfaceProfileId;
|
|
35
|
+
capabilities: string[];
|
|
36
|
+
serverVersion: string;
|
|
37
|
+
}
|
|
38
|
+
export interface SurfaceNegotiation {
|
|
39
|
+
clientId: string;
|
|
40
|
+
clientVersion: string;
|
|
41
|
+
productId: string;
|
|
42
|
+
profile: SurfaceProfileId;
|
|
43
|
+
capabilities: string[];
|
|
44
|
+
welcome: SurfaceWelcome;
|
|
45
|
+
}
|
|
46
|
+
export declare class SurfaceProtocolError extends Error {
|
|
47
|
+
readonly status: number;
|
|
48
|
+
readonly code: string;
|
|
49
|
+
constructor(status: number, code: string, message: string);
|
|
50
|
+
}
|
|
51
|
+
type HeaderRecord = Record<string, string | string[] | undefined>;
|
|
52
|
+
export interface SurfaceOtaIdentity {
|
|
53
|
+
productId: string;
|
|
54
|
+
board: string;
|
|
55
|
+
updateChannel: string;
|
|
56
|
+
}
|
|
57
|
+
/** Validate an OTA namespace independently of an HTTP request. Staging and
|
|
58
|
+
* serving both call this so a product-aware image can never fall back to a
|
|
59
|
+
* board-only namespace. */
|
|
60
|
+
export declare function validateSurfaceOtaIdentity(identity: SurfaceOtaIdentity): SurfaceOtaIdentity;
|
|
61
|
+
/** Parse the all-or-nothing HTTP Surface declaration. No Surface headers is
|
|
62
|
+
* the legacy baseline; one or more headers means all eight must be valid. */
|
|
63
|
+
export declare function parseHttpSurfaceIdentity(headers: HeaderRecord, requiredCapability?: string): SurfaceIdentity | undefined;
|
|
64
|
+
/** Select the resumable OTA response shape without guessing from a client
|
|
65
|
+
* version. Legacy clients append `?from=` bodies but only accept status 200;
|
|
66
|
+
* negotiated clients explicitly opt into the standard 206 response. */
|
|
67
|
+
export declare function pullOtaResponseStatus(from: number, identity: Pick<SurfaceIdentity, 'capabilities'> | undefined): 200 | 206;
|
|
68
|
+
/** A product-aware request may repeat the tuple in the query, but repetition
|
|
69
|
+
* is correlation, not override: every supplied member must match the headers. */
|
|
70
|
+
export declare function validateSurfaceQueryTuple(identity: SurfaceIdentity, params: URLSearchParams): void;
|
|
71
|
+
export declare function negotiateSurface(offer: SurfaceOffer): SurfaceNegotiation;
|
|
72
|
+
export declare function surfaceErrorBody(error: SurfaceProtocolError): {
|
|
73
|
+
error: string;
|
|
74
|
+
message: string;
|
|
75
|
+
};
|
|
76
|
+
export declare function isPortableReaderProfile(profile: string | undefined): boolean;
|
|
77
|
+
/** Public WS event boundary for a negotiated profile. The portable profile is
|
|
78
|
+
* deliberately pull-first and does not inherit private dashboard broadcasts. */
|
|
79
|
+
export declare function surfaceAllowsEvent(profile: SurfaceProfileId, eventType: string): boolean;
|
|
80
|
+
/** Additive projection switch: negotiated headers are preferred, while the
|
|
81
|
+
* historical query remains valid for old Pocket builds. */
|
|
82
|
+
export declare function usesPortableReaderProjection(identity: SurfaceIdentity | undefined, params: URLSearchParams): boolean;
|
|
83
|
+
export {};
|
|
84
|
+
//# sourceMappingURL=surface-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-protocol.d.ts","sourceRoot":"","sources":["../src/surface-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { ESP32_BOARDS } from '@agentdeck/shared';
|
|
3
|
+
export const SURFACE_PROTOCOL_MAJOR = 1;
|
|
4
|
+
export const PORTABLE_READER_PROFILE = 'portable-reader/v1';
|
|
5
|
+
export const OTA_RESUME_PARTIAL_CAPABILITY = 'ota.resume-206';
|
|
6
|
+
export const AGENTDECK_FIRMWARE_PRODUCT_ID = 'dev.agentdeck.dashboard-firmware';
|
|
7
|
+
export const POCKET_DAILY_PRODUCT_ID = 'io.pocketdaily.reader';
|
|
8
|
+
const packageJson = createRequire(import.meta.url)('../package.json');
|
|
9
|
+
export const SURFACE_SERVER_VERSION = packageJson.version;
|
|
10
|
+
const PROFILE_CAPABILITIES = {
|
|
11
|
+
'dashboard-live/v1': new Set([
|
|
12
|
+
'sessions.read', 'usage.read', 'timeline.read', 'display-state.read',
|
|
13
|
+
]),
|
|
14
|
+
'companion-control/v1': new Set([
|
|
15
|
+
'sessions.read', 'usage.read', 'session.focus', 'permission.decide',
|
|
16
|
+
'prompt.select', 'session.prompt', 'session.interrupt', 'session.escape', 'review.run',
|
|
17
|
+
]),
|
|
18
|
+
[PORTABLE_READER_PROFILE]: new Set([
|
|
19
|
+
'feed.pull', 'feed.conditional', 'outbox.push', 'glance.read',
|
|
20
|
+
'weather.snapshot.read', 'weather.cues.display', 'weather.cues.notify',
|
|
21
|
+
'learning.pack.read', 'learning.pack.update',
|
|
22
|
+
'font.pack.read', 'font.pack.update',
|
|
23
|
+
'ota.feed', OTA_RESUME_PARTIAL_CAPABILITY, 'device.telemetry',
|
|
24
|
+
// Deliberately no inbox.ws until the public invalidation runtime exists.
|
|
25
|
+
]),
|
|
26
|
+
'display-only/v1': new Set([
|
|
27
|
+
'sessions.read', 'usage.read', 'timeline.read', 'display-state.read',
|
|
28
|
+
]),
|
|
29
|
+
};
|
|
30
|
+
const PRODUCT_RULES = {
|
|
31
|
+
[POCKET_DAILY_PRODUCT_ID]: {
|
|
32
|
+
profiles: new Set([PORTABLE_READER_PROFILE]),
|
|
33
|
+
boards: new Set(['xteink_x3', 'xteink_x4']),
|
|
34
|
+
channels: new Set(['stable']),
|
|
35
|
+
},
|
|
36
|
+
[AGENTDECK_FIRMWARE_PRODUCT_ID]: {
|
|
37
|
+
profiles: new Set([PORTABLE_READER_PROFILE]),
|
|
38
|
+
boards: new Set(ESP32_BOARDS.map((board) => board.id)),
|
|
39
|
+
channels: new Set(['stable']),
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
const HEADER_NAMES = {
|
|
43
|
+
protocol: 'agentdeck-surface-protocol',
|
|
44
|
+
profile: 'agentdeck-surface-profile',
|
|
45
|
+
clientId: 'agentdeck-client-id',
|
|
46
|
+
clientVersion: 'agentdeck-client-version',
|
|
47
|
+
productId: 'agentdeck-product-id',
|
|
48
|
+
capabilities: 'agentdeck-capabilities',
|
|
49
|
+
board: 'agentdeck-board',
|
|
50
|
+
updateChannel: 'agentdeck-update-channel',
|
|
51
|
+
};
|
|
52
|
+
export class SurfaceProtocolError extends Error {
|
|
53
|
+
status;
|
|
54
|
+
code;
|
|
55
|
+
constructor(status, code, message) {
|
|
56
|
+
super(message);
|
|
57
|
+
this.status = status;
|
|
58
|
+
this.code = code;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function header(headers, name) {
|
|
62
|
+
const raw = headers[name];
|
|
63
|
+
if (Array.isArray(raw))
|
|
64
|
+
return raw.length === 1 ? raw[0]?.trim() : undefined;
|
|
65
|
+
return typeof raw === 'string' ? raw.trim() : undefined;
|
|
66
|
+
}
|
|
67
|
+
function boundedToken(value, label, max = 128) {
|
|
68
|
+
if (!value || value.length > max || !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value)) {
|
|
69
|
+
throw new SurfaceProtocolError(400, 'surface_identity_invalid', `${label} is malformed`);
|
|
70
|
+
}
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
function knownProfile(value) {
|
|
74
|
+
if (!Object.prototype.hasOwnProperty.call(PROFILE_CAPABILITIES, value)) {
|
|
75
|
+
throw new SurfaceProtocolError(406, 'surface_profile_unsupported', `Surface profile "${value}" is not supported`);
|
|
76
|
+
}
|
|
77
|
+
return value;
|
|
78
|
+
}
|
|
79
|
+
function capabilityIntersection(profile, offered) {
|
|
80
|
+
if (!Array.isArray(offered))
|
|
81
|
+
return [];
|
|
82
|
+
const known = PROFILE_CAPABILITIES[profile];
|
|
83
|
+
const out = [];
|
|
84
|
+
for (const value of offered) {
|
|
85
|
+
if (typeof value !== 'string' || !known.has(value) || out.includes(value))
|
|
86
|
+
continue;
|
|
87
|
+
out.push(value);
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
function validateProductTuple(identity) {
|
|
92
|
+
const rule = PRODUCT_RULES[identity.productId];
|
|
93
|
+
if (!rule) {
|
|
94
|
+
throw new SurfaceProtocolError(422, 'surface_product_unsupported', `Surface product "${identity.productId}" is not registered`);
|
|
95
|
+
}
|
|
96
|
+
if (!rule.profiles.has(identity.profile)) {
|
|
97
|
+
throw new SurfaceProtocolError(409, 'surface_product_profile_mismatch', 'Surface product and profile do not match');
|
|
98
|
+
}
|
|
99
|
+
if (rule.boards !== '*' && !rule.boards.has(identity.board)) {
|
|
100
|
+
throw new SurfaceProtocolError(409, 'surface_product_board_mismatch', 'Surface product and board do not match');
|
|
101
|
+
}
|
|
102
|
+
if (!rule.channels.has(identity.updateChannel)) {
|
|
103
|
+
throw new SurfaceProtocolError(409, 'surface_product_channel_mismatch', 'Surface product and update channel do not match');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** Validate an OTA namespace independently of an HTTP request. Staging and
|
|
107
|
+
* serving both call this so a product-aware image can never fall back to a
|
|
108
|
+
* board-only namespace. */
|
|
109
|
+
export function validateSurfaceOtaIdentity(identity) {
|
|
110
|
+
const bounded = {
|
|
111
|
+
productId: boundedToken(identity.productId, 'productId'),
|
|
112
|
+
board: boundedToken(identity.board, 'board', 96),
|
|
113
|
+
updateChannel: boundedToken(identity.updateChannel, 'updateChannel', 48),
|
|
114
|
+
};
|
|
115
|
+
validateProductTuple({ ...bounded, profile: PORTABLE_READER_PROFILE });
|
|
116
|
+
return bounded;
|
|
117
|
+
}
|
|
118
|
+
/** Parse the all-or-nothing HTTP Surface declaration. No Surface headers is
|
|
119
|
+
* the legacy baseline; one or more headers means all eight must be valid. */
|
|
120
|
+
export function parseHttpSurfaceIdentity(headers, requiredCapability) {
|
|
121
|
+
const values = Object.fromEntries(Object.entries(HEADER_NAMES).map(([key, name]) => [key, header(headers, name)]));
|
|
122
|
+
const present = Object.values(values).filter((value) => value !== undefined).length;
|
|
123
|
+
if (present === 0)
|
|
124
|
+
return undefined;
|
|
125
|
+
if (present !== Object.keys(HEADER_NAMES).length) {
|
|
126
|
+
throw new SurfaceProtocolError(400, 'surface_identity_incomplete', 'All eight AgentDeck Surface identity headers are required');
|
|
127
|
+
}
|
|
128
|
+
if (values.protocol !== String(SURFACE_PROTOCOL_MAJOR)) {
|
|
129
|
+
throw new SurfaceProtocolError(426, 'surface_protocol_unsupported', `Surface protocol ${values.protocol} is not supported`);
|
|
130
|
+
}
|
|
131
|
+
const profile = knownProfile(values.profile);
|
|
132
|
+
if (profile !== PORTABLE_READER_PROFILE) {
|
|
133
|
+
throw new SurfaceProtocolError(406, 'surface_profile_route_mismatch', 'This HTTP route requires portable-reader/v1');
|
|
134
|
+
}
|
|
135
|
+
const offeredCapabilities = values.capabilities.split(',').map((value) => value.trim()).filter(Boolean);
|
|
136
|
+
const capabilities = capabilityIntersection(profile, offeredCapabilities);
|
|
137
|
+
if (requiredCapability && !capabilities.includes(requiredCapability)) {
|
|
138
|
+
throw new SurfaceProtocolError(403, 'surface_capability_required', `Capability "${requiredCapability}" was not granted`);
|
|
139
|
+
}
|
|
140
|
+
const identity = {
|
|
141
|
+
protocol: SURFACE_PROTOCOL_MAJOR,
|
|
142
|
+
profile,
|
|
143
|
+
clientId: boundedToken(values.clientId, 'AgentDeck-Client-Id'),
|
|
144
|
+
clientVersion: boundedToken(values.clientVersion, 'AgentDeck-Client-Version', 96),
|
|
145
|
+
productId: boundedToken(values.productId, 'AgentDeck-Product-Id'),
|
|
146
|
+
capabilities,
|
|
147
|
+
board: boundedToken(values.board, 'AgentDeck-Board', 96),
|
|
148
|
+
updateChannel: boundedToken(values.updateChannel, 'AgentDeck-Update-Channel', 48),
|
|
149
|
+
};
|
|
150
|
+
validateProductTuple(identity);
|
|
151
|
+
return identity;
|
|
152
|
+
}
|
|
153
|
+
/** Select the resumable OTA response shape without guessing from a client
|
|
154
|
+
* version. Legacy clients append `?from=` bodies but only accept status 200;
|
|
155
|
+
* negotiated clients explicitly opt into the standard 206 response. */
|
|
156
|
+
export function pullOtaResponseStatus(from, identity) {
|
|
157
|
+
return from > 0 && identity?.capabilities.includes(OTA_RESUME_PARTIAL_CAPABILITY) === true
|
|
158
|
+
? 206 : 200;
|
|
159
|
+
}
|
|
160
|
+
/** A product-aware request may repeat the tuple in the query, but repetition
|
|
161
|
+
* is correlation, not override: every supplied member must match the headers. */
|
|
162
|
+
export function validateSurfaceQueryTuple(identity, params) {
|
|
163
|
+
const query = {
|
|
164
|
+
productId: params.get('productId'),
|
|
165
|
+
board: params.get('board'),
|
|
166
|
+
updateChannel: params.get('updateChannel'),
|
|
167
|
+
};
|
|
168
|
+
for (const [field, value] of Object.entries(query)) {
|
|
169
|
+
if (value !== null && value !== identity[field]) {
|
|
170
|
+
throw new SurfaceProtocolError(409, 'surface_query_identity_mismatch', `Query ${field} does not match Surface identity`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
export function negotiateSurface(offer) {
|
|
175
|
+
if (offer.protocol !== SURFACE_PROTOCOL_MAJOR) {
|
|
176
|
+
throw new SurfaceProtocolError(426, 'surface_protocol_unsupported', `Surface protocol ${String(offer.protocol)} is not supported`);
|
|
177
|
+
}
|
|
178
|
+
const clientId = boundedToken(String(offer.clientId ?? ''), 'surface.clientId');
|
|
179
|
+
const clientVersion = boundedToken(String(offer.clientVersion ?? ''), 'surface.clientVersion', 96);
|
|
180
|
+
const productId = boundedToken(String(offer.productId ?? ''), 'surface.productId');
|
|
181
|
+
if (!Array.isArray(offer.profiles) || offer.profiles.length === 0) {
|
|
182
|
+
throw new SurfaceProtocolError(406, 'surface_profile_unsupported', 'At least one Surface profile offer is required');
|
|
183
|
+
}
|
|
184
|
+
let selected;
|
|
185
|
+
for (const raw of offer.profiles) {
|
|
186
|
+
if (!raw || typeof raw !== 'object')
|
|
187
|
+
continue;
|
|
188
|
+
const profile = raw;
|
|
189
|
+
if (typeof profile.id !== 'string' || !Object.prototype.hasOwnProperty.call(PROFILE_CAPABILITIES, profile.id))
|
|
190
|
+
continue;
|
|
191
|
+
const id = profile.id;
|
|
192
|
+
selected = { id, capabilities: capabilityIntersection(id, profile.capabilities) };
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
if (!selected) {
|
|
196
|
+
throw new SurfaceProtocolError(406, 'surface_profile_unsupported', 'No offered Surface profile is supported');
|
|
197
|
+
}
|
|
198
|
+
if (selected.id === PORTABLE_READER_PROFILE) {
|
|
199
|
+
const rule = PRODUCT_RULES[productId];
|
|
200
|
+
if (!rule || !rule.profiles.has(selected.id)) {
|
|
201
|
+
throw new SurfaceProtocolError(422, 'surface_product_unsupported', 'Portable-reader product is not registered');
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
clientId,
|
|
206
|
+
clientVersion,
|
|
207
|
+
productId,
|
|
208
|
+
profile: selected.id,
|
|
209
|
+
capabilities: selected.capabilities,
|
|
210
|
+
welcome: {
|
|
211
|
+
type: 'surface_welcome',
|
|
212
|
+
protocol: SURFACE_PROTOCOL_MAJOR,
|
|
213
|
+
profile: selected.id,
|
|
214
|
+
capabilities: selected.capabilities,
|
|
215
|
+
serverVersion: SURFACE_SERVER_VERSION,
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
export function surfaceErrorBody(error) {
|
|
220
|
+
return { error: error.code, message: error.message };
|
|
221
|
+
}
|
|
222
|
+
export function isPortableReaderProfile(profile) {
|
|
223
|
+
return profile === PORTABLE_READER_PROFILE;
|
|
224
|
+
}
|
|
225
|
+
/** Public WS event boundary for a negotiated profile. The portable profile is
|
|
226
|
+
* deliberately pull-first and does not inherit private dashboard broadcasts. */
|
|
227
|
+
export function surfaceAllowsEvent(profile, eventType) {
|
|
228
|
+
if (profile !== PORTABLE_READER_PROFILE)
|
|
229
|
+
return true;
|
|
230
|
+
return eventType === 'surface_welcome' || eventType === 'connection' || eventType === 'device_info_request';
|
|
231
|
+
}
|
|
232
|
+
/** Additive projection switch: negotiated headers are preferred, while the
|
|
233
|
+
* historical query remains valid for old Pocket builds. */
|
|
234
|
+
export function usesPortableReaderProjection(identity, params) {
|
|
235
|
+
return identity !== undefined || params.get('surface') === 'pocket-reader';
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=surface-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-protocol.js","sourceRoot":"","sources":["../src/surface-protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/timeline-store.d.ts
CHANGED
|
@@ -105,7 +105,7 @@ export declare class BridgeTimelineStore {
|
|
|
105
105
|
/** Recent entries attributed to one session, for the `query_session_timeline`
|
|
106
106
|
* poll — lets a device that connects mid-session fill its Detail view. */
|
|
107
107
|
getHistoryForSession(sessionId: string, since?: number, limit?: number): TimelineEntry[];
|
|
108
|
-
updateEntryStatus(approvalId: string, status: 'approved' | 'denied'): void;
|
|
108
|
+
updateEntryStatus(approvalId: string, status: 'approved' | 'denied' | 'abandoned'): void;
|
|
109
109
|
/** Update existing entry with same ts+type (1s tolerance), or add new.
|
|
110
110
|
*
|
|
111
111
|
* Update path: the existing entry's session/task/run/project attribution
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline-store.d.ts","sourceRoot":"","sources":["../src/timeline-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AACtE;;;qEAGqE;AACrE,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,aAAa,CAAC;AA0B/D,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,UAAU,CAAgC;IAClD;;uCAEmC;IACnC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,KAAK,CAAS;IACtB;;8EAE0E;IAC1E,OAAO,CAAC,qBAAqB,CAAS;IAEtC,wBAAwB,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAI1C;;;+CAG2C;IAC3C,aAAa,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAI/C,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IA+D5E;;;;;wDAKoD;IACpD,OAAO,CAAC,QAAQ;
|
|
1
|
+
{"version":3,"file":"timeline-store.d.ts","sourceRoot":"","sources":["../src/timeline-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AACtE;;;qEAGqE;AACrE,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,aAAa,CAAC;AA0B/D,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,UAAU,CAAgC;IAClD;;uCAEmC;IACnC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,KAAK,CAAS;IACtB;;8EAE0E;IAC1E,OAAO,CAAC,qBAAqB,CAAS;IAEtC,wBAAwB,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAI1C;;;+CAG2C;IAC3C,aAAa,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAI/C,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IA+D5E;;;;;wDAKoD;IACpD,OAAO,CAAC,QAAQ;IAiEhB;;;;;;;;;;OAUG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrC,4DAA4D;IAC5D,OAAO,CAAC,eAAe;IAWvB;;;;;;;OAOG;IACH,YAAY,IAAI,IAAI;IAgBpB,yEAAyE;IACzE,eAAe,IAAI,IAAI;IAQvB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAO3C;;;;;OAKG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAiBvC,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAuB3C;;;;;;;;6EAQyE;IACzE,oBAAoB,IAAI,MAAM;IAwC9B;;;;;;;;;;;;;;;;eAgBW;IACX,oBAAoB,CAClB,OAAO,SAAc,EACrB,GAAG,SAAa,EAChB,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACnC,MAAM;IAsCT;+EAC2E;IAC3E,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,aAAa,EAAE;IAkBpF,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,IAAI;IASxF;;;;;;;;;;;oEAWgE;IAChE,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IA4D/E,gDAAgD;IAChD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAOhD,OAAO,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI;IAIhC,cAAc,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI;IAKvC,OAAO,CAAC,uBAAuB;CAiChC"}
|
package/dist/timeline-store.js
CHANGED
|
@@ -149,7 +149,22 @@ export class BridgeTimelineStore {
|
|
|
149
149
|
// fan-out sessions, so the dispatch row was always the first casualty and
|
|
150
150
|
// the completions below it read as unattached. Skip them here; they still
|
|
151
151
|
// FIFO out with everything else once the plain tool rows are gone.
|
|
152
|
-
|
|
152
|
+
//
|
|
153
|
+
// OpenClaw transcript rows are the second exception, for the same reason
|
|
154
|
+
// read the other way round. This rule targets the observed-agent hook
|
|
155
|
+
// firehose — one row per internal action, measured at 87% of a live buffer.
|
|
156
|
+
// OpenClaw's tool rows are neither hooks nor a firehose: the Gateway stream
|
|
157
|
+
// carries no tool calls at all, so they are read from OpenClaw's own
|
|
158
|
+
// transcript (`openclaw-timeline-feed.ts`) and are the ONLY account of what
|
|
159
|
+
// it did, deliberately bounded at the producer (recently-active sessions
|
|
160
|
+
// only, a dozen rows per session per tick, measured traffic 28 tool calls
|
|
161
|
+
// in 3 h). Shedding them first did not thin them — it deleted them
|
|
162
|
+
// outright: `addEntry` pushes then evicts, so on a full buffer an OpenClaw
|
|
163
|
+
// row was the only plain `tool_exec` present and therefore evicted ITSELF
|
|
164
|
+
// on insertion. Measured 2026-08-23 against a live daemon and reproduced at
|
|
165
|
+
// this store: the feed emitted its row, and the buffer never held one. They
|
|
166
|
+
// still FIFO out with everything else once the plain tool rows are gone.
|
|
167
|
+
const toolIdx = this.entries.findIndex((e) => e.type === 'tool_exec' && !e.subagentId && e.agentType !== 'openclaw');
|
|
153
168
|
if (toolIdx >= 0) {
|
|
154
169
|
this.entries.splice(toolIdx, 1);
|
|
155
170
|
return;
|