@pellux/goodvibes-sdk 0.18.48 → 0.18.50
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 +15 -13
- package/dist/_internal/errors/index.d.ts +111 -0
- package/dist/_internal/errors/index.d.ts.map +1 -1
- package/dist/_internal/errors/index.js +128 -0
- package/dist/_internal/platform/auth/index.d.ts +6 -0
- package/dist/_internal/platform/auth/index.d.ts.map +1 -0
- package/dist/_internal/platform/auth/index.js +4 -0
- package/dist/_internal/platform/auth/oauth-client.d.ts +45 -0
- package/dist/_internal/platform/auth/oauth-client.d.ts.map +1 -0
- package/dist/_internal/platform/auth/oauth-client.js +45 -0
- package/dist/_internal/platform/auth/permission-resolver.d.ts +35 -0
- package/dist/_internal/platform/auth/permission-resolver.d.ts.map +1 -0
- package/dist/_internal/platform/auth/permission-resolver.js +57 -0
- package/dist/_internal/platform/auth/session-manager.d.ts +31 -0
- package/dist/_internal/platform/auth/session-manager.d.ts.map +1 -0
- package/dist/_internal/platform/auth/session-manager.js +44 -0
- package/dist/_internal/platform/auth/token-store.d.ts +23 -0
- package/dist/_internal/platform/auth/token-store.d.ts.map +1 -0
- package/dist/_internal/platform/auth/token-store.js +34 -0
- package/dist/_internal/platform/core/orchestrator.d.ts +75 -11
- package/dist/_internal/platform/core/orchestrator.d.ts.map +1 -1
- package/dist/_internal/platform/core/orchestrator.js +29 -8
- package/dist/_internal/platform/version.js +1 -1
- package/dist/_internal/transport-http/http-core.d.ts +2 -0
- package/dist/_internal/transport-http/http-core.d.ts.map +1 -1
- package/dist/_internal/transport-http/http-core.js +29 -2
- package/dist/_internal/transport-http/http.d.ts.map +1 -1
- package/dist/_internal/transport-http/http.js +50 -2
- package/dist/_internal/transport-realtime/domain-events.d.ts +26 -0
- package/dist/_internal/transport-realtime/domain-events.d.ts.map +1 -1
- package/dist/_internal/transport-realtime/domain-events.js +63 -0
- package/dist/_internal/transport-realtime/index.d.ts +2 -2
- package/dist/_internal/transport-realtime/index.d.ts.map +1 -1
- package/dist/_internal/transport-realtime/index.js +2 -2
- package/dist/_internal/transport-realtime/runtime-events.d.ts +27 -1
- package/dist/_internal/transport-realtime/runtime-events.d.ts.map +1 -1
- package/dist/_internal/transport-realtime/runtime-events.js +27 -0
- package/dist/auth.d.ts +77 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +52 -0
- package/dist/browser.d.ts +24 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +24 -0
- package/dist/client.d.ts +158 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +22 -0
- package/dist/expo.d.ts +15 -0
- package/dist/expo.d.ts.map +1 -1
- package/dist/expo.js +15 -0
- package/dist/node.d.ts +23 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +23 -0
- package/dist/react-native.d.ts +27 -0
- package/dist/react-native.d.ts.map +1 -1
- package/dist/react-native.js +27 -0
- package/dist/web.d.ts +13 -0
- package/dist/web.d.ts.map +1 -1
- package/dist/web.js +13 -0
- package/package.json +1 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TokenStore — Focused responsibility: token persistence.
|
|
3
|
+
*
|
|
4
|
+
* Owns all read/write/clear operations on a `GoodVibesTokenStore`. Consumers
|
|
5
|
+
* that only need token storage can interact with this class directly rather
|
|
6
|
+
* than going through the full auth client.
|
|
7
|
+
*/
|
|
8
|
+
import type { GoodVibesTokenStore } from '../../../auth.js';
|
|
9
|
+
export declare class TokenStore {
|
|
10
|
+
#private;
|
|
11
|
+
constructor(store: GoodVibesTokenStore);
|
|
12
|
+
/** Return the current token, or null if none is stored. */
|
|
13
|
+
getToken(): Promise<string | null>;
|
|
14
|
+
/** Persist a new token, or clear storage when null. */
|
|
15
|
+
setToken(token: string | null): Promise<void>;
|
|
16
|
+
/** Clear the stored token. */
|
|
17
|
+
clearToken(): Promise<void>;
|
|
18
|
+
/** Return true when a non-empty token is currently stored. */
|
|
19
|
+
hasToken(): Promise<boolean>;
|
|
20
|
+
/** Expose the underlying store for interop with existing consumers. */
|
|
21
|
+
get store(): GoodVibesTokenStore;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=token-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/auth/token-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,qBAAa,UAAU;;gBAGT,KAAK,EAAE,mBAAmB;IAItC,2DAA2D;IACrD,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,uDAAuD;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,8BAA8B;IACxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC,8DAA8D;IACxD,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAKlC,uEAAuE;IACvE,IAAI,KAAK,IAAI,mBAAmB,CAE/B;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TokenStore — Focused responsibility: token persistence.
|
|
3
|
+
*
|
|
4
|
+
* Owns all read/write/clear operations on a `GoodVibesTokenStore`. Consumers
|
|
5
|
+
* that only need token storage can interact with this class directly rather
|
|
6
|
+
* than going through the full auth client.
|
|
7
|
+
*/
|
|
8
|
+
export class TokenStore {
|
|
9
|
+
#store;
|
|
10
|
+
constructor(store) {
|
|
11
|
+
this.#store = store;
|
|
12
|
+
}
|
|
13
|
+
/** Return the current token, or null if none is stored. */
|
|
14
|
+
async getToken() {
|
|
15
|
+
return this.#store.getToken();
|
|
16
|
+
}
|
|
17
|
+
/** Persist a new token, or clear storage when null. */
|
|
18
|
+
async setToken(token) {
|
|
19
|
+
return this.#store.setToken(token);
|
|
20
|
+
}
|
|
21
|
+
/** Clear the stored token. */
|
|
22
|
+
async clearToken() {
|
|
23
|
+
return this.#store.clearToken();
|
|
24
|
+
}
|
|
25
|
+
/** Return true when a non-empty token is currently stored. */
|
|
26
|
+
async hasToken() {
|
|
27
|
+
const token = await this.#store.getToken();
|
|
28
|
+
return typeof token === 'string' && token.length > 0;
|
|
29
|
+
}
|
|
30
|
+
/** Expose the underlying store for interop with existing consumers. */
|
|
31
|
+
get store() {
|
|
32
|
+
return this.#store;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -17,18 +17,58 @@ interface HookDispatcherLike {
|
|
|
17
17
|
interface LowPrioritySystemMessageSink {
|
|
18
18
|
low(message: string): void;
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Options for constructing an {@link Orchestrator}.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const orchestrator = new Orchestrator({
|
|
26
|
+
* conversation,
|
|
27
|
+
* getViewportHeight: () => window.innerHeight,
|
|
28
|
+
* scrollToEnd: (vHeight) => scrollContainer.scrollTo({ top: vHeight }),
|
|
29
|
+
* toolRegistry,
|
|
30
|
+
* permissionManager,
|
|
31
|
+
* getSystemPrompt: () => mySystemPrompt,
|
|
32
|
+
* hookDispatcher,
|
|
33
|
+
* flagManager,
|
|
34
|
+
* requestRender: () => renderFn(),
|
|
35
|
+
* runtimeBus,
|
|
36
|
+
* services: { agentManager, wrfcController },
|
|
37
|
+
* });
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export interface OrchestratorOptions {
|
|
41
|
+
/** Manages the conversation message history. */
|
|
42
|
+
conversation: ConversationManager;
|
|
43
|
+
/** Returns the current viewport height in rows/px for scrolling calculations. */
|
|
44
|
+
getViewportHeight: () => number;
|
|
45
|
+
/** Scrolls the UI to the given viewport height after a turn. */
|
|
46
|
+
scrollToEnd: (vHeight: number) => void;
|
|
47
|
+
/** Registry of all available tools. */
|
|
48
|
+
toolRegistry: ToolRegistry;
|
|
49
|
+
/** Manages tool-use permission grants and denials. */
|
|
50
|
+
permissionManager: PermissionManager;
|
|
51
|
+
/** Returns the current system prompt text. Defaults to `() => ''`. */
|
|
52
|
+
getSystemPrompt?: () => string;
|
|
53
|
+
/** Optional hook dispatcher for lifecycle events. */
|
|
54
|
+
hookDispatcher?: HookDispatcherLike | null;
|
|
55
|
+
/** Optional feature flag manager. */
|
|
56
|
+
flagManager?: FeatureFlagManager | null;
|
|
57
|
+
/** Optional render request callback, called after state changes requiring a redraw. */
|
|
58
|
+
requestRender?: (() => void) | null;
|
|
59
|
+
/** Optional runtime event bus for cross-system event propagation. */
|
|
60
|
+
runtimeBus?: RuntimeEventBus | null;
|
|
61
|
+
/** Required runtime service dependencies. */
|
|
62
|
+
services: {
|
|
63
|
+
readonly agentManager: Pick<AgentManager, 'list' | 'spawn'>;
|
|
64
|
+
readonly wrfcController: Pick<WrfcController, 'listChains'>;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
20
67
|
/**
|
|
21
68
|
* Orchestrator - Manages LLM turn lifecycle with full tool-use loop.
|
|
22
69
|
* Supports multi-turn agent loops: call LLM -> execute tools -> send results -> repeat.
|
|
23
70
|
*/
|
|
24
71
|
export declare class Orchestrator {
|
|
25
|
-
private conversation;
|
|
26
|
-
private getViewportHeight;
|
|
27
|
-
private scrollToEnd;
|
|
28
|
-
private toolRegistry;
|
|
29
|
-
private permissionManager;
|
|
30
|
-
private getSystemPrompt;
|
|
31
|
-
private hookDispatcher;
|
|
32
72
|
isThinking: boolean;
|
|
33
73
|
thinkingFrame: number;
|
|
34
74
|
usage: {
|
|
@@ -113,10 +153,34 @@ export declare class Orchestrator {
|
|
|
113
153
|
private readonly requestRender;
|
|
114
154
|
private systemMessageRouter;
|
|
115
155
|
private readonly followUpRuntime;
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
156
|
+
private conversation;
|
|
157
|
+
private getViewportHeight;
|
|
158
|
+
private scrollToEnd;
|
|
159
|
+
private toolRegistry;
|
|
160
|
+
private permissionManager;
|
|
161
|
+
private getSystemPrompt;
|
|
162
|
+
private hookDispatcher;
|
|
163
|
+
/**
|
|
164
|
+
* Construct an Orchestrator using a named-options object.
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```ts
|
|
168
|
+
* const orchestrator = new Orchestrator({
|
|
169
|
+
* conversation,
|
|
170
|
+
* getViewportHeight: () => terminalRows,
|
|
171
|
+
* scrollToEnd: (vHeight) => ui.scrollToEnd(vHeight),
|
|
172
|
+
* toolRegistry,
|
|
173
|
+
* permissionManager,
|
|
174
|
+
* getSystemPrompt: () => systemPrompt,
|
|
175
|
+
* hookDispatcher,
|
|
176
|
+
* flagManager,
|
|
177
|
+
* requestRender: () => render(),
|
|
178
|
+
* runtimeBus,
|
|
179
|
+
* services: { agentManager, wrfcController },
|
|
180
|
+
* });
|
|
181
|
+
* ```
|
|
182
|
+
*/
|
|
183
|
+
constructor(options: OrchestratorOptions);
|
|
120
184
|
setCoreServices(services: OrchestratorCoreServices): void;
|
|
121
185
|
/**
|
|
122
186
|
* Attach an AcpManager and register the 'delegate' tool into the ToolRegistry.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/core/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAQpD,OAAO,EACL,KAAK,wBAAwB,EAC9B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAK9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAkBlE,OAAO,EASL,KAAK,wBAAwB,EAC9B,MAAM,2BAA2B,CAAC;AAQnC,iFAAiF;AACjF,UAAU,kBAAkB;IAC1B,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC7C;AAMD,UAAU,4BAA4B;IACpC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/core/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,13 +30,6 @@ const THINKING_SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦'
|
|
|
30
30
|
* Supports multi-turn agent loops: call LLM -> execute tools -> send results -> repeat.
|
|
31
31
|
*/
|
|
32
32
|
export class Orchestrator {
|
|
33
|
-
conversation;
|
|
34
|
-
getViewportHeight;
|
|
35
|
-
scrollToEnd;
|
|
36
|
-
toolRegistry;
|
|
37
|
-
permissionManager;
|
|
38
|
-
getSystemPrompt;
|
|
39
|
-
hookDispatcher;
|
|
40
33
|
isThinking = false;
|
|
41
34
|
thinkingFrame = 0;
|
|
42
35
|
usage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
|
|
@@ -113,7 +106,35 @@ export class Orchestrator {
|
|
|
113
106
|
requestRender;
|
|
114
107
|
systemMessageRouter = null;
|
|
115
108
|
followUpRuntime;
|
|
116
|
-
|
|
109
|
+
conversation;
|
|
110
|
+
getViewportHeight;
|
|
111
|
+
scrollToEnd;
|
|
112
|
+
toolRegistry;
|
|
113
|
+
permissionManager;
|
|
114
|
+
getSystemPrompt;
|
|
115
|
+
hookDispatcher;
|
|
116
|
+
/**
|
|
117
|
+
* Construct an Orchestrator using a named-options object.
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```ts
|
|
121
|
+
* const orchestrator = new Orchestrator({
|
|
122
|
+
* conversation,
|
|
123
|
+
* getViewportHeight: () => terminalRows,
|
|
124
|
+
* scrollToEnd: (vHeight) => ui.scrollToEnd(vHeight),
|
|
125
|
+
* toolRegistry,
|
|
126
|
+
* permissionManager,
|
|
127
|
+
* getSystemPrompt: () => systemPrompt,
|
|
128
|
+
* hookDispatcher,
|
|
129
|
+
* flagManager,
|
|
130
|
+
* requestRender: () => render(),
|
|
131
|
+
* runtimeBus,
|
|
132
|
+
* services: { agentManager, wrfcController },
|
|
133
|
+
* });
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
constructor(options) {
|
|
137
|
+
const { conversation, getViewportHeight, scrollToEnd, toolRegistry, permissionManager, getSystemPrompt = () => '', hookDispatcher = null, flagManager = null, requestRender = null, runtimeBus = null, services, } = options;
|
|
117
138
|
this.conversation = conversation;
|
|
118
139
|
this.getViewportHeight = getViewportHeight;
|
|
119
140
|
this.scrollToEnd = scrollToEnd;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
let version = '0.18.
|
|
3
|
+
let version = '0.18.50';
|
|
4
4
|
try {
|
|
5
5
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', '..', 'package.json'), 'utf-8'));
|
|
6
6
|
version = pkg.version ?? version;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-core.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-http/http-core.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5I,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAkC,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjF,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACrC,SAAS,SAAS,EAAE,CAAC;AAEzB,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAE/D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,eAAe,CAAC;CAC1C;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"http-core.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-http/http-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,16 +47,24 @@ function readErrorMessage(status, url, body) {
|
|
|
47
47
|
}
|
|
48
48
|
return `Transport request failed with status ${status} for ${url}`;
|
|
49
49
|
}
|
|
50
|
-
function createTransportError(status, url, method, body) {
|
|
50
|
+
function createTransportError(status, url, method, body, retryAfterMs) {
|
|
51
51
|
return Object.assign(new Error(readErrorMessage(status, url, body)), {
|
|
52
52
|
transport: {
|
|
53
53
|
status,
|
|
54
54
|
body,
|
|
55
55
|
url,
|
|
56
56
|
method,
|
|
57
|
+
...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
|
|
57
58
|
},
|
|
58
59
|
});
|
|
59
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Creates a transport error representing a network-level failure (no HTTP response received).
|
|
63
|
+
*
|
|
64
|
+
* Note: `Error.cause` (set via `Object.assign`) is the authoritative standard-compliant
|
|
65
|
+
* cause field. The inner `transport.cause` mirrors it for callers that inspect the raw
|
|
66
|
+
* transport payload — treat `Error.cause` as the source of truth.
|
|
67
|
+
*/
|
|
60
68
|
function createNetworkTransportError(error, url, method) {
|
|
61
69
|
const message = error instanceof Error && error.message.trim()
|
|
62
70
|
? error.message.trim()
|
|
@@ -68,6 +76,7 @@ function createNetworkTransportError(error, url, method) {
|
|
|
68
76
|
body: { error: message },
|
|
69
77
|
url,
|
|
70
78
|
method,
|
|
79
|
+
cause: error,
|
|
71
80
|
},
|
|
72
81
|
});
|
|
73
82
|
}
|
|
@@ -122,6 +131,23 @@ export function createFetch(fetchImpl, fallbackFetch) {
|
|
|
122
131
|
}
|
|
123
132
|
return resolved.bind(globalThis);
|
|
124
133
|
}
|
|
134
|
+
function parseRetryAfterMs(headers) {
|
|
135
|
+
const retryAfter = headers.get('retry-after');
|
|
136
|
+
if (!retryAfter)
|
|
137
|
+
return undefined;
|
|
138
|
+
// Numeric seconds
|
|
139
|
+
const seconds = Number(retryAfter);
|
|
140
|
+
if (!Number.isNaN(seconds) && seconds >= 0) {
|
|
141
|
+
return Math.ceil(seconds * 1000);
|
|
142
|
+
}
|
|
143
|
+
// HTTP-date
|
|
144
|
+
const date = new Date(retryAfter);
|
|
145
|
+
if (!Number.isNaN(date.getTime())) {
|
|
146
|
+
const ms = date.getTime() - Date.now();
|
|
147
|
+
return ms > 0 ? ms : 0;
|
|
148
|
+
}
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
125
151
|
export async function readJsonBody(response) {
|
|
126
152
|
const text = await response.text();
|
|
127
153
|
if (!text.trim())
|
|
@@ -143,7 +169,8 @@ export async function requestJson(fetchImpl, url, init = {}) {
|
|
|
143
169
|
}
|
|
144
170
|
const body = await readJsonBody(response);
|
|
145
171
|
if (!response.ok) {
|
|
146
|
-
|
|
172
|
+
const retryAfterMs = parseRetryAfterMs(response.headers);
|
|
173
|
+
throw createTransportError(response.status, url, init.method ?? 'GET', body, retryAfterMs);
|
|
147
174
|
}
|
|
148
175
|
return body;
|
|
149
176
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-http/http.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,KAAK,6BAA6B,EAClC,KAAK,qBAAqB,EAC1B,+BAA+B,EAC/B,uBAAuB,EACvB,8BAA8B,EAC/B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,WAAW,EAEX,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,UAAU,EACV,SAAS,EACT,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,6BAA6B,EAC7B,qBAAqB,EACrB,kBAAkB,GACnB,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC9C,OAAO,EACL,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,+BAA+B,EAC/B,uBAAuB,EACvB,8BAA8B,GAC/B,CAAC;
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-http/http.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,KAAK,6BAA6B,EAClC,KAAK,qBAAqB,EAC1B,+BAA+B,EAC/B,uBAAuB,EACvB,8BAA8B,EAC/B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,WAAW,EAEX,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,UAAU,EACV,SAAS,EACT,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,6BAA6B,EAC7B,qBAAqB,EACrB,kBAAkB,GACnB,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC9C,OAAO,EACL,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,+BAA+B,EAC/B,uBAAuB,EACvB,8BAA8B,GAC/B,CAAC;AA2CF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAiD7D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAmBhF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Synced from packages/transport-http/src/http.ts
|
|
2
|
-
import { ConfigurationError, ContractError, createHttpStatusError } from '../errors/index.js';
|
|
2
|
+
import { ConfigurationError, ContractError, HttpStatusError, createHttpStatusError } from '../errors/index.js';
|
|
3
3
|
import { mergeHeaders, resolveAuthToken, resolveHeaders, } from './auth.js';
|
|
4
4
|
import { computeBackoffDelay, normalizeBackoffPolicy, sleepWithSignal, } from './backoff.js';
|
|
5
5
|
import { DEFAULT_HTTP_RETRY_POLICY, getHttpRetryDelay, isRetryableHttpStatus, isRetryableNetworkError, normalizeHttpRetryPolicy, resolveHttpRetryPolicy, } from './retry.js';
|
|
@@ -14,9 +14,57 @@ function isTransportError(error) {
|
|
|
14
14
|
&& typeof error.transport.status === 'number'
|
|
15
15
|
&& typeof error.transport.url === 'string');
|
|
16
16
|
}
|
|
17
|
+
function inferTransportHint(status, url, retryAfterMs) {
|
|
18
|
+
if (status === 0)
|
|
19
|
+
return `Transport could not reach ${url}. Verify the baseUrl is reachable.`;
|
|
20
|
+
if (status === 401)
|
|
21
|
+
return 'Check your authentication token or credentials.';
|
|
22
|
+
if (status === 403)
|
|
23
|
+
return 'Valid credentials but insufficient permissions for this operation.';
|
|
24
|
+
if (status === 404)
|
|
25
|
+
return 'The requested resource was not found.';
|
|
26
|
+
if (status === 408)
|
|
27
|
+
return 'The request timed out. Consider retrying.';
|
|
28
|
+
if (status === 429) {
|
|
29
|
+
return retryAfterMs !== undefined
|
|
30
|
+
? `Rate limit exceeded. Retry after ${retryAfterMs}ms.`
|
|
31
|
+
: 'Rate limit exceeded. Back off and retry.';
|
|
32
|
+
}
|
|
33
|
+
if (status >= 500)
|
|
34
|
+
return 'Remote server error. The service may be temporarily unavailable.';
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
17
37
|
export function normalizeTransportError(error) {
|
|
18
38
|
if (isTransportError(error)) {
|
|
19
|
-
|
|
39
|
+
const { status, url, body, method, retryAfterMs, cause } = error.transport;
|
|
40
|
+
const resolvedMethod = typeof method === 'string' ? method : 'GET';
|
|
41
|
+
const hint = inferTransportHint(status, url, retryAfterMs);
|
|
42
|
+
if (status === 0) {
|
|
43
|
+
// Network-level failure: no HTTP response received
|
|
44
|
+
const networkError = new HttpStatusError(error instanceof Error ? error.message : `Transport could not reach ${url}`, {
|
|
45
|
+
status: undefined,
|
|
46
|
+
url,
|
|
47
|
+
method: resolvedMethod,
|
|
48
|
+
body,
|
|
49
|
+
category: 'network',
|
|
50
|
+
source: 'transport',
|
|
51
|
+
recoverable: true,
|
|
52
|
+
hint,
|
|
53
|
+
...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
|
|
54
|
+
});
|
|
55
|
+
if (cause !== undefined) {
|
|
56
|
+
Object.defineProperty(networkError, 'cause', { value: cause, writable: true, configurable: true });
|
|
57
|
+
}
|
|
58
|
+
return Object.assign(networkError, { transport: error.transport });
|
|
59
|
+
}
|
|
60
|
+
const baseError = createHttpStatusError(status, url, resolvedMethod, body);
|
|
61
|
+
// Only apply inferred hint if the daemon body didn't supply one already
|
|
62
|
+
const effectiveHint = baseError.hint ?? hint;
|
|
63
|
+
return Object.assign(baseError, {
|
|
64
|
+
transport: error.transport,
|
|
65
|
+
...(effectiveHint !== undefined ? { hint: effectiveHint } : {}),
|
|
66
|
+
...(retryAfterMs !== undefined ? { retryAfterMs } : {}),
|
|
67
|
+
});
|
|
20
68
|
}
|
|
21
69
|
if (error instanceof Error) {
|
|
22
70
|
if (error.message === 'Fetch implementation is required' || error.message === 'Transport baseUrl is required') {
|
|
@@ -14,5 +14,31 @@ export interface SerializedEventEnvelope<TEvent extends EventLike = EventLike> {
|
|
|
14
14
|
export type DomainEventConnector<TDomain extends string, TEvent extends EventLike = EventLike> = (domain: TDomain, onEnvelope: (envelope: SerializedEventEnvelope<TEvent>) => void) => void | Promise<() => void>;
|
|
15
15
|
export type DomainEvents<TDomain extends string, TEvent extends EventLike = EventLike> = RuntimeEventFeeds<TDomain, TEvent>;
|
|
16
16
|
export declare function createRemoteDomainEvents<TDomain extends string, TEvent extends EventLike = EventLike>(domains: readonly TDomain[], connect: DomainEventConnector<TDomain, TEvent>): DomainEvents<TDomain, TEvent>;
|
|
17
|
+
/**
|
|
18
|
+
* Returns a filtered view of the given domain events object where every
|
|
19
|
+
* callback only fires for events whose envelope `sessionId` equals the
|
|
20
|
+
* supplied value.
|
|
21
|
+
*
|
|
22
|
+
* All domain feeds and the `domain()` accessor are pre-filtered. The
|
|
23
|
+
* `domains` list is preserved unchanged.
|
|
24
|
+
*
|
|
25
|
+
* Unsubscribe handles returned by the filtered feeds propagate correctly
|
|
26
|
+
* to the underlying connection.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* const events = sdk.realtime.viaSse();
|
|
30
|
+
* // Without forSession — manual filter:
|
|
31
|
+
* events.turn.onEnvelope('STREAM_DELTA', (e) => {
|
|
32
|
+
* if (e.sessionId !== mySessionId) return;
|
|
33
|
+
* process.stdout.write(e.payload.content);
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* // With forSession — no filter needed:
|
|
37
|
+
* const sessionEvents = forSession(events, mySessionId);
|
|
38
|
+
* sessionEvents.turn.onEnvelope('STREAM_DELTA', (e) => {
|
|
39
|
+
* process.stdout.write(e.payload.content);
|
|
40
|
+
* });
|
|
41
|
+
*/
|
|
42
|
+
export declare function forSession<TDomain extends string, TEvent extends EventLike = EventLike>(events: DomainEvents<TDomain, TEvent>, sessionId: string): DomainEvents<TDomain, TEvent>;
|
|
17
43
|
export {};
|
|
18
44
|
//# sourceMappingURL=domain-events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain-events.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-realtime/domain-events.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkD,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpH,KAAK,SAAS,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,MAAM,WAAW,uBAAuB,CAAC,MAAM,SAAS,SAAS,GAAG,SAAS;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,oBAAoB,CAC9B,OAAO,SAAS,MAAM,EACtB,MAAM,SAAS,SAAS,GAAG,SAAS,IAClC,CACF,MAAM,EAAE,OAAO,EACf,UAAU,EAAE,CAAC,QAAQ,EAAE,uBAAuB,CAAC,MAAM,CAAC,KAAK,IAAI,KAC5D,IAAI,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;AAEhC,MAAM,MAAM,YAAY,CACtB,OAAO,SAAS,MAAM,EACtB,MAAM,SAAS,SAAS,GAAG,SAAS,IAClC,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAmIvC,wBAAgB,wBAAwB,CACtC,OAAO,SAAS,MAAM,EACtB,MAAM,SAAS,SAAS,GAAG,SAAS,EAEpC,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,OAAO,EAAE,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,GAC7C,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAK/B"}
|
|
1
|
+
{"version":3,"file":"domain-events.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-realtime/domain-events.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkD,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpH,KAAK,SAAS,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,MAAM,WAAW,uBAAuB,CAAC,MAAM,SAAS,SAAS,GAAG,SAAS;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,oBAAoB,CAC9B,OAAO,SAAS,MAAM,EACtB,MAAM,SAAS,SAAS,GAAG,SAAS,IAClC,CACF,MAAM,EAAE,OAAO,EACf,UAAU,EAAE,CAAC,QAAQ,EAAE,uBAAuB,CAAC,MAAM,CAAC,KAAK,IAAI,KAC5D,IAAI,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;AAEhC,MAAM,MAAM,YAAY,CACtB,OAAO,SAAS,MAAM,EACtB,MAAM,SAAS,SAAS,GAAG,SAAS,IAClC,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAmIvC,wBAAgB,wBAAwB,CACtC,OAAO,SAAS,MAAM,EACtB,MAAM,SAAS,SAAS,GAAG,SAAS,EAEpC,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,OAAO,EAAE,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,GAC7C,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAK/B;AAmCD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,UAAU,CACxB,OAAO,SAAS,MAAM,EACtB,MAAM,SAAS,SAAS,GAAG,SAAS,EAEpC,MAAM,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,EACrC,SAAS,EAAE,MAAM,GAChB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAY/B"}
|
|
@@ -114,3 +114,66 @@ function createRemoteDomainEventFeed(domain, connect) {
|
|
|
114
114
|
export function createRemoteDomainEvents(domains, connect) {
|
|
115
115
|
return createRuntimeEventFeeds(domains, (domain) => createRemoteDomainEventFeed(domain, connect));
|
|
116
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Wraps an existing {@link RuntimeEventFeed} and returns a filtered feed whose
|
|
119
|
+
* callbacks only fire for envelopes whose `sessionId` matches the given value.
|
|
120
|
+
*
|
|
121
|
+
* Unsubscribe handles returned by `on` / `onEnvelope` on the filtered feed
|
|
122
|
+
* correctly remove the underlying listener from the original feed.
|
|
123
|
+
*/
|
|
124
|
+
function createFilteredFeed(feed, sessionId) {
|
|
125
|
+
return {
|
|
126
|
+
on(type, listener) {
|
|
127
|
+
return feed.onEnvelope(type, (envelope) => {
|
|
128
|
+
if (envelope.sessionId !== sessionId)
|
|
129
|
+
return;
|
|
130
|
+
listener(envelope.payload);
|
|
131
|
+
});
|
|
132
|
+
},
|
|
133
|
+
onEnvelope(type, listener) {
|
|
134
|
+
return feed.onEnvelope(type, (envelope) => {
|
|
135
|
+
if (envelope.sessionId !== sessionId)
|
|
136
|
+
return;
|
|
137
|
+
listener(envelope);
|
|
138
|
+
});
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Returns a filtered view of the given domain events object where every
|
|
144
|
+
* callback only fires for events whose envelope `sessionId` equals the
|
|
145
|
+
* supplied value.
|
|
146
|
+
*
|
|
147
|
+
* All domain feeds and the `domain()` accessor are pre-filtered. The
|
|
148
|
+
* `domains` list is preserved unchanged.
|
|
149
|
+
*
|
|
150
|
+
* Unsubscribe handles returned by the filtered feeds propagate correctly
|
|
151
|
+
* to the underlying connection.
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* const events = sdk.realtime.viaSse();
|
|
155
|
+
* // Without forSession — manual filter:
|
|
156
|
+
* events.turn.onEnvelope('STREAM_DELTA', (e) => {
|
|
157
|
+
* if (e.sessionId !== mySessionId) return;
|
|
158
|
+
* process.stdout.write(e.payload.content);
|
|
159
|
+
* });
|
|
160
|
+
*
|
|
161
|
+
* // With forSession — no filter needed:
|
|
162
|
+
* const sessionEvents = forSession(events, mySessionId);
|
|
163
|
+
* sessionEvents.turn.onEnvelope('STREAM_DELTA', (e) => {
|
|
164
|
+
* process.stdout.write(e.payload.content);
|
|
165
|
+
* });
|
|
166
|
+
*/
|
|
167
|
+
export function forSession(events, sessionId) {
|
|
168
|
+
const filteredFeeds = {};
|
|
169
|
+
for (const domain of events.domains) {
|
|
170
|
+
filteredFeeds[domain] = createFilteredFeed(events[domain], sessionId);
|
|
171
|
+
}
|
|
172
|
+
return Object.freeze({
|
|
173
|
+
...filteredFeeds,
|
|
174
|
+
domains: events.domains,
|
|
175
|
+
domain(d) {
|
|
176
|
+
return filteredFeeds[d];
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type { DomainEventConnector, DomainEvents, SerializedEventEnvelope, } from './domain-events.js';
|
|
2
|
-
export { createRemoteDomainEvents } from './domain-events.js';
|
|
2
|
+
export { createRemoteDomainEvents, forSession } from './domain-events.js';
|
|
3
3
|
export type { RemoteRuntimeEvents, SerializedRuntimeEnvelope } from './runtime-events.js';
|
|
4
|
-
export { buildEventSourceUrl, buildWebSocketUrl, createEventSourceConnector, createRemoteRuntimeEvents, createWebSocketConnector, } from './runtime-events.js';
|
|
4
|
+
export { buildEventSourceUrl, buildWebSocketUrl, createEventSourceConnector, createRemoteRuntimeEvents, createWebSocketConnector, forSessionRuntime, } from './runtime-events.js';
|
|
5
5
|
export type { RuntimeEventConnectorOptions } from './runtime-events.js';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-realtime/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,oBAAoB,EACpB,YAAY,EACZ,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-realtime/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,oBAAoB,EACpB,YAAY,EACZ,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1E,YAAY,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EACzB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { createRemoteDomainEvents } from './domain-events.js';
|
|
2
|
-
export { buildEventSourceUrl, buildWebSocketUrl, createEventSourceConnector, createRemoteRuntimeEvents, createWebSocketConnector, } from './runtime-events.js';
|
|
1
|
+
export { createRemoteDomainEvents, forSession } from './domain-events.js';
|
|
2
|
+
export { buildEventSourceUrl, buildWebSocketUrl, createEventSourceConnector, createRemoteRuntimeEvents, createWebSocketConnector, forSessionRuntime, } from './runtime-events.js';
|
|
@@ -7,6 +7,33 @@ type RuntimeEventRecord = {
|
|
|
7
7
|
};
|
|
8
8
|
export type SerializedRuntimeEnvelope<TEvent extends RuntimeEventRecord = RuntimeEventRecord> = SerializedEventEnvelope<TEvent>;
|
|
9
9
|
export type RemoteRuntimeEvents<TEvent extends RuntimeEventRecord = RuntimeEventRecord> = DomainEvents<RuntimeEventDomain, TEvent>;
|
|
10
|
+
/**
|
|
11
|
+
* Returns a filtered view of a {@link RemoteRuntimeEvents} object where every
|
|
12
|
+
* callback only fires for events whose envelope `sessionId` equals the given
|
|
13
|
+
* session identifier.
|
|
14
|
+
*
|
|
15
|
+
* This is a convenience wrapper around {@link forSession} scoped to the
|
|
16
|
+
* canonical runtime-event domains. Use it instead of manually checking
|
|
17
|
+
* `e.sessionId` in every callback.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* const events = sdk.realtime.viaSse();
|
|
21
|
+
* const session = await sdk.operator.sessions.create({ title: 'demo' });
|
|
22
|
+
* const sessionId = session.session.id;
|
|
23
|
+
*
|
|
24
|
+
* // Before forSession — repeated manual guard:
|
|
25
|
+
* events.turn.onEnvelope('STREAM_DELTA', (e) => {
|
|
26
|
+
* if (e.sessionId !== sessionId) return;
|
|
27
|
+
* process.stdout.write(e.payload.content);
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* // After forSession — clean, session-scoped subscription:
|
|
31
|
+
* const sessionEvents = forSessionRuntime(events, sessionId);
|
|
32
|
+
* sessionEvents.turn.onEnvelope('STREAM_DELTA', (e) => {
|
|
33
|
+
* process.stdout.write(e.payload.content);
|
|
34
|
+
* });
|
|
35
|
+
*/
|
|
36
|
+
export { forSession as forSessionRuntime } from './domain-events.js';
|
|
10
37
|
export interface RuntimeEventConnectorOptions {
|
|
11
38
|
readonly reconnect?: StreamReconnectPolicy;
|
|
12
39
|
readonly onError?: (error: unknown) => void;
|
|
@@ -17,5 +44,4 @@ export declare function buildEventSourceUrl(baseUrl: string, domain: RuntimeEven
|
|
|
17
44
|
export declare function buildWebSocketUrl(baseUrl: string, domains: readonly RuntimeEventDomain[]): string;
|
|
18
45
|
export declare function createEventSourceConnector(baseUrl: string, token: AuthTokenSource, fetchImpl: typeof fetch, options?: RuntimeEventConnectorOptions): DomainEventConnector<RuntimeEventDomain, AnyRuntimeEvent>;
|
|
19
46
|
export declare function createWebSocketConnector(baseUrl: string, token: AuthTokenSource, WebSocketImpl: typeof WebSocket, options?: RuntimeEventConnectorOptions): DomainEventConnector<RuntimeEventDomain, AnyRuntimeEvent>;
|
|
20
|
-
export {};
|
|
21
47
|
//# sourceMappingURL=runtime-events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-events.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-realtime/runtime-events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAsB,KAAK,iBAAiB,EAAE,KAAK,qBAAqB,EAA6D,MAAM,4BAA4B,CAAC;AAE/K,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAE5B,KAAK,kBAAkB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,yBAAyB,CAAC,MAAM,SAAS,kBAAkB,GAAG,kBAAkB,IAC1F,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAElC,MAAM,MAAM,mBAAmB,CAAC,MAAM,SAAS,kBAAkB,GAAG,kBAAkB,IACpF,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAE3C,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7C;AAED,KAAK,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAErE,wBAAgB,yBAAyB,CAAC,MAAM,SAAS,kBAAkB,GAAG,kBAAkB,EAC9F,OAAO,EAAE,oBAAoB,CAAC,kBAAkB,EAAE,MAAM,CAAC,GACxD,mBAAmB,CAAC,MAAM,CAAC,CAK7B;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,kBAAkB,GACzB,MAAM,CAIR;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,kBAAkB,EAAE,GACrC,MAAM,CAQR;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,OAAO,KAAK,EACvB,OAAO,GAAE,4BAAiC,GACzC,oBAAoB,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAiB3D;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,OAAO,SAAS,EAC/B,OAAO,GAAE,4BAAiC,GACzC,oBAAoB,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAuF3D"}
|
|
1
|
+
{"version":3,"file":"runtime-events.d.ts","sourceRoot":"","sources":["../../../src/_internal/transport-realtime/runtime-events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAsB,KAAK,iBAAiB,EAAE,KAAK,qBAAqB,EAA6D,MAAM,4BAA4B,CAAC;AAE/K,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAE5B,KAAK,kBAAkB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,yBAAyB,CAAC,MAAM,SAAS,kBAAkB,GAAG,kBAAkB,IAC1F,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAElC,MAAM,MAAM,mBAAmB,CAAC,MAAM,SAAS,kBAAkB,GAAG,kBAAkB,IACpF,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAE,UAAU,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAErE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7C;AAED,KAAK,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAErE,wBAAgB,yBAAyB,CAAC,MAAM,SAAS,kBAAkB,GAAG,kBAAkB,EAC9F,OAAO,EAAE,oBAAoB,CAAC,kBAAkB,EAAE,MAAM,CAAC,GACxD,mBAAmB,CAAC,MAAM,CAAC,CAK7B;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,kBAAkB,GACzB,MAAM,CAIR;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,kBAAkB,EAAE,GACrC,MAAM,CAQR;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,OAAO,KAAK,EACvB,OAAO,GAAE,4BAAiC,GACzC,oBAAoB,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAiB3D;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,OAAO,SAAS,EAC/B,OAAO,GAAE,4BAAiC,GACzC,oBAAoB,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAuF3D"}
|
|
@@ -4,6 +4,33 @@ import { RUNTIME_EVENT_DOMAINS } from '../contracts/index.js';
|
|
|
4
4
|
import { normalizeAuthToken, openRawServerSentEventStream as openServerSentEventStream } from '../transport-http/index.js';
|
|
5
5
|
import { buildUrl, normalizeBaseUrl } from '../transport-http/index.js';
|
|
6
6
|
import { createRemoteDomainEvents, } from './domain-events.js';
|
|
7
|
+
/**
|
|
8
|
+
* Returns a filtered view of a {@link RemoteRuntimeEvents} object where every
|
|
9
|
+
* callback only fires for events whose envelope `sessionId` equals the given
|
|
10
|
+
* session identifier.
|
|
11
|
+
*
|
|
12
|
+
* This is a convenience wrapper around {@link forSession} scoped to the
|
|
13
|
+
* canonical runtime-event domains. Use it instead of manually checking
|
|
14
|
+
* `e.sessionId` in every callback.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* const events = sdk.realtime.viaSse();
|
|
18
|
+
* const session = await sdk.operator.sessions.create({ title: 'demo' });
|
|
19
|
+
* const sessionId = session.session.id;
|
|
20
|
+
*
|
|
21
|
+
* // Before forSession — repeated manual guard:
|
|
22
|
+
* events.turn.onEnvelope('STREAM_DELTA', (e) => {
|
|
23
|
+
* if (e.sessionId !== sessionId) return;
|
|
24
|
+
* process.stdout.write(e.payload.content);
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* // After forSession — clean, session-scoped subscription:
|
|
28
|
+
* const sessionEvents = forSessionRuntime(events, sessionId);
|
|
29
|
+
* sessionEvents.turn.onEnvelope('STREAM_DELTA', (e) => {
|
|
30
|
+
* process.stdout.write(e.payload.content);
|
|
31
|
+
* });
|
|
32
|
+
*/
|
|
33
|
+
export { forSession as forSessionRuntime } from './domain-events.js';
|
|
7
34
|
export function createRemoteRuntimeEvents(connect) {
|
|
8
35
|
return createRemoteDomainEvents(RUNTIME_EVENT_DOMAINS, connect);
|
|
9
36
|
}
|