create-principles-disciple 1.91.0 → 1.93.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 (263) hide show
  1. package/README.md +1 -1
  2. package/console/dist/server/config/AuthConfig.js +6 -0
  3. package/console/dist/server/index.js +31 -16
  4. package/console/dist/server/models/ApprovalsGroupedConsoleModel.js +6 -3
  5. package/console/dist/server/models/ConsoleLifecycleDatasource.js +1 -1
  6. package/console/dist/server/routes/activations.js +4 -0
  7. package/console/dist/server/routes/approvals.js +24 -4
  8. package/console/dist/server/routes/feedback-reports.js +7 -5
  9. package/console/dist/server/routes/lifecycle.js +6 -1
  10. package/console/dist/server/routes/principles.js +10 -2
  11. package/console/dist/server/routes/workspaces.js +4 -0
  12. package/console/dist/ui/components/ui/charts.js +4 -1
  13. package/console/dist/ui/components/ui/markdown.js +9 -5
  14. package/console/dist/ui/i18n/en.json +1 -2
  15. package/console/dist/ui/i18n/zh-CN.json +1 -2
  16. package/console/dist/ui/utils/enum-labels.js +4 -2
  17. package/console/dist/web/assets/app.js +8 -8
  18. package/core/dist/index.d.ts +0 -1
  19. package/core/dist/index.d.ts.map +1 -1
  20. package/core/dist/index.js +0 -2
  21. package/core/dist/index.js.map +1 -1
  22. package/core/dist/pain-signal.d.ts +11 -71
  23. package/core/dist/pain-signal.d.ts.map +1 -1
  24. package/core/dist/pain-signal.js +10 -120
  25. package/core/dist/pain-signal.js.map +1 -1
  26. package/core/dist/principle-tree-ledger.d.ts +4 -87
  27. package/core/dist/principle-tree-ledger.d.ts.map +1 -1
  28. package/core/dist/principle-tree-ledger.js +51 -148
  29. package/core/dist/principle-tree-ledger.js.map +1 -1
  30. package/core/dist/runtime-v2/__tests__/activation-types-helpers.test.js +6 -14
  31. package/core/dist/runtime-v2/__tests__/activation-types-helpers.test.js.map +1 -1
  32. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +180 -70
  33. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  34. package/core/dist/runtime-v2/__tests__/barrel-io-cleanup.test.d.ts +12 -0
  35. package/core/dist/runtime-v2/__tests__/barrel-io-cleanup.test.d.ts.map +1 -0
  36. package/core/dist/runtime-v2/__tests__/barrel-io-cleanup.test.js +46 -0
  37. package/core/dist/runtime-v2/__tests__/barrel-io-cleanup.test.js.map +1 -0
  38. package/core/dist/runtime-v2/__tests__/intake-to-internalization-bridge.test.js +1 -2
  39. package/core/dist/runtime-v2/__tests__/intake-to-internalization-bridge.test.js.map +1 -1
  40. package/core/dist/runtime-v2/__tests__/internalization-orchestrator.test.js +8 -8
  41. package/core/dist/runtime-v2/__tests__/internalization-orchestrator.test.js.map +1 -1
  42. package/core/dist/runtime-v2/__tests__/internalization-peer-runner-contracts.test.js +45 -80
  43. package/core/dist/runtime-v2/__tests__/internalization-peer-runner-contracts.test.js.map +1 -1
  44. package/core/dist/runtime-v2/__tests__/internalization-state-machine.test.js +31 -130
  45. package/core/dist/runtime-v2/__tests__/internalization-state-machine.test.js.map +1 -1
  46. package/core/dist/runtime-v2/__tests__/io-deletion.test.d.ts +12 -0
  47. package/core/dist/runtime-v2/__tests__/io-deletion.test.d.ts.map +1 -0
  48. package/core/dist/runtime-v2/__tests__/io-deletion.test.js +92 -0
  49. package/core/dist/runtime-v2/__tests__/io-deletion.test.js.map +1 -0
  50. package/core/dist/runtime-v2/__tests__/ledger-codec.test.d.ts +2 -0
  51. package/core/dist/runtime-v2/__tests__/ledger-codec.test.d.ts.map +1 -0
  52. package/core/dist/runtime-v2/__tests__/ledger-codec.test.js +429 -0
  53. package/core/dist/runtime-v2/__tests__/ledger-codec.test.js.map +1 -0
  54. package/core/dist/runtime-v2/__tests__/ledger-store.test.d.ts +2 -0
  55. package/core/dist/runtime-v2/__tests__/ledger-store.test.d.ts.map +1 -0
  56. package/core/dist/runtime-v2/__tests__/ledger-store.test.js +65 -0
  57. package/core/dist/runtime-v2/__tests__/ledger-store.test.js.map +1 -0
  58. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js +146 -0
  59. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
  60. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.d.ts +2 -0
  61. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.d.ts.map +1 -0
  62. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.js +150 -0
  63. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.js.map +1 -0
  64. package/core/dist/runtime-v2/__tests__/pain-to-principle-service.test.js +0 -1
  65. package/core/dist/runtime-v2/__tests__/pain-to-principle-service.test.js.map +1 -1
  66. package/core/dist/runtime-v2/__tests__/pitask-metadata.test.js +4 -4
  67. package/core/dist/runtime-v2/__tests__/pitask-metadata.test.js.map +1 -1
  68. package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js +2 -5
  69. package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js.map +1 -1
  70. package/core/dist/runtime-v2/__tests__/story-a-demo.test.js +2 -2
  71. package/core/dist/runtime-v2/__tests__/story-a-demo.test.js.map +1 -1
  72. package/core/dist/runtime-v2/activation/__tests__/activation-dispatcher.test.js +7 -10
  73. package/core/dist/runtime-v2/activation/__tests__/activation-dispatcher.test.js.map +1 -1
  74. package/core/dist/runtime-v2/activation/__tests__/approval-queue.test.js +1 -3
  75. package/core/dist/runtime-v2/activation/__tests__/approval-queue.test.js.map +1 -1
  76. package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js +4 -4
  77. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js +6 -6
  78. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js.map +1 -1
  79. package/core/dist/runtime-v2/activation/activation-dispatcher.d.ts.map +1 -1
  80. package/core/dist/runtime-v2/activation/activation-dispatcher.js +0 -1
  81. package/core/dist/runtime-v2/activation/activation-dispatcher.js.map +1 -1
  82. package/core/dist/runtime-v2/activation/activation-types.d.ts.map +1 -1
  83. package/core/dist/runtime-v2/activation/activation-types.js +0 -1
  84. package/core/dist/runtime-v2/activation/activation-types.js.map +1 -1
  85. package/core/dist/runtime-v2/adapter/__tests__/test-double-runtime-adapter.test.js +199 -0
  86. package/core/dist/runtime-v2/adapter/__tests__/test-double-runtime-adapter.test.js.map +1 -1
  87. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts.map +1 -1
  88. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js +0 -2
  89. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js.map +1 -1
  90. package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js +0 -7
  91. package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js.map +1 -1
  92. package/core/dist/runtime-v2/config/__tests__/pd-config-contract.test.js +5 -6
  93. package/core/dist/runtime-v2/config/__tests__/pd-config-contract.test.js.map +1 -1
  94. package/core/dist/runtime-v2/config/__tests__/pd-config-redaction-deep.test.js +0 -1
  95. package/core/dist/runtime-v2/config/__tests__/pd-config-redaction-deep.test.js.map +1 -1
  96. package/core/dist/runtime-v2/config/__tests__/pd-config-validation-edge-cases.test.js +0 -1
  97. package/core/dist/runtime-v2/config/__tests__/pd-config-validation-edge-cases.test.js.map +1 -1
  98. package/core/dist/runtime-v2/config/pd-config-defaults.d.ts.map +1 -1
  99. package/core/dist/runtime-v2/config/pd-config-defaults.js +0 -1
  100. package/core/dist/runtime-v2/config/pd-config-defaults.js.map +1 -1
  101. package/core/dist/runtime-v2/config/pd-config-types.d.ts +1 -1
  102. package/core/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -1
  103. package/core/dist/runtime-v2/config/pd-config-types.js +0 -1
  104. package/core/dist/runtime-v2/config/pd-config-types.js.map +1 -1
  105. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js +156 -0
  106. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js.map +1 -1
  107. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  108. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +0 -2
  109. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  110. package/core/dist/runtime-v2/index.d.ts +2 -9
  111. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  112. package/core/dist/runtime-v2/index.js +5 -6
  113. package/core/dist/runtime-v2/index.js.map +1 -1
  114. package/core/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js +0 -3
  115. package/core/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js.map +1 -1
  116. package/core/dist/runtime-v2/internalization/__tests__/internalization-job-graph.test.js +4 -36
  117. package/core/dist/runtime-v2/internalization/__tests__/internalization-job-graph.test.js.map +1 -1
  118. package/core/dist/runtime-v2/internalization/__tests__/peer-runner-lineage-injection.test.js +0 -1
  119. package/core/dist/runtime-v2/internalization/__tests__/peer-runner-lineage-injection.test.js.map +1 -1
  120. package/core/dist/runtime-v2/internalization/__tests__/queue-actionability.test.js +0 -15
  121. package/core/dist/runtime-v2/internalization/__tests__/queue-actionability.test.js.map +1 -1
  122. package/core/dist/runtime-v2/internalization/index.d.ts +1 -7
  123. package/core/dist/runtime-v2/internalization/index.d.ts.map +1 -1
  124. package/core/dist/runtime-v2/internalization/index.js +1 -4
  125. package/core/dist/runtime-v2/internalization/index.js.map +1 -1
  126. package/core/dist/runtime-v2/internalization/internalization-job-graph.d.ts +7 -18
  127. package/core/dist/runtime-v2/internalization/internalization-job-graph.d.ts.map +1 -1
  128. package/core/dist/runtime-v2/internalization/internalization-job-graph.js +7 -24
  129. package/core/dist/runtime-v2/internalization/internalization-job-graph.js.map +1 -1
  130. package/core/dist/runtime-v2/internalization/internalization-state-machine.d.ts +3 -2
  131. package/core/dist/runtime-v2/internalization/internalization-state-machine.d.ts.map +1 -1
  132. package/core/dist/runtime-v2/internalization/internalization-state-machine.js +4 -3
  133. package/core/dist/runtime-v2/internalization/internalization-state-machine.js.map +1 -1
  134. package/core/dist/runtime-v2/internalization/peer-runner-contracts.d.ts +6 -6
  135. package/core/dist/runtime-v2/internalization/peer-runner-contracts.d.ts.map +1 -1
  136. package/core/dist/runtime-v2/internalization/peer-runner-contracts.js +0 -3
  137. package/core/dist/runtime-v2/internalization/peer-runner-contracts.js.map +1 -1
  138. package/core/dist/runtime-v2/principle-tree/ledger-codec.d.ts +30 -0
  139. package/core/dist/runtime-v2/principle-tree/ledger-codec.d.ts.map +1 -0
  140. package/core/dist/runtime-v2/principle-tree/ledger-codec.js +154 -0
  141. package/core/dist/runtime-v2/principle-tree/ledger-codec.js.map +1 -0
  142. package/core/dist/runtime-v2/recovery-sweep-service.d.ts.map +1 -1
  143. package/core/dist/runtime-v2/recovery-sweep-service.js +2 -2
  144. package/core/dist/runtime-v2/recovery-sweep-service.js.map +1 -1
  145. package/core/dist/runtime-v2/store/candidate/__tests__/recommendation-kind-resolver.test.js +1 -1
  146. package/core/dist/runtime-v2/store/candidate/__tests__/recommendation-kind-resolver.test.js.map +1 -1
  147. package/core/dist/runtime-v2/types/index.d.ts +2 -0
  148. package/core/dist/runtime-v2/types/index.d.ts.map +1 -1
  149. package/core/dist/runtime-v2/types/index.js +1 -0
  150. package/core/dist/runtime-v2/types/index.js.map +1 -1
  151. package/core/dist/runtime-v2/types/ledger-store.d.ts +101 -0
  152. package/core/dist/runtime-v2/types/ledger-store.d.ts.map +1 -0
  153. package/core/dist/runtime-v2/types/ledger-store.js +15 -0
  154. package/core/dist/runtime-v2/types/ledger-store.js.map +1 -0
  155. package/core/dist/runtime-v2/types/pain-signal.d.ts +5 -3
  156. package/core/dist/runtime-v2/types/pain-signal.d.ts.map +1 -1
  157. package/core/dist/runtime-v2/types/pain-signal.js +23 -3
  158. package/core/dist/runtime-v2/types/pain-signal.js.map +1 -1
  159. package/core/package.json +3 -3
  160. package/dist/installer.d.ts.map +1 -1
  161. package/dist/installer.js +42 -5
  162. package/dist/installer.js.map +1 -1
  163. package/dist/mvp-config.d.ts +1 -1
  164. package/dist/mvp-config.d.ts.map +1 -1
  165. package/dist/mvp-config.js +4 -8
  166. package/dist/mvp-config.js.map +1 -1
  167. package/dist/utils/env.d.ts.map +1 -1
  168. package/dist/utils/env.js +10 -4
  169. package/dist/utils/env.js.map +1 -1
  170. package/package.json +1 -1
  171. package/pd-cli/dist/commands/__tests__/legacy-cleanup.test.js +11 -3
  172. package/pd-cli/dist/commands/__tests__/legacy-cleanup.test.js.map +1 -1
  173. package/pd-cli/dist/commands/build-trajectory-evidence.d.ts.map +1 -1
  174. package/pd-cli/dist/commands/build-trajectory-evidence.js +11 -5
  175. package/pd-cli/dist/commands/build-trajectory-evidence.js.map +1 -1
  176. package/pd-cli/dist/commands/candidate.d.ts.map +1 -1
  177. package/pd-cli/dist/commands/candidate.js +2 -1
  178. package/pd-cli/dist/commands/candidate.js.map +1 -1
  179. package/pd-cli/dist/commands/health.d.ts.map +1 -1
  180. package/pd-cli/dist/commands/health.js +2 -1
  181. package/pd-cli/dist/commands/health.js.map +1 -1
  182. package/pd-cli/dist/commands/runtime-activation.js.map +1 -1
  183. package/pd-cli/dist/commands/runtime-internalization-integrity.d.ts.map +1 -1
  184. package/pd-cli/dist/commands/runtime-internalization-integrity.js +3 -1
  185. package/pd-cli/dist/commands/runtime-internalization-integrity.js.map +1 -1
  186. package/pd-cli/dist/commands/runtime-internalization-run-once.d.ts.map +1 -1
  187. package/pd-cli/dist/commands/runtime-internalization-run-once.js +3 -61
  188. package/pd-cli/dist/commands/runtime-internalization-run-once.js.map +1 -1
  189. package/pd-cli/dist/commands/runtime-uat.d.ts.map +1 -1
  190. package/pd-cli/dist/commands/runtime-uat.js +4 -1
  191. package/pd-cli/dist/commands/runtime-uat.js.map +1 -1
  192. package/pd-cli/dist/legacy/session-history-import.js +7 -5
  193. package/pd-cli/dist/legacy/session-history-import.js.map +1 -1
  194. package/pd-cli/dist/services/__tests__/runtime-adapter-resolver.test.js +13 -2
  195. package/pd-cli/dist/services/__tests__/runtime-adapter-resolver.test.js.map +1 -1
  196. package/pd-cli/dist/services/pain-flood-simulation-runner.d.ts.map +1 -1
  197. package/pd-cli/dist/services/pain-flood-simulation-runner.js +6 -2
  198. package/pd-cli/dist/services/pain-flood-simulation-runner.js.map +1 -1
  199. package/pd-cli/dist/services/runtime-adapter-resolver.d.ts.map +1 -1
  200. package/pd-cli/dist/services/runtime-adapter-resolver.js +6 -4
  201. package/pd-cli/dist/services/runtime-adapter-resolver.js.map +1 -1
  202. package/plugin/dist/commands/capabilities.js +3 -2
  203. package/plugin/dist/commands/disable-impl.js +1 -1
  204. package/plugin/dist/commands/focus.js +10 -2
  205. package/plugin/dist/commands/rollback-impl.js +1 -1
  206. package/plugin/dist/commands/thinking-os.js +5 -1
  207. package/plugin/dist/core/correction-cue-learner.js +2 -0
  208. package/plugin/dist/core/event-log.js +17 -10
  209. package/plugin/dist/core/focus-history.js +1 -1
  210. package/plugin/dist/core/hygiene/tracker.js +3 -3
  211. package/plugin/dist/core/principle-compiler/compiler.js +2 -0
  212. package/plugin/dist/core/replay-engine.js +1 -1
  213. package/plugin/dist/core/rule-host.js +3 -1
  214. package/plugin/dist/core/schema/schema-definitions.js +3 -0
  215. package/plugin/dist/core/thinking-os-parser.js +13 -4
  216. package/plugin/dist/core/trajectory-types.d.ts +5 -0
  217. package/plugin/dist/core/trajectory.d.ts +1 -0
  218. package/plugin/dist/core/trajectory.js +29 -8
  219. package/plugin/dist/hooks/after-tool-call-helpers.d.ts +5 -0
  220. package/plugin/dist/hooks/after-tool-call-helpers.js +64 -0
  221. package/plugin/dist/hooks/llm.d.ts +8 -0
  222. package/plugin/dist/hooks/llm.js +30 -0
  223. package/plugin/dist/hooks/trajectory-collector.d.ts +20 -4
  224. package/plugin/dist/hooks/trajectory-collector.js +95 -156
  225. package/plugin/dist/hooks/trajectory-evidence.js +6 -2
  226. package/plugin/dist/index.js +7 -2
  227. package/plugin/dist/openclaw-sdk.d.ts +5 -1
  228. package/plugin/dist/service/evolution-worker.js +7 -3
  229. package/plugin/dist/service/internalization-auto-consumer-service.js +2 -1
  230. package/plugin/dist/service/runtime-summary-service.js +8 -1
  231. package/plugin/dist/service/workflow-watchdog.js +2 -1
  232. package/plugin/dist/utils/retry.js +7 -2
  233. package/plugin/dist/utils/session-key.js +4 -1
  234. package/core/dist/io.d.ts +0 -35
  235. package/core/dist/io.d.ts.map +0 -1
  236. package/core/dist/io.js +0 -95
  237. package/core/dist/io.js.map +0 -1
  238. package/core/dist/runtime-v2/__tests__/trainer-output-validator.test.d.ts +0 -2
  239. package/core/dist/runtime-v2/__tests__/trainer-output-validator.test.d.ts.map +0 -1
  240. package/core/dist/runtime-v2/__tests__/trainer-output-validator.test.js +0 -257
  241. package/core/dist/runtime-v2/__tests__/trainer-output-validator.test.js.map +0 -1
  242. package/core/dist/runtime-v2/__tests__/trainer-runner-vslice.test.d.ts +0 -2
  243. package/core/dist/runtime-v2/__tests__/trainer-runner-vslice.test.d.ts.map +0 -1
  244. package/core/dist/runtime-v2/__tests__/trainer-runner-vslice.test.js +0 -514
  245. package/core/dist/runtime-v2/__tests__/trainer-runner-vslice.test.js.map +0 -1
  246. package/core/dist/runtime-v2/internalization/__tests__/trainer-prompt-builder.test.d.ts +0 -2
  247. package/core/dist/runtime-v2/internalization/__tests__/trainer-prompt-builder.test.d.ts.map +0 -1
  248. package/core/dist/runtime-v2/internalization/__tests__/trainer-prompt-builder.test.js +0 -141
  249. package/core/dist/runtime-v2/internalization/__tests__/trainer-prompt-builder.test.js.map +0 -1
  250. package/core/dist/runtime-v2/internalization/trainer-output.d.ts +0 -122
  251. package/core/dist/runtime-v2/internalization/trainer-output.d.ts.map +0 -1
  252. package/core/dist/runtime-v2/internalization/trainer-output.js +0 -223
  253. package/core/dist/runtime-v2/internalization/trainer-output.js.map +0 -1
  254. package/core/dist/runtime-v2/internalization/trainer-prompt-builder.d.ts +0 -24
  255. package/core/dist/runtime-v2/internalization/trainer-prompt-builder.d.ts.map +0 -1
  256. package/core/dist/runtime-v2/internalization/trainer-prompt-builder.js +0 -57
  257. package/core/dist/runtime-v2/internalization/trainer-prompt-builder.js.map +0 -1
  258. package/core/dist/runtime-v2/internalization/trainer-runner.d.ts +0 -76
  259. package/core/dist/runtime-v2/internalization/trainer-runner.d.ts.map +0 -1
  260. package/core/dist/runtime-v2/internalization/trainer-runner.js +0 -540
  261. package/core/dist/runtime-v2/internalization/trainer-runner.js.map +0 -1
  262. package/plugin/dist/core/external-training-contract.d.ts +0 -276
  263. package/plugin/dist/core/external-training-contract.js +0 -269
