anthale 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,199 @@
1
+ import { Anthale } from "../client.mjs";
2
+ import { AnthaleError } from "../core/error.mjs";
3
+ /**
4
+ * Error raised when Anthale returns a blocking action.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { AnthalePolicyViolationError } from 'anthale/integrations/core';
9
+ *
10
+ * try {
11
+ * // ...
12
+ * } catch (error) {
13
+ * if (error instanceof AnthalePolicyViolationError) {
14
+ * console.error(error.enforcementIdentifier);
15
+ * }
16
+ * }
17
+ * ```
18
+ */
19
+ export class AnthalePolicyViolationError extends AnthaleError {
20
+ constructor(enforcementIdentifier) {
21
+ super(`Policy enforcement '${enforcementIdentifier}' was blocked due to a policy violation.`);
22
+ this.enforcementIdentifier = enforcementIdentifier;
23
+ }
24
+ }
25
+ /**
26
+ * Lightweight policy enforcer used by provider integrations.
27
+ *
28
+ * It always calls Anthale with `includeEvaluations: false` and throws
29
+ * {@link AnthalePolicyViolationError} when the resulting action is `block`.
30
+ */
31
+ export class PolicyEnforcer {
32
+ /**
33
+ * Create a policy enforcer.
34
+ *
35
+ * @param options - Enforcer options.
36
+ */
37
+ constructor(options) {
38
+ this.client = options.client ?? new Anthale({ apiKey: options.apiKey });
39
+ this.policyId = options.policyId;
40
+ this.metadata = options.metadata ?? {};
41
+ }
42
+ /**
43
+ * Enforce the configured Anthale policy on a message set.
44
+ *
45
+ * @param options - Enforcement options.
46
+ * @returns The raw Anthale enforcement response.
47
+ * @throws {AnthalePolicyViolationError} When Anthale action is `block`.
48
+ */
49
+ async enforce(options) {
50
+ const response = await this.client.organizations.policies.enforce(this.policyId, {
51
+ direction: options.direction,
52
+ messages: options.messages,
53
+ includeEvaluations: false,
54
+ metadata: { ...this.metadata, ...(options.metadata ?? {}) },
55
+ });
56
+ if (response.action === 'block') {
57
+ throw new AnthalePolicyViolationError(response.enforcerIdentifier);
58
+ }
59
+ return response;
60
+ }
61
+ }
62
+ /**
63
+ * Convenience factory for {@link PolicyEnforcer}.
64
+ */
65
+ export function buildPolicyEnforcer(options) {
66
+ return new PolicyEnforcer(options);
67
+ }
68
+ const ROLE_MAP = {
69
+ system: 'system',
70
+ developer: 'system',
71
+ machine: 'system',
72
+ user: 'user',
73
+ human: 'user',
74
+ assistant: 'assistant',
75
+ ai: 'assistant',
76
+ tool: 'tool',
77
+ function: 'tool',
78
+ };
79
+ /**
80
+ * Normalize a role-like value to one of Anthale's supported roles.
81
+ *
82
+ * Unknown or non-string values fall back to `user`.
83
+ */
84
+ export function normalizeRole(value) {
85
+ if (typeof value !== 'string') {
86
+ return 'user';
87
+ }
88
+ return ROLE_MAP[value.toLowerCase()] ?? 'user';
89
+ }
90
+ /**
91
+ * Safely stringify arbitrary values for message content.
92
+ */
93
+ export function stringify(value) {
94
+ if (typeof value === 'string') {
95
+ return value;
96
+ }
97
+ if (value == null) {
98
+ return String(value);
99
+ }
100
+ if (typeof value === 'object') {
101
+ try {
102
+ return JSON.stringify(value);
103
+ }
104
+ catch {
105
+ return String(value);
106
+ }
107
+ }
108
+ return String(value);
109
+ }
110
+ /**
111
+ * Normalize different message content shapes to a plain string.
112
+ *
113
+ * Handles raw strings, block arrays, and nested mappings commonly returned by
114
+ * OpenAI and LangChain payloads.
115
+ */
116
+ export function extractContent(raw) {
117
+ if (raw == null) {
118
+ return '';
119
+ }
120
+ if (typeof raw === 'string') {
121
+ return raw;
122
+ }
123
+ if (Array.isArray(raw)) {
124
+ const parts = raw
125
+ .map((block) => {
126
+ if (typeof block === 'string') {
127
+ return block;
128
+ }
129
+ if (block && typeof block === 'object') {
130
+ const record = block;
131
+ return extractContent(record['text'] ??
132
+ record['output_text'] ??
133
+ record['input_text'] ??
134
+ record['content'] ??
135
+ record['arguments'] ??
136
+ block);
137
+ }
138
+ return stringify(block);
139
+ })
140
+ .filter((part) => part.length > 0);
141
+ return parts.join('\n');
142
+ }
143
+ if (typeof raw === 'object') {
144
+ const record = raw;
145
+ return extractContent(record['text'] ?? record['output_text'] ?? record['input_text'] ?? record['content'] ?? stringify(raw));
146
+ }
147
+ return stringify(raw);
148
+ }
149
+ /**
150
+ * Convert a role/content pair into an Anthale message.
151
+ *
152
+ * Empty/blank content returns `null`.
153
+ */
154
+ export function toAnthaleMessage(value) {
155
+ const content = extractContent(value.content);
156
+ if (!content || content.trim() === '' || content.trim() === 'None') {
157
+ return null;
158
+ }
159
+ return {
160
+ role: normalizeRole(value.role),
161
+ content,
162
+ };
163
+ }
164
+ /**
165
+ * Recursively convert unknown payload values into Anthale messages.
166
+ *
167
+ * This function is intentionally permissive so integrations can normalize
168
+ * heterogeneous provider payloads with a single utility.
169
+ */
170
+ export function messagesFromValue(value, defaultRole) {
171
+ if (value == null) {
172
+ return [];
173
+ }
174
+ if (Array.isArray(value)) {
175
+ const out = [];
176
+ for (const item of value) {
177
+ out.push(...messagesFromValue(item, defaultRole));
178
+ }
179
+ return out;
180
+ }
181
+ if (typeof value === 'object') {
182
+ const record = value;
183
+ const message = toAnthaleMessage({
184
+ role: record['role'] ?? defaultRole,
185
+ content: record['content'] ??
186
+ record['text'] ??
187
+ record['input_text'] ??
188
+ record['output_text'] ??
189
+ record['arguments'],
190
+ });
191
+ return message == null ? [] : [message];
192
+ }
193
+ const content = stringify(value);
194
+ if (!content || content.trim() === '' || content.trim() === 'None') {
195
+ return [];
196
+ }
197
+ return [{ role: normalizeRole(defaultRole), content }];
198
+ }
199
+ //# sourceMappingURL=core.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.mjs","sourceRoot":"","sources":["../src/integrations/core.ts"],"names":[],"mappings":"OAAO,EAAE,OAAO,EAAE;OACX,EAAE,YAAY,EAAE;AA4DvB;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,2BAA4B,SAAQ,YAAY;IAG3D,YAAY,qBAA6B;QACvC,KAAK,CAAC,uBAAuB,qBAAqB,0CAA0C,CAAC,CAAC;QAC9F,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;IACrD,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IAKzB;;;;OAIG;IACH,YAAY,OAA8B;QACxC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IACzC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC/E,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,kBAAkB,EAAE,KAAK;YACzB,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE;SAC5D,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,2BAA2B,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA8B;IAChE,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAID,MAAM,QAAQ,GAAgC;IAC5C,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,QAAQ;IACnB,OAAO,EAAE,QAAQ;IACjB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,MAAM;IACb,SAAS,EAAE,WAAW;IACtB,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,MAAM;CACjB,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,MAAM,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG;aACd,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvC,MAAM,MAAM,GAAG,KAAgC,CAAC;gBAChD,OAAO,cAAc,CACnB,MAAM,CAAC,MAAM,CAAC;oBACZ,MAAM,CAAC,aAAa,CAAC;oBACrB,MAAM,CAAC,YAAY,CAAC;oBACpB,MAAM,CAAC,SAAS,CAAC;oBACjB,MAAM,CAAC,WAAW,CAAC;oBACnB,KAAK,CACR,CAAC;YACJ,CAAC;YAED,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAErC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,GAA8B,CAAC;QAC9C,OAAO,cAAc,CACnB,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,CACvG,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAGhC;IACC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/B,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAE,WAAwB;IACxE,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,GAAkC,EAAE,CAAC;QAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,OAAO,GAAG,gBAAgB,CAAC;YAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,WAAW;YACnC,OAAO,EACL,MAAM,CAAC,SAAS,CAAC;gBACjB,MAAM,CAAC,MAAM,CAAC;gBACd,MAAM,CAAC,YAAY,CAAC;gBACpB,MAAM,CAAC,aAAa,CAAC;gBACrB,MAAM,CAAC,WAAW,CAAC;SACtB,CAAC,CAAC;QAEH,OAAO,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { type PolicyEnforcerOptions } from "./core.mjs";
2
+ interface OpenAIClientLike {
3
+ responses?: {
4
+ create?: unknown;
5
+ };
6
+ chat?: {
7
+ completions?: {
8
+ create?: unknown;
9
+ };
10
+ };
11
+ }
12
+ /**
13
+ * Options for {@link guardOpenAIClient}.
14
+ *
15
+ * Inherits all policy enforcer options (`policyId`, `apiKey`, `client`,
16
+ * `metadata`).
17
+ */
18
+ export interface GuardOpenAIClientOptions extends PolicyEnforcerOptions {
19
+ }
20
+ /**
21
+ * Guard an existing OpenAI client instance in place.
22
+ *
23
+ * Supported call sites:
24
+ * - `client.responses.create(...)`
25
+ * - `client.chat.completions.create(...)`
26
+ *
27
+ * Behavior:
28
+ * - Enforces `input` policy before request execution.
29
+ * - Enforces `output` policy after response generation.
30
+ * - For streaming calls, buffers chunks and enforces once on stream completion.
31
+ *
32
+ * The same client object is returned and marked as guarded for idempotency.
33
+ *
34
+ * @param openAIClient - OpenAI SDK client instance to instrument.
35
+ * @param options - Anthale policy enforcer options.
36
+ * @returns The same `openAIClient` instance, now guarded.
37
+ * @throws {TypeError} If no supported OpenAI create method is exposed.
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * import OpenAI from 'openai';
42
+ * import { guardOpenAIClient } from 'anthale/integrations/openai';
43
+ *
44
+ * const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
45
+ * guardOpenAIClient(openai, {
46
+ * policyId: 'pol_123',
47
+ * apiKey: process.env.ANTHALE_API_KEY,
48
+ * metadata: { tenantId: 'acme' },
49
+ * });
50
+ *
51
+ * const response = await openai.responses.create({
52
+ * model: 'gpt-4.1-mini',
53
+ * input: 'Hello!',
54
+ * });
55
+ * ```
56
+ */
57
+ export declare function guardOpenAIClient<TClient extends OpenAIClientLike>(openAIClient: TClient, options: GuardOpenAIClientOptions): TClient;
58
+ /**
59
+ * Alias of {@link guardOpenAIClient}.
60
+ */
61
+ export declare const guardClient: typeof guardOpenAIClient;
62
+ export {};
63
+ //# sourceMappingURL=openai.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.mts","sourceRoot":"","sources":["../src/integrations/openai.ts"],"names":[],"mappings":"OACO,EAAuB,KAAK,qBAAqB,EAAoC;AAQ5F,UAAU,gBAAgB;IACxB,SAAS,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACjC,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAC;CAC/C;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;CAAG;AAqU1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,SAAS,gBAAgB,EAChE,YAAY,EAAE,OAAO,EACrB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAqCT;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,0BAAoB,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { type PolicyEnforcerOptions } from "./core.js";
2
+ interface OpenAIClientLike {
3
+ responses?: {
4
+ create?: unknown;
5
+ };
6
+ chat?: {
7
+ completions?: {
8
+ create?: unknown;
9
+ };
10
+ };
11
+ }
12
+ /**
13
+ * Options for {@link guardOpenAIClient}.
14
+ *
15
+ * Inherits all policy enforcer options (`policyId`, `apiKey`, `client`,
16
+ * `metadata`).
17
+ */
18
+ export interface GuardOpenAIClientOptions extends PolicyEnforcerOptions {
19
+ }
20
+ /**
21
+ * Guard an existing OpenAI client instance in place.
22
+ *
23
+ * Supported call sites:
24
+ * - `client.responses.create(...)`
25
+ * - `client.chat.completions.create(...)`
26
+ *
27
+ * Behavior:
28
+ * - Enforces `input` policy before request execution.
29
+ * - Enforces `output` policy after response generation.
30
+ * - For streaming calls, buffers chunks and enforces once on stream completion.
31
+ *
32
+ * The same client object is returned and marked as guarded for idempotency.
33
+ *
34
+ * @param openAIClient - OpenAI SDK client instance to instrument.
35
+ * @param options - Anthale policy enforcer options.
36
+ * @returns The same `openAIClient` instance, now guarded.
37
+ * @throws {TypeError} If no supported OpenAI create method is exposed.
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * import OpenAI from 'openai';
42
+ * import { guardOpenAIClient } from 'anthale/integrations/openai';
43
+ *
44
+ * const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
45
+ * guardOpenAIClient(openai, {
46
+ * policyId: 'pol_123',
47
+ * apiKey: process.env.ANTHALE_API_KEY,
48
+ * metadata: { tenantId: 'acme' },
49
+ * });
50
+ *
51
+ * const response = await openai.responses.create({
52
+ * model: 'gpt-4.1-mini',
53
+ * input: 'Hello!',
54
+ * });
55
+ * ```
56
+ */
57
+ export declare function guardOpenAIClient<TClient extends OpenAIClientLike>(openAIClient: TClient, options: GuardOpenAIClientOptions): TClient;
58
+ /**
59
+ * Alias of {@link guardOpenAIClient}.
60
+ */
61
+ export declare const guardClient: typeof guardOpenAIClient;
62
+ export {};
63
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../src/integrations/openai.ts"],"names":[],"mappings":"OACO,EAAuB,KAAK,qBAAqB,EAAoC;AAQ5F,UAAU,gBAAgB;IACxB,SAAS,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACjC,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAC;CAC/C;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;CAAG;AAqU1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,SAAS,gBAAgB,EAChE,YAAY,EAAE,OAAO,EACrB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAqCT;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,0BAAoB,CAAC"}
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.guardClient = void 0;
4
+ exports.guardOpenAIClient = guardOpenAIClient;
5
+ const core_1 = require("./core.js");
6
+ const OPENAI_GUARDED = Symbol.for('anthale.openai.guarded');
7
+ let streamWarningIssued = false;
8
+ function warnStreamBuffering() {
9
+ if (streamWarningIssued) {
10
+ return;
11
+ }
12
+ streamWarningIssued = true;
13
+ console.warn('Anthale does not support real-time stream analysis. OpenAI stream outputs are buffered and analyzed once the stream completes.');
14
+ }
15
+ function isAsyncIterable(value) {
16
+ return typeof value === 'object' && value !== null && Symbol.asyncIterator in value;
17
+ }
18
+ function extractMessagesFromRequest(endpoint, payload) {
19
+ if (endpoint === 'responses') {
20
+ const messages = [];
21
+ if ('instructions' in payload) {
22
+ messages.push(...(0, core_1.messagesFromValue)(payload['instructions'], 'system'));
23
+ }
24
+ if ('input' in payload) {
25
+ messages.push(...(0, core_1.messagesFromValue)(payload['input'], 'user'));
26
+ }
27
+ return messages;
28
+ }
29
+ return (0, core_1.messagesFromValue)(payload['messages'], 'user');
30
+ }
31
+ function extractMessagesFromResponsesPayload(payload) {
32
+ const messages = [];
33
+ let hasAssistantTextInOutput = false;
34
+ const output = payload['output'];
35
+ if (Array.isArray(output)) {
36
+ for (const item of output) {
37
+ if (!item || typeof item !== 'object') {
38
+ continue;
39
+ }
40
+ const record = item;
41
+ const role = (0, core_1.normalizeRole)(record['role']);
42
+ const contentMessages = (0, core_1.messagesFromValue)(record['content'], role);
43
+ if (role === 'assistant' && contentMessages.length > 0) {
44
+ hasAssistantTextInOutput = true;
45
+ }
46
+ messages.push(...contentMessages);
47
+ if ('arguments' in record) {
48
+ messages.push(...(0, core_1.messagesFromValue)(record['arguments'], 'assistant'));
49
+ }
50
+ }
51
+ }
52
+ if (!hasAssistantTextInOutput && 'output_text' in payload) {
53
+ messages.push(...(0, core_1.messagesFromValue)(payload['output_text'], 'assistant'));
54
+ }
55
+ return messages;
56
+ }
57
+ function extractMessagesFromChatCompletionsPayload(payload) {
58
+ const messages = [];
59
+ const choices = payload['choices'];
60
+ if (!Array.isArray(choices)) {
61
+ return messages;
62
+ }
63
+ for (const choice of choices) {
64
+ if (!choice || typeof choice !== 'object') {
65
+ continue;
66
+ }
67
+ const choiceRecord = choice;
68
+ const message = choiceRecord['message'];
69
+ if (!message || typeof message !== 'object') {
70
+ continue;
71
+ }
72
+ const messageRecord = message;
73
+ messages.push(...(0, core_1.messagesFromValue)(messageRecord, 'assistant'));
74
+ const toolCalls = messageRecord['tool_calls'];
75
+ if (Array.isArray(toolCalls)) {
76
+ for (const toolCall of toolCalls) {
77
+ if (!toolCall || typeof toolCall !== 'object') {
78
+ continue;
79
+ }
80
+ const toolCallRecord = toolCall;
81
+ const fn = toolCallRecord['function'];
82
+ if (!fn || typeof fn !== 'object') {
83
+ continue;
84
+ }
85
+ const fnRecord = fn;
86
+ messages.push(...(0, core_1.messagesFromValue)(fnRecord['arguments'], 'assistant'));
87
+ }
88
+ }
89
+ }
90
+ return messages;
91
+ }
92
+ function extractMessagesFromResponse(endpoint, payload) {
93
+ if (!payload || typeof payload !== 'object') {
94
+ return [];
95
+ }
96
+ const record = payload;
97
+ if (endpoint === 'responses') {
98
+ return extractMessagesFromResponsesPayload(record);
99
+ }
100
+ return extractMessagesFromChatCompletionsPayload(record);
101
+ }
102
+ function extractMessagesFromStreamChunks(endpoint, chunks) {
103
+ if (endpoint === 'chat_completions') {
104
+ const contentParts = [];
105
+ const argumentParts = [];
106
+ for (const chunk of chunks) {
107
+ if (!chunk || typeof chunk !== 'object') {
108
+ continue;
109
+ }
110
+ const record = chunk;
111
+ const choices = record['choices'];
112
+ if (!Array.isArray(choices)) {
113
+ continue;
114
+ }
115
+ for (const choice of choices) {
116
+ if (!choice || typeof choice !== 'object') {
117
+ continue;
118
+ }
119
+ const delta = choice['delta'];
120
+ if (!delta || typeof delta !== 'object') {
121
+ continue;
122
+ }
123
+ const deltaRecord = delta;
124
+ if (typeof deltaRecord['content'] === 'string') {
125
+ contentParts.push(deltaRecord['content']);
126
+ }
127
+ const toolCalls = deltaRecord['tool_calls'];
128
+ if (Array.isArray(toolCalls)) {
129
+ for (const toolCall of toolCalls) {
130
+ if (!toolCall || typeof toolCall !== 'object') {
131
+ continue;
132
+ }
133
+ const fn = toolCall['function'];
134
+ if (!fn || typeof fn !== 'object') {
135
+ continue;
136
+ }
137
+ const args = fn['arguments'];
138
+ if (typeof args === 'string')
139
+ argumentParts.push(args);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ const messages = [];
145
+ if (contentParts.length > 0) {
146
+ messages.push({ role: 'assistant', content: contentParts.join('') });
147
+ }
148
+ if (argumentParts.length > 0) {
149
+ messages.push({ role: 'assistant', content: argumentParts.join('') });
150
+ }
151
+ return messages;
152
+ }
153
+ const outputTextParts = [];
154
+ let completedPayload = null;
155
+ for (const chunk of chunks) {
156
+ if (!chunk || typeof chunk !== 'object') {
157
+ continue;
158
+ }
159
+ const record = chunk;
160
+ const type = typeof record['type'] === 'string' ? record['type'] : '';
161
+ if (type === 'response.output_text.delta') {
162
+ if (typeof record['delta'] === 'string') {
163
+ outputTextParts.push(record['delta']);
164
+ }
165
+ continue;
166
+ }
167
+ if (type === 'response.completed') {
168
+ const response = record['response'];
169
+ if (response && typeof response === 'object') {
170
+ completedPayload = response;
171
+ }
172
+ }
173
+ }
174
+ if (completedPayload) {
175
+ return extractMessagesFromResponsesPayload(completedPayload);
176
+ }
177
+ if (outputTextParts.length > 0) {
178
+ return [{ role: 'assistant', content: outputTextParts.join('') }];
179
+ }
180
+ return [];
181
+ }
182
+ async function wrapStreamWithPolicy(stream, onComplete) {
183
+ async function* generator() {
184
+ const chunks = [];
185
+ for await (const chunk of stream) {
186
+ chunks.push(chunk);
187
+ yield chunk;
188
+ }
189
+ await onComplete(chunks);
190
+ }
191
+ return generator();
192
+ }
193
+ async function wrapOpenAICallResult(result, endpoint, requestMessages, onEnforceOutput, isStream) {
194
+ if (isStream && isAsyncIterable(result)) {
195
+ warnStreamBuffering();
196
+ return wrapStreamWithPolicy(result, async (chunks) => {
197
+ const responseMessages = extractMessagesFromStreamChunks(endpoint, chunks);
198
+ if (responseMessages.length > 0) {
199
+ await onEnforceOutput([...requestMessages, ...responseMessages]);
200
+ }
201
+ });
202
+ }
203
+ const responseMessages = extractMessagesFromResponse(endpoint, result);
204
+ if (responseMessages.length > 0) {
205
+ await onEnforceOutput([...requestMessages, ...responseMessages]);
206
+ }
207
+ return result;
208
+ }
209
+ function patchCreateMethod(target, key, endpoint, options) {
210
+ const maybeFn = target[key];
211
+ if (typeof maybeFn !== 'function') {
212
+ return false;
213
+ }
214
+ const enforcer = (0, core_1.buildPolicyEnforcer)(options);
215
+ const original = maybeFn;
216
+ target[key] = function anthaleGuardedCreate(...args) {
217
+ const payload = args[0] ?? {};
218
+ const requestMessages = extractMessagesFromRequest(endpoint, payload);
219
+ const execute = async () => {
220
+ if (requestMessages.length > 0) {
221
+ await enforcer.enforce({ direction: 'input', messages: requestMessages });
222
+ }
223
+ const result = await original.apply(this, args);
224
+ const isStream = Boolean(payload['stream']);
225
+ return wrapOpenAICallResult(result, endpoint, requestMessages, async (messages) => {
226
+ await enforcer.enforce({ direction: 'output', messages });
227
+ }, isStream);
228
+ };
229
+ return execute();
230
+ };
231
+ return true;
232
+ }
233
+ /**
234
+ * Guard an existing OpenAI client instance in place.
235
+ *
236
+ * Supported call sites:
237
+ * - `client.responses.create(...)`
238
+ * - `client.chat.completions.create(...)`
239
+ *
240
+ * Behavior:
241
+ * - Enforces `input` policy before request execution.
242
+ * - Enforces `output` policy after response generation.
243
+ * - For streaming calls, buffers chunks and enforces once on stream completion.
244
+ *
245
+ * The same client object is returned and marked as guarded for idempotency.
246
+ *
247
+ * @param openAIClient - OpenAI SDK client instance to instrument.
248
+ * @param options - Anthale policy enforcer options.
249
+ * @returns The same `openAIClient` instance, now guarded.
250
+ * @throws {TypeError} If no supported OpenAI create method is exposed.
251
+ *
252
+ * @example
253
+ * ```ts
254
+ * import OpenAI from 'openai';
255
+ * import { guardOpenAIClient } from 'anthale/integrations/openai';
256
+ *
257
+ * const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
258
+ * guardOpenAIClient(openai, {
259
+ * policyId: 'pol_123',
260
+ * apiKey: process.env.ANTHALE_API_KEY,
261
+ * metadata: { tenantId: 'acme' },
262
+ * });
263
+ *
264
+ * const response = await openai.responses.create({
265
+ * model: 'gpt-4.1-mini',
266
+ * input: 'Hello!',
267
+ * });
268
+ * ```
269
+ */
270
+ function guardOpenAIClient(openAIClient, options) {
271
+ if (!openAIClient || typeof openAIClient !== 'object') {
272
+ throw new TypeError('OpenAI client must be an object.');
273
+ }
274
+ if (openAIClient[OPENAI_GUARDED]) {
275
+ return openAIClient;
276
+ }
277
+ const responsesPatched = openAIClient.responses && typeof openAIClient.responses === 'object' ?
278
+ patchCreateMethod(openAIClient.responses, 'create', 'responses', options)
279
+ : false;
280
+ const chatPatched = (openAIClient.chat &&
281
+ typeof openAIClient.chat === 'object' &&
282
+ openAIClient.chat['completions'] &&
283
+ typeof openAIClient.chat['completions'] === 'object') ?
284
+ patchCreateMethod(openAIClient.chat['completions'] ?? {}, 'create', 'chat_completions', options)
285
+ : false;
286
+ if (!responsesPatched && !chatPatched) {
287
+ throw new TypeError("OpenAI client must expose either 'responses.create' or 'chat.completions.create' methods to be guarded.");
288
+ }
289
+ openAIClient[OPENAI_GUARDED] = true;
290
+ return openAIClient;
291
+ }
292
+ /**
293
+ * Alias of {@link guardOpenAIClient}.
294
+ */
295
+ exports.guardClient = guardOpenAIClient;
296
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../src/integrations/openai.ts"],"names":[],"mappings":";;;AA8XA,8CAwCC;AAraD,oCAA2G;AAqB3G,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAE5D,IAAI,mBAAmB,GAAG,KAAK,CAAC;AAEhC,SAAS,mBAAmB;IAC1B,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,mBAAmB,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,IAAI,CACV,gIAAgI,CACjI,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC;AACtF,CAAC;AAED,SAAS,0BAA0B,CACjC,QAA0C,EAC1C,OAAgC;IAEhC,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAkC,EAAE,CAAC;QACnD,IAAI,cAAc,IAAI,OAAO,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAA,wBAAiB,EAAC,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAA,wBAAiB,EAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,IAAA,wBAAiB,EAAC,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,mCAAmC,CAC1C,OAAgC;IAEhC,MAAM,QAAQ,GAAkC,EAAE,CAAC;IACnD,IAAI,wBAAwB,GAAG,KAAK,CAAC;IAErC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,IAA+B,CAAC;YAC/C,MAAM,IAAI,GAAG,IAAA,oBAAa,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3C,MAAM,eAAe,GAAG,IAAA,wBAAiB,EAAC,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;YACnE,IAAI,IAAI,KAAK,WAAW,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvD,wBAAwB,GAAG,IAAI,CAAC;YAClC,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;YAClC,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAA,wBAAiB,EAAC,MAAM,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,wBAAwB,IAAI,aAAa,IAAI,OAAO,EAAE,CAAC;QAC1D,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAA,wBAAiB,EAAC,OAAO,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,yCAAyC,CAChD,OAAgC;IAEhC,MAAM,QAAQ,GAAkC,EAAE,CAAC;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAEnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,MAAiC,CAAC;QACvD,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5C,SAAS;QACX,CAAC;QAED,MAAM,aAAa,GAAG,OAAkC,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAA,wBAAiB,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;QAEhE,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC9C,SAAS;gBACX,CAAC;gBAED,MAAM,cAAc,GAAG,QAAmC,CAAC;gBAC3D,MAAM,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;gBACtC,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;oBAClC,SAAS;gBACX,CAAC;gBAED,MAAM,QAAQ,GAAG,EAA6B,CAAC;gBAC/C,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAA,wBAAiB,EAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,2BAA2B,CAClC,QAA0C,EAC1C,OAAgB;IAEhB,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,OAAkC,CAAC;IAClD,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7B,OAAO,mCAAmC,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,yCAAyC,CAAC,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,+BAA+B,CACtC,QAA0C,EAC1C,MAAiB;IAEjB,IAAI,QAAQ,KAAK,kBAAkB,EAAE,CAAC;QACpC,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,MAAM,aAAa,GAAa,EAAE,CAAC;QAEnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACxC,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,KAAgC,CAAC;YAChD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,SAAS;YACX,CAAC;YAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC1C,SAAS;gBACX,CAAC;gBAED,MAAM,KAAK,GAAI,MAAkC,CAAC,OAAO,CAAC,CAAC;gBAC3D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACxC,SAAS;gBACX,CAAC;gBAED,MAAM,WAAW,GAAG,KAAgC,CAAC;gBACrD,IAAI,OAAO,WAAW,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC/C,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC5C,CAAC;gBAED,MAAM,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;gBAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;wBACjC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;4BAC9C,SAAS;wBACX,CAAC;wBAED,MAAM,EAAE,GAAI,QAAoC,CAAC,UAAU,CAAC,CAAC;wBAC7D,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;4BAClC,SAAS;wBACX,CAAC;wBAED,MAAM,IAAI,GAAI,EAA8B,CAAC,WAAW,CAAC,CAAC;wBAC1D,IAAI,OAAO,IAAI,KAAK,QAAQ;4BAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACzD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAkC,EAAE,CAAC;QACnD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,IAAI,gBAAgB,GAAmC,IAAI,CAAC;IAE5D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtE,IAAI,IAAI,KAAK,4BAA4B,EAAE,CAAC;YAC1C,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACxC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YACxC,CAAC;YAED,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;YACpC,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC7C,gBAAgB,GAAG,QAAmC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,mCAAmC,CAAC,gBAAgB,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,MAAwB,EACxB,UAA0C;IAE1C,KAAK,SAAS,CAAC,CAAC,SAAS;QACvB,MAAM,MAAM,GAAQ,EAAE,CAAC;QACvB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,SAAS,EAAE,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,MAAe,EACf,QAA0C,EAC1C,eAA8C,EAC9C,eAA2E,EAC3E,QAAiB;IAEjB,IAAI,QAAQ,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,mBAAmB,EAAE,CAAC;QACtB,OAAO,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACnD,MAAM,gBAAgB,GAAG,+BAA+B,CAAC,QAAQ,EAAE,MAAmB,CAAC,CAAC;YACxF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,eAAe,CAAC,CAAC,GAAG,eAAe,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvE,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,eAAe,CAAC,CAAC,GAAG,eAAe,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CACxB,MAA+B,EAC/B,GAAW,EACX,QAA0C,EAC1C,OAAiC;IAEjC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,OAAmB,CAAC;IAErC,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,oBAAoB,CAAgB,GAAG,IAAe;QAC3E,MAAM,OAAO,GAAI,IAAI,CAAC,CAAC,CAA6B,IAAI,EAAE,CAAC;QAC3D,MAAM,eAAe,GAAG,0BAA0B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEtE,MAAM,OAAO,GAAG,KAAK,IAAsB,EAAE;YAC3C,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;YAC5E,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE5C,OAAO,oBAAoB,CACzB,MAAM,EACN,QAAQ,EACR,eAAe,EACf,KAAK,EAAE,QAAQ,EAAE,EAAE;gBACjB,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5D,CAAC,EACD,QAAQ,CACT,CAAC;QACJ,CAAC,CAAC;QAEF,OAAO,OAAO,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,SAAgB,iBAAiB,CAC/B,YAAqB,EACrB,OAAiC;IAEjC,IAAI,CAAC,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACtD,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAK,YAAwC,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9D,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,gBAAgB,GACpB,YAAY,CAAC,SAAS,IAAI,OAAO,YAAY,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC;QACpE,iBAAiB,CAAC,YAAY,CAAC,SAAoC,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC;QACtG,CAAC,CAAC,KAAK,CAAC;IAEV,MAAM,WAAW,GACf,CACE,YAAY,CAAC,IAAI;QACjB,OAAO,YAAY,CAAC,IAAI,KAAK,QAAQ;QACpC,YAAY,CAAC,IAAgC,CAAC,aAAa,CAAC;QAC7D,OAAQ,YAAY,CAAC,IAAgC,CAAC,aAAa,CAAC,KAAK,QAAQ,CAClF,CAAC,CAAC;QACD,iBAAiB,CACb,YAAY,CAAC,IAAgC,CAAC,aAAa,CAA6B,IAAI,EAAE,EAChG,QAAQ,EACR,kBAAkB,EAClB,OAAO,CACR;QACH,CAAC,CAAC,KAAK,CAAC;IAEV,IAAI,CAAC,gBAAgB,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,IAAI,SAAS,CACjB,yGAAyG,CAC1G,CAAC;IACJ,CAAC;IAEA,YAAmD,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IAC5E,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACU,QAAA,WAAW,GAAG,iBAAiB,CAAC"}