@openwop/openwop 1.1.0 → 1.1.2
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 +4 -0
- package/dist/client.d.ts +80 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +186 -0
- package/dist/client.js.map +1 -1
- package/dist/cost-attribution.d.ts +49 -0
- package/dist/cost-attribution.d.ts.map +1 -0
- package/dist/cost-attribution.js +65 -0
- package/dist/cost-attribution.js.map +1 -0
- package/dist/event-helpers.d.ts +95 -0
- package/dist/event-helpers.d.ts.map +1 -0
- package/dist/event-helpers.js +160 -0
- package/dist/event-helpers.js.map +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/registry-helpers.d.ts +118 -0
- package/dist/registry-helpers.d.ts.map +1 -0
- package/dist/registry-helpers.js +82 -0
- package/dist/registry-helpers.js.map +1 -0
- package/dist/types.d.ts +376 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/webhook-helpers.d.ts +73 -0
- package/dist/webhook-helpers.d.ts.map +1 -0
- package/dist/webhook-helpers.js +97 -0
- package/dist/webhook-helpers.js.map +1 -0
- package/package.json +1 -1
- package/src/client.ts +218 -0
- package/src/cost-attribution.ts +72 -0
- package/src/event-helpers.ts +238 -0
- package/src/index.ts +96 -0
- package/src/registry-helpers.ts +173 -0
- package/src/types.ts +424 -0
- package/src/webhook-helpers.ts +131 -0
package/README.md
CHANGED
|
@@ -84,10 +84,14 @@ npx tsc --noEmit # typecheck the SDK source
|
|
|
84
84
|
| `GET /v1/runs/{id}/events` (SSE) | `client.runs.events(id, opts?)` (async iterable) |
|
|
85
85
|
| `GET /v1/runs/{id}/events/poll` | `client.runs.pollEvents(id, opts?)` |
|
|
86
86
|
| `POST /v1/runs/{id}/cancel` | `client.runs.cancel(id, body?)` |
|
|
87
|
+
| `POST /v1/runs:bulk-cancel` | `client.runs.bulkCancel(body, opts?)` |
|
|
88
|
+
| `POST /v1/runs/{id}:pause` | `client.runs.pause(id, body?, opts?)` |
|
|
89
|
+
| `POST /v1/runs/{id}:resume` | `client.runs.resume(id, body?, opts?)` |
|
|
87
90
|
| `POST /v1/runs/{id}:fork` | `client.runs.fork(id, body)` |
|
|
88
91
|
| `POST /v1/runs/{id}/interrupts/{nodeId}` | `client.interrupts.resolveByRun(id, nodeId, body)` |
|
|
89
92
|
| `GET /v1/interrupts/{token}` | `client.interrupts.inspectByToken(token)` |
|
|
90
93
|
| `POST /v1/interrupts/{token}` | `client.interrupts.resolveByToken(token, body)` |
|
|
94
|
+
| `GET /v1/audit/verify` | `client.audit.verify(fromSeq, toSeq)` |
|
|
91
95
|
|
|
92
96
|
**Idempotency-Key** is supported via the `idempotencyKey` option on every mutation method.
|
|
93
97
|
|
package/dist/client.d.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* ../../auth.md for credential format.
|
|
9
9
|
*/
|
|
10
10
|
import { type EventsStreamOptions } from './sse.js';
|
|
11
|
-
import { type AuditVerifyResult, type BulkCancelRunsRequest, type BulkCancelRunsResponse, type Capabilities, type CancelRunRequest, type CancelRunResponse, type CreateRunRequest, type CreateRunResponse, type ForkRunRequest, type ForkRunResponse, type InterruptByTokenInspection, type PollEventsResponse, type ResolveInterruptByTokenResponse, type ResolveInterruptRequest, type ResolveInterruptResponse, type RunEventDoc, type RunSnapshot } from './types.js';
|
|
11
|
+
import { type AuditVerifyResult, type BulkCancelRunsRequest, type BulkCancelRunsResponse, type Capabilities, type CancelRunRequest, type CancelRunResponse, type CreateRunRequest, type CreateRunResponse, type ForkRunRequest, type ForkRunResponse, type GetPromptRequest, type InterruptByTokenInspection, type DebugBundle, type DebugBundleOptions, type ListPromptsRequest, type ListPromptsResponse, type PromptTemplate, type RegisterWebhookRequest, type RegisterWebhookResponse, type PauseRunRequest, type PauseRunResponse, type PollEventsResponse, type RenderPromptRequest, type RenderPromptResponse, type ResolveInterruptByTokenResponse, type ResolveInterruptRequest, type ResolveInterruptResponse, type ResumeRunRequest, type ResumeRunResponse, type RunEventDoc, type RunSnapshot } from './types.js';
|
|
12
12
|
export interface OpenwopClientOptions {
|
|
13
13
|
/** Base URL of the openwop server, e.g., `https://api.example.com`. Trailing slash optional. */
|
|
14
14
|
readonly baseUrl: string;
|
|
@@ -38,7 +38,22 @@ export declare class OpenwopClient {
|
|
|
38
38
|
readonly runs: {
|
|
39
39
|
create: (body: CreateRunRequest, opts?: MutationOptions) => Promise<CreateRunResponse>;
|
|
40
40
|
get: (runId: string) => Promise<RunSnapshot>;
|
|
41
|
+
/**
|
|
42
|
+
* Fetch the portable JSON diagnostic export for a single run per
|
|
43
|
+
* `spec/v1/debug-bundle.md`. The bundle's `redactionMode` reflects
|
|
44
|
+
* the host's advertised `capabilities.compliance.defaultMode`; the
|
|
45
|
+
* caller MUST treat masked/omitted/hashed fields as the
|
|
46
|
+
* spec-canonical value. The `truncated` + `truncatedReason` fields
|
|
47
|
+
* indicate the host hit its size cap.
|
|
48
|
+
*
|
|
49
|
+
* Returns `null` when the host doesn't advertise
|
|
50
|
+
* `capabilities.debugBundle.supported: true` (the endpoint returns
|
|
51
|
+
* 404 in that case per `debug-bundle.md` §"Authorization").
|
|
52
|
+
*/
|
|
53
|
+
debugBundle: (runId: string, opts?: DebugBundleOptions) => Promise<DebugBundle | null>;
|
|
41
54
|
cancel: (runId: string, body?: CancelRunRequest, opts?: MutationOptions) => Promise<CancelRunResponse>;
|
|
55
|
+
pause: (runId: string, body?: PauseRunRequest, opts?: MutationOptions) => Promise<PauseRunResponse>;
|
|
56
|
+
resume: (runId: string, body?: ResumeRunRequest, opts?: MutationOptions) => Promise<ResumeRunResponse>;
|
|
42
57
|
/**
|
|
43
58
|
* Bulk-cancel a set of in-flight runs in a single request per
|
|
44
59
|
* `rest-endpoints.md` §"POST /v1/runs:bulk-cancel" (closes R1).
|
|
@@ -78,6 +93,70 @@ export declare class OpenwopClient {
|
|
|
78
93
|
*/
|
|
79
94
|
resolveByToken: (token: string, body: ResolveInterruptRequest, opts?: MutationOptions) => Promise<ResolveInterruptByTokenResponse>;
|
|
80
95
|
};
|
|
96
|
+
readonly webhooks: {
|
|
97
|
+
/**
|
|
98
|
+
* Register a webhook subscription. Server signs deliveries with
|
|
99
|
+
* HMAC-SHA256 over `${timestamp}.${rawBody}` using the
|
|
100
|
+
* registration-time secret per `spec/v1/webhooks.md` §"Signature
|
|
101
|
+
* recipe". The secret is returned ONCE in the response — store it
|
|
102
|
+
* server-side for verification; the host cannot recover it.
|
|
103
|
+
*/
|
|
104
|
+
register: (body: RegisterWebhookRequest, opts?: MutationOptions) => Promise<RegisterWebhookResponse>;
|
|
105
|
+
/**
|
|
106
|
+
* Unregister a webhook subscription. Returns void on success;
|
|
107
|
+
* throws `WopError` with `subscription_not_found` on unknown
|
|
108
|
+
* subscriptionId.
|
|
109
|
+
*/
|
|
110
|
+
unregister: (subscriptionId: string) => Promise<void>;
|
|
111
|
+
};
|
|
112
|
+
readonly prompts: {
|
|
113
|
+
/**
|
|
114
|
+
* List prompt templates available to the caller per RFC 0028 §A
|
|
115
|
+
* (operationId `listPromptTemplates`). Supports kind / tag / modelClass
|
|
116
|
+
* / source filters + opaque cursor pagination.
|
|
117
|
+
*/
|
|
118
|
+
list: (req?: ListPromptsRequest) => Promise<ListPromptsResponse>;
|
|
119
|
+
/**
|
|
120
|
+
* Fetch a single PromptTemplate by id per RFC 0028 §A
|
|
121
|
+
* (operationId `getPromptTemplate`). Optionally pin a SemVer
|
|
122
|
+
* `version`; supply `libraryId` to disambiguate when multiple installed
|
|
123
|
+
* packs ship the same templateId.
|
|
124
|
+
*/
|
|
125
|
+
get: (req: GetPromptRequest) => Promise<PromptTemplate>;
|
|
126
|
+
/**
|
|
127
|
+
* Render a PromptTemplate with supplied variable bindings per RFC 0028
|
|
128
|
+
* §A (operationId `renderPromptTemplate`). Returns composed body +
|
|
129
|
+
* sha256 hash + per-variable hashes. The deterministic-hash invariant
|
|
130
|
+
* (RFC 0028 §A) requires the `hash` to match what a matching
|
|
131
|
+
* `prompt.composed` event would carry at dispatch time. Does NOT
|
|
132
|
+
* dispatch an LLM call. Secret-source variable values MUST be supplied
|
|
133
|
+
* as `[REDACTED:<credentialRef>]` markers per
|
|
134
|
+
* SECURITY/threat-model-secret-leakage.md §SR-1.
|
|
135
|
+
*/
|
|
136
|
+
render: (req: RenderPromptRequest) => Promise<RenderPromptResponse>;
|
|
137
|
+
/**
|
|
138
|
+
* Create a new user-source PromptTemplate per RFC 0028 §A
|
|
139
|
+
* (operationId `createPromptTemplate`). Mutating endpoint —
|
|
140
|
+
* requires `capabilities.prompts.mutableLibrary: true`. Supports
|
|
141
|
+
* `Idempotency-Key` per the standard `MutationOptions` pattern.
|
|
142
|
+
*/
|
|
143
|
+
create: (template: PromptTemplate, opts?: MutationOptions) => Promise<void>;
|
|
144
|
+
/**
|
|
145
|
+
* Replace an existing user-source PromptTemplate per RFC 0028 §A
|
|
146
|
+
* (operationId `updatePromptTemplate`). Submitted SemVer MUST be
|
|
147
|
+
* strictly greater than stored. Mutating endpoint — requires
|
|
148
|
+
* `capabilities.prompts.mutableLibrary: true`. Pack-sourced and
|
|
149
|
+
* host-built-in templates are read-only (host returns 403).
|
|
150
|
+
*/
|
|
151
|
+
update: (templateId: string, template: PromptTemplate, opts?: MutationOptions) => Promise<PromptTemplate>;
|
|
152
|
+
/**
|
|
153
|
+
* Delete a user-source PromptTemplate per RFC 0028 §A
|
|
154
|
+
* (operationId `deletePromptTemplate`). Mutating endpoint —
|
|
155
|
+
* requires `capabilities.prompts.mutableLibrary: true`. Pack-sourced
|
|
156
|
+
* and host-built-in templates are read-only (host returns 403).
|
|
157
|
+
*/
|
|
158
|
+
delete: (templateId: string) => Promise<void>;
|
|
159
|
+
};
|
|
81
160
|
readonly audit: {
|
|
82
161
|
/**
|
|
83
162
|
* Verify the audit-log hash chain over `[fromSeq, toSeq]` per
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAgB,KAAK,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,EACvB,KAAK,+BAA+B,EACpC,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,oBAAoB;IACnC,gGAAgG;IAChG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2FAA2F;IAC3F,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B,mDAAmD;IACnD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,gFAAgF;IAChF,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC5B;AAUD,qBAAa,aAAa;;gBAMZ,IAAI,EAAE,oBAAoB;IAUtC,QAAQ,CAAC,SAAS;4BACE,OAAO,CAAC,YAAY,CAAC;uBAG1B,OAAO,CAAC,OAAO,CAAC;MAE7B;IAGF,QAAQ,CAAC,SAAS;0BACE,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;MAK3C;IAGF,QAAQ,CAAC,IAAI;uBACI,gBAAgB,SAAQ,eAAe,KAAQ,OAAO,CAAC,iBAAiB,CAAC;qBAQ3E,MAAM,KAAG,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -48,12 +48,53 @@ export class OpenwopClient {
|
|
|
48
48
|
method: 'GET',
|
|
49
49
|
path: `/v1/runs/${encodeURIComponent(runId)}`,
|
|
50
50
|
}),
|
|
51
|
+
/**
|
|
52
|
+
* Fetch the portable JSON diagnostic export for a single run per
|
|
53
|
+
* `spec/v1/debug-bundle.md`. The bundle's `redactionMode` reflects
|
|
54
|
+
* the host's advertised `capabilities.compliance.defaultMode`; the
|
|
55
|
+
* caller MUST treat masked/omitted/hashed fields as the
|
|
56
|
+
* spec-canonical value. The `truncated` + `truncatedReason` fields
|
|
57
|
+
* indicate the host hit its size cap.
|
|
58
|
+
*
|
|
59
|
+
* Returns `null` when the host doesn't advertise
|
|
60
|
+
* `capabilities.debugBundle.supported: true` (the endpoint returns
|
|
61
|
+
* 404 in that case per `debug-bundle.md` §"Authorization").
|
|
62
|
+
*/
|
|
63
|
+
debugBundle: async (runId, opts = {}) => {
|
|
64
|
+
const params = new URLSearchParams();
|
|
65
|
+
if (opts.maxEvents !== undefined)
|
|
66
|
+
params.set('maxEvents', String(opts.maxEvents));
|
|
67
|
+
const query = params.toString();
|
|
68
|
+
const path = `/v1/runs/${encodeURIComponent(runId)}/debug-bundle${query ? `?${query}` : ''}`;
|
|
69
|
+
try {
|
|
70
|
+
return await this.#request({ method: 'GET', path });
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
// Host doesn't advertise the capability → 404. Surface as null so callers
|
|
74
|
+
// can branch on capability discovery without try/catch.
|
|
75
|
+
if (err instanceof Error && /\b404\b/.test(err.message))
|
|
76
|
+
return null;
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
},
|
|
51
80
|
cancel: (runId, body = {}, opts = {}) => this.#request({
|
|
52
81
|
method: 'POST',
|
|
53
82
|
path: `/v1/runs/${encodeURIComponent(runId)}/cancel`,
|
|
54
83
|
body,
|
|
55
84
|
headers: this.#mutationHeaders(opts),
|
|
56
85
|
}),
|
|
86
|
+
pause: (runId, body = {}, opts = {}) => this.#request({
|
|
87
|
+
method: 'POST',
|
|
88
|
+
path: `/v1/runs/${encodeURIComponent(runId)}:pause`,
|
|
89
|
+
body,
|
|
90
|
+
headers: this.#mutationHeaders(opts),
|
|
91
|
+
}),
|
|
92
|
+
resume: (runId, body = {}, opts = {}) => this.#request({
|
|
93
|
+
method: 'POST',
|
|
94
|
+
path: `/v1/runs/${encodeURIComponent(runId)}:resume`,
|
|
95
|
+
body,
|
|
96
|
+
headers: this.#mutationHeaders(opts),
|
|
97
|
+
}),
|
|
57
98
|
/**
|
|
58
99
|
* Bulk-cancel a set of in-flight runs in a single request per
|
|
59
100
|
* `rest-endpoints.md` §"POST /v1/runs:bulk-cancel" (closes R1).
|
|
@@ -127,6 +168,151 @@ export class OpenwopClient {
|
|
|
127
168
|
headers: this.#mutationHeaders(opts),
|
|
128
169
|
}, false),
|
|
129
170
|
};
|
|
171
|
+
// ── Webhook subscriptions (per spec/v1/webhooks.md) ─────────────────────
|
|
172
|
+
webhooks = {
|
|
173
|
+
/**
|
|
174
|
+
* Register a webhook subscription. Server signs deliveries with
|
|
175
|
+
* HMAC-SHA256 over `${timestamp}.${rawBody}` using the
|
|
176
|
+
* registration-time secret per `spec/v1/webhooks.md` §"Signature
|
|
177
|
+
* recipe". The secret is returned ONCE in the response — store it
|
|
178
|
+
* server-side for verification; the host cannot recover it.
|
|
179
|
+
*/
|
|
180
|
+
register: (body, opts = {}) => this.#request({
|
|
181
|
+
method: 'POST',
|
|
182
|
+
path: '/v1/webhooks',
|
|
183
|
+
body,
|
|
184
|
+
headers: this.#mutationHeaders(opts),
|
|
185
|
+
}),
|
|
186
|
+
/**
|
|
187
|
+
* Unregister a webhook subscription. Returns void on success;
|
|
188
|
+
* throws `WopError` with `subscription_not_found` on unknown
|
|
189
|
+
* subscriptionId.
|
|
190
|
+
*/
|
|
191
|
+
unregister: async (subscriptionId) => {
|
|
192
|
+
await this.#request({
|
|
193
|
+
method: 'DELETE',
|
|
194
|
+
path: `/v1/webhooks/${encodeURIComponent(subscriptionId)}`,
|
|
195
|
+
});
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
// ── Prompt library (RFC 0028; gated on capabilities.prompts.*) ──
|
|
199
|
+
//
|
|
200
|
+
// Read endpoints (list, get, render) gate on
|
|
201
|
+
// `capabilities.prompts.endpointsSupported: true`. Mutating endpoints
|
|
202
|
+
// (create, update, delete) additionally require
|
|
203
|
+
// `capabilities.prompts.mutableLibrary: true`. Hosts that don't advertise
|
|
204
|
+
// the relevant capability return `501 capability_not_provided`; the SDK
|
|
205
|
+
// surfaces that as a `WopError`. Clients SHOULD pre-flight via
|
|
206
|
+
// `getCapabilities()` before calling.
|
|
207
|
+
//
|
|
208
|
+
// NOTE: `capabilities.prompts.supported: true` (without
|
|
209
|
+
// `endpointsSupported: true`) ONLY gates node-execution PromptRef
|
|
210
|
+
// resolution per RFC 0027 Phase A; it does NOT imply these endpoints are
|
|
211
|
+
// available. See spec/v1/prompts.md §"Capability advertisement" for the
|
|
212
|
+
// two-axis gating split.
|
|
213
|
+
prompts = {
|
|
214
|
+
/**
|
|
215
|
+
* List prompt templates available to the caller per RFC 0028 §A
|
|
216
|
+
* (operationId `listPromptTemplates`). Supports kind / tag / modelClass
|
|
217
|
+
* / source filters + opaque cursor pagination.
|
|
218
|
+
*/
|
|
219
|
+
list: (req = {}) => {
|
|
220
|
+
const search = new URLSearchParams();
|
|
221
|
+
if (req.kind)
|
|
222
|
+
search.set('kind', req.kind);
|
|
223
|
+
if (req.tag)
|
|
224
|
+
search.set('tag', req.tag);
|
|
225
|
+
if (req.modelClass)
|
|
226
|
+
search.set('modelClass', req.modelClass);
|
|
227
|
+
if (req.source)
|
|
228
|
+
search.set('source', req.source);
|
|
229
|
+
if (req.cursor)
|
|
230
|
+
search.set('cursor', req.cursor);
|
|
231
|
+
if (req.limit !== undefined)
|
|
232
|
+
search.set('limit', String(req.limit));
|
|
233
|
+
const query = search.toString();
|
|
234
|
+
return this.#request({
|
|
235
|
+
method: 'GET',
|
|
236
|
+
path: `/v1/prompts${query ? `?${query}` : ''}`,
|
|
237
|
+
});
|
|
238
|
+
},
|
|
239
|
+
/**
|
|
240
|
+
* Fetch a single PromptTemplate by id per RFC 0028 §A
|
|
241
|
+
* (operationId `getPromptTemplate`). Optionally pin a SemVer
|
|
242
|
+
* `version`; supply `libraryId` to disambiguate when multiple installed
|
|
243
|
+
* packs ship the same templateId.
|
|
244
|
+
*/
|
|
245
|
+
get: (req) => {
|
|
246
|
+
const search = new URLSearchParams();
|
|
247
|
+
if (req.version)
|
|
248
|
+
search.set('version', req.version);
|
|
249
|
+
if (req.libraryId)
|
|
250
|
+
search.set('libraryId', req.libraryId);
|
|
251
|
+
const query = search.toString();
|
|
252
|
+
return this.#request({
|
|
253
|
+
method: 'GET',
|
|
254
|
+
path: `/v1/prompts/${encodeURIComponent(req.templateId)}${query ? `?${query}` : ''}`,
|
|
255
|
+
});
|
|
256
|
+
},
|
|
257
|
+
/**
|
|
258
|
+
* Render a PromptTemplate with supplied variable bindings per RFC 0028
|
|
259
|
+
* §A (operationId `renderPromptTemplate`). Returns composed body +
|
|
260
|
+
* sha256 hash + per-variable hashes. The deterministic-hash invariant
|
|
261
|
+
* (RFC 0028 §A) requires the `hash` to match what a matching
|
|
262
|
+
* `prompt.composed` event would carry at dispatch time. Does NOT
|
|
263
|
+
* dispatch an LLM call. Secret-source variable values MUST be supplied
|
|
264
|
+
* as `[REDACTED:<credentialRef>]` markers per
|
|
265
|
+
* SECURITY/threat-model-secret-leakage.md §SR-1.
|
|
266
|
+
*/
|
|
267
|
+
render: (req) => {
|
|
268
|
+
return this.#request({
|
|
269
|
+
method: 'POST',
|
|
270
|
+
path: '/v1/prompts:render',
|
|
271
|
+
body: req,
|
|
272
|
+
});
|
|
273
|
+
},
|
|
274
|
+
/**
|
|
275
|
+
* Create a new user-source PromptTemplate per RFC 0028 §A
|
|
276
|
+
* (operationId `createPromptTemplate`). Mutating endpoint —
|
|
277
|
+
* requires `capabilities.prompts.mutableLibrary: true`. Supports
|
|
278
|
+
* `Idempotency-Key` per the standard `MutationOptions` pattern.
|
|
279
|
+
*/
|
|
280
|
+
create: (template, opts = {}) => {
|
|
281
|
+
return this.#request({
|
|
282
|
+
method: 'POST',
|
|
283
|
+
path: '/v1/prompts',
|
|
284
|
+
body: template,
|
|
285
|
+
headers: this.#mutationHeaders(opts),
|
|
286
|
+
});
|
|
287
|
+
},
|
|
288
|
+
/**
|
|
289
|
+
* Replace an existing user-source PromptTemplate per RFC 0028 §A
|
|
290
|
+
* (operationId `updatePromptTemplate`). Submitted SemVer MUST be
|
|
291
|
+
* strictly greater than stored. Mutating endpoint — requires
|
|
292
|
+
* `capabilities.prompts.mutableLibrary: true`. Pack-sourced and
|
|
293
|
+
* host-built-in templates are read-only (host returns 403).
|
|
294
|
+
*/
|
|
295
|
+
update: (templateId, template, opts = {}) => {
|
|
296
|
+
return this.#request({
|
|
297
|
+
method: 'PUT',
|
|
298
|
+
path: `/v1/prompts/${encodeURIComponent(templateId)}`,
|
|
299
|
+
body: template,
|
|
300
|
+
headers: this.#mutationHeaders(opts),
|
|
301
|
+
});
|
|
302
|
+
},
|
|
303
|
+
/**
|
|
304
|
+
* Delete a user-source PromptTemplate per RFC 0028 §A
|
|
305
|
+
* (operationId `deletePromptTemplate`). Mutating endpoint —
|
|
306
|
+
* requires `capabilities.prompts.mutableLibrary: true`. Pack-sourced
|
|
307
|
+
* and host-built-in templates are read-only (host returns 403).
|
|
308
|
+
*/
|
|
309
|
+
delete: (templateId) => {
|
|
310
|
+
return this.#request({
|
|
311
|
+
method: 'DELETE',
|
|
312
|
+
path: `/v1/prompts/${encodeURIComponent(templateId)}`,
|
|
313
|
+
});
|
|
314
|
+
},
|
|
315
|
+
};
|
|
130
316
|
// ── Audit-log integrity (gated on openwop-audit-log-integrity profile) ──
|
|
131
317
|
audit = {
|
|
132
318
|
/**
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cost-attribution allowlist + sanitizer helpers
|
|
3
|
+
* (`spec/v1/observability.md §"Cost attribution attributes"`).
|
|
4
|
+
*
|
|
5
|
+
* The spec MUSTs that hosts emitting `openwop.cost.*` OTel span attrs
|
|
6
|
+
* route them through an allowlist sanitizer that drops any attribute
|
|
7
|
+
* name outside the canonical set AND any non-primitive value. The
|
|
8
|
+
* `cost-attribution-allowlist-redaction` SECURITY invariant + the
|
|
9
|
+
* `cost-attribution.test.ts` conformance scenario are the public test
|
|
10
|
+
* surface; this module is the SDK-side helper that independent hosts
|
|
11
|
+
* (TypeScript / Python / Go) can share so the allowlist has a single
|
|
12
|
+
* source of truth instead of being re-derived in each runtime.
|
|
13
|
+
*
|
|
14
|
+
* Why this lives in the SDK and not just the conformance suite:
|
|
15
|
+
* implementations need the allowlist at HOST EMIT TIME (before spans
|
|
16
|
+
* are written). Importing from `@openwop/openwop` keeps the runtime
|
|
17
|
+
* + the conformance assertion in lockstep — if a future RFC adds an
|
|
18
|
+
* eighth attribute, one PR updates the constant and both surfaces
|
|
19
|
+
* pick it up.
|
|
20
|
+
*
|
|
21
|
+
* @see spec/v1/observability.md §"Cost attribution attributes"
|
|
22
|
+
* @see SECURITY/invariants.yaml row `cost-attribution-allowlist-redaction`
|
|
23
|
+
* @see conformance/src/scenarios/cost-attribution.test.ts
|
|
24
|
+
*/
|
|
25
|
+
/** Canonical allowlist of cost-attribute names. Mutating this list is
|
|
26
|
+
* a wire-shape change — needs an RFC. */
|
|
27
|
+
export declare const OPENWOP_COST_ATTRIBUTE_NAMES: readonly ["openwop.cost.tokens.input", "openwop.cost.tokens.output", "openwop.cost.tokens.total", "openwop.cost.usd", "openwop.cost.currency", "openwop.cost.estimated", "openwop.cost.provider"];
|
|
28
|
+
/** Union of the canonical attribute names. Useful for typed
|
|
29
|
+
* sanitizer outputs in callers that pin the shape. */
|
|
30
|
+
export type OpenwopCostAttributeName = (typeof OPENWOP_COST_ATTRIBUTE_NAMES)[number];
|
|
31
|
+
/** Pure-function sanitizer. Returns a NEW object containing only
|
|
32
|
+
* allowlisted keys with primitive-typed values (number / string /
|
|
33
|
+
* boolean). Drops anything else — non-allowlisted keys, nested
|
|
34
|
+
* objects, arrays, functions, symbols, null, undefined.
|
|
35
|
+
*
|
|
36
|
+
* Callers SHOULD invoke this immediately before writing cost attrs
|
|
37
|
+
* to an OTel span:
|
|
38
|
+
*
|
|
39
|
+
* ```ts
|
|
40
|
+
* import { sanitizeCostAttributes } from '@openwop/openwop';
|
|
41
|
+
* for (const [k, v] of Object.entries(sanitizeCostAttributes(rawAttrs))) {
|
|
42
|
+
* span.setAttribute(k, v);
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* The reference workflow-engine host wires this via
|
|
47
|
+
* `apps/workflow-engine/backend/typescript/src/observability/costEmitter.ts`. */
|
|
48
|
+
export declare function sanitizeCostAttributes(input: Record<string, unknown>): Record<string, number | string | boolean>;
|
|
49
|
+
//# sourceMappingURL=cost-attribution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-attribution.d.ts","sourceRoot":"","sources":["../src/cost-attribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;0CAC0C;AAC1C,eAAO,MAAM,4BAA4B,mMAQ/B,CAAC;AAEX;uDACuD;AACvD,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAIrF;;;;;;;;;;;;;;;;kFAgBkF;AAClF,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAS3C"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cost-attribution allowlist + sanitizer helpers
|
|
3
|
+
* (`spec/v1/observability.md §"Cost attribution attributes"`).
|
|
4
|
+
*
|
|
5
|
+
* The spec MUSTs that hosts emitting `openwop.cost.*` OTel span attrs
|
|
6
|
+
* route them through an allowlist sanitizer that drops any attribute
|
|
7
|
+
* name outside the canonical set AND any non-primitive value. The
|
|
8
|
+
* `cost-attribution-allowlist-redaction` SECURITY invariant + the
|
|
9
|
+
* `cost-attribution.test.ts` conformance scenario are the public test
|
|
10
|
+
* surface; this module is the SDK-side helper that independent hosts
|
|
11
|
+
* (TypeScript / Python / Go) can share so the allowlist has a single
|
|
12
|
+
* source of truth instead of being re-derived in each runtime.
|
|
13
|
+
*
|
|
14
|
+
* Why this lives in the SDK and not just the conformance suite:
|
|
15
|
+
* implementations need the allowlist at HOST EMIT TIME (before spans
|
|
16
|
+
* are written). Importing from `@openwop/openwop` keeps the runtime
|
|
17
|
+
* + the conformance assertion in lockstep — if a future RFC adds an
|
|
18
|
+
* eighth attribute, one PR updates the constant and both surfaces
|
|
19
|
+
* pick it up.
|
|
20
|
+
*
|
|
21
|
+
* @see spec/v1/observability.md §"Cost attribution attributes"
|
|
22
|
+
* @see SECURITY/invariants.yaml row `cost-attribution-allowlist-redaction`
|
|
23
|
+
* @see conformance/src/scenarios/cost-attribution.test.ts
|
|
24
|
+
*/
|
|
25
|
+
/** Canonical allowlist of cost-attribute names. Mutating this list is
|
|
26
|
+
* a wire-shape change — needs an RFC. */
|
|
27
|
+
export const OPENWOP_COST_ATTRIBUTE_NAMES = [
|
|
28
|
+
'openwop.cost.tokens.input',
|
|
29
|
+
'openwop.cost.tokens.output',
|
|
30
|
+
'openwop.cost.tokens.total',
|
|
31
|
+
'openwop.cost.usd',
|
|
32
|
+
'openwop.cost.currency',
|
|
33
|
+
'openwop.cost.estimated',
|
|
34
|
+
'openwop.cost.provider',
|
|
35
|
+
];
|
|
36
|
+
const ALLOWLIST = new Set(OPENWOP_COST_ATTRIBUTE_NAMES);
|
|
37
|
+
/** Pure-function sanitizer. Returns a NEW object containing only
|
|
38
|
+
* allowlisted keys with primitive-typed values (number / string /
|
|
39
|
+
* boolean). Drops anything else — non-allowlisted keys, nested
|
|
40
|
+
* objects, arrays, functions, symbols, null, undefined.
|
|
41
|
+
*
|
|
42
|
+
* Callers SHOULD invoke this immediately before writing cost attrs
|
|
43
|
+
* to an OTel span:
|
|
44
|
+
*
|
|
45
|
+
* ```ts
|
|
46
|
+
* import { sanitizeCostAttributes } from '@openwop/openwop';
|
|
47
|
+
* for (const [k, v] of Object.entries(sanitizeCostAttributes(rawAttrs))) {
|
|
48
|
+
* span.setAttribute(k, v);
|
|
49
|
+
* }
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* The reference workflow-engine host wires this via
|
|
53
|
+
* `apps/workflow-engine/backend/typescript/src/observability/costEmitter.ts`. */
|
|
54
|
+
export function sanitizeCostAttributes(input) {
|
|
55
|
+
const out = {};
|
|
56
|
+
for (const [key, value] of Object.entries(input)) {
|
|
57
|
+
if (!ALLOWLIST.has(key))
|
|
58
|
+
continue;
|
|
59
|
+
if (typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean') {
|
|
60
|
+
out[key] = value;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=cost-attribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-attribution.js","sourceRoot":"","sources":["../src/cost-attribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;0CAC0C;AAC1C,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,2BAA2B;IAC3B,4BAA4B;IAC5B,2BAA2B;IAC3B,kBAAkB;IAClB,uBAAuB;IACvB,wBAAwB;IACxB,uBAAuB;CACf,CAAC;AAMX,MAAM,SAAS,GAAwB,IAAI,GAAG,CAAS,4BAA4B,CAAC,CAAC;AAErF;;;;;;;;;;;;;;;;kFAgBkF;AAClF,MAAM,UAAU,sBAAsB,CACpC,KAA8B;IAE9B,MAAM,GAAG,GAA8C,EAAE,CAAC;IAC1D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YACzF,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed helpers for the `agent.*` event family (RFC 0002 §B + RFC 0024).
|
|
3
|
+
*
|
|
4
|
+
* Two layers:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Type guards** (`isAgentReasoned`, `isAgentReasoningDelta`, etc.)
|
|
7
|
+
* — discriminator-based predicates that narrow `RunEventDoc` to a
|
|
8
|
+
* `TypedRunEvent<TPayload>` inside the guarded branch. Use these
|
|
9
|
+
* when you're iterating events yourself (e.g., inside a
|
|
10
|
+
* `for await (const ev of streamEvents(...))` loop) and want
|
|
11
|
+
* compile-time-narrowed access to the payload.
|
|
12
|
+
*
|
|
13
|
+
* 2. **High-level subscription helper** (`subscribeToAgentReasoning`)
|
|
14
|
+
* — fan-outs the `streamEvents()` generator into typed callbacks
|
|
15
|
+
* (`onDelta`, `onClosed`). Composes with the existing
|
|
16
|
+
* `streamEvents` SSE consumer; cleanup via the returned
|
|
17
|
+
* `Unsubscribe` function aborts the underlying fetch.
|
|
18
|
+
*
|
|
19
|
+
* Forward-compat: `RunEventDoc.type` is intentionally `string`-typed
|
|
20
|
+
* (not a closed union) per `COMPATIBILITY.md §2.1` — consumers MUST
|
|
21
|
+
* tolerate unknown event types. The type guards here only narrow when
|
|
22
|
+
* the discriminator AND the required payload fields are present; they
|
|
23
|
+
* return `false` for malformed or unknown events.
|
|
24
|
+
*
|
|
25
|
+
* @see schemas/run-event-payloads.schema.json
|
|
26
|
+
* @see RFCS/0002-agent-identity-and-reasoning-events.md
|
|
27
|
+
* @see RFCS/0024-agent-reasoning-streaming.md
|
|
28
|
+
*/
|
|
29
|
+
import { type EventsStreamContext, type EventsStreamOptions } from './sse.js';
|
|
30
|
+
import type { AgentDecidedPayload, AgentHandoffPayload, AgentReasonedPayload, AgentReasoningDeltaPayload, AgentToolCalledPayload, AgentToolReturnedPayload, RunEventDoc, TypedRunEvent } from './types.js';
|
|
31
|
+
/** `agent.reasoned` (RFC 0002 §B). Narrows when `type` matches AND
|
|
32
|
+
* payload carries the required `agentId` + `reasoning` strings. */
|
|
33
|
+
export declare function isAgentReasoned(ev: RunEventDoc): ev is TypedRunEvent<AgentReasonedPayload>;
|
|
34
|
+
/** `agent.reasoning.delta` (RFC 0024). Narrows when `type` matches AND
|
|
35
|
+
* payload carries the required `agentId` + `delta` strings + numeric
|
|
36
|
+
* `sequence`. */
|
|
37
|
+
export declare function isAgentReasoningDelta(ev: RunEventDoc): ev is TypedRunEvent<AgentReasoningDeltaPayload>;
|
|
38
|
+
/** `agent.toolCalled` (RFC 0002 §B). */
|
|
39
|
+
export declare function isAgentToolCalled(ev: RunEventDoc): ev is TypedRunEvent<AgentToolCalledPayload>;
|
|
40
|
+
/** `agent.toolReturned` (RFC 0002 §B). Pairs with `agent.toolCalled`
|
|
41
|
+
* via `callId`; `outcome` and `error` are mutually exclusive but the
|
|
42
|
+
* guard doesn't enforce that (callers inspect after narrowing). */
|
|
43
|
+
export declare function isAgentToolReturned(ev: RunEventDoc): ev is TypedRunEvent<AgentToolReturnedPayload>;
|
|
44
|
+
/** `agent.handoff` (RFC 0002 §B). Note the distinct field names —
|
|
45
|
+
* `fromAgentId` / `toAgentId`, NOT a single `agentId`. */
|
|
46
|
+
export declare function isAgentHandoff(ev: RunEventDoc): ev is TypedRunEvent<AgentHandoffPayload>;
|
|
47
|
+
/** `agent.decided` (RFC 0002 §B). `decision` is `unknown` per the
|
|
48
|
+
* schema (host-specific shape); guard only validates `agentId` +
|
|
49
|
+
* the presence of a `decision` key. */
|
|
50
|
+
export declare function isAgentDecided(ev: RunEventDoc): ev is TypedRunEvent<AgentDecidedPayload>;
|
|
51
|
+
/** Returned by {@link subscribeToAgentReasoning}. Call to cancel the
|
|
52
|
+
* underlying SSE subscription. Idempotent — repeated calls are no-ops. */
|
|
53
|
+
export type Unsubscribe = () => void;
|
|
54
|
+
/** Per-callback signatures for {@link subscribeToAgentReasoning}. All
|
|
55
|
+
* callbacks are optional; the helper only invokes those provided.
|
|
56
|
+
* Callback exceptions are caught + reported via `onError` (when
|
|
57
|
+
* provided) so one bad handler doesn't tear down the stream. */
|
|
58
|
+
export interface AgentReasoningCallbacks {
|
|
59
|
+
/** Fired for each `agent.reasoning.delta` event in arrival order
|
|
60
|
+
* (RFC 0024). `sequence` starts at 0 and increments by 1 per delta
|
|
61
|
+
* within a single reasoning block. */
|
|
62
|
+
onDelta?: (payload: AgentReasoningDeltaPayload, ev: TypedRunEvent<AgentReasoningDeltaPayload>) => void | Promise<void>;
|
|
63
|
+
/** Fired once per closed reasoning block with the full
|
|
64
|
+
* authoritative content. Consumers that only care about the final
|
|
65
|
+
* trace can subscribe just to this. */
|
|
66
|
+
onClosed?: (payload: AgentReasonedPayload, ev: TypedRunEvent<AgentReasonedPayload>) => void | Promise<void>;
|
|
67
|
+
/** Fired when the SSE stream ends cleanly (server closed or run
|
|
68
|
+
* reached terminal status). */
|
|
69
|
+
onEnd?: () => void;
|
|
70
|
+
/** Fired when the stream fails OR a callback throws. The helper
|
|
71
|
+
* catches handler exceptions so a thrown error in `onDelta` doesn't
|
|
72
|
+
* tear down the whole subscription; the original error is surfaced
|
|
73
|
+
* here. */
|
|
74
|
+
onError?: (err: Error) => void;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Subscribe to the reasoning event sub-stream for a single run.
|
|
78
|
+
* Convenience wrapper over `streamEvents()` that dispatches the two
|
|
79
|
+
* RFC 0024 event types into typed callbacks.
|
|
80
|
+
*
|
|
81
|
+
* Returns immediately; the SSE consumption runs as a detached async
|
|
82
|
+
* task in the background. Call the returned `Unsubscribe` to cancel.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```ts
|
|
86
|
+
* const stop = subscribeToAgentReasoning(ctx, runId, {
|
|
87
|
+
* onDelta: ({ delta, sequence }) => process.stdout.write(delta),
|
|
88
|
+
* onClosed: ({ reasoning }) => console.log('\nfinal:', reasoning),
|
|
89
|
+
* });
|
|
90
|
+
* // ...later
|
|
91
|
+
* stop();
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export declare function subscribeToAgentReasoning(ctx: EventsStreamContext, runId: string, callbacks: AgentReasoningCallbacks, options?: Omit<EventsStreamOptions, 'signal'>): Unsubscribe;
|
|
95
|
+
//# sourceMappingURL=event-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-helpers.d.ts","sourceRoot":"","sources":["../src/event-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAgB,KAAK,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC5F,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,sBAAsB,EACtB,wBAAwB,EACxB,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AAepB;oEACoE;AACpE,wBAAgB,eAAe,CAC7B,EAAE,EAAE,WAAW,GACd,EAAE,IAAI,aAAa,CAAC,oBAAoB,CAAC,CAM3C;AAED;;kBAEkB;AAClB,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,WAAW,GACd,EAAE,IAAI,aAAa,CAAC,0BAA0B,CAAC,CAMjD;AAED,wCAAwC;AACxC,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,WAAW,GACd,EAAE,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAO7C;AAED;;oEAEoE;AACpE,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,WAAW,GACd,EAAE,IAAI,aAAa,CAAC,wBAAwB,CAAC,CAO/C;AAED;2DAC2D;AAC3D,wBAAgB,cAAc,CAC5B,EAAE,EAAE,WAAW,GACd,EAAE,IAAI,aAAa,CAAC,mBAAmB,CAAC,CAM1C;AAED;;wCAEwC;AACxC,wBAAgB,cAAc,CAC5B,EAAE,EAAE,WAAW,GACd,EAAE,IAAI,aAAa,CAAC,mBAAmB,CAAC,CAQ1C;AAID;2EAC2E;AAC3E,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC;;;iEAGiE;AACjE,MAAM,WAAW,uBAAuB;IACtC;;2CAEuC;IACvC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,0BAA0B,EAAE,EAAE,EAAE,aAAa,CAAC,0BAA0B,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvH;;4CAEwC;IACxC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,EAAE,EAAE,aAAa,CAAC,oBAAoB,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5G;oCACgC;IAChC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB;;;gBAGY;IACZ,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,mBAAmB,EACxB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,uBAAuB,EAClC,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAM,GAChD,WAAW,CAqDb"}
|