@pouchy_ai/companion-sdk 0.63.0 → 0.63.1
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 +22 -0
- package/README.md +3 -1
- package/dist/adapter-core.d.ts.map +1 -1
- package/dist/adapter-core.js +29 -10
- package/dist/adapter-core.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter-core.ts +30 -10
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `@pouchy_ai/companion-sdk` are documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.63.1]
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- **The view controller (`createCompanionView`, and so the `/svelte` and `/vue`
|
|
10
|
+
adapters) no longer strands a failed turn's half-streamed reply.** Only
|
|
11
|
+
`onMessage` or a `reset` delta cleared `draft` and `typing`, and neither
|
|
12
|
+
arrives after a failure — so a `done {ok:false}` after some deltas, or a
|
|
13
|
+
stream that dropped mid-reply, left the partial reply and the typing
|
|
14
|
+
indicator on screen with the user's line already rolled back above it. A
|
|
15
|
+
rejected `sendText` now clears both, unless another send from the same view
|
|
16
|
+
is still in flight: a 409 `turn_pending` rejects WHILE the turn it lost to is
|
|
17
|
+
streaming, and that draft is live.
|
|
18
|
+
- **`reply_timeout` and `needs_event_stream` no longer roll back the user's
|
|
19
|
+
line.** Both mean the POST was accepted (the SDK's own offline queue already
|
|
20
|
+
reads them that way), so the reply can still land through `onMessage` — and
|
|
21
|
+
it used to land under no question. `queued_offline` keeps the line as before.
|
|
22
|
+
A code-less status-0 network failure is ambiguous (the send may or may not
|
|
23
|
+
have reached the server) and still rolls back, unchanged. If your host
|
|
24
|
+
re-appended the user's text itself on those two codes to work around the
|
|
25
|
+
rollback, drop that, or the line shows twice.
|
|
26
|
+
|
|
5
27
|
## [0.63.0]
|
|
6
28
|
|
|
7
29
|
### Added
|
package/README.md
CHANGED
|
@@ -76,7 +76,9 @@ Thin, logic-free bindings over one shared view controller
|
|
|
76
76
|
(`createCompanionView`, also exported from the root for any other framework).
|
|
77
77
|
The view tracks `{ streamState, transcript, draft, typing, pendingConfirms }`
|
|
78
78
|
as immutable snapshots, wraps `sendText` (optimistic user turn — rolled back
|
|
79
|
-
if the send rejects, 0.32.1
|
|
79
|
+
if the send rejects, 0.32.1, except on `queued_offline` / `reply_timeout` /
|
|
80
|
+
`needs_event_stream`, where the text did not get lost; a rejected send also
|
|
81
|
+
clears its dead `draft` and `typing`, 0.63.1) and `confirmAction` (confirm-card bookkeeping;
|
|
80
82
|
a `confirm_resolved`/`confirm_not_found` rejection drops the stale card,
|
|
81
83
|
since a confirm can be resolved elsewhere — hosted page or an IM keyword
|
|
82
84
|
reply), and can restore recent history with `{ restore: N }`. **You own the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-core.d.ts","sourceRoot":"","sources":["../src/adapter-core.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,KAAK,EAAE,qBAAqB,EAAiB,MAAM,YAAY,CAAC;AAGvE;;gFAEgF;AAChF,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;CACX;AAED;2EAC2E;AAC3E,MAAM,WAAW,qBAAqB;IACrC,WAAW,EAAE,oBAAoB,CAAC;IAClC,mEAAmE;IACnE,UAAU,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAChD,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB;;qDAEiD;IACjD,eAAe,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAClD;;qEAEiE;IACjE,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACpC,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;2BAKuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC7B,iEAAiE;IACjE,WAAW,IAAI,qBAAqB,CAAC;IACrC,0DAA0D;IAC1D,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,kEAAkE;IAClE,QAAQ,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAC/C,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3C;qEACiE;IACjE,aAAa,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAC7B,UAAU,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC;IAChD;;4BAEwB;IACxB,OAAO,IAAI,IAAI,CAAC;IAChB,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;CACjC;AAID;2EAC2E;AAC3E,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,eAAe,EACvB,IAAI,CAAC,EAAE,oBAAoB,GACzB,aAAa,
|
|
1
|
+
{"version":3,"file":"adapter-core.d.ts","sourceRoot":"","sources":["../src/adapter-core.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,KAAK,EAAE,qBAAqB,EAAiB,MAAM,YAAY,CAAC;AAGvE;;gFAEgF;AAChF,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;CACX;AAED;2EAC2E;AAC3E,MAAM,WAAW,qBAAqB;IACrC,WAAW,EAAE,oBAAoB,CAAC;IAClC,mEAAmE;IACnE,UAAU,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAChD,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB;;qDAEiD;IACjD,eAAe,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAClD;;qEAEiE;IACjE,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACpC,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;2BAKuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC7B,iEAAiE;IACjE,WAAW,IAAI,qBAAqB,CAAC;IACrC,0DAA0D;IAC1D,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,kEAAkE;IAClE,QAAQ,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAC/C,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3C;qEACiE;IACjE,aAAa,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAC7B,UAAU,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC;IAChD;;4BAEwB;IACxB,OAAO,IAAI,IAAI,CAAC;IAChB,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;CACjC;AAID;2EAC2E;AAC3E,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,eAAe,EACvB,IAAI,CAAC,EAAE,oBAAoB,GACzB,aAAa,CA0Kf"}
|
package/dist/adapter-core.js
CHANGED
|
@@ -21,6 +21,8 @@ export function createCompanionView(client, opts) {
|
|
|
21
21
|
const cap = Math.max(1, opts?.transcriptCap ?? DEFAULT_TRANSCRIPT_CAP);
|
|
22
22
|
const listeners = new Set();
|
|
23
23
|
let disposed = false;
|
|
24
|
+
/** sendText calls from this view not yet settled (0.63.1). */
|
|
25
|
+
let inFlight = 0;
|
|
24
26
|
let snapshot = Object.freeze({
|
|
25
27
|
streamState: client.streamState,
|
|
26
28
|
transcript: Object.freeze([]),
|
|
@@ -110,21 +112,38 @@ export function createCompanionView(client, opts) {
|
|
|
110
112
|
async sendText(text, sendOpts) {
|
|
111
113
|
const entry = { role: 'user', text, at: Date.now() };
|
|
112
114
|
appendTranscript(entry);
|
|
115
|
+
inFlight++;
|
|
113
116
|
try {
|
|
114
|
-
|
|
117
|
+
const res = await client.sendText(text, sendOpts);
|
|
118
|
+
inFlight--;
|
|
119
|
+
return res;
|
|
115
120
|
}
|
|
116
121
|
catch (err) {
|
|
122
|
+
inFlight--;
|
|
117
123
|
// The optimistic line must not survive a send the server never saw
|
|
118
124
|
// (network drop / 429 turn-claim) — roll it back by identity so the
|
|
119
|
-
// host's retry re-appends cleanly (0.32.1). The
|
|
120
|
-
// `queued_offline` (0.34.0
|
|
121
|
-
// replayed on reconnect
|
|
122
|
-
// `{ queued: true }` shape
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
// host's retry re-appends cleanly (0.32.1). The exceptions are the
|
|
126
|
+
// codes that say the text is NOT lost: `queued_offline` (0.34.0 —
|
|
127
|
+
// queued, replayed on reconnect, mirroring the resolved
|
|
128
|
+
// `{ queued: true }` shape), and `reply_timeout` /
|
|
129
|
+
// `needs_event_stream` (0.63.1 — the POST was accepted, so the reply
|
|
130
|
+
// can still land through onMessage; rolling the line back left that
|
|
131
|
+
// reply under no question).
|
|
132
|
+
const lineStands = err instanceof CompanionError &&
|
|
133
|
+
(err.code === 'queued_offline' ||
|
|
134
|
+
err.code === 'reply_timeout' ||
|
|
135
|
+
err.code === 'needs_event_stream');
|
|
136
|
+
// A failed turn's half-streamed draft and typing flag are dead: only
|
|
137
|
+
// onMessage or a `reset` delta used to clear them, and neither comes
|
|
138
|
+
// after a failure (0.63.1). Cleared only when no other send from this
|
|
139
|
+
// view is still in flight — a 409 `turn_pending` rejects WHILE the
|
|
140
|
+
// turn it lost to is streaming, and that draft is live.
|
|
141
|
+
commit({
|
|
142
|
+
...(lineStands
|
|
143
|
+
? {}
|
|
144
|
+
: { transcript: Object.freeze(snapshot.transcript.filter((e) => e !== entry)) }),
|
|
145
|
+
...(inFlight === 0 ? { draft: '', typing: false } : {})
|
|
146
|
+
});
|
|
128
147
|
throw err;
|
|
129
148
|
}
|
|
130
149
|
},
|
package/dist/adapter-core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-core.js","sourceRoot":"","sources":["../src/adapter-core.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAC9E,6EAA6E;AAC7E,0EAA0E;AAC1E,8EAA8E;AAC9E,+EAA+E;AAC/E,kEAAkE;AAClE,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,0EAA0E;AAC1E,6EAA6E;AAC7E,SAAS;AAKT,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAoE1C,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC;2EAC2E;AAC3E,MAAM,UAAU,mBAAmB,CAClC,MAAuB,EACvB,IAA2B;IAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,IAAI,sBAAsB,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IACxC,IAAI,QAAQ,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter-core.js","sourceRoot":"","sources":["../src/adapter-core.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAC9E,6EAA6E;AAC7E,0EAA0E;AAC1E,8EAA8E;AAC9E,+EAA+E;AAC/E,kEAAkE;AAClE,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,0EAA0E;AAC1E,6EAA6E;AAC7E,SAAS;AAKT,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAoE1C,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC;2EAC2E;AAC3E,MAAM,UAAU,mBAAmB,CAClC,MAAuB,EACvB,IAA2B;IAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,IAAI,sBAAsB,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IACxC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,8DAA8D;IAC9D,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,IAAI,QAAQ,GAA0B,MAAM,CAAC,MAAM,CAAC;QACnD,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAwC;QACpE,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,KAAK;QACb,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAqC;QACtE,yEAAyE;QACzE,0EAA0E;QAC1E,MAAM,EAAE,OAAO,MAAM,CAAC,aAAa,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KACtF,CAAC,CAAC;IAEH,SAAS,MAAM,CAAC,KAAqC;QACpD,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACpD,sEAAsE;QACtE,sEAAsE;QACtE,6EAA6E;QAC7E,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACJ,CAAC,EAAE,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACR,gDAAgD;YACjD,CAAC;QACF,CAAC;IACF,CAAC;IAED,SAAS,gBAAgB,CAAC,KAA+B;QACxD,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC;IACnC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACjB,KAAK,MAAM;aACT,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aAC3B,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,0DAA0D;YAC1D,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM;gBAAE,OAAO;YACnD,MAAM,QAAQ,GAA+B,EAAE,CAAC;YAChD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,CAAC,IAAI;oBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpE,IAAI,CAAC,CAAC,SAAS;oBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpF,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM;gBAAE,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACX,+CAA+C;QAChD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAsB;QACjC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAA0B,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,SAAS,CAAC,CAAC,IAAY,EAAE,EAAE;YACjC,sEAAsE;YACtE,4CAA4C;YAC5C,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,WAAoB,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC5F,MAAM,CAAC;gBACN,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC3C,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,KAAK;aACb,CAAC,CAAC;QACJ,CAAC,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,IAAyB,EAAE,EAAE;YAC3D,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;QAChE,CAAC,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAsB,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACjF,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAA8B,EAAE,EAAE;YAC1D,sEAAsE;YACtE,IAAI,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC;gBAAE,OAAO;YACpF,MAAM,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QACpF,CAAC,CAAC;QACF,wDAAwD;QACxD,GAAG,CAAC,OAAO,MAAM,CAAC,cAAc,KAAK,UAAU;YAC9C,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtE,CAAC,CAAC,EAAE,CAAC;KACN,CAAC;IAEF,OAAO;QACN,MAAM;QACN,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ;QAC3B,SAAS,CAAC,QAAoB;YAC7B,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ;YAC5B,MAAM,KAAK,GAA6B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC/E,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACxB,QAAQ,EAAE,CAAC;YACX,IAAI,CAAC;gBACJ,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAiB,CAAC,CAAC;gBAC3D,QAAQ,EAAE,CAAC;gBACX,OAAO,GAAG,CAAC;YACZ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,QAAQ,EAAE,CAAC;gBACX,mEAAmE;gBACnE,oEAAoE;gBACpE,mEAAmE;gBACnE,kEAAkE;gBAClE,wDAAwD;gBACxD,mDAAmD;gBACnD,qEAAqE;gBACrE,oEAAoE;gBACpE,4BAA4B;gBAC5B,MAAM,UAAU,GACf,GAAG,YAAY,cAAc;oBAC7B,CAAC,GAAG,CAAC,IAAI,KAAK,gBAAgB;wBAC7B,GAAG,CAAC,IAAI,KAAK,eAAe;wBAC5B,GAAG,CAAC,IAAI,KAAK,oBAAoB,CAAC,CAAC;gBACrC,qEAAqE;gBACrE,qEAAqE;gBACrE,sEAAsE;gBACtE,mEAAmE;gBACnE,wDAAwD;gBACxD,MAAM,CAAC;oBACN,GAAG,CAAC,UAAU;wBACb,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;oBACjF,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACvD,CAAC,CAAC;gBACH,MAAM,GAAG,CAAC;YACX,CAAC;QACF,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW;YAClD,IAAI,GAAG,CAAC;YACR,IAAI,CAAC;gBACJ,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YACnE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,kEAAkE;gBAClE,oEAAoE;gBACpE,mEAAmE;gBACnE,+DAA+D;gBAC/D,qEAAqE;gBACrE,IACC,GAAG,YAAY,cAAc;oBAC7B,CAAC,GAAG,CAAC,IAAI,KAAK,kBAAkB,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,CAAC,EACpE,CAAC;oBACF,MAAM,CAAC;wBACN,eAAe,EAAE,MAAM,CAAC,MAAM,CAC7B,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CACjE;qBACD,CAAC,CAAC;gBACJ,CAAC;gBACD,MAAM,GAAG,CAAC;YACX,CAAC;YACD,yEAAyE;YACzE,uEAAuE;YACvE,+DAA+D;YAC/D,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,aAAa,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtD,MAAM,CAAC;oBACN,eAAe,EAAE,MAAM,CAAC,MAAM,CAC7B,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CACjE;iBACD,CAAC,CAAC;YACJ,CAAC;YACD,OAAO,GAAG,CAAC;QACZ,CAAC;QACD,OAAO;YACN,IAAI,QAAQ;gBAAE,OAAO;YACrB,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,CAAC,EAAE,CAAC;YAC5B,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,QAAQ,GAAG,IAAI,CAAC;QACjB,CAAC;KACD,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pouchy_ai/companion-sdk",
|
|
3
|
-
"version": "0.63.
|
|
3
|
+
"version": "0.63.1",
|
|
4
4
|
"description": "Embed the Pouchy companion \u2014 chat, voice, tools, memory, live world-state, instant UI, and agent-to-agent messaging \u2014 in any app, game, or site.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
package/src/adapter-core.ts
CHANGED
|
@@ -96,6 +96,8 @@ export function createCompanionView(
|
|
|
96
96
|
const cap = Math.max(1, opts?.transcriptCap ?? DEFAULT_TRANSCRIPT_CAP);
|
|
97
97
|
const listeners = new Set<() => void>();
|
|
98
98
|
let disposed = false;
|
|
99
|
+
/** sendText calls from this view not yet settled (0.63.1). */
|
|
100
|
+
let inFlight = 0;
|
|
99
101
|
|
|
100
102
|
let snapshot: CompanionViewSnapshot = Object.freeze({
|
|
101
103
|
streamState: client.streamState,
|
|
@@ -184,20 +186,38 @@ export function createCompanionView(
|
|
|
184
186
|
async sendText(text, sendOpts) {
|
|
185
187
|
const entry: CompanionTranscriptEntry = { role: 'user', text, at: Date.now() };
|
|
186
188
|
appendTranscript(entry);
|
|
189
|
+
inFlight++;
|
|
187
190
|
try {
|
|
188
|
-
|
|
191
|
+
const res = await client.sendText(text, sendOpts as never);
|
|
192
|
+
inFlight--;
|
|
193
|
+
return res;
|
|
189
194
|
} catch (err) {
|
|
195
|
+
inFlight--;
|
|
190
196
|
// The optimistic line must not survive a send the server never saw
|
|
191
197
|
// (network drop / 429 turn-claim) — roll it back by identity so the
|
|
192
|
-
// host's retry re-appends cleanly (0.32.1). The
|
|
193
|
-
// `queued_offline` (0.34.0
|
|
194
|
-
// replayed on reconnect
|
|
195
|
-
// `{ queued: true }` shape
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
198
|
+
// host's retry re-appends cleanly (0.32.1). The exceptions are the
|
|
199
|
+
// codes that say the text is NOT lost: `queued_offline` (0.34.0 —
|
|
200
|
+
// queued, replayed on reconnect, mirroring the resolved
|
|
201
|
+
// `{ queued: true }` shape), and `reply_timeout` /
|
|
202
|
+
// `needs_event_stream` (0.63.1 — the POST was accepted, so the reply
|
|
203
|
+
// can still land through onMessage; rolling the line back left that
|
|
204
|
+
// reply under no question).
|
|
205
|
+
const lineStands =
|
|
206
|
+
err instanceof CompanionError &&
|
|
207
|
+
(err.code === 'queued_offline' ||
|
|
208
|
+
err.code === 'reply_timeout' ||
|
|
209
|
+
err.code === 'needs_event_stream');
|
|
210
|
+
// A failed turn's half-streamed draft and typing flag are dead: only
|
|
211
|
+
// onMessage or a `reset` delta used to clear them, and neither comes
|
|
212
|
+
// after a failure (0.63.1). Cleared only when no other send from this
|
|
213
|
+
// view is still in flight — a 409 `turn_pending` rejects WHILE the
|
|
214
|
+
// turn it lost to is streaming, and that draft is live.
|
|
215
|
+
commit({
|
|
216
|
+
...(lineStands
|
|
217
|
+
? {}
|
|
218
|
+
: { transcript: Object.freeze(snapshot.transcript.filter((e) => e !== entry)) }),
|
|
219
|
+
...(inFlight === 0 ? { draft: '', typing: false } : {})
|
|
220
|
+
});
|
|
201
221
|
throw err;
|
|
202
222
|
}
|
|
203
223
|
},
|