@principles/core 1.122.0 → 1.124.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.
Files changed (126) hide show
  1. package/dist/runtime-v2/__tests__/architecture-regression.test.js +37 -73
  2. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  3. package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts.map +1 -1
  4. package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js +4 -0
  5. package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js.map +1 -1
  6. package/dist/runtime-v2/config/__tests__/pd-config-contract.test.js +37 -0
  7. package/dist/runtime-v2/config/__tests__/pd-config-contract.test.js.map +1 -1
  8. package/dist/runtime-v2/config/pd-config-defaults.d.ts.map +1 -1
  9. package/dist/runtime-v2/config/pd-config-defaults.js +2 -0
  10. package/dist/runtime-v2/config/pd-config-defaults.js.map +1 -1
  11. package/dist/runtime-v2/config/pd-config-types.d.ts +2 -0
  12. package/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -1
  13. package/dist/runtime-v2/config/pd-config-types.js.map +1 -1
  14. package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.d.ts +2 -0
  15. package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.d.ts.map +1 -0
  16. package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.js +45 -0
  17. package/dist/runtime-v2/diagnostician/__tests__/diag-distiller-output.test.js.map +1 -0
  18. package/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.d.ts +2 -0
  19. package/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.d.ts.map +1 -0
  20. package/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js +57 -0
  21. package/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js.map +1 -0
  22. package/dist/runtime-v2/diagnostician/__tests__/distiller-prompt-builder.test.d.ts +2 -0
  23. package/dist/runtime-v2/diagnostician/__tests__/distiller-prompt-builder.test.d.ts.map +1 -0
  24. package/dist/runtime-v2/diagnostician/__tests__/distiller-prompt-builder.test.js +39 -0
  25. package/dist/runtime-v2/diagnostician/__tests__/distiller-prompt-builder.test.js.map +1 -0
  26. package/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.d.ts +2 -0
  27. package/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.d.ts.map +1 -0
  28. package/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js +34 -0
  29. package/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js.map +1 -0
  30. package/dist/runtime-v2/diagnostician/__tests__/router-prompt-builder.test.d.ts +2 -0
  31. package/dist/runtime-v2/diagnostician/__tests__/router-prompt-builder.test.d.ts.map +1 -0
  32. package/dist/runtime-v2/diagnostician/__tests__/router-prompt-builder.test.js +57 -0
  33. package/dist/runtime-v2/diagnostician/__tests__/router-prompt-builder.test.js.map +1 -0
  34. package/dist/runtime-v2/diagnostician/diag-distiller-output.d.ts +80 -0
  35. package/dist/runtime-v2/diagnostician/diag-distiller-output.d.ts.map +1 -0
  36. package/dist/runtime-v2/diagnostician/diag-distiller-output.js +103 -0
  37. package/dist/runtime-v2/diagnostician/diag-distiller-output.js.map +1 -0
  38. package/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts +115 -0
  39. package/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts.map +1 -0
  40. package/dist/runtime-v2/diagnostician/diag-rootcause-output.js +166 -0
  41. package/dist/runtime-v2/diagnostician/diag-rootcause-output.js.map +1 -0
  42. package/dist/runtime-v2/diagnostician/distiller-prompt-builder.d.ts +134 -0
  43. package/dist/runtime-v2/diagnostician/distiller-prompt-builder.d.ts.map +1 -0
  44. package/dist/runtime-v2/diagnostician/distiller-prompt-builder.js +156 -0
  45. package/dist/runtime-v2/diagnostician/distiller-prompt-builder.js.map +1 -0
  46. package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts +96 -0
  47. package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts.map +1 -0
  48. package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js +216 -0
  49. package/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js.map +1 -0
  50. package/dist/runtime-v2/diagnostician/router-prompt-builder.d.ts +127 -0
  51. package/dist/runtime-v2/diagnostician/router-prompt-builder.d.ts.map +1 -0
  52. package/dist/runtime-v2/diagnostician/router-prompt-builder.js +131 -0
  53. package/dist/runtime-v2/diagnostician/router-prompt-builder.js.map +1 -0
  54. package/dist/runtime-v2/index.d.ts +6 -3
  55. package/dist/runtime-v2/index.d.ts.map +1 -1
  56. package/dist/runtime-v2/index.js +1 -1
  57. package/dist/runtime-v2/index.js.map +1 -1
  58. package/dist/runtime-v2/internalization/__tests__/__fixtures__/split-pipeline-mock-outputs.d.ts +25 -0
  59. package/dist/runtime-v2/internalization/__tests__/__fixtures__/split-pipeline-mock-outputs.d.ts.map +1 -0
  60. package/dist/runtime-v2/internalization/__tests__/__fixtures__/split-pipeline-mock-outputs.js +123 -0
  61. package/dist/runtime-v2/internalization/__tests__/__fixtures__/split-pipeline-mock-outputs.js.map +1 -0
  62. package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.d.ts +2 -0
  63. package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.d.ts.map +1 -0
  64. package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js +731 -0
  65. package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js.map +1 -0
  66. package/dist/runtime-v2/internalization/__tests__/diag-distiller-runner.test.d.ts +2 -0
  67. package/dist/runtime-v2/internalization/__tests__/diag-distiller-runner.test.d.ts.map +1 -0
  68. package/dist/runtime-v2/internalization/__tests__/diag-distiller-runner.test.js +437 -0
  69. package/dist/runtime-v2/internalization/__tests__/diag-distiller-runner.test.js.map +1 -0
  70. package/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.d.ts +2 -0
  71. package/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.d.ts.map +1 -0
  72. package/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.js +336 -0
  73. package/dist/runtime-v2/internalization/__tests__/diag-rootcause-runner.test.js.map +1 -0
  74. package/dist/runtime-v2/internalization/__tests__/diag-router-runner.test.d.ts +2 -0
  75. package/dist/runtime-v2/internalization/__tests__/diag-router-runner.test.d.ts.map +1 -0
  76. package/dist/runtime-v2/internalization/__tests__/diag-router-runner.test.js +437 -0
  77. package/dist/runtime-v2/internalization/__tests__/diag-router-runner.test.js.map +1 -0
  78. package/dist/runtime-v2/internalization/diag-distiller-runner.d.ts +83 -0
  79. package/dist/runtime-v2/internalization/diag-distiller-runner.d.ts.map +1 -0
  80. package/dist/runtime-v2/internalization/diag-distiller-runner.js +274 -0
  81. package/dist/runtime-v2/internalization/diag-distiller-runner.js.map +1 -0
  82. package/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts +73 -0
  83. package/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts.map +1 -0
  84. package/dist/runtime-v2/internalization/diag-rootcause-runner.js +229 -0
  85. package/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -0
  86. package/dist/runtime-v2/internalization/diag-router-runner.d.ts +85 -0
  87. package/dist/runtime-v2/internalization/diag-router-runner.d.ts.map +1 -0
  88. package/dist/runtime-v2/internalization/diag-router-runner.js +353 -0
  89. package/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -0
  90. package/dist/runtime-v2/internalization/evaluator-runner.d.ts +1 -1
  91. package/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
  92. package/dist/runtime-v2/internalization/evaluator-runner.js +1 -1
  93. package/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
  94. package/dist/runtime-v2/internalization/split-diagnostician-runner.d.ts +66 -0
  95. package/dist/runtime-v2/internalization/split-diagnostician-runner.d.ts.map +1 -0
  96. package/dist/runtime-v2/internalization/split-diagnostician-runner.js +172 -0
  97. package/dist/runtime-v2/internalization/split-diagnostician-runner.js.map +1 -0
  98. package/dist/runtime-v2/pain-signal-bridge.d.ts +22 -3
  99. package/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
  100. package/dist/runtime-v2/pain-signal-bridge.js +16 -7
  101. package/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
  102. package/dist/runtime-v2/pain-signal-runtime-factory.d.ts +3 -0
  103. package/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  104. package/dist/runtime-v2/pain-signal-runtime-factory.js +52 -24
  105. package/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  106. package/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.js +2 -2
  107. package/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.js.map +1 -1
  108. package/dist/runtime-v2/runner/base-peer-runner.d.ts +3 -3
  109. package/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
  110. package/dist/runtime-v2/runner/base-peer-runner.js +6 -6
  111. package/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
  112. package/dist/runtime-v2/runner/peer-runner-types.d.ts +3 -3
  113. package/dist/runtime-v2/runner/peer-runner-types.d.ts.map +1 -1
  114. package/dist/runtime-v2/store/candidate/sqlite-candidate-store.js +2 -2
  115. package/dist/runtime-v2/store/candidate/sqlite-candidate-store.js.map +1 -1
  116. package/dist/runtime-v2/types/principle-enums.d.ts +2 -2
  117. package/dist/runtime-v2/types/principle-enums.d.ts.map +1 -1
  118. package/dist/runtime-v2/types/principle-enums.js +1 -0
  119. package/dist/runtime-v2/types/principle-enums.js.map +1 -1
  120. package/dist/runtime-v2/types/principle-schema.d.ts +1 -1
  121. package/dist/runtime-v2/types/principle-tree-store.d.ts +1 -1
  122. package/dist/telemetry-event.d.ts +2 -2
  123. package/dist/telemetry-event.d.ts.map +1 -1
  124. package/dist/telemetry-event.js +1 -0
  125. package/dist/telemetry-event.js.map +1 -1
  126. package/package.json +1 -1
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Root Cause stage (Stage A) output schema for the split diagnostician pipeline.
3
+ *
4
+ * This schema defines the output of the Root Cause stage, which identifies
5
+ * the underlying cause of a pain signal using a 5-Whys causal chain and
6
+ * categorises it into one of four root-cause categories.
7
+ *
8
+ * The taskId field is lineage data re-injected by the runner if stripped
9
+ * by the adapter before LLM validation (ERR-008).
10
+ *
11
+ * @see PRI-372
12
+ */
13
+ import { Type } from '@sinclair/typebox';
14
+ import { Value } from '@sinclair/typebox/value';
15
+ // ── Sub-schemas ──────────────────────────────────────────────────────────────
16
+ /**
17
+ * Root-cause category literal union.
18
+ *
19
+ * Every root cause MUST be classified into exactly one of these four
20
+ * categories. The category prefix in `rootCause` must match this value.
21
+ *
22
+ * @see PRI-372
23
+ */
24
+ export const RootCauseCategorySchema = Type.Union([
25
+ Type.Literal('People'),
26
+ Type.Literal('Design'),
27
+ Type.Literal('Assumption'),
28
+ Type.Literal('Tooling'),
29
+ ]);
30
+ /**
31
+ * A single entry in the 5-Whys causal chain.
32
+ *
33
+ * `why` is 1-indexed (1 = shallowest, 5 = deepest).
34
+ */
35
+ export const CausalChainEntrySchema = Type.Object({
36
+ why: Type.Number({ minimum: 1, maximum: 5 }),
37
+ statement: Type.String({ minLength: 1 }),
38
+ evidenceRefs: Type.Array(Type.String({ minLength: 1 }), { minItems: 1 }),
39
+ });
40
+ /**
41
+ * Evidence entry linking a source reference to an explanatory note.
42
+ */
43
+ export const DiagRootCauseEvidenceSchema = Type.Object({
44
+ sourceRef: Type.String({ minLength: 1 }),
45
+ note: Type.String({ minLength: 1 }),
46
+ });
47
+ // ── Main output schema ───────────────────────────────────────────────────────
48
+ /**
49
+ * TypeBox schema for the Root Cause stage (Stage A) output.
50
+ *
51
+ * Consumed by the next pipeline stage and stored as a RunRecord output.
52
+ * The host layer (runner) is responsible for re-injecting `taskId` if
53
+ * the adapter strips lineage fields before LLM invocation (ERR-008).
54
+ *
55
+ * @see PRI-372
56
+ */
57
+ export const DiagRootCauseOutputV1Schema = Type.Object({
58
+ valid: Type.Boolean(),
59
+ diagnosisId: Type.String({ minLength: 1 }),
60
+ taskId: Type.String({ minLength: 1, description: 'Lineage — re-injected if stripped; ERR-008' }),
61
+ summary: Type.String({ minLength: 1 }),
62
+ causalChain: Type.Array(CausalChainEntrySchema),
63
+ rootCause: Type.String({
64
+ minLength: 1,
65
+ description: 'MUST include category prefix: "People: ..." or "Design: ..." or "Assumption: ..." or "Tooling: ..."',
66
+ }),
67
+ rootCauseCategory: RootCauseCategorySchema,
68
+ evidence: Type.Array(DiagRootCauseEvidenceSchema),
69
+ confidence: Type.Number({ minimum: 0, maximum: 1 }),
70
+ ambiguityNotes: Type.Optional(Type.Array(Type.String())),
71
+ });
72
+ // ── Validator ────────────────────────────────────────────────────────────────
73
+ const VALID_ROOT_CAUSE_CATEGORIES = new Set(['People', 'Design', 'Assumption', 'Tooling']);
74
+ /**
75
+ * Default validator for DiagRootCauseOutputV1 using TypeBox Value.Check / Value.Errors.
76
+ *
77
+ * Validates:
78
+ * 1. Structural correctness via TypeBox schema
79
+ * 2. taskId lineage match (ERR-008)
80
+ * 3. rootCauseCategory consistency with rootCause prefix
81
+ * 4. causalChain entry ordering (why field 1-5)
82
+ *
83
+ * @see PRI-372
84
+ */
85
+ export class DefaultDiagRootCauseValidator {
86
+ // eslint-disable-next-line @typescript-eslint/class-methods-use-this
87
+ async validate(output, taskId) {
88
+ const errors = [];
89
+ // ── Step 1: Object guard ────────────────────────────────────────────────
90
+ if (typeof output !== 'object' || output === null) {
91
+ return { valid: false, errors: ['Output is not an object'], errorCategory: 'output_invalid' };
92
+ }
93
+ // Narrow to Record for property access — all fields still treated as untrusted.
94
+ const record = output;
95
+ // ── Step 2: taskId lineage check (ERR-008) ──────────────────────────────
96
+ if (typeof record.taskId !== 'string' || record.taskId !== taskId) {
97
+ errors.push(`taskId mismatch: expected ${taskId}, got ${String(record.taskId)}`);
98
+ }
99
+ // ── Step 3: valid flag must be true ─────────────────────────────────────
100
+ if (record.valid !== true) {
101
+ errors.push('output.valid must be true');
102
+ }
103
+ // ── Step 4: rootCauseCategory semantic check ────────────────────────────
104
+ if (typeof record.rootCauseCategory !== 'string' || !VALID_ROOT_CAUSE_CATEGORIES.has(record.rootCauseCategory)) {
105
+ errors.push(`rootCauseCategory must be one of People|Design|Assumption|Tooling, got ${String(record.rootCauseCategory)}`);
106
+ }
107
+ // ── Step 4b: rootCause prefix must match rootCauseCategory ──────────────
108
+ if (typeof record.rootCause === 'string'
109
+ && typeof record.rootCauseCategory === 'string'
110
+ && VALID_ROOT_CAUSE_CATEGORIES.has(record.rootCauseCategory)) {
111
+ const expectedPrefix = `${record.rootCauseCategory}: `;
112
+ if (!record.rootCause.startsWith(expectedPrefix)) {
113
+ errors.push(`rootCause must start with "${expectedPrefix}" (matching rootCauseCategory "${record.rootCauseCategory}"), got: "${record.rootCause.slice(0, 40)}${record.rootCause.length > 40 ? '...' : ''}"`);
114
+ }
115
+ }
116
+ // ── Step 5: causalChain entry-level checks ──────────────────────────────
117
+ if (Array.isArray(record.causalChain)) {
118
+ for (let i = 0; i < record.causalChain.length; i++) {
119
+ const entry = record.causalChain[i];
120
+ if (!entry || typeof entry !== 'object') {
121
+ errors.push(`causalChain[${i}] must be an object`);
122
+ continue;
123
+ }
124
+ if (typeof entry.why !== 'number' || entry.why < 1 || entry.why > 5) {
125
+ errors.push(`causalChain[${i}].why must be a number in [1, 5]`);
126
+ }
127
+ if (typeof entry.statement !== 'string' || entry.statement.trim() === '') {
128
+ errors.push(`causalChain[${i}].statement must be a non-empty string`);
129
+ }
130
+ if (!Array.isArray(entry.evidenceRefs)) {
131
+ errors.push(`causalChain[${i}].evidenceRefs must be an array`);
132
+ }
133
+ else if (entry.evidenceRefs.length === 0) {
134
+ errors.push(`causalChain[${i}].evidenceRefs must have at least 1 item`);
135
+ }
136
+ }
137
+ }
138
+ // ── Step 6: evidence entry-level checks ─────────────────────────────────
139
+ if (Array.isArray(record.evidence)) {
140
+ for (let i = 0; i < record.evidence.length; i++) {
141
+ const ev = record.evidence[i];
142
+ if (!ev || typeof ev !== 'object') {
143
+ errors.push(`evidence[${i}] must be an object`);
144
+ continue;
145
+ }
146
+ if (typeof ev.sourceRef !== 'string' || ev.sourceRef.trim() === '') {
147
+ errors.push(`evidence[${i}].sourceRef must be a non-empty string`);
148
+ }
149
+ if (typeof ev.note !== 'string' || ev.note.trim() === '') {
150
+ errors.push(`evidence[${i}].note must be a non-empty string`);
151
+ }
152
+ }
153
+ }
154
+ // ── Step 7: TypeBox schema validation as fallback ───────────────────────
155
+ if (!Value.Check(DiagRootCauseOutputV1Schema, output)) {
156
+ const schemaErrors = [...Value.Errors(DiagRootCauseOutputV1Schema, output)];
157
+ const messages = schemaErrors.map((e) => `${e.path}: ${e.message}`);
158
+ errors.push(...messages);
159
+ }
160
+ if (errors.length > 0) {
161
+ return { valid: false, errors, errorCategory: 'output_invalid' };
162
+ }
163
+ return { valid: true, errors: [] };
164
+ }
165
+ }
166
+ //# sourceMappingURL=diag-rootcause-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diag-rootcause-output.js","sourceRoot":"","sources":["../../../src/runtime-v2/diagnostician/diag-rootcause-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * DistillerPromptBuilder — Stage B prompt builder for the split diagnostician pipeline.
3
+ *
4
+ * Constructs the prompt for the Distiller stage (Stage B). It receives the
5
+ * Stage A root cause artifact as input and produces an abstracted principle
6
+ * grounded on core axioms (T-01..T-10).
7
+ *
8
+ * ## Prompt Sections
9
+ *
10
+ * 1. Role — principle distiller identity
11
+ * 2. Input — Stage A root cause output (structured data)
12
+ * 3. Core Axioms — T-01..T-10 list (when coreGrounding=true)
13
+ * 4. Output Requirements — DiagDistillerOutputV1Schema
14
+ * 5. Quality Guard — abstract vs rule-like distinction
15
+ *
16
+ * @see PRI-372
17
+ */
18
+ import type { TSchema } from '@sinclair/typebox';
19
+ import type { SchemaPromptAdapter } from '../adapter/schema-prompt-adapter.js';
20
+ import type { DiagRootCauseOutputV1 } from './diag-rootcause-output.js';
21
+ import type { OutputLanguage } from '../language-directive.js';
22
+ import type { BuildPromptOptions } from '../diagnostician-prompt-builder.js';
23
+ /**
24
+ * Options for DistillerPromptBuilder constructor and buildDistillerInstruction.
25
+ *
26
+ * Uses an opts-object pattern to satisfy @typescript-eslint/max-params.
27
+ *
28
+ * @see PRI-372
29
+ */
30
+ export interface DistillerPromptBuilderOptions {
31
+ /** Schema prompt adapter (default: DefaultSchemaPromptAdapter) */
32
+ adapter?: SchemaPromptAdapter;
33
+ /** TypeBox schema for output validation (default: DiagDistillerOutputV1Schema) */
34
+ schema?: TSchema;
35
+ /** Output language directive (default: none) */
36
+ outputLanguage?: OutputLanguage;
37
+ /** Inject core axiom grounding section (default: false) */
38
+ coreGrounding?: boolean;
39
+ }
40
+ /**
41
+ * Input context for the Distiller stage (Stage B).
42
+ *
43
+ * Contains the Stage A root cause artifact ID and output, plus an optional
44
+ * coreGrounding flag that overrides the builder-level default.
45
+ *
46
+ * @see PRI-372
47
+ */
48
+ export interface DistillerContextInput {
49
+ /** Artifact ID of the Stage A root cause output — used for lineage tracing */
50
+ rootCauseArtifactId: string;
51
+ /** Stage A root cause output — the structured data to abstract from */
52
+ rootCauseOutput: DiagRootCauseOutputV1;
53
+ /** Override builder-level coreGrounding for this specific invocation */
54
+ coreGrounding?: boolean;
55
+ }
56
+ /**
57
+ * PromptInput for the Distiller stage (Stage B).
58
+ *
59
+ * Unlike Stage A (which uses the full DiagnosticianContextPayload),
60
+ * Stage B receives only the Stage A root cause artifact and the
61
+ * distiller instruction.
62
+ *
63
+ * @see PRI-372
64
+ */
65
+ export interface DistillerPromptInput {
66
+ /** Artifact ID of the Stage A root cause output — for lineage tracing */
67
+ rootCauseArtifactId: string;
68
+ /** Stage A root cause output — the structured data to abstract from */
69
+ rootCauseOutput: DiagRootCauseOutputV1;
70
+ /** Distiller protocol instruction for the LLM */
71
+ distillerInstruction: string;
72
+ }
73
+ /**
74
+ * Build result for the Distiller stage (Stage B).
75
+ *
76
+ * Follows the same contract as PromptBuildResult but with a
77
+ * DistillerPromptInput shape specific to Stage B.
78
+ *
79
+ * @see PRI-372
80
+ */
81
+ export interface DistillerPromptBuildResult {
82
+ /** JSON string — the exact value to pass as openclaw agent --message argument */
83
+ readonly message: string;
84
+ /** The DistillerPromptInput object that was serialized to JSON */
85
+ readonly promptInput: DistillerPromptInput;
86
+ }
87
+ /**
88
+ * Build the Stage B distiller protocol instruction.
89
+ *
90
+ * When `coreGrounding` is true, the Core Axioms section is included with
91
+ * the full T-01..T-10 list and a strict instruction prohibiting fabricated
92
+ * axiom IDs. When false or undefined, the section is omitted.
93
+ *
94
+ * @see PRI-372
95
+ */
96
+ export declare function buildDistillerProtocolInstruction(opts?: DistillerPromptBuilderOptions): string;
97
+ /**
98
+ * DistillerPromptBuilder — Stage B prompt builder for the split diagnostician pipeline.
99
+ *
100
+ * Receives the Stage A root cause artifact as input and produces an abstracted
101
+ * principle grounded on core axioms (T-01..T-10).
102
+ *
103
+ * Uses an opts-object pattern for all methods to satisfy @typescript-eslint/max-params.
104
+ *
105
+ * @see PRI-372
106
+ */
107
+ export declare class DistillerPromptBuilder {
108
+ private readonly adapter;
109
+ private readonly schema;
110
+ constructor(opts?: DistillerPromptBuilderOptions);
111
+ /**
112
+ * Build the Stage B distiller protocol instruction.
113
+ *
114
+ * Contains the role definition, input description, core axioms section
115
+ * (when coreGrounding=true), output requirements, and quality guard.
116
+ *
117
+ * @see PRI-372
118
+ */
119
+ buildDistillerInstruction(opts?: DistillerPromptBuilderOptions): string;
120
+ /**
121
+ * Build the full prompt for Stage B.
122
+ *
123
+ * Constructs a DistillerPromptBuildResult containing the JSON message to pass
124
+ * as the --message argument to the LLM agent. The message includes the
125
+ * distiller instruction and the Stage A root cause context.
126
+ *
127
+ * Per DPB-02: Output is ONLY JSON — no markdown, no file ops, no tool calls.
128
+ * Per DPB-05: This method only builds the prompt; it does NOT commit to PD database.
129
+ *
130
+ * @see PRI-372
131
+ */
132
+ buildPrompt(context: DistillerContextInput, opts?: BuildPromptOptions): DistillerPromptBuildResult;
133
+ }
134
+ //# sourceMappingURL=distiller-prompt-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distiller-prompt-builder.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/diagnostician/distiller-prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAI7E;;;;;;GAMG;AACH,MAAM,WAAW,6BAA6B;IAC5C,kEAAkE;IAClE,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,kFAAkF;IAClF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,2DAA2D;IAC3D,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAID;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC,8EAA8E;IAC9E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,eAAe,EAAE,qBAAqB,CAAC;IACvC,wEAAwE;IACxE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAID;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,eAAe,EAAE,qBAAqB,CAAC;IACvC,iDAAiD;IACjD,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,0BAA0B;IACzC,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;CAC5C;AAID;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAC/C,IAAI,GAAE,6BAAkC,GACvC,MAAM,CAgER;AAID;;;;;;;;;GASG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;gBAErB,IAAI,GAAE,6BAAkC;IAKpD;;;;;;;OAOG;IACH,yBAAyB,CAAC,IAAI,GAAE,6BAAkC,GAAG,MAAM;IAS3E;;;;;;;;;;;OAWG;IACH,WAAW,CACT,OAAO,EAAE,qBAAqB,EAC9B,IAAI,GAAE,kBAAuB,GAC5B,0BAA0B;CAmB9B"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * DistillerPromptBuilder — Stage B prompt builder for the split diagnostician pipeline.
3
+ *
4
+ * Constructs the prompt for the Distiller stage (Stage B). It receives the
5
+ * Stage A root cause artifact as input and produces an abstracted principle
6
+ * grounded on core axioms (T-01..T-10).
7
+ *
8
+ * ## Prompt Sections
9
+ *
10
+ * 1. Role — principle distiller identity
11
+ * 2. Input — Stage A root cause output (structured data)
12
+ * 3. Core Axioms — T-01..T-10 list (when coreGrounding=true)
13
+ * 4. Output Requirements — DiagDistillerOutputV1Schema
14
+ * 5. Quality Guard — abstract vs rule-like distinction
15
+ *
16
+ * @see PRI-372
17
+ */
18
+ import { DefaultSchemaPromptAdapter } from '../adapter/schema-prompt-adapter.js';
19
+ import { DiagDistillerOutputV1Schema } from './diag-distiller-output.js';
20
+ import { CORE_PRINCIPLES } from '../core-principles/core-principle-registry.js';
21
+ import { buildLanguageDirective } from '../language-directive.js';
22
+ // ── Instruction builder ──────────────────────────────────────────────────────
23
+ /**
24
+ * Build the Stage B distiller protocol instruction.
25
+ *
26
+ * When `coreGrounding` is true, the Core Axioms section is included with
27
+ * the full T-01..T-10 list and a strict instruction prohibiting fabricated
28
+ * axiom IDs. When false or undefined, the section is omitted.
29
+ *
30
+ * @see PRI-372
31
+ */
32
+ export function buildDistillerProtocolInstruction(opts = {}) {
33
+ const adapter = opts.adapter ?? new DefaultSchemaPromptAdapter();
34
+ const schema = opts.schema ?? DiagDistillerOutputV1Schema;
35
+ const { outputLanguage, coreGrounding } = opts;
36
+ const example = adapter.generateExample(schema);
37
+ const constraints = adapter.generateConstraints(schema);
38
+ const languageDirective = buildLanguageDirective(outputLanguage);
39
+ // Core Axioms section — only when coreGrounding is true
40
+ const coreAxiomsBlock = coreGrounding
41
+ ? `
42
+ CORE AXIOMS:
43
+ The following core axioms are the system's foundational behavioral principles.
44
+ You MUST only reference axiom IDs from this list. Fabricating IDs not in this
45
+ list will cause validation failure.
46
+
47
+ ${CORE_PRINCIPLES.map(p => `${p.id}: ${p.statement}`).join('\n')}
48
+
49
+ `
50
+ : '';
51
+ return `You are a principle distiller. Your job is to abstract a specific root cause into a general, cross-scenario principle.
52
+
53
+ INPUT:
54
+ You will receive the Stage A root cause output as structured data. This contains:
55
+ - summary: a concise description of the diagnosis
56
+ - causalChain: the 5-Whys causal chain
57
+ - rootCause: the classified root cause with category prefix
58
+ - rootCauseCategory: People | Design | Assumption | Tooling
59
+ - evidence: supporting evidence entries
60
+ - confidence: the Stage A confidence score
61
+ ${coreAxiomsBlock}OUTPUT REQUIREMENTS:
62
+ Your output MUST match the following JSON schema exactly.
63
+
64
+ COMPLETE EXAMPLE OUTPUT (follow this exact structure):
65
+ ${example}
66
+
67
+ Key fields:
68
+ - abstractedPrinciple: ≤200 chars, abstract, cross-scenario principle that grows from the root cause
69
+ - groundedOnCorePrincipleIds: subset of the provided axiom IDs above (empty array if none apply)
70
+ - sourceRootCauseArtifactId: MUST match the provided artifact ID exactly
71
+ - scope: 'general' | 'domain' | 'scenario'
72
+ - rationale: why this principle addresses the root cause
73
+ - confidence: 0-1 scale
74
+
75
+ QUALITY GUARD:
76
+ Your principle must be ABSTRACT, not rule-like. Avoid concrete trigger patterns,
77
+ specific tools, or implementation details. A principle is directional wisdom;
78
+ a rule is a boundary condition.
79
+
80
+ Examples:
81
+ - GOOD (abstract principle): "Prefer understanding the existing structure before modifying it"
82
+ - BAD (rule-like): "Always run grep before editing files" or "Never use as casts"
83
+ - GOOD (intent over technique): "Explicitly stated user constraints take precedence over inferred optimal paths"
84
+ - BAD (technique-specific): "Do not create project files in /tmp directory"
85
+
86
+ CONSTRAINTS:
87
+ - Output ONLY valid JSON — no markdown, no explanatory text, no code fences, no prose before or after
88
+ - Do NOT read files, call tools, or write to any database
89
+ - abstractedPrinciple MUST be ≤200 characters
90
+ - groundedOnCorePrincipleIds MUST only contain IDs from the provided axiom list${coreGrounding ? ' above' : ''}; fabricated IDs cause validation failure
91
+ - sourceRootCauseArtifactId MUST match the provided artifact ID
92
+ ${constraints}${languageDirective}`;
93
+ }
94
+ // ── Prompt builder class ─────────────────────────────────────────────────────
95
+ /**
96
+ * DistillerPromptBuilder — Stage B prompt builder for the split diagnostician pipeline.
97
+ *
98
+ * Receives the Stage A root cause artifact as input and produces an abstracted
99
+ * principle grounded on core axioms (T-01..T-10).
100
+ *
101
+ * Uses an opts-object pattern for all methods to satisfy @typescript-eslint/max-params.
102
+ *
103
+ * @see PRI-372
104
+ */
105
+ export class DistillerPromptBuilder {
106
+ adapter;
107
+ schema;
108
+ constructor(opts = {}) {
109
+ this.adapter = opts.adapter ?? new DefaultSchemaPromptAdapter();
110
+ this.schema = opts.schema ?? DiagDistillerOutputV1Schema;
111
+ }
112
+ /**
113
+ * Build the Stage B distiller protocol instruction.
114
+ *
115
+ * Contains the role definition, input description, core axioms section
116
+ * (when coreGrounding=true), output requirements, and quality guard.
117
+ *
118
+ * @see PRI-372
119
+ */
120
+ buildDistillerInstruction(opts = {}) {
121
+ return buildDistillerProtocolInstruction({
122
+ adapter: opts.adapter ?? this.adapter,
123
+ schema: opts.schema ?? this.schema,
124
+ outputLanguage: opts.outputLanguage,
125
+ coreGrounding: opts.coreGrounding,
126
+ });
127
+ }
128
+ /**
129
+ * Build the full prompt for Stage B.
130
+ *
131
+ * Constructs a DistillerPromptBuildResult containing the JSON message to pass
132
+ * as the --message argument to the LLM agent. The message includes the
133
+ * distiller instruction and the Stage A root cause context.
134
+ *
135
+ * Per DPB-02: Output is ONLY JSON — no markdown, no file ops, no tool calls.
136
+ * Per DPB-05: This method only builds the prompt; it does NOT commit to PD database.
137
+ *
138
+ * @see PRI-372
139
+ */
140
+ buildPrompt(context, opts = {}) {
141
+ const { outputLanguage } = opts;
142
+ const coreGrounding = context.coreGrounding ?? opts.coreGrounding;
143
+ const distillerInstruction = this.buildDistillerInstruction({
144
+ outputLanguage,
145
+ coreGrounding,
146
+ });
147
+ const promptInput = {
148
+ rootCauseArtifactId: context.rootCauseArtifactId,
149
+ rootCauseOutput: context.rootCauseOutput,
150
+ distillerInstruction,
151
+ };
152
+ const message = JSON.stringify(promptInput);
153
+ return { message, promptInput };
154
+ }
155
+ }
156
+ //# sourceMappingURL=distiller-prompt-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distiller-prompt-builder.js","sourceRoot":"","sources":["../../../src/runtime-v2/diagnostician/distiller-prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAC;AAEhF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AA6ElE,gFAAgF;AAEhF;;;;;;;;GAQG;AACH,MAAM,UAAU,iCAAiC,CAC/C,OAAsC,EAAE;IAExC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,0BAA0B,EAAE,CAAC;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,2BAA2B,CAAC;IAC1D,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAE/C,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAEjE,wDAAwD;IACxD,MAAM,eAAe,GAAG,aAAa;QACnC,CAAC,CAAC;;;;;;EAMJ,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;CAE/D;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;;;;;;;EAUP,eAAe;;;;EAIf,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;iFAyBwE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;;EAE5G,WAAW,GAAG,iBAAiB,EAAE,CAAC;AACpC,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,MAAM,OAAO,sBAAsB;IAChB,OAAO,CAAsB;IAC7B,MAAM,CAAU;IAEjC,YAAY,OAAsC,EAAE;QAClD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,0BAA0B,EAAE,CAAC;QAChE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,2BAA2B,CAAC;IAC3D,CAAC;IAED;;;;;;;OAOG;IACH,yBAAyB,CAAC,OAAsC,EAAE;QAChE,OAAO,iCAAiC,CAAC;YACvC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;YACrC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM;YAClC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CACT,OAA8B,EAC9B,OAA2B,EAAE;QAE7B,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;QAChC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC;QAElE,MAAM,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,CAAC;YAC1D,cAAc;YACd,aAAa;SACd,CAAC,CAAC;QAEH,MAAM,WAAW,GAAyB;YACxC,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;YAChD,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,oBAAoB;SACrB,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAE5C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * RootCausePromptBuilder — Stage A prompt builder for the split diagnostician pipeline.
3
+ *
4
+ * Constructs the prompt for the Root Cause stage (Stage A), which identifies
5
+ * the underlying cause of a pain signal using a 5-Whys causal chain and
6
+ * categorises it into one of four root-cause categories.
7
+ *
8
+ * ## Phases
9
+ *
10
+ * - PHASE 1 — Evidence Review
11
+ * - PHASE 2 — Causal Chain (5 Whys)
12
+ * - PHASE 3 — Root Cause Classification
13
+ * - PHASE 3.5 — Core Axiom Grounding (when coreGrounding=true, PRI-371)
14
+ *
15
+ * ## Output
16
+ *
17
+ * The prompt requires output matching DiagRootCauseOutputV1Schema.
18
+ *
19
+ * @see PRI-372
20
+ */
21
+ import type { TSchema } from '@sinclair/typebox';
22
+ import type { SchemaPromptAdapter } from '../adapter/schema-prompt-adapter.js';
23
+ import type { DiagnosticianContextPayload } from '../context-payload.js';
24
+ import type { OutputLanguage } from '../language-directive.js';
25
+ import type { BuildPromptOptions, PromptBuildResult } from '../diagnostician-prompt-builder.js';
26
+ /**
27
+ * Options for RootCausePromptBuilder constructor and buildRootCauseInstruction.
28
+ *
29
+ * Uses an opts-object pattern to satisfy @typescript-eslint/max-params.
30
+ *
31
+ * @see PRI-372
32
+ */
33
+ export interface RootCausePromptBuilderOptions {
34
+ /** Schema prompt adapter (default: DefaultSchemaPromptAdapter) */
35
+ adapter?: SchemaPromptAdapter;
36
+ /** TypeBox schema for output validation (default: DiagRootCauseOutputV1Schema) */
37
+ schema?: TSchema;
38
+ /** Output language directive (default: none) */
39
+ outputLanguage?: OutputLanguage;
40
+ /** T-E (PRI-371): Inject core axiom grounding as PHASE 3.5 (default: false) */
41
+ coreGrounding?: boolean;
42
+ }
43
+ /**
44
+ * Build the Stage A diagnostic protocol instruction (PHASE 1–3 + optional PHASE 3.5).
45
+ *
46
+ * Per DPB-02 (LOCKED): Output is ONLY JSON — no markdown, no file ops, no tool calls.
47
+ * Per DPB-04: LLM can only analyse the context provided in the prompt; it must NOT
48
+ * read files, call tools, or write to databases.
49
+ *
50
+ * When `coreGrounding` is true, PHASE 3.5 (Core Axiom Grounding) is inserted
51
+ * between PHASE 3 and the final output instruction. When false or undefined,
52
+ * a newline is inserted to preserve byte-identical output (EP-03: no silent fallback).
53
+ *
54
+ * @see PRI-372
55
+ */
56
+ export declare function buildRootCauseProtocolInstruction(opts?: RootCausePromptBuilderOptions): string;
57
+ /**
58
+ * RootCausePromptBuilder — Stage A prompt builder for the split diagnostician pipeline.
59
+ *
60
+ * Transforms DiagnosticianContextPayload into a PromptBuildResult for the
61
+ * Root Cause stage (Stage A). The output prompt requires the LLM to produce
62
+ * JSON matching DiagRootCauseOutputV1Schema.
63
+ *
64
+ * Uses an opts-object pattern for all methods to satisfy @typescript-eslint/max-params.
65
+ *
66
+ * @see PRI-372
67
+ */
68
+ export declare class RootCausePromptBuilder {
69
+ private readonly adapter;
70
+ private readonly schema;
71
+ constructor(opts?: RootCausePromptBuilderOptions);
72
+ /**
73
+ * Build the Stage A diagnostic protocol instruction.
74
+ *
75
+ * Contains PHASE 1 (evidence review), PHASE 2 (causal chain / 5-Whys),
76
+ * PHASE 3 (root cause classification), and optional PHASE 3.5 (core axiom
77
+ * grounding when coreGrounding=true).
78
+ *
79
+ * @see PRI-372
80
+ */
81
+ buildRootCauseInstruction(opts?: RootCausePromptBuilderOptions): string;
82
+ /**
83
+ * Build the full prompt for Stage A.
84
+ *
85
+ * Transforms DiagnosticianContextPayload into a PromptBuildResult containing
86
+ * the JSON message to pass as the --message argument to the LLM agent.
87
+ *
88
+ * Per DPB-02: Output is ONLY JSON — no markdown, no file ops, no tool calls.
89
+ * Per DPB-05: This method only builds the prompt; it does NOT commit to PD database.
90
+ * Per DPB-07: NO extraSystemPrompt is added — agent profile is the source of truth.
91
+ *
92
+ * @see PRI-372
93
+ */
94
+ buildPrompt(payload: DiagnosticianContextPayload, opts?: BuildPromptOptions): PromptBuildResult;
95
+ }
96
+ //# sourceMappingURL=rootcause-prompt-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rootcause-prompt-builder.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/diagnostician/rootcause-prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,oCAAoC,CAAC;AAS5C;;;;;;GAMG;AACH,MAAM,WAAW,6BAA6B;IAC5C,kEAAkE;IAClE,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,kFAAkF;IAClF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,+EAA+E;IAC/E,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,iCAAiC,CAC/C,IAAI,GAAE,6BAAkC,GACvC,MAAM,CAsER;AAID;;;;;;;;;;GAUG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;gBAErB,IAAI,GAAE,6BAAkC;IAKpD;;;;;;;;OAQG;IACH,yBAAyB,CAAC,IAAI,GAAE,6BAAkC,GAAG,MAAM;IAS3E;;;;;;;;;;;OAWG;IACH,WAAW,CACT,OAAO,EAAE,2BAA2B,EACpC,IAAI,GAAE,kBAAuB,GAC5B,iBAAiB;CAwErB"}