@pfoundation/ocadvisor 26.9.1 → 26.9.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.
Files changed (52) hide show
  1. package/README.md +388 -46
  2. package/dist/artificialAnalysis.d.ts +4 -0
  3. package/dist/artificialAnalysis.d.ts.map +1 -0
  4. package/dist/artificialAnalysis.js +77 -0
  5. package/dist/artificialAnalysis.js.map +1 -0
  6. package/dist/benchmarkConfig.d.ts +19 -0
  7. package/dist/benchmarkConfig.d.ts.map +1 -0
  8. package/dist/benchmarkConfig.js +58 -0
  9. package/dist/benchmarkConfig.js.map +1 -0
  10. package/dist/benchmarkEvidence.d.ts +37 -0
  11. package/dist/benchmarkEvidence.d.ts.map +1 -0
  12. package/dist/benchmarkEvidence.js +81 -0
  13. package/dist/benchmarkEvidence.js.map +1 -0
  14. package/dist/benchmarkMatch.d.ts +57 -0
  15. package/dist/benchmarkMatch.d.ts.map +1 -0
  16. package/dist/benchmarkMatch.js +236 -0
  17. package/dist/benchmarkMatch.js.map +1 -0
  18. package/dist/benchmarkStore.d.ts +44 -0
  19. package/dist/benchmarkStore.d.ts.map +1 -0
  20. package/dist/benchmarkStore.js +308 -0
  21. package/dist/benchmarkStore.js.map +1 -0
  22. package/dist/benchmarkTypes.d.ts +48 -0
  23. package/dist/benchmarkTypes.d.ts.map +1 -0
  24. package/dist/benchmarkTypes.js +298 -0
  25. package/dist/benchmarkTypes.js.map +1 -0
  26. package/dist/benchmarkUpdate.d.ts +33 -0
  27. package/dist/benchmarkUpdate.d.ts.map +1 -0
  28. package/dist/benchmarkUpdate.js +327 -0
  29. package/dist/benchmarkUpdate.js.map +1 -0
  30. package/dist/cli.d.ts +13 -0
  31. package/dist/cli.d.ts.map +1 -0
  32. package/dist/cli.js +377 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/data/artificialAnalysis.mappings.json +197 -0
  35. package/dist/data/artificialAnalysis.snapshot.json +17684 -0
  36. package/dist/modelProfiles.d.ts +45 -0
  37. package/dist/modelProfiles.d.ts.map +1 -0
  38. package/dist/modelProfiles.js +141 -0
  39. package/dist/modelProfiles.js.map +1 -0
  40. package/dist/ocAdvisor.d.ts +105 -5
  41. package/dist/ocAdvisor.d.ts.map +1 -1
  42. package/dist/ocAdvisor.js +502 -44
  43. package/dist/ocAdvisor.js.map +1 -1
  44. package/dist/typesafeGate.d.ts +89 -0
  45. package/dist/typesafeGate.d.ts.map +1 -0
  46. package/dist/typesafeGate.js +463 -0
  47. package/dist/typesafeGate.js.map +1 -0
  48. package/dist/typesafeState.d.ts +94 -0
  49. package/dist/typesafeState.d.ts.map +1 -0
  50. package/dist/typesafeState.js +301 -0
  51. package/dist/typesafeState.js.map +1 -0
  52. package/package.json +8 -2
