@pouchy_ai/companion-sdk 0.40.1 → 0.42.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/CHANGELOG.md CHANGED
@@ -12,6 +12,61 @@ a protocol bump is always called out explicitly here.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.42.0] - 2026-07-25
16
+
17
+ Additive: the Instant UI ⇄ Google A2UI v0.9 projection ships in the package.
18
+ No wire-protocol bump (`PROTOCOL_VERSION` stays 1); no existing export moved.
19
+
20
+ - **`toA2UI` / `fromA2UI`** — project an Instant UI panel (the
21
+ `companion.ui_action` `payload.interface`) losslessly to Google's A2UI v0.9
22
+ flat wire format and back, so a renderer built against the A2UI catalog can
23
+ draw Pouchy panels with the adapter in front. Previously the adapter lived
24
+ only in the app repo (`src/lib/genui/a2ui-adapter.ts`) and integrators had
25
+ to vendor the file; that path now delegates to this package. Concepts A2UI
26
+ has no standard slot for (Progress, Accordion, area/pie chart kinds,
27
+ `computed`, `when`, tones, etc.) ride a per-component `_pouchy` extension —
28
+ A2UI renderers ignore it; `fromA2UI` reconstructs the exact panel from it.
29
+ - **Instant UI panel types** — the strict panel/node type family
30
+ (`DynamicInterface`, `GenuiNode`, …) and the `INSTANT_UI_NODE_TYPES`
31
+ catalog (as data, for renderer capability checks) are exported alongside.
32
+ `toA2UI` accepts either the strict panel type or the loose
33
+ `payload.interface` exactly as `onRender` delivers it. Embedded Button /
34
+ table-row actions are typed as an opaque `EmbeddedAction { type }` — hosts
35
+ hand them back, never interpret them.
36
+ - **CDN bundle size** — the projection adds ~1.7KB gzip to the min bundle
37
+ (~15.7KB total) / ~3.2KB to the full one (~32.2KB); the size-gate budgets
38
+ were raised consciously (14→17KB min, 29→35KB full) per the gate's
39
+ contract.
40
+
41
+ ## [0.41.0] - 2026-07-25
42
+
43
+ Additive: call-window generation fencing + world-state replay observability.
44
+ No wire-protocol bump (`PROTOCOL_VERSION` stays 1); every new field is
45
+ optional and every change is backward compatible on both sides.
46
+
47
+ - **Call-window generation fencing (CR-142 legs c/d).** `POST /call` now
48
+ returns `callGen` — the generation handle of the 20-min call-active window
49
+ that mint stamped — and `endSession()` sends a `callGen` field so the
50
+ server can fence its window clear to the call that owns it:
51
+ - a **call teardown** (`connectCall` handle close / connect-phase failure)
52
+ carries the gen of **its own mint**, so a stale handle's late `/end`
53
+ landing after a fresh re-mint on the same session no-ops instead of
54
+ silencing the new call's voice injects for its lifetime;
55
+ - a **text client** that never minted a call sends `callGen: null`, so its
56
+ `close()` no longer kills a live call's window on the same session;
57
+ - an **omitted** field (every pre-0.41 SDK, gen-less REST callers) keeps
58
+ the 0.40.0 legacy contract: unconditional clear.
59
+ Self-plumbed integrations (raw `startCall` + own WebRTC): pass
60
+ `creds.callGen` to `endSession({ callGen })` at call end — `startCall`
61
+ also remembers it, so a plain `endSession()` from the same client does the
62
+ right thing. Against a pre-fencing server the SDK degrades safely (the
63
+ window self-expires ≤20 min, the pre-0.40 posture).
64
+ - **`sendWorldState` now returns `duplicates`** — how much of `accepted` was
65
+ the server's envelope-id replay dedup (idempotency shipped server-side
66
+ 2026-07-25). Stamp stable `id`s on host-level retries to get idempotent
67
+ re-sends; ids minted by the SDK are fresh per call, so only same-body
68
+ retries (e.g. the automatic 401-refresh replay) dedup by default.
69
+
15
70
  ## [0.40.1] - 2026-07-25
16
71
 
