@remnic/core 9.69.53 → 9.69.55

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 (102) hide show
  1. package/dist/access-admin-ops-surface.js +2 -2
  2. package/dist/access-authorization-probe.js +3 -3
  3. package/dist/access-boundary.js +2 -2
  4. package/dist/access-cli.js +24 -24
  5. package/dist/access-extraction-force-flush.js +2 -2
  6. package/dist/access-http-briefing.js +3 -3
  7. package/dist/access-http-query.js +2 -2
  8. package/dist/access-http.js +14 -14
  9. package/dist/access-identity-continuity-surface.js +2 -2
  10. package/dist/access-lcm-surface.js +2 -2
  11. package/dist/access-mcp.js +9 -9
  12. package/dist/access-namespace-preflight.js +2 -2
  13. package/dist/access-observe-write-surface.js +2 -2
  14. package/dist/access-operations-batch.js +3 -3
  15. package/dist/access-operations.js +8 -8
  16. package/dist/access-recall-concurrency.js +2 -2
  17. package/dist/access-recall-response.js +2 -2
  18. package/dist/access-recall-surface.js +2 -2
  19. package/dist/access-service.js +2 -2
  20. package/dist/access-surface-catalog.js +4 -4
  21. package/dist/active-recall.js +2 -2
  22. package/dist/{chunk-ZADYEZY4.js → chunk-2SIKTXWX.js} +2 -2
  23. package/dist/{chunk-TS66MUUJ.js → chunk-3R23DDD3.js} +8 -8
  24. package/dist/{chunk-EQNZC3BH.js → chunk-3S6URXEH.js} +2 -2
  25. package/dist/{chunk-BCXZ4BDS.js → chunk-75YZ5VAI.js} +2 -2
  26. package/dist/{chunk-MXTCV3B5.js → chunk-AHVJ6GLL.js} +2 -2
  27. package/dist/{chunk-6UEM5EOB.js → chunk-AQ55YKEV.js} +2 -2
  28. package/dist/{chunk-VMKAA5SU.js → chunk-BSCNBIF4.js} +2 -2
  29. package/dist/{chunk-M7HFDWOS.js → chunk-FROKVQQY.js} +2 -2
  30. package/dist/{chunk-A4TQFNRX.js → chunk-GRDRVYXJ.js} +3 -3
  31. package/dist/{chunk-EYK3UHAP.js → chunk-H6WOFMOV.js} +2 -2
  32. package/dist/{chunk-SOOWBRMH.js → chunk-IYNCJKBM.js} +8 -8
  33. package/dist/{chunk-3KJTSCSX.js → chunk-J54B5DGD.js} +5 -4
  34. package/dist/chunk-J54B5DGD.js.map +1 -0
  35. package/dist/{chunk-UVZBDIJX.js → chunk-KIGC55FQ.js} +489 -49
  36. package/dist/chunk-KIGC55FQ.js.map +1 -0
  37. package/dist/{chunk-KQQEZTH6.js → chunk-KQVBR7BC.js} +2 -2
  38. package/dist/{chunk-MTJUIIM4.js → chunk-MTWD4KMM.js} +2 -2
  39. package/dist/{chunk-JE4H2QBO.js → chunk-NNEWBRUL.js} +2 -2
  40. package/dist/{chunk-SEQ6DWXD.js → chunk-NPX6WMFJ.js} +2 -2
  41. package/dist/{chunk-Z22M4JCY.js → chunk-NZLFVLLJ.js} +165 -5
  42. package/dist/chunk-NZLFVLLJ.js.map +1 -0
  43. package/dist/{chunk-QKCXRS5A.js → chunk-OGXXGHW6.js} +11 -1
  44. package/dist/{chunk-QKCXRS5A.js.map → chunk-OGXXGHW6.js.map} +1 -1
  45. package/dist/{chunk-CO7KBRPF.js → chunk-TJNDFNCU.js} +2 -2
  46. package/dist/{chunk-K7FXR75S.js → chunk-XZRZJHBW.js} +361 -579
  47. package/dist/chunk-XZRZJHBW.js.map +1 -0
  48. package/dist/{chunk-HUQMVI3A.js → chunk-ZBYVR5W4.js} +2 -2
  49. package/dist/{chunk-ZANEMAEV.js → chunk-ZP73EM2X.js} +2 -2
  50. package/dist/{chunk-IEOBAOA6.js → chunk-ZXQPAYCS.js} +2 -2
  51. package/dist/cli.js +19 -19
  52. package/dist/compounding/engine.js +3 -3
  53. package/dist/config.js +2 -2
  54. package/dist/external-wiki-access.js +3 -3
  55. package/dist/index.d.ts +139 -41
  56. package/dist/index.js +36 -26
  57. package/dist/memory-browse-operations.js +3 -3
  58. package/dist/operator-toolkit.js +3 -3
  59. package/dist/orchestration/maintenance.js +3 -2
  60. package/dist/orchestrator.js +24 -24
  61. package/dist/recall-navigation-operations.js +3 -3
  62. package/dist/recall-navigation.js +2 -2
  63. package/dist/resume-bundles.js +3 -3
  64. package/dist/shared-context/manager.d.ts +16 -0
  65. package/dist/shared-context/manager.js +2 -2
  66. package/dist/support-passport/index.js +5 -5
  67. package/package.json +2 -2
  68. package/src/activity/config.test.ts +19 -0
  69. package/src/activity/config.ts +3 -4
  70. package/src/activity/index.ts +2 -0
  71. package/src/activity/timeline/index.ts +1 -0
  72. package/src/activity/timeline/week-dashboard.test.ts +362 -0
  73. package/src/activity/timeline/week-dashboard.ts +273 -0
  74. package/src/activity/timeline/weekly.ts +2 -1
  75. package/src/lifecycle/seed-graduation.test.ts +209 -0
  76. package/src/lifecycle/seed-graduation.ts +94 -11
  77. package/src/shared-context/governance-wiring.test.ts +153 -0
  78. package/src/shared-context/manager.ts +104 -3
  79. package/src/shared-context/staleness.ts +1 -1
  80. package/dist/chunk-3KJTSCSX.js.map +0 -1
  81. package/dist/chunk-K7FXR75S.js.map +0 -1
  82. package/dist/chunk-UVZBDIJX.js.map +0 -1
  83. package/dist/chunk-Z22M4JCY.js.map +0 -1
  84. /package/dist/{chunk-ZADYEZY4.js.map → chunk-2SIKTXWX.js.map} +0 -0
  85. /package/dist/{chunk-TS66MUUJ.js.map → chunk-3R23DDD3.js.map} +0 -0
  86. /package/dist/{chunk-EQNZC3BH.js.map → chunk-3S6URXEH.js.map} +0 -0
  87. /package/dist/{chunk-BCXZ4BDS.js.map → chunk-75YZ5VAI.js.map} +0 -0
  88. /package/dist/{chunk-MXTCV3B5.js.map → chunk-AHVJ6GLL.js.map} +0 -0
  89. /package/dist/{chunk-6UEM5EOB.js.map → chunk-AQ55YKEV.js.map} +0 -0
  90. /package/dist/{chunk-VMKAA5SU.js.map → chunk-BSCNBIF4.js.map} +0 -0
  91. /package/dist/{chunk-M7HFDWOS.js.map → chunk-FROKVQQY.js.map} +0 -0
  92. /package/dist/{chunk-A4TQFNRX.js.map → chunk-GRDRVYXJ.js.map} +0 -0
  93. /package/dist/{chunk-EYK3UHAP.js.map → chunk-H6WOFMOV.js.map} +0 -0
  94. /package/dist/{chunk-SOOWBRMH.js.map → chunk-IYNCJKBM.js.map} +0 -0
  95. /package/dist/{chunk-KQQEZTH6.js.map → chunk-KQVBR7BC.js.map} +0 -0
  96. /package/dist/{chunk-MTJUIIM4.js.map → chunk-MTWD4KMM.js.map} +0 -0
  97. /package/dist/{chunk-JE4H2QBO.js.map → chunk-NNEWBRUL.js.map} +0 -0
  98. /package/dist/{chunk-SEQ6DWXD.js.map → chunk-NPX6WMFJ.js.map} +0 -0
  99. /package/dist/{chunk-CO7KBRPF.js.map → chunk-TJNDFNCU.js.map} +0 -0
  100. /package/dist/{chunk-HUQMVI3A.js.map → chunk-ZBYVR5W4.js.map} +0 -0
  101. /package/dist/{chunk-ZANEMAEV.js.map → chunk-ZP73EM2X.js.map} +0 -0
  102. /package/dist/{chunk-IEOBAOA6.js.map → chunk-ZXQPAYCS.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SharedFeedbackEntrySchema,
3
3
  resolveSharedContextDir
4
- } from "./chunk-Z22M4JCY.js";
4
+ } from "./chunk-NZLFVLLJ.js";
5
5
  import {
6
6
  composeSalvagedEnvelope
7
7
  } from "./chunk-6ET2VII7.js";
@@ -1283,4 +1283,4 @@ export {
1283
1283
  defaultTierMigrationCycleBudget,
1284
1284
  CompoundingEngine
1285
1285
  };
1286
- //# sourceMappingURL=chunk-KQQEZTH6.js.map
1286
+ //# sourceMappingURL=chunk-KQVBR7BC.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SupportPassportCreateGrantRequestSchema,
3
3
  defineOperation
4
- } from "./chunk-HUQMVI3A.js";
4
+ } from "./chunk-ZBYVR5W4.js";
5
5
  import {
6
6
  SupportPassportCardCategorySchema,
7
7
  SupportPassportMemoryIdSchema,
@@ -220,4 +220,4 @@ var supportPassportGrantAskOperation = defineOperation({
220
220
  result: await ctx.service.supportPassportAskGrant(grantId, secret, question, ctx.abortSignal)
221
221
  })
222
222
  });
223
- //# sourceMappingURL=chunk-MTJUIIM4.js.map
223
+ //# sourceMappingURL=chunk-MTWD4KMM.js.map
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-NHLLKEKK.js";
12
12
  import {
13
13
  parseConfig
14
- } from "./chunk-UVZBDIJX.js";
14
+ } from "./chunk-KIGC55FQ.js";
15
15
  import {
16
16
  resolveObjectiveStateStoreDir,
17
17
  validateObjectiveStateSnapshot
@@ -268,4 +268,4 @@ export {
268
268
  recordResumeBundle,
269
269
  getResumeBundleStatus
270
270
  };
271
- //# sourceMappingURL=chunk-JE4H2QBO.js.map
271
+ //# sourceMappingURL=chunk-NNEWBRUL.js.map
@@ -38,7 +38,7 @@ import {
38
38
  } from "./chunk-YBPYIAA5.js";
39
39
  import {
40
40
  parseConfig
41
- } from "./chunk-UVZBDIJX.js";
41
+ } from "./chunk-KIGC55FQ.js";
42
42
  import {
43
43
  readAggregateExtractionWatermark
44
44
  } from "./chunk-2QZJ4P27.js";
@@ -1683,4 +1683,4 @@ export {
1683
1683
  runBenchmarkRecall,
1684
1684
  runOperatorRepair
1685
1685
  };
1686
- //# sourceMappingURL=chunk-SEQ6DWXD.js.map
1686
+ //# sourceMappingURL=chunk-NPX6WMFJ.js.map
@@ -2,9 +2,11 @@ import {
2
2
  composeWriteEnvelope,
3
3
  envelopeFromScalars,
4
4
  envelopeToFrontmatterLines,
5
+ isExpired,
6
+ isStrictIsoInstant,
5
7
  resolveReadAuthority,
6
8
  resolveWriteOrigin
7
- } from "./chunk-QKCXRS5A.js";
9
+ } from "./chunk-OGXXGHW6.js";
8
10
  import {
9
11
  resolveConversationContextCapabilities
10
12
  } from "./chunk-JUOZ62Y7.js";
@@ -23,6 +25,97 @@ import { randomUUID } from "crypto";
23
25
  import { mkdir, readFile, readdir, appendFile, writeFile, stat, rename, rm } from "fs/promises";
24
26
  import path from "path";
25
27
  import { z } from "zod";