@@ -0,0 +1,429 @@
1
+ /**
2
+ * PRI-443: Ledger codec — pure parse/serialize functions, zero I/O.
3
+ *
4
+ * Tests verify:
5
+ * 1. parseHybridLedger correctly parses a valid ledger JSON
6
+ * 2. parseHybridLedger handles missing/malformed data gracefully
7
+ * 3. serializeLedger produces correct JSON output
8
+ * 4. createEmptyTree returns a valid empty tree
9
+ * 5. The module has zero fs/path imports
10
+ */
11
+ import { describe, it, expect } from 'vitest';
12
+ import { readFileSync } from 'node:fs';
13
+ import { resolve } from 'node:path';
14
+ import { parseHybridLedger, serializeLedger, createEmptyTree, isRecord, stringArray, clampFloat, clampInt, uniqueStrings, } from '../principle-tree/ledger-codec.js';
15
+ describe('PRI-443: ledger-codec.ts pure parse/serialize module', () => {
16
+ it('createEmptyTree returns valid empty tree', () => {
17
+ const tree = createEmptyTree();
18
+ expect(tree.principles).toEqual({});
19
+ expect(tree.rules).toEqual({});
20
+ expect(tree.implementations).toEqual({});
21
+ expect(tree.metrics).toEqual({});
22
+ expect(tree.lastUpdated).toBe(new Date(0).toISOString());
23
+ });
24
+ it('parseHybridLedger parses valid hybrid ledger', () => {
25
+ const raw = {
26
+ trainingStore: {
27
+ 'pri-001': {
28
+ principleId: 'pri-001',
29
+ evaluability: 'manual_only',
30
+ applicableOpportunityCount: 5,
31
+ observedViolationCount: 2,
32
+ complianceRate: 0.6,
33
+ violationTrend: 0.1,
34
+ generatedSampleCount: 3,
35
+ approvedSampleCount: 1,
36
+ includedTrainRunIds: ['run-1'],
37
+ deployedCheckpointIds: ['ckpt-1'],
38
+ internalizationStatus: 'prompt_only',
39
+ },
40
+ },
41
+ _tree: {
42
+ principles: {
43
+ 'pri-001': {
44
+ id: 'pri-001',
45
+ version: 1,
46
+ text: 'Test',
47
+ triggerPattern: 'test',
48
+ action: 'test',
49
+ status: 'active',
50
+ priority: 'P0',
51
+ scope: 'general',
52
+ evaluability: 'manual_only',
53
+ valueScore: 0.5,
54
+ adherenceRate: 0.8,
55
+ painPreventedCount: 0,
56
+ derivedFromPainIds: [],
57
+ ruleIds: [],
58
+ conflictsWithPrincipleIds: [],
59
+ createdAt: '2026-01-01T00:00:00Z',
60
+ updatedAt: '2026-01-01T00:00:00Z',
61
+ },
62
+ },
63
+ rules: {},
64
+ implementations: {},
65
+ metrics: {},
66
+ lastUpdated: '2026-01-01T00:00:00Z',
67
+ },
68
+ };
69
+ const result = parseHybridLedger(raw);
70
+ expect(result.trainingStore['pri-001']).toBeDefined();
71
+ expect(result.trainingStore['pri-001']?.evaluability).toBe('manual_only');
72
+ expect(result.tree.principles['pri-001']?.id).toBe('pri-001');
73
+ });
74
+ it('parseHybridLedger handles null input', () => {
75
+ const result = parseHybridLedger(null);
76
+ expect(result.trainingStore).toEqual({});
77
+ expect(result.tree.principles).toEqual({});
78
+ });
79
+ it('parseHybridLedger handles non-object input', () => {
80
+ const result = parseHybridLedger('not an object');
81
+ expect(result.trainingStore).toEqual({});
82
+ expect(result.tree.principles).toEqual({});
83
+ });
84
+ it('serializeLedger produces correct JSON with TREE_NAMESPACE', () => {
85
+ const store = {
86
+ trainingStore: {},
87
+ tree: {
88
+ principles: {},
89
+ rules: {},
90
+ implementations: {},
91
+ metrics: {},
92
+ lastUpdated: '2026-01-01T00:00:00Z',
93
+ },
94
+ };
95
+ const json = serializeLedger(store);
96
+ const parsed = JSON.parse(json);
97
+ expect(parsed._tree).toBeDefined();
98
+ expect(parsed._tree.lastUpdated).toBeDefined();
99
+ });
100
+ it('isRecord correctly identifies records', () => {
101
+ expect(isRecord({})).toBe(true);
102
+ expect(isRecord(null)).toBe(false);
103
+ expect(isRecord(undefined)).toBe(false);
104
+ expect(isRecord([])).toBe(false);
105
+ expect(isRecord('string')).toBe(false);
106
+ });
107
+ it('stringArray filters non-strings from array', () => {
108
+ expect(stringArray(['a', 1, 'b', null, 'c'])).toEqual(['a', 'b', 'c']);
109
+ expect(stringArray('not array')).toEqual([]);
110
+ });
111
+ it('clampFloat clamps to range with fallback', () => {
112
+ expect(clampFloat(0.5, { min: 0, max: 1, fallback: 0 })).toBe(0.5);
113
+ expect(clampFloat(1.5, { min: 0, max: 1, fallback: 0 })).toBe(1);
114
+ expect(clampFloat(-0.5, { min: 0, max: 1, fallback: 0 })).toBe(0);
115
+ expect(clampFloat(NaN, { min: 0, max: 1, fallback: 0.5 })).toBe(0.5);
116
+ });
117
+ it('clampInt clamps and rounds to range with fallback', () => {
118
+ expect(clampInt(5.7, { min: 0, max: 10, fallback: 0 })).toBe(6);
119
+ expect(clampInt(15, { min: 0, max: 10, fallback: 0 })).toBe(10);
120
+ expect(clampInt('x', { min: 0, max: 10, fallback: 3 })).toBe(3);
121
+ });
122
+ it('uniqueStrings deduplicates', () => {
123
+ expect(uniqueStrings(['a', 'b', 'a', 'c', 'b'])).toEqual(['a', 'b', 'c']);
124
+ });
125
+ it('ledger-codec.ts has zero fs/path imports (pure module)', () => {
126
+ const src = readFileSync(resolve(__dirname, '..', 'principle-tree', 'ledger-codec.ts'), 'utf-8');
127
+ expect(src).not.toMatch(/from\s+['"]fs['"]/);
128
+ expect(src).not.toMatch(/from\s+['"]path['"]/);
129
+ expect(src).not.toMatch(/from\s+['"]node:fs/);
130
+ expect(src).not.toMatch(/from\s+['"]node:path/);
131
+ });
132
+ // PRI-443 regression tests — ledger-codec edge cases
133
+ it('parseLegacyTrainingStore handles malformed evaluability', () => {
134
+ const raw = {
135
+ 'pri-001': {
136
+ principleId: 'pri-001',
137
+ evaluability: 'invalid_value',
138
+ applicableOpportunityCount: 5,
139
+ observedViolationCount: 2,
140
+ complianceRate: 0.6,
141
+ violationTrend: 0.1,
142
+ generatedSampleCount: 3,
143
+ approvedSampleCount: 1,
144
+ includedTrainRunIds: ['run-1'],
145
+ deployedCheckpointIds: ['ckpt-1'],
146
+ internalizationStatus: 'prompt_only',
147
+ },
148
+ };
149
+ const result = parseHybridLedger(raw);
150
+ expect(result.trainingStore['pri-001']).toBeDefined();
151
+ // Invalid evaluability should fallback to 'manual_only'
152
+ expect(result.trainingStore['pri-001']?.evaluability).toBe('manual_only');
153
+ });
154
+ it('parseLegacyTrainingStore handles malformed internalizationStatus', () => {
155
+ const raw = {
156
+ 'pri-002': {
157
+ principleId: 'pri-002',
158
+ evaluability: 'deterministic',
159
+ applicableOpportunityCount: 5,
160
+ observedViolationCount: 2,
161
+ complianceRate: 0.6,
162
+ violationTrend: 0.1,
163
+ generatedSampleCount: 3,
164
+ approvedSampleCount: 1,
165
+ includedTrainRunIds: ['run-1'],
166
+ deployedCheckpointIds: ['ckpt-1'],
167
+ internalizationStatus: 'invalid_status',
168
+ },
169
+ };
170
+ const result = parseHybridLedger(raw);
171
+ expect(result.trainingStore['pri-002']).toBeDefined();
172
+ // Invalid internalizationStatus should fallback to 'prompt_only'
173
+ expect(result.trainingStore['pri-002']?.internalizationStatus).toBe('prompt_only');
174
+ });
175
+ it('parseLegacyTrainingStore handles negative counts (clamped to 0)', () => {
176
+ const raw = {
177
+ 'pri-003': {
178
+ principleId: 'pri-003',
179
+ evaluability: 'deterministic',
180
+ applicableOpportunityCount: -5,
181
+ observedViolationCount: -2,
182
+ complianceRate: 0.6,
183
+ violationTrend: 0.1,
184
+ generatedSampleCount: -3,
185
+ approvedSampleCount: -1,
186
+ includedTrainRunIds: ['run-1'],
187
+ deployedCheckpointIds: ['ckpt-1'],
188
+ internalizationStatus: 'prompt_only',
189
+ },
190
+ };
191
+ const result = parseHybridLedger(raw);
192
+ expect(result.trainingStore['pri-003']).toBeDefined();
193
+ // Negative counts should be clamped to 0
194
+ expect(result.trainingStore['pri-003']?.applicableOpportunityCount).toBe(0);
195
+ expect(result.trainingStore['pri-003']?.observedViolationCount).toBe(0);
196
+ expect(result.trainingStore['pri-003']?.generatedSampleCount).toBe(0);
197
+ expect(result.trainingStore['pri-003']?.approvedSampleCount).toBe(0);
198
+ });
199
+ it('parseLegacyTrainingStore handles out-of-range complianceRate (clamped to [0, 1])', () => {
200
+ const raw = {
201
+ 'pri-004': {
202
+ principleId: 'pri-004',
203
+ evaluability: 'deterministic',
204
+ applicableOpportunityCount: 5,
205
+ observedViolationCount: 2,
206
+ complianceRate: 1.5, // Out of range (> 1)
207
+ violationTrend: -2.0, // Out of range (< -1)
208
+ generatedSampleCount: 3,
209
+ approvedSampleCount: 1,
210
+ includedTrainRunIds: ['run-1'],
211
+ deployedCheckpointIds: ['ckpt-1'],
212
+ internalizationStatus: 'prompt_only',
213
+ },
214
+ };
215
+ const result = parseHybridLedger(raw);
216
+ expect(result.trainingStore['pri-004']).toBeDefined();
217
+ // complianceRate should be clamped to [0, 1]
218
+ expect(result.trainingStore['pri-004']?.complianceRate).toBe(1);
219
+ // violationTrend should be clamped to [-1, 1]
220
+ expect(result.trainingStore['pri-004']?.violationTrend).toBe(-1);
221
+ });
222
+ it('parseLegacyTrainingStore handles non-array includedTrainRunIds', () => {
223
+ const raw = {
224
+ 'pri-005': {
225
+ principleId: 'pri-005',
226
+ evaluability: 'deterministic',
227
+ applicableOpportunityCount: 5,
228
+ observedViolationCount: 2,
229
+ complianceRate: 0.6,
230
+ violationTrend: 0.1,
231
+ generatedSampleCount: 3,
232
+ approvedSampleCount: 1,
233
+ includedTrainRunIds: 'not-an-array',
234
+ deployedCheckpointIds: null,
235
+ internalizationStatus: 'prompt_only',
236
+ },
237
+ };
238
+ const result = parseHybridLedger(raw);
239
+ expect(result.trainingStore['pri-005']).toBeDefined();
240
+ // Non-array should be converted to empty array
241
+ expect(result.trainingStore['pri-005']?.includedTrainRunIds).toEqual([]);
242
+ expect(result.trainingStore['pri-005']?.deployedCheckpointIds).toEqual([]);
243
+ });
244
+ it('parseLegacyTrainingStore skips entries with mismatched principleId', () => {
245
+ const raw = {
246
+ 'pri-006': {
247
+ principleId: 'different-id', // Mismatched!
248
+ evaluability: 'deterministic',
249
+ applicableOpportunityCount: 5,
250
+ observedViolationCount: 2,
251
+ complianceRate: 0.6,
252
+ violationTrend: 0.1,
253
+ generatedSampleCount: 3,
254
+ approvedSampleCount: 1,
255
+ includedTrainRunIds: ['run-1'],
256
+ deployedCheckpointIds: ['ckpt-1'],
257
+ internalizationStatus: 'prompt_only',
258
+ },
259
+ };
260
+ const result = parseHybridLedger(raw);
261
+ // Entry with mismatched principleId should be skipped
262
+ expect(result.trainingStore['pri-006']).toBeUndefined();
263
+ });
264
+ it('parseLegacyTrainingStore skips TREE_NAMESPACE entries', () => {
265
+ const raw = {
266
+ '_tree': {
267
+ principleId: '_tree',
268
+ evaluability: 'deterministic',
269
+ applicableOpportunityCount: 5,
270
+ observedViolationCount: 2,
271
+ complianceRate: 0.6,
272
+ violationTrend: 0.1,
273
+ generatedSampleCount: 3,
274
+ approvedSampleCount: 1,
275
+ includedTrainRunIds: ['run-1'],
276
+ deployedCheckpointIds: ['ckpt-1'],
277
+ internalizationStatus: 'prompt_only',
278
+ },
279
+ };
280
+ const result = parseHybridLedger(raw);
281
+ // TREE_NAMESPACE entries should be skipped in trainingStore
282
+ expect(result.trainingStore._tree).toBeUndefined();
283
+ });
284
+ it('parsePrinciples handles missing ruleIds', () => {
285
+ const raw = {
286
+ 'pri-007': {
287
+ id: 'pri-007',
288
+ version: 1,
289
+ text: 'Test',
290
+ triggerPattern: 'test',
291
+ action: 'test',
292
+ status: 'active',
293
+ priority: 'P0',
294
+ scope: 'general',
295
+ evaluability: 'manual_only',
296
+ valueScore: 0.5,
297
+ adherenceRate: 0.8,
298
+ painPreventedCount: 0,
299
+ derivedFromPainIds: [],
300
+ conflictsWithPrincipleIds: [],
301
+ createdAt: '2026-01-01T00:00:00Z',
302
+ updatedAt: '2026-01-01T00:00:00Z',
303
+ // ruleIds is missing
304
+ },
305
+ };
306
+ const result = parseHybridLedger({ _tree: { principles: raw } });
307
+ expect(result.tree.principles['pri-007']).toBeDefined();
308
+ // Missing ruleIds should be converted to empty array
309
+ expect(result.tree.principles['pri-007']?.ruleIds).toEqual([]);
310
+ });
311
+ it('parseRules handles missing implementationIds', () => {
312
+ const raw = {
313
+ 'rule-001': {
314
+ id: 'rule-001',
315
+ principleId: 'pri-001',
316
+ version: 1,
317
+ text: 'Test rule',
318
+ status: 'active',
319
+ createdAt: '2026-01-01T00:00:00Z',
320
+ updatedAt: '2026-01-01T00:00:00Z',
321
+ // implementationIds is missing
322
+ },
323
+ };
324
+ const result = parseHybridLedger({ _tree: { rules: raw } });
325
+ expect(result.tree.rules['rule-001']).toBeDefined();
326
+ // Missing implementationIds should be converted to empty array
327
+ expect(result.tree.rules['rule-001']?.implementationIds).toEqual([]);
328
+ });
329
+ it('parseRules handles missing principleId (defaults to empty string)', () => {
330
+ const raw = {
331
+ 'rule-002': {
332
+ id: 'rule-002',
333
+ // principleId is missing
334
+ version: 1,
335
+ text: 'Test rule',
336
+ status: 'active',
337
+ createdAt: '2026-01-01T00:00:00Z',
338
+ updatedAt: '2026-01-01T00:00:00Z',
339
+ implementationIds: [],
340
+ },
341
+ };
342
+ const result = parseHybridLedger({ _tree: { rules: raw } });
343
+ expect(result.tree.rules['rule-002']).toBeDefined();
344
+ // Missing principleId should default to empty string
345
+ expect(result.tree.rules['rule-002']?.principleId).toBe('');
346
+ });
347
+ it('parseImplementations skips entries without ruleId', () => {
348
+ const raw = {
349
+ 'impl-001': {
350
+ id: 'impl-001',
351
+ // ruleId is missing
352
+ code: 'function evaluate() { return { decision: "allow" }; }',
353
+ createdAt: '2026-01-01T00:00:00Z',
354
+ updatedAt: '2026-01-01T00:00:00Z',
355
+ },
356
+ };
357
+ const result = parseHybridLedger({ _tree: { implementations: raw } });
358
+ // Entry without ruleId should be skipped
359
+ expect(result.tree.implementations['impl-001']).toBeUndefined();
360
+ });
361
+ it('serializeLedger preserves TREE_NAMESPACE key', () => {
362
+ const store = {
363
+ trainingStore: {
364
+ 'pri-001': {
365
+ principleId: 'pri-001',
366
+ evaluability: 'manual_only',
367
+ applicableOpportunityCount: 5,
368
+ observedViolationCount: 2,
369
+ complianceRate: 0.6,
370
+ violationTrend: 0.1,
371
+ generatedSampleCount: 3,
372
+ approvedSampleCount: 1,
373
+ includedTrainRunIds: ['run-1'],
374
+ deployedCheckpointIds: ['ckpt-1'],
375
+ internalizationStatus: 'prompt_only',
376
+ },
377
+ },
378
+ tree: {
379
+ principles: {},
380
+ rules: {},
381
+ implementations: {},
382
+ metrics: {},
383
+ lastUpdated: '2026-01-01T00:00:00Z',
384
+ },
385
+ };
386
+ const json = serializeLedger(store);
387
+ const parsed = JSON.parse(json);
388
+ // TREE_NAMESPACE key should be present
389
+ expect(parsed._tree).toBeDefined();
390
+ // trainingStore entries should be at top level
391
+ expect(parsed['pri-001']).toBeDefined();
392
+ // TREE_NAMESPACE should NOT contain trainingStore entries
393
+ expect(parsed._tree['pri-001']).toBeUndefined();
394
+ });
395
+ it('parseHybridLedger handles deeply nested malformed data', () => {
396
+ const raw = {
397
+ trainingStore: {
398
+ 'pri-001': null, // Malformed entry
399
+ },
400
+ _tree: {
401
+ principles: {
402
+ 'pri-002': undefined, // Malformed entry
403
+ },
404
+ rules: {
405
+ 'rule-001': 'not-an-object', // Malformed entry
406
+ },
407
+ implementations: {
408
+ 'impl-001': [], // Malformed entry
409
+ },
410
+ metrics: {
411
+ 'metric-001': { principleId: 'pri-001' }, // Valid entry (Record)
412
+ },
413
+ lastUpdated: null, // Non-string value (triggers fallback)
414
+ },
415
+ };
416
+ const result = parseHybridLedger(raw);
417
+ // All malformed entries should be skipped/converted gracefully
418
+ expect(result.trainingStore['pri-001']).toBeUndefined();
419
+ expect(result.tree.principles['pri-002']).toBeUndefined();
420
+ expect(result.tree.rules['rule-001']).toBeUndefined();
421
+ expect(result.tree.implementations['impl-001']).toBeUndefined();
422
+ // Valid metric entry should be preserved
423
+ expect(result.tree.metrics['metric-001']).toBeDefined();
424
+ expect(result.tree.metrics['metric-001']?.principleId).toBe('pri-001');
425
+ // Non-string lastUpdated should fallback to epoch
426
+ expect(result.tree.lastUpdated).toBe(new Date(0).toISOString());
427
+ });
428
+ });
429
+ //# sourceMappingURL=ledger-codec.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-codec.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/ledger-codec.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ledger-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-store.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/ledger-store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * PRI-443: Ledger store types module — pure type definitions, zero I/O.
3
+ *
4
+ * Tests verify:
5
+ * 1. All types are importable from the new pure module
6
+ * 2. The module has zero fs/path imports
7
+ * 3. TREE_NAMESPACE constant is available
8
+ */
9
+ import { describe, it, expect } from 'vitest';
10
+ import { readFileSync } from 'node:fs';
11
+ import { resolve } from 'node:path';
12
+ import { TREE_NAMESPACE } from '../types/ledger-store.js';
13
+ describe('PRI-443: ledger-store.ts pure types module', () => {
14
+ it('TREE_NAMESPACE constant is exported and equals _tree', () => {
15
+ expect(TREE_NAMESPACE).toBe('_tree');
16
+ });
17
+ it('LedgerPrinciple extends Principle with optional fields', () => {
18
+ const principle = {
19
+ id: 'pri-001',
20
+ version: 1,
21
+ text: 'Test principle',
22
+ triggerPattern: 'test',
23
+ action: 'test',
24
+ status: 'active',
25
+ priority: 'P0',
26
+ scope: 'general',
27
+ evaluability: 'manual_only',
28
+ valueScore: 0.5,
29
+ adherenceRate: 0.8,
30
+ painPreventedCount: 0,
31
+ derivedFromPainIds: [],
32
+ ruleIds: [],
33
+ conflictsWithPrincipleIds: [],
34
+ createdAt: '2026-01-01T00:00:00Z',
35
+ updatedAt: '2026-01-01T00:00:00Z',
36
+ suggestedRules: ['rule-1'],
37
+ lastTriggeredAt: '2026-01-02T00:00:00Z',
38
+ };
39
+ expect(principle.id).toBe('pri-001');
40
+ expect(principle.suggestedRules).toEqual(['rule-1']);
41
+ expect(principle.lastTriggeredAt).toBe('2026-01-02T00:00:00Z');
42
+ });
43
+ it('HybridLedgerStore has trainingStore and tree', () => {
44
+ const store = {
45
+ trainingStore: {},
46
+ tree: {
47
+ principles: {},
48
+ rules: {},
49
+ implementations: {},
50
+ metrics: {},
51
+ lastUpdated: '2026-01-01T00:00:00Z',
52
+ },
53
+ };
54
+ expect(store.trainingStore).toEqual({});
55
+ expect(store.tree.principles).toEqual({});
56
+ });
57
+ it('ledger-store.ts has zero fs/path imports (pure module)', () => {
58
+ const src = readFileSync(resolve(__dirname, '..', 'types', 'ledger-store.ts'), 'utf-8');
59
+ expect(src).not.toMatch(/from\s+['"]fs['"]/);
60
+ expect(src).not.toMatch(/from\s+['"]path['"]/);
61
+ expect(src).not.toMatch(/from\s+['"]node:fs/);
62
+ expect(src).not.toMatch(/from\s+['"]node:path/);
63
+ });
64
+ });
65
+ //# sourceMappingURL=ledger-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-store.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/ledger-store.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IAC1D,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,SAAS,GAAoB;YACjC,EAAE,EAAE,SAAS;YACb,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,cAAc,EAAE,MAAM;YACtB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,aAAa;YAC3B,UAAU,EAAE,GAAG;YACf,aAAa,EAAE,GAAG;YAClB,kBAAkB,EAAE,CAAC;YACrB,kBAAkB,EAAE,EAAE;YACtB,OAAO,EAAE,EAAE;YACX,yBAAyB,EAAE,EAAE;YAC7B,SAAS,EAAE,sBAAsB;YACjC,SAAS,EAAE,sBAAsB;YACjC,cAAc,EAAE,CAAC,QAAQ,CAAC;YAC1B,eAAe,EAAE,sBAAsB;SACxC,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAsB;YAC/B,aAAa,EAAE,EAAE;YACjB,IAAI,EAAE;gBACJ,UAAU,EAAE,EAAE;gBACd,KAAK,EAAE,EAAE;gBACT,eAAe,EAAE,EAAE;gBACnB,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,sBAAsB;aACpC;SACF,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,GAAG,GAAG,YAAY,CACtB,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,CAAC,EACpD,OAAO,CACR,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}