17
72
  Fixes (the 0.40.0 timeout class closed on every remaining long-work POST; a
package/README.md CHANGED
@@ -169,6 +169,20 @@ Reference renderers ship in [`examples/`](../../examples): `web-instant-ui` (van
169
169
  `native-instant-ui` (SwiftUI + Jetpack Compose), and `cli-skills` (terminal +
170
170
  local/device skills).
171
171
 
172
+ **Already have an [A2UI](https://github.com/google/A2UI)-catalog renderer?**
173
+ (0.42.0) `toA2UI(payload.interface)` projects any panel losslessly to Google's
174
+ A2UI v0.9 flat wire format (standard component/field names; Pouchy-only
175
+ concepts ride a `_pouchy` extension A2UI renderers ignore), and `fromA2UI`
176
+ ingests a surface back. `INSTANT_UI_NODE_TYPES` lists the atom catalog as data
177
+ for capability checks. Embedded Button / table-row actions are opaque
178
+ `EmbeddedAction { type }` values — hand them back to the companion, never
179
+ interpret them.
180
+
181
+ ```ts
182
+ import { toA2UI } from '@pouchy_ai/companion-sdk';
183
+ companion.onRender(({ interface: ui }) => myA2uiRenderer.render(toA2UI(ui)));
184
+ ```
185
+
172
186
  ## Client methods (beyond the quickstart)
173
187
 
174
188
  | Method | What it does |
@@ -181,9 +195,9 @@ local/device skills).
181
195
  | `ping()` | Keepalive for long-idle embeds. |
182
196
  | `setToken(token)` | Swap the bearer for every subsequent request + stream reconnect — session tokens expire (1h default), so call this when your backend re-mints one. Prefer the `onAuthError` constructor option to refresh on demand instead. |
183
197
  | `pendingConfirms()` / `confirmAction(id, approve)` | List / resolve pending sensitive-action confirms (platform session tokens). On `{ status: 'exec_failed', retryable: true }` you MAY re-call the same confirmId — idempotent actions only. |
184
- | `endSession()` | Distill the session into durable memory now; returns `{ skipped?: 'no_session' \| 'no_content' \| 'throttled' }`. |
198
+ | `endSession({ transcript?, callGen? })` | Distill the session into durable memory now; returns `{ skipped?: 'no_session' \| 'no_content' \| 'throttled' }`. Also closes the server's 20-min call-active window — **generation-fenced** since 0.41.0: it sends the `callGen` of the last call THIS client minted (`null` if none), so a text client's teardown never kills a live call's window on the same session, and a stale call handle's late `/end` can't clear a newer call's window. Self-plumbed calls: pass `startCall`'s `creds.callGen` here at call end. |
185
199
  | `close()` | One-call teardown: `stop()` + `endSession()` — the text-session mirror of the call handle's `close()`. |
186
- | `startCall(opts)` / `connectCall(opts)` | Voice plane: raw credentials / fully-wired call handle (`call.close()` ends + folds the transcript into memory). |
200
+ | `startCall(opts)` / `connectCall(opts)` | Voice plane: raw credentials / fully-wired call handle (`call.close()` ends + folds the transcript into memory). The mint stamps a 20-min server-side call-active window (routes `voiceRelevant` world-state into the live call) and returns its `callGen` fencing handle (0.41.0, see `endSession`). If `connectCall` throws AFTER a successful mint (mic denied, missing `@elevenlabs/client`, SDP failure — 0.40.1), it tears down like an instant hang-up first: `/end` closes the window, then the original error is rethrown. |
187
201
  | `streamState` / `onStreamStateChange(fn)` | Receive-stream lifecycle (0.30.0): `'idle' \| 'connecting' \| 'connected' \| 'reconnecting' \| 'degraded_sse' \| 'stopped'` (`CompanionStreamState`). `fn(state, prev)` fires on change only — drive a connection indicator; `degraded_sse` = the WS transport errored and delivery continues on the SSE fallback; `stopped` = `stop()`/`close()` or a permanent `stream_unauthorized` failure. |
188
202
  | `getAvatar()` / `brandIconUrl(size?)` | The user's avatar (VRM/portrait) and the Pouchy brand icon for your UI. Standalone (no client/token): `pouchyBrandIconUrl(baseUrl, size?)` derives the same URL before/without connecting. |
189
203
  | `getWallet()` | Read the instance's own wallet — `{ balances: [{ currency, amount }], totalUsd, currency }`. Read-only + receive-only; needs the `wallet.read` scope. |
package/dist/a2ui.d.ts ADDED
@@ -0,0 +1,216 @@
1
+ import type { RenderInterfacePayload } from './protocol.js';
2
+ export type StateValue = string | number | boolean;
3
+ /** A prop value that is either a literal or a live reference to a state key. */
4
+ export type ValueRef<T extends StateValue> = T | {
5
+ $state: string;
6
+ };
7
+ /** An action embedded in a Button / Table row — carried OPAQUELY through the
8
+ * projection (stuffed into the A2UI event context verbatim, restored on the
9
+ * way back). The app narrows it to its full AgentAction union; hosts treat it
10
+ * as data to hand back, never to interpret. */
11
+ export interface EmbeddedAction {
12
+ type: string;
13
+ }
14
+ export type GenuiTextTone = 'default' | 'muted' | 'strong';
15
+ export type GenuiButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger';
16
+ export type GenuiProgressVariant = 'default' | 'affection' | 'energy' | 'health' | 'tier';
17
+ export interface GenuiTextNode {
18
+ type: 'Text';
19
+ text?: string;
20
+ /** Template with `{key}` placeholders resolved against interface state. */
21
+ template?: string;
22
+ tone?: GenuiTextTone;
23
+ }
24
+ export interface GenuiButtonNode {
25
+ type: 'Button';
26
+ label: string;
27
+ variant?: GenuiButtonVariant;
28
+ action: EmbeddedAction | null;
29
+ }
30
+ export interface GenuiProgressNode {
31
+ type: 'Progress';
32
+ value: ValueRef<number>;
33
+ max?: number;
34
+ variant?: GenuiProgressVariant;
35
+ }
36
+ export interface GenuiIconNode {
37
+ type: 'Icon';
38
+ name: string;
39
+ size?: number;
40
+ }
41
+ export interface GenuiSliderNode {
42
+ type: 'Slider';
43
+ bind: string;
44
+ min?: number;
45
+ max?: number;
46
+ step?: number;
47
+ label?: string;
48
+ }
49
+ export interface GenuiSwitchNode {
50
+ type: 'Switch';
51
+ bind: string;
52
+ label?: string;
53
+ }
54
+ export interface GenuiSelectOption {
55
+ value: string;
56
+ label: string;
57
+ }
58
+ export interface GenuiSelectNode {
59
+ type: 'Select';
60
+ bind: string;
61
+ options: GenuiSelectOption[];
62
+ placeholder?: string;
63
+ }
64
+ export interface GenuiTextInputNode {
65
+ type: 'TextInput';
66
+ bind: string;
67
+ label?: string;
68
+ placeholder?: string;
69
+ multiline?: boolean;
70
+ maxLength?: number;
71
+ }
72
+ export type GenuiGroupDirection = 'row' | 'column';
73
+ export interface GenuiGroupNode {
74
+ type: 'Group';
75
+ direction: GenuiGroupDirection;
76
+ gap?: number;
77
+ wrap?: boolean;
78
+ children: GenuiNode[];
79
+ }
80
+ export interface GenuiImageNode {
81
+ type: 'Image';
82
+ src: string;
83
+ alt?: string;
84
+ ratio?: number;
85
+ }
86
+ export interface GenuiVideoNode {
87
+ type: 'Video';
88
+ src: string;
89
+ ratio?: number;
90
+ }
91
+ export interface GenuiAudioNode {
92
+ type: 'AudioPlayer';
93
+ src: string;
94
+ title?: string;
95
+ }
96
+ export interface GenuiMarkdownNode {
97
+ type: 'Markdown';
98
+ text: string;
99
+ }
100
+ export type GenuiChartKind = 'bar' | 'line' | 'area' | 'pie' | 'donut';
101
+ export interface GenuiChartDatum {
102
+ label?: string;
103
+ value: number;
104
+ }
105
+ export interface GenuiChartNode {
106
+ type: 'Chart';
107
+ chart: GenuiChartKind;
108
+ data: GenuiChartDatum[];
109
+ max?: number;
110
+ title?: string;
111
+ }
112
+ export interface GenuiTableNode {
113
+ type: 'Table';
114
+ columns: string[];
115
+ rows: string[][];
116
+ title?: string;
117
+ rowActions?: (EmbeddedAction | null)[];
118
+ }
119
+ export interface GenuiDatePickerNode {
120
+ type: 'DatePicker';
121
+ bind: string;
122
+ label?: string;
123
+ min?: string;
124
+ max?: string;
125
+ }
126
+ export interface GenuiWhen {
127
+ key: string;
128
+ equals?: StateValue;
129
+ truthy?: boolean;
130
+ }
131
+ export interface GenuiTab {
132
+ label: string;
133
+ children: GenuiNode[];
134
+ }
135
+ export interface GenuiTabsNode {
136
+ type: 'Tabs';
137
+ tabs: GenuiTab[];
138
+ bind?: string;
139
+ }
140
+ export interface GenuiAccordionSection {
141
+ label: string;
142
+ children: GenuiNode[];
143
+ open?: boolean;
144
+ }
145
+ export interface GenuiAccordionNode {
146
+ type: 'Accordion';
147
+ sections: GenuiAccordionSection[];
148
+ multi?: boolean;
149
+ }
150
+ export interface GenuiDividerNode {
151
+ type: 'Divider';
152
+ }
153
+ export interface GenuiCardNode {
154
+ type: 'Card';
155
+ title?: string;
156
+ children: GenuiNode[];
157
+ }
158
+ export type GenuiNode = (GenuiTextNode | GenuiButtonNode | GenuiProgressNode | GenuiIconNode | GenuiSliderNode | GenuiSwitchNode | GenuiSelectNode | GenuiTextInputNode | GenuiGroupNode | GenuiImageNode | GenuiChartNode | GenuiTableNode | GenuiDatePickerNode | GenuiTabsNode | GenuiAccordionNode | GenuiDividerNode | GenuiCardNode | GenuiVideoNode | GenuiAudioNode | GenuiMarkdownNode) & {
159
+ when?: GenuiWhen;
160
+ };
161
+ export interface GenuiComputed {
162
+ op: 'mul' | 'add' | 'sub' | 'div';
163
+ args: (string | number)[];
164
+ round?: number;
165
+ }
166
+ /** The Instant UI panel — what `companion.ui_action` carries in
167
+ * `payload.interface` (typed strictly here; the event payload declares the
168
+ * loose wire shape). */
169
+ export interface DynamicInterface {
170
+ title?: string;
171
+ nodes: GenuiNode[];
172
+ state?: Record<string, StateValue>;
173
+ computed?: Record<string, GenuiComputed>;
174
+ reportChanges?: boolean;
175
+ allowedActions?: string[];
176
+ }
177
+ /** What `toA2UI` accepts: the strict panel type, or the loose
178
+ * `payload.interface` exactly as `onRender` delivers it (already validated
179
+ * and clamped server-side, so the structural cast inside is safe). */
180
+ export type InstantUIInput = DynamicInterface | RenderInterfacePayload['interface'];
181
+ /** The Instant UI node-type catalog, as data — drift-pinned against the app's
182
+ * canonical GENUI_NODE_SET so the mirror can never silently lag a new atom. */
183
+ export declare const INSTANT_UI_NODE_TYPES: readonly ["Text", "Button", "Progress", "Icon", "Slider", "Switch", "Select", "TextInput", "Group", "Image", "Chart", "Table", "DatePicker", "Tabs", "Accordion", "Divider", "Card", "Video", "AudioPlayer", "Markdown"];
184
+ /** A2UI binding: a literal, a JSON-Pointer data binding, or a function call. */
185
+ export type A2UIValue = StateValue | {
186
+ path: string;
187
+ } | {
188
+ call: string;
189
+ args?: unknown;
190
+ };
191
+ export interface A2UIComponent {
192
+ id: string;
193
+ /** A2UI component type, e.g. "Text" / "Button" / "Row" / "pouchy/Progress". */
194
+ component: string;
195
+ /** Standard A2UI property bag (component-specific; see the mapping per type). */
196
+ [key: string]: unknown;
197
+ /** Pouchy-only reconstruction data for concepts A2UI has no standard for.
198
+ * A2UI renderers ignore it; fromA2UI() uses it to rebuild the exact node. */
199
+ _pouchy?: Record<string, unknown>;
200
+ }
201
+ /** An A2UI surface = a flat component map + a root id + the data model. The
202
+ * `pouchy` block carries panel-level extensions A2UI has no slot for. */
203
+ export interface A2UISurface {
204
+ root: string;
205
+ components: Record<string, A2UIComponent>;
206
+ dataModel: Record<string, StateValue>;
207
+ pouchy?: {
208
+ title?: string;
209
+ computed?: Record<string, GenuiComputed>;
210
+ reportChanges?: boolean;
211
+ allowedActions?: string[];
212
+ };
213
+ }
214
+ export declare function toA2UI(input: InstantUIInput): A2UISurface;
215
+ export declare function fromA2UI(surface: A2UISurface): DynamicInterface;
216
+ //# sourceMappingURL=a2ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2ui.d.ts","sourceRoot":"","sources":["../src/a2ui.ts"],"names":[],"mappings":"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"}