28
+
29
+ // src/shared-context/contradictions.ts
30
+ function detectContradictionPair(a, b) {
31
+ if (a.id === b.id) {
32
+ return { kind: "same" };
33
+ }
34
+ const keys = [];
35
+ for (const key of Object.keys(a.claims)) {
36
+ if (key in b.claims && a.claims[key] !== b.claims[key]) {
37
+ keys.push(key);
38
+ }
39
+ }
40
+ return keys.length > 0 ? { kind: "conflict", keys: keys.sort() } : { kind: "none" };
41
+ }
42
+
43
+ // src/shared-context/curation-lint.ts
44
+ function lintCuratedClaims(input) {
45
+ const available = new Set(input.availableItemIds);
46
+ const findings = [];
47
+ for (const claim of input.claims) {
48
+ const claimId = claim.claimId;
49
+ if (typeof claimId !== "string" || claimId.trim().length === 0) {
50
+ throw new RangeError("claimId must be a non-blank string");
51
+ }
52
+ const unknown = /* @__PURE__ */ new Set();
53
+ let validCount = 0;
54
+ for (const id of claim.citedItemIds ?? []) {
55
+ if (id.trim().length === 0) continue;
56
+ if (available.has(id)) {
57
+ validCount += 1;
58
+ } else {
59
+ unknown.add(id);
60
+ }
61
+ }
62
+ if (validCount === 0) {
63
+ findings.push({ claimId, reason: "no_citations" });
64
+ continue;
65
+ }
66
+ if (unknown.size > 0) {
67
+ findings.push({ claimId, reason: "unknown_citation", unknownIds: [...unknown].sort() });
68
+ }
69
+ }
70
+ findings.sort((a, b) => {
71
+ if (a.claimId !== b.claimId) return a.claimId < b.claimId ? -1 : 1;
72
+ if (a.reason !== b.reason) return a.reason < b.reason ? -1 : 1;
73
+ const left = (a.unknownIds ?? []).join(",");
74
+ const right = (b.unknownIds ?? []).join(",");
75
+ if (left !== right) return left < right ? -1 : 1;
76
+ return 0;
77
+ });
78
+ return findings;
79
+ }
80
+
81
+ // src/shared-context/provenance.ts
82
+ function requireActor(actor) {
83
+ if (typeof actor !== "string" || actor.trim().length === 0) {
84
+ throw new Error("stampProvenance: actor must be a non-empty string");
85
+ }
86
+ return actor;
87
+ }
88
+ function requireAt(at) {
89
+ if (typeof at !== "string" || !isStrictIsoInstant(at)) {
90
+ throw new Error("stampProvenance: at must be a valid ISO-8601 timestamp");
91
+ }
92
+ return at;
93
+ }
94
+ function stampProvenance(item, stamp) {
95
+ return {
96
+ ...item,
97
+ provenance: {
98
+ actor: requireActor(stamp.actor),
99
+ at: requireAt(stamp.at)
100
+ }
101
+ };
102
+ }
103
+
104
+ // src/shared-context/staleness.ts
105
+ function filterLiveEnvelopes(items, nowMs) {
106
+ return items.filter((item) => !isExpired(item, nowMs));
107
+ }
108
+ function markSupersededCirculation(items) {
109
+ const supersededIds = /* @__PURE__ */ new Set();
110
+ for (const item of items) {
111
+ if (item.supersedes) supersededIds.add(item.supersedes);
112
+ }
113
+ return items.map(
114
+ (item) => supersededIds.has(item.id) ? { ...item, circulating: true } : item
115
+ );
116
+ }
117
+
118
+ // src/shared-context/manager.ts
26
119
  var SharedFeedbackEntrySchema = z.object({
27
120
  agent: z.string().min(1),
28
121
  decision: z.enum(["approved", "approved_with_feedback", "rejected"]),
@@ -317,6 +410,19 @@ function formatFeedbackLine(entry) {
317
410
  function formatOverlapLine(entry) {
318
411
  return `- \`${entry.token}\` (${entry.agentCount} agents: ${markdownLineList(entry.agents)}) [sources: ${markdownLineList(entry.sourcePaths)}]`;
319
412
  }
413
+ function formatStalenessLines(report) {
414
+ const circulating = report.staleness.supersededStillCirculating;
415
+ return [
416
+ `- Expired items dropped: ${report.staleness.expiredDropped}`,
417
+ circulating.length === 0 ? "- Superseded items still circulating: 0" : `- Superseded items still circulating: ${circulating.length} (${markdownLineList(circulating)})`
418
+ ];
419
+ }
420
+ function formatDisputedLines(report) {
421
+ if (report.disputed.length === 0) return ["- No contradictory agent judgments recorded."];
422
+ return report.disputed.map(
423
+ (entry) => `- \`${entry.ref}\` disputed by ${markdownLineList(entry.agents)} (decisions: ${markdownLineList(entry.decisions)})`
424
+ );
425
+ }
320
426
  async function writeFileAtomic(filePath, content) {
321
427
  await mkdir(path.dirname(filePath), { recursive: true });
322
428
  const tempPath = path.join(
@@ -561,6 +667,14 @@ var SharedContextManager = class {
561
667
  outputs.sort(
562
668
  (a, b) => a.agent.localeCompare(b.agent) || a.path.localeCompare(b.path) || a.title.localeCompare(b.title)
563
669
  );
670
+ const liveOutputs = filterLiveEnvelopes(
671
+ outputs.map((output) => ({ output, expiresAt: output.envelope.expiresAt })),
672
+ Date.now()
673
+ ).map((entry) => entry.output);
674
+ const expiredDropped = outputs.length - liveOutputs.length;
675
+ const supersededStillCirculating = markSupersededCirculation(
676
+ liveOutputs.map((output) => ({ id: output.path, supersedes: output.envelope.supersedes }))
677
+ ).filter((item) => item.circulating === true).map((item) => item.id).sort();
564
678
  const feedback = [];
565
679
  try {
566
680
  const raw = await readFile(this.feedbackInboxPath, "utf-8");
@@ -576,7 +690,7 @@ var SharedContextManager = class {
576
690
  }
577
691
  } catch {
578
692
  }
579
- const sources = outputs.map((output) => {
693
+ const sources = liveOutputs.map((output) => {
580
694
  const body = stripYamlFrontmatter(output.raw);
581
695
  return {
582
696
  agent: output.agent,
@@ -643,15 +757,38 @@ ${body}`),
643
757
  for (const entry of feedback) {
644
758
  feedbackByDecision[entry.decision] += 1;
645
759
  }
646
- const report = {
760
+ const claimItems = feedback.map((entry, index) => ({
761
+ id: `${entry.agent}#${index}`,
762
+ claims: Object.fromEntries((entry.refs ?? []).map((ref) => [ref, entry.decision]))
763
+ }));
764
+ const disputedByRef = /* @__PURE__ */ new Map();
765
+ for (let i = 0; i < claimItems.length; i++) {
766
+ for (let j = i + 1; j < claimItems.length; j++) {
767
+ const pair = detectContradictionPair(claimItems[i], claimItems[j]);
768
+ if (pair.kind !== "conflict") continue;
769
+ for (const ref of pair.keys) {
770
+ const slot = disputedByRef.get(ref) ?? { agents: /* @__PURE__ */ new Set(), decisions: /* @__PURE__ */ new Set() };
771
+ slot.agents.add(feedback[i].agent);
772
+ slot.agents.add(feedback[j].agent);
773
+ slot.decisions.add(feedback[i].decision);
774
+ slot.decisions.add(feedback[j].decision);
775
+ disputedByRef.set(ref, slot);
776
+ }
777
+ }
778
+ }
779
+ const disputed = [...disputedByRef.entries()].map(([ref, slot]) => ({ ref, agents: [...slot.agents].sort(), decisions: [...slot.decisions].sort() })).sort((a, b) => a.ref.localeCompare(b.ref));
780
+ const generatedAt = (/* @__PURE__ */ new Date()).toISOString();
781
+ const baseReport = {
647
782
  date,
648
- generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
783
+ generatedAt,
649
784
  sourceCount: sources.length,
650
785
  feedbackCount: feedback.length,
651
786
  feedbackByDecision,
652
787
  feedbackEntries: [...feedback].sort(compareFeedbackPriority),
653
788
  sources,
654
789
  overlaps: mergedOverlaps,
790
+ staleness: { expiredDropped, supersededStillCirculating },
791
+ disputed,
655
792
  semantic: {
656
793
  enabled: semanticEnabled,
657
794
  applied: semanticApplied,
@@ -661,6 +798,7 @@ ${body}`),
661
798
  addedOverlapCount: semanticAddedOverlapCount
662
799
  }
663
800
  };
801
+ const report = stampProvenance(baseReport, { actor: "shared-context:curation", at: generatedAt });
664
802
  const crossSignalsPath = path.join(this.crossSignalsDir, `${date}.json`);
665
803
  await writeFileAtomic(crossSignalsPath, `${JSON.stringify(report, null, 2)}
666
804
  `);
@@ -681,6 +819,12 @@ ${body}`),
681
819
  `- Semantic enhancer: ${semanticEnabled ? semanticTimedOut ? "enabled (timed out, fail-open)" : semanticApplied ? "enabled (applied)" : "enabled (no additional overlaps)" : "disabled"}`,
682
820
  `- JSON report: ${crossSignalsPath}`,
683
821
  "",
822
+ "## Staleness",
823
+ ...formatStalenessLines(report),
824
+ "",
825
+ "## Disputed",
826
+ ...formatDisputedLines(report),
827
+ "",
684
828
  "## Recurring Themes",
685
829
  ...recurringThemeLines,
686
830
  "",
@@ -714,6 +858,16 @@ ${body}`),
714
858
  const date = opts.date;
715
859
  const maxChars = Math.max(2e3, opts.maxChars ?? 2e4);
716
860
  const crossSignals = await this.synthesizeCrossSignalsUnlocked({ date });
861
+ const lintFindings = lintCuratedClaims({
862
+ claims: crossSignals.report.overlaps.map((overlap) => ({
863
+ claimId: `overlap:${overlap.token}`,
864
+ citedItemIds: overlap.sourcePaths
865
+ })),
866
+ availableItemIds: crossSignals.report.sources.map((source) => source.path)
867
+ });
868
+ if (lintFindings.length > 0) {
869
+ throw new Error(`shared-context curation self-check failed: ${JSON.stringify(lintFindings)}`);
870
+ }
717
871
  const feedbackLines = crossSignals.report.feedbackEntries.length === 0 ? ["- (none)"] : crossSignals.report.feedbackEntries.map((entry) => formatFeedbackLine(entry));
718
872
  const overlapBullets = crossSignals.report.overlaps.length === 0 ? ["- No multi-agent topic overlap detected."] : crossSignals.report.overlaps.slice(0, 8).map((entry) => formatOverlapLine(entry));
719
873
  const md = [
@@ -733,6 +887,12 @@ ${body}`),
733
887
  `- Cross-signals JSON: ${crossSignals.crossSignalsPath}`,
734
888
  `- Cross-signals markdown: ${crossSignals.crossSignalsMarkdownPath}`,
735
889
  ...overlapBullets,
890
+ "",
891
+ "## Staleness",
892
+ ...formatStalenessLines(crossSignals.report),
893
+ "",
894
+ "## Disputed",
895
+ ...formatDisputedLines(crossSignals.report),
736
896
  ""
737
897
  ];
738
898
  const out = md.join("\n");
@@ -755,4 +915,4 @@ export {
755
915
  resolveSharedContextDir,
756
916
  SharedContextManager
757
917
  };
758
- //# sourceMappingURL=chunk-Z22M4JCY.js.map
918
+ //# sourceMappingURL=chunk-NZLFVLLJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared-context/manager.ts","../src/shared-context/contradictions.ts","../src/shared-context/curation-lint.ts","../src/shared-context/provenance.ts","../src/shared-context/staleness.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, readdir, appendFile, writeFile, stat, rename, rm } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport { log } from \"../logger.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport { expandTildePath } from \"../utils/path.js\";\nimport { resolveConversationContextCapabilities } from \"../capabilities.js\";\nimport { throwIfAborted } from \"../abort-error.js\";\nimport {\n composeWriteEnvelope,\n envelopeFromScalars,\n envelopeToFrontmatterLines,\n resolveReadAuthority,\n resolveWriteOrigin,\n} from \"./envelope-io.js\";\nimport type { SharedAuthority, SharedEnvelope } from \"./governance.js\";\nimport { detectContradictionPair } from \"./contradictions.js\";\nimport { lintCuratedClaims } from \"./curation-lint.js\";\nimport { stampProvenance } from \"./provenance.js\";\nimport { filterLiveEnvelopes, markSupersededCirculation } from \"./staleness.js\";\n\nexport const SharedFeedbackEntrySchema = z.object({\n agent: z.string().min(1),\n decision: z.enum([\"approved\", \"approved_with_feedback\", \"rejected\"]),\n reason: z.string().min(1),\n date: z.string().min(8), // ISO-ish; keep loose\n learning: z.string().optional(),\n outcome: z.string().optional(),\n severity: z.enum([\"low\", \"medium\", \"high\"]).optional(),\n confidence: z.number().min(0).max(1).optional(),\n workflow: z.string().min(1).optional(),\n tags: z.array(z.string().min(1)).optional(),\n evidenceWindowStart: z.string().min(8).optional(),\n evidenceWindowEnd: z.string().min(8).optional(),\n refs: z.array(z.string()).optional(),\n});\n\nexport type SharedFeedbackEntry = z.infer<typeof SharedFeedbackEntrySchema>;\n\nfunction safeSlug(s: string): string {\n let slug = s.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n // Trim leading/trailing dashes without ReDoS-prone anchored quantifiers\n let start = 0;\n while (start < slug.length && slug[start] === \"-\") start++;\n let end = slug.length;\n while (end > start && slug[end - 1] === \"-\") end--;\n return slug.slice(start, end).slice(0, 80) || \"output\";\n}\n\nfunction safePathSegment(s: string, label: string): string {\n if (s.length === 0) throw new Error(`${label} must not be empty`);\n if (/[\\r\\n]/.test(s)) throw new Error(`${label} must not contain line breaks`);\n const encoded = encodeURIComponent(s);\n if (encoded === \".\" || encoded === \"..\") {\n return encoded.replace(/\\./g, \"%2E\");\n }\n return encoded;\n}\n\nfunction safeDecodePathSegment(s: string): string {\n try {\n return decodeURIComponent(s);\n } catch {\n return s;\n }\n}\n\nfunction normalizeFrontmatterScalar(value: string): string {\n if (value.length >= 2 && value.startsWith('\"') && value.endsWith('\"')) {\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed === \"string\") return parsed;\n } catch {\n // Fall through to the legacy partial unescape below.\n }\n return value.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\");\n }\n if (value.length >= 2 && value.startsWith(\"'\") && value.endsWith(\"'\")) {\n return value.slice(1, -1).replace(/''/g, \"'\");\n }\n return value;\n}\n\nfunction formatFrontmatterScalar(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction readFrontmatterScalar(raw: string, key: string): string | null {\n const frontmatter = raw.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n|$)/)?.[1];\n if (!frontmatter) return null;\n for (const line of frontmatter.split(/\\r?\\n/)) {\n if (!line.startsWith(`${key}:`)) continue;\n const value = line.slice(key.length + 1).trim();\n return value ? normalizeFrontmatterScalar(value) : null;\n }\n return null;\n}\n\nfunction ymd(d: Date): string {\n return d.toISOString().slice(0, 10);\n}\n\nfunction safeDateSegment(date: string): string {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) {\n throw new Error(`Invalid shared-context date: ${JSON.stringify(date)}; expected YYYY-MM-DD`);\n }\n const parsed = new Date(`${date}T00:00:00.000Z`);\n if (!Number.isFinite(parsed.getTime()) || parsed.toISOString().slice(0, 10) !== date) {\n throw new Error(`Invalid shared-context date: ${JSON.stringify(date)}; expected a real calendar date`);\n }\n return date;\n}\n\nconst CROSS_SIGNAL_STOPWORDS = new Set([\n \"a\",\n \"an\",\n \"and\",\n \"are\",\n \"as\",\n \"at\",\n \"be\",\n \"by\",\n \"for\",\n \"from\",\n \"has\",\n \"have\",\n \"in\",\n \"is\",\n \"it\",\n \"of\",\n \"on\",\n \"or\",\n \"that\",\n \"the\",\n \"this\",\n \"to\",\n \"was\",\n \"were\",\n \"with\",\n \"agent\",\n \"output\",\n \"today\",\n \"daily\",\n \"notes\",\n \"note\",\n \"summary\",\n]);\n\nfunction extractTopicTokens(text: string, maxTokens: number = 12): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n const tokens = text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .split(/\\s+/)\n .map((token) => token.trim())\n .filter((token) => token.length >= 4)\n .filter((token) => !CROSS_SIGNAL_STOPWORDS.has(token));\n\n for (const token of tokens) {\n if (seen.has(token)) continue;\n seen.add(token);\n out.push(token);\n if (out.length >= maxTokens) break;\n }\n return out;\n}\n\nfunction stripYamlFrontmatter(text: string): string {\n if (!text.startsWith(\"---\\n\")) return text;\n const closing = text.indexOf(\"\\n---\\n\", 4);\n if (closing === -1) return text;\n return text.slice(closing + 5);\n}\n\nfunction semanticRoot(token: string): string {\n let root = token.toLowerCase();\n if (root.endsWith(\"izations\") && root.length > 9) {\n root = `${root.slice(0, -8)}ize`;\n }\n else if (root.endsWith(\"ization\") && root.length > 8) {\n root = `${root.slice(0, -7)}ize`;\n } else if (root.endsWith(\"isations\") && root.length > 9) {\n root = `${root.slice(0, -8)}ise`;\n } else if (root.endsWith(\"isation\") && root.length > 8) {\n root = `${root.slice(0, -7)}ise`;\n } else {\n const suffixes = [\n \"ations\",\n \"ation\",\n \"ments\",\n \"ment\",\n \"ingly\",\n \"edly\",\n \"ings\",\n \"ing\",\n \"ers\",\n \"er\",\n \"ies\",\n \"ied\",\n \"ions\",\n \"ion\",\n \"es\",\n \"ed\",\n \"s\",\n ];\n for (const suffix of suffixes) {\n if (root.length > suffix.length + 3 && root.endsWith(suffix)) {\n root = root.slice(0, -suffix.length);\n break;\n }\n }\n }\n if (root.length > 4 && root.endsWith(\"e\")) {\n root = root.slice(0, -1);\n }\n return root;\n}\n\nfunction mergeOverlaps(\n base: SharedCrossSignalOverlap[],\n extra: SharedCrossSignalOverlap[],\n): SharedCrossSignalOverlap[] {\n const merged = new Map<string, { agents: Set<string>; sourcePaths: Set<string> }>();\n for (const entry of [...base, ...extra]) {\n const existing = merged.get(entry.token);\n if (existing) {\n for (const agent of entry.agents) existing.agents.add(agent);\n for (const sourcePath of entry.sourcePaths) existing.sourcePaths.add(sourcePath);\n } else {\n merged.set(entry.token, {\n agents: new Set(entry.agents),\n sourcePaths: new Set(entry.sourcePaths),\n });\n }\n }\n return [...merged.entries()]\n .map(([token, value]) => ({\n token,\n agents: [...value.agents].sort(),\n sourcePaths: [...value.sourcePaths].sort(),\n agentCount: value.agents.size,\n }))\n .filter((entry) => entry.agentCount >= 2)\n .sort((a, b) => b.agentCount - a.agentCount || a.token.localeCompare(b.token));\n}\n\nasync function computeSemanticOverlapCandidates(\n sources: SharedCrossSignalSource[],\n maxCandidates: number,\n timeoutAtMs: number,\n): Promise<{ overlaps: SharedCrossSignalOverlap[]; candidateCount: number; timedOut: boolean }> {\n const tokenRows: Array<{ token: string; agent: string; path: string }> = [];\n for (const source of sources) {\n for (const token of source.topics) {\n if (Date.now() >= timeoutAtMs) return { overlaps: [], candidateCount: tokenRows.length, timedOut: true };\n await new Promise<void>((resolve) => setImmediate(resolve));\n tokenRows.push({ token, agent: source.agent, path: source.path });\n if (tokenRows.length >= maxCandidates) break;\n }\n if (tokenRows.length >= maxCandidates) break;\n }\n\n const byRoot = new Map<string, Map<string, { agents: Set<string>; paths: Set<string> }>>();\n for (const row of tokenRows) {\n if (Date.now() >= timeoutAtMs) return { overlaps: [], candidateCount: tokenRows.length, timedOut: true };\n await new Promise<void>((resolve) => setImmediate(resolve));\n const root = semanticRoot(row.token);\n if (root.length < 4) continue;\n const rootGroup = byRoot.get(root) ?? new Map<string, { agents: Set<string>; paths: Set<string> }>();\n const tokenGroup = rootGroup.get(row.token) ?? { agents: new Set<string>(), paths: new Set<string>() };\n tokenGroup.agents.add(row.agent);\n tokenGroup.paths.add(row.path);\n rootGroup.set(row.token, tokenGroup);\n byRoot.set(root, rootGroup);\n }\n\n const overlaps: SharedCrossSignalOverlap[] = [];\n for (const [root, tokenMap] of byRoot.entries()) {\n if (Date.now() >= timeoutAtMs) return { overlaps: [], candidateCount: tokenRows.length, timedOut: true };\n await new Promise<void>((resolve) => setImmediate(resolve));\n if (tokenMap.size < 2) continue;\n const agents = new Set<string>();\n const sourcePaths = new Set<string>();\n for (const value of tokenMap.values()) {\n for (const agent of value.agents) agents.add(agent);\n for (const sourcePath of value.paths) sourcePaths.add(sourcePath);\n }\n if (agents.size < 2) continue;\n overlaps.push({\n token: `semantic:${root}`,\n agents: [...agents].sort(),\n sourcePaths: [...sourcePaths].sort(),\n agentCount: agents.size,\n });\n }\n\n overlaps.sort((a, b) => b.agentCount - a.agentCount || a.token.localeCompare(b.token));\n return {\n overlaps,\n candidateCount: tokenRows.length,\n timedOut: false,\n };\n}\n\nasync function computeSemanticOverlapsWithTimeout(\n sources: SharedCrossSignalSource[],\n timeoutMs: number,\n maxCandidates: number,\n): Promise<{ overlaps: SharedCrossSignalOverlap[]; candidateCount: number; timedOut: boolean }> {\n const safeTimeoutMs = Math.max(1, Math.floor(timeoutMs));\n const safeMaxCandidates = Math.max(0, Math.floor(maxCandidates));\n if (safeMaxCandidates === 0 || sources.length === 0) {\n return { overlaps: [], candidateCount: 0, timedOut: false };\n }\n const timeoutAtMs = Date.now() + safeTimeoutMs;\n return computeSemanticOverlapCandidates(sources, safeMaxCandidates, timeoutAtMs);\n}\n\ninterface SharedCrossSignalSource {\n agent: string;\n path: string;\n title: string;\n topics: string[];\n /** Resolved least-privilege authority from the item's envelope (issue #1957). */\n authority: SharedAuthority;\n /** Envelope origin agent id; legacy items fall back to the agent field. */\n sharedBy: string;\n}\n\ninterface SharedCrossSignalOverlap {\n token: string;\n agents: string[];\n sourcePaths: string[];\n agentCount: number;\n}\n\ninterface SharedCrossSignalReport {\n date: string;\n generatedAt: string;\n sourceCount: number;\n feedbackCount: number;\n feedbackByDecision: Record<\"approved\" | \"approved_with_feedback\" | \"rejected\", number>;\n feedbackEntries: SharedFeedbackEntry[];\n sources: SharedCrossSignalSource[];\n overlaps: SharedCrossSignalOverlap[];\n /** Control 2 (issue #1957): expiry drops and supersession circulation. */\n staleness: {\n expiredDropped: number;\n supersededStillCirculating: string[];\n };\n /** Control 3 (issue #1957): refs two agents ruled on differently. */\n disputed: Array<{ ref: string; agents: string[]; decisions: string[] }>;\n /** Control 4 (issue #1957): who synthesized this report and when. */\n provenance: { actor: string; at: string };\n semantic: {\n enabled: boolean;\n applied: boolean;\n timedOut: boolean;\n candidateCount: number;\n maxCandidates: number;\n addedOverlapCount: number;\n };\n}\n\nexport interface SharedCrossSignalSynthesisResult {\n date: string;\n crossSignalsPath: string;\n crossSignalsMarkdownPath: string;\n overlapCount: number;\n report: SharedCrossSignalReport;\n}\n\nexport interface SharedDailyCurationResult {\n date: string;\n roundtablePath: string;\n crossSignalsPath: string;\n crossSignalsMarkdownPath: string;\n overlapCount: number;\n}\n\nfunction feedbackDecisionPriority(decision: SharedFeedbackEntry[\"decision\"]): number {\n switch (decision) {\n case \"rejected\":\n return 3;\n case \"approved_with_feedback\":\n return 2;\n case \"approved\":\n return 1;\n }\n}\n\nfunction feedbackSeverityPriority(severity: SharedFeedbackEntry[\"severity\"]): number {\n switch (severity) {\n case \"high\":\n return 3;\n case \"medium\":\n return 2;\n case \"low\":\n return 1;\n default:\n return 0;\n }\n}\n\nfunction compareFeedbackPriority(a: SharedFeedbackEntry, b: SharedFeedbackEntry): number {\n return (\n feedbackDecisionPriority(b.decision) - feedbackDecisionPriority(a.decision)\n || feedbackSeverityPriority(b.severity) - feedbackSeverityPriority(a.severity)\n || a.date.localeCompare(b.date)\n );\n}\n\nfunction markdownLineText(value: string): string {\n return value.replace(/[\\r\\n]+/g, \" \").replace(/\\s+/g, \" \").trim();\n}\n\nfunction markdownLineList(values: readonly string[]): string {\n return values.map(markdownLineText).filter(Boolean).join(\", \");\n}\n\nfunction formatFeedbackLine(entry: SharedFeedbackEntry): string {\n const extras: string[] = [`feedback: ${markdownLineText(entry.date)}`];\n if (entry.severity) extras.push(`severity: ${markdownLineText(entry.severity)}`);\n if (entry.refs?.length) extras.push(`refs: ${markdownLineList(entry.refs)}`);\n return `- [${markdownLineText(entry.agent)}] ${entry.decision}: ${markdownLineText(entry.reason)} [${extras.join(\"; \")}]`;\n}\n\nfunction formatOverlapLine(entry: SharedCrossSignalOverlap): string {\n return `- \\`${entry.token}\\` (${entry.agentCount} agents: ${markdownLineList(entry.agents)}) [sources: ${markdownLineList(entry.sourcePaths)}]`;\n}\n\nfunction formatStalenessLines(report: SharedCrossSignalReport): string[] {\n const circulating = report.staleness.supersededStillCirculating;\n return [\n `- Expired items dropped: ${report.staleness.expiredDropped}`,\n circulating.length === 0\n ? \"- Superseded items still circulating: 0\"\n : `- Superseded items still circulating: ${circulating.length} (${markdownLineList(circulating)})`,\n ];\n}\n\nfunction formatDisputedLines(report: SharedCrossSignalReport): string[] {\n if (report.disputed.length === 0) return [\"- No contradictory agent judgments recorded.\"];\n return report.disputed.map((entry) =>\n `- \\`${entry.ref}\\` disputed by ${markdownLineList(entry.agents)} (decisions: ${markdownLineList(entry.decisions)})`\n );\n}\n\nasync function writeFileAtomic(filePath: string, content: string): Promise<void> {\n await mkdir(path.dirname(filePath), { recursive: true });\n const tempPath = path.join(\n path.dirname(filePath),\n `.${path.basename(filePath)}.${process.pid}.${randomUUID()}.tmp`,\n );\n try {\n await writeFile(tempPath, content, { encoding: \"utf-8\", flag: \"wx\" });\n await rename(tempPath, filePath);\n } catch (error) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nexport function resolveSharedContextDir(config: PluginConfig): string {\n return typeof config.sharedContextDir === \"string\" && config.sharedContextDir.length > 0\n ? expandTildePath(config.sharedContextDir)\n : path.join(expandTildePath(config.workspaceDir), \"shared-context\");\n}\n\nexport class SharedContextManager {\n readonly dir: string;\n private readonly prioritiesPath: string;\n private readonly prioritiesInboxPath: string;\n private readonly outputsDir: string;\n private readonly roundtableDir: string;\n private readonly feedbackDir: string;\n private readonly feedbackInboxPath: string;\n private readonly crossSignalsDir: string;\n private readonly allowBindingAuthority: boolean;\n private readonly dailySynthesisChains = new Map<string, Promise<void>>();\n\n constructor(private readonly config: PluginConfig) {\n const base = resolveSharedContextDir(config);\n\n this.dir = base;\n this.prioritiesPath = path.join(base, \"priorities.md\");\n this.prioritiesInboxPath = path.join(base, \"priorities.inbox.md\");\n this.outputsDir = path.join(base, \"agent-outputs\");\n this.roundtableDir = path.join(base, \"roundtable\");\n this.feedbackDir = path.join(base, \"feedback\");\n this.feedbackInboxPath = path.join(this.feedbackDir, \"inbox.jsonl\");\n this.crossSignalsDir = path.join(base, \"cross-signals\");\n this.allowBindingAuthority = config.sharedContextAllowBindingAuthority === true;\n }\n\n async ensureStructure(): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n await mkdir(this.outputsDir, { recursive: true });\n await mkdir(this.roundtableDir, { recursive: true });\n await mkdir(this.feedbackDir, { recursive: true });\n await mkdir(this.crossSignalsDir, { recursive: true });\n await mkdir(path.join(this.dir, \"staging\"), { recursive: true });\n await mkdir(path.join(this.dir, \"kpis\"), { recursive: true });\n await mkdir(path.join(this.dir, \"calendar\"), { recursive: true });\n await mkdir(path.join(this.dir, \"content-calendar\"), { recursive: true });\n\n // Bootstrap files if missing.\n await this.ensureFile(\n this.prioritiesPath,\n [\n \"# Priorities\",\n \"\",\n \"This is the shared priority stack. Agents should read this before acting.\",\n \"\",\n \"## Current\",\n \"- (empty)\",\n \"\",\n \"## Notes\",\n \"- (empty)\",\n \"\",\n ].join(\"\\n\"),\n );\n await this.ensureFile(\n this.prioritiesInboxPath,\n [\n \"# Priorities Inbox\",\n \"\",\n \"Append-only inbox. Curator merges into priorities.md.\",\n \"\",\n ].join(\"\\n\"),\n );\n await this.ensureFile(this.feedbackInboxPath, \"\");\n }\n\n private async ensureFile(fp: string, content: string): Promise<void> {\n try {\n await stat(fp);\n } catch {\n await writeFile(fp, content, \"utf-8\");\n }\n }\n\n async readPriorities(signal?: AbortSignal): Promise<string> {\n throwIfAborted(signal, \"shared context priorities read aborted\");\n try {\n const content = await readFile(this.prioritiesPath, { encoding: \"utf-8\", signal });\n throwIfAborted(signal, \"shared context priorities read aborted\");\n return content;\n } catch {\n throwIfAborted(signal, \"shared context priorities read aborted\");\n return \"\";\n }\n }\n\n async readLatestRoundtable(signal?: AbortSignal): Promise<string> {\n throwIfAborted(signal, \"shared context roundtable read aborted\");\n try {\n const files = (await readdir(this.roundtableDir))\n .filter((f) => f.endsWith(\".md\"))\n .sort()\n .reverse();\n throwIfAborted(signal, \"shared context roundtable read aborted\");\n const fp = files[0] ? path.join(this.roundtableDir, files[0]) : null;\n if (!fp) return \"\";\n const content = await readFile(fp, { encoding: \"utf-8\", signal });\n throwIfAborted(signal, \"shared context roundtable read aborted\");\n return content;\n } catch {\n throwIfAborted(signal, \"shared context roundtable read aborted\");\n return \"\";\n }\n }\n\n async readLatestCrossSignals(signal?: AbortSignal): Promise<string> {\n throwIfAborted(signal, \"shared context cross-signals read aborted\");\n try {\n const files = (await readdir(this.crossSignalsDir))\n .filter((f) => f.endsWith(\".md\"))\n .sort()\n .reverse();\n throwIfAborted(signal, \"shared context cross-signals read aborted\");\n const fp = files[0] ? path.join(this.crossSignalsDir, files[0]) : null;\n if (!fp) return \"\";\n const content = await readFile(fp, { encoding: \"utf-8\", signal });\n throwIfAborted(signal, \"shared context cross-signals read aborted\");\n return content;\n } catch {\n throwIfAborted(signal, \"shared context cross-signals read aborted\");\n return \"\";\n }\n }\n\n async writeAgentOutput(opts: {\n agentId: string;\n title: string;\n content: string;\n createdAt?: Date;\n /** Envelope authority class (issue #1957). Unrecognized values throw. */\n authority?: string;\n /** Optional ISO-8601 expiry stamped on the item. */\n expiresAt?: string;\n /** Optional id of the shared item this output supersedes. */\n supersedes?: string;\n /**\n * Server-resolved identity of the caller, supplied by the access\n * surface (issue #1957 review). When present it IS both the producer\n * and the envelope origin; a disagreeing caller-supplied `agentId` is\n * rejected so no caller can publish as another agent.\n */\n authenticatedIdentity?: string;\n /**\n * Server-owned origin token for a write that crosses an external\n * boundary but resolved no identity (issue #1957 review round 4).\n * Stamped as the envelope origin (`sharedBy`); the caller label stays\n * the producer so grouping never collapses.\n */\n unattributedOrigin?: string;\n }): Promise<string> {\n const identity = resolveWriteOrigin({\n agentId: opts.agentId,\n authenticatedIdentity: opts.authenticatedIdentity,\n unattributedOrigin: opts.unattributedOrigin,\n });\n const createdAt = opts.createdAt ?? new Date();\n const date = ymd(createdAt);\n const time = createdAt.toISOString().slice(11, 19).replace(/:/g, \"\");\n const slug = safeSlug(opts.title);\n const agentPathSegment = safePathSegment(identity.agent, \"agentId\");\n\n const envelope = composeWriteEnvelope({\n origin: identity.origin,\n authority: opts.authority,\n expiresAt: opts.expiresAt,\n supersedes: opts.supersedes,\n allowBinding: this.allowBindingAuthority,\n nowMs: createdAt.getTime(),\n });\n\n const dir = path.join(this.outputsDir, agentPathSegment, date);\n await mkdir(dir, { recursive: true });\n\n const body = [\n \"---\",\n \"kind: agent_output\",\n `agent: ${formatFrontmatterScalar(identity.agent)}`,\n `createdAt: ${createdAt.toISOString()}`,\n `title: ${formatFrontmatterScalar(opts.title.replace(/\\n/g, \" \").slice(0, 200))}`,\n ...envelopeToFrontmatterLines(envelope),\n \"---\",\n \"\",\n opts.content.trimEnd(),\n \"\",\n ].join(\"\\n\");\n\n for (let attempt = 0; attempt < 100; attempt++) {\n const suffix = attempt === 0 ? \"\" : `-${attempt + 1}`;\n const fp = path.join(dir, `${time}-${slug}${suffix}.md`);\n try {\n await writeFile(fp, body, { encoding: \"utf-8\", flag: \"wx\" });\n return fp;\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"EEXIST\") continue;\n throw error;\n }\n }\n\n throw new Error(`Unable to allocate unique shared-context output path for ${identity.agent}`);\n }\n\n async appendFeedback(entry: SharedFeedbackEntry): Promise<void> {\n const parsed = SharedFeedbackEntrySchema.parse(entry);\n await appendFile(this.feedbackInboxPath, JSON.stringify(parsed) + \"\\n\", \"utf-8\");\n }\n\n async appendPrioritiesInbox(opts: { agentId: string; text: string }): Promise<void> {\n const stamp = new Date().toISOString();\n const lines = [\n \"\",\n `## ${stamp} (${opts.agentId})`,\n \"\",\n opts.text.trimEnd(),\n \"\",\n ].join(\"\\n\");\n await appendFile(this.prioritiesInboxPath, lines, \"utf-8\");\n }\n\n private async withDailySynthesisLock<T>(date: string, fn: () => Promise<T>): Promise<T> {\n const previous = this.dailySynthesisChains.get(date) ?? Promise.resolve();\n let releaseCurrent!: () => void;\n const current = new Promise<void>((resolve) => {\n releaseCurrent = resolve;\n });\n const queued = previous.catch(() => undefined).then(() => current);\n this.dailySynthesisChains.set(date, queued);\n await previous.catch(() => undefined);\n try {\n return await fn();\n } finally {\n releaseCurrent();\n if (this.dailySynthesisChains.get(date) === queued) {\n this.dailySynthesisChains.delete(date);\n }\n }\n }\n\n async synthesizeCrossSignals(opts: {\n date?: string;\n maxSummaryItems?: number;\n }): Promise<SharedCrossSignalSynthesisResult> {\n const date = safeDateSegment(opts.date ?? ymd(new Date()));\n return this.withDailySynthesisLock(date, () => this.synthesizeCrossSignalsUnlocked({\n date,\n maxSummaryItems: opts.maxSummaryItems,\n }));\n }\n\n private async synthesizeCrossSignalsUnlocked(opts: {\n date: string;\n maxSummaryItems?: number;\n }): Promise<SharedCrossSignalSynthesisResult> {\n const date = opts.date;\n const maxSummaryItems = Math.max(1, opts.maxSummaryItems ?? 8);\n\n // Collect outputs for the day (best-effort).\n const outputs: Array<{ agent: string; path: string; title: string; raw: string; envelope: SharedEnvelope }> = [];\n try {\n const agents = (await readdir(this.outputsDir, { withFileTypes: true }))\n .sort((a, b) => a.name.localeCompare(b.name));\n for (const a of agents) {\n if (!a.isDirectory()) continue;\n const dayDir = path.join(this.outputsDir, a.name, date);\n try {\n const files = (await readdir(dayDir)).filter((f) => f.endsWith(\".md\")).sort();\n for (const f of files) {\n const p = path.join(dayDir, f);\n const raw = await readFile(p, \"utf-8\");\n const title = readFrontmatterScalar(raw, \"title\") ?? f;\n const agent = readFrontmatterScalar(raw, \"agent\") ?? safeDecodePathSegment(a.name);\n const envelope = envelopeFromScalars({\n sharedBy: readFrontmatterScalar(raw, \"sharedBy\"),\n authority: readFrontmatterScalar(raw, \"authority\"),\n expiresAt: readFrontmatterScalar(raw, \"expiresAt\"),\n supersedes: readFrontmatterScalar(raw, \"supersedes\"),\n });\n outputs.push({ agent, path: p, title, raw, envelope });\n }\n } catch {\n // no outputs for this agent/date\n }\n }\n } catch {\n // ignore\n }\n outputs.sort(\n (a, b) =>\n a.agent.localeCompare(b.agent)\n || a.path.localeCompare(b.path)\n || a.title.localeCompare(b.title),\n );\n\n // Control 2 (issue #1957): expired items never enter the working set;\n // items another live item supersedes are marked while they circulate.\n const liveOutputs = filterLiveEnvelopes(\n outputs.map((output) => ({ output, expiresAt: output.envelope.expiresAt })),\n Date.now(),\n ).map((entry) => entry.output);\n const expiredDropped = outputs.length - liveOutputs.length;\n const supersededStillCirculating = markSupersededCirculation(\n liveOutputs.map((output) => ({ id: output.path, supersedes: output.envelope.supersedes })),\n )\n .filter((item) => item.circulating === true)\n .map((item) => item.id)\n .sort();\n\n // Collect feedback entries for the day.\n const feedback: SharedFeedbackEntry[] = [];\n try {\n const raw = await readFile(this.feedbackInboxPath, \"utf-8\");\n for (const line of raw.split(\"\\n\")) {\n if (!line.trim()) continue;\n try {\n const obj = JSON.parse(line);\n const parsed = SharedFeedbackEntrySchema.safeParse(obj);\n if (!parsed.success) continue;\n if (String(parsed.data.date).startsWith(date)) feedback.push(parsed.data);\n } catch {\n // ignore\n }\n }\n } catch {\n // ignore\n }\n\n const sources: SharedCrossSignalSource[] = liveOutputs.map((output) => {\n const body = stripYamlFrontmatter(output.raw);\n return {\n agent: output.agent,\n path: output.path,\n title: output.title,\n topics: extractTopicTokens(`${output.title}\\n${body}`),\n authority: resolveReadAuthority(output.envelope, this.allowBindingAuthority),\n sharedBy: output.envelope.sharedBy ?? output.agent,\n };\n });\n\n const overlapMap = new Map<string, { agents: Set<string>; sourcePaths: Set<string> }>();\n for (const source of sources) {\n for (const token of source.topics) {\n const existing = overlapMap.get(token);\n if (existing) {\n existing.agents.add(source.agent);\n existing.sourcePaths.add(source.path);\n } else {\n overlapMap.set(token, {\n agents: new Set([source.agent]),\n sourcePaths: new Set([source.path]),\n });\n }\n }\n }\n\n const overlaps: SharedCrossSignalOverlap[] = [...overlapMap.entries()]\n .map(([token, v]) => ({\n token,\n agents: [...v.agents].sort(),\n sourcePaths: [...v.sourcePaths].sort(),\n agentCount: v.agents.size,\n }))\n .filter((entry) => entry.agentCount >= 2)\n .sort((a, b) => b.agentCount - a.agentCount || a.token.localeCompare(b.token));\n\n const semanticEnabled =\n resolveConversationContextCapabilities(this.config).sharedCrossSignalSemantic === true\n || resolveConversationContextCapabilities(this.config).crossSignalsSemantic === true;\n const semanticTimeoutMs =\n this.config.sharedCrossSignalSemanticTimeoutMs\n ?? this.config.crossSignalsSemanticTimeoutMs\n ?? 4000;\n const semanticMaxCandidates = this.config.sharedCrossSignalSemanticMaxCandidates ?? 120;\n let semanticApplied = false;\n let semanticTimedOut = false;\n let semanticCandidateCount = 0;\n let semanticAddedOverlapCount = 0;\n let mergedOverlaps = overlaps;\n if (semanticEnabled) {\n try {\n const semanticResult = await computeSemanticOverlapsWithTimeout(\n sources,\n semanticTimeoutMs,\n semanticMaxCandidates,\n );\n semanticTimedOut = semanticResult.timedOut;\n semanticCandidateCount = semanticResult.candidateCount;\n if (!semanticResult.timedOut && semanticResult.overlaps.length > 0) {\n mergedOverlaps = mergeOverlaps(overlaps, semanticResult.overlaps);\n semanticAddedOverlapCount = Math.max(0, mergedOverlaps.length - overlaps.length);\n semanticApplied = semanticAddedOverlapCount > 0;\n }\n } catch (err) {\n log.warn(`shared-context semantic cross-signals failed; fail-open to deterministic output: ${err}`);\n }\n }\n\n const feedbackByDecision: SharedCrossSignalReport[\"feedbackByDecision\"] = {\n approved: 0,\n approved_with_feedback: 0,\n rejected: 0,\n };\n for (const entry of feedback) {\n feedbackByDecision[entry.decision] += 1;\n }\n\n // Control 3 (issue #1957): feedback refs are claim keys; two agents\n // ruling differently on the same ref surface as disputed, never silently\n // averaged. Pairwise scan is bounded by one day's feedback entries.\n const claimItems = feedback.map((entry, index) => ({\n id: `${entry.agent}#${index}`,\n claims: Object.fromEntries((entry.refs ?? []).map((ref) => [ref, entry.decision])),\n }));\n const disputedByRef = new Map<string, { agents: Set<string>; decisions: Set<string> }>();\n for (let i = 0; i < claimItems.length; i++) {\n for (let j = i + 1; j < claimItems.length; j++) {\n const pair = detectContradictionPair(claimItems[i]!, claimItems[j]!);\n if (pair.kind !== \"conflict\") continue;\n for (const ref of pair.keys) {\n const slot = disputedByRef.get(ref) ?? { agents: new Set<string>(), decisions: new Set<string>() };\n slot.agents.add(feedback[i]!.agent);\n slot.agents.add(feedback[j]!.agent);\n slot.decisions.add(feedback[i]!.decision);\n slot.decisions.add(feedback[j]!.decision);\n disputedByRef.set(ref, slot);\n }\n }\n }\n const disputed = [...disputedByRef.entries()]\n .map(([ref, slot]) => ({ ref, agents: [...slot.agents].sort(), decisions: [...slot.decisions].sort() }))\n .sort((a, b) => a.ref.localeCompare(b.ref));\n\n const generatedAt = new Date().toISOString();\n const baseReport = {\n date,\n generatedAt,\n sourceCount: sources.length,\n feedbackCount: feedback.length,\n feedbackByDecision,\n feedbackEntries: [...feedback].sort(compareFeedbackPriority),\n sources,\n overlaps: mergedOverlaps,\n staleness: { expiredDropped, supersededStillCirculating },\n disputed,\n semantic: {\n enabled: semanticEnabled,\n applied: semanticApplied,\n timedOut: semanticTimedOut,\n candidateCount: semanticCandidateCount,\n maxCandidates: Math.max(0, Math.floor(semanticMaxCandidates)),\n addedOverlapCount: semanticAddedOverlapCount,\n },\n };\n // Control 4 (issue #1957): stamp who synthesized the report and when.\n const report = stampProvenance(baseReport, { actor: \"shared-context:curation\", at: generatedAt });\n\n const crossSignalsPath = path.join(this.crossSignalsDir, `${date}.json`);\n await writeFileAtomic(crossSignalsPath, `${JSON.stringify(report, null, 2)}\\n`);\n\n const recurringThemeLines = mergedOverlaps.length === 0\n ? [\"- No multi-agent topic overlap detected.\"]\n : mergedOverlaps.slice(0, maxSummaryItems).map((entry) => formatOverlapLine(entry));\n const riskSignals = [...feedback]\n .filter((entry) => entry.decision !== \"approved\" || entry.severity === \"high\" || entry.severity === \"medium\")\n .sort(compareFeedbackPriority)\n .slice(0, maxSummaryItems);\n const riskLines = riskSignals.length === 0\n ? [\"- No explicit blockers or elevated review risks recorded.\"]\n : riskSignals.map((entry) => formatFeedbackLine(entry));\n const promotionCandidates = mergedOverlaps\n .filter((entry) => entry.agentCount >= 3)\n .slice(0, maxSummaryItems);\n const promotionLines = promotionCandidates.length === 0\n ? [\"- No promotion candidates yet.\"]\n : promotionCandidates.map((entry) =>\n `- Consider promoting \\`${entry.token}\\` into priorities or operating rules [sources: ${markdownLineList(entry.sourcePaths)}]`\n );\n\n const crossSignalsMarkdown = [\n `# Cross-Signals — ${date}`,\n \"\",\n \"## Overview\",\n `- Source outputs analyzed: ${sources.length}`,\n `- Feedback entries analyzed: ${feedback.length}`,\n `- Decision totals: approved=${feedbackByDecision.approved}, approved_with_feedback=${feedbackByDecision.approved_with_feedback}, rejected=${feedbackByDecision.rejected}`,\n `- Semantic enhancer: ${semanticEnabled ? (semanticTimedOut ? \"enabled (timed out, fail-open)\" : semanticApplied ? \"enabled (applied)\" : \"enabled (no additional overlaps)\") : \"disabled\"}`,\n `- JSON report: ${crossSignalsPath}`,\n \"\",\n \"## Staleness\",\n ...formatStalenessLines(report),\n \"\",\n \"## Disputed\",\n ...formatDisputedLines(report),\n \"\",\n \"## Recurring Themes\",\n ...recurringThemeLines,\n \"\",\n \"## Risks And Blockers\",\n ...riskLines,\n \"\",\n \"## Potential Promotions\",\n ...promotionLines,\n \"\",\n \"## Sources\",\n ...(sources.length === 0 ? [\"- (none)\"] : sources.map((source) =>\n `- [${markdownLineText(source.agent)}] ${markdownLineText(source.title)} (${markdownLineText(source.path)}) [authority: ${source.authority}; sharedBy: ${markdownLineText(source.sharedBy)}]`\n )),\n \"\",\n ].join(\"\\n\");\n\n const crossSignalsMarkdownPath = path.join(this.crossSignalsDir, `${date}.md`);\n await writeFileAtomic(crossSignalsMarkdownPath, crossSignalsMarkdown);\n\n return {\n date,\n crossSignalsPath,\n crossSignalsMarkdownPath,\n overlapCount: mergedOverlaps.length,\n report,\n };\n }\n\n async curateDaily(opts: { date?: string; maxChars?: number }): Promise<SharedDailyCurationResult> {\n const date = safeDateSegment(opts.date ?? ymd(new Date()));\n return this.withDailySynthesisLock(date, () => this.curateDailyUnlocked({ ...opts, date }));\n }\n\n private async curateDailyUnlocked(opts: { date: string; maxChars?: number }): Promise<SharedDailyCurationResult> {\n const date = opts.date;\n const maxChars = Math.max(2_000, opts.maxChars ?? 20_000);\n const crossSignals = await this.synthesizeCrossSignalsUnlocked({ date });\n // Control 4 (issue #1957): every synthesized claim must cite at least one\n // item this run actually had. Overlaps are built from sources, so this is\n // a tripwire — it fires only if a synthesized section stops citing.\n const lintFindings = lintCuratedClaims({\n claims: crossSignals.report.overlaps.map((overlap) => ({\n claimId: `overlap:${overlap.token}`,\n citedItemIds: overlap.sourcePaths,\n })),\n availableItemIds: crossSignals.report.sources.map((source) => source.path),\n });\n if (lintFindings.length > 0) {\n throw new Error(`shared-context curation self-check failed: ${JSON.stringify(lintFindings)}`);\n }\n const feedbackLines = crossSignals.report.feedbackEntries.length === 0\n ? [\"- (none)\"]\n : crossSignals.report.feedbackEntries.map((entry) => formatFeedbackLine(entry));\n const overlapBullets = crossSignals.report.overlaps.length === 0\n ? [\"- No multi-agent topic overlap detected.\"]\n : crossSignals.report.overlaps.slice(0, 8).map((entry) => formatOverlapLine(entry));\n\n const md: string[] = [\n `# Roundtable — ${date}`,\n \"\",\n \"## Notable Agent Outputs\",\n ...(crossSignals.report.sources.length === 0\n ? [\"- (none)\"]\n : crossSignals.report.sources.map((source) =>\n `- ${markdownLineText(source.title)} (${markdownLineText(source.path)}) [authority: ${source.authority}; sharedBy: ${markdownLineText(source.sharedBy)}]`)),\n \"\",\n \"## Feedback (Approve/Reject)\",\n ...feedbackLines,\n \"\",\n \"## Cross-Signals\",\n `- Source outputs analyzed: ${crossSignals.report.sourceCount}`,\n `- Feedback entries analyzed: ${crossSignals.report.feedbackCount}`,\n `- Decision totals: approved=${crossSignals.report.feedbackByDecision.approved}, approved_with_feedback=${crossSignals.report.feedbackByDecision.approved_with_feedback}, rejected=${crossSignals.report.feedbackByDecision.rejected}`,\n `- Semantic enhancer: ${crossSignals.report.semantic.enabled ? (crossSignals.report.semantic.timedOut ? \"enabled (timed out, fail-open)\" : crossSignals.report.semantic.applied ? \"enabled (applied)\" : \"enabled (no additional overlaps)\") : \"disabled\"}`,\n `- Cross-signals JSON: ${crossSignals.crossSignalsPath}`,\n `- Cross-signals markdown: ${crossSignals.crossSignalsMarkdownPath}`,\n ...overlapBullets,\n \"\",\n \"## Staleness\",\n ...formatStalenessLines(crossSignals.report),\n \"\",\n \"## Disputed\",\n ...formatDisputedLines(crossSignals.report),\n \"\",\n ];\n\n\n const out = md.join(\"\\n\");\n const trimmed = out.length > maxChars ? out.slice(0, maxChars) + \"\\n\\n...(trimmed)\\n\" : out;\n\n const roundtablePath = path.join(this.roundtableDir, `${date}.md`);\n await writeFileAtomic(roundtablePath, trimmed);\n\n log.info(`shared-context curated daily roundtable: ${roundtablePath}`);\n return {\n date,\n roundtablePath,\n crossSignalsPath: crossSignals.crossSignalsPath,\n crossSignalsMarkdownPath: crossSignals.crossSignalsMarkdownPath,\n overlapCount: crossSignals.overlapCount,\n };\n }\n}\n","/**\n * Shared-item contradiction detection (issue #1957).\n *\n * Pure helper. Same-id items are one item; overlapping claim keys with\n * unequal values are a conflict. No deletes, no persistence.\n */\n\nexport interface SharedClaimItem {\n id: string;\n claims: Record<string, string>;\n}\n\nexport type ContradictionPairResult =\n | { kind: \"same\" }\n | { kind: \"conflict\"; keys: string[] }\n | { kind: \"none\" };\n\nexport function detectContradictionPair(\n a: SharedClaimItem,\n b: SharedClaimItem,\n): ContradictionPairResult {\n if (a.id === b.id) {\n return { kind: \"same\" };\n }\n const keys: string[] = [];\n for (const key of Object.keys(a.claims)) {\n if (key in b.claims && a.claims[key] !== b.claims[key]) {\n keys.push(key);\n }\n }\n return keys.length > 0 ? { kind: \"conflict\", keys: keys.sort() } : { kind: \"none\" };\n}\n","/**\n * Shared-context curation self-check (issue #1957 requirement 4).\n *\n * Pure. A synthesized claim with no traceable source is a lint error:\n * report claims whose citations are missing, blank, or absent from the\n * item ids the curation run actually had available.\n */\n\nexport interface CuratedClaim {\n claimId: string;\n /** Shared-context item ids this claim was synthesized from. */\n citedItemIds?: readonly string[];\n}\n\nexport interface CurationLintFinding {\n claimId: string;\n reason: \"no_citations\" | \"unknown_citation\";\n /** Cited ids that are not in the available set. Only for unknown_citation. */\n unknownIds?: string[];\n}\n\nexport function lintCuratedClaims(input: {\n claims: readonly CuratedClaim[];\n availableItemIds: readonly string[];\n}): CurationLintFinding[] {\n const available = new Set(input.availableItemIds);\n const findings: CurationLintFinding[] = [];\n\n for (const claim of input.claims) {\n const claimId = claim.claimId;\n if (typeof claimId !== \"string\" || claimId.trim().length === 0) {\n throw new RangeError(\"claimId must be a non-blank string\");\n }\n\n const unknown = new Set<string>();\n let validCount = 0;\n for (const id of claim.citedItemIds ?? []) {\n if (id.trim().length === 0) continue;\n if (available.has(id)) {\n validCount += 1;\n } else {\n unknown.add(id);\n }\n }\n\n if (validCount === 0) {\n findings.push({ claimId, reason: \"no_citations\" });\n continue;\n }\n if (unknown.size > 0) {\n findings.push({ claimId, reason: \"unknown_citation\", unknownIds: [...unknown].sort() });\n }\n }\n\n findings.sort((a, b) => {\n if (a.claimId !== b.claimId) return a.claimId < b.claimId ? -1 : 1;\n if (a.reason !== b.reason) return a.reason < b.reason ? -1 : 1;\n // Duplicate claim ids are linted independently, so two findings can share\n // both keys above and still differ. Without this tertiary key the result\n // would depend on upstream iteration order, which the deterministic-output\n // contract forbids.\n const left = (a.unknownIds ?? []).join(\",\");\n const right = (b.unknownIds ?? []).join(\",\");\n if (left !== right) return left < right ? -1 : 1;\n return 0;\n });\n return findings;\n}\n","/**\n * Shared-item provenance stamp (issue #1957).\n *\n * First slice: stamp actor + at onto a new object. Curation wiring\n * comes later. Does not mutate the input.\n */\n\nimport { isStrictIsoInstant } from \"./iso-instant.js\";\n\nexport interface ProvenanceStamp {\n actor: string;\n at: string;\n}\n\nexport interface StampProvenanceOptions {\n actor: string;\n at: string;\n}\n\nfunction requireActor(actor: string): string {\n if (typeof actor !== \"string\" || actor.trim().length === 0) {\n throw new Error(\"stampProvenance: actor must be a non-empty string\");\n }\n return actor;\n}\n\nfunction requireAt(at: unknown): string {\n if (typeof at !== \"string\" || !isStrictIsoInstant(at)) {\n throw new Error(\"stampProvenance: at must be a valid ISO-8601 timestamp\");\n }\n return at;\n}\n\nexport function stampProvenance<T extends object>(\n item: T,\n stamp: StampProvenanceOptions,\n): T & { provenance: ProvenanceStamp } {\n return {\n ...item,\n provenance: {\n actor: requireActor(stamp.actor),\n at: requireAt(stamp.at),\n },\n };\n}\n","/**\n * Shared-item staleness (issue #1957).\n *\n * Pure helpers. Expired items drop; superseded items that still circulate\n * get a marker. Callers never `rm`.\n */\nimport { isExpired } from \"./governance.js\";\n\nexport interface SharedStalenessItem {\n id: string;\n expiresAt?: string;\n supersedes?: string;\n circulating?: boolean;\n}\n\n/** Drop expired items. Half-open: `nowMs >= expiresAt` is expired. */\nexport function filterLiveEnvelopes<T extends { expiresAt?: string }>(\n items: readonly T[],\n nowMs: number,\n): T[] {\n return items.filter((item) => !isExpired(item, nowMs));\n}\n\n/**\n * Mark items whose id appears in another item's `supersedes`.\n * Returns a new array. Does not mutate input and does not delete files.\n */\nexport function markSupersededCirculation<T extends SharedStalenessItem>(\n items: readonly T[],\n): (T & { circulating?: boolean })[] {\n const supersededIds = new Set<string>();\n for (const item of items) {\n if (item.supersedes) supersededIds.add(item.supersedes);\n }\n return items.map((item) =>\n supersededIds.has(item.id) ? { ...item, circulating: true } : item,\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,OAAO,UAAU,SAAS,YAAY,WAAW,MAAM,QAAQ,UAAU;AAClF,OAAO,UAAU;AACjB,SAAS,SAAS;;;ACcX,SAAS,wBACd,GACA,GACyB;AACzB,MAAI,EAAE,OAAO,EAAE,IAAI;AACjB,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AACA,QAAM,OAAiB,CAAC;AACxB,aAAW,OAAO,OAAO,KAAK,EAAE,MAAM,GAAG;AACvC,QAAI,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,EAAE,OAAO,GAAG,GAAG;AACtD,WAAK,KAAK,GAAG;AAAA,IACf;AAAA,EACF;AACA,SAAO,KAAK,SAAS,IAAI,EAAE,MAAM,YAAY,MAAM,KAAK,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO;AACpF;;;ACVO,SAAS,kBAAkB,OAGR;AACxB,QAAM,YAAY,IAAI,IAAI,MAAM,gBAAgB;AAChD,QAAM,WAAkC,CAAC;AAEzC,aAAW,SAAS,MAAM,QAAQ;AAChC,UAAM,UAAU,MAAM;AACtB,QAAI,OAAO,YAAY,YAAY,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC9D,YAAM,IAAI,WAAW,oCAAoC;AAAA,IAC3D;AAEA,UAAM,UAAU,oBAAI,IAAY;AAChC,QAAI,aAAa;AACjB,eAAW,MAAM,MAAM,gBAAgB,CAAC,GAAG;AACzC,UAAI,GAAG,KAAK,EAAE,WAAW,EAAG;AAC5B,UAAI,UAAU,IAAI,EAAE,GAAG;AACrB,sBAAc;AAAA,MAChB,OAAO;AACL,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,eAAe,GAAG;AACpB,eAAS,KAAK,EAAE,SAAS,QAAQ,eAAe,CAAC;AACjD;AAAA,IACF;AACA,QAAI,QAAQ,OAAO,GAAG;AACpB,eAAS,KAAK,EAAE,SAAS,QAAQ,oBAAoB,YAAY,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC;AAAA,IACxF;AAAA,EACF;AAEA,WAAS,KAAK,CAAC,GAAG,MAAM;AACtB,QAAI,EAAE,YAAY,EAAE,QAAS,QAAO,EAAE,UAAU,EAAE,UAAU,KAAK;AACjE,QAAI,EAAE,WAAW,EAAE,OAAQ,QAAO,EAAE,SAAS,EAAE,SAAS,KAAK;AAK7D,UAAM,QAAQ,EAAE,cAAc,CAAC,GAAG,KAAK,GAAG;AAC1C,UAAM,SAAS,EAAE,cAAc,CAAC,GAAG,KAAK,GAAG;AAC3C,QAAI,SAAS,MAAO,QAAO,OAAO,QAAQ,KAAK;AAC/C,WAAO;AAAA,EACT,CAAC;AACD,SAAO;AACT;;;AChDA,SAAS,aAAa,OAAuB;AAC3C,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,SAAO;AACT;AAEA,SAAS,UAAU,IAAqB;AACtC,MAAI,OAAO,OAAO,YAAY,CAAC,mBAAmB,EAAE,GAAG;AACrD,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,SAAO;AACT;AAEO,SAAS,gBACd,MACA,OACqC;AACrC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY;AAAA,MACV,OAAO,aAAa,MAAM,KAAK;AAAA,MAC/B,IAAI,UAAU,MAAM,EAAE;AAAA,IACxB;AAAA,EACF;AACF;;;AC5BO,SAAS,oBACd,OACA,OACK;AACL,SAAO,MAAM,OAAO,CAAC,SAAS,CAAC,UAAU,MAAM,KAAK,CAAC;AACvD;AAMO,SAAS,0BACd,OACmC;AACnC,QAAM,gBAAgB,oBAAI,IAAY;AACtC,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAY,eAAc,IAAI,KAAK,UAAU;AAAA,EACxD;AACA,SAAO,MAAM;AAAA,IAAI,CAAC,SAChB,cAAc,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,aAAa,KAAK,IAAI;AAAA,EAChE;AACF;;;AJfO,IAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,UAAU,EAAE,KAAK,CAAC,YAAY,0BAA0B,UAAU,CAAC;AAAA,EACnE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA;AAAA,EACtB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,UAAU,EAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,SAAS;AAAA,EACrD,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC9C,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACrC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAC1C,qBAAqB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAChD,mBAAmB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC9C,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AACrC,CAAC;AAID,SAAS,SAAS,GAAmB;AACnC,MAAI,OAAO,EAAE,YAAY,EAAE,QAAQ,eAAe,GAAG;AAErD,MAAI,QAAQ;AACZ,SAAO,QAAQ,KAAK,UAAU,KAAK,KAAK,MAAM,IAAK;AACnD,MAAI,MAAM,KAAK;AACf,SAAO,MAAM,SAAS,KAAK,MAAM,CAAC,MAAM,IAAK;AAC7C,SAAO,KAAK,MAAM,OAAO,GAAG,EAAE,MAAM,GAAG,EAAE,KAAK;AAChD;AAEA,SAAS,gBAAgB,GAAW,OAAuB;AACzD,MAAI,EAAE,WAAW,EAAG,OAAM,IAAI,MAAM,GAAG,KAAK,oBAAoB;AAChE,MAAI,SAAS,KAAK,CAAC,EAAG,OAAM,IAAI,MAAM,GAAG,KAAK,+BAA+B;AAC7E,QAAM,UAAU,mBAAmB,CAAC;AACpC,MAAI,YAAY,OAAO,YAAY,MAAM;AACvC,WAAO,QAAQ,QAAQ,OAAO,KAAK;AAAA,EACrC;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,GAAmB;AAChD,MAAI;AACF,WAAO,mBAAmB,CAAC;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,2BAA2B,OAAuB;AACzD,MAAI,MAAM,UAAU,KAAK,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AACrE,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,UAAI,OAAO,WAAW,SAAU,QAAO;AAAA,IACzC,QAAQ;AAAA,IAER;AACA,WAAO,MAAM,MAAM,GAAG,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,SAAS,IAAI;AAAA,EACtE;AACA,MAAI,MAAM,UAAU,KAAK,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AACrE,WAAO,MAAM,MAAM,GAAG,EAAE,EAAE,QAAQ,OAAO,GAAG;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAAuB;AACtD,SAAO,KAAK,UAAU,KAAK;AAC7B;AAEA,SAAS,sBAAsB,KAAa,KAA4B;AACtE,QAAM,cAAc,IAAI,MAAM,wCAAwC,IAAI,CAAC;AAC3E,MAAI,CAAC,YAAa,QAAO;AACzB,aAAW,QAAQ,YAAY,MAAM,OAAO,GAAG;AAC7C,QAAI,CAAC,KAAK,WAAW,GAAG,GAAG,GAAG,EAAG;AACjC,UAAM,QAAQ,KAAK,MAAM,IAAI,SAAS,CAAC,EAAE,KAAK;AAC9C,WAAO,QAAQ,2BAA2B,KAAK,IAAI;AAAA,EACrD;AACA,SAAO;AACT;AAEA,SAAS,IAAI,GAAiB;AAC5B,SAAO,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACpC;AAEA,SAAS,gBAAgB,MAAsB;AAC7C,MAAI,CAAC,sBAAsB,KAAK,IAAI,GAAG;AACrC,UAAM,IAAI,MAAM,gCAAgC,KAAK,UAAU,IAAI,CAAC,uBAAuB;AAAA,EAC7F;AACA,QAAM,SAAS,oBAAI,KAAK,GAAG,IAAI,gBAAgB;AAC/C,MAAI,CAAC,OAAO,SAAS,OAAO,QAAQ,CAAC,KAAK,OAAO,YAAY,EAAE,MAAM,GAAG,EAAE,MAAM,MAAM;AACpF,UAAM,IAAI,MAAM,gCAAgC,KAAK,UAAU,IAAI,CAAC,iCAAiC;AAAA,EACvG;AACA,SAAO;AACT;AAEA,IAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,mBAAmB,MAAc,YAAoB,IAAc;AAC1E,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAgB,CAAC;AACvB,QAAM,SAAS,KACZ,YAAY,EACZ,QAAQ,gBAAgB,GAAG,EAC3B,MAAM,KAAK,EACX,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,CAAC,UAAU,MAAM,UAAU,CAAC,EACnC,OAAO,CAAC,UAAU,CAAC,uBAAuB,IAAI,KAAK,CAAC;AAEvD,aAAW,SAAS,QAAQ;AAC1B,QAAI,KAAK,IAAI,KAAK,EAAG;AACrB,SAAK,IAAI,KAAK;AACd,QAAI,KAAK,KAAK;AACd,QAAI,IAAI,UAAU,UAAW;AAAA,EAC/B;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAsB;AAClD,MAAI,CAAC,KAAK,WAAW,OAAO,EAAG,QAAO;AACtC,QAAM,UAAU,KAAK,QAAQ,WAAW,CAAC;AACzC,MAAI,YAAY,GAAI,QAAO;AAC3B,SAAO,KAAK,MAAM,UAAU,CAAC;AAC/B;AAEA,SAAS,aAAa,OAAuB;AAC3C,MAAI,OAAO,MAAM,YAAY;AAC7B,MAAI,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,GAAG;AAChD,WAAO,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,EAC7B,WACS,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,GAAG;AACpD,WAAO,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,EAC7B,WAAW,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,GAAG;AACvD,WAAO,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,EAC7B,WAAW,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,GAAG;AACtD,WAAO,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,EAC7B,OAAO;AACL,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,eAAW,UAAU,UAAU;AAC7B,UAAI,KAAK,SAAS,OAAO,SAAS,KAAK,KAAK,SAAS,MAAM,GAAG;AAC5D,eAAO,KAAK,MAAM,GAAG,CAAC,OAAO,MAAM;AACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,SAAS,KAAK,KAAK,SAAS,GAAG,GAAG;AACzC,WAAO,KAAK,MAAM,GAAG,EAAE;AAAA,EACzB;AACA,SAAO;AACT;AAEA,SAAS,cACP,MACA,OAC4B;AAC5B,QAAM,SAAS,oBAAI,IAA+D;AAClF,aAAW,SAAS,CAAC,GAAG,MAAM,GAAG,KAAK,GAAG;AACvC,UAAM,WAAW,OAAO,IAAI,MAAM,KAAK;AACvC,QAAI,UAAU;AACZ,iBAAW,SAAS,MAAM,OAAQ,UAAS,OAAO,IAAI,KAAK;AAC3D,iBAAW,cAAc,MAAM,YAAa,UAAS,YAAY,IAAI,UAAU;AAAA,IACjF,OAAO;AACL,aAAO,IAAI,MAAM,OAAO;AAAA,QACtB,QAAQ,IAAI,IAAI,MAAM,MAAM;AAAA,QAC5B,aAAa,IAAI,IAAI,MAAM,WAAW;AAAA,MACxC,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO;AAAA,IACxB;AAAA,IACA,QAAQ,CAAC,GAAG,MAAM,MAAM,EAAE,KAAK;AAAA,IAC/B,aAAa,CAAC,GAAG,MAAM,WAAW,EAAE,KAAK;AAAA,IACzC,YAAY,MAAM,OAAO;AAAA,EAC3B,EAAE,EACD,OAAO,CAAC,UAAU,MAAM,cAAc,CAAC,EACvC,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AACjF;AAEA,eAAe,iCACb,SACA,eACA,aAC8F;AAC9F,QAAM,YAAmE,CAAC;AAC1E,aAAW,UAAU,SAAS;AAC5B,eAAW,SAAS,OAAO,QAAQ;AACjC,UAAI,KAAK,IAAI,KAAK,YAAa,QAAO,EAAE,UAAU,CAAC,GAAG,gBAAgB,UAAU,QAAQ,UAAU,KAAK;AACvG,YAAM,IAAI,QAAc,CAAC,YAAY,aAAa,OAAO,CAAC;AAC1D,gBAAU,KAAK,EAAE,OAAO,OAAO,OAAO,OAAO,MAAM,OAAO,KAAK,CAAC;AAChE,UAAI,UAAU,UAAU,cAAe;AAAA,IACzC;AACA,QAAI,UAAU,UAAU,cAAe;AAAA,EACzC;AAEA,QAAM,SAAS,oBAAI,IAAsE;AACzF,aAAW,OAAO,WAAW;AAC3B,QAAI,KAAK,IAAI,KAAK,YAAa,QAAO,EAAE,UAAU,CAAC,GAAG,gBAAgB,UAAU,QAAQ,UAAU,KAAK;AACvG,UAAM,IAAI,QAAc,CAAC,YAAY,aAAa,OAAO,CAAC;AAC1D,UAAM,OAAO,aAAa,IAAI,KAAK;AACnC,QAAI,KAAK,SAAS,EAAG;AACrB,UAAM,YAAY,OAAO,IAAI,IAAI,KAAK,oBAAI,IAAyD;AACnG,UAAM,aAAa,UAAU,IAAI,IAAI,KAAK,KAAK,EAAE,QAAQ,oBAAI,IAAY,GAAG,OAAO,oBAAI,IAAY,EAAE;AACrG,eAAW,OAAO,IAAI,IAAI,KAAK;AAC/B,eAAW,MAAM,IAAI,IAAI,IAAI;AAC7B,cAAU,IAAI,IAAI,OAAO,UAAU;AACnC,WAAO,IAAI,MAAM,SAAS;AAAA,EAC5B;AAEA,QAAM,WAAuC,CAAC;AAC9C,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,GAAG;AAC/C,QAAI,KAAK,IAAI,KAAK,YAAa,QAAO,EAAE,UAAU,CAAC,GAAG,gBAAgB,UAAU,QAAQ,UAAU,KAAK;AACvG,UAAM,IAAI,QAAc,CAAC,YAAY,aAAa,OAAO,CAAC;AAC1D,QAAI,SAAS,OAAO,EAAG;AACvB,UAAM,SAAS,oBAAI,IAAY;AAC/B,UAAM,cAAc,oBAAI,IAAY;AACpC,eAAW,SAAS,SAAS,OAAO,GAAG;AACrC,iBAAW,SAAS,MAAM,OAAQ,QAAO,IAAI,KAAK;AAClD,iBAAW,cAAc,MAAM,MAAO,aAAY,IAAI,UAAU;AAAA,IAClE;AACA,QAAI,OAAO,OAAO,EAAG;AACrB,aAAS,KAAK;AAAA,MACZ,OAAO,YAAY,IAAI;AAAA,MACvB,QAAQ,CAAC,GAAG,MAAM,EAAE,KAAK;AAAA,MACzB,aAAa,CAAC,GAAG,WAAW,EAAE,KAAK;AAAA,MACnC,YAAY,OAAO;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,WAAS,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AACrF,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,UAAU;AAAA,IAC1B,UAAU;AAAA,EACZ;AACF;AAEA,eAAe,mCACb,SACA,WACA,eAC8F;AAC9F,QAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,CAAC;AACvD,QAAM,oBAAoB,KAAK,IAAI,GAAG,KAAK,MAAM,aAAa,CAAC;AAC/D,MAAI,sBAAsB,KAAK,QAAQ,WAAW,GAAG;AACnD,WAAO,EAAE,UAAU,CAAC,GAAG,gBAAgB,GAAG,UAAU,MAAM;AAAA,EAC5D;AACA,QAAM,cAAc,KAAK,IAAI,IAAI;AACjC,SAAO,iCAAiC,SAAS,mBAAmB,WAAW;AACjF;AAgEA,SAAS,yBAAyB,UAAmD;AACnF,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,yBAAyB,UAAmD;AACnF,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,wBAAwB,GAAwB,GAAgC;AACvF,SACE,yBAAyB,EAAE,QAAQ,IAAI,yBAAyB,EAAE,QAAQ,KACvE,yBAAyB,EAAE,QAAQ,IAAI,yBAAyB,EAAE,QAAQ,KAC1E,EAAE,KAAK,cAAc,EAAE,IAAI;AAElC;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,SAAO,MAAM,QAAQ,YAAY,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAClE;AAEA,SAAS,iBAAiB,QAAmC;AAC3D,SAAO,OAAO,IAAI,gBAAgB,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAC/D;AAEA,SAAS,mBAAmB,OAAoC;AAC9D,QAAM,SAAmB,CAAC,aAAa,iBAAiB,MAAM,IAAI,CAAC,EAAE;AACrE,MAAI,MAAM,SAAU,QAAO,KAAK,aAAa,iBAAiB,MAAM,QAAQ,CAAC,EAAE;AAC/E,MAAI,MAAM,MAAM,OAAQ,QAAO,KAAK,SAAS,iBAAiB,MAAM,IAAI,CAAC,EAAE;AAC3E,SAAO,MAAM,iBAAiB,MAAM,KAAK,CAAC,KAAK,MAAM,QAAQ,KAAK,iBAAiB,MAAM,MAAM,CAAC,KAAK,OAAO,KAAK,IAAI,CAAC;AACxH;AAEA,SAAS,kBAAkB,OAAyC;AAClE,SAAO,OAAO,MAAM,KAAK,OAAO,MAAM,UAAU,YAAY,iBAAiB,MAAM,MAAM,CAAC,eAAe,iBAAiB,MAAM,WAAW,CAAC;AAC9I;AAEA,SAAS,qBAAqB,QAA2C;AACvE,QAAM,cAAc,OAAO,UAAU;AACrC,SAAO;AAAA,IACL,4BAA4B,OAAO,UAAU,cAAc;AAAA,IAC3D,YAAY,WAAW,IACnB,4CACA,yCAAyC,YAAY,MAAM,KAAK,iBAAiB,WAAW,CAAC;AAAA,EACnG;AACF;AAEA,SAAS,oBAAoB,QAA2C;AACtE,MAAI,OAAO,SAAS,WAAW,EAAG,QAAO,CAAC,8CAA8C;AACxF,SAAO,OAAO,SAAS;AAAA,IAAI,CAAC,UAC1B,OAAO,MAAM,GAAG,kBAAkB,iBAAiB,MAAM,MAAM,CAAC,gBAAgB,iBAAiB,MAAM,SAAS,CAAC;AAAA,EACnH;AACF;AAEA,eAAe,gBAAgB,UAAkB,SAAgC;AAC/E,QAAM,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,QAAM,WAAW,KAAK;AAAA,IACpB,KAAK,QAAQ,QAAQ;AAAA,IACrB,IAAI,KAAK,SAAS,QAAQ,CAAC,IAAI,QAAQ,GAAG,IAAI,WAAW,CAAC;AAAA,EAC5D;AACA,MAAI;AACF,UAAM,UAAU,UAAU,SAAS,EAAE,UAAU,SAAS,MAAM,KAAK,CAAC;AACpE,UAAM,OAAO,UAAU,QAAQ;AAAA,EACjC,SAAS,OAAO;AACd,UAAM,GAAG,UAAU,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AACzD,UAAM;AAAA,EACR;AACF;AAEO,SAAS,wBAAwB,QAA8B;AACpE,SAAO,OAAO,OAAO,qBAAqB,YAAY,OAAO,iBAAiB,SAAS,IACnF,gBAAgB,OAAO,gBAAgB,IACvC,KAAK,KAAK,gBAAgB,OAAO,YAAY,GAAG,gBAAgB;AACtE;AAEO,IAAM,uBAAN,MAA2B;AAAA,EAYhC,YAA6B,QAAsB;AAAtB;AAC3B,UAAM,OAAO,wBAAwB,MAAM;AAE3C,SAAK,MAAM;AACX,SAAK,iBAAiB,KAAK,KAAK,MAAM,eAAe;AACrD,SAAK,sBAAsB,KAAK,KAAK,MAAM,qBAAqB;AAChE,SAAK,aAAa,KAAK,KAAK,MAAM,eAAe;AACjD,SAAK,gBAAgB,KAAK,KAAK,MAAM,YAAY;AACjD,SAAK,cAAc,KAAK,KAAK,MAAM,UAAU;AAC7C,SAAK,oBAAoB,KAAK,KAAK,KAAK,aAAa,aAAa;AAClE,SAAK,kBAAkB,KAAK,KAAK,MAAM,eAAe;AACtD,SAAK,wBAAwB,OAAO,uCAAuC;AAAA,EAC7E;AAAA,EAZ6B;AAAA,EAXpB;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB,oBAAI,IAA2B;AAAA,EAgBvE,MAAM,kBAAiC;AACrC,UAAM,MAAM,KAAK,KAAK,EAAE,WAAW,KAAK,CAAC;AACzC,UAAM,MAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAChD,UAAM,MAAM,KAAK,eAAe,EAAE,WAAW,KAAK,CAAC;AACnD,UAAM,MAAM,KAAK,aAAa,EAAE,WAAW,KAAK,CAAC;AACjD,UAAM,MAAM,KAAK,iBAAiB,EAAE,WAAW,KAAK,CAAC;AACrD,UAAM,MAAM,KAAK,KAAK,KAAK,KAAK,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/D,UAAM,MAAM,KAAK,KAAK,KAAK,KAAK,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAM,MAAM,KAAK,KAAK,KAAK,KAAK,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAChE,UAAM,MAAM,KAAK,KAAK,KAAK,KAAK,kBAAkB,GAAG,EAAE,WAAW,KAAK,CAAC;AAGxE,UAAM,KAAK;AAAA,MACT,KAAK;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AACA,UAAM,KAAK;AAAA,MACT,KAAK;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AACA,UAAM,KAAK,WAAW,KAAK,mBAAmB,EAAE;AAAA,EAClD;AAAA,EAEA,MAAc,WAAW,IAAY,SAAgC;AACnE,QAAI;AACF,YAAM,KAAK,EAAE;AAAA,IACf,QAAQ;AACN,YAAM,UAAU,IAAI,SAAS,OAAO;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,QAAuC;AAC1D,mBAAe,QAAQ,wCAAwC;AAC/D,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,KAAK,gBAAgB,EAAE,UAAU,SAAS,OAAO,CAAC;AACjF,qBAAe,QAAQ,wCAAwC;AAC/D,aAAO;AAAA,IACT,QAAQ;AACN,qBAAe,QAAQ,wCAAwC;AAC/D,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,qBAAqB,QAAuC;AAChE,mBAAe,QAAQ,wCAAwC;AAC/D,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,KAAK,aAAa,GAC5C,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,EAC/B,KAAK,EACL,QAAQ;AACX,qBAAe,QAAQ,wCAAwC;AAC/D,YAAM,KAAK,MAAM,CAAC,IAAI,KAAK,KAAK,KAAK,eAAe,MAAM,CAAC,CAAC,IAAI;AAChE,UAAI,CAAC,GAAI,QAAO;AAChB,YAAM,UAAU,MAAM,SAAS,IAAI,EAAE,UAAU,SAAS,OAAO,CAAC;AAChE,qBAAe,QAAQ,wCAAwC;AAC/D,aAAO;AAAA,IACT,QAAQ;AACN,qBAAe,QAAQ,wCAAwC;AAC/D,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,uBAAuB,QAAuC;AAClE,mBAAe,QAAQ,2CAA2C;AAClE,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,KAAK,eAAe,GAC9C,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,EAC/B,KAAK,EACL,QAAQ;AACX,qBAAe,QAAQ,2CAA2C;AAClE,YAAM,KAAK,MAAM,CAAC,IAAI,KAAK,KAAK,KAAK,iBAAiB,MAAM,CAAC,CAAC,IAAI;AAClE,UAAI,CAAC,GAAI,QAAO;AAChB,YAAM,UAAU,MAAM,SAAS,IAAI,EAAE,UAAU,SAAS,OAAO,CAAC;AAChE,qBAAe,QAAQ,2CAA2C;AAClE,aAAO;AAAA,IACT,QAAQ;AACN,qBAAe,QAAQ,2CAA2C;AAClE,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,MAyBH;AAClB,UAAM,WAAW,mBAAmB;AAAA,MAClC,SAAS,KAAK;AAAA,MACd,uBAAuB,KAAK;AAAA,MAC5B,oBAAoB,KAAK;AAAA,IAC3B,CAAC;AACD,UAAM,YAAY,KAAK,aAAa,oBAAI,KAAK;AAC7C,UAAM,OAAO,IAAI,SAAS;AAC1B,UAAM,OAAO,UAAU,YAAY,EAAE,MAAM,IAAI,EAAE,EAAE,QAAQ,MAAM,EAAE;AACnE,UAAM,OAAO,SAAS,KAAK,KAAK;AAChC,UAAM,mBAAmB,gBAAgB,SAAS,OAAO,SAAS;AAElE,UAAM,WAAW,qBAAqB;AAAA,MACpC,QAAQ,SAAS;AAAA,MACjB,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,cAAc,KAAK;AAAA,MACnB,OAAO,UAAU,QAAQ;AAAA,IAC3B,CAAC;AAED,UAAM,MAAM,KAAK,KAAK,KAAK,YAAY,kBAAkB,IAAI;AAC7D,UAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAEpC,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA,UAAU,wBAAwB,SAAS,KAAK,CAAC;AAAA,MACjD,cAAc,UAAU,YAAY,CAAC;AAAA,MACrC,UAAU,wBAAwB,KAAK,MAAM,QAAQ,OAAO,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC;AAAA,MAC/E,GAAG,2BAA2B,QAAQ;AAAA,MACtC;AAAA,MACA;AAAA,MACA,KAAK,QAAQ,QAAQ;AAAA,MACrB;AAAA,IACF,EAAE,KAAK,IAAI;AAEX,aAAS,UAAU,GAAG,UAAU,KAAK,WAAW;AAC9C,YAAM,SAAS,YAAY,IAAI,KAAK,IAAI,UAAU,CAAC;AACnD,YAAM,KAAK,KAAK,KAAK,KAAK,GAAG,IAAI,IAAI,IAAI,GAAG,MAAM,KAAK;AACvD,UAAI;AACF,cAAM,UAAU,IAAI,MAAM,EAAE,UAAU,SAAS,MAAM,KAAK,CAAC;AAC3D,eAAO;AAAA,MACT,SAAS,OAAO;AACd,YAAI,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS,SAAU;AAC1E,cAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,4DAA4D,SAAS,KAAK,EAAE;AAAA,EAC9F;AAAA,EAEA,MAAM,eAAe,OAA2C;AAC9D,UAAM,SAAS,0BAA0B,MAAM,KAAK;AACpD,UAAM,WAAW,KAAK,mBAAmB,KAAK,UAAU,MAAM,IAAI,MAAM,OAAO;AAAA,EACjF;AAAA,EAEA,MAAM,sBAAsB,MAAwD;AAClF,UAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY;AACrC,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA,MAAM,KAAK,KAAK,KAAK,OAAO;AAAA,MAC5B;AAAA,MACA,KAAK,KAAK,QAAQ;AAAA,MAClB;AAAA,IACF,EAAE,KAAK,IAAI;AACX,UAAM,WAAW,KAAK,qBAAqB,OAAO,OAAO;AAAA,EAC3D;AAAA,EAEA,MAAc,uBAA0B,MAAc,IAAkC;AACtF,UAAM,WAAW,KAAK,qBAAqB,IAAI,IAAI,KAAK,QAAQ,QAAQ;AACxE,QAAI;AACJ,UAAM,UAAU,IAAI,QAAc,CAAC,YAAY;AAC7C,uBAAiB;AAAA,IACnB,CAAC;AACD,UAAM,SAAS,SAAS,MAAM,MAAM,MAAS,EAAE,KAAK,MAAM,OAAO;AACjE,SAAK,qBAAqB,IAAI,MAAM,MAAM;AAC1C,UAAM,SAAS,MAAM,MAAM,MAAS;AACpC,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,UAAE;AACA,qBAAe;AACf,UAAI,KAAK,qBAAqB,IAAI,IAAI,MAAM,QAAQ;AAClD,aAAK,qBAAqB,OAAO,IAAI;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,uBAAuB,MAGiB;AAC5C,UAAM,OAAO,gBAAgB,KAAK,QAAQ,IAAI,oBAAI,KAAK,CAAC,CAAC;AACzD,WAAO,KAAK,uBAAuB,MAAM,MAAM,KAAK,+BAA+B;AAAA,MACjF;AAAA,MACA,iBAAiB,KAAK;AAAA,IACxB,CAAC,CAAC;AAAA,EACJ;AAAA,EAEA,MAAc,+BAA+B,MAGC;AAC5C,UAAM,OAAO,KAAK;AAClB,UAAM,kBAAkB,KAAK,IAAI,GAAG,KAAK,mBAAmB,CAAC;AAG7D,UAAM,UAAwG,CAAC;AAC/G,QAAI;AACF,YAAM,UAAU,MAAM,QAAQ,KAAK,YAAY,EAAE,eAAe,KAAK,CAAC,GACnE,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAC9C,iBAAW,KAAK,QAAQ;AACtB,YAAI,CAAC,EAAE,YAAY,EAAG;AACtB,cAAM,SAAS,KAAK,KAAK,KAAK,YAAY,EAAE,MAAM,IAAI;AACtD,YAAI;AACF,gBAAM,SAAS,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,EAAE,KAAK;AAC5E,qBAAW,KAAK,OAAO;AACrB,kBAAM,IAAI,KAAK,KAAK,QAAQ,CAAC;AAC7B,kBAAM,MAAM,MAAM,SAAS,GAAG,OAAO;AACrC,kBAAM,QAAQ,sBAAsB,KAAK,OAAO,KAAK;AACrD,kBAAM,QAAQ,sBAAsB,KAAK,OAAO,KAAK,sBAAsB,EAAE,IAAI;AACjF,kBAAM,WAAW,oBAAoB;AAAA,cACnC,UAAU,sBAAsB,KAAK,UAAU;AAAA,cAC/C,WAAW,sBAAsB,KAAK,WAAW;AAAA,cACjD,WAAW,sBAAsB,KAAK,WAAW;AAAA,cACjD,YAAY,sBAAsB,KAAK,YAAY;AAAA,YACrD,CAAC;AACD,oBAAQ,KAAK,EAAE,OAAO,MAAM,GAAG,OAAO,KAAK,SAAS,CAAC;AAAA,UACvD;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AACA,YAAQ;AAAA,MACN,CAAC,GAAG,MACF,EAAE,MAAM,cAAc,EAAE,KAAK,KAC1B,EAAE,KAAK,cAAc,EAAE,IAAI,KAC3B,EAAE,MAAM,cAAc,EAAE,KAAK;AAAA,IACpC;AAIA,UAAM,cAAc;AAAA,MAClB,QAAQ,IAAI,CAAC,YAAY,EAAE,QAAQ,WAAW,OAAO,SAAS,UAAU,EAAE;AAAA,MAC1E,KAAK,IAAI;AAAA,IACX,EAAE,IAAI,CAAC,UAAU,MAAM,MAAM;AAC7B,UAAM,iBAAiB,QAAQ,SAAS,YAAY;AACpD,UAAM,6BAA6B;AAAA,MACjC,YAAY,IAAI,CAAC,YAAY,EAAE,IAAI,OAAO,MAAM,YAAY,OAAO,SAAS,WAAW,EAAE;AAAA,IAC3F,EACG,OAAO,CAAC,SAAS,KAAK,gBAAgB,IAAI,EAC1C,IAAI,CAAC,SAAS,KAAK,EAAE,EACrB,KAAK;AAGR,UAAM,WAAkC,CAAC;AACzC,QAAI;AACF,YAAM,MAAM,MAAM,SAAS,KAAK,mBAAmB,OAAO;AAC1D,iBAAW,QAAQ,IAAI,MAAM,IAAI,GAAG;AAClC,YAAI,CAAC,KAAK,KAAK,EAAG;AAClB,YAAI;AACF,gBAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,gBAAM,SAAS,0BAA0B,UAAU,GAAG;AACtD,cAAI,CAAC,OAAO,QAAS;AACrB,cAAI,OAAO,OAAO,KAAK,IAAI,EAAE,WAAW,IAAI,EAAG,UAAS,KAAK,OAAO,IAAI;AAAA,QAC1E,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,UAAqC,YAAY,IAAI,CAAC,WAAW;AACrE,YAAM,OAAO,qBAAqB,OAAO,GAAG;AAC5C,aAAO;AAAA,QACL,OAAO,OAAO;AAAA,QACd,MAAM,OAAO;AAAA,QACb,OAAO,OAAO;AAAA,QACd,QAAQ,mBAAmB,GAAG,OAAO,KAAK;AAAA,EAAK,IAAI,EAAE;AAAA,QACrD,WAAW,qBAAqB,OAAO,UAAU,KAAK,qBAAqB;AAAA,QAC3E,UAAU,OAAO,SAAS,YAAY,OAAO;AAAA,MAC/C;AAAA,IACF,CAAC;AAED,UAAM,aAAa,oBAAI,IAA+D;AACtF,eAAW,UAAU,SAAS;AAC5B,iBAAW,SAAS,OAAO,QAAQ;AACjC,cAAM,WAAW,WAAW,IAAI,KAAK;AACrC,YAAI,UAAU;AACZ,mBAAS,OAAO,IAAI,OAAO,KAAK;AAChC,mBAAS,YAAY,IAAI,OAAO,IAAI;AAAA,QACtC,OAAO;AACL,qBAAW,IAAI,OAAO;AAAA,YACpB,QAAQ,oBAAI,IAAI,CAAC,OAAO,KAAK,CAAC;AAAA,YAC9B,aAAa,oBAAI,IAAI,CAAC,OAAO,IAAI,CAAC;AAAA,UACpC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAuC,CAAC,GAAG,WAAW,QAAQ,CAAC,EAClE,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO;AAAA,MACpB;AAAA,MACA,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK;AAAA,MAC3B,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK;AAAA,MACrC,YAAY,EAAE,OAAO;AAAA,IACvB,EAAE,EACD,OAAO,CAAC,UAAU,MAAM,cAAc,CAAC,EACvC,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAE/E,UAAM,kBACJ,uCAAuC,KAAK,MAAM,EAAE,8BAA8B,QAC/E,uCAAuC,KAAK,MAAM,EAAE,yBAAyB;AAClF,UAAM,oBACJ,KAAK,OAAO,sCACT,KAAK,OAAO,iCACZ;AACL,UAAM,wBAAwB,KAAK,OAAO,0CAA0C;AACpF,QAAI,kBAAkB;AACtB,QAAI,mBAAmB;AACvB,QAAI,yBAAyB;AAC7B,QAAI,4BAA4B;AAChC,QAAI,iBAAiB;AACrB,QAAI,iBAAiB;AACnB,UAAI;AACF,cAAM,iBAAiB,MAAM;AAAA,UAC3B;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,2BAAmB,eAAe;AAClC,iCAAyB,eAAe;AACxC,YAAI,CAAC,eAAe,YAAY,eAAe,SAAS,SAAS,GAAG;AAClE,2BAAiB,cAAc,UAAU,eAAe,QAAQ;AAChE,sCAA4B,KAAK,IAAI,GAAG,eAAe,SAAS,SAAS,MAAM;AAC/E,4BAAkB,4BAA4B;AAAA,QAChD;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,KAAK,oFAAoF,GAAG,EAAE;AAAA,MACpG;AAAA,IACF;AAEA,UAAM,qBAAoE;AAAA,MACxE,UAAU;AAAA,MACV,wBAAwB;AAAA,MACxB,UAAU;AAAA,IACZ;AACA,eAAW,SAAS,UAAU;AAC5B,yBAAmB,MAAM,QAAQ,KAAK;AAAA,IACxC;AAKA,UAAM,aAAa,SAAS,IAAI,CAAC,OAAO,WAAW;AAAA,MACjD,IAAI,GAAG,MAAM,KAAK,IAAI,KAAK;AAAA,MAC3B,QAAQ,OAAO,aAAa,MAAM,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,CAAC;AAAA,IACnF,EAAE;AACF,UAAM,gBAAgB,oBAAI,IAA6D;AACvF,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,eAAS,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC9C,cAAM,OAAO,wBAAwB,WAAW,CAAC,GAAI,WAAW,CAAC,CAAE;AACnE,YAAI,KAAK,SAAS,WAAY;AAC9B,mBAAW,OAAO,KAAK,MAAM;AAC3B,gBAAM,OAAO,cAAc,IAAI,GAAG,KAAK,EAAE,QAAQ,oBAAI,IAAY,GAAG,WAAW,oBAAI,IAAY,EAAE;AACjG,eAAK,OAAO,IAAI,SAAS,CAAC,EAAG,KAAK;AAClC,eAAK,OAAO,IAAI,SAAS,CAAC,EAAG,KAAK;AAClC,eAAK,UAAU,IAAI,SAAS,CAAC,EAAG,QAAQ;AACxC,eAAK,UAAU,IAAI,SAAS,CAAC,EAAG,QAAQ;AACxC,wBAAc,IAAI,KAAK,IAAI;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AACA,UAAM,WAAW,CAAC,GAAG,cAAc,QAAQ,CAAC,EACzC,IAAI,CAAC,CAAC,KAAK,IAAI,OAAO,EAAE,KAAK,QAAQ,CAAC,GAAG,KAAK,MAAM,EAAE,KAAK,GAAG,WAAW,CAAC,GAAG,KAAK,SAAS,EAAE,KAAK,EAAE,EAAE,EACtG,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,cAAc,EAAE,GAAG,CAAC;AAE5C,UAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC3C,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,eAAe,SAAS;AAAA,MACxB;AAAA,MACA,iBAAiB,CAAC,GAAG,QAAQ,EAAE,KAAK,uBAAuB;AAAA,MAC3D;AAAA,MACA,UAAU;AAAA,MACV,WAAW,EAAE,gBAAgB,2BAA2B;AAAA,MACxD;AAAA,MACA,UAAU;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,qBAAqB,CAAC;AAAA,QAC5D,mBAAmB;AAAA,MACrB;AAAA,IACF;AAEA,UAAM,SAAS,gBAAgB,YAAY,EAAE,OAAO,2BAA2B,IAAI,YAAY,CAAC;AAEhG,UAAM,mBAAmB,KAAK,KAAK,KAAK,iBAAiB,GAAG,IAAI,OAAO;AACvE,UAAM,gBAAgB,kBAAkB,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAE9E,UAAM,sBAAsB,eAAe,WAAW,IAClD,CAAC,0CAA0C,IAC3C,eAAe,MAAM,GAAG,eAAe,EAAE,IAAI,CAAC,UAAU,kBAAkB,KAAK,CAAC;AACpF,UAAM,cAAc,CAAC,GAAG,QAAQ,EAC7B,OAAO,CAAC,UAAU,MAAM,aAAa,cAAc,MAAM,aAAa,UAAU,MAAM,aAAa,QAAQ,EAC3G,KAAK,uBAAuB,EAC5B,MAAM,GAAG,eAAe;AAC3B,UAAM,YAAY,YAAY,WAAW,IACrC,CAAC,2DAA2D,IAC5D,YAAY,IAAI,CAAC,UAAU,mBAAmB,KAAK,CAAC;AACxD,UAAM,sBAAsB,eACzB,OAAO,CAAC,UAAU,MAAM,cAAc,CAAC,EACvC,MAAM,GAAG,eAAe;AAC3B,UAAM,iBAAiB,oBAAoB,WAAW,IAClD,CAAC,gCAAgC,IACjC,oBAAoB;AAAA,MAAI,CAAC,UACvB,0BAA0B,MAAM,KAAK,mDAAmD,iBAAiB,MAAM,WAAW,CAAC;AAAA,IAC7H;AAEJ,UAAM,uBAAuB;AAAA,MAC3B,0BAAqB,IAAI;AAAA,MACzB;AAAA,MACA;AAAA,MACA,8BAA8B,QAAQ,MAAM;AAAA,MAC5C,gCAAgC,SAAS,MAAM;AAAA,MAC/C,+BAA+B,mBAAmB,QAAQ,4BAA4B,mBAAmB,sBAAsB,cAAc,mBAAmB,QAAQ;AAAA,MACxK,wBAAwB,kBAAmB,mBAAmB,mCAAmC,kBAAkB,sBAAsB,qCAAsC,UAAU;AAAA,MACzL,kBAAkB,gBAAgB;AAAA,MAClC;AAAA,MACA;AAAA,MACA,GAAG,qBAAqB,MAAM;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,GAAG,oBAAoB,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,GAAI,QAAQ,WAAW,IAAI,CAAC,UAAU,IAAI,QAAQ;AAAA,QAAI,CAAC,WACrD,MAAM,iBAAiB,OAAO,KAAK,CAAC,KAAK,iBAAiB,OAAO,KAAK,CAAC,KAAK,iBAAiB,OAAO,IAAI,CAAC,iBAAiB,OAAO,SAAS,eAAe,iBAAiB,OAAO,QAAQ,CAAC;AAAA,MAC5L;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAEX,UAAM,2BAA2B,KAAK,KAAK,KAAK,iBAAiB,GAAG,IAAI,KAAK;AAC7E,UAAM,gBAAgB,0BAA0B,oBAAoB;AAEpE,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,eAAe;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,MAAgF;AAChG,UAAM,OAAO,gBAAgB,KAAK,QAAQ,IAAI,oBAAI,KAAK,CAAC,CAAC;AACzD,WAAO,KAAK,uBAAuB,MAAM,MAAM,KAAK,oBAAoB,EAAE,GAAG,MAAM,KAAK,CAAC,CAAC;AAAA,EAC5F;AAAA,EAEA,MAAc,oBAAoB,MAA+E;AAC/G,UAAM,OAAO,KAAK;AAClB,UAAM,WAAW,KAAK,IAAI,KAAO,KAAK,YAAY,GAAM;AACxD,UAAM,eAAe,MAAM,KAAK,+BAA+B,EAAE,KAAK,CAAC;AAIvE,UAAM,eAAe,kBAAkB;AAAA,MACrC,QAAQ,aAAa,OAAO,SAAS,IAAI,CAAC,aAAa;AAAA,QACrD,SAAS,WAAW,QAAQ,KAAK;AAAA,QACjC,cAAc,QAAQ;AAAA,MACxB,EAAE;AAAA,MACF,kBAAkB,aAAa,OAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,IAC3E,CAAC;AACD,QAAI,aAAa,SAAS,GAAG;AAC3B,YAAM,IAAI,MAAM,8CAA8C,KAAK,UAAU,YAAY,CAAC,EAAE;AAAA,IAC9F;AACA,UAAM,gBAAgB,aAAa,OAAO,gBAAgB,WAAW,IACjE,CAAC,UAAU,IACX,aAAa,OAAO,gBAAgB,IAAI,CAAC,UAAU,mBAAmB,KAAK,CAAC;AAChF,UAAM,iBAAiB,aAAa,OAAO,SAAS,WAAW,IAC3D,CAAC,0CAA0C,IAC3C,aAAa,OAAO,SAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,kBAAkB,KAAK,CAAC;AAEpF,UAAM,KAAe;AAAA,MACnB,uBAAkB,IAAI;AAAA,MACtB;AAAA,MACA;AAAA,MACA,GAAI,aAAa,OAAO,QAAQ,WAAW,IACvC,CAAC,UAAU,IACX,aAAa,OAAO,QAAQ,IAAI,CAAC,WAC/B,KAAK,iBAAiB,OAAO,KAAK,CAAC,KAAK,iBAAiB,OAAO,IAAI,CAAC,iBAAiB,OAAO,SAAS,eAAe,iBAAiB,OAAO,QAAQ,CAAC,GAAG;AAAA,MAC/J;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,8BAA8B,aAAa,OAAO,WAAW;AAAA,MAC7D,gCAAgC,aAAa,OAAO,aAAa;AAAA,MACjE,+BAA+B,aAAa,OAAO,mBAAmB,QAAQ,4BAA4B,aAAa,OAAO,mBAAmB,sBAAsB,cAAc,aAAa,OAAO,mBAAmB,QAAQ;AAAA,MACpO,wBAAwB,aAAa,OAAO,SAAS,UAAW,aAAa,OAAO,SAAS,WAAW,mCAAmC,aAAa,OAAO,SAAS,UAAU,sBAAsB,qCAAsC,UAAU;AAAA,MACxP,yBAAyB,aAAa,gBAAgB;AAAA,MACtD,6BAA6B,aAAa,wBAAwB;AAAA,MAClE,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,GAAG,qBAAqB,aAAa,MAAM;AAAA,MAC3C;AAAA,MACA;AAAA,MACA,GAAG,oBAAoB,aAAa,MAAM;AAAA,MAC1C;AAAA,IACF;AAGA,UAAM,MAAM,GAAG,KAAK,IAAI;AACxB,UAAM,UAAU,IAAI,SAAS,WAAW,IAAI,MAAM,GAAG,QAAQ,IAAI,uBAAuB;AAExF,UAAM,iBAAiB,KAAK,KAAK,KAAK,eAAe,GAAG,IAAI,KAAK;AACjE,UAAM,gBAAgB,gBAAgB,OAAO;AAE7C,QAAI,KAAK,4CAA4C,cAAc,EAAE;AACrE,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,kBAAkB,aAAa;AAAA,MAC/B,0BAA0B,aAAa;AAAA,MACvC,cAAc,aAAa;AAAA,IAC7B;AAAA,EACF;AACF;","names":[]}
@@ -44,6 +44,14 @@ function parseSharedEnvelope(raw) {
44
44
  const authority = requested.kind === "valid" ? requested.authority : "informational";
45
45
  return withOptionalFields(authority, record);
46
46
  }
47
+ function isExpired(envelope, nowMs) {
48
+ if (!Number.isFinite(nowMs)) return false;
49
+ const expiresAt = envelope.expiresAt?.trim();
50
+ if (!expiresAt) return false;
51
+ const expiresAtMs = Date.parse(expiresAt);
52
+ if (!Number.isFinite(expiresAtMs)) return false;
53
+ return expiresAtMs <= nowMs;
54
+ }
47
55
 
48
56
  // src/shared-context/authority-precedence.ts
49
57
  function isKnownAuthority(value) {
@@ -203,6 +211,8 @@ function resolveReadAuthority(envelope, allowBinding) {
203
211
  }
204
212
 
205
213
  export {
214
+ isExpired,
215
+ isStrictIsoInstant,
206
216
  UNATTRIBUTED_ACCESS_WRITE_ORIGIN,
207
217
  resolveWriteOrigin,
208
218
  composeWriteEnvelope,
@@ -210,4 +220,4 @@ export {
210
220
  envelopeFromScalars,
211
221
  resolveReadAuthority
212
222
  };
213
- //# sourceMappingURL=chunk-QKCXRS5A.js.map
223
+ //# sourceMappingURL=chunk-OGXXGHW6.js.map