@principles/core 1.263.0 → 1.264.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.
- package/dist/runtime-v2/__tests__/architecture-regression.test.js +8 -2
- package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/dist/runtime-v2/activation/__tests__/openclaw-promotion-checks.test.d.ts +2 -0
- package/dist/runtime-v2/activation/__tests__/openclaw-promotion-checks.test.d.ts.map +1 -0
- package/dist/runtime-v2/activation/__tests__/openclaw-promotion-checks.test.js +91 -0
- package/dist/runtime-v2/activation/__tests__/openclaw-promotion-checks.test.js.map +1 -0
- package/dist/runtime-v2/activation/__tests__/promotion-readiness-evaluator.test.d.ts +2 -0
- package/dist/runtime-v2/activation/__tests__/promotion-readiness-evaluator.test.d.ts.map +1 -0
- package/dist/runtime-v2/activation/__tests__/promotion-readiness-evaluator.test.js +83 -0
- package/dist/runtime-v2/activation/__tests__/promotion-readiness-evaluator.test.js.map +1 -0
- package/dist/runtime-v2/activation/__tests__/promotion-readiness-reader.test.d.ts +2 -0
- package/dist/runtime-v2/activation/__tests__/promotion-readiness-reader.test.d.ts.map +1 -0
- package/dist/runtime-v2/activation/__tests__/promotion-readiness-reader.test.js +48 -0
- package/dist/runtime-v2/activation/__tests__/promotion-readiness-reader.test.js.map +1 -0
- package/dist/runtime-v2/activation/__tests__/rulecode-owner-decision-service.test.d.ts +2 -0
- package/dist/runtime-v2/activation/__tests__/rulecode-owner-decision-service.test.d.ts.map +1 -0
- package/dist/runtime-v2/activation/__tests__/rulecode-owner-decision-service.test.js +141 -0
- package/dist/runtime-v2/activation/__tests__/rulecode-owner-decision-service.test.js.map +1 -0
- package/dist/runtime-v2/activation/__tests__/rulecode-safety-circuit-breaker.test.d.ts +2 -0
- package/dist/runtime-v2/activation/__tests__/rulecode-safety-circuit-breaker.test.d.ts.map +1 -0
- package/dist/runtime-v2/activation/__tests__/rulecode-safety-circuit-breaker.test.js +31 -0
- package/dist/runtime-v2/activation/__tests__/rulecode-safety-circuit-breaker.test.js.map +1 -0
- package/dist/runtime-v2/activation/__tests__/sqlite-activation-safety-store.test.d.ts +2 -0
- package/dist/runtime-v2/activation/__tests__/sqlite-activation-safety-store.test.d.ts.map +1 -0
- package/dist/runtime-v2/activation/__tests__/sqlite-activation-safety-store.test.js +311 -0
- package/dist/runtime-v2/activation/__tests__/sqlite-activation-safety-store.test.js.map +1 -0
- package/dist/runtime-v2/activation/activation-control-types.d.ts +61 -0
- package/dist/runtime-v2/activation/activation-control-types.d.ts.map +1 -0
- package/dist/runtime-v2/activation/activation-control-types.js +2 -0
- package/dist/runtime-v2/activation/activation-control-types.js.map +1 -0
- package/dist/runtime-v2/activation/index.d.ts +14 -0
- package/dist/runtime-v2/activation/index.d.ts.map +1 -1
- package/dist/runtime-v2/activation/index.js +7 -0
- package/dist/runtime-v2/activation/index.js.map +1 -1
- package/dist/runtime-v2/activation/openclaw-promotion-checks.d.ts +30 -0
- package/dist/runtime-v2/activation/openclaw-promotion-checks.d.ts.map +1 -0
- package/dist/runtime-v2/activation/openclaw-promotion-checks.js +124 -0
- package/dist/runtime-v2/activation/openclaw-promotion-checks.js.map +1 -0
- package/dist/runtime-v2/activation/promotion-readiness-evaluator.d.ts +17 -0
- package/dist/runtime-v2/activation/promotion-readiness-evaluator.d.ts.map +1 -0
- package/dist/runtime-v2/activation/promotion-readiness-evaluator.js +55 -0
- package/dist/runtime-v2/activation/promotion-readiness-evaluator.js.map +1 -0
- package/dist/runtime-v2/activation/promotion-readiness-reader.d.ts +21 -0
- package/dist/runtime-v2/activation/promotion-readiness-reader.d.ts.map +1 -0
- package/dist/runtime-v2/activation/promotion-readiness-reader.js +44 -0
- package/dist/runtime-v2/activation/promotion-readiness-reader.js.map +1 -0
- package/dist/runtime-v2/activation/rulecode-owner-decision-service.d.ts +104 -0
- package/dist/runtime-v2/activation/rulecode-owner-decision-service.d.ts.map +1 -0
- package/dist/runtime-v2/activation/rulecode-owner-decision-service.js +86 -0
- package/dist/runtime-v2/activation/rulecode-owner-decision-service.js.map +1 -0
- package/dist/runtime-v2/activation/rulecode-safety-circuit-breaker.d.ts +25 -0
- package/dist/runtime-v2/activation/rulecode-safety-circuit-breaker.d.ts.map +1 -0
- package/dist/runtime-v2/activation/rulecode-safety-circuit-breaker.js +23 -0
- package/dist/runtime-v2/activation/rulecode-safety-circuit-breaker.js.map +1 -0
- package/dist/runtime-v2/activation/rulecode-shadow-summary.d.ts +14 -0
- package/dist/runtime-v2/activation/rulecode-shadow-summary.d.ts.map +1 -0
- package/dist/runtime-v2/activation/rulecode-shadow-summary.js +57 -0
- package/dist/runtime-v2/activation/rulecode-shadow-summary.js.map +1 -0
- package/dist/runtime-v2/activation/sqlite-activation-safety-store.d.ts +40 -0
- package/dist/runtime-v2/activation/sqlite-activation-safety-store.d.ts.map +1 -0
- package/dist/runtime-v2/activation/sqlite-activation-safety-store.js +461 -0
- package/dist/runtime-v2/activation/sqlite-activation-safety-store.js.map +1 -0
- package/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts.map +1 -1
- package/dist/runtime-v2/activation/sqlite-activation-state-store.js +24 -6
- package/dist/runtime-v2/activation/sqlite-activation-state-store.js.map +1 -1
- package/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js +19 -4
- package/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js.map +1 -1
- package/dist/runtime-v2/activation/writers/rule-host-writer.d.ts.map +1 -1
- package/dist/runtime-v2/activation/writers/rule-host-writer.js +10 -0
- package/dist/runtime-v2/activation/writers/rule-host-writer.js.map +1 -1
- package/dist/runtime-v2/config/__tests__/pd-config-contract.test.js +13 -0
- package/dist/runtime-v2/config/__tests__/pd-config-contract.test.js.map +1 -1
- package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +15 -2
- package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
- package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js +2 -0
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +2 -2
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +1 -1
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/internalization/__tests__/legacy-rule-contract-scanner.test.js +20 -1
- package/dist/runtime-v2/internalization/__tests__/legacy-rule-contract-scanner.test.js.map +1 -1
- package/dist/runtime-v2/internalization/legacy-rule-contract-scanner.d.ts +4 -4
- package/dist/runtime-v2/internalization/legacy-rule-contract-scanner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/legacy-rule-contract-scanner.js +92 -5
- package/dist/runtime-v2/internalization/legacy-rule-contract-scanner.js.map +1 -1
- package/dist/runtime-v2/store/sqlite-connection-schema-version.test.js +11 -11
- package/dist/runtime-v2/store/sqlite-connection-schema-version.test.js.map +1 -1
- package/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
- package/dist/runtime-v2/store/sqlite-connection.js +111 -0
- package/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
function isRecord(value) {
|
|
2
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
3
|
+
}
|
|
4
|
+
function isNonEmptyString(value) {
|
|
5
|
+
return typeof value === 'string' && value.trim().length > 0;
|
|
6
|
+
}
|
|
7
|
+
function validateHostContract(value) {
|
|
8
|
+
if (!isRecord(value))
|
|
9
|
+
return null;
|
|
10
|
+
const { outOfBandControls } = value;
|
|
11
|
+
const { protectedCapabilities } = value;
|
|
12
|
+
const { neutralProbes } = value;
|
|
13
|
+
if (value.version !== 'openclaw-legacy@1'
|
|
14
|
+
|| value.supportsShadowEvidence !== true
|
|
15
|
+
|| !Array.isArray(outOfBandControls)
|
|
16
|
+
|| !Array.isArray(protectedCapabilities)
|
|
17
|
+
|| !Array.isArray(neutralProbes))
|
|
18
|
+
return null;
|
|
19
|
+
const requiredControls = ['activation_deactivate', 'global_rulecode_pause', 'owner_review_console'];
|
|
20
|
+
if (!requiredControls.every(control => outOfBandControls.includes(control)))
|
|
21
|
+
return null;
|
|
22
|
+
const protectedIds = new Set();
|
|
23
|
+
const protectedCapabilityList = [];
|
|
24
|
+
for (const capability of protectedCapabilities) {
|
|
25
|
+
if (!isRecord(capability) || !isNonEmptyString(capability.capabilityId)
|
|
26
|
+
|| !Array.isArray(capability.hostToolAliases)
|
|
27
|
+
|| !capability.hostToolAliases.every(isNonEmptyString))
|
|
28
|
+
return null;
|
|
29
|
+
// RUNTIME_CONTRACT: hostToolAliases elements validated individually above.
|
|
30
|
+
protectedCapabilityList.push({ capabilityId: capability.capabilityId, hostToolAliases: capability.hostToolAliases });
|
|
31
|
+
protectedIds.add(capability.capabilityId);
|
|
32
|
+
}
|
|
33
|
+
const requiredCapabilities = ['pd_status', 'rulecode_deactivate', 'rulecode_global_pause', 'owner_review_access'];
|
|
34
|
+
if (!requiredCapabilities.every(capability => protectedIds.has(capability)))
|
|
35
|
+
return null;
|
|
36
|
+
const neutralProbeList = [];
|
|
37
|
+
for (const probe of neutralProbes) {
|
|
38
|
+
if (!isRecord(probe) || !isNonEmptyString(probe.probeId)
|
|
39
|
+
|| !isNonEmptyString(probe.capabilityId) || !protectedIds.has(probe.capabilityId)
|
|
40
|
+
|| !isNonEmptyString(probe.toolName) || !isRecord(probe.params)
|
|
41
|
+
|| probe.expectedDecision !== 'allow')
|
|
42
|
+
return null;
|
|
43
|
+
neutralProbeList.push({
|
|
44
|
+
probeId: probe.probeId,
|
|
45
|
+
capabilityId: probe.capabilityId,
|
|
46
|
+
toolName: probe.toolName,
|
|
47
|
+
params: probe.params,
|
|
48
|
+
expectedDecision: 'allow',
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (!requiredCapabilities.every(capability => neutralProbeList.some(probe => probe.capabilityId === capability)))
|
|
52
|
+
return null;
|
|
53
|
+
return {
|
|
54
|
+
version: 'openclaw-legacy@1',
|
|
55
|
+
supportsShadowEvidence: true,
|
|
56
|
+
outOfBandControls: requiredControls,
|
|
57
|
+
protectedCapabilities: protectedCapabilityList,
|
|
58
|
+
neutralProbes: neutralProbeList,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function parseArtifactContent(artifact) {
|
|
62
|
+
try {
|
|
63
|
+
const parsed = JSON.parse(artifact.contentJson);
|
|
64
|
+
return isRecord(parsed) ? parsed : null;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function artifactWithNeutralProbes(artifact, contract) {
|
|
71
|
+
const content = parseArtifactContent(artifact);
|
|
72
|
+
if (!content || !isRecord(content.goldenTrace) || !Array.isArray(content.goldenTrace.cases))
|
|
73
|
+
return null;
|
|
74
|
+
const cases = contract.neutralProbes.map(probe => ({
|
|
75
|
+
caseId: `host-liveness:${probe.probeId}`,
|
|
76
|
+
kind: 'positive',
|
|
77
|
+
toolName: probe.toolName,
|
|
78
|
+
params: { ...probe.params },
|
|
79
|
+
expectedDecision: 'allow',
|
|
80
|
+
}));
|
|
81
|
+
const trace = {
|
|
82
|
+
traceId: `${String(content.goldenTrace.traceId)}:host-liveness`,
|
|
83
|
+
sourcePainId: String(content.goldenTrace.sourcePainId),
|
|
84
|
+
cases: [...content.goldenTrace.cases, ...cases],
|
|
85
|
+
createdAt: String(content.goldenTrace.createdAt),
|
|
86
|
+
version: 1,
|
|
87
|
+
};
|
|
88
|
+
return { ...artifact, contentJson: JSON.stringify({ ...content, goldenTrace: trace }) };
|
|
89
|
+
}
|
|
90
|
+
export async function collectOpenClawPromotionChecks(artifact, input) {
|
|
91
|
+
const content = parseArtifactContent(artifact);
|
|
92
|
+
const affectedTools = content && Array.isArray(content.affectedTools)
|
|
93
|
+
? content.affectedTools.filter(isNonEmptyString)
|
|
94
|
+
: [];
|
|
95
|
+
const bounded = affectedTools.length > 0
|
|
96
|
+
&& affectedTools.every(value => value !== '*' && value.toLowerCase() !== 'all');
|
|
97
|
+
const protectedCapabilityIds = new Set([
|
|
98
|
+
'pd_status', 'rulecode_deactivate', 'rulecode_global_pause', 'owner_review_access',
|
|
99
|
+
]);
|
|
100
|
+
const scopeAvoidsProtectedCapabilities = bounded
|
|
101
|
+
&& affectedTools.every(value => !protectedCapabilityIds.has(value));
|
|
102
|
+
const contract = validateHostContract(input.hostContract);
|
|
103
|
+
let probesPassed = false;
|
|
104
|
+
if (contract && scopeAvoidsProtectedCapabilities) {
|
|
105
|
+
probesPassed = true;
|
|
106
|
+
for (const candidate of [artifact, ...input.existingLiveArtifacts]) {
|
|
107
|
+
const withProbes = artifactWithNeutralProbes(candidate, contract);
|
|
108
|
+
if (!withProbes || !(await input.validateProductionArtifact(withProbes)).ok) {
|
|
109
|
+
probesPassed = false;
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const emergencyControlsHealthy = contract !== null && input.safetyControlsEnabled;
|
|
115
|
+
return [
|
|
116
|
+
{ checkId: 'bounded_scope', status: bounded ? 'passed' : 'failed', ...(!bounded ? { reasonCode: 'explicit_affected_tools_required' } : {}) },
|
|
117
|
+
{ checkId: 'runtime_compatibility', status: contract ? 'passed' : 'failed', ...(!contract ? { reasonCode: 'host_liveness_contract_missing_invalid_or_unsupported' } : {}) },
|
|
118
|
+
{ checkId: 'host_liveness_composition', status: probesPassed ? 'passed' : 'failed', ...(!probesPassed ? { reasonCode: 'neutral_probe_or_live_composition_failed' } : {}) },
|
|
119
|
+
{ checkId: 'emergency_controls', status: emergencyControlsHealthy ? 'passed' : 'failed', ...(!emergencyControlsHealthy ? { reasonCode: contract ? 'safety_controls_disabled' : 'out_of_band_controls_unavailable' } : {}) },
|
|
120
|
+
{ checkId: 'runtime_shadow_evidence', status: contract?.supportsShadowEvidence === true ? 'passed' : 'failed', ...(contract?.supportsShadowEvidence === true ? {} : { reasonCode: 'runtime_shadow_evidence_unsupported' }) },
|
|
121
|
+
{ checkId: 'owner_identity_configuration', status: input.ownerIdentityConfigured ? 'passed' : 'failed', ...(!input.ownerIdentityConfigured ? { reasonCode: 'configured_owner_missing' } : {}) },
|
|
122
|
+
];
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=openclaw-promotion-checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-promotion-checks.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/openclaw-promotion-checks.ts"],"names":[],"mappings":"AA4BA,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,EAAC,iBAAiB,EAAC,GAAG,KAAK,CAAC;IAClC,MAAM,EAAC,qBAAqB,EAAC,GAAG,KAAK,CAAC;IACtC,MAAM,EAAC,aAAa,EAAC,GAAG,KAAK,CAAC;IAC9B,IAAI,KAAK,CAAC,OAAO,KAAK,mBAAmB;WACpC,KAAK,CAAC,sBAAsB,KAAK,IAAI;WACrC,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC;WACjC,CAAC,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAC;WACrC,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,gBAAgB,GAAG,CAAC,uBAAuB,EAAE,uBAAuB,EAAE,sBAAsB,CAAU,CAAC;IAC7G,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACzF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,uBAAuB,GAA4D,EAAE,CAAC;IAC5F,KAAK,MAAM,UAAU,IAAI,qBAAqB,EAAE,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,YAAY,CAAC;eAClE,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC;eAC1C,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAAE,OAAO,IAAI,CAAC;QACtE,2EAA2E;QAC3E,uBAAuB,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,YAAY,EAAE,eAAe,EAAE,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;QACrH,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,oBAAoB,GAAG,CAAC,WAAW,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,qBAAqB,CAAU,CAAC;IAC3H,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACzF,MAAM,gBAAgB,GAAoD,EAAE,CAAC;IAC7E,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;eACnD,CAAC,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC;eAC9E,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;eAC5D,KAAK,CAAC,gBAAgB,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACrD,gBAAgB,CAAC,IAAI,CAAC;YACpB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,gBAAgB,EAAE,OAAO;SAC1B,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CACjE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,KAAK,UAAU,CAC3C,CAAC;QAAE,OAAO,IAAI,CAAC;IAChB,OAAO;QACL,OAAO,EAAE,mBAAmB;QAC5B,sBAAsB,EAAE,IAAI;QAC5B,iBAAiB,EAAE,gBAAgB;QACnC,qBAAqB,EAAE,uBAAuB;QAC9C,aAAa,EAAE,gBAAgB;KAChC,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,QAA4B;IACxD,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACzD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAChC,QAA4B,EAC5B,QAA8B;IAE9B,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzG,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,EAAE,iBAAiB,KAAK,CAAC,OAAO,EAAE;QACxC,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE;QAC3B,gBAAgB,EAAE,OAAO;KAC1B,CAAC,CAAC,CAAC;IACJ,MAAM,KAAK,GAAG;QACZ,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB;QAC/D,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC;QACtD,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC;QAC/C,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;QAChD,OAAO,EAAE,CAAC;KACX,CAAC;IACF,OAAO,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAC1F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,QAA4B,EAC5B,KAAkC;IAElC,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QACnE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAChD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC;WACnC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;IAClF,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;QACrC,WAAW,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,qBAAqB;KACnF,CAAC,CAAC;IACH,MAAM,gCAAgC,GAAG,OAAO;WAC3C,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAE1D,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,QAAQ,IAAI,gCAAgC,EAAE,CAAC;QACjD,YAAY,GAAG,IAAI,CAAC;QACpB,KAAK,MAAM,SAAS,IAAI,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACnE,MAAM,UAAU,GAAG,yBAAyB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAClE,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,0BAA0B,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC5E,YAAY,GAAG,KAAK,CAAC;gBACrB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,wBAAwB,GAAG,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,qBAAqB,CAAC;IAClF,OAAO;QACL,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,kCAAkC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;QAC5I,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,uDAAuD,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;QAC3K,EAAE,OAAO,EAAE,2BAA2B,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,0CAA0C,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;QAC1K,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;QAC3N,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,QAAQ,EAAE,sBAAsB,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,qCAAqC,EAAE,CAAC,EAAE;QAC5N,EAAE,OAAO,EAAE,8BAA8B,EAAE,MAAM,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;KAChM,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PromotionEvidenceSnapshot, PromotionReadinessResult } from './rulecode-owner-decision-service.js';
|
|
2
|
+
export declare const REQUIRED_PROMOTION_CHECK_IDS: readonly ['activation_eligibility', 'lineage_binding', 'bounded_scope', 'production_compile_load', 'golden_trace', 'runtime_compatibility', 'host_liveness_composition', 'emergency_controls', 'runtime_shadow_evidence', 'owner_identity_configuration'];
|
|
3
|
+
export type PromotionCheckId = typeof REQUIRED_PROMOTION_CHECK_IDS[number];
|
|
4
|
+
export interface PromotionReadinessCheck {
|
|
5
|
+
checkId: PromotionCheckId;
|
|
6
|
+
status: 'passed' | 'failed';
|
|
7
|
+
reasonCode?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface PromotionReadinessEvaluationInput {
|
|
10
|
+
evaluationId: string;
|
|
11
|
+
artifactId: string;
|
|
12
|
+
artifactDigest: string;
|
|
13
|
+
evidenceSnapshot: PromotionEvidenceSnapshot;
|
|
14
|
+
checks: readonly PromotionReadinessCheck[];
|
|
15
|
+
}
|
|
16
|
+
export declare function evaluateRuleCodePromotionReadiness(input: PromotionReadinessEvaluationInput): PromotionReadinessResult;
|
|
17
|
+
//# sourceMappingURL=promotion-readiness-evaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promotion-readiness-evaluator.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/promotion-readiness-evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAwB,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAEtI,eAAO,MAAM,4BAA4B,YACvC,wBAAwB,EAAE,iBAAiB,EAAE,eAAe,EAAE,yBAAyB,EACvF,cAAc,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,oBAAoB,EAC1F,yBAAyB,EAAE,8BAA8B,CACjD,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAC;AAC3E,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,WAAW,iCAAiC;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,yBAAyB,CAAC;IAC5C,MAAM,EAAE,SAAS,uBAAuB,EAAE,CAAC;CAC5C;AAED,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,iCAAiC,GAAG,wBAAwB,CA+CrH"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export const REQUIRED_PROMOTION_CHECK_IDS = [
|
|
2
|
+
'activation_eligibility', 'lineage_binding', 'bounded_scope', 'production_compile_load',
|
|
3
|
+
'golden_trace', 'runtime_compatibility', 'host_liveness_composition', 'emergency_controls',
|
|
4
|
+
'runtime_shadow_evidence', 'owner_identity_configuration',
|
|
5
|
+
];
|
|
6
|
+
export function evaluateRuleCodePromotionReadiness(input) {
|
|
7
|
+
const byId = new Map();
|
|
8
|
+
const duplicateIds = new Set();
|
|
9
|
+
for (const check of input.checks) {
|
|
10
|
+
if (byId.has(check.checkId))
|
|
11
|
+
duplicateIds.add(check.checkId);
|
|
12
|
+
byId.set(check.checkId, check);
|
|
13
|
+
}
|
|
14
|
+
const unavailable = [];
|
|
15
|
+
for (const checkId of REQUIRED_PROMOTION_CHECK_IDS) {
|
|
16
|
+
if (!byId.has(checkId))
|
|
17
|
+
unavailable.push({ checkId, reasonCode: 'required_check_missing' });
|
|
18
|
+
if (duplicateIds.has(checkId))
|
|
19
|
+
unavailable.push({ checkId, reasonCode: 'duplicate_check_result' });
|
|
20
|
+
}
|
|
21
|
+
if (input.evidenceSnapshot.artifactDigest !== input.artifactDigest) {
|
|
22
|
+
unavailable.push({ checkId: 'evidence_binding', reasonCode: 'artifact_digest_mismatch' });
|
|
23
|
+
}
|
|
24
|
+
const { shadowSummary } = input.evidenceSnapshot;
|
|
25
|
+
const safetyGateResults = REQUIRED_PROMOTION_CHECK_IDS.flatMap(checkId => {
|
|
26
|
+
const check = byId.get(checkId);
|
|
27
|
+
if (!check)
|
|
28
|
+
return [];
|
|
29
|
+
if (checkId === 'runtime_shadow_evidence' && shadowSummary.errors !== null && shadowSummary.errors > 0) {
|
|
30
|
+
return [{ checkId, status: 'failed', reasonCode: 'unresolved_shadow_unhealthy_evidence' }];
|
|
31
|
+
}
|
|
32
|
+
return [{ ...check }];
|
|
33
|
+
});
|
|
34
|
+
const evidenceSnapshot = { ...input.evidenceSnapshot, safetyGateResults };
|
|
35
|
+
if (unavailable.length > 0) {
|
|
36
|
+
return { status: 'unavailable', evaluationId: input.evaluationId, artifactId: input.artifactId,
|
|
37
|
+
artifactDigest: input.artifactDigest, evidenceSnapshot, failedChecks: unavailable };
|
|
38
|
+
}
|
|
39
|
+
const failedChecks = safetyGateResults
|
|
40
|
+
.filter(check => check.status === 'failed')
|
|
41
|
+
.map(check => ({ checkId: check.checkId, reasonCode: check.reasonCode ?? 'hard_check_failed' }));
|
|
42
|
+
const summary = evidenceSnapshot.shadowSummary;
|
|
43
|
+
const shadowAgeMs = summary.firstObservedAt === null
|
|
44
|
+
? null
|
|
45
|
+
: Date.parse(evidenceSnapshot.createdAt) - Date.parse(summary.firstObservedAt);
|
|
46
|
+
const insufficientEvidence = summary.observed === null || summary.observed < 20
|
|
47
|
+
|| summary.matched === null || summary.matched < 3
|
|
48
|
+
|| summary.neutralControl === null || summary.neutralControl < 1
|
|
49
|
+
|| shadowAgeMs === null || !Number.isFinite(shadowAgeMs) || shadowAgeMs < 24 * 60 * 60 * 1000;
|
|
50
|
+
return {
|
|
51
|
+
status: failedChecks.length > 0 ? 'blocked' : insufficientEvidence ? 'evidence_insufficient' : 'ready', evaluationId: input.evaluationId,
|
|
52
|
+
artifactId: input.artifactId, artifactDigest: input.artifactDigest, evidenceSnapshot, failedChecks,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=promotion-readiness-evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promotion-readiness-evaluator.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/promotion-readiness-evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ActivationStatusRecord, CanActivateResult, PIArtifactSnapshot } from './activation-types.js';
|
|
2
|
+
import type { OwnerPromotionRequest, PromotionEvidenceSnapshot, PromotionReadinessResult } from './rulecode-owner-decision-service.js';
|
|
3
|
+
import { type PromotionReadinessCheck } from './promotion-readiness-evaluator.js';
|
|
4
|
+
export interface PromotionReadinessReaderDeps {
|
|
5
|
+
listCodeToolHookActivations(): Promise<ActivationStatusRecord[]>;
|
|
6
|
+
getArtifactById(artifactId: string): Promise<PIArtifactSnapshot | null>;
|
|
7
|
+
computeArtifactDigest(artifact: PIArtifactSnapshot): string;
|
|
8
|
+
validateProductionArtifact(artifact: PIArtifactSnapshot): Promise<CanActivateResult>;
|
|
9
|
+
collectHostChecks(artifact: PIArtifactSnapshot): Promise<PromotionReadinessCheck[]>;
|
|
10
|
+
buildEvidenceSnapshot(checks: PromotionReadinessCheck[], artifact?: PIArtifactSnapshot): PromotionEvidenceSnapshot;
|
|
11
|
+
newEvaluationId(): string;
|
|
12
|
+
}
|
|
13
|
+
type ReadinessRequest = Pick<OwnerPromotionRequest, 'activationId' | 'expectedArtifactId' | 'expectedArtifactDigest'>;
|
|
14
|
+
export declare class PromotionReadinessReader {
|
|
15
|
+
private readonly deps;
|
|
16
|
+
constructor(deps: PromotionReadinessReaderDeps);
|
|
17
|
+
evaluate(request: ReadinessRequest): Promise<PromotionReadinessResult>;
|
|
18
|
+
private blocked;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=promotion-readiness-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promotion-readiness-reader.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/promotion-readiness-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3G,OAAO,KAAK,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AACvI,OAAO,EAAsC,KAAK,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAEtH,MAAM,WAAW,4BAA4B;IAC3C,2BAA2B,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACjE,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACxE,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAAC;IAC5D,0BAA0B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACrF,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC;IACpF,qBAAqB,CAAC,MAAM,EAAE,uBAAuB,EAAE,EAAE,QAAQ,CAAC,EAAE,kBAAkB,GAAG,yBAAyB,CAAC;IACnH,eAAe,IAAI,MAAM,CAAC;CAC3B;AAED,KAAK,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,EAAE,cAAc,GAAG,oBAAoB,GAAG,wBAAwB,CAAC,CAAC;AAEtH,qBAAa,wBAAwB;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,4BAA4B,EAAI;IAE7D,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAgC3E;IAED,OAAO,CAAC,OAAO;CAQhB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { evaluateRuleCodePromotionReadiness } from './promotion-readiness-evaluator.js';
|
|
2
|
+
export class PromotionReadinessReader {
|
|
3
|
+
deps;
|
|
4
|
+
constructor(deps) {
|
|
5
|
+
this.deps = deps;
|
|
6
|
+
}
|
|
7
|
+
async evaluate(request) {
|
|
8
|
+
const evaluationId = this.deps.newEvaluationId();
|
|
9
|
+
const matches = (await this.deps.listCodeToolHookActivations()).filter(record => record.activationId === request.activationId);
|
|
10
|
+
const activation = matches.length === 1 ? matches[0] : undefined;
|
|
11
|
+
if (!activation || activation.action !== 'code_tool_hook_shadow_activate' || activation.deactivatedAt !== null) {
|
|
12
|
+
return this.blocked(evaluationId, request, [{ checkId: 'activation_eligibility', status: 'failed', reasonCode: matches.length > 1 ? 'activation_not_unique' : 'active_shadow_activation_required' }]);
|
|
13
|
+
}
|
|
14
|
+
if (activation.artifactId !== request.expectedArtifactId) {
|
|
15
|
+
return this.blocked(evaluationId, request, [{ checkId: 'lineage_binding', status: 'failed', reasonCode: 'activation_artifact_mismatch' }]);
|
|
16
|
+
}
|
|
17
|
+
const artifact = await this.deps.getArtifactById(activation.artifactId);
|
|
18
|
+
if (!artifact) {
|
|
19
|
+
return this.blocked(evaluationId, request, [{ checkId: 'lineage_binding', status: 'failed', reasonCode: 'artifact_not_found' }]);
|
|
20
|
+
}
|
|
21
|
+
const artifactDigest = this.deps.computeArtifactDigest(artifact);
|
|
22
|
+
if (artifactDigest !== request.expectedArtifactDigest) {
|
|
23
|
+
return this.blocked(evaluationId, { ...request, expectedArtifactDigest: artifactDigest }, [{ checkId: 'lineage_binding', status: 'failed', reasonCode: 'artifact_digest_mismatch' }]);
|
|
24
|
+
}
|
|
25
|
+
const checks = [
|
|
26
|
+
{ checkId: 'activation_eligibility', status: 'passed' },
|
|
27
|
+
{ checkId: 'lineage_binding', status: artifact.sourceTaskId && artifact.lineageArtifactIds.length > 0 ? 'passed' : 'failed',
|
|
28
|
+
...(artifact.sourceTaskId && artifact.lineageArtifactIds.length > 0 ? {} : { reasonCode: 'artifact_lineage_missing' }) },
|
|
29
|
+
];
|
|
30
|
+
const gate = await this.deps.validateProductionArtifact(artifact);
|
|
31
|
+
checks.push({ checkId: 'production_compile_load', status: gate.ok ? 'passed' : 'failed', ...(!gate.ok ? { reasonCode: gate.reason } : {}) }, { checkId: 'golden_trace', status: gate.ok ? 'passed' : 'failed', ...(!gate.ok ? { reasonCode: gate.reason } : {}) }, ...await this.deps.collectHostChecks(artifact));
|
|
32
|
+
const evidenceSnapshot = this.deps.buildEvidenceSnapshot(checks, artifact);
|
|
33
|
+
return evaluateRuleCodePromotionReadiness({ evaluationId, artifactId: artifact.artifactId, artifactDigest, evidenceSnapshot, checks });
|
|
34
|
+
}
|
|
35
|
+
blocked(evaluationId, request, checks) {
|
|
36
|
+
const evidenceSnapshot = this.deps.buildEvidenceSnapshot(checks);
|
|
37
|
+
return {
|
|
38
|
+
status: 'blocked', evaluationId, artifactId: request.expectedArtifactId,
|
|
39
|
+
artifactDigest: request.expectedArtifactDigest, evidenceSnapshot,
|
|
40
|
+
failedChecks: checks.map(check => ({ checkId: check.checkId, reasonCode: check.reasonCode ?? 'hard_check_failed' })),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=promotion-readiness-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promotion-readiness-reader.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/promotion-readiness-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { ActivationDecisionRecord } from './activation-control-types.js';
|
|
2
|
+
export interface PromotionEvidenceSnapshot {
|
|
3
|
+
snapshotId: string;
|
|
4
|
+
snapshotDigest: string;
|
|
5
|
+
artifactDigest: string;
|
|
6
|
+
lineageRefs: string[];
|
|
7
|
+
hostRuntimeVersion: string;
|
|
8
|
+
safetyGateResults: {
|
|
9
|
+
checkId: string;
|
|
10
|
+
status: 'passed' | 'failed';
|
|
11
|
+
reasonCode?: string;
|
|
12
|
+
}[];
|
|
13
|
+
shadowSummary: {
|
|
14
|
+
observed: number | null;
|
|
15
|
+
matched: number | null;
|
|
16
|
+
wouldBlock: number | null;
|
|
17
|
+
wouldAllow: number | null;
|
|
18
|
+
requireApproval: number | null;
|
|
19
|
+
autoCorrect: number | null;
|
|
20
|
+
errors: number | null;
|
|
21
|
+
neutralControl: number | null;
|
|
22
|
+
firstObservedAt: string | null;
|
|
23
|
+
lastObservedAt: string | null;
|
|
24
|
+
};
|
|
25
|
+
configurationVersion: string;
|
|
26
|
+
redaction: {
|
|
27
|
+
version: string;
|
|
28
|
+
rawParametersStored: false;
|
|
29
|
+
};
|
|
30
|
+
createdAt: string;
|
|
31
|
+
}
|
|
32
|
+
export interface PromotionFailedCheck {
|
|
33
|
+
checkId: string;
|
|
34
|
+
reasonCode: string;
|
|
35
|
+
}
|
|
36
|
+
export interface PromotionReadinessResult {
|
|
37
|
+
status: 'ready' | 'evidence_insufficient' | 'blocked' | 'unavailable';
|
|
38
|
+
evaluationId: string;
|
|
39
|
+
artifactId: string;
|
|
40
|
+
artifactDigest: string;
|
|
41
|
+
evidenceSnapshot: PromotionEvidenceSnapshot;
|
|
42
|
+
failedChecks: PromotionFailedCheck[];
|
|
43
|
+
}
|
|
44
|
+
export interface OwnerPromotionActor {
|
|
45
|
+
principal: ActivationDecisionRecord['principal'];
|
|
46
|
+
authentication: ActivationDecisionRecord['authentication'];
|
|
47
|
+
operator?: ActivationDecisionRecord['operator'];
|
|
48
|
+
}
|
|
49
|
+
export interface OwnerPromotionRequest {
|
|
50
|
+
activationId: string;
|
|
51
|
+
expectedArtifactId: string;
|
|
52
|
+
expectedArtifactDigest: string;
|
|
53
|
+
expectedControlVersion: number;
|
|
54
|
+
idempotencyKey: string;
|
|
55
|
+
reasonCode: string;
|
|
56
|
+
note?: string;
|
|
57
|
+
confirmed: boolean;
|
|
58
|
+
dryRun?: boolean;
|
|
59
|
+
}
|
|
60
|
+
export interface PromotionCommitInput {
|
|
61
|
+
decision: ActivationDecisionRecord;
|
|
62
|
+
evidenceSnapshot: PromotionEvidenceSnapshot;
|
|
63
|
+
readinessEvaluationId: string;
|
|
64
|
+
evidenceSnapshotDigest: string;
|
|
65
|
+
expectedControlVersion: number;
|
|
66
|
+
idempotencyKey: string;
|
|
67
|
+
}
|
|
68
|
+
export type OwnerPromotionResult = {
|
|
69
|
+
ok: true;
|
|
70
|
+
decision: 'promoted';
|
|
71
|
+
activationId: string;
|
|
72
|
+
decisionId: string;
|
|
73
|
+
promotedAt: string;
|
|
74
|
+
} | {
|
|
75
|
+
ok: true;
|
|
76
|
+
decision: 'would_promote';
|
|
77
|
+
activationId: string;
|
|
78
|
+
readinessEvaluationId: string;
|
|
79
|
+
evidenceSnapshotDigest: string;
|
|
80
|
+
} | {
|
|
81
|
+
ok: false;
|
|
82
|
+
reasonCode: string;
|
|
83
|
+
summary: string;
|
|
84
|
+
failedChecks: PromotionFailedCheck[];
|
|
85
|
+
nextAction: string;
|
|
86
|
+
};
|
|
87
|
+
export interface RuleCodeOwnerDecisionServiceDeps {
|
|
88
|
+
ownerLiveDecisionEnabled(): boolean;
|
|
89
|
+
safetyControlsEnabled(): boolean;
|
|
90
|
+
evaluateReadiness(input: OwnerPromotionRequest): Promise<PromotionReadinessResult>;
|
|
91
|
+
commitPromotion(input: PromotionCommitInput): Promise<{
|
|
92
|
+
activationId: string;
|
|
93
|
+
decisionId: string;
|
|
94
|
+
promotedAt: string;
|
|
95
|
+
}>;
|
|
96
|
+
newDecisionId(): string;
|
|
97
|
+
now(): string;
|
|
98
|
+
}
|
|
99
|
+
export declare class RuleCodeOwnerDecisionService {
|
|
100
|
+
private readonly deps;
|
|
101
|
+
constructor(deps: RuleCodeOwnerDecisionServiceDeps);
|
|
102
|
+
promote(request: OwnerPromotionRequest, actor: OwnerPromotionActor): Promise<OwnerPromotionResult>;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=rulecode-owner-decision-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rulecode-owner-decision-service.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/rulecode-owner-decision-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
function refused(input) {
|
|
2
|
+
return { ok: false, ...input, failedChecks: input.failedChecks ?? [] };
|
|
3
|
+
}
|
|
4
|
+
export class RuleCodeOwnerDecisionService {
|
|
5
|
+
deps;
|
|
6
|
+
constructor(deps) {
|
|
7
|
+
this.deps = deps;
|
|
8
|
+
}
|
|
9
|
+
async promote(request, actor) {
|
|
10
|
+
if (!this.deps.ownerLiveDecisionEnabled()) {
|
|
11
|
+
return refused({ reasonCode: 'feature_not_enabled', summary: 'Owner live decisions are disabled.', nextAction: 'Enable rulecode_owner_live_decision after completing its rollout gate.' });
|
|
12
|
+
}
|
|
13
|
+
if (!this.deps.safetyControlsEnabled()) {
|
|
14
|
+
return refused({ reasonCode: 'safety_controls_unavailable', summary: 'Durable RuleCode safety controls are unavailable.', nextAction: 'Restore rulecode_safety_controls or disable code_tool_hook enforcement.' });
|
|
15
|
+
}
|
|
16
|
+
const authenticatedOwner = actor.principal.kind === 'configured_owner'
|
|
17
|
+
&& (actor.authentication.method === 'console_token' || actor.authentication.method === 'cli_owner_credential');
|
|
18
|
+
if (!authenticatedOwner) {
|
|
19
|
+
return refused({ reasonCode: 'owner_authentication_required', summary: 'Promotion requires the configured Owner credential.', nextAction: 'Authenticate as the configured Owner; local break-glass authority may only stop enforcement.' });
|
|
20
|
+
}
|
|
21
|
+
if (actor.authentication.method === 'cli_owner_credential' && (!request.note || request.note.trim().length === 0)) {
|
|
22
|
+
return refused({ reasonCode: 'cli_owner_note_required', summary: 'CLI promotion requires an Owner review note.', nextAction: 'Provide a concise --note explaining the live decision.' });
|
|
23
|
+
}
|
|
24
|
+
if (!request.confirmed && request.dryRun !== true) {
|
|
25
|
+
return refused({ reasonCode: 'confirmation_required', summary: 'Live enforcement was not confirmed.', nextAction: 'Refresh the review evidence and explicitly confirm promotion.' });
|
|
26
|
+
}
|
|
27
|
+
if (!request.activationId || !request.expectedArtifactId || !request.expectedArtifactDigest || !request.idempotencyKey || !request.reasonCode) {
|
|
28
|
+
return refused({ reasonCode: 'promotion_request_invalid', summary: 'Required promotion binding fields are missing.', nextAction: 'Refresh the Owner review and submit all optimistic preconditions.' });
|
|
29
|
+
}
|
|
30
|
+
const readiness = await this.deps.evaluateReadiness(request);
|
|
31
|
+
if (readiness.status === 'blocked' || readiness.status === 'unavailable') {
|
|
32
|
+
return refused({
|
|
33
|
+
reasonCode: readiness.status === 'blocked' ? 'promotion_safety_gate_blocked' : 'promotion_readiness_unavailable',
|
|
34
|
+
summary: readiness.status === 'blocked' ? 'One or more hard promotion checks failed.' : 'Promotion readiness could not be established.',
|
|
35
|
+
nextAction: 'Review the failed checks, repair them, and refresh the Owner review before retrying.',
|
|
36
|
+
failedChecks: readiness.failedChecks,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (readiness.artifactId !== request.expectedArtifactId || readiness.artifactDigest !== request.expectedArtifactDigest
|
|
40
|
+
|| readiness.evidenceSnapshot.artifactDigest !== readiness.artifactDigest) {
|
|
41
|
+
return refused({ reasonCode: 'promotion_snapshot_stale', summary: 'The activation artifact changed during review.', nextAction: 'Refresh the Owner review and evaluate the current artifact version.' });
|
|
42
|
+
}
|
|
43
|
+
if (readiness.status === 'evidence_insufficient') {
|
|
44
|
+
const allowedOverrideReasons = new Set(['rare_behavior', 'controlled_rollout', 'owner_accepts_limited_evidence']);
|
|
45
|
+
if (!allowedOverrideReasons.has(request.reasonCode)) {
|
|
46
|
+
return refused({ reasonCode: 'evidence_override_reason_required', summary: 'Evidence-insufficient promotion requires a predefined Owner reason.', nextAction: 'Choose rare_behavior, controlled_rollout, or owner_accepts_limited_evidence.' });
|
|
47
|
+
}
|
|
48
|
+
if (!request.note || request.note.trim().length === 0) {
|
|
49
|
+
return refused({ reasonCode: 'evidence_override_note_required', summary: 'Evidence-insufficient promotion requires an Owner note.', nextAction: 'Explain why promotion is acceptable despite insufficient evidence.' });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (request.dryRun === true) {
|
|
53
|
+
return {
|
|
54
|
+
ok: true, decision: 'would_promote', activationId: request.activationId,
|
|
55
|
+
readinessEvaluationId: readiness.evaluationId,
|
|
56
|
+
evidenceSnapshotDigest: readiness.evidenceSnapshot.snapshotDigest,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const decidedAt = this.deps.now();
|
|
60
|
+
const decision = {
|
|
61
|
+
decisionId: this.deps.newDecisionId(),
|
|
62
|
+
subject: {
|
|
63
|
+
kind: 'activation', activationId: request.activationId,
|
|
64
|
+
artifactId: readiness.artifactId, artifactDigest: readiness.artifactDigest,
|
|
65
|
+
},
|
|
66
|
+
decision: 'promote_live',
|
|
67
|
+
principal: actor.principal,
|
|
68
|
+
authentication: actor.authentication,
|
|
69
|
+
operator: actor.operator,
|
|
70
|
+
reasonCode: request.reasonCode,
|
|
71
|
+
note: request.note?.trim() || null,
|
|
72
|
+
evidenceSnapshotId: readiness.evidenceSnapshot.snapshotId,
|
|
73
|
+
decidedAt,
|
|
74
|
+
};
|
|
75
|
+
const committed = await this.deps.commitPromotion({
|
|
76
|
+
decision,
|
|
77
|
+
evidenceSnapshot: readiness.evidenceSnapshot,
|
|
78
|
+
readinessEvaluationId: readiness.evaluationId,
|
|
79
|
+
evidenceSnapshotDigest: readiness.evidenceSnapshot.snapshotDigest,
|
|
80
|
+
expectedControlVersion: request.expectedControlVersion,
|
|
81
|
+
idempotencyKey: request.idempotencyKey,
|
|
82
|
+
});
|
|
83
|
+
return { ok: true, decision: 'promoted', ...committed };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=rulecode-owner-decision-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rulecode-owner-decision-service.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/rulecode-owner-decision-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface RuleCodeSafetySample {
|
|
2
|
+
toolName: string;
|
|
3
|
+
decision: 'allow' | 'block' | 'requireApproval' | 'auto_correct' | 'error';
|
|
4
|
+
outsideApprovedScope: boolean;
|
|
5
|
+
protectedCapabilityMatched?: boolean;
|
|
6
|
+
neutralProbeFailed?: boolean;
|
|
7
|
+
healthFailure?: 'load' | 'compatibility' | 'context' | 'invalid_result' | 'timeout' | 'exception';
|
|
8
|
+
}
|
|
9
|
+
export interface RuleCodeSafetyCircuitState {
|
|
10
|
+
consecutiveErrors: number;
|
|
11
|
+
consecutiveBlocks: {
|
|
12
|
+
toolName: string;
|
|
13
|
+
}[];
|
|
14
|
+
latestEligible: {
|
|
15
|
+
blocked: boolean;
|
|
16
|
+
outsideApprovedScope: boolean;
|
|
17
|
+
}[];
|
|
18
|
+
}
|
|
19
|
+
export type RuleCodeSafetyTripReason = 'protected_capability_matched' | 'host_liveness_probe_failed' | 'runtime_health_failure' | 'three_consecutive_errors' | 'broad_consecutive_blocking' | 'outside_scope_block_ratio';
|
|
20
|
+
export declare function initialRuleCodeSafetyCircuitState(): RuleCodeSafetyCircuitState;
|
|
21
|
+
export declare function evaluateRuleCodeSafetyCircuit(state: RuleCodeSafetyCircuitState, sample: RuleCodeSafetySample): {
|
|
22
|
+
state: RuleCodeSafetyCircuitState;
|
|
23
|
+
trip: RuleCodeSafetyTripReason | null;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=rulecode-safety-circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rulecode-safety-circuit-breaker.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/rulecode-safety-circuit-breaker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,GAAG,OAAO,GAAG,iBAAiB,GAAG,cAAc,GAAG,OAAO,CAAC;IAC3E,oBAAoB,EAAE,OAAO,CAAC;IAC9B,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,GAAG,WAAW,CAAC;CACnG;AAED,MAAM,WAAW,0BAA0B;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,cAAc,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,oBAAoB,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;CACvE;AAED,MAAM,MAAM,wBAAwB,GAAG,8BAA8B,GAAG,4BAA4B,GAAG,wBAAwB,GAAG,0BAA0B,GAAG,4BAA4B,GAAG,2BAA2B,CAAC;AAE1N,wBAAgB,iCAAiC,IAAI,0BAA0B,CAE9E;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,0BAA0B,EAAE,MAAM,EAAE,oBAAoB,GAAG;IAAE,KAAK,EAAE,0BAA0B,CAAC;IAAC,IAAI,EAAE,wBAAwB,GAAG,IAAI,CAAA;CAAE,CAY3L"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function initialRuleCodeSafetyCircuitState() {
|
|
2
|
+
return { consecutiveErrors: 0, consecutiveBlocks: [], latestEligible: [] };
|
|
3
|
+
}
|
|
4
|
+
export function evaluateRuleCodeSafetyCircuit(state, sample) {
|
|
5
|
+
if (sample.protectedCapabilityMatched)
|
|
6
|
+
return { state, trip: 'protected_capability_matched' };
|
|
7
|
+
if (sample.neutralProbeFailed)
|
|
8
|
+
return { state, trip: 'host_liveness_probe_failed' };
|
|
9
|
+
if (sample.healthFailure)
|
|
10
|
+
return { state, trip: 'runtime_health_failure' };
|
|
11
|
+
const consecutiveErrors = sample.decision === 'error' ? state.consecutiveErrors + 1 : 0;
|
|
12
|
+
const consecutiveBlocks = sample.decision === 'block' ? [...state.consecutiveBlocks, { toolName: sample.toolName }].slice(-5) : [];
|
|
13
|
+
const latestEligible = [...state.latestEligible, { blocked: sample.decision === 'block', outsideApprovedScope: sample.outsideApprovedScope }].slice(-20);
|
|
14
|
+
const next = { consecutiveErrors, consecutiveBlocks, latestEligible };
|
|
15
|
+
if (consecutiveErrors >= 3)
|
|
16
|
+
return { state: next, trip: 'three_consecutive_errors' };
|
|
17
|
+
if (consecutiveBlocks.length >= 5 && new Set(consecutiveBlocks.map(value => value.toolName)).size >= 3)
|
|
18
|
+
return { state: next, trip: 'broad_consecutive_blocking' };
|
|
19
|
+
if (latestEligible.length === 20 && latestEligible.filter(value => value.blocked && value.outsideApprovedScope).length / 20 > 0.8)
|
|
20
|
+
return { state: next, trip: 'outside_scope_block_ratio' };
|
|
21
|
+
return { state: next, trip: null };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=rulecode-safety-circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rulecode-safety-circuit-breaker.js","sourceRoot":"","sources":["../../../src/runtime-v2/activation/rulecode-safety-circuit-breaker.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,iCAAiC;IAC/C,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAiC,EAAE,MAA4B;IAC3G,IAAI,MAAM,CAAC,0BAA0B;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC;IAC9F,IAAI,MAAM,CAAC,kBAAkB;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;IACpF,IAAI,MAAM,CAAC,aAAa;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;IAC3E,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnI,MAAM,cAAc,GAAG,CAAC,GAAG,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACzJ,MAAM,IAAI,GAAG,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC;IACtE,IAAI,iBAAiB,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;IACrF,IAAI,iBAAiB,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;IACnK,IAAI,cAAc,CAAC,MAAM,KAAK,EAAE,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,MAAM,GAAG,EAAE,GAAG,GAAG;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC;IAC7L,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface RuleCodeShadowSummary {
|
|
2
|
+
observed: number;
|
|
3
|
+
matched: number;
|
|
4
|
+
wouldBlock: number;
|
|
5
|
+
wouldAllow: number;
|
|
6
|
+
requireApproval: number;
|
|
7
|
+
autoCorrect: number;
|
|
8
|
+
errors: number;
|
|
9
|
+
neutralControl: number;
|
|
10
|
+
firstObservedAt: string | null;
|
|
11
|
+
lastObservedAt: string | null;
|
|
12
|
+
}
|
|
13
|
+
export declare function summarizeRuleCodeShadowEvents(entries: readonly unknown[], activationId: string): RuleCodeShadowSummary;
|
|
14
|
+
//# sourceMappingURL=rulecode-shadow-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rulecode-shadow-summary.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/activation/rulecode-shadow-summary.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAGD,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,qBAAqB,CA2CtH"}
|