@@ -0,0 +1,463 @@
1
+ // Optional TypeSafe preflight for advisor invocations.
2
+ //
3
+ // One System One request decides whether this specific consultation is
4
+ // worth the expensive advisor generation, and — when effort selection is
5
+ // available — which effort fits. The gate never blocks on its own failures:
6
+ // timeouts, transport errors, malformed answers, and missing credentials all
7
+ // fall back to the ordinary advisor behavior.
8
+ import { TypeSafeClient, choice, noul } from "@typesafe-ai/sdk";
9
+ export const GATE_NEEDED_QUESTION = "needed";
10
+ export const GATE_EFFORT_QUESTION = "effort";
11
+ // Leaves headroom for state plus the longest question inside the documented
12
+ // 32k state+question and 64k overall context limits.
13
+ export const TYPESAFE_STATE_TOKEN_BUDGET = 16000;
14
+ const BYTES_PER_TOKEN = 4;
15
+ const MIN_STATE_BYTES = 1024;
16
+ const MAX_QUESTION_CHARS = 2000;
17
+ // Built-in effort criteria. Custom variant names fall back to a generic
18
+ // description; the effort decision never changes whether consultation
19
+ // happens, so a coarser description only affects level choice.
20
+ const EFFORT_CRITERIA = {
21
+ high: "Focused question, clear evidence, limited scope, and few interacting constraints",
22
+ xhigh: "Meaningful design tradeoffs, cross-component behavior, or several interacting correctness concerns",
23
+ max: "Difficult unresolved failures, conflicting evidence, or deeply interconnected high-consequence decisions",
24
+ };
25
+ const DEFAULT_EFFORT_CRITERION = "This level fits a consultation more demanding than the lower levels and less demanding than the higher ones";
26
+ export const NEEDED_INSTRUCTIONS = `Given the request below, would an independent senior advisor materially improve the approach, help resolve a problem, or strengthen review at this point?
27
+ A consultation can help at several different checkpoints; prior consultations are context, not a quota.
28
+ Repeat consultations are useful when evidence, the approach, or the concern under review has changed.
29
+ Judge the evidence actually present. Missing or truncated context is uncertainty, not evidence that consultation is unnecessary.
30
+ A concrete question awaiting an independent second opinion usually qualifies, even when the agent is not stuck.
31
+ Model capability evidence: \`models\` identifies the requesting and advisor models; \`benchmarks.comparisons\` shows Artificial Analysis scores on the same metrics with oriented differences (positive favors the advisor) at the advisor's default effort. Treat scores as rough capability evidence, not certainty about this task: a stronger requester can still benefit from independent review, and a weaker requester still needs no advice for trivial work. Unknown, mismatched, or stale scores are uncertainty, never evidence against consultation.`;
32
+ export const EFFORT_INSTRUCTIONS = `Assuming this consultation proceeds, which effort level is appropriate for this specific decision or review?
33
+ Choose from the supplied levels based on reasoning difficulty, uncertainty, interacting components, and consequences, not transcript length.
34
+ This question is independent of whether consultation should happen.
35
+ \`models.advisor\` lists the allowed efforts with each effort's benchmark coverage; weigh coverage alongside difficulty, and treat missing coverage as uncertainty rather than disqualification.`;
36
+ export class TypeSafeGateError extends Error {
37
+ kind;
38
+ type;
39
+ constructor(kind, type) {
40
+ super(kind);
41
+ this.name = "TypeSafeGateError";
42
+ this.kind = kind;
43
+ this.type = type;
44
+ }
45
+ }
46
+ export function createSdkClient(options = {}) {
47
+ const client = new TypeSafeClient({
48
+ ...(options.apiKey !== undefined ? { apiKey: options.apiKey } : {}),
49
+ ...(options.baseURL !== undefined ? { baseURL: options.baseURL } : {}),
50
+ ...(options.defaultModel !== undefined
51
+ ? { defaultModel: options.defaultModel }
52
+ : {}),
53
+ ...(options.fetch !== undefined ? { fetch: options.fetch } : {}),
54
+ // The gate owns its deadline; SDK retries could exceed it.
55
+ retry: { maxRetries: 0 },
56
+ });
57
+ return {
58
+ async systemOne(call) {
59
+ try {
60
+ const result = (await client.systemOne({
61
+ state: call.state,
62
+ questions: call.questions,
63
+ ...(call.model ? { model: call.model } : {}),
64
+ }, { signal: call.signal, timeout: call.timeoutMs }));
65
+ return { kind: "response", result };
66
+ }
67
+ catch (error) {
68
+ return { kind: "error", type: classifyFailure(error) };
69
+ }
70
+ },
71
+ };
72
+ }
73
+ // Fixed reason codes instead of raw SDK errors: exception messages can carry
74
+ // transport details and are not stable across SDK releases.
75
+ export function classifyFailure(error) {
76
+ const name = error && typeof error === "object" && "name" in error
77
+ ? String(error.name)
78
+ : "";
79
+ switch (name) {
80
+ case "AuthenticationError":
81
+ return "auth";
82
+ case "RateLimitError":
83
+ return "rate_limit";
84
+ case "APITimeoutError":
85
+ return "timeout";
86
+ case "APIConnectionError":
87
+ return "connection";
88
+ case "BadRequestError":
89
+ case "UnprocessableEntityError":
90
+ return "invalid_request";
91
+ case "InternalServerError":
92
+ return "server_error";
93
+ case "APIUserAbortError":
94
+ return "aborted";
95
+ case "NotFoundError":
96
+ return "not_found";
97
+ case "PermissionDeniedError":
98
+ return "permission_denied";
99
+ default:
100
+ return "unknown";
101
+ }
102
+ }
103
+ function proceedReason(input, availableEffortLevels, source) {
104
+ if (input.explicitEffort)
105
+ return "caller_effort";
106
+ // A valid need judgment with no candidate levels keeps the configured
107
+ // effort; that is still an allowed consultation.
108
+ if (source === "typesafe" || availableEffortLevels.length > 0) {
109
+ return "allowed";
110
+ }
111
+ return "effort_unknown";
112
+ }
113
+ function byteLength(value) {
114
+ return Buffer.byteLength(JSON.stringify(value), "utf8");
115
+ }
116
+ function questionText(question) {
117
+ if (!question)
118
+ return null;
119
+ return question.length > MAX_QUESTION_CHARS
120
+ ? question.slice(-MAX_QUESTION_CHARS)
121
+ : question;
122
+ }
123
+ function projectMatch(match) {
124
+ return {
125
+ status: match.status,
126
+ source: match.source,
127
+ aa_model: match.aaModelID,
128
+ evaluated_effort: match.evaluatedEffort,
129
+ };
130
+ }
131
+ function projectEffortPolicy(policy) {
132
+ switch (policy.kind) {
133
+ case "pinned":
134
+ return { kind: "pinned", effort: policy.effort };
135
+ case "candidates":
136
+ return {
137
+ kind: "candidates",
138
+ candidates: [...policy.candidates],
139
+ fallback: policy.fallback,
140
+ };
141
+ case "fixed":
142
+ return { kind: "fixed", effort: policy.effort };
143
+ }
144
+ }
145
+ function buildStatePayload(state) {
146
+ return {
147
+ request: {
148
+ question: questionText(state.request.question),
149
+ mode: state.request.mode,
150
+ trigger: state.request.trigger,
151
+ explicitEffort: state.request.explicitEffort,
152
+ caller: state.request.caller,
153
+ },
154
+ models: state.models
155
+ ? {
156
+ requester: {
157
+ provider: state.models.requester.providerID,
158
+ model: state.models.requester.modelID,
159
+ effort: state.models.requester.variant,
160
+ provenance: state.models.requester.provenance,
161
+ },
162
+ advisor: {
163
+ provider: state.models.advisor.providerID,
164
+ model: state.models.advisor.modelID,
165
+ effort_policy: projectEffortPolicy(state.models.advisor.policy),
166
+ },
167
+ }
168
+ : null,
169
+ benchmarks: state.benchmarks
170
+ ? {
171
+ source: state.benchmarks.source,
172
+ fetched_at: state.benchmarks.fetchedAt,
173
+ age_days: state.benchmarks.ageDays,
174
+ content_hash: state.benchmarks.contentHash,
175
+ hash_verified: state.benchmarks.hashVerified,
176
+ requester_match: projectMatch(state.benchmarks.requesterMatch),
177
+ advisor_default_match: projectMatch(state.benchmarks.advisorDefaultMatch),
178
+ advisor_candidates: state.benchmarks.advisorCandidates.map((entry) => ({
179
+ effort: entry.effort,
180
+ ...projectMatch(entry),
181
+ })),
182
+ comparisons: state.benchmarks.comparisons.map((entry) => ({
183
+ metric: entry.key,
184
+ label: entry.label,
185
+ unit: entry.unit,
186
+ requester: entry.requester,
187
+ advisor: entry.advisor,
188
+ advisor_minus_requester: entry.advisorMinusRequester,
189
+ comparable: entry.comparable,
190
+ reason: entry.reason,
191
+ })),
192
+ omitted: state.benchmarks.omitted,
193
+ }
194
+ : null,
195
+ latest_user_request: state.user.latestRequest,
196
+ recent_messages: state.context.messages,
197
+ prior_consultations: {
198
+ count: state.history.priorConsultations,
199
+ modes: state.history.priorModes,
200
+ repeated_question: state.history.repeatedQuestion,
201
+ },
202
+ coverage: {
203
+ messages_dropped: state.coverage.droppedMessages,
204
+ messages_included: state.coverage.includedMessages,
205
+ total_messages: state.coverage.totalMessages,
206
+ latest_user_included: state.context.latestUserIncluded,
207
+ benchmarks_omitted: state.coverage.benchmarksOmitted,
208
+ },
209
+ };
210
+ }
211
+ // Fits the payload into the byte budget by dropping the oldest messages
212
+ // first and reporting the coverage loss so the gate can treat omission as
213
+ // uncertainty. The latest user request is state.user and is never dropped.
214
+ function fitStatePayload(state, maxBytes) {
215
+ const payload = buildStatePayload(state);
216
+ if (byteLength(payload) <= maxBytes)
217
+ return { payload, truncated: false };
218
+ const messages = [...state.context.messages];
219
+ let dropped = 0;
220
+ while (messages.length > 0) {
221
+ messages.shift();
222
+ dropped++;
223
+ const candidate = {
224
+ ...payload,
225
+ recent_messages: messages,
226
+ coverage: {
227
+ ...payload.coverage,
228
+ messages_dropped_extra: dropped,
229
+ },
230
+ };
231
+ if (byteLength(candidate) <= maxBytes) {
232
+ return { payload: candidate, truncated: true };
233
+ }
234
+ }
235
+ const minimal = {
236
+ ...payload,
237
+ recent_messages: [],
238
+ coverage: {
239
+ ...payload.coverage,
240
+ messages_dropped_extra: dropped,
241
+ },
242
+ };
243
+ if (byteLength(minimal) > maxBytes)
244
+ return null;
245
+ return { payload: minimal, truncated: true };
246
+ }
247
+ function effortCriteria(efforts) {
248
+ const criteria = {};
249
+ for (const effort of efforts) {
250
+ criteria[effort] = EFFORT_CRITERIA[effort] ?? DEFAULT_EFFORT_CRITERION;
251
+ }
252
+ return criteria;
253
+ }
254
+ function isNeededAnswer(value) {
255
+ return (!!value &&
256
+ typeof value === "object" &&
257
+ typeof value.noul === "number" &&
258
+ Number.isFinite(value.noul));
259
+ }
260
+ function isEffortAnswer(value, efforts) {
261
+ if (!value || typeof value !== "object")
262
+ return false;
263
+ const answer = value;
264
+ return (typeof answer.choice === "string" &&
265
+ efforts.includes(answer.choice) &&
266
+ typeof answer.confidence === "number" &&
267
+ Number.isFinite(answer.confidence));
268
+ }
269
+ function metricsFrom(result, started, truncated, stateBytes) {
270
+ const usage = result.usage;
271
+ return {
272
+ model: typeof result.model === "string" ? result.model : null,
273
+ neededProbability: null,
274
+ suggestedEffort: null,
275
+ effortConfidence: null,
276
+ latencyMs: Date.now() - started,
277
+ stateBytes,
278
+ truncated,
279
+ inputTokens: typeof usage?.input_tokens === "number" ? usage.input_tokens : null,
280
+ outputTokens: typeof usage?.output_tokens === "number" ? usage.output_tokens : null,
281
+ };
282
+ }
283
+ function selectDecision(input, settings, neededProbability, effortAnswer) {
284
+ if (neededProbability < settings.skipBelow) {
285
+ return {
286
+ skip: true,
287
+ effectiveEffort: null,
288
+ suggestedEffort: effortAnswer?.choice ?? null,
289
+ effortConfidence: effortAnswer?.confidence ?? null,
290
+ source: "config",
291
+ };
292
+ }
293
+ if (input.explicitEffort) {
294
+ return {
295
+ skip: false,
296
+ effectiveEffort: input.explicitEffort,
297
+ suggestedEffort: effortAnswer?.choice ?? null,
298
+ effortConfidence: effortAnswer?.confidence ?? null,
299
+ source: "caller",
300
+ };
301
+ }
302
+ if (effortAnswer && effortAnswer.confidence >= settings.minEffortConfidence) {
303
+ return {
304
+ skip: false,
305
+ effectiveEffort: effortAnswer.choice,
306
+ suggestedEffort: effortAnswer.choice,
307
+ effortConfidence: effortAnswer.confidence,
308
+ source: "typesafe",
309
+ };
310
+ }
311
+ return {
312
+ skip: false,
313
+ effectiveEffort: input.defaultEffort,
314
+ suggestedEffort: effortAnswer?.choice ?? null,
315
+ effortConfidence: effortAnswer?.confidence ?? null,
316
+ source: "config",
317
+ };
318
+ }
319
+ export async function runTypeSafeGate(options) {
320
+ const { state, input, settings, signal } = options;
321
+ if (!options.keyPresent)
322
+ return { status: "disabled" };
323
+ const started = Date.now();
324
+ const availableEffortLevels = input.explicitEffort === null ? input.supportedEfforts : [];
325
+ const maxStateBytes = Math.max(MIN_STATE_BYTES, Math.min(settings.maxStateBytes, TYPESAFE_STATE_TOKEN_BUDGET * BYTES_PER_TOKEN));
326
+ const fitted = fitStatePayload(state, maxStateBytes);
327
+ if (!fitted) {
328
+ return {
329
+ status: "fallback",
330
+ reason: "state_unavailable",
331
+ metrics: {
332
+ model: null,
333
+ neededProbability: null,
334
+ suggestedEffort: null,
335
+ effortConfidence: null,
336
+ latencyMs: Date.now() - started,
337
+ stateBytes: 0,
338
+ truncated: true,
339
+ inputTokens: null,
340
+ outputTokens: null,
341
+ },
342
+ };
343
+ }
344
+ const questions = {
345
+ [GATE_NEEDED_QUESTION]: noul(NEEDED_INSTRUCTIONS),
346
+ };
347
+ if (availableEffortLevels.length > 0) {
348
+ questions[GATE_EFFORT_QUESTION] = choice(EFFORT_INSTRUCTIONS, effortCriteria(availableEffortLevels));
349
+ }
350
+ const controller = new AbortController();
351
+ let callerAborted = false;
352
+ const onCallerAbort = () => {
353
+ callerAborted = true;
354
+ controller.abort();
355
+ };
356
+ if (signal?.aborted) {
357
+ callerAborted = true;
358
+ }
359
+ else {
360
+ signal?.addEventListener("abort", onCallerAbort, { once: true });
361
+ }
362
+ const timer = setTimeout(() => controller.abort(), settings.timeoutMs);
363
+ const stateBytes = byteLength(fitted.payload);
364
+ const emptyMetrics = () => ({
365
+ model: null,
366
+ neededProbability: null,
367
+ suggestedEffort: null,
368
+ effortConfidence: null,
369
+ latencyMs: Date.now() - started,
370
+ stateBytes,
371
+ truncated: fitted.truncated,
372
+ inputTokens: null,
373
+ outputTokens: null,
374
+ });
375
+ try {
376
+ if (callerAborted) {
377
+ return { status: "fallback", reason: "aborted", metrics: emptyMetrics() };
378
+ }
379
+ let client;
380
+ try {
381
+ client =
382
+ options.client ??
383
+ (options.createClient
384
+ ? options.createClient()
385
+ : createSdkClient({
386
+ ...(options.env?.TYPESAFE_API_KEY
387
+ ? { apiKey: options.env.TYPESAFE_API_KEY }
388
+ : {}),
389
+ ...(options.env?.TYPESAFE_BASE_URL
390
+ ? { baseURL: options.env.TYPESAFE_BASE_URL }
391
+ : {}),
392
+ ...(options.fetchImpl ? { fetch: options.fetchImpl } : {}),
393
+ }));
394
+ }
395
+ catch {
396
+ return { status: "fallback", reason: "error", metrics: emptyMetrics() };
397
+ }
398
+ const outcome = await client.systemOne({
399
+ state: fitted.payload,
400
+ questions,
401
+ ...(settings.model ? { model: settings.model } : {}),
402
+ signal: controller.signal,
403
+ timeoutMs: settings.timeoutMs,
404
+ });
405
+ if (callerAborted) {
406
+ return { status: "fallback", reason: "aborted", metrics: emptyMetrics() };
407
+ }
408
+ if (outcome.kind !== "response") {
409
+ return {
410
+ status: "fallback",
411
+ reason: outcome.kind === "timeout" ? "timeout" : "error",
412
+ ...(outcome.kind === "error" ? { errorType: outcome.type } : {}),
413
+ metrics: emptyMetrics(),
414
+ };
415
+ }
416
+ const result = outcome.result;
417
+ const answers = result.answers;
418
+ const needed = answers?.[GATE_NEEDED_QUESTION];
419
+ if (!isNeededAnswer(needed)) {
420
+ return {
421
+ status: "fallback",
422
+ reason: "malformed_answer",
423
+ metrics: {
424
+ ...metricsFrom(result, started, fitted.truncated, stateBytes),
425
+ },
426
+ };
427
+ }
428
+ const neededProbability = Math.min(1, Math.max(0, needed.noul));
429
+ const rawEffort = answers?.[GATE_EFFORT_QUESTION];
430
+ const effortAnswer = isEffortAnswer(rawEffort, availableEffortLevels)
431
+ ? rawEffort
432
+ : null;
433
+ const decision = selectDecision(input, settings, neededProbability, effortAnswer);
434
+ const metrics = {
435
+ ...metricsFrom(result, started, fitted.truncated, stateBytes),
436
+ neededProbability,
437
+ suggestedEffort: decision.suggestedEffort,
438
+ effortConfidence: decision.effortConfidence,
439
+ };
440
+ if (decision.skip) {
441
+ return {
442
+ status: "skip",
443
+ reason: "consultation_not_useful",
444
+ metrics,
445
+ };
446
+ }
447
+ return {
448
+ status: "proceed",
449
+ reason: proceedReason(input, availableEffortLevels, decision.source),
450
+ neededProbability,
451
+ suggestedEffort: decision.suggestedEffort,
452
+ effortConfidence: decision.effortConfidence,
453
+ effectiveEffort: decision.effectiveEffort,
454
+ effortSource: decision.source,
455
+ metrics,
456
+ };
457
+ }
458
+ finally {
459
+ clearTimeout(timer);
460
+ signal?.removeEventListener("abort", onCallerAbort);
461
+ }
462
+ }
463
+ //# sourceMappingURL=typesafeGate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typesafeGate.js","sourceRoot":"","sources":["../src/typesafeGate.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,EAAE;AACF,uEAAuE;AACvE,yEAAyE;AACzE,4EAA4E;AAC5E,6EAA6E;AAC7E,8CAA8C;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAShE,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAE7C,4EAA4E;AAC5E,qDAAqD;AACrD,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AACjD,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,wEAAwE;AACxE,sEAAsE;AACtE,+DAA+D;AAC/D,MAAM,eAAe,GAA2B;IAC9C,IAAI,EAAE,kFAAkF;IACxF,KAAK,EACH,oGAAoG;IACtG,GAAG,EAAE,0GAA0G;CAChH,CAAC;AACF,MAAM,wBAAwB,GAC5B,6GAA6G,CAAC;AAEhH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;iiBAK8f,CAAC;AAEliB,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;iMAG8J,CAAC;AAElM,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,IAAI,CAAgC;IACpC,IAAI,CAAS;IAEtB,YAAY,IAAmC,EAAE,IAAY;QAC3D,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AA4BD,MAAM,UAAU,eAAe,CAAC,UAA+B,EAAE;IAC/D,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE;YACxC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,2DAA2D;QAC3D,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;KACzB,CAAC,CAAC;IACH,OAAO;QACL,KAAK,CAAC,SAAS,CAAC,IAAI;YAClB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CACpC;oBACE,KAAK,EAAE,IAAI,CAAC,KAAc;oBAC1B,SAAS,EAAE,IAAI,CAAC,SAAkB;oBAClC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC7C,EACD,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,CACjD,CAAuC,CAAC;gBACzC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,4DAA4D;AAC5D,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,MAAM,IAAI,GACR,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK;QACnD,CAAC,CAAC,MAAM,CAAE,KAA4B,CAAC,IAAI,CAAC;QAC5C,CAAC,CAAC,EAAE,CAAC;IACT,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,qBAAqB;YACxB,OAAO,MAAM,CAAC;QAChB,KAAK,gBAAgB;YACnB,OAAO,YAAY,CAAC;QACtB,KAAK,iBAAiB;YACpB,OAAO,SAAS,CAAC;QACnB,KAAK,oBAAoB;YACvB,OAAO,YAAY,CAAC;QACtB,KAAK,iBAAiB,CAAC;QACvB,KAAK,0BAA0B;YAC7B,OAAO,iBAAiB,CAAC;QAC3B,KAAK,qBAAqB;YACxB,OAAO,cAAc,CAAC;QACxB,KAAK,mBAAmB;YACtB,OAAO,SAAS,CAAC;QACnB,KAAK,eAAe;YAClB,OAAO,WAAW,CAAC;QACrB,KAAK,uBAAuB;YAC1B,OAAO,mBAAmB,CAAC;QAC7B;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAkED,SAAS,aAAa,CACpB,KAAgB,EAChB,qBAA+B,EAC/B,MAAwC;IAExC,IAAI,KAAK,CAAC,cAAc;QAAE,OAAO,eAAe,CAAC;IACjD,sEAAsE;IACtE,iDAAiD;IACjD,IAAI,MAAM,KAAK,UAAU,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,YAAY,CAAC,QAAuB;IAC3C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,QAAQ,CAAC,MAAM,GAAG,kBAAkB;QACzC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC;QACrC,CAAC,CAAC,QAAQ,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,KAAmB;IACvC,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,SAAS;QACzB,gBAAgB,EAAE,KAAK,CAAC,eAAe;KACxC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAA2B;IAE3B,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACnD,KAAK,YAAY;YACf,OAAO;gBACL,IAAI,EAAE,YAAY;gBAClB,UAAU,EAAE,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;gBAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;QACJ,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACpD,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAoB;IAC7C,OAAO;QACL,OAAO,EAAE;YACP,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC9C,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO;YAC9B,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc;YAC5C,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;SAC7B;QACD,MAAM,EAAE,KAAK,CAAC,MAAM;YAClB,CAAC,CAAC;gBACE,SAAS,EAAE;oBACT,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU;oBAC3C,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO;oBACrC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO;oBACtC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU;iBAC9C;gBACD,OAAO,EAAE;oBACP,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU;oBACzC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO;oBACnC,aAAa,EAAE,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;iBAChE;aACF;YACH,CAAC,CAAC,IAAI;QACR,UAAU,EAAE,KAAK,CAAC,UAAU;YAC1B,CAAC,CAAC;gBACE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM;gBAC/B,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS;gBACtC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO;gBAClC,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW;gBAC1C,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY;gBAC5C,eAAe,EAAE,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC;gBAC9D,qBAAqB,EAAE,YAAY,CACjC,KAAK,CAAC,UAAU,CAAC,mBAAmB,CACrC;gBACD,kBAAkB,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,GAAG,CACxD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACV,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,GAAG,YAAY,CAAC,KAAK,CAAC;iBACvB,CAAC,CACH;gBACD,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACxD,MAAM,EAAE,KAAK,CAAC,GAAG;oBACjB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,uBAAuB,EAAE,KAAK,CAAC,qBAAqB;oBACpD,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB,CAAC,CAAC;gBACH,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO;aAClC;YACH,CAAC,CAAC,IAAI;QACR,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa;QAC7C,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ;QACvC,mBAAmB,EAAE;YACnB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,kBAAkB;YACvC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU;YAC/B,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,gBAAgB;SAClD;QACD,QAAQ,EAAE;YACR,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,eAAe;YAChD,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,gBAAgB;YAClD,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,aAAa;YAC5C,oBAAoB,EAAE,KAAK,CAAC,OAAO,CAAC,kBAAkB;YACtD,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,iBAAiB;SACrD;KACF,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,0EAA0E;AAC1E,2EAA2E;AAC3E,SAAS,eAAe,CACtB,KAAoB,EACpB,QAAgB;IAEhB,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAE1E,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;QACV,MAAM,SAAS,GAAG;YAChB,GAAG,OAAO;YACV,eAAe,EAAE,QAAQ;YACzB,QAAQ,EAAE;gBACR,GAAI,OAAO,CAAC,QAAoC;gBAChD,sBAAsB,EAAE,OAAO;aAChC;SACF,CAAC;QACF,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,QAAQ,EAAE,CAAC;YACtC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACjD,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG;QACd,GAAG,OAAO;QACV,eAAe,EAAE,EAAE;QACnB,QAAQ,EAAE;YACR,GAAI,OAAO,CAAC,QAAoC;YAChD,sBAAsB,EAAE,OAAO;SAChC;KACF,CAAC;IACF,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,QAAQ;QAAE,OAAO,IAAI,CAAC;IAChD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,cAAc,CAAC,OAAiB;IACvC,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,QAAQ,CAAC,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,wBAAwB,CAAC;IACzE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,CACL,CAAC,CAAC,KAAK;QACP,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ;QACtD,MAAM,CAAC,QAAQ,CAAE,KAA0B,CAAC,IAAI,CAAC,CAClD,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,KAAc,EACd,OAAiB;IAEjB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,MAAM,GAAG,KAAmD,CAAC;IACnE,OAAO,CACL,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;QAC/B,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;QACrC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CACnC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,MAA+B,EAC/B,OAAe,EACf,SAAkB,EAClB,UAAkB;IAElB,MAAM,KAAK,GAAG,MAAM,CAAC,KAC4C,CAAC;IAClE,OAAO;QACL,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QAC7D,iBAAiB,EAAE,IAAI;QACvB,eAAe,EAAE,IAAI;QACrB,gBAAgB,EAAE,IAAI;QACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;QAC/B,UAAU;QACV,SAAS;QACT,WAAW,EACT,OAAO,KAAK,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI;QACrE,YAAY,EACV,OAAO,KAAK,EAAE,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;KACxE,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,KAAgB,EAChB,QAA0B,EAC1B,iBAAyB,EACzB,YAA2D;IAQ3D,IAAI,iBAAiB,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC3C,OAAO;YACL,IAAI,EAAE,IAAI;YACV,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,YAAY,EAAE,MAAM,IAAI,IAAI;YAC7C,gBAAgB,EAAE,YAAY,EAAE,UAAU,IAAI,IAAI;YAClD,MAAM,EAAE,QAAQ;SACjB,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,OAAO;YACL,IAAI,EAAE,KAAK;YACX,eAAe,EAAE,KAAK,CAAC,cAAc;YACrC,eAAe,EAAE,YAAY,EAAE,MAAM,IAAI,IAAI;YAC7C,gBAAgB,EAAE,YAAY,EAAE,UAAU,IAAI,IAAI;YAClD,MAAM,EAAE,QAAQ;SACjB,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,IAAI,YAAY,CAAC,UAAU,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QAC5E,OAAO;YACL,IAAI,EAAE,KAAK;YACX,eAAe,EAAE,YAAY,CAAC,MAAM;YACpC,eAAe,EAAE,YAAY,CAAC,MAAM;YACpC,gBAAgB,EAAE,YAAY,CAAC,UAAU;YACzC,MAAM,EAAE,UAAU;SACnB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,eAAe,EAAE,KAAK,CAAC,aAAa;QACpC,eAAe,EAAE,YAAY,EAAE,MAAM,IAAI,IAAI;QAC7C,gBAAgB,EAAE,YAAY,EAAE,UAAU,IAAI,IAAI;QAClD,MAAM,EAAE,QAAQ;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAuB;IAEvB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACnD,IAAI,CAAC,OAAO,CAAC,UAAU;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAEvD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,qBAAqB,GACzB,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAC5B,eAAe,EACf,IAAI,CAAC,GAAG,CACN,QAAQ,CAAC,aAAa,EACtB,2BAA2B,GAAG,eAAe,CAC9C,CACF,CAAC;IACF,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,mBAAmB;YAC3B,OAAO,EAAE;gBACP,KAAK,EAAE,IAAI;gBACX,iBAAiB,EAAE,IAAI;gBACvB,eAAe,EAAE,IAAI;gBACrB,gBAAgB,EAAE,IAAI;gBACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;gBAC/B,UAAU,EAAE,CAAC;gBACb,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;gBACjB,YAAY,EAAE,IAAI;aACnB;SACF,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAA4B;QACzC,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC;KAClD,CAAC;IACF,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,SAAS,CAAC,oBAAoB,CAAC,GAAG,MAAM,CACtC,mBAAmB,EACnB,cAAc,CAAC,qBAAqB,CAAC,CACtC,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,aAAa,GAAG,IAAI,CAAC;QACrB,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC,CAAC;IACF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE9C,MAAM,YAAY,GAAG,GAAgB,EAAE,CAAC,CAAC;QACvC,KAAK,EAAE,IAAI;QACX,iBAAiB,EAAE,IAAI;QACvB,eAAe,EAAE,IAAI;QACrB,gBAAgB,EAAE,IAAI;QACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;QAC/B,UAAU;QACV,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC;QAC5E,CAAC;QACD,IAAI,MAAkB,CAAC;QACvB,IAAI,CAAC;YACH,MAAM;gBACJ,OAAO,CAAC,MAAM;oBACd,CAAC,OAAO,CAAC,YAAY;wBACnB,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE;wBACxB,CAAC,CAAC,eAAe,CAAC;4BACd,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,gBAAgB;gCAC/B,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE;gCAC1C,CAAC,CAAC,EAAE,CAAC;4BACP,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,iBAAiB;gCAChC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE;gCAC5C,CAAC,CAAC,EAAE,CAAC;4BACP,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;yBAC3D,CAAC,CAAC,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC;QAC1E,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACrC,KAAK,EAAE,MAAM,CAAC,OAAO;YACrB,SAAS;YACT,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC,CAAC;QAEH,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC;QAC5E,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO;gBACL,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;gBACxD,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,OAAO,EAAE,YAAY,EAAE;aACxB,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,OAA8C,CAAC;QACtE,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC,oBAAoB,CAAC,CAAC;QAC/C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,kBAAkB;gBAC1B,OAAO,EAAE;oBACP,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC;iBAC9D;aACF,CAAC;QACJ,CAAC;QACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC,oBAAoB,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,cAAc,CAAC,SAAS,EAAE,qBAAqB,CAAC;YACnE,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC;QACT,MAAM,QAAQ,GAAG,cAAc,CAC7B,KAAK,EACL,QAAQ,EACR,iBAAiB,EACjB,YAAY,CACb,CAAC;QACF,MAAM,OAAO,GAAgB;YAC3B,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC;YAC7D,iBAAiB;YACjB,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;SAC5C,CAAC;QAEF,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,yBAAyB;gBACjC,OAAO;aACR,CAAC;QACJ,CAAC;QACD,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,aAAa,CAAC,KAAK,EAAE,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC;YACpE,iBAAiB;YACjB,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;YAC3C,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,YAAY,EAAE,QAAQ,CAAC,MAAM;YAC7B,OAAO;SACR,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
@@ -0,0 +1,94 @@
1
+ import { Database } from "bun:sqlite";
2
+ import type { EvidenceBenchmarks, EvidenceModels } from "./benchmarkEvidence.js";
3
+ export interface TypeSafeSettings {
4
+ model?: string;
5
+ timeoutMs: number;
6
+ skipBelow: number;
7
+ minEffortConfidence: number;
8
+ maxStateBytes: number;
9
+ efforts: string[];
10
+ }
11
+ export type TypeSafeOptions = boolean | {
12
+ model?: string;
13
+ timeoutMs?: number;
14
+ skipBelow?: number;
15
+ minEffortConfidence?: number;
16
+ maxStateBytes?: number;
17
+ efforts?: string[];
18
+ } | null;
19
+ export interface TypeSafeConfig {
20
+ enabled: boolean;
21
+ settings: TypeSafeSettings | null;
22
+ keyPresent: boolean;
23
+ }
24
+ export declare const TYPESAFE_DEFAULTS: TypeSafeSettings;
25
+ export type NormalizedTypeSafeOptions = {
26
+ disabled: true;
27
+ } | {
28
+ disabled: false;
29
+ overrides: Partial<TypeSafeSettings>;
30
+ };
31
+ export type TypeSafeValidationError = {
32
+ error: string;
33
+ };
34
+ export declare function normalizeTypeSafeOptions(value: unknown): NormalizedTypeSafeOptions | TypeSafeValidationError;
35
+ export declare function resolveTypeSafeSettings(source: NormalizedTypeSafeOptions): TypeSafeSettings;
36
+ export declare function resolveTypeSafeConfig(source: NormalizedTypeSafeOptions | undefined, env?: Record<string, string | undefined>): TypeSafeConfig;
37
+ export declare const TYPE_SAFE_ENV_KEY = "TYPESAFE_API_KEY";
38
+ export interface DecisionState {
39
+ request: {
40
+ question: string | null;
41
+ mode: string;
42
+ trigger: string;
43
+ explicitEffort: string | null;
44
+ caller: string | null;
45
+ directory: string | null;
46
+ };
47
+ user: {
48
+ latestRequest: string | null;
49
+ };
50
+ context: {
51
+ messages: string[];
52
+ latestUserIncluded: boolean;
53
+ };
54
+ history: {
55
+ priorConsultations: number;
56
+ priorModes: string[];
57
+ repeatedQuestion: boolean;
58
+ };
59
+ availability: {
60
+ supportedEfforts: string[];
61
+ defaultEffort: string | null;
62
+ };
63
+ models: EvidenceModels | null;
64
+ benchmarks: EvidenceBenchmarks | null;
65
+ coverage: {
66
+ truncated: boolean;
67
+ droppedMessages: number;
68
+ includedMessages: number;
69
+ totalMessages: number;
70
+ stateBytes: number;
71
+ maxStateBytes: number;
72
+ benchmarksOmitted: boolean;
73
+ };
74
+ }
75
+ export interface BuildDecisionStateOptions {
76
+ question?: string | null;
77
+ mode: string;
78
+ trigger: string;
79
+ explicitEffort?: string | null;
80
+ caller?: string | null;
81
+ directory?: string | null;
82
+ priorConsultations: number;
83
+ priorModes: string[];
84
+ priorQuestions?: string[];
85
+ supportedEfforts: string[];
86
+ defaultEffort?: string | null;
87
+ maxStateBytes?: number;
88
+ models?: EvidenceModels | null;
89
+ benchmarks?: EvidenceBenchmarks | null;
90
+ formatMessage?: (type: string, data: Record<string, any>) => string | null;
91
+ }
92
+ export declare function makeDecisionState(options: BuildDecisionStateOptions): DecisionState;
93
+ export declare function buildDecisionState(db: InstanceType<typeof Database>, sessionId: string, options: BuildDecisionStateOptions): DecisionState;
94
+ //# sourceMappingURL=typesafeState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typesafeState.d.ts","sourceRoot":"","sources":["../src/typesafeState.ts"],"names":[],"mappings":"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"}