@pellux/goodvibes-sdk 0.18.47 → 0.18.49
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 +86 -0
- package/dist/_internal/errors/index.d.ts.map +1 -1
- package/dist/_internal/errors/index.js +86 -0
- package/dist/_internal/platform/daemon/facade-composition.d.ts +24 -0
- package/dist/_internal/platform/daemon/facade-composition.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/facade-composition.js +93 -0
- package/dist/_internal/platform/daemon/facade.d.ts +1 -0
- package/dist/_internal/platform/daemon/facade.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/facade.js +3 -0
- 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/auth.d.ts +49 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +49 -0
- package/dist/browser.d.ts +23 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +23 -0
- package/dist/client.d.ts +108 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +20 -0
- package/dist/expo.d.ts +14 -0
- package/dist/expo.d.ts.map +1 -1
- package/dist/expo.js +14 -0
- package/dist/node.d.ts +22 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +22 -0
- package/dist/react-native.d.ts +26 -0
- package/dist/react-native.d.ts.map +1 -1
- package/dist/react-native.js +26 -0
- package/dist/web.d.ts +12 -0
- package/dist/web.d.ts.map +1 -1
- package/dist/web.js +12 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,34 +2,36 @@
|
|
|
2
2
|
|
|
3
3
|
Umbrella GoodVibes SDK with Node, browser, web UI, React Native, and Expo integration helpers.
|
|
4
4
|
|
|
5
|
+
> **What this SDK is:** a client for the GoodVibes daemon. Not a direct provider SDK.
|
|
6
|
+
> See [Getting Started](../../docs/getting-started.md) for the full walkthrough.
|
|
7
|
+
|
|
5
8
|
Install:
|
|
6
9
|
|
|
7
10
|
```bash
|
|
8
11
|
npm install @pellux/goodvibes-sdk
|
|
9
12
|
```
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
Entry points:
|
|
14
|
-
- `@pellux/goodvibes-sdk`
|
|
15
|
-
- `@pellux/goodvibes-sdk/auth`
|
|
16
|
-
- `@pellux/goodvibes-sdk/node`
|
|
17
|
-
- `@pellux/goodvibes-sdk/browser`
|
|
18
|
-
- `@pellux/goodvibes-sdk/web`
|
|
19
|
-
- `@pellux/goodvibes-sdk/react-native`
|
|
20
|
-
- `@pellux/goodvibes-sdk/expo`
|
|
21
|
-
|
|
22
|
-
Example:
|
|
14
|
+
Quick example (Node / Bun):
|
|
23
15
|
|
|
24
16
|
```ts
|
|
25
17
|
import { createNodeGoodVibesSdk } from '@pellux/goodvibes-sdk/node';
|
|
18
|
+
import { createMemoryTokenStore } from '@pellux/goodvibes-sdk/auth';
|
|
26
19
|
|
|
27
20
|
const sdk = createNodeGoodVibesSdk({
|
|
28
21
|
baseUrl: 'http://127.0.0.1:3210',
|
|
29
|
-
|
|
22
|
+
tokenStore: createMemoryTokenStore(process.env.GOODVIBES_TOKEN ?? null),
|
|
30
23
|
});
|
|
31
24
|
|
|
32
25
|
console.log(await sdk.operator.control.snapshot());
|
|
33
26
|
```
|
|
34
27
|
|
|
28
|
+
Entry points:
|
|
29
|
+
- `@pellux/goodvibes-sdk`
|
|
30
|
+
- `@pellux/goodvibes-sdk/auth`
|
|
31
|
+
- `@pellux/goodvibes-sdk/node`
|
|
32
|
+
- `@pellux/goodvibes-sdk/browser`
|
|
33
|
+
- `@pellux/goodvibes-sdk/web`
|
|
34
|
+
- `@pellux/goodvibes-sdk/react-native`
|
|
35
|
+
- `@pellux/goodvibes-sdk/expo`
|
|
36
|
+
|
|
35
37
|
Use this package when you want the main consumer-facing GoodVibes TypeScript SDK rather than lower-level pieces.
|
|
@@ -21,6 +21,29 @@ export interface GoodVibesSdkErrorOptions {
|
|
|
21
21
|
readonly retryAfterMs?: number;
|
|
22
22
|
}
|
|
23
23
|
export declare const RETRYABLE_STATUS_CODES: readonly number[];
|
|
24
|
+
/**
|
|
25
|
+
* Base error class for all errors thrown by the GoodVibes SDK.
|
|
26
|
+
*
|
|
27
|
+
* Every error carries a structured `category` and `source` that allow
|
|
28
|
+
* callers to handle specific failure modes without string-matching messages.
|
|
29
|
+
*
|
|
30
|
+
* ### Narrowing pattern
|
|
31
|
+
* ```ts
|
|
32
|
+
* import { GoodVibesSdkError, HttpStatusError, ConfigurationError } from '@pellux/goodvibes-sdk';
|
|
33
|
+
*
|
|
34
|
+
* try {
|
|
35
|
+
* await sdk.operator.agents.list();
|
|
36
|
+
* } catch (err) {
|
|
37
|
+
* if (err instanceof HttpStatusError && err.category === 'rate_limit') {
|
|
38
|
+
* // Back off and retry after err.retryAfterMs
|
|
39
|
+
* } else if (err instanceof ConfigurationError) {
|
|
40
|
+
* // Invalid SDK setup — not recoverable
|
|
41
|
+
* } else if (err instanceof GoodVibesSdkError) {
|
|
42
|
+
* console.error(err.category, err.hint);
|
|
43
|
+
* }
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
24
47
|
export declare class GoodVibesSdkError extends Error {
|
|
25
48
|
readonly code?: string;
|
|
26
49
|
readonly category: ErrorCategory;
|
|
@@ -40,12 +63,75 @@ export declare class GoodVibesSdkError extends Error {
|
|
|
40
63
|
readonly retryAfterMs?: number;
|
|
41
64
|
constructor(message: string, options?: GoodVibesSdkErrorOptions);
|
|
42
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Thrown when the SDK is misconfigured (e.g. missing `baseUrl`, no fetch
|
|
68
|
+
* implementation available, or calling a mutation on a read-only auth resolver).
|
|
69
|
+
*
|
|
70
|
+
* Always non-recoverable (`recoverable: false`).
|
|
71
|
+
* Category: `'config'`.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* import { ConfigurationError } from '@pellux/goodvibes-sdk';
|
|
75
|
+
*
|
|
76
|
+
* try {
|
|
77
|
+
* await sdk.auth.setToken('x');
|
|
78
|
+
* } catch (err) {
|
|
79
|
+
* if (err instanceof ConfigurationError) {
|
|
80
|
+
* // SDK was constructed with getAuthToken — token mutation not supported
|
|
81
|
+
* }
|
|
82
|
+
* }
|
|
83
|
+
*/
|
|
43
84
|
export declare class ConfigurationError extends GoodVibesSdkError {
|
|
44
85
|
constructor(message: string, options?: GoodVibesSdkErrorOptions);
|
|
45
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Thrown when a response from the daemon violates the expected contract
|
|
89
|
+
* (unexpected shape, missing required fields, etc.).
|
|
90
|
+
*
|
|
91
|
+
* Always non-recoverable (`recoverable: false`).
|
|
92
|
+
* Category: `'contract'`.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* import { ContractError } from '@pellux/goodvibes-sdk';
|
|
96
|
+
*
|
|
97
|
+
* try {
|
|
98
|
+
* const result = await sdk.operator.agents.get({ id: agentId });
|
|
99
|
+
* } catch (err) {
|
|
100
|
+
* if (err instanceof ContractError) {
|
|
101
|
+
* // Daemon returned an unexpected shape — SDK version mismatch?
|
|
102
|
+
* console.error('Contract violation:', err.message);
|
|
103
|
+
* }
|
|
104
|
+
* }
|
|
105
|
+
*/
|
|
46
106
|
export declare class ContractError extends GoodVibesSdkError {
|
|
47
107
|
constructor(message: string, options?: GoodVibesSdkErrorOptions);
|
|
48
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* Thrown when the daemon returns a non-2xx HTTP status code.
|
|
111
|
+
*
|
|
112
|
+
* The `category` field is inferred from the status code:
|
|
113
|
+
* - `401` → `'authentication'` `402` → `'billing'` `403` → `'authorization'`
|
|
114
|
+
* - `404` → `'not_found'` `408` → `'timeout'` `429` → `'rate_limit'`
|
|
115
|
+
* - `5xx` → `'service'`
|
|
116
|
+
*
|
|
117
|
+
* Use `recoverable` to decide whether to retry, and `retryAfterMs` for
|
|
118
|
+
* the backoff hint on rate-limit responses.
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* import { HttpStatusError } from '@pellux/goodvibes-sdk';
|
|
122
|
+
*
|
|
123
|
+
* try {
|
|
124
|
+
* await sdk.operator.agents.list();
|
|
125
|
+
* } catch (err) {
|
|
126
|
+
* if (err instanceof HttpStatusError) {
|
|
127
|
+
* if (err.category === 'rate_limit') {
|
|
128
|
+
* await delay(err.retryAfterMs ?? 1000);
|
|
129
|
+
* } else if (!err.recoverable) {
|
|
130
|
+
* throw err; // Surface non-retryable errors immediately
|
|
131
|
+
* }
|
|
132
|
+
* }
|
|
133
|
+
* }
|
|
134
|
+
*/
|
|
49
135
|
export declare class HttpStatusError extends GoodVibesSdkError {
|
|
50
136
|
constructor(message: string, options?: GoodVibesSdkErrorOptions);
|
|
51
137
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_internal/errors/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_internal/errors/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,29 @@ function inferCategory(status) {
|
|
|
18
18
|
return 'service';
|
|
19
19
|
return 'unknown';
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Base error class for all errors thrown by the GoodVibes SDK.
|
|
23
|
+
*
|
|
24
|
+
* Every error carries a structured `category` and `source` that allow
|
|
25
|
+
* callers to handle specific failure modes without string-matching messages.
|
|
26
|
+
*
|
|
27
|
+
* ### Narrowing pattern
|
|
28
|
+
* ```ts
|
|
29
|
+
* import { GoodVibesSdkError, HttpStatusError, ConfigurationError } from '@pellux/goodvibes-sdk';
|
|
30
|
+
*
|
|
31
|
+
* try {
|
|
32
|
+
* await sdk.operator.agents.list();
|
|
33
|
+
* } catch (err) {
|
|
34
|
+
* if (err instanceof HttpStatusError && err.category === 'rate_limit') {
|
|
35
|
+
* // Back off and retry after err.retryAfterMs
|
|
36
|
+
* } else if (err instanceof ConfigurationError) {
|
|
37
|
+
* // Invalid SDK setup — not recoverable
|
|
38
|
+
* } else if (err instanceof GoodVibesSdkError) {
|
|
39
|
+
* console.error(err.category, err.hint);
|
|
40
|
+
* }
|
|
41
|
+
* }
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
21
44
|
export class GoodVibesSdkError extends Error {
|
|
22
45
|
code;
|
|
23
46
|
category;
|
|
@@ -56,6 +79,24 @@ export class GoodVibesSdkError extends Error {
|
|
|
56
79
|
this.retryAfterMs = options.retryAfterMs;
|
|
57
80
|
}
|
|
58
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Thrown when the SDK is misconfigured (e.g. missing `baseUrl`, no fetch
|
|
84
|
+
* implementation available, or calling a mutation on a read-only auth resolver).
|
|
85
|
+
*
|
|
86
|
+
* Always non-recoverable (`recoverable: false`).
|
|
87
|
+
* Category: `'config'`.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* import { ConfigurationError } from '@pellux/goodvibes-sdk';
|
|
91
|
+
*
|
|
92
|
+
* try {
|
|
93
|
+
* await sdk.auth.setToken('x');
|
|
94
|
+
* } catch (err) {
|
|
95
|
+
* if (err instanceof ConfigurationError) {
|
|
96
|
+
* // SDK was constructed with getAuthToken — token mutation not supported
|
|
97
|
+
* }
|
|
98
|
+
* }
|
|
99
|
+
*/
|
|
59
100
|
export class ConfigurationError extends GoodVibesSdkError {
|
|
60
101
|
constructor(message, options = {}) {
|
|
61
102
|
super(message, {
|
|
@@ -67,6 +108,25 @@ export class ConfigurationError extends GoodVibesSdkError {
|
|
|
67
108
|
});
|
|
68
109
|
}
|
|
69
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Thrown when a response from the daemon violates the expected contract
|
|
113
|
+
* (unexpected shape, missing required fields, etc.).
|
|
114
|
+
*
|
|
115
|
+
* Always non-recoverable (`recoverable: false`).
|
|
116
|
+
* Category: `'contract'`.
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* import { ContractError } from '@pellux/goodvibes-sdk';
|
|
120
|
+
*
|
|
121
|
+
* try {
|
|
122
|
+
* const result = await sdk.operator.agents.get({ id: agentId });
|
|
123
|
+
* } catch (err) {
|
|
124
|
+
* if (err instanceof ContractError) {
|
|
125
|
+
* // Daemon returned an unexpected shape — SDK version mismatch?
|
|
126
|
+
* console.error('Contract violation:', err.message);
|
|
127
|
+
* }
|
|
128
|
+
* }
|
|
129
|
+
*/
|
|
70
130
|
export class ContractError extends GoodVibesSdkError {
|
|
71
131
|
constructor(message, options = {}) {
|
|
72
132
|
super(message, {
|
|
@@ -78,6 +138,32 @@ export class ContractError extends GoodVibesSdkError {
|
|
|
78
138
|
});
|
|
79
139
|
}
|
|
80
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Thrown when the daemon returns a non-2xx HTTP status code.
|
|
143
|
+
*
|
|
144
|
+
* The `category` field is inferred from the status code:
|
|
145
|
+
* - `401` → `'authentication'` `402` → `'billing'` `403` → `'authorization'`
|
|
146
|
+
* - `404` → `'not_found'` `408` → `'timeout'` `429` → `'rate_limit'`
|
|
147
|
+
* - `5xx` → `'service'`
|
|
148
|
+
*
|
|
149
|
+
* Use `recoverable` to decide whether to retry, and `retryAfterMs` for
|
|
150
|
+
* the backoff hint on rate-limit responses.
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* import { HttpStatusError } from '@pellux/goodvibes-sdk';
|
|
154
|
+
*
|
|
155
|
+
* try {
|
|
156
|
+
* await sdk.operator.agents.list();
|
|
157
|
+
* } catch (err) {
|
|
158
|
+
* if (err instanceof HttpStatusError) {
|
|
159
|
+
* if (err.category === 'rate_limit') {
|
|
160
|
+
* await delay(err.retryAfterMs ?? 1000);
|
|
161
|
+
* } else if (!err.recoverable) {
|
|
162
|
+
* throw err; // Surface non-retryable errors immediately
|
|
163
|
+
* }
|
|
164
|
+
* }
|
|
165
|
+
* }
|
|
166
|
+
*/
|
|
81
167
|
export class HttpStatusError extends GoodVibesSdkError {
|
|
82
168
|
constructor(message, options = {}) {
|
|
83
169
|
super(message, {
|
|
@@ -17,10 +17,33 @@ import { DaemonSurfaceDeliveryHelper } from './surface-delivery.js';
|
|
|
17
17
|
import { DaemonSurfaceActionHelper } from './surface-actions.js';
|
|
18
18
|
import { DaemonTransportEventsHelper } from './transport-events.js';
|
|
19
19
|
import { DaemonHttpRouter } from './http/router.js';
|
|
20
|
+
import { CompanionChatManager } from '../companion/companion-chat-manager.js';
|
|
21
|
+
import type { CompanionLLMProvider } from '../companion/companion-chat-manager.js';
|
|
22
|
+
import type { ProviderRegistry } from '../providers/registry.js';
|
|
20
23
|
import { type RuntimeServices } from '../runtime/services.js';
|
|
21
24
|
import type { DaemonConfig, PendingSurfaceReply } from './types.js';
|
|
22
25
|
import type { ResolvedInboundTlsContext } from '../runtime/network/index.js';
|
|
23
26
|
type JsonBody = Record<string, unknown>;
|
|
27
|
+
/**
|
|
28
|
+
* Creates the CompanionLLMProvider adapter that bridges the daemon's
|
|
29
|
+
* ProviderRegistry (chat-based) to the queue-driven async-generator interface
|
|
30
|
+
* expected by CompanionChatManager.
|
|
31
|
+
*
|
|
32
|
+
* Extracted for testability: the adapter can be unit-tested in isolation
|
|
33
|
+
* without constructing a full daemon facade.
|
|
34
|
+
*
|
|
35
|
+
* Error handling:
|
|
36
|
+
* - If no provider is configured or the model is unavailable, the adapter
|
|
37
|
+
* immediately yields `{ type: 'error', error: 'No provider available ...' }`
|
|
38
|
+
* and returns. This is a graceful degradation — the companion chat session
|
|
39
|
+
* receives a structured error rather than an unhandled exception.
|
|
40
|
+
* - If the underlying provider.chat() rejects mid-stream, the error is
|
|
41
|
+
* caught in the `.catch()` handler and surfaced as a final
|
|
42
|
+
* `{ type: 'error', error: <message> }` chunk after all buffered deltas
|
|
43
|
+
* have been yielded. The generator never throws; callers always receive
|
|
44
|
+
* a terminal chunk.
|
|
45
|
+
*/
|
|
46
|
+
export declare function createCompanionProviderAdapter(providerRegistry: ProviderRegistry): CompanionLLMProvider;
|
|
24
47
|
export interface ResolvedDaemonFacadeRuntime {
|
|
25
48
|
readonly configManager: ConfigManager;
|
|
26
49
|
readonly runtimeServices: RuntimeServices;
|
|
@@ -55,6 +78,7 @@ export interface ResolvedDaemonFacadeRuntime {
|
|
|
55
78
|
readonly serviceRegistry: ServiceRegistry;
|
|
56
79
|
readonly serveFactory: typeof Bun.serve;
|
|
57
80
|
readonly githubWebhookSecret: string | null;
|
|
81
|
+
readonly companionChatManager: CompanionChatManager;
|
|
58
82
|
}
|
|
59
83
|
export declare function resolveDaemonFacadeRuntime(config: DaemonConfig, fallbackConfigManager?: ConfigManager): ResolvedDaemonFacadeRuntime;
|
|
60
84
|
export interface DaemonFacadeCollaborators {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facade-composition.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/daemon/facade-composition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAC;AACpF,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrG,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,EAC7B,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAE7E,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAExC,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,kBAAkB,EAAE,wBAAwB,CAAC;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;IACvD,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAC7D,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IAClD,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAC;IAC9C,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAC5C,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAC5C,QAAQ,CAAC,eAAe,EAAE,yBAAyB,CAAC;IACpD,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAC7C,QAAQ,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAC/C,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;IACxD,QAAQ,CAAC,kBAAkB,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC;IACnE,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;IACvD,QAAQ,CAAC,gBAAgB,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;IAC/D,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;IAC1D,QAAQ,CAAC,cAAc,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAC3D,QAAQ,CAAC,iBAAiB,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC;IACjE,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IACzD,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,OAAO,GAAG,CAAC,KAAK,CAAC;IACxC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"facade-composition.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/daemon/facade-composition.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,94 @@ import { DaemonSurfaceDeliveryHelper } from './surface-delivery.js';
|
|
|
18
18
|
import { DaemonSurfaceActionHelper } from './surface-actions.js';
|
|
19
19
|
import { DaemonTransportEventsHelper } from './transport-events.js';
|
|
20
20
|
import { DaemonHttpRouter } from './http/router.js';
|
|
21
|
+
import { CompanionChatManager } from '../companion/companion-chat-manager.js';
|
|
21
22
|
import { createRuntimeServices } from '../runtime/services.js';
|
|
23
|
+
/**
|
|
24
|
+
* Creates the CompanionLLMProvider adapter that bridges the daemon's
|
|
25
|
+
* ProviderRegistry (chat-based) to the queue-driven async-generator interface
|
|
26
|
+
* expected by CompanionChatManager.
|
|
27
|
+
*
|
|
28
|
+
* Extracted for testability: the adapter can be unit-tested in isolation
|
|
29
|
+
* without constructing a full daemon facade.
|
|
30
|
+
*
|
|
31
|
+
* Error handling:
|
|
32
|
+
* - If no provider is configured or the model is unavailable, the adapter
|
|
33
|
+
* immediately yields `{ type: 'error', error: 'No provider available ...' }`
|
|
34
|
+
* and returns. This is a graceful degradation — the companion chat session
|
|
35
|
+
* receives a structured error rather than an unhandled exception.
|
|
36
|
+
* - If the underlying provider.chat() rejects mid-stream, the error is
|
|
37
|
+
* caught in the `.catch()` handler and surfaced as a final
|
|
38
|
+
* `{ type: 'error', error: <message> }` chunk after all buffered deltas
|
|
39
|
+
* have been yielded. The generator never throws; callers always receive
|
|
40
|
+
* a terminal chunk.
|
|
41
|
+
*/
|
|
42
|
+
export function createCompanionProviderAdapter(providerRegistry) {
|
|
43
|
+
return {
|
|
44
|
+
async *chatStream(messages, options) {
|
|
45
|
+
let provider;
|
|
46
|
+
try {
|
|
47
|
+
provider = options.model
|
|
48
|
+
? providerRegistry.getForModel(options.model, options.provider ?? undefined)
|
|
49
|
+
: providerRegistry.getForModel(providerRegistry.getCurrentModel().id);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// No provider is configured or the requested model/provider is unavailable.
|
|
53
|
+
// Yield a structured error so the companion session receives feedback
|
|
54
|
+
// rather than hanging or crashing.
|
|
55
|
+
yield { type: 'error', error: 'No provider available for companion chat' };
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Queue-based streaming bridge: onDelta pushes into a queue consumed by the generator.
|
|
59
|
+
const queue = [];
|
|
60
|
+
let resolve = null;
|
|
61
|
+
let done = false;
|
|
62
|
+
let streamError;
|
|
63
|
+
const push = (chunk) => {
|
|
64
|
+
queue.push(chunk);
|
|
65
|
+
resolve?.();
|
|
66
|
+
resolve = null;
|
|
67
|
+
};
|
|
68
|
+
const chatPromise = provider.chat({
|
|
69
|
+
model: options.model ?? providerRegistry.getCurrentModel().id,
|
|
70
|
+
messages: messages.map((m) => ({ role: m.role, content: m.content })),
|
|
71
|
+
systemPrompt: options.systemPrompt ?? undefined,
|
|
72
|
+
signal: options.abortSignal,
|
|
73
|
+
onDelta(delta) {
|
|
74
|
+
if (delta.content)
|
|
75
|
+
push({ type: 'text_delta', delta: delta.content });
|
|
76
|
+
},
|
|
77
|
+
}).then((resp) => {
|
|
78
|
+
if (resp.toolCalls?.length) {
|
|
79
|
+
for (const tc of resp.toolCalls) {
|
|
80
|
+
push({ type: 'tool_call', toolCallId: tc.id, toolName: tc.name, toolInput: tc.arguments });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}).catch((err) => {
|
|
84
|
+
// Mid-stream error: capture message so it can be yielded as a terminal chunk.
|
|
85
|
+
streamError = err instanceof Error ? err.message : String(err);
|
|
86
|
+
}).finally(() => {
|
|
87
|
+
done = true;
|
|
88
|
+
resolve?.();
|
|
89
|
+
resolve = null;
|
|
90
|
+
});
|
|
91
|
+
while (!done || queue.length > 0) {
|
|
92
|
+
if (queue.length === 0) {
|
|
93
|
+
await new Promise((r) => { resolve = r; });
|
|
94
|
+
}
|
|
95
|
+
while (queue.length > 0) {
|
|
96
|
+
yield queue.shift();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
await chatPromise;
|
|
100
|
+
if (streamError) {
|
|
101
|
+
yield { type: 'error', error: streamError };
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
yield { type: 'done' };
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
22
109
|
export function resolveDaemonFacadeRuntime(config, fallbackConfigManager) {
|
|
23
110
|
const ownedWorkingDir = config.runtimeServices?.workingDirectory ?? config.workingDir;
|
|
24
111
|
const ownedHomeDirectory = config.runtimeServices?.homeDirectory ?? config.homeDirectory;
|
|
@@ -74,6 +161,10 @@ export function resolveDaemonFacadeRuntime(config, fallbackConfigManager) {
|
|
|
74
161
|
deliveryManager: runtimeServices.deliveryManager,
|
|
75
162
|
});
|
|
76
163
|
runtimeServices.deliveryManager.setControlPlaneGateway(controlPlaneGateway);
|
|
164
|
+
const companionChatManager = new CompanionChatManager({
|
|
165
|
+
eventPublisher: controlPlaneGateway,
|
|
166
|
+
provider: createCompanionProviderAdapter(runtimeServices.providerRegistry),
|
|
167
|
+
});
|
|
77
168
|
runtimeServices.approvalBroker.setPublisher(controlPlaneGateway);
|
|
78
169
|
runtimeServices.sessionBroker.setEventPublisher((event, payload) => {
|
|
79
170
|
controlPlaneGateway.publishEvent(event, payload);
|
|
@@ -124,6 +215,7 @@ export function resolveDaemonFacadeRuntime(config, fallbackConfigManager) {
|
|
|
124
215
|
serviceRegistry: runtimeServices.serviceRegistry,
|
|
125
216
|
serveFactory: config.serveFactory ?? Bun.serve,
|
|
126
217
|
githubWebhookSecret: config.githubWebhookSecret ?? process.env.GITHUB_WEBHOOK_SECRET ?? null,
|
|
218
|
+
companionChatManager,
|
|
127
219
|
};
|
|
128
220
|
}
|
|
129
221
|
export function createDaemonFacadeCollaborators(options) {
|
|
@@ -228,6 +320,7 @@ export function createDaemonFacadeCollaborators(options) {
|
|
|
228
320
|
syncSpawnedAgentTask: options.syncSpawnedAgentTask,
|
|
229
321
|
syncFinishedAgentTask: options.syncFinishedAgentTask,
|
|
230
322
|
trySpawnAgent: options.trySpawnAgent,
|
|
323
|
+
companionChatManager: runtime.companionChatManager,
|
|
231
324
|
});
|
|
232
325
|
const providerRuntime = new ChannelProviderRuntimeManager({
|
|
233
326
|
configManager: runtime.configManager,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facade.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/daemon/facade.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"facade.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/daemon/facade.ts"],"names":[],"mappings":"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"}
|
|
@@ -72,6 +72,7 @@ export class DaemonServer {
|
|
|
72
72
|
transportEventsHelper;
|
|
73
73
|
httpRouter;
|
|
74
74
|
replyPoller = null;
|
|
75
|
+
companionChatManager;
|
|
75
76
|
agentTaskAdapter = null;
|
|
76
77
|
agentTaskAdapterUnsub = null;
|
|
77
78
|
tlsState = null;
|
|
@@ -120,6 +121,7 @@ export class DaemonServer {
|
|
|
120
121
|
this.serviceRegistry = resolved.serviceRegistry;
|
|
121
122
|
this.serveFactory = resolved.serveFactory;
|
|
122
123
|
this.githubWebhookSecret = resolved.githubWebhookSecret;
|
|
124
|
+
this.companionChatManager = resolved.companionChatManager;
|
|
123
125
|
const collaborators = createDaemonFacadeCollaborators({
|
|
124
126
|
runtime: resolved,
|
|
125
127
|
pendingSurfaceReplies: this.pendingSurfaceReplies,
|
|
@@ -362,6 +364,7 @@ export class DaemonServer {
|
|
|
362
364
|
this.approvalBrokerUnsubscribe?.();
|
|
363
365
|
this.approvalBrokerUnsubscribe = null;
|
|
364
366
|
this.httpRouter.dispose();
|
|
367
|
+
this.companionChatManager.dispose();
|
|
365
368
|
// Stop services that expose async teardown. Note: sessionBroker, approvalBroker,
|
|
366
369
|
// channelPolicy, and distributedRuntime expose start() only — their lifecycle ends
|
|
367
370
|
// when the server socket closes. We stop what we can in reverse start order.
|
|
@@ -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.49';
|
|
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"